chewbranca-twibot 0.1.7.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,50 @@
1
+ == 0.1.7 / 2009-06-01
2
+
3
+ * New feature - choose how Twibot processes incoming tweets on startup
4
+ (process all, process new [old behaviour], or process from a given ID)
5
+ Bodaniel Jeanes
6
+ * Substantially improved error handling. Now survives all common network
7
+ stability issues
8
+ * Added a host configuration option. The host name is displayed along all
9
+ output from Twibot. Currently Twitter4R does nothing with this option,
10
+ Twibot knowing about it should make it easier to put Twibot/Twitter4R on
11
+ other services like Laconica instances
12
+
13
+ == 0.1.6 / 2009-04-13
14
+
15
+ * Fixed configure block not actually working for username and password
16
+ Bodaniel Jeanes
17
+ * Minor updates in tests
18
+
19
+ == 0.1.5 / 2009-04-12
20
+
21
+ * Added support for regular expression routes
22
+ * Make timeline_for option configurable, ie in config: timeline_for: :public
23
+ * Fixed bug: Users where unlawfully rejected when their screen name started with
24
+ a capital letter (Wilco)
25
+ * Fixed bug: Twibot crashed if there were no handlers registered
26
+
27
+ == 0.1.4 / 2009-03-24
28
+
29
+ * Removed some warnings
30
+ * Added error handling to avoid Twibot crashing when Twitter is down (Ben Vandgrift)
31
+ * Fixed bug: receiving tweets from named users crashed Twibot (Jens Ohlig)
32
+
33
+ == 0.1.3 / 2009-03-19
34
+
35
+ * Ruby 1.9 support
36
+
37
+ == 0.1.2 / 2009-03-18
38
+
39
+ * Removed some warnings
40
+ * Applied patch from Dan Van Derveer fixing a few minor bugs related to the
41
+ options hash sent to Twitter4R
42
+
43
+ == 0.1.1 / 2009-03-15
44
+
45
+ * Fixed dependency
46
+
47
+ == 0.1.0 / 2009-03-15
48
+
49
+ * 1 major enhancement
50
+ * Birthday!
data/Rakefile ADDED
@@ -0,0 +1,30 @@
1
+ # Look in the tasks/setup.rb file for the various options that can be
2
+ # configured in this Rakefile. The .rake files in the tasks directory
3
+ # are where the options are used.
4
+
5
+ begin
6
+ require 'bones'
7
+ Bones.setup
8
+ rescue LoadError
9
+ begin
10
+ load 'tasks/setup.rb'
11
+ rescue LoadError
12
+ raise RuntimeError, '### please install the "bones" gem ###'
13
+ end
14
+ end
15
+
16
+ ensure_in_path 'lib'
17
+ require 'twibot'
18
+
19
+ task :default => 'test:run'
20
+
21
+ PROJ.name = 'twibot'
22
+ PROJ.authors = 'Christian Johansen'
23
+ PROJ.email = 'christian@cjohansen.no'
24
+ PROJ.url = 'http://github.com/bjeanes/twibot/'
25
+ PROJ.version = Twibot::VERSION
26
+ PROJ.rubyforge.name = 'twibot'
27
+ PROJ.readme_file = 'Readme.rdoc'
28
+ PROJ.rdoc.remote_dir = 'twibot'
29
+
30
+ depend_on "mbbx6spp-twitter4r", "0.3.1"
data/Readme.rdoc ADDED
@@ -0,0 +1,269 @@
1
+ = Twibot
2
+ Official URL: http://github.com/cjohansen/twibot/tree/master
3
+ Christian Johansen (http://www.cjohansen.no)
4
+ Twitter: @cjno
5
+
6
+ == Description
7
+
8
+ Twibot (pronounced like "Abbot"), is a Ruby microframework for creating Twitter
9
+ bots, heavily inspired by Sinatra.
10
+
11
+ == Usage
12
+
13
+ === Simple example
14
+
15
+ require 'twibot'
16
+
17
+ # Receive messages, and tweet them publicly
18
+ #
19
+ message do |message, params|
20
+ post_tweet message
21
+ end
22
+
23
+ # Respond to @replies if they come from the right crowd
24
+ #
25
+ reply :from => [:cjno, :irbno] do |message, params|
26
+ post_reply message, "I agree"
27
+ end
28
+
29
+ # Listen in and log tweets
30
+ #
31
+ tweet do |message, params|
32
+ MyApp.log_tweet(message)
33
+ end
34
+
35
+ # Search for tweets matching a query. The available search operators
36
+ # are explained here: <http://search.twitter.com/operators>
37
+ #
38
+ search "twibot" do |message, params|
39
+ # do_something
40
+ end
41
+
42
+ # Search for tweets with a hashtag
43
+ # see: <http://twitter.pbworks.com/Hashtags>
44
+ #
45
+ # Note: hashtag is just a convenience wrapper
46
+ # around search. It will invoke the search
47
+ # before and after filters.
48
+ #
49
+ hashtag "twibot" do |message, params|
50
+ # do_something
51
+ end
52
+
53
+ # Search for tweets with one of a number of hashtags
54
+ # see: <http://twitter.pbworks.com/Hashtags>
55
+ #
56
+ # Note: hashtags is just an alias to hashtag
57
+ #
58
+ hashtags [:twibot, :ruby, "twitter4r"] do |message, params|
59
+ # do_something
60
+ end
61
+
62
+ # Process any new followers. user_id will be
63
+ # the user's Numeric id and params will always
64
+ # be an empty Hash.
65
+ #
66
+ # add_friend!(id) is a convenience wrapper around the
67
+ # twitter4r friendship method. remove_friend!(id)
68
+ # is also available.
69
+ #
70
+ follower do |user_id, params|
71
+ # keep out the riff-raff...
72
+ bot.add_friend!(user_id) unless user_id == 890631
73
+ end
74
+
75
+ # add some set-up code that will be called
76
+ # before each polling cycle. :all is the
77
+ # default, so it can safely be omitted
78
+ #
79
+ before :all do
80
+ MyApp.log("Started polling at #{Time.now}")
81
+ end
82
+
83
+ # the after hook for the polling cycle gets
84
+ # passed the number of messages that were
85
+ # processed
86
+ #
87
+ after :all do |message_count|
88
+ MyApp.log("Finished polling at #{Time.now}. Got #{message_count} messages.")
89
+ end
90
+
91
+ # each action has before and after hooks available:
92
+ # - follower
93
+ # - message
94
+ # - reply
95
+ # - search
96
+ # - tweet
97
+ #
98
+ # there can be only one before and one after callback
99
+ # registered for a given type. the callback block
100
+ # will be called with no arguments.
101
+ #
102
+ # Note: hashtag and hashtags are just wrappers around
103
+ # search and do not have their own hooks. Use the
104
+ # search hooks when using hashtag or hashtags.
105
+ #
106
+ before :message do
107
+ MyApp.is_processing_a_message = true
108
+ end
109
+
110
+ after :message do
111
+ MyApp.is_processing_a_message = false
112
+ end
113
+
114
+ after :follower do
115
+ MyApp.log("I have another follower!")
116
+ end
117
+
118
+
119
+ === Running the bot
120
+
121
+ To run the bot, simply do:
122
+
123
+ ruby bot.rb
124
+
125
+ === Configuration
126
+
127
+ Twibot looks for a configuration file in ./config/bot.yml. It should contain
128
+ atleast:
129
+
130
+ login: twitter_login
131
+ password: twitter_password
132
+
133
+ You can also pass configuration as command line arguments:
134
+
135
+ ruby bot.rb --login myaccount
136
+
137
+ ...or configure with Ruby:
138
+
139
+ configure do |conf|
140
+ conf.login = "my_account"
141
+ do
142
+
143
+ If you don't specify login and/or password in any of these ways, Twibot will
144
+ prompt you for those.
145
+
146
+ If you want to change how Twibot is configured, you can setup the bot instance
147
+ manually and give it only the configuration options you want:
148
+
149
+ # Create bot only with default configuration
150
+ require 'twibot'
151
+ bot = Twibot::Bot.new(Twibot::Config.default)
152
+
153
+ # Application here...
154
+
155
+ If you want command line arguments you can do:
156
+
157
+ require 'twibot'
158
+ bot = Twibot::Bot.new(Twibot::Config.default << Twibot::CliConfig.new)
159
+
160
+ To disable the buffering of the Twibot log file, set the `log_flush` config
161
+ option to `true`:
162
+
163
+ configure do |conf|
164
+ conf.log_file = File.join(DAEMON_ROOT, 'log', 'twitterd.log')
165
+ conf.log_level = "info"
166
+ conf.log_flush = true
167
+ end
168
+
169
+ === "Routes"
170
+
171
+ Like Sinatra, and other web app frameworks, Twibot supports "routes": patterns
172
+ to match incoming tweets and messages:
173
+
174
+ require 'twibot'
175
+
176
+ tweet "time :country :city" do |message,params|
177
+ time = MyTimeService.lookup(params[:country], params[:city])
178
+ client.message :post, "Time is #{time} in #{params[:city]}, #{params[:country]}"
179
+ end
180
+
181
+ You can have several "tweet" blocks (or "message" or "reply"). The first one to
182
+ match an incoming tweet/message will handle it.
183
+
184
+ As of the upcoming 0.1.5/0.2.0, Twibot also supports regular expressions as routes:
185
+
186
+ require 'twibot'
187
+
188
+ tweet /^time ([^\s]*) ([^\s]*)/ do |message, params|
189
+ # params is an array of matches when using regexp routes
190
+ time = MyTimeService.lookup(params[0], params[1])
191
+ client.message :post, "Time is #{time} in #{params[:city]}, #{params[:country]}"
192
+ end
193
+
194
+ === Working with the Twitter API
195
+
196
+ The DSL gives you access to your Twitter client instance through "client" (or "twitter"):
197
+
198
+ message do
199
+ twitter.status :post, "Hello world" # Also: client.status :post, "Hello world"
200
+ end
201
+
202
+ == Requirements
203
+
204
+ Twitter4r. You'll need atleast 0.3.1, which is currently only available from GitHub.
205
+ Versions of Twitter4r prior to 0.3.1 does not allow for the since_id parameter to be
206
+ appended to URLs to the REST API. Twibot needs these to only fetch fresh messages
207
+ and tweets.
208
+
209
+ == Installation
210
+
211
+ gem install twibot
212
+
213
+ == Is it Ruby 1.9?
214
+
215
+ As of Twibot 0.1.3, yes it is! All tests pass, please give feedback from real world
216
+ usage if you have trouble.
217
+
218
+ == Polling
219
+
220
+ Twitter pulled the plug on it's xmpp service last year. This means that Twibot backed
221
+ bots needs to poll the Twitter service to keep up. Twitter has a request limit on 70
222
+ reqs/hour, so you should configure your bot not to make more than that, else it will
223
+ fail. You can ask for your bot account to be put on the whitelist which allows you to
224
+ make 20.000 reqs/hour, and shouldn't be a problem so long as your intentions are good
225
+ (I think).
226
+
227
+ Twibot polls like this:
228
+ * Poll messages if any message handlers exist
229
+ * Poll tweets if any tweet or reply handlers exist
230
+ * Sleep for +interval+ seconds
231
+ * Go over again
232
+
233
+ As long as Twibot finds any messages and/or tweets, the interval stays the same
234
+ (min_interval configuration switch). If nothing was found however, the interval to
235
+ sleep is increased by interval_step configuration option. This happens until it
236
+ reaches max_interval, where it will stay until Twibot finds anything.
237
+
238
+ == Contributors
239
+
240
+ * Dan Van Derveer (bug fixes) - http://dan.van.derveer.com/
241
+ * Ben Vandgrift (Twitter downtime error handling) - http://neovore.com/
242
+ * Jens Ohlig (warnings)
243
+ * Wilco van Duinkerken (bug fixes) - http://www.sparkboxx.com/
244
+ * Bodaniel Jeanes (configure block fix) - http://bjeanes.github.com/
245
+
246
+ == License
247
+
248
+ (The MIT License)
249
+
250
+ Copyright (c) 2009 Christian Johansen
251
+
252
+ Permission is hereby granted, free of charge, to any person obtaining
253
+ a copy of this software and associated documentation files (the
254
+ 'Software'), to deal in the Software without restriction, including
255
+ without limitation the rights to use, copy, modify, merge, publish,
256
+ distribute, sublicense, and/or sell copies of the Software, and to
257
+ permit persons to whom the Software is furnished to do so, subject to
258
+ the following conditions:
259
+
260
+ The above copyright notice and this permission notice shall be
261
+ included in all copies or substantial portions of the Software.
262
+
263
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
264
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
265
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
266
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
267
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
268
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
269
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/lib/hash.rb ADDED
@@ -0,0 +1,8 @@
1
+ class Hash
2
+ def symbolize_keys!
3
+ replace(inject({}) do |hash,(key,value)|
4
+ hash[key.to_sym] = value.is_a?(Hash) ? value.symbolize_keys! : value
5
+ hash
6
+ end)
7
+ end
8
+ end