require 'osx/cocoa'
require 'open-uri'
require 'rubygems'
require 'json'
class WassrPluginSource < OSX::QSObjectSource
@@count = 0
FRIENDS = File.dirname(__FILE__) + '/friends.dat'
def initialize
super
@friends = File.exist?(FRIENDS) ? Marshal.load(open(FRIENDS)) : []
end
def indexIsValidFromDate_forEntry(index, entry)
true
end
def iconForEntry(dict) # dict.keys => name, source, ID, bundle
OSX::QSResourceManager.imageNamed('wassr_logo')
end
=begin
- (NSString *)identifierForObject:(id <QSObject>)object{
return nil;
}
=end
def name_pass
screen_name.to_s + ':' + password
end
def objectsForEntry(entry)
dict = OSX::NSUserDefaultsController.sharedUserDefaultsController.values;
screen_name = dict.valueForKey("WassrPreference.screenName")
password = dict.valueForKey("WassrPreference.password")
@friends = []
objects = []
count = 1
while true
url = 'http://' + screen_name + ':' + password +
'@api.wassr.jp/statuses/friends/' + screen_name + '.json'
#Shared.logger.info(url)
if count > 1
url += '?page=' + count.to_s
end
count += 1
friends = []
begin
sio = open(url)
#Shared.logger.info('1')
res = sio.read
#Shared.logger.info('2')
unless res
#Shared.logger.info('2-5')
Shared.logger.info('no friends retrieved.')
break
end
#Shared.logger.info('3')
#Shared.logger.info(res.class.to_s)
friends = JSON.parse(res)
#Shared.logger.info('4')
friends.each do |friend|
#Shared.logger.info(friend['screen_name'])
obj = OSX::QSObject.objectWithName(friend['screen_name'])
obj.setObject_forType('', 'WassrPluginType')
obj.setPrimaryType('WassrPluginType')
objects.push(obj)
end
@friends += friends
rescue => e
Shared.logger.info('objectsForEntry : exception: ' + e.to_s)
[]
end
break if (friends.size < 100)
end
# add public one
obj = OSX::QSObject.objectWithName(Shared::PUBLIC)
obj.setObject_forType('', 'WassrPluginType')
obj.setPrimaryType('WassrPluginType')
objects.push(obj)
@friends.push({'screen_name' => Shared::PUBLIC})
@friends.uniq!
Marshal.dump(@friends, open(FRIENDS, 'w'))
objects
end
# Object Handler Methods
def setQuickIconForObject(object)
object.setIcon(nil)
end
def loadIconForObject(object)
return false unless @friends
return false if @friends.empty?
if object.name.to_s == Shared::PUBLIC
object.setIcon(OSX::QSResourceManager.imageNamed('wassr_logo'))
return true
end
her = @friends.find {|x| x['screen_name'] == object.name.to_s}
img = OSX::NSImage.alloc.initWithContentsOfURL(OSX::NSURL.URLWithString(her['profile_image_url']))
return false unless img
object.setIcon(img)
true
end
end