slack-smart-bot 1.9.1 → 1.11.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.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +184 -16
  3. data/lib/slack/smart-bot/comm/ask.rb +55 -49
  4. data/lib/slack/smart-bot/comm/delete.rb +13 -0
  5. data/lib/slack/smart-bot/comm/dont_understand.rb +3 -3
  6. data/lib/slack/smart-bot/comm/event_hello.rb +8 -4
  7. data/lib/slack/smart-bot/comm/get_channel_members.rb +13 -4
  8. data/lib/slack/smart-bot/comm/get_channels.rb +31 -16
  9. data/lib/slack/smart-bot/comm/get_presence.rb +20 -0
  10. data/lib/slack/smart-bot/comm/get_user_info.rb +12 -8
  11. data/lib/slack/smart-bot/comm/get_users.rb +24 -0
  12. data/lib/slack/smart-bot/comm/react.rb +19 -2
  13. data/lib/slack/smart-bot/comm/respond.rb +224 -53
  14. data/lib/slack/smart-bot/comm/respond_direct.rb +2 -3
  15. data/lib/slack/smart-bot/comm/respond_thread.rb +5 -0
  16. data/lib/slack/smart-bot/comm/send_file.rb +38 -34
  17. data/lib/slack/smart-bot/comm/send_msg_channel.rb +27 -22
  18. data/lib/slack/smart-bot/comm/send_msg_user.rb +59 -33
  19. data/lib/slack/smart-bot/comm/unreact.rb +22 -18
  20. data/lib/slack/smart-bot/comm.rb +4 -0
  21. data/lib/slack/smart-bot/commands/general/add_admin.rb +51 -0
  22. data/lib/slack/smart-bot/commands/general/add_announcement.rb +32 -0
  23. data/lib/slack/smart-bot/commands/general/add_team.rb +80 -0
  24. data/lib/slack/smart-bot/commands/general/allow_access.rb +67 -0
  25. data/lib/slack/smart-bot/commands/general/bot_help.rb +69 -33
  26. data/lib/slack/smart-bot/commands/general/bye_bot.rb +0 -7
  27. data/lib/slack/smart-bot/commands/general/delete_announcement.rb +34 -0
  28. data/lib/slack/smart-bot/commands/general/delete_share.rb +34 -0
  29. data/lib/slack/smart-bot/commands/general/delete_team.rb +34 -0
  30. data/lib/slack/smart-bot/commands/general/deny_access.rb +36 -0
  31. data/lib/slack/smart-bot/commands/general/hi_bot.rb +16 -11
  32. data/lib/slack/smart-bot/commands/general/ping_team.rb +100 -0
  33. data/lib/slack/smart-bot/commands/general/poster.rb +116 -0
  34. data/lib/slack/smart-bot/commands/general/remove_admin.rb +58 -0
  35. data/lib/slack/smart-bot/commands/general/see_access.rb +24 -0
  36. data/lib/slack/smart-bot/commands/general/see_admins.rb +33 -0
  37. data/lib/slack/smart-bot/commands/general/see_announcements.rb +115 -0
  38. data/lib/slack/smart-bot/commands/general/see_command_ids.rb +29 -0
  39. data/lib/slack/smart-bot/commands/general/see_favorite_commands.rb +53 -0
  40. data/lib/slack/smart-bot/commands/general/see_shares.rb +41 -0
  41. data/lib/slack/smart-bot/commands/general/see_statuses.rb +91 -0
  42. data/lib/slack/smart-bot/commands/general/see_teams.rb +252 -0
  43. data/lib/slack/smart-bot/commands/general/share_messages.rb +58 -0
  44. data/lib/slack/smart-bot/commands/general/update_team.rb +109 -0
  45. data/lib/slack/smart-bot/commands/general_bot_commands.rb +504 -0
  46. data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +4 -6
  47. data/lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb +45 -14
  48. data/lib/slack/smart-bot/commands/on_bot/admin/extend_rules.rb +4 -1
  49. data/lib/slack/smart-bot/commands/on_bot/admin/pause_bot.rb +6 -3
  50. data/lib/slack/smart-bot/commands/on_bot/admin/pause_routine.rb +3 -1
  51. data/lib/slack/smart-bot/commands/on_bot/admin/remove_routine.rb +4 -4
  52. data/lib/slack/smart-bot/commands/on_bot/admin/run_routine.rb +8 -2
  53. data/lib/slack/smart-bot/commands/on_bot/admin/see_result_routine.rb +33 -0
  54. data/lib/slack/smart-bot/commands/on_bot/admin/see_routines.rb +13 -10
  55. data/lib/slack/smart-bot/commands/on_bot/admin/start_bot.rb +6 -3
  56. data/lib/slack/smart-bot/commands/on_bot/admin/start_routine.rb +3 -1
  57. data/lib/slack/smart-bot/commands/on_bot/admin/stop_using_rules_on.rb +4 -1
  58. data/lib/slack/smart-bot/commands/on_bot/admin_master/delete_message.rb +25 -0
  59. data/lib/slack/smart-bot/commands/on_bot/admin_master/get_bot_logs.rb +1 -0
  60. data/lib/slack/smart-bot/commands/on_bot/admin_master/react_to.rb +34 -0
  61. data/lib/slack/smart-bot/commands/on_bot/admin_master/send_message.rb +37 -0
  62. data/lib/slack/smart-bot/commands/on_bot/delete_repl.rb +4 -5
  63. data/lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb +7 -8
  64. data/lib/slack/smart-bot/commands/on_bot/general/bot_stats.rb +400 -0
  65. data/lib/slack/smart-bot/commands/{general → on_bot/general}/bot_status.rb +3 -4
  66. data/lib/slack/smart-bot/commands/on_bot/general/leaderboard.rb +201 -0
  67. data/lib/slack/smart-bot/commands/{general → on_bot/general}/stop_using_rules.rb +12 -6
  68. data/lib/slack/smart-bot/commands/on_bot/general/suggest_command.rb +36 -0
  69. data/lib/slack/smart-bot/commands/{general → on_bot/general}/use_rules.rb +13 -11
  70. data/lib/slack/smart-bot/commands/{general → on_bot/general}/whats_new.rb +2 -1
  71. data/lib/slack/smart-bot/commands/on_bot/get_repl.rb +4 -5
  72. data/lib/slack/smart-bot/commands/on_bot/repl.rb +76 -21
  73. data/lib/slack/smart-bot/commands/on_bot/ruby_code.rb +3 -4
  74. data/lib/slack/smart-bot/commands/on_bot/run_repl.rb +15 -7
  75. data/lib/slack/smart-bot/commands/on_bot/see_repls.rb +5 -6
  76. data/lib/slack/smart-bot/commands/on_bot/see_shortcuts.rb +5 -6
  77. data/lib/slack/smart-bot/commands/on_extended/bot_rules.rb +45 -12
  78. data/lib/slack/smart-bot/commands/on_master/admin/kill_bot_on_channel.rb +7 -3
  79. data/lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb +4 -1
  80. data/lib/slack/smart-bot/commands/on_master/admin_master/notify_message.rb +3 -1
  81. data/lib/slack/smart-bot/commands/on_master/admin_master/publish_announcements.rb +33 -0
  82. data/lib/slack/smart-bot/commands/on_master/admin_master/set_general_message.rb +39 -0
  83. data/lib/slack/smart-bot/commands/on_master/admin_master/set_maintenance.rb +10 -1
  84. data/lib/slack/smart-bot/commands/on_master/create_bot.rb +28 -14
  85. data/lib/slack/smart-bot/commands/on_master/where_smartbot.rb +41 -0
  86. data/lib/slack/smart-bot/commands.rb +36 -5
  87. data/lib/slack/smart-bot/listen.rb +31 -33
  88. data/lib/slack/smart-bot/process.rb +234 -73
  89. data/lib/slack/smart-bot/process_first.rb +119 -38
  90. data/lib/slack/smart-bot/treat_message.rb +310 -237
  91. data/lib/slack/smart-bot/utils/build_help.rb +2 -2
  92. data/lib/slack/smart-bot/utils/create_routine_thread.rb +81 -46
  93. data/lib/slack/smart-bot/utils/get_access_channels.rb +13 -0
  94. data/lib/slack/smart-bot/utils/get_admins_channels.rb +13 -0
  95. data/lib/slack/smart-bot/utils/get_bots_created.rb +28 -8
  96. data/lib/slack/smart-bot/utils/get_channels_name_and_id.rb +7 -2
  97. data/lib/slack/smart-bot/utils/get_command_ids.rb +84 -0
  98. data/lib/slack/smart-bot/utils/get_help.rb +79 -73
  99. data/lib/slack/smart-bot/utils/get_repls.rb +22 -2
  100. data/lib/slack/smart-bot/utils/get_routines.rb +22 -2
  101. data/lib/slack/smart-bot/utils/get_shares.rb +12 -0
  102. data/lib/slack/smart-bot/utils/get_teams.rb +22 -0
  103. data/lib/slack/smart-bot/utils/has_access.rb +28 -0
  104. data/lib/slack/smart-bot/utils/is_admin.rb +27 -0
  105. data/lib/slack/smart-bot/utils/save_stats.rb +46 -41
  106. data/lib/slack/smart-bot/utils/save_status.rb +67 -0
  107. data/lib/slack/smart-bot/utils/update_access_channels.rb +8 -0
  108. data/lib/slack/smart-bot/utils/update_admins_channels.rb +8 -0
  109. data/lib/slack/smart-bot/utils/update_bots_file.rb +28 -7
  110. data/lib/slack/smart-bot/utils/update_repls.rb +7 -4
  111. data/lib/slack/smart-bot/utils/update_routines.rb +9 -3
  112. data/lib/slack/smart-bot/utils/update_shortcuts_file.rb +13 -6
  113. data/lib/slack/smart-bot/utils/update_teams.rb +16 -0
  114. data/lib/slack/smart-bot/utils.rb +11 -0
  115. data/lib/slack-smart-bot.rb +72 -12
  116. data/lib/slack-smart-bot_general_commands.rb +61 -0
  117. data/lib/slack-smart-bot_general_rules.rb +5 -2
  118. data/lib/slack-smart-bot_rules.rb +43 -17
  119. data/whats_new.txt +20 -15
  120. metadata +76 -9
  121. data/lib/slack/smart-bot/commands/general/bot_stats.rb +0 -313
