public
Description: Quicksilver Twitter plugin.
Homepage: http://en.deadbeaf.org/2007/12/13/quicksilver-twitter-plugin/
Clone URL: git://github.com/mootoh/qstwitter.git
qstwitter / WassrPluginSource.rb
100644 120 lines (97 sloc) 2.997 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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