twitter_ebooks 3.0.9 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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~
|