@@ -1,30 +1,51 @@
1
1
  class SlackSmartBot
2
- def process_first(user, text, dest, dchannel, typem, files, ts, thread_ts, routine)
2
+ def process_first(user, text, dest, dchannel, typem, files, ts, thread_ts, routine, routine_name, routine_type, command_orig)
3
3
  nick = user.name
4
4
  rules_file = ""
5
5
  text.gsub!(/^!!/,'^') # to treat it just as ^
6
+ shared = []
7
+ if @shares.key?(@channels_name[dest]) and (ts.to_s!='' or config.simulate) and (user.id!=config.nick_id or (user.id == config.nick_id and !text.match?(/\A\*?Shares from channel/)))
8
+ @shares[@channels_name[dest]].each do |row|
9
+ if row[:user_deleted]==''
10
+ if ((row[:type] == 'text' and text.include?(row[:condition][1..-2])) or (row[:type]=='regexp' and text.match?(/#{row[:condition][1..-2]}/im))) and !shared.include?(row[:to_channel])
11
+ if config.simulate
12
+ link = text
13
+ else
14
+ link = client.web_client.chat_getPermalink(channel: dest, message_ts: ts).permalink
15
+ end
16
+ respond "*<#{link}|Shared> by <@#{row[:user_created]}> from <##{dest}>* using share id #{row[:share_id]}", row[:to_channel]
17
+ shared << row[:to_channel]
18
+ sleep 0.2
19
+ end
20
+ end
21
+ end
22
+ end
23
+
6
24
  if typem == :on_call
7
25
  rules_file = config.rules_file
8
26
  elsif dest[0] == "C" or dest[0] == "G" # on a channel or private channel
9
27
  rules_file = config.rules_file
10
28
 
11
- if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel)
12
- unless @bots_created.key?(@rules_imported[user.id][dchannel])
29
+ if @rules_imported.key?(user.name) and @rules_imported[user.name].key?(dchannel)
30
+ unless @bots_created.key?(@rules_imported[user.name][dchannel])
13
31
  get_bots_created()
14
32
  end
15
- if @bots_created.key?(@rules_imported[user.id][dchannel])
16
- rules_file = @bots_created[@rules_imported[user.id][dchannel]][:rules_file]
33
+ if @bots_created.key?(@rules_imported[user.name][dchannel])
34
+ rules_file = @bots_created[@rules_imported[user.name][dchannel]][:rules_file]
17
35
  end
18
36
  end
19
- elsif dest[0] == "D" and @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id) #direct message
20
- unless @bots_created.key?(@rules_imported[user.id][user.id])
37
+ elsif dest[0] == "D" and @rules_imported.key?(user.name) and @rules_imported[user.name].key?(user.name) #direct message
38
+ unless @bots_created.key?(@rules_imported[user.name][user.name])
21
39
  get_bots_created()
22
40
  end
23
- if @bots_created.key?(@rules_imported[user.id][user.id])
24
- rules_file = @bots_created[@rules_imported[user.id][user.id]][:rules_file]
41
+ if @bots_created.key?(@rules_imported[user.name][user.name])
42
+ rules_file = @bots_created[@rules_imported[user.name][user.name]][:rules_file]
43
+ end
44
+ elsif dest[0] == 'D' and (!@rules_imported.key?(user.name) or ( @rules_imported.key?(user.name) and !@rules_imported[user.name].key?(user.name)))
45
+ if File.exist?("#{config.path}/rules/general_rules.rb")
46
+ rules_file = "/rules/general_rules.rb"
25
47
  end
26
48
  end
27
-
28
49
  if nick == config[:nick] #if message is coming from the bot
29
50
  begin
30
51
  case text
@@ -160,6 +181,9 @@ class SlackSmartBot
160
181
  begin
161
182
  t = Thread.new do
162
183
  begin
184
+ processed = false
185
+ processed_rules = false
186
+
163
187
  Thread.current[:dest] = dest
164
188
  Thread.current[:user] = user
165
189
  Thread.current[:command] = command
@@ -169,30 +193,37 @@ class SlackSmartBot
169
193
  Thread.current[:ts] = ts
170
194
  Thread.current[:thread_ts] = thread_ts
171
195
  Thread.current[:routine] = routine
196
+ Thread.current[:routine_name] = routine_name
197
+ Thread.current[:routine_type] = routine_type
198
+ Thread.current[:dchannel] = dchannel
199
+ Thread.current[:command_orig] = command_orig
172
200
  if thread_ts.to_s == ''
173
201
  Thread.current[:on_thread] = false
174
202
  Thread.current[:thread_ts] = Thread.current[:ts] # to create the thread if necessary
175
203
  else
176
204
  Thread.current[:on_thread] = true
177
205
  end
178
- if (dest[0] == "C") || (dest[0] == "G") and @rules_imported.key?(user.id) &&
179
- @rules_imported[user.id].key?(dchannel) && @bots_created.key?(@rules_imported[user.id][dchannel])
180
- Thread.current[:using_channel] = @rules_imported[user.id][dchannel]
181
- elsif dest[0] == "D" && @rules_imported.key?(user.id) && @rules_imported[user.id].key?(user.id) and
182
- @bots_created.key?(@rules_imported[user.id][user.id])
183
- Thread.current[:using_channel] = @rules_imported[user.id][user.id]
206
+ if (dest[0] == "C") || (dest[0] == "G") and @rules_imported.key?(user.name) &&
207
+ @rules_imported[user.name].key?(dchannel) && @bots_created.key?(@rules_imported[user.name][dchannel])
208
+ Thread.current[:using_channel] = @rules_imported[user.name][dchannel]
209
+ elsif dest[0] == "D" && @rules_imported.key?(user.name) && @rules_imported[user.name].key?(user.name) and
210
+ @bots_created.key?(@rules_imported[user.name][user.name])
211
+ Thread.current[:using_channel] = @rules_imported[user.name][user.name]
184
212
  else
185
213
  Thread.current[:using_channel] = ''
186
214
  end
187
-
188
- processed = process(user, command, dest, dchannel, rules_file, typem, files, Thread.current[:thread_ts])
215
+ if typem == :on_pub or typem == :on_pg
216
+ processed = false
217
+ else
218
+ processed = process(user, command, dest, dchannel, rules_file, typem, files, Thread.current[:thread_ts])
219
+ end
189
220
  @logger.info "command: #{nick}> #{command}" if processed
190
221
  on_demand = false
191
- if command.match(/^@?(#{config[:nick]}):*\s+(.+)/im) or
192
- command.match(/^()!!(.+)/im) or
193
- command.match(/^()\^(.+)/im) or
194
- command.match(/^()!(.+)/im) or
195
- command.match(/^()<@#{config[:nick_id]}>\s+(.+)/im)
222
+ if command.match(/\A@?(#{config[:nick]}):*\s+(.+)/im) or
223
+ command.match(/\A()!!(.+)/im) or
224
+ command.match(/\A()\^(.+)/im) or
225
+ command.match(/\A()!(.+)/im) or
226
+ command.match(/\A()<@#{config[:nick_id]}>\s+(.+)/im)
196
227
  command2 = $2
197
228
  Thread.current[:command] = command2
198
229
  if command2.match?(/^()!!(.+)/im) or
@@ -202,7 +233,25 @@ class SlackSmartBot
202
233
  command = command2
203
234
  on_demand = true
204
235
  end
205
- unless config.on_maintenance and processed
236
+ unless config.on_maintenance or @status != :on
237
+ if typem == :on_pub or typem == :on_pg or typem == :on_extended
238
+ if command.match(/\A\s*(#{@salutations.join("|")})\s+(rules|help)\s*(.+)?$/i) or command.match(/\A(#{@salutations.join("|")}),? what can I do/i)
239
+ $2.to_s.match?(/rules/i) ? specific = true : specific = false
240
+ help_command = $3
241
+ if typem == :on_extended and specific
242
+ bot_rules(dest, help_command, typem, rules_file, user)
243
+ else
244
+ bot_help(user, user.name, dest, dchannel, specific, help_command, rules_file)
245
+ end
246
+ processed = true
247
+ end
248
+ end
249
+ processed = (processed || general_bot_commands(user, command, dest, files) )
250
+ processed = (processed || general_commands(user, command, dest, files) ) if defined?(general_commands)
251
+ @logger.info "command: #{nick}> #{command}" if processed
252
+ end
253
+
254
+ if !config.on_maintenance and !processed and typem != :on_pub and typem != :on_pg
206
255
  if @status == :on and
207
256
  (!answer.empty? or
208
257
  (@repl_sessions.key?(nick) and dest==@repl_sessions[nick][:dest] and
@@ -216,9 +265,9 @@ class SlackSmartBot
216
265
  #todo: verify this
217
266
 
218
267
  if dest[0] == "C" or dest[0] == "G" or (dest[0] == "D" and typem == :on_call)
219
- if typem != :on_call and @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel)
220
- if @bots_created.key?(@rules_imported[user.id][dchannel])
221
- if @bots_created[@rules_imported[user.id][dchannel]][:status] != :on
268
+ if typem != :on_call and @rules_imported.key?(user.name) and @rules_imported[user.name].key?(dchannel)
269
+ if @bots_created.key?(@rules_imported[user.name][dchannel])
270
+ if @bots_created[@rules_imported[user.name][dchannel]][:status] != :on
222
271
  respond "The bot on that channel is not :on", dest
223
272
  rules_file = ""
224
273
  end
@@ -235,19 +284,19 @@ class SlackSmartBot
235
284
  command[0] = "" if command[0] == "!"
236
285
  command.gsub!(/^@\w+:*\s*/, "")
237
286
  if method(:rules).parameters.size == 4
238
- rules(user, command, processed, dest)
287
+ processed_rules = rules(user, command, processed, dest)
239
288
  elsif method(:rules).parameters.size == 5
240
- rules(user, command, processed, dest, files)
289
+ processed_rules = rules(user, command, processed, dest, files)
241
290
  else
242
- rules(user, command, processed, dest, files, rules_file)
291
+ processed_rules = rules(user, command, processed, dest, files, rules_file)
243
292
  end
244
293
  else
245
294
  @logger.warn "It seems like rules method is not defined"
246
295
  end
247
296
  end
248
- elsif @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id)
249
- if @bots_created.key?(@rules_imported[user.id][user.id])
250
- if @bots_created[@rules_imported[user.id][user.id]][:status] == :on
297
+ elsif @rules_imported.key?(user.name) and @rules_imported[user.name].key?(user.name)
298
+ if @bots_created.key?(@rules_imported[user.name][user.name])
299
+ if @bots_created[@rules_imported[user.name][user.name]][:status] == :on
251
300
  begin
252
301
  eval(File.new(config.path+rules_file).read) if File.exist?(config.path+rules_file) and !['.','..'].include?(config.path + rules_file)
253
302
  rescue Exception => stack
@@ -255,7 +304,7 @@ class SlackSmartBot
255
304
  @logger.fatal stack
256
305
  end
257
306
  else
258
- respond "The bot on <##{@rules_imported[user.id][user.id]}|#{@bots_created[@rules_imported[user.id][user.id]][:channel_name]}> is not :on", dest
307
+ respond "The bot on <##{@rules_imported[user.name][user.name]}|#{@bots_created[@rules_imported[user.name][user.name]][:channel_name]}> is not :on", dest
259
308
  rules_file = ""
260
309
  end
261
310
  end
@@ -265,16 +314,43 @@ class SlackSmartBot
265
314
  command[0] = "" if command[0] == "!"
266
315
  command.gsub!(/^@\w+:*\s*/, "")
267
316
  if method(:rules).parameters.size == 4
268
- rules(user, command, processed, dest)
317
+ processed_rules = rules(user, command, processed, dest)
269
318
  elsif method(:rules).parameters.size == 5
270
- rules(user, command, processed, dest, files)
319
+ processed_rules = rules(user, command, processed, dest, files)
271
320
  else
272
- rules(user, command, processed, dest, files, rules_file)
321
+ processed_rules = rules(user, command, processed, dest, files, rules_file)
273
322
  end
274
323
  else
275
324
  @logger.warn "It seems like rules method is not defined"
276
325
  end
277
326
  end
327
+ elsif dest[0] == 'D' and
328
+ (!@rules_imported.key?(user.name) or ( @rules_imported.key?(user.name) and !@rules_imported[user.name].key?(user.name))) and
329
+ rules_file.include?('general_rules.rb')
330
+ begin
331
+ eval(File.new(config.path+rules_file).read) if File.exist?(config.path+rules_file) and !['.','..'].include?(config.path + rules_file)
332
+ rescue Exception => stack
333
+ @logger.fatal "ERROR ON imported RULES FILE: #{rules_file}"
334
+ @logger.fatal stack
335
+ end
336
+
337
+ if defined?(general_rules)
338
+ command[0] = "" if command[0] == "!"
339
+ command.gsub!(/^@\w+:*\s*/, "")
340
+ #todo: check to change processed > processed_rules
341
+ if method(:general_rules).parameters.size == 4
342
+ processed = general_rules(user, command, processed, dest)
343
+ elsif method(:general_rules).parameters.size == 5
344
+ processed = general_rules(user, command, processed, dest, files)
345
+ else
346
+ processed = general_rules(user, command, processed, dest, files, rules_file)
347
+ end
348
+ else
349
+ @logger.warn "It seems like general_rules method is not defined"
350
+ end
351
+ unless processed
352
+ dont_understand('')
353
+ end
278
354
  else
279
355
  @logger.info "it is a direct message with no rules file selected so no rules file executed."
280
356
  if command.match?(/^\s*bot\s+rules\s*(.*)$/i)
@@ -285,6 +361,8 @@ class SlackSmartBot
285
361
  end
286
362
  end
287
363
 
364
+ processed = (processed_rules || processed)
365
+
288
366
  if processed and @listening.key?(nick)
289
367
  if Thread.current[:on_thread] and @listening[nick].key?(Thread.current[:thread_ts])
290
368
  @listening[nick][Thread.current[:thread_ts]] = Time.now
@@ -292,9 +370,12 @@ class SlackSmartBot
292
370
  @listening[nick][dest] = Time.now
293
371
  end
294
372
  end
295
-
296
373
  end
297
374
  end
375
+
376
+ if processed and config.general_message != '' and !routine
377
+ respond eval("\"" + config.general_message + "\"")
378
+ end
298
379
  rescue Exception => stack
299
380
  @logger.fatal stack
300
381
  end