slack-smart-bot 1.7.0 → 1.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +24 -12
  3. data/lib/slack-smart-bot.rb +52 -43
  4. data/lib/slack-smart-bot_general_rules.rb +7 -4
  5. data/lib/slack-smart-bot_rules.rb +8 -6
  6. data/lib/slack/smart-bot/comm.rb +6 -1
  7. data/lib/slack/smart-bot/comm/ask.rb +12 -5
  8. data/lib/slack/smart-bot/comm/dont_understand.rb +1 -1
  9. data/lib/slack/smart-bot/comm/event_hello.rb +30 -0
  10. data/lib/slack/smart-bot/comm/get_channel_members.rb +8 -0
  11. data/lib/slack/smart-bot/comm/get_channels.rb +20 -0
  12. data/lib/slack/smart-bot/comm/get_user_info.rb +16 -0
  13. data/lib/slack/smart-bot/comm/react.rb +21 -8
  14. data/lib/slack/smart-bot/comm/respond.rb +11 -6
  15. data/lib/slack/smart-bot/comm/send_file.rb +1 -1
  16. data/lib/slack/smart-bot/comm/send_msg_channel.rb +2 -2
  17. data/lib/slack/smart-bot/comm/send_msg_user.rb +4 -4
  18. data/lib/slack/smart-bot/comm/unreact.rb +29 -0
  19. data/lib/slack/smart-bot/commands.rb +3 -1
  20. data/lib/slack/smart-bot/commands/general/bot_help.rb +16 -3
  21. data/lib/slack/smart-bot/commands/general/bot_stats.rb +313 -0
  22. data/lib/slack/smart-bot/commands/general/bot_status.rb +1 -1
  23. data/lib/slack/smart-bot/commands/general/bye_bot.rb +1 -1
  24. data/lib/slack/smart-bot/commands/general/hi_bot.rb +1 -1
  25. data/lib/slack/smart-bot/commands/general/use_rules.rb +2 -6
  26. data/lib/slack/smart-bot/commands/general/whats_new.rb +19 -0
  27. data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +65 -33
  28. data/lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb +33 -9
  29. data/lib/slack/smart-bot/commands/on_bot/admin/extend_rules.rb +3 -7
  30. data/lib/slack/smart-bot/commands/on_bot/admin/pause_bot.rb +1 -0
  31. data/lib/slack/smart-bot/commands/on_bot/admin/see_routines.rb +9 -2
  32. data/lib/slack/smart-bot/commands/on_bot/admin/start_bot.rb +1 -0
  33. data/lib/slack/smart-bot/commands/on_bot/delete_repl.rb +1 -1
  34. data/lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb +52 -21
  35. data/lib/slack/smart-bot/commands/on_bot/get_repl.rb +5 -5
  36. data/lib/slack/smart-bot/commands/on_bot/repl.rb +50 -18
  37. data/lib/slack/smart-bot/commands/on_bot/ruby_code.rb +34 -9
  38. data/lib/slack/smart-bot/commands/on_bot/run_repl.rb +2 -3
  39. data/lib/slack/smart-bot/commands/on_bot/see_repls.rb +1 -1
  40. data/lib/slack/smart-bot/commands/on_bot/see_shortcuts.rb +27 -9
  41. data/lib/slack/smart-bot/commands/on_extended/bot_rules.rb +14 -1
  42. data/lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb +3 -3
  43. data/lib/slack/smart-bot/commands/on_master/admin_master/notify_message.rb +1 -1
  44. data/lib/slack/smart-bot/commands/on_master/admin_master/set_maintenance.rb +41 -0
  45. data/lib/slack/smart-bot/commands/on_master/create_bot.rb +4 -8
  46. data/lib/slack/smart-bot/listen.rb +6 -5
  47. data/lib/slack/smart-bot/process.rb +227 -186
  48. data/lib/slack/smart-bot/process_first.rb +104 -87
  49. data/lib/slack/smart-bot/treat_message.rb +116 -52
  50. data/lib/slack/smart-bot/utils.rb +2 -0
  51. data/lib/slack/smart-bot/utils/answer.rb +18 -0
  52. data/lib/slack/smart-bot/utils/answer_delete.rb +15 -0
  53. data/lib/slack/smart-bot/utils/build_help.rb +57 -5
  54. data/lib/slack/smart-bot/utils/create_routine_thread.rb +48 -8
  55. data/lib/slack/smart-bot/utils/get_channels_name_and_id.rb +1 -7
  56. data/lib/slack/smart-bot/utils/get_help.rb +79 -17
  57. data/lib/slack/smart-bot/utils/save_stats.rb +21 -8
  58. data/lib/slack/smart-bot/utils/update_shortcuts_file.rb +6 -0
  59. data/whats_new.txt +18 -0
  60. metadata +22 -12
  61. data/lib/slack/smart-bot/commands/on_bot/admin_master/bot_stats.rb +0 -135
@@ -24,13 +24,9 @@ class SlackSmartBot
24
24
  channel_id = @channels_id[channel]
25
25
  end
26
26
  #todo: add pagination for case more than 1000 channels on the workspace
27
- channels = client.web_client.conversations_list(
28
- types: "private_channel,public_channel",
29
- limit: "1000",
30
- exclude_archived: "true",
31
- ).channels
27
+ channels = get_channels()
32
28
  channel_found = channels.detect { |c| c.name == channel }
33
- members = client.web_client.conversations_members(channel: @channels_id[channel]).members unless channel_found.nil?
29
+ members = get_channel_members(@channels_id[channel]) unless channel_found.nil?
34
30
 
35
31
  if channel_id.nil?
36
32
  respond "There is no channel with that name: #{channel}, please be sure is written exactly the same", dest
@@ -39,7 +35,7 @@ class SlackSmartBot
39
35
  elsif @bots_created.keys.include?(channel_id)
40
36
  respond "There is already a bot in this channel: #{channel}, kill it before", dest
41
37
  elsif config[:nick_id] != channel_found.creator and !members.include?(config[:nick_id])
42
- respond "You need to add first to the channel the smart bot user: #{config[:nick]}", dest
38
+ respond "You need to add first to the channel the smart bot user: <@#{config[:nick_id]}>", dest
43
39
  else
44
40
  if channel_id != config[:channel]
45
41
  begin
@@ -60,7 +56,7 @@ class SlackSmartBot
60
56
  FileUtils.copy_file(default_rules, config.path + rules_file) unless File.exist?(config.path + rules_file)
61
57
  FileUtils.copy_file(default_general_rules, config.path + general_rules_file) unless File.exist?(config.path + general_rules_file)
62
58
  admin_users = Array.new()
63
- creator_info = client.web_client.users_info(user: channel_found.creator)
59
+ creator_info = get_user_info(channel_found.creator)
64
60
  admin_users = [from, creator_info.user.name] + config.masters
65
61
  admin_users.uniq!
66
62
  @logger.info "ruby #{config.file_path} \"#{channel}\" \"#{admin_users.join(",")}\" \"#{rules_file}\" on"
@@ -6,7 +6,7 @@ class SlackSmartBot
6
6
  get_bots_created()
7
7
  @buffer_complete = [] unless defined?(@buffer_complete)
8
8
  b = File.read("#{config.path}/buffer_complete.log")
9
- result = b.scan(/^\|(\w+)\|(\w+)\|([^~]+)~~~/m)
9
+ result = b.scan(/^\|(\w+)\|(\w+)\|(\w+)\|([^~]+)~~~/m)
10
10
  result.delete(nil)
11
11
  new_messages = result[@buffer_complete.size..-1]
12
12
  unless new_messages.nil? or new_messages.empty?
@@ -14,7 +14,8 @@ class SlackSmartBot
14
14
  new_messages.each do |message|
15
15
  channel = message[0].strip
16
16
  user = message[1].strip
17
- command = message[2].to_s.strip
17
+ user_name = message[2].strip
18
+ command = message[3].to_s.strip
18
19
  # take in consideration that on simulation we are treating all messages even those that are not populated on real cases like when the message is not populated to the specific bot connection when message is sent with the bot
19
20
  @logger.info "treat message: #{message}" if config.testing
20
21
 
@@ -23,18 +24,18 @@ class SlackSmartBot
23
24
  command.scan(/`([^`]+)`/).flatten.each do |cmd|
24
25
  if cmd.to_s!=''
25
26
  cmd = "^#{cmd}"
26
- treat_message({channel: channel, user: user, text: cmd}, false)
27
+ treat_message({channel: channel, user: user, text: cmd, user_name: user_name}, false)
27
28
  end
28
29
  end
29
30
  elsif command.match?(/^\s*\-!/)
30
31
  command.scan(/`([^`]+)`/).flatten.each do |cmd|
31
32
  if cmd.to_s!=''
32
33
  cmd = "!#{cmd}"
33
- treat_message({channel: channel, user: user, text: cmd}, false)
34
+ treat_message({channel: channel, user: user, text: cmd, user_name: user_name}, false)
34
35
  end
35
36
  end
36
37
  else
37
- treat_message({channel: channel, user: user, text: command})
38
+ treat_message({channel: channel, user: user, text: command, user_name: user_name})
38
39
  end
39
40
  end
40
41
  end
@@ -1,11 +1,15 @@
1
1
  class SlackSmartBot
2
2
  def process(user, command, dest, dchannel, rules_file, typem, files, ts)
3
3
  from = user.name
4
-
5
- if user.profile.display_name.to_s.match?(/\A\s*\z/)
6
- user.profile.display_name = user.profile.real_name
4
+ if config.simulate
5
+ display_name = user.profile.display_name
6
+ else
7
+ if user.profile.display_name.to_s.match?(/\A\s*\z/)
8
+ user.profile.display_name = user.profile.real_name
9
+ end
10
+ display_name = user.profile.display_name
7
11
  end
8
- display_name = user.profile.display_name
12
+
9
13
  processed = true
10
14
 
11
15
  on_demand = false
@@ -23,203 +27,240 @@ class SlackSmartBot
23
27
  command = command2
24
28
  on_demand = true
25
29
  end
30
+ if (on_demand or
31
+ (@listening.key?(from) and (@listening[from].key?(dest) or @listening[from].key?(Thread.current[:thread_ts])) )) and
32
+ config.on_maintenance and !command.match?(/\A(set|turn)\s+maintenance\s+off\s*\z/)
33
+ respond config.on_maintenance_message, dest
34
+ processed = true
35
+ end
26
36
 
27
- #todo: check :on_pg in this case
28
- if typem == :on_master or typem == :on_bot or typem == :on_pg or typem == :on_dm
29
- case command
37
+ if !config.on_maintenance or (config.on_maintenance and command.match?(/\A(set|turn)\s+maintenance\s+off\s*\z/))
38
+ #todo: check :on_pg in this case
39
+ if typem == :on_master or typem == :on_bot or typem == :on_pg or typem == :on_dm
40
+
41
+ case command
30
42
 
31
- when /^\s*(Hello|Hallo|Hi|Hola|What's\sup|Hey|Hæ)\s(#{@salutations.join("|")})\s*$/i
32
- hi_bot(user, dest, dchannel, from, display_name)
33
- when /^\s*(Bye|Bæ|Good\sBye|Adiós|Ciao|Bless|Bless\sBless|Adeu)\s(#{@salutations.join("|")})\s*$/i
34
- bye_bot(dest, from, display_name)
35
- when /^\s*bot\s+(rules|help)\s*(.+)?$/i, /^bot,? what can I do/i
36
- $1.to_s.match?(/rules/i) ? specific = true : specific = false
37
- help_command = $2
43
+ when /^\s*(Hello|Hallo|Hi|Hola|What's\sup|Hey|Hæ)\s+(#{@salutations.join("|")})\s*$/i
44
+ hi_bot(user, dest, dchannel, from, display_name)
45
+ when /^\s*what's\s+new\s*$/i
46
+ whats_new(user, dest, dchannel, from, display_name)
47
+ when /^\s*(Bye|Bæ|Good\s+Bye|Adiós|Ciao|Bless|Bless\sBless|Adeu)\s+(#{@salutations.join("|")})\s*$/i
48
+ bye_bot(dest, from, display_name)
49
+ when /^\s*bot\s+(rules|help)\s*(.+)?$/i, /^bot,? what can I do/i
50
+ $1.to_s.match?(/rules/i) ? specific = true : specific = false
51
+ help_command = $2
38
52
 
39
- bot_help(user, from, dest, dchannel, specific, help_command, rules_file)
40
- when /^\s*use\s+(rules\s+)?(from\s+)?<#C\w+\|(.+)>\s*$/i, /^use\s+(rules\s+)?(from\s+)?([^\s]+\s*$)/i
41
- channel = $3
42
- use_rules(dest, channel, user, dchannel)
43
- when /^\s*stop using rules (from\s+)<#\w+\|(.+)>/i, /^stop using rules (from\s+)(.+)/i
44
- channel = $2
45
- stop_using_rules(dest, channel, user, dchannel)
46
- when /^\s*extend\s+rules\s+(to\s+)<#C\w+\|(.+)>/i, /^extend\s+rules\s+(to\s+)(.+)/i,
47
- /^\s*use\s+rules\s+(on\s+)<#C\w+\|(.+)>/i, /^use\s+rules\s+(on\s+)(.+)/i
48
- channel = $2
49
- extend_rules(dest, user, from, channel, typem)
50
- when /^\s*stop using rules (on\s+)<#\w+\|(.+)>/i, /^stop using rules (on\s+)(.+)/i
51
- channel = $2
52
- stop_using_rules_on(dest, user, from, channel, typem)
53
- when /^\s*exit\sbot\s*$/i, /^quit\sbot\s*$/i, /^close\sbot\s*$/i
54
- exit_bot(command, from, dest, display_name)
55
- when /^\s*start\s(this\s)?bot$/i
56
- start_bot(dest, from)
57
- when /^\s*pause\s(this\s)?bot$/i
58
- pause_bot(dest, from)
59
- when /^\s*bot\sstatus/i
60
- bot_status(dest, user)
61
- when /\Anotify\s+<#(C\w+)\|.+>\s+(.+)\s*\z/im, /\Anotify\s+(all)?\s*(.+)\s*\z/im
62
- where = $1
63
- message = $2
64
- notify_message(dest, from, where, message)
65
- when /^\s*create\s+(cloud\s+)?bot\s+on\s+<#C\w+\|(.+)>\s*/i, /^create\s+(cloud\s+)?bot\s+on\s+(.+)\s*/i
66
- cloud = !$1.nil?
67
- channel = $2
68
- create_bot(dest, user, cloud, channel)
69
- when /^\s*kill\sbot\son\s<#C\w+\|(.+)>\s*$/i, /^kill\sbot\son\s(.+)\s*$/i
70
- channel = $1
71
- kill_bot_on_channel(dest, from, channel)
72
- when /^\s*(add|create)\s+(silent\s+)?routine\s+(\w+)\s+(every)\s+(\d+)\s*(days|hours|minutes|seconds|mins|min|secs|sec|d|h|m|s)\s*(\s.+)?\s*$/i,
73
- /^\s*(add|create)\s+(silent\s+)?routine\s+(\w+)\s+(at)\s+(\d+:\d+:?\d+?)\s*()(\s.+)?\s*$/i
74
- silent = $2.to_s!=''
75
- name = $3.downcase
76
- type = $4
77
- number_time = $5
78
- period = $6
79
- command_to_run = $7
80
- add_routine(dest, from, user, name, type, number_time, period, command_to_run, files, silent)
81
- when /^\s*(kill|delete|remove)\s+routine\s+(\w+)\s*$/i
82
- name = $2.downcase
83
- remove_routine(dest, from, name)
84
- when /^\s*(run|execute)\s+routine\s+(\w+)\s*$/i
85
- name = $2.downcase
86
- run_routine(dest, from, name)
87
- when /^\s*pause\s+routine\s+(\w+)\s*$/i
88
- name = $1.downcase
89
- pause_routine(dest, from, name)
90
- when /^\s*start\s+routine\s+(\w+)\s*$/i
91
- name = $1.downcase
92
- start_routine(dest, from, name)
93
- when /^\s*see\s+(all\s+)?routines\s*$/i
94
- all = $1.to_s != ""
95
- see_routines(dest, from, user, all)
96
- when /^\s*get\s+bot\s+logs?\s*$/i
97
- get_bot_logs(dest, from, typem)
98
- when /^\s*bot\s+stats\s*(.*)\s*$/i
99
- opts = $1.to_s
100
- all_opts = opts.downcase.split(' ')
101
- st_channel = opts.scan(/<#(\w+)\|.+>/).join
102
- st_from = opts.scan(/from\s+(\d\d\d\d[\/\-\.]\d\d[\/\-\.]\d\d)/).join
103
- st_from = st_from.gsub('.','-').gsub('/','-')
104
- st_to = opts.scan(/to\s+(\d\d\d\d[\/\-\.]\d\d[\/\-\.]\d\d)/).join
105
- st_to = st_to.gsub('.','-').gsub('/','-')
106
- st_user = opts.scan(/<@([^>]+)>/).join
107
- exclude_masters = opts.match?(/exclude\s+masters?/i)
108
- monthly = false
109
- if all_opts.include?('today')
110
- st_from = st_to = "#{Time.now.strftime("%Y-%m-%d")}"
111
- elsif all_opts.include?('monthly')
112
- monthly = true
53
+ bot_help(user, from, dest, dchannel, specific, help_command, rules_file)
54
+ when /^\s*use\s+(rules\s+)?(from\s+)?<#C\w+\|(.+)>\s*$/i, /^use\s+(rules\s+)?(from\s+)?([^\s]+\s*$)/i
55
+ channel = $3
56
+ use_rules(dest, channel, user, dchannel)
57
+ when /^\s*stop\s+using\s+rules\s+(from\s+)<#\w+\|(.+)>/i, /^stop\s+using\s+rules\s+(from\s+)(.+)/i
58
+ channel = $2
59
+ stop_using_rules(dest, channel, user, dchannel)
60
+ when /^\s*extend\s+rules\s+(to\s+)<#C\w+\|(.+)>/i, /^extend\s+rules\s+(to\s+)(.+)/i,
61
+ /^\s*use\s+rules\s+(on\s+)<#C\w+\|(.+)>/i, /^use\s+rules\s+(on\s+)(.+)/i
62
+ channel = $2
63
+ extend_rules(dest, user, from, channel, typem)
64
+ when /^\s*stop\s+using\s+rules\s+(on\s+)<#\w+\|(.+)>/i, /^stop\s+using\s+rules\s+(on\s+)(.+)/i
65
+ channel = $2
66
+ stop_using_rules_on(dest, user, from, channel, typem)
67
+ when /^\s*exit\s+bot\s*$/i, /^quit\s+bot\s*$/i, /^close\s+bot\s*$/i
68
+ exit_bot(command, from, dest, display_name)
69
+ when /^\s*start\s+(this\s+)?bot$/i
70
+ start_bot(dest, from)
71
+ when /^\s*pause\s+(this\s+)?bot$/i
72
+ pause_bot(dest, from)
73
+ when /^\s*bot\s+status/i
74
+ bot_status(dest, user)
75
+ when /\Anotify\s+<#(C\w+)\|.+>\s+(.+)\s*\z/im, /\Anotify\s+(all)?\s*(.+)\s*\z/im
76
+ where = $1
77
+ message = $2
78
+ notify_message(dest, from, where, message)
79
+ when /^\s*create\s+(cloud\s+)?bot\s+on\s+<#C\w+\|(.+)>\s*/i, /^create\s+(cloud\s+)?bot\s+on\s+(.+)\s*/i
80
+ cloud = !$1.nil?
81
+ channel = $2
82
+ create_bot(dest, user, cloud, channel)
83
+ when /^\s*kill\s+bot\s+on\s+<#C\w+\|(.+)>\s*$/i, /^kill\s+bot\s+on\s+(.+)\s*$/i
84
+ channel = $1
85
+ kill_bot_on_channel(dest, from, channel)
86
+ when /^\s*(add|create)\s+(silent\s+)?routine\s+(\w+)\s+(every)\s+(\d+)\s*(days|hours|minutes|seconds|mins|min|secs|sec|d|h|m|s)\s*(\s<#(C\w+)\|.+>\s*)?(\s.+)?\s*$/i,
87
+ /^\s*(add|create)\s+(silent\s+)?routine\s+(\w+)\s+on\s+(monday|tuesday|wednesday|thursday|friday|saturday|sunday)s?\s+at\s+(\d+:\d+:?\d+?)\s*()(\s<#(C\w+)\|.+>\s*)?(\s.+)?\s*$/i,
88
+ /^\s*(add|create)\s+(silent\s+)?routine\s+(\w+)\s+(at)\s+(\d+:\d+:?\d+?)\s*()(\s<#(C\w+)\|.+>\s*)?(\s.+)?\s*$/i
89
+ silent = $2.to_s!=''
90
+ name = $3.downcase
91
+ type = $4
92
+ number_time = $5
93
+ period = $6
94
+ channel = $8
95
+ command_to_run = $9
96
+ add_routine(dest, from, user, name, type, number_time, period, command_to_run, files, silent, channel)
97
+ when /^\s*(kill|delete|remove)\s+routine\s+(\w+)\s*$/i
98
+ name = $2.downcase
99
+ remove_routine(dest, from, name)
100
+ when /^\s*(run|execute)\s+routine\s+(\w+)\s*$/i
101
+ name = $2.downcase
102
+ run_routine(dest, from, name)
103
+ when /^\s*pause\s+routine\s+(\w+)\s*$/i
104
+ name = $1.downcase
105
+ pause_routine(dest, from, name)
106
+ when /^\s*start\s+routine\s+(\w+)\s*$/i
107
+ name = $1.downcase
108
+ start_routine(dest, from, name)
109
+ when /^\s*see\s+(all\s+)?routines\s*$/i
110
+ all = $1.to_s != ""
111
+ see_routines(dest, from, user, all)
112
+ when /^\s*get\s+bot\s+logs?\s*$/i
113
+ get_bot_logs(dest, from, typem)
114
+ when /^\s*bot\s+stats\s*(.*)\s*$/i
115
+ opts = $1.to_s
116
+ all_opts = opts.downcase.split(' ')
117
+ all_data = all_opts.include?('alldata')
118
+ st_channel = opts.scan(/<#(\w+)\|.+>/).join
119
+ st_from = opts.scan(/from\s+(\d\d\d\d[\/\-\.]\d\d[\/\-\.]\d\d)/).join
120
+ st_from = st_from.gsub('.','-').gsub('/','-')
121
+ st_to = opts.scan(/to\s+(\d\d\d\d[\/\-\.]\d\d[\/\-\.]\d\d)/).join
122
+ st_to = st_to.gsub('.','-').gsub('/','-')
123
+ st_user = opts.scan(/<@([^>]+)>/).join
124
+ st_command = opts.scan(/\s+command\s+(\w+)/i).join.downcase
125
+ st_command = opts.scan(/^command\s+(\w+)/i).join.downcase if st_command == ''
126
+ exclude_masters = all_opts.include?('exclude') && all_opts.include?('masters')
127
+ exclude_routines = all_opts.include?('exclude') && all_opts.include?('routines')
128
+ if exclude_masters
129
+ opts.gsub!(/\s+masters$/,'')
130
+ opts.gsub!(/\s+masters\s+/,'')
131
+ end
132
+ if exclude_routines
133
+ opts.gsub!(/\s+routines$/,'')
134
+ opts.gsub!(/\s+routines\s+/,'')
135
+ end
136
+ monthly = false
137
+ if all_opts.include?('today')
138
+ st_from = st_to = "#{Time.now.strftime("%Y-%m-%d")}"
139
+ elsif all_opts.include?('monthly')
140
+ monthly = true
141
+ end
142
+ exclude_command = opts.scan(/exclude\s+([^\s]+)/i).join
143
+ unless @master_admin_users_id.include?(user.id)
144
+ st_user = user.id
145
+ end
146
+ if (typem == :on_master or typem == :on_bot) and dest[0]!='D' #routine bot stats to be published on DM
147
+ st_channel = dchannel
148
+ end
149
+ bot_stats(dest, user, typem, st_channel, st_from, st_to, st_user, st_command, exclude_masters, exclude_routines, exclude_command, monthly, all_data)
150
+ when /\A(set|turn)\s+maintenance\s+(on|off)\s*()\z/im, /\A(set|turn)\s+maintenance\s+(on)\s*(.+)\s*\z/im
151
+ status = $2.downcase
152
+ message = $3.to_s
153
+ set_maintenance(from, status, message)
154
+ else
155
+ processed = false
113
156
  end
114
- exclude_command = opts.scan(/exclude\s+([^\s]+)/i).join
115
- exclude_command = '' if exclude_command == 'masters'
116
- bot_stats(dest, from, typem, st_channel, st_from, st_to, st_user, exclude_masters, exclude_command, monthly)
117
157
  else
118
158
  processed = false
119
159
  end
120
- else
121
- processed = false
122
- end
123
160
 
124
- # only when :on and (listening or on demand or direct message)
125
- if @status == :on and
126
- (@questions.key?(from) or
127
- (@repl_sessions.key?(from) and dest==@repl_sessions[from][:dest] and
128
- ((@repl_sessions[from][:on_thread] and Thread.current[:thread_ts] == @repl_sessions[from][:thread_ts]) or
129
- (!@repl_sessions[from][:on_thread] and !Thread.current[:on_thread]))) or
130
- (@listening.key?(from) and typem != :on_extended and
131
- ((@listening[from].key?(dest) and !Thread.current[:on_thread]) or
132
- (@listening[from].key?(Thread.current[:thread_ts]) and Thread.current[:on_thread] ) )) or
133
- typem == :on_dm or typem == :on_pg or on_demand)
134
- processed2 = true
161
+ # only when :on and (listening or on demand or direct message)
162
+ if @status == :on and
163
+ (!answer.empty? or
164
+ (@repl_sessions.key?(from) and dest==@repl_sessions[from][:dest] and
165
+ ((@repl_sessions[from][:on_thread] and Thread.current[:thread_ts] == @repl_sessions[from][:thread_ts]) or
166
+ (!@repl_sessions[from][:on_thread] and !Thread.current[:on_thread]))) or
167
+ (@listening.key?(from) and typem != :on_extended and
168
+ ((@listening[from].key?(dest) and !Thread.current[:on_thread]) or
169
+ (@listening[from].key?(Thread.current[:thread_ts]) and Thread.current[:on_thread] ) )) or
170
+ typem == :on_dm or typem == :on_pg or on_demand)
171
+ processed2 = true
172
+
173
+ case command
135
174
 
136
- case command
175
+ # bot rules for extended channels
176
+ when /^bot\s+rules\s*(.+)?$/i
177
+ help_command = $1
178
+ bot_rules(dest, help_command, typem, rules_file, user)
179
+ when /^\s*(add\s+)?(global\s+|generic\s+)?shortcut\s+(for\sall)?\s*([^:]+)\s*:\s*(.+)/i,
180
+ /^(add\s+)(global\s+|generic\s+)?sc\s+(for\sall)?\s*([^:]+)\s*:\s*(.+)/i
181
+ for_all = $3
182
+ shortcut_name = $4.to_s.downcase
183
+ command_to_run = $5
184
+ global = $2.to_s != ''
185
+ add_shortcut(dest, user, typem, for_all, shortcut_name, command, command_to_run, global)
186
+ when /^\s*(delete|remove)\s+(global\s+|generic\s+)?shortcut\s+(.+)/i,
187
+ /^(delete|remove)\s+(global\s+|generic\s+)?sc\s+(.+)/i
188
+ shortcut = $3.to_s.downcase
189
+ global = $2.to_s != ''
137
190
 
138
- # bot rules for extended channels
139
- when /^bot\s+rules\s*(.+)?$/i
140
- help_command = $1
141
- bot_rules(dest, help_command, typem, rules_file, user)
142
- when /^\s*(add\s)?shortcut\s(for\sall)?\s*([^:]+)\s*:\s*(.+)/i, /^(add\s)sc\s(for\sall)?\s*([^:]+)\s*:\s*(.+)/i
143
- for_all = $2
144
- shortcut_name = $3.to_s.downcase
145
- command_to_run = $4
146
- add_shortcut(dest, user, typem, for_all, shortcut_name, command, command_to_run)
147
- when /^\s*(delete|remove)\s+shortcut\s+(.+)/i, /^(delete|remove)\s+sc\s+(.+)/i
148
- shortcut = $2.to_s.downcase
149
- delete_shortcut(dest, user, shortcut, typem, command)
150
- when /^\s*see\sshortcuts/i, /^see\ssc/i
151
- see_shortcuts(dest, user, typem)
191
+ delete_shortcut(dest, user, shortcut, typem, command, global)
192
+ when /^\s*see\s+shortcuts/i, /^see\ssc/i
193
+ see_shortcuts(dest, user, typem)
152
194
 
153
- #kept to be backwards compatible
154
- when /^\s*id\schannel\s<#C\w+\|(.+)>\s*/i, /^id channel (.+)/
155
- unless typem == :on_extended
156
- channel_name = $1
157
- get_channels_name_and_id()
158
- if @channels_id.keys.include?(channel_name)
159
- respond "the id of #{channel_name} is #{@channels_id[channel_name]}", dest
160
- else
161
- respond "channel: #{channel_name} not found", dest
195
+ #kept to be backwards compatible
196
+ when /^\s*id\schannel\s<#C\w+\|(.+)>\s*/i, /^id channel (.+)/
197
+ unless typem == :on_extended
198
+ channel_name = $1
199
+ get_channels_name_and_id()
200
+ if @channels_id.keys.include?(channel_name)
201
+ respond "the id of #{channel_name} is #{@channels_id[channel_name]}", dest
202
+ else
203
+ respond "channel: #{channel_name} not found", dest
204
+ end
162
205
  end
163
- end
164
- when /^\s*ruby\s(.+)/im, /^\s*code\s(.+)/im
165
- code = $1
166
- code.gsub!("\\n", "\n")
167
- code.gsub!("\\r", "\r")
168
- @logger.info code
169
- ruby_code(dest, user, code, rules_file)
170
- when /^\s*(private\s+)?(repl|irb|live)\s*()()()$/i,
171
- /^\s*(private\s+)?(repl|irb|live)\s+([\w\-]+)()()\s*$/i,
172
- /^\s*(private\s+)?(repl|irb|live)\s+([\w\-]+)\s*:\s+"([^"]+)"()\s*$/i,
173
- /^\s*(private\s+)?(repl|irb|live)\s+([\w\-]+)\s*:\s+"([^"]+)"\s+(.+)\s*$/i,
174
- /^\s*(private\s+)?(repl|irb|live)\s+([\w\-]+)()\s+(.+)\s*$/i,
175
- /^\s*(private\s+)?(repl|irb|live)()\s+()(.+)\s*$/i
176
- if $1.to_s!=''
177
- type = :private
206
+ when /^\s*ruby\s(.+)/im, /^\s*code\s(.+)/im
207
+ code = $1
208
+ code.gsub!("\\n", "\n")
209
+ code.gsub!("\\r", "\r")
210
+ @logger.info code
211
+ ruby_code(dest, user, code, rules_file)
212
+ when /^\s*(private\s+|clean\s+|clean\s+private\s+|private\s+clean\s+)?(repl|irb|live)\s*()()()$/i,
213
+ /^\s*(private\s+|clean\s+|clean\s+private\s+|private\s+clean\s+)?(repl|irb|live)\s+([\w\-]+)()()\s*$/i,
214
+ /^\s*(private\s+|clean\s+|clean\s+private\s+|private\s+clean\s+)?(repl|irb|live)\s+([\w\-]+)\s*:\s+"([^"]+)"()\s*$/i,
215
+ /^\s*(private\s+|clean\s+|clean\s+private\s+|private\s+clean\s+)?(repl|irb|live)\s+([\w\-]+)\s*:\s+"([^"]+)"\s+(.+)\s*$/i,
216
+ /^\s*(private\s+|clean\s+|clean\s+private\s+|private\s+clean\s+)?(repl|irb|live)\s+([\w\-]+)()\s+(.+)\s*$/i,
217
+ /^\s*(private\s+|clean\s+|clean\s+private\s+|private\s+clean\s+)?(repl|irb|live)()\s+()(.+)\s*$/i
218
+ opts_type = $1.to_s.downcase.split(' ')
219
+ opts_type.include?('private') ? type = :private : type = :public
220
+ type = "#{type}_clean".to_sym if opts_type.include?('clean')
221
+
222
+ session_name = $3
223
+ description = $4
224
+ opts = " #{$5}"
225
+ env_vars = opts.scan(/\s+[\w\-]+="[^"]+"/i) + opts.scan(/\s+[\w\-]+='[^']+'/i)
226
+ opts.scan(/\s+[\w\-]+=[^'"\s]+/i).flatten.each do |ev|
227
+ env_vars << ev.gsub('=',"='") + "'"
228
+ end
229
+ env_vars.each_with_index do |ev, idx|
230
+ ev.gsub!("=","']=")
231
+ ev.lstrip!
232
+ env_vars[idx] = "ENV['#{ev}"
233
+ end
234
+ repl(dest, user, session_name, env_vars.flatten, rules_file, command, description, type)
235
+ when /^\s*get\s+(repl|irb|live)\s+([\w\-]+)\s*/i
236
+ session_name = $2
237
+ get_repl(dest, user, session_name)
238
+ when /^\s*run\s+(repl|irb|live)\s+([\w\-]+)()\s*$/i,
239
+ /^\s*run\s+(repl|irb|live)\s+([\w\-]+)\s+(.+)\s*$/i
240
+ session_name = $2
241
+ opts = " #{$3}"
242
+ env_vars = opts.scan(/\s+[\w\-]+="[^"]+"/i) + opts.scan(/\s+[\w\-]+='[^']+'/i)
243
+ opts.scan(/\s+[\w\-]+=[^'"\s]+/i).flatten.each do |ev|
244
+ env_vars << ev.gsub('=',"='") + "'"
245
+ end
246
+ env_vars.each_with_index do |ev, idx|
247
+ ev.gsub!("=","']=")
248
+ ev.lstrip!
249
+ env_vars[idx] = "ENV['#{ev}"
250
+ end
251
+ run_repl(dest, user, session_name, env_vars.flatten, rules_file)
252
+ when /^\s*(delete|remove)\s+(repl|irb|live)\s+([\w\-]+)\s*$/i
253
+ repl_name = $3
254
+ delete_repl(dest, user, repl_name)
255
+ when /^\s*see\s+(repls|repl|irb|irbs)\s*$/i
256
+ see_repls(dest, user, typem)
178
257
  else
179
- type = :public
180
- end
181
- session_name = $3
182
- description = $4
183
- opts = " #{$5}"
184
- env_vars = opts.scan(/\s+[\w\-]+="[^"]+"/i) + opts.scan(/\s+[\w\-]+='[^']+'/i)
185
- opts.scan(/\s+[\w\-]+=[^'"\s]+/i).flatten.each do |ev|
186
- env_vars << ev.gsub('=',"='") + "'"
187
- end
188
- env_vars.each_with_index do |ev, idx|
189
- ev.gsub!("=","']=")
190
- ev.lstrip!
191
- env_vars[idx] = "ENV['#{ev}"
192
- end
193
- repl(dest, user, session_name, env_vars.flatten, rules_file, command, description, type)
194
- when /^\s*get\s+(repl|irb|live)\s+([\w\-]+)\s*/i
195
- session_name = $2
196
- get_repl(dest, user, session_name)
197
- when /^\s*run\s+(repl|irb|live)\s+([\w\-]+)()\s*$/i,
198
- /^\s*run\s+(repl|irb|live)\s+([\w\-]+)\s+(.+)\s*$/i
199
- session_name = $2
200
- opts = " #{$3}"
201
- env_vars = opts.scan(/\s+[\w\-]+="[^"]+"/i) + opts.scan(/\s+[\w\-]+='[^']+'/i)
202
- opts.scan(/\s+[\w\-]+=[^'"\s]+/i).flatten.each do |ev|
203
- env_vars << ev.gsub('=',"='") + "'"
204
- end
205
- env_vars.each_with_index do |ev, idx|
206
- ev.gsub!("=","']=")
207
- ev.lstrip!
208
- env_vars[idx] = "ENV['#{ev}"
209
- end
210
- run_repl(dest, user, session_name, env_vars.flatten, rules_file)
211
- when /^\s*(delete|remove)\s+(repl|irb|live)\s+([\w\-]+)\s*$/i
212
- repl_name = $3
213
- delete_repl(dest, user, repl_name)
214
- when /^\s*see\s+(repls|repl|irb|irbs)\s*$/i
215
- see_repls(dest, user, typem)
216
- else
217
- processed2 = false
218
- end #of case
258
+ processed2 = false
259
+ end #of case
219
260
 
220
- processed = true if processed or processed2
261
+ processed = true if processed or processed2
262
+ end
221
263
  end
222
-
223
264
  return processed
224
265
  end
225
266
  end