birdgrinder 0.1.0.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/bird_grinder/base.rb +1 -1
- data/lib/bird_grinder/client.rb +3 -3
- data/lib/bird_grinder/stream_handler.rb +44 -0
- data/lib/bird_grinder/tweeter/stream_processor.rb +8 -2
- data/lib/bird_grinder/tweeter/streaming.rb +2 -2
- data/lib/bird_grinder/tweeter.rb +56 -6
- data/lib/bird_grinder.rb +2 -2
- metadata +2 -1
data/lib/bird_grinder/base.rb
CHANGED
@@ -123,7 +123,7 @@ module BirdGrinder
|
|
123
123
|
@user = options.user.screen_name if options.user? && options.user.screen_name?
|
124
124
|
@user ||= options.sender_screen_name if options.sender_screen_name?
|
125
125
|
@last_message_direct = (message == :incoming_direct_message)
|
126
|
-
@last_message_id = options.id
|
126
|
+
@last_message_id = options.id? ? options.id : -1
|
127
127
|
end
|
128
128
|
|
129
129
|
def halt_handlers!
|
data/lib/bird_grinder/client.rb
CHANGED
@@ -38,9 +38,9 @@ module BirdGrinder
|
|
38
38
|
# Forwards a given message type (with options) to each handler,
|
39
39
|
# storing the current id if changed.
|
40
40
|
def receive_message(type, options = BirdGrinder::Nash.new)
|
41
|
-
logger.debug "receiving message: #{type.inspect} - #{options.id}"
|
41
|
+
logger.debug "receiving message: #{type.inspect} - #{options.id? ? options.id : 'unknown id'}"
|
42
42
|
dispatch(type.to_sym, options)
|
43
|
-
update_stored_id_for(type, options.id)
|
43
|
+
update_stored_id_for(type, options.id) if options.id?
|
44
44
|
end
|
45
45
|
|
46
46
|
# Fetches all direct messages and mentions and also schedules
|
@@ -128,7 +128,7 @@ module BirdGrinder
|
|
128
128
|
def fetch_latest(name, type)
|
129
129
|
options = {}
|
130
130
|
id = stored_id_for(type)
|
131
|
-
options[:since_id] = id unless id.blank?
|
131
|
+
options[:since_id] = id unless id.blank? || id.to_i == 0
|
132
132
|
@tweeter.send(name, options)
|
133
133
|
end
|
134
134
|
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module BirdGrinder
|
2
|
+
# A simple BirdGrinder::Base subclass which has a
|
3
|
+
# focus on processing tweets from a stream.
|
4
|
+
class StreamHandler < Base
|
5
|
+
|
6
|
+
class << self
|
7
|
+
|
8
|
+
# Do something on tweet's from a given stream
|
9
|
+
# @param [Symbol] the stream name, e.g. :filter / :sample
|
10
|
+
def tweet_from_stream(name, &blk)
|
11
|
+
on_event(:incoming_stream) do
|
12
|
+
instance_eval(&blk) if options.streaming_source == name && options.stream_type == :tweet
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Do something on delete's from a given stream
|
17
|
+
# @param [Symbol] the stream name, e.g. :filter / :sample
|
18
|
+
def delete_from_stream(name, &blk)
|
19
|
+
on_event(:incoming_stream) do
|
20
|
+
instance_eval(&blk) if options.streaming_source == name && options.stream_type == :delete
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Do something on rate limit's from a given stream
|
25
|
+
# @param [Symbol] the stream name, e.g. :filter / :sample
|
26
|
+
def rate_limit_from_stream(name, &blk)
|
27
|
+
on_event(:incoming_stream) do
|
28
|
+
instance_eval(&blk) if options.streaming_source == name && options.stream_type == :limit
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
%w(sample filter follow track).each do |type|
|
33
|
+
define_method(type.to_sym) do |*args|
|
34
|
+
BirdGrinder::Loader.once_running do
|
35
|
+
streaming = BirdGrinder::Client.current.tweeter.streaming
|
36
|
+
streaming.send(type.to_sym, *args)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -18,9 +18,15 @@ module BirdGrinder
|
|
18
18
|
def process_stream_item(json)
|
19
19
|
return if !json.is_a?(Hash)
|
20
20
|
processed = json.to_nash.normalized
|
21
|
-
|
21
|
+
stream_type = lookup_type_for_steam_response(processed)
|
22
|
+
case stream_type
|
23
|
+
when :delete
|
24
|
+
processed = processed[:delete].status
|
25
|
+
when :limit
|
26
|
+
processed = processed.limit
|
27
|
+
end
|
28
|
+
processed.stream_type = stream_type
|
22
29
|
processed.streaming_source = @stream_name
|
23
|
-
logger.info "Processing Stream Tweet #{processed.id}: #{processed.text}"
|
24
30
|
@parent.delegate.receive_message(:incoming_stream, processed)
|
25
31
|
end
|
26
32
|
|
@@ -61,12 +61,12 @@ module BirdGrinder
|
|
61
61
|
path = opts.delete(:path)
|
62
62
|
processor = StreamProcessor.new(@parent, name)
|
63
63
|
http_opts = {
|
64
|
-
:
|
65
|
-
:head => {'Authorization' => @parent.auth_credentials}
|
64
|
+
:head => {'Authorization' => @parent.auth_credentials}
|
66
65
|
}
|
67
66
|
http_opts[:query] = opts if opts.present?
|
68
67
|
url = streaming_base_url / api_version.to_s / "statuses" / "#{path || name}.json"
|
69
68
|
http = EventMachine::HttpRequest.new(url).get(http_opts)
|
69
|
+
http.stream(&processor.method(:receive_chunk))
|
70
70
|
end
|
71
71
|
|
72
72
|
end
|
data/lib/bird_grinder/tweeter.rb
CHANGED
@@ -159,9 +159,55 @@ module BirdGrinder
|
|
159
159
|
end
|
160
160
|
end
|
161
161
|
end
|
162
|
+
|
163
|
+
# Gets a list ids who are following a given user id / screenname
|
164
|
+
#
|
165
|
+
# @param [String,Integer] id the user id or screen name to get followers for.
|
166
|
+
# @param [Hash] opts extra options to pass in the query string.
|
167
|
+
# @option opts [Integer] :cursor the cursor offset in the results
|
168
|
+
def follower_ids(id, opts = {})
|
169
|
+
cursor_list = []
|
170
|
+
if opts[:cursor].present?
|
171
|
+
logger.info "Getting page w/ cursor #{opts[:cursor]} for #{id}"
|
172
|
+
get_followers_page(id, opts) do |res|
|
173
|
+
results = BirdGrinder::Nash.new
|
174
|
+
results.cursor = opts[:cursor]
|
175
|
+
results.user_id = id
|
176
|
+
results.ids = res.ids? ? res.ids : []
|
177
|
+
results.next_cursor = res.next_cursor || 0
|
178
|
+
results.previous_cursor = res.previous_cursor || 0
|
179
|
+
results.all = (res.previous_cursor == 0 && res.next_cursor == 0)
|
180
|
+
delegate.receive_message(:incoming_follower_ids, results)
|
181
|
+
end
|
182
|
+
else
|
183
|
+
logger.info "Getting all followers for #{id}"
|
184
|
+
get_followers(id, opts.merge(:cursor => -1), {
|
185
|
+
:user_id => id,
|
186
|
+
:all => true,
|
187
|
+
:ids => []
|
188
|
+
}.to_nash)
|
189
|
+
end
|
190
|
+
end
|
162
191
|
|
163
192
|
protected
|
164
193
|
|
194
|
+
def get_followers(id, opts, nash)
|
195
|
+
get_followers_page(id, opts) do |res|
|
196
|
+
nash.ids += res.ids if res.ids?
|
197
|
+
if res.next_cursor == 0
|
198
|
+
delegate.receive_message(:incoming_follower_ids, nash)
|
199
|
+
else
|
200
|
+
get_followers(id, opts.merge(:cursor => res.next_cursor), nash)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def get_followers_page(id, opts, &blk)
|
206
|
+
get("followers/ids/#{id}.json", opts) do |res|
|
207
|
+
blk.call(res)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
165
211
|
def request(path = "/")
|
166
212
|
EventMachine::HttpRequest.new(api_base_url / path)
|
167
213
|
end
|
@@ -191,13 +237,17 @@ module BirdGrinder
|
|
191
237
|
|
192
238
|
def add_response_callback(http, blk)
|
193
239
|
http.callback do
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
240
|
+
if http.response_header.status == 200
|
241
|
+
res = parse_response(http)
|
242
|
+
if res.nil?
|
243
|
+
logger.warn "Got back a blank / errored response."
|
244
|
+
elsif successful?(res)
|
245
|
+
blk.call(res) unless blk.blank?
|
246
|
+
else
|
247
|
+
logger.error "Error: #{res.error} (on #{res.request})"
|
248
|
+
end
|
199
249
|
else
|
200
|
-
logger.
|
250
|
+
logger.info "Request returned a non-200 status code, had #{http.response_header.status} instead."
|
201
251
|
end
|
202
252
|
end
|
203
253
|
end
|
data/lib/bird_grinder.rb
CHANGED
@@ -8,7 +8,7 @@ require 'em-http'
|
|
8
8
|
module BirdGrinder
|
9
9
|
include Perennial
|
10
10
|
|
11
|
-
VERSION = [0, 1,
|
11
|
+
VERSION = [0, 1, 1, 0]
|
12
12
|
|
13
13
|
def self.version(include_minor = false)
|
14
14
|
VERSION[0, (include_minor ? 4 : 3)].join(".")
|
@@ -22,7 +22,7 @@ module BirdGrinder
|
|
22
22
|
end
|
23
23
|
|
24
24
|
has_library :cacheable, :tweeter, :client, :base, :command_handler,
|
25
|
-
:console, :queue_processor
|
25
|
+
:console, :queue_processor, :stream_handler
|
26
26
|
|
27
27
|
extends_library :loader
|
28
28
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: birdgrinder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darcy Laycock
|
@@ -90,6 +90,7 @@ files:
|
|
90
90
|
- lib/bird_grinder/exceptions.rb
|
91
91
|
- lib/bird_grinder/loader.rb
|
92
92
|
- lib/bird_grinder/queue_processor.rb
|
93
|
+
- lib/bird_grinder/stream_handler.rb
|
93
94
|
- lib/bird_grinder/tweeter/search.rb
|
94
95
|
- lib/bird_grinder/tweeter/stream_processor.rb
|
95
96
|
- lib/bird_grinder/tweeter/streaming.rb
|