slack-smart-bot 1.9.1 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
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