twitter_ebooks 3.0.9 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/ebooks +1 -0
- data/lib/twitter_ebooks/bot.rb +38 -30
- data/lib/twitter_ebooks/suffix.rb +0 -1
- data/lib/twitter_ebooks/version.rb +1 -1
- data/spec/bot_spec.rb +42 -4
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0bf168a080a0aabf939715c3dcb59655fca83463
|
4
|
+
data.tar.gz: 88ddb4ead32b0ca21db59b6edb4dcd97cf0d0594
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13873b6ea1ba04b79e0b5b44e735aa41a97b8aeaee798eee2e3cc43795dabb8bc4149ecc37418d341818d671bee7fd91f10316d19e53c941a8d652fc7dae1cc7
|
7
|
+
data.tar.gz: 48b0e54e02267df3e5cc12c7a75d2deea62adfeaed9cf1e8274b6e30917cda55041f428ff3cd5bd5cf62eb1f8c84fe0880b1bb002e0c0db650892885ff221978
|
data/bin/ebooks
CHANGED
data/lib/twitter_ebooks/bot.rb
CHANGED
@@ -144,6 +144,8 @@ module Ebooks
|
|
144
144
|
attr_accessor :access_token
|
145
145
|
# @return [String] OAuth access secret from `ebooks auth`
|
146
146
|
attr_accessor :access_token_secret
|
147
|
+
# @return [Twitter::User] Twitter user object of bot
|
148
|
+
attr_accessor :user
|
147
149
|
# @return [String] Twitter username of bot
|
148
150
|
attr_accessor :username
|
149
151
|
# @return [Array<String>] list of usernames to block on contact
|
@@ -247,31 +249,18 @@ module Ebooks
|
|
247
249
|
# Receive an event from the twitter stream
|
248
250
|
# @param ev [Object] Twitter streaming event
|
249
251
|
def receive_event(ev)
|
250
|
-
|
252
|
+
case ev
|
253
|
+
when Array # Initial array sent on first connection
|
251
254
|
log "Online!"
|
255
|
+
fire(:connect, ev)
|
252
256
|
return
|
253
|
-
|
254
|
-
|
255
|
-
if ev.is_a? Twitter::DirectMessage
|
256
|
-
return if ev.sender.screen_name.downcase == @username.downcase # Don't reply to self
|
257
|
+
when Twitter::DirectMessage
|
258
|
+
return if ev.sender.id == @user.id # Don't reply to self
|
257
259
|
log "DM from @#{ev.sender.screen_name}: #{ev.text}"
|
258
260
|
fire(:message, ev)
|
259
|
-
|
260
|
-
elsif ev.respond_to?(:name)
|
261
|
-
if ev.name == :follow
|
262
|
-
return if ev.source.screen_name.downcase == @username.downcase
|
263
|
-
log "Followed by #{ev.source.screen_name}"
|
264
|
-
fire(:follow, ev.source)
|
265
|
-
|
266
|
-
elsif ev.name == :favorite || ev.name == :unfavorite
|
267
|
-
return if ev.source.screen_name.downcase == @username.downcase # Ignore our own favorites
|
268
|
-
log "@#{ev.source.screen_name} #{ev.name.to_s}d: #{ev.target_object.text}"
|
269
|
-
fire(ev.name, ev.source, ev.target_object)
|
270
|
-
end
|
271
|
-
|
272
|
-
elsif ev.is_a? Twitter::Tweet
|
261
|
+
when Twitter::Tweet
|
273
262
|
return unless ev.text # If it's not a text-containing tweet, ignore it
|
274
|
-
return if ev.user.
|
263
|
+
return if ev.user.id == @user.id # Ignore our own tweets
|
275
264
|
|
276
265
|
meta = meta(ev)
|
277
266
|
|
@@ -295,15 +284,34 @@ module Ebooks
|
|
295
284
|
else
|
296
285
|
fire(:timeline, ev)
|
297
286
|
end
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
287
|
+
when Twitter::Streaming::Event
|
288
|
+
case ev.name
|
289
|
+
when :follow
|
290
|
+
return if ev.source.id == @user.id
|
291
|
+
log "Followed by #{ev.source.screen_name}"
|
292
|
+
fire(:follow, ev.source)
|
293
|
+
when :favorite, :unfavorite
|
294
|
+
return if ev.source.id == @user.id # Ignore our own favorites
|
295
|
+
log "@#{ev.source.screen_name} #{ev.name.to_s}d: #{ev.target_object.text}"
|
296
|
+
fire(ev.name, ev.source, ev.target_object)
|
297
|
+
when :user_update
|
298
|
+
update_myself ev.source
|
299
|
+
end
|
300
|
+
when Twitter::Streaming::DeletedTweet
|
301
|
+
# Pass
|
302
302
|
else
|
303
303
|
log ev
|
304
304
|
end
|
305
305
|
end
|
306
306
|
|
307
|
+
# Updates @user and calls on_user_update.
|
308
|
+
def update_myself(new_me=twitter.user)
|
309
|
+
@user = new_me if @user.nil? || new_me.id == @user.id
|
310
|
+
@username = @user.screen_name
|
311
|
+
log 'User information updated'
|
312
|
+
fire(:user_update)
|
313
|
+
end
|
314
|
+
|
307
315
|
# Configures client and fires startup event
|
308
316
|
def prepare
|
309
317
|
# Sanity check
|
@@ -323,12 +331,12 @@ module Ebooks
|
|
323
331
|
exit 1
|
324
332
|
end
|
325
333
|
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
334
|
+
# Save old name
|
335
|
+
old_name = username
|
336
|
+
# Load user object and actual username
|
337
|
+
update_myself
|
338
|
+
# Warn about mismatches unless it was clearly intentional
|
339
|
+
log "warning: bot expected to be @#{old_name} but connected to @#{username}" unless username == old_name || old_name.empty?
|
332
340
|
|
333
341
|
fire(:startup)
|
334
342
|
end
|
data/spec/bot_spec.rb
CHANGED
@@ -24,8 +24,17 @@ end
|
|
24
24
|
|
25
25
|
module Ebooks::Test
|
26
26
|
# Generates a random twitter id
|
27
|
-
|
28
|
-
|
27
|
+
# Or a non-random one, given a string.
|
28
|
+
def twitter_id(seed = nil)
|
29
|
+
if seed.nil?
|
30
|
+
(rand*10**18).to_i
|
31
|
+
else
|
32
|
+
id = 1
|
33
|
+
seed.downcase.each_byte do |byte|
|
34
|
+
id *= byte/10
|
35
|
+
end
|
36
|
+
id
|
37
|
+
end
|
29
38
|
end
|
30
39
|
|
31
40
|
# Creates a mock direct message
|
@@ -33,7 +42,7 @@ module Ebooks::Test
|
|
33
42
|
# @param text DM content
|
34
43
|
def mock_dm(username, text)
|
35
44
|
Twitter::DirectMessage.new(id: twitter_id,
|
36
|
-
sender: { id: twitter_id, screen_name: username},
|
45
|
+
sender: { id: twitter_id(username), screen_name: username},
|
37
46
|
text: text)
|
38
47
|
end
|
39
48
|
|
@@ -45,7 +54,7 @@ module Ebooks::Test
|
|
45
54
|
tweet = Twitter::Tweet.new({
|
46
55
|
id: twitter_id,
|
47
56
|
in_reply_to_status_id: 'mock-link',
|
48
|
-
user: { id: twitter_id, screen_name: username },
|
57
|
+
user: { id: twitter_id(username), screen_name: username },
|
49
58
|
text: text,
|
50
59
|
created_at: Time.now.to_s,
|
51
60
|
entities: {
|
@@ -58,14 +67,21 @@ module Ebooks::Test
|
|
58
67
|
tweet
|
59
68
|
end
|
60
69
|
|
70
|
+
# Creates a mock user
|
71
|
+
def mock_user(username)
|
72
|
+
Twitter::User.new(id: twitter_id(username), screen_name: username)
|
73
|
+
end
|
74
|
+
|
61
75
|
def twitter_spy(bot)
|
62
76
|
twitter = spy("twitter")
|
63
77
|
allow(twitter).to receive(:update).and_return(mock_tweet(bot.username, "test tweet"))
|
78
|
+
allow(twitter).to receive(:user).with(no_args).and_return(mock_user(bot.username))
|
64
79
|
twitter
|
65
80
|
end
|
66
81
|
|
67
82
|
def simulate(bot, &b)
|
68
83
|
bot.twitter = twitter_spy(bot)
|
84
|
+
bot.update_myself # Usually called in prepare
|
69
85
|
b.call
|
70
86
|
end
|
71
87
|
|
@@ -95,6 +111,13 @@ describe Ebooks::Bot do
|
|
95
111
|
end
|
96
112
|
end
|
97
113
|
|
114
|
+
it "ignores its own dms" do
|
115
|
+
simulate(bot) do
|
116
|
+
expect(bot).to_not receive(:on_message)
|
117
|
+
bot.receive_event(mock_dm("Test_Ebooks", "why am I talking to myself"))
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
98
121
|
it "responds to mentions" do
|
99
122
|
simulate(bot) do
|
100
123
|
bot.receive_event(mock_tweet("m1sp", "@test_ebooks this is a mention"))
|
@@ -102,6 +125,14 @@ describe Ebooks::Bot do
|
|
102
125
|
end
|
103
126
|
end
|
104
127
|
|
128
|
+
it "ignores its own mentions" do
|
129
|
+
simulate(bot) do
|
130
|
+
expect(bot).to_not receive(:on_mention)
|
131
|
+
expect(bot).to_not receive(:on_timeline)
|
132
|
+
bot.receive_event(mock_tweet("Test_Ebooks", "@m1sp i think that @test_ebooks is best bot"))
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
105
136
|
it "responds to timeline tweets" do
|
106
137
|
simulate(bot) do
|
107
138
|
bot.receive_event(mock_tweet("m1sp", "some excellent tweet"))
|
@@ -109,6 +140,13 @@ describe Ebooks::Bot do
|
|
109
140
|
end
|
110
141
|
end
|
111
142
|
|
143
|
+
it "ignores its own timeline tweets" do
|
144
|
+
simulate(bot) do
|
145
|
+
expect(bot).to_not receive(:on_timeline)
|
146
|
+
bot.receive_event(mock_tweet("Test_Ebooks", "pudding is cute"))
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
112
150
|
it "links tweets to conversations correctly" do
|
113
151
|
tweet1 = mock_tweet("m1sp", "tweet 1", id: 1, in_reply_to_status_id: nil)
|
114
152
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twitter_ebooks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jaiden Mispy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -278,7 +278,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
278
278
|
version: '0'
|
279
279
|
requirements: []
|
280
280
|
rubyforge_project:
|
281
|
-
rubygems_version: 2.4.
|
281
|
+
rubygems_version: 2.4.6
|
282
282
|
signing_key:
|
283
283
|
specification_version: 4
|
284
284
|
summary: Markov chains for all your friends~
|