twibot 0.1.4 → 0.1.5
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.
- data/History.txt +8 -0
- data/Readme.rdoc +19 -7
- data/lib/twibot.rb +1 -1
- data/lib/twibot/bot.rb +13 -13
- data/lib/twibot/config.rb +2 -1
- data/lib/twibot/handlers.rb +9 -2
- data/test/test_bot.rb +5 -0
- data/test/test_handler.rb +36 -1
- metadata +2 -2
data/History.txt
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== 0.1.5 / 2009-04-12
|
2
|
+
|
3
|
+
* Added support for regular expression routes
|
4
|
+
* Make timeline_for option configurable, ie in config: timeline_for: :public
|
5
|
+
* Fixed bug: Users where unlawfully rejected when their screen name started with
|
6
|
+
a capital letter (Wilco)
|
7
|
+
* Fixed bug: Twibot crashed if there were no handlers registered
|
8
|
+
|
1
9
|
== 0.1.4 / 2009-03-24
|
2
10
|
|
3
11
|
* Removed some warnings
|
data/Readme.rdoc
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
= Twibot
|
2
2
|
Official URL: http://github.com/cjohansen/twibot/tree/master
|
3
3
|
Christian Johansen (http://www.cjohansen.no)
|
4
|
+
Twitter: @cjno
|
4
5
|
|
5
6
|
== Description
|
6
7
|
|
@@ -87,6 +88,16 @@ to match incoming tweets and messages:
|
|
87
88
|
You can have several "tweet" blocks (or "message" or "reply"). The first one to
|
88
89
|
match an incoming tweet/message will handle it.
|
89
90
|
|
91
|
+
As of the upcoming 0.1.5/0.2.0, Twibot also supports regular expressions as routes:
|
92
|
+
|
93
|
+
require 'twibot'
|
94
|
+
|
95
|
+
tweet /^time ([^\s]*) ([^\s]*)/ do |message, params|
|
96
|
+
# params is an array of matches when using regexp routes
|
97
|
+
time = MyTimeService.lookup(params[0], params[1])
|
98
|
+
client.message :post, "Time is #{time} in #{params[:city]}, #{params[:country]}"
|
99
|
+
end
|
100
|
+
|
90
101
|
=== Working with the Twitter API
|
91
102
|
|
92
103
|
The DSL gives you access to your Twitter client instance through "client" (or "twitter"):
|
@@ -121,10 +132,10 @@ make 20.000 reqs/hour, and shouldn't be a problem so long as your intentions are
|
|
121
132
|
(I think).
|
122
133
|
|
123
134
|
Twibot polls like this:
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
135
|
+
* Poll messages if any message handlers exist
|
136
|
+
* Poll tweets if any tweet or reply handlers exist
|
137
|
+
* Sleep for +interval+ seconds
|
138
|
+
* Go over again
|
128
139
|
|
129
140
|
As long as Twibot finds any messages and/or tweets, the interval stays the same
|
130
141
|
(min_interval configuration switch). If nothing was found however, the interval to
|
@@ -133,9 +144,10 @@ reaches max_interval, where it will stay until Twibot finds anything.
|
|
133
144
|
|
134
145
|
== Contributors
|
135
146
|
|
136
|
-
|
137
|
-
|
138
|
-
|
147
|
+
* Dan Van Derveer (bug fixes) - http://dan.van.derveer.com/
|
148
|
+
* Ben Vandgrift (Twitter downtime error handling) - http://neovore.com/
|
149
|
+
* Jens Ohlig (warnings)
|
150
|
+
* Wilco van Duinkerken (bug fixes) - http://www.sparkboxx.com/
|
139
151
|
|
140
152
|
== License
|
141
153
|
|
data/lib/twibot.rb
CHANGED
@@ -7,7 +7,7 @@ require File.join(File.dirname(__FILE__), 'hash')
|
|
7
7
|
module Twibot
|
8
8
|
|
9
9
|
# :stopdoc:
|
10
|
-
VERSION = '0.1.
|
10
|
+
VERSION = '0.1.5'
|
11
11
|
LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
|
12
12
|
PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
|
13
13
|
# :startdoc:
|
data/lib/twibot/bot.rb
CHANGED
@@ -47,14 +47,16 @@ module Twibot
|
|
47
47
|
messages = @twitter.messages(:received, { :count => 1 })
|
48
48
|
@processed[:message] = messages.first.id if messages.length > 0
|
49
49
|
|
50
|
-
handle_tweets = @handlers[:tweet].length + @handlers[:reply].length > 0
|
50
|
+
handle_tweets = !@handlers.nil? && @handlers[:tweet].length + @handlers[:reply].length > 0
|
51
51
|
tweets = []
|
52
|
+
|
52
53
|
begin
|
53
|
-
tweets = handle_tweets ? @twitter.timeline_for(:
|
54
|
+
tweets = handle_tweets ? @twitter.timeline_for(@config.to_hash[:timeline_for], { :count => 1 }) : []
|
54
55
|
rescue Twitter::RESTError => e
|
55
56
|
log.error("Failed to connect to Twitter. It's likely down for a bit:")
|
56
|
-
|
57
|
+
log.error(e.to_s)
|
57
58
|
end
|
59
|
+
|
58
60
|
@processed[:tweet] = tweets.first.id if tweets.length > 0
|
59
61
|
@processed[:reply] = tweets.first.id if tweets.length > 0
|
60
62
|
|
@@ -94,8 +96,8 @@ module Twibot
|
|
94
96
|
dispatch_messages(type, @twitter.messages(:received, options), %w{message messages})
|
95
97
|
rescue Twitter::RESTError => e
|
96
98
|
log.error("Failed to connect to Twitter. It's likely down for a bit:")
|
97
|
-
|
98
|
-
|
99
|
+
log.error(e.to_s)
|
100
|
+
0
|
99
101
|
end
|
100
102
|
end
|
101
103
|
|
@@ -108,13 +110,11 @@ module Twibot
|
|
108
110
|
options = {}
|
109
111
|
options[:since_id] = @processed[type] if @processed[type]
|
110
112
|
begin
|
111
|
-
dispatch_messages(type,
|
112
|
-
@twitter.timeline_for(config[:include_friends] ? :friends : :me,
|
113
|
-
options), %w{tweet tweets})
|
113
|
+
dispatch_messages(type, @twitter.timeline_for(@config.to_hash[:timeline_for], options), %w{tweet tweets})
|
114
114
|
rescue Twitter::RESTError => e
|
115
115
|
log.error("Failed to connect to Twitter. It's likely down for a bit:")
|
116
|
-
|
117
|
-
|
116
|
+
log.error(e.to_s)
|
117
|
+
0
|
118
118
|
end
|
119
119
|
end
|
120
120
|
|
@@ -130,10 +130,10 @@ module Twibot
|
|
130
130
|
dispatch_messages(type, @twitter.status(:replies, options), %w{reply replies})
|
131
131
|
rescue Twitter::RESTError => e
|
132
132
|
log.error("Failed to connect to Twitter. It's likely down for a bit:")
|
133
|
-
|
134
|
-
|
133
|
+
log.error(e.to_s)
|
134
|
+
0
|
135
135
|
end
|
136
|
-
|
136
|
+
|
137
137
|
end
|
138
138
|
|
139
139
|
#
|
data/lib/twibot/config.rb
CHANGED
data/lib/twibot/handlers.rb
CHANGED
@@ -50,6 +50,11 @@ module Twibot
|
|
50
50
|
def pattern=(pattern)
|
51
51
|
return if pattern.nil? || pattern == ""
|
52
52
|
|
53
|
+
if pattern.is_a?(Regexp)
|
54
|
+
@options[:pattern] = pattern
|
55
|
+
return
|
56
|
+
end
|
57
|
+
|
53
58
|
words = pattern.split.collect { |s| s.strip } # Get all words in pattern
|
54
59
|
@options[:tokens] = words.inject([]) do |sum, token| # Find all tokens, ie :symbol :like :names
|
55
60
|
next sum unless token =~ /^:.*/ # Don't process regular words
|
@@ -70,7 +75,7 @@ module Twibot
|
|
70
75
|
|
71
76
|
users = @options[:from] ? @options[:from] : nil
|
72
77
|
sender = message.respond_to?(:sender) ? message.sender : message.user
|
73
|
-
return false if users && !users.include?(sender.screen_name) # Check allowed senders
|
78
|
+
return false if users && !users.include?(sender.screen_name.downcase) # Check allowed senders
|
74
79
|
true
|
75
80
|
end
|
76
81
|
|
@@ -82,10 +87,12 @@ module Twibot
|
|
82
87
|
return unless recognize?(message)
|
83
88
|
@params = {}
|
84
89
|
|
85
|
-
if @options[:pattern]
|
90
|
+
if @options[:pattern] && @options[:tokens]
|
86
91
|
matches = message.text.match(@options[:pattern])
|
87
92
|
@options[:tokens].each_with_index { |token, i| @params[token] = matches[i+1] }
|
88
93
|
@params[:text] = (matches[@options[:tokens].length+1] || "").strip
|
94
|
+
elsif @options[:pattern] && !@options[:tokens]
|
95
|
+
@params = message.text.match(@options[:pattern]).to_a[1..-1] || []
|
89
96
|
else
|
90
97
|
@params[:text] = message.text
|
91
98
|
end
|
data/test/test_bot.rb
CHANGED
@@ -116,6 +116,11 @@ class TestBot < Test::Unit::TestCase
|
|
116
116
|
Twitter::Client.any_instance.expects(:status).with(:replies, { :since_id => 1 }).returns([])
|
117
117
|
assert_equal 0, bot.receive_replies
|
118
118
|
end
|
119
|
+
|
120
|
+
should "use public as default timeline method for tweet 'verb'" do
|
121
|
+
bot = Twibot::Bot.new(Twibot::Config.default)
|
122
|
+
assert_equal :public, bot.instance_eval { @config.to_hash[:timeline_for] }
|
123
|
+
end
|
119
124
|
end
|
120
125
|
|
121
126
|
class TestBotMacros < Test::Unit::TestCase
|
data/test/test_handler.rb
CHANGED
@@ -126,6 +126,12 @@ class TestHandler < Test::Unit::TestCase
|
|
126
126
|
message = tweet "cjno", "time oslo norway"
|
127
127
|
assert handler.recognize?(message)
|
128
128
|
end
|
129
|
+
|
130
|
+
should "recognize tweets from allowed users with capital screen names" do
|
131
|
+
handler = Twibot::Handler.new :from => [:cjno, :irbno]
|
132
|
+
message = tweet "Cjno", "time oslo norway"
|
133
|
+
assert handler.recognize?(message)
|
134
|
+
end
|
129
135
|
|
130
136
|
should "accept options as only argument" do
|
131
137
|
handler = Twibot::Handler.new :from => :cjno
|
@@ -144,7 +150,7 @@ class TestHandler < Test::Unit::TestCase
|
|
144
150
|
handler.dispatch(message)
|
145
151
|
end
|
146
152
|
|
147
|
-
should "
|
153
|
+
should "call constructor block from handle" do
|
148
154
|
handler = Twibot::Handler.new("time :city :country", :from => ["cjno", "irbno"]) do |message, params|
|
149
155
|
raise "Boom!"
|
150
156
|
end
|
@@ -153,4 +159,33 @@ class TestHandler < Test::Unit::TestCase
|
|
153
159
|
handler.handle(nil, nil)
|
154
160
|
end
|
155
161
|
end
|
162
|
+
|
163
|
+
should "recognize regular expressions" do
|
164
|
+
handler = Twibot::Handler.new /(?:what|where) is (.*)/i
|
165
|
+
message = twitter_message "dude", "Where is this shit?"
|
166
|
+
assert handler.recognize?(message)
|
167
|
+
|
168
|
+
message = twitter_message "dude", "How is this shit?"
|
169
|
+
assert !handler.recognize?(message)
|
170
|
+
end
|
171
|
+
|
172
|
+
should "recognize regular expressions from specific users" do
|
173
|
+
handler = Twibot::Handler.new /(?:what|where) is (.*)/i, :from => "cjno"
|
174
|
+
message = twitter_message "dude", "Where is this shit?"
|
175
|
+
assert !handler.recognize?(message)
|
176
|
+
|
177
|
+
message = twitter_message "cjno", "Where is this shit?"
|
178
|
+
assert handler.recognize?(message)
|
179
|
+
end
|
180
|
+
|
181
|
+
should "provide parameters as arrays when matching regular expressions" do
|
182
|
+
handler = Twibot::Handler.new(/time ([^\s]*) ([^\s]*)/) do |message, params|
|
183
|
+
assert_equal "oslo", params[0]
|
184
|
+
assert_equal "norway", params[1]
|
185
|
+
end
|
186
|
+
|
187
|
+
message = twitter_message "cjno", "time oslo norway"
|
188
|
+
assert handler.recognize?(message)
|
189
|
+
handler.dispatch(message)
|
190
|
+
end
|
156
191
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twibot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Johansen
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-04-12 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|