rumpy 0.9.21 → 0.9.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/rumpy.rb +4 -317
  2. metadata +6 -8
@@ -1,19 +1,16 @@
1
1
  require 'rubygems'
2
- require 'xmpp4r/client'
3
- require 'xmpp4r/roster'
4
- require 'xmpp4r/version'
5
- require 'active_record'
6
- require 'logger'
2
+ require 'rumpy/version'
3
+ require 'rumpy/bot'
7
4
 
8
5
  module Rumpy
9
6
 
10
7
  # Start bot in new process,
11
8
  # detach this process and save the pid of process in pid_file
12
9
  def self.start(bot)
13
- pf = pid_file bot
10
+ pf = pid_file bot
14
11
  return false if File.exist? pf
15
12
 
16
- bot.log_file = "#{bot.class.to_s.downcase}.log"
13
+ bot.log_file = "#{bot.class.to_s.downcase}.log"
17
14
 
18
15
  pid = fork do
19
16
  bot.start
@@ -51,314 +48,4 @@ module Rumpy
51
48
  pid_file = bot.class.to_s.downcase + '.pid' unless pid_file
52
49
  pid_file
53
50
  end
54
-
55
- # include this module into your bot's class
56
- module Bot
57
- attr_reader :pid_file
58
-
59
- # if @log_file isn't set, initialize it
60
- def log_file=(logfile)
61
- @log_file ||= logfile
62
- end
63
-
64
- # one and only public function, defined in this module
65
- # simply initializes bot's variables, connection, etc.
66
- # and starts bot
67
- def start
68
- logger_init
69
-
70
- init
71
-
72
- connect
73
-
74
- set_iq_callback
75
- set_subscription_callback
76
- set_message_callback
77
-
78
- start_backend_thread
79
- start_output_queue_thread
80
-
81
- prepare_users
82
-
83
- @logger.info 'Bot is going ONLINE'
84
- @output_queue.enq Jabber::Presence.new(nil, @status, @priority)
85
-
86
- add_signal_trap
87
-
88
- Thread.stop
89
- rescue => ex
90
- general_error ex
91
- exit
92
- end # def start
93
-
94
- private
95
-
96
- def logger_init
97
- unless @logger
98
- @log_file ||= STDERR
99
- @log_level ||= Logger::INFO
100
- @logger = Logger.new @log_file, @log_shift_age, @log_shift_size
101
- @logger.level = @log_level
102
- @logger.datetime_format = "%Y-%m-%d %H:%M:%S"
103
- end
104
-
105
- @logger.info 'starting bot'
106
- end
107
-
108
- def init
109
- @config_path ||= 'config'
110
- @main_model ||= :user
111
-
112
- @logger.debug 'initializing some variables'
113
-
114
- xmppconfig = YAML::load_file @config_path + '/xmpp.yml'
115
- @logger.info 'loaded xmpp.yml'
116
- @logger.debug "xmpp.yml: #{xmppconfig.inspect}"
117
- @lang = YAML::load_file @config_path + '/lang.yml'
118
- @logger.info 'loaded lang.yml'
119
- @logger.debug "lang.yml: #{@lang.inspect}"
120
- @jid = Jabber::JID.new xmppconfig['jid']
121
- @priority = xmppconfig['priority']
122
- @status = xmppconfig['status']
123
- @password = xmppconfig['password']
124
- @client = Jabber::Client.new @jid
125
- Jabber::Version::SimpleResponder.new(@client, @bot_name || self.class.to_s, @bot_version || '1.0.0', RUBY_PLATFORM)
126
-
127
- if @models_files
128
- dbconfig = YAML::load_file @config_path + '/database.yml'
129
- @logger.info 'loaded database.yml'
130
- @logger.debug "database.yml: #{dbconfig.inspect}"
131
- ActiveRecord::Base.establish_connection dbconfig
132
- @logger.info 'database connection established'
133
- @models_files.each do |file|
134
- self.class.require file
135
- @logger.info "added models file '#{file}'"
136
- end
137
- end
138
-
139
- @main_model = Object.const_get @main_model.to_s.capitalize
140
- @logger.info "main model set to #{@main_model}"
141
-
142
- @queues = Hash.new do |h, k|
143
- h[k] = Queue.new
144
- end
145
-
146
- @output_queue = Queue.new
147
- end # def init
148
-
149
- def connect
150
- @logger.debug 'establishing xmpp connection'
151
-
152
- @client.connect
153
- @client.auth @password
154
- @roster = Jabber::Roster::Helper.new @client
155
- @roster.wait_for_roster
156
-
157
- @logger.info 'xmpp connection established'
158
- end
159
-
160
- def set_iq_callback
161
- @client.add_iq_callback do |iq|
162
- @logger.debug "got iq #{iq}"
163
- if iq.type == :get # hack for pidgin (STOP USING IT)
164
- response = iq.answer true
165
- if iq.elements['time'] == "<time xmlns='urn:xmpp:time'/>"
166
- @logger.debug 'this is time request, okay'
167
- response.set_type :result
168
- tm = Time.now
169
- response.elements['time'].add REXML::Element.new('tzo')
170
- response.elements['time/tzo'].text = tm.xmlschema[-6..-1]
171
- response.elements['time'].add REXML::Element.new('utc')
172
- response.elements['time/utc'].text = tm.utc.xmlschema
173
- else
174
- response.set_type :error
175
- end # if iq.elements['time']
176
- @output_queue.enq response
177
- end
178
- end
179
- end # def set_iq_callback
180
-
181
- def set_subscription_callback
182
- @roster.add_subscription_request_callback do |item, presence|
183
- jid = presence.from
184
- @roster.accept_subscription jid
185
- @output_queue.enq presence.answer.set_type :subscribe
186
- @output_queue.enq Jabber::Message.new(jid, @lang['hello']).set_type :chat
187
-
188
- @logger.info "#{jid} just subscribed"
189
- end
190
- @roster.add_subscription_callback do |item, presence|
191
- begin
192
- case presence.type
193
- when :unsubscribed, :unsubscribe
194
- @logger.info "#{item.jid} wanna unsubscribe"
195
- @queues[item.jid.strip.to_s].enq :unsubscribe
196
- item.remove
197
- when :subscribed
198
- user = @main_model.new
199
- user.jid = item.jid.strip.to_s
200
- user.save
201
- start_user_thread user
202
-
203
- @logger.info "added new user: #{user.jid}"
204
- @output_queue.enq Jabber::Message.new(item.jid, @lang['authorized']).set_type :chat
205
- end
206
- rescue ActiveRecord::StatementInvalid
207
- statement_invalid_error
208
- retry
209
- rescue ActiveRecord::ConnectionTimeoutError
210
- connection_timeout_error
211
- retry
212
- rescue => ex
213
- general_error ex
214
- end
215
- end
216
- end # def set_subscription_callback
217
-
218
- def set_message_callback
219
- @client.add_message_callback do |msg|
220
- if msg.type != :error && msg.body && msg.from
221
- if @roster[msg.from] && @roster[msg.from].subscription == :both
222
- @logger.debug "got normal message #{msg}"
223
-
224
- @queues[msg.from.strip.to_s].enq msg
225
- else
226
- @logger.debug "user not in roster: #{msg.from}"
227
-
228
- @output_queue.enq msg.answer.set_body @lang['stranger']
229
- end
230
- end
231
- end
232
- end # def set_message_callback
233
-
234
- def start_backend_thread
235
- Thread.new do
236
- begin
237
- loop do
238
- backend_func().each do |result|
239
- message = Jabber::Message.new(*result).set_type :chat
240
- @output_queue.enq message if message.body && message.to
241
- end
242
- end
243
- rescue ActiveRecord::StatementInvalid
244
- statement_invalid_error
245
- retry
246
- rescue ActiveRecord::ConnectionTimeoutError
247
- connection_timeout_error
248
- retry
249
- rescue => ex
250
- general_error ex
251
- end # begin
252
- end if self.respond_to? :backend_func
253
- end # def start_backend_thread
254
-
255
- def start_output_queue_thread
256
- Thread.new do
257
- @logger.info "Output queue initialized"
258
- until (msg = @output_queue.deq) == :halt do
259
- if msg.nil?
260
- @logger.debug "got nil message. wtf?"
261
- else
262
- @logger.debug "sending message #{msg}"
263
- @client.send msg
264
- end
265
- end
266
- @logger.info "Output queue destroyed"
267
- end
268
- end # def start_output_queue_thread
269
-
270
- def add_signal_trap
271
- Signal.trap :TERM do |signo| # soft stop
272
- @logger.info 'Bot is unavailable'
273
- @output_queue.enq Jabber::Presence.new.set_type :unavailable
274
-
275
- @queues.each do |user, queue|
276
- queue.enq :halt
277
- end
278
- sleep 1 until @queues.empty?
279
-
280
- @output_queue.enq :halt
281
- sleep 1 until @output_queue.empty?
282
-
283
- @client.close
284
-
285
- @logger.info 'terminating'
286
- @logger.close
287
- exit
288
- end
289
- end
290
-
291
- def prepare_users
292
- @logger.debug 'clear wrong users'
293
-
294
- @roster.items.each do |jid, item|
295
- user = @main_model.find_by_jid jid.strip.to_s
296
- if user.nil? || item.subscription != :both
297
- @logger.info "deleting from roster user with jid #{jid}"
298
- item.remove
299
- end
300
- end
301
- @main_model.find_each do |user|
302
- items = @roster.find user.jid
303
- if items.empty?
304
- @logger.info "deleting from database user with jid #{user.jid}"
305
- user.destroy
306
- else
307
- start_user_thread user
308
- end
309
- end
310
-
311
- @main_model.connection_pool.release_connection
312
- end # def prepare_users
313
-
314
- def start_user_thread(user)
315
- Thread.new(user) do |user|
316
- @logger.debug "thread for user #{user.jid} started"
317
-
318
- until (msg = @queues[user.jid].deq).kind_of? Symbol do
319
- begin
320
- pars_results = parser_func msg.body
321
- @logger.debug "parsed message: #{pars_results.inspect}"
322
- answer = do_func user, pars_results
323
- @output_queue.enq msg.answer.set_body answer unless answer.nil? or answer.empty?
324
- rescue ActiveRecord::StatementInvalid
325
- statement_invalid_error
326
- retry
327
- rescue ActiveRecord::ConnectionTimeoutError
328
- connection_timeout_error
329
- retry
330
- rescue => ex
331
- general_error ex
332
- end # begin
333
-
334
- @main_model.connection_pool.release_connection
335
- end # until (msg = @queues[user.jid].deq).kind_of? Symbol do
336
-
337
- if msg == :unsubscribe
338
- @logger.info "removing user #{user.jid}"
339
- user.destroy
340
- end
341
-
342
- @queues.delete user.jid
343
-
344
- end # Thread.new do
345
- end # def start_user_thread(user)
346
-
347
- def statement_invalid_error
348
- @logger.warn 'Statement Invalid catched'
349
- @logger.info 'Reconnecting to database'
350
- @main_model.connection.reconnect!
351
- end
352
-
353
- def connection_timeout_error
354
- @logger.warn 'ActiveRecord::ConnectionTimeoutError'
355
- @logger.info 'sleep and retry again'
356
- sleep 3
357
- end
358
-
359
- def general_error(exception)
360
- @logger.error exception.inspect
361
- @logger.error exception.backtrace
362
- end
363
- end # module Rumpy::Bot
364
51
  end # module Rumpy
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rumpy
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
5
- prerelease: false
4
+ hash: 23
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 21
10
- version: 0.9.21
9
+ - 22
10
+ version: 0.9.22
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tsokurov A.G.
@@ -16,8 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-09-19 00:00:00 +03:00
20
- default_executable:
19
+ date: 2011-11-20 00:00:00 Z
21
20
  dependencies:
22
21
  - !ruby/object:Gem::Dependency
23
22
  name: activerecord
@@ -62,7 +61,6 @@ extra_rdoc_files:
62
61
  files:
63
62
  - lib/rumpy.rb
64
63
  - README.rdoc
65
- has_rdoc: true
66
64
  homepage: https://github.com/Ximik/Rumpy
67
65
  licenses:
68
66
  - MIT
@@ -93,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
93
91
  requirements: []
94
92
 
95
93
  rubyforge_project:
96
- rubygems_version: 1.3.7
94
+ rubygems_version: 1.8.10
97
95
  signing_key:
98
96
  specification_version: 3
99
97
  summary: Rumpy == jabber bot framework