slack-smart-bot 1.8.2 → 1.9.1
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.
- checksums.yaml +4 -4
- data/README.md +18 -11
- data/lib/slack-smart-bot.rb +43 -44
- data/lib/slack-smart-bot_rules.rb +6 -6
- data/lib/slack/smart-bot/comm.rb +5 -1
- data/lib/slack/smart-bot/comm/ask.rb +12 -5
- data/lib/slack/smart-bot/comm/dont_understand.rb +1 -1
- data/lib/slack/smart-bot/comm/event_hello.rb +30 -0
- data/lib/slack/smart-bot/comm/get_channel_members.rb +8 -0
- data/lib/slack/smart-bot/comm/get_channels.rb +20 -0
- data/lib/slack/smart-bot/comm/get_user_info.rb +16 -0
- data/lib/slack/smart-bot/comm/react.rb +21 -8
- data/lib/slack/smart-bot/comm/respond.rb +10 -5
- data/lib/slack/smart-bot/comm/send_msg_channel.rb +2 -2
- data/lib/slack/smart-bot/comm/send_msg_user.rb +4 -4
- data/lib/slack/smart-bot/comm/unreact.rb +21 -8
- data/lib/slack/smart-bot/commands.rb +3 -1
- data/lib/slack/smart-bot/commands/general/bot_help.rb +16 -3
- data/lib/slack/smart-bot/commands/general/bot_stats.rb +313 -0
- data/lib/slack/smart-bot/commands/general/bot_status.rb +1 -1
- data/lib/slack/smart-bot/commands/general/bye_bot.rb +1 -1
- data/lib/slack/smart-bot/commands/general/hi_bot.rb +1 -1
- data/lib/slack/smart-bot/commands/general/use_rules.rb +2 -6
- data/lib/slack/smart-bot/commands/general/whats_new.rb +19 -0
- data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +65 -33
- data/lib/slack/smart-bot/commands/on_bot/admin/extend_rules.rb +3 -7
- data/lib/slack/smart-bot/commands/on_bot/admin/pause_bot.rb +1 -0
- data/lib/slack/smart-bot/commands/on_bot/admin/see_routines.rb +8 -2
- data/lib/slack/smart-bot/commands/on_bot/admin/start_bot.rb +1 -0
- data/lib/slack/smart-bot/commands/on_bot/delete_repl.rb +1 -1
- data/lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb +52 -21
- data/lib/slack/smart-bot/commands/on_bot/get_repl.rb +5 -5
- data/lib/slack/smart-bot/commands/on_bot/repl.rb +50 -18
- data/lib/slack/smart-bot/commands/on_bot/ruby_code.rb +34 -9
- data/lib/slack/smart-bot/commands/on_bot/run_repl.rb +2 -3
- data/lib/slack/smart-bot/commands/on_bot/see_repls.rb +1 -1
- data/lib/slack/smart-bot/commands/on_bot/see_shortcuts.rb +27 -9
- data/lib/slack/smart-bot/commands/on_extended/bot_rules.rb +14 -1
- data/lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb +3 -3
- data/lib/slack/smart-bot/commands/on_master/admin_master/notify_message.rb +1 -1
- data/lib/slack/smart-bot/commands/on_master/admin_master/set_maintenance.rb +41 -0
- data/lib/slack/smart-bot/commands/on_master/create_bot.rb +4 -8
- data/lib/slack/smart-bot/listen.rb +6 -5
- data/lib/slack/smart-bot/process.rb +227 -188
- data/lib/slack/smart-bot/process_first.rb +104 -87
- data/lib/slack/smart-bot/treat_message.rb +98 -38
- data/lib/slack/smart-bot/utils.rb +2 -0
- data/lib/slack/smart-bot/utils/answer.rb +18 -0
- data/lib/slack/smart-bot/utils/answer_delete.rb +15 -0
- data/lib/slack/smart-bot/utils/build_help.rb +57 -5
- data/lib/slack/smart-bot/utils/create_routine_thread.rb +11 -2
- data/lib/slack/smart-bot/utils/get_channels_name_and_id.rb +1 -7
- data/lib/slack/smart-bot/utils/get_help.rb +79 -17
- data/lib/slack/smart-bot/utils/save_stats.rb +21 -8
- data/lib/slack/smart-bot/utils/update_shortcuts_file.rb +6 -0
- data/whats_new.txt +18 -0
- metadata +21 -12
- data/lib/slack/smart-bot/commands/on_bot/admin_master/bot_stats.rb +0 -195
@@ -1,5 +1,5 @@
|
|
1
1
|
class SlackSmartBot
|
2
|
-
def process_first(user, text, dest, dchannel, typem, files, ts, thread_ts)
|
2
|
+
def process_first(user, text, dest, dchannel, typem, files, ts, thread_ts, routine)
|
3
3
|
nick = user.name
|
4
4
|
rules_file = ""
|
5
5
|
text.gsub!(/^!!/,'^') # to treat it just as ^
|
@@ -80,21 +80,21 @@ class SlackSmartBot
|
|
80
80
|
text.match(/^()\^\s*(.+)\s*/im) or
|
81
81
|
text.match(/^()!\s*(.+)\s*/im) or
|
82
82
|
text.match(/^()<@#{config[:nick_id]}>\s+(.+)\s*/im)
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
83
|
+
command2 = $2
|
84
|
+
if text.match?(/^()\^\s*(.+)/im)
|
85
|
+
add_double_excl = true
|
86
|
+
addexcl = false
|
87
|
+
if command2.match?(/^![^!]/) or command2.match?(/^\^/)
|
88
88
|
command2[0]=''
|
89
|
-
|
89
|
+
elsif command2.match?(/^!!/)
|
90
90
|
command2[0]=''
|
91
91
|
command2[1]=''
|
92
|
-
|
93
|
-
|
92
|
+
end
|
93
|
+
else
|
94
94
|
add_double_excl = false
|
95
95
|
addexcl = true
|
96
|
-
|
97
|
-
|
96
|
+
end
|
97
|
+
command = command2
|
98
98
|
else
|
99
99
|
addexcl = false
|
100
100
|
if text.include?('$') #for shortcuts inside commands
|
@@ -111,6 +111,10 @@ class SlackSmartBot
|
|
111
111
|
command.gsub!("$#{sc}", @shortcuts[nick][sc])
|
112
112
|
elsif @shortcuts.key?(:all) and @shortcuts[:all].keys.include?(sc)
|
113
113
|
command.gsub!("$#{sc}", @shortcuts[:all][sc])
|
114
|
+
elsif @shortcuts_global.key?(nick) and @shortcuts_global[nick].keys.include?(sc)
|
115
|
+
command.gsub!("$#{sc}", @shortcuts_global[nick][sc])
|
116
|
+
elsif @shortcuts_global.key?(:all) and @shortcuts_global[:all].keys.include?(sc)
|
117
|
+
command.gsub!("$#{sc}", @shortcuts_global[:all][sc])
|
114
118
|
end
|
115
119
|
end
|
116
120
|
command.scan(/\$([^\s]+)/i).flatten.each do |sc|
|
@@ -119,6 +123,10 @@ class SlackSmartBot
|
|
119
123
|
command.gsub!("$#{sc}", @shortcuts[nick][sc])
|
120
124
|
elsif @shortcuts.key?(:all) and @shortcuts[:all].keys.include?(sc)
|
121
125
|
command.gsub!("$#{sc}", @shortcuts[:all][sc])
|
126
|
+
elsif @shortcuts_global.key?(nick) and @shortcuts_global[nick].keys.include?(sc)
|
127
|
+
command.gsub!("$#{sc}", @shortcuts_global[nick][sc])
|
128
|
+
elsif @shortcuts_global.key?(:all) and @shortcuts_global[:all].keys.include?(sc)
|
129
|
+
command.gsub!("$#{sc}", @shortcuts_global[:all][sc])
|
122
130
|
end
|
123
131
|
end
|
124
132
|
text = command
|
@@ -126,13 +134,19 @@ class SlackSmartBot
|
|
126
134
|
text = "^" + text if add_double_excl
|
127
135
|
end
|
128
136
|
if command.scan(/^(shortcut|sc)\s+([^:]+)\s*$/i).any? or
|
129
|
-
|
130
|
-
|
137
|
+
(@shortcuts.keys.include?(:all) and @shortcuts[:all].keys.include?(command)) or
|
138
|
+
(@shortcuts.keys.include?(nick) and @shortcuts[nick].keys.include?(command)) or
|
139
|
+
(@shortcuts_global.keys.include?(:all) and @shortcuts_global[:all].keys.include?(command)) or
|
140
|
+
(@shortcuts_global.keys.include?(nick) and @shortcuts_global[nick].keys.include?(command))
|
131
141
|
command = $2.downcase unless $2.nil?
|
132
142
|
if @shortcuts.keys.include?(nick) and @shortcuts[nick].keys.include?(command)
|
133
143
|
text = @shortcuts[nick][command].dup
|
134
144
|
elsif @shortcuts.keys.include?(:all) and @shortcuts[:all].keys.include?(command)
|
135
145
|
text = @shortcuts[:all][command].dup
|
146
|
+
elsif @shortcuts_global.keys.include?(nick) and @shortcuts_global[nick].keys.include?(command)
|
147
|
+
text = @shortcuts_global[nick][command].dup
|
148
|
+
elsif @shortcuts_global.keys.include?(:all) and @shortcuts_global[:all].keys.include?(command)
|
149
|
+
text = @shortcuts_global[:all][command].dup
|
136
150
|
else
|
137
151
|
respond "Shortcut not found", dest unless dest[0] == "C" and dchannel != dest #on extended channel
|
138
152
|
return :next #jal
|
@@ -154,6 +168,7 @@ class SlackSmartBot
|
|
154
168
|
Thread.current[:files?] = !files.nil? && files.size>0
|
155
169
|
Thread.current[:ts] = ts
|
156
170
|
Thread.current[:thread_ts] = thread_ts
|
171
|
+
Thread.current[:routine] = routine
|
157
172
|
if thread_ts.to_s == ''
|
158
173
|
Thread.current[:on_thread] = false
|
159
174
|
Thread.current[:thread_ts] = Thread.current[:ts] # to create the thread if necessary
|
@@ -187,96 +202,98 @@ class SlackSmartBot
|
|
187
202
|
command = command2
|
188
203
|
on_demand = true
|
189
204
|
end
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
(
|
195
|
-
|
196
|
-
|
197
|
-
(@listening[nick].key?(
|
198
|
-
|
199
|
-
|
200
|
-
|
205
|
+
unless config.on_maintenance and processed
|
206
|
+
if @status == :on and
|
207
|
+
(!answer.empty? or
|
208
|
+
(@repl_sessions.key?(nick) and dest==@repl_sessions[nick][:dest] and
|
209
|
+
((@repl_sessions[nick][:on_thread] and thread_ts == @repl_sessions[nick][:thread_ts]) or
|
210
|
+
(!@repl_sessions[nick][:on_thread] and !Thread.current[:on_thread] ))) or
|
211
|
+
(@listening.key?(nick) and typem != :on_extended and
|
212
|
+
((@listening[nick].key?(dest) and !Thread.current[:on_thread]) or
|
213
|
+
(@listening[nick].key?(thread_ts) and Thread.current[:on_thread] ) )) or
|
214
|
+
dest[0] == "D" or on_demand)
|
215
|
+
@logger.info "command: #{nick}> #{command}" unless processed
|
216
|
+
#todo: verify this
|
201
217
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
218
|
+
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
|
222
|
+
respond "The bot on that channel is not :on", dest
|
223
|
+
rules_file = ""
|
224
|
+
end
|
208
225
|
end
|
209
226
|
end
|
210
|
-
|
211
|
-
unless rules_file.empty?
|
212
|
-
begin
|
213
|
-
eval(File.new(config.path+rules_file).read) if File.exist?(config.path+rules_file)
|
214
|
-
rescue Exception => stack
|
215
|
-
@logger.fatal "ERROR ON RULES FILE: #{rules_file}"
|
216
|
-
@logger.fatal stack
|
217
|
-
end
|
218
|
-
if defined?(rules)
|
219
|
-
command[0] = "" if command[0] == "!"
|
220
|
-
command.gsub!(/^@\w+:*\s*/, "")
|
221
|
-
if method(:rules).parameters.size == 4
|
222
|
-
rules(user, command, processed, dest)
|
223
|
-
elsif method(:rules).parameters.size == 5
|
224
|
-
rules(user, command, processed, dest, files)
|
225
|
-
else
|
226
|
-
rules(user, command, processed, dest, files, rules_file)
|
227
|
-
end
|
228
|
-
else
|
229
|
-
@logger.warn "It seems like rules method is not defined"
|
230
|
-
end
|
231
|
-
end
|
232
|
-
elsif @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id)
|
233
|
-
if @bots_created.key?(@rules_imported[user.id][user.id])
|
234
|
-
if @bots_created[@rules_imported[user.id][user.id]][:status] == :on
|
227
|
+
unless rules_file.empty?
|
235
228
|
begin
|
236
|
-
eval(File.new(config.path+rules_file).read) if File.exist?(config.path+rules_file)
|
229
|
+
eval(File.new(config.path+rules_file).read) if File.exist?(config.path+rules_file)
|
237
230
|
rescue Exception => stack
|
238
|
-
@logger.fatal "ERROR ON
|
231
|
+
@logger.fatal "ERROR ON RULES FILE: #{rules_file}"
|
239
232
|
@logger.fatal stack
|
240
233
|
end
|
241
|
-
|
242
|
-
|
243
|
-
|
234
|
+
if defined?(rules)
|
235
|
+
command[0] = "" if command[0] == "!"
|
236
|
+
command.gsub!(/^@\w+:*\s*/, "")
|
237
|
+
if method(:rules).parameters.size == 4
|
238
|
+
rules(user, command, processed, dest)
|
239
|
+
elsif method(:rules).parameters.size == 5
|
240
|
+
rules(user, command, processed, dest, files)
|
241
|
+
else
|
242
|
+
rules(user, command, processed, dest, files, rules_file)
|
243
|
+
end
|
244
|
+
else
|
245
|
+
@logger.warn "It seems like rules method is not defined"
|
246
|
+
end
|
247
|
+
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
|
251
|
+
begin
|
252
|
+
eval(File.new(config.path+rules_file).read) if File.exist?(config.path+rules_file) and !['.','..'].include?(config.path + rules_file)
|
253
|
+
rescue Exception => stack
|
254
|
+
@logger.fatal "ERROR ON imported RULES FILE: #{rules_file}"
|
255
|
+
@logger.fatal stack
|
256
|
+
end
|
257
|
+
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
|
259
|
+
rules_file = ""
|
260
|
+
end
|
244
261
|
end
|
245
|
-
end
|
246
262
|
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
263
|
+
unless rules_file.empty?
|
264
|
+
if defined?(rules)
|
265
|
+
command[0] = "" if command[0] == "!"
|
266
|
+
command.gsub!(/^@\w+:*\s*/, "")
|
267
|
+
if method(:rules).parameters.size == 4
|
268
|
+
rules(user, command, processed, dest)
|
269
|
+
elsif method(:rules).parameters.size == 5
|
270
|
+
rules(user, command, processed, dest, files)
|
271
|
+
else
|
272
|
+
rules(user, command, processed, dest, files, rules_file)
|
273
|
+
end
|
255
274
|
else
|
256
|
-
rules
|
275
|
+
@logger.warn "It seems like rules method is not defined"
|
257
276
|
end
|
258
|
-
|
259
|
-
|
277
|
+
end
|
278
|
+
else
|
279
|
+
@logger.info "it is a direct message with no rules file selected so no rules file executed."
|
280
|
+
if command.match?(/^\s*bot\s+rules\s*(.*)$/i)
|
281
|
+
respond "No rules running. You can use the command `use rules from CHANNEL` to specify the rules you want to use on this private conversation.\n`bot help` to see available commands.", dest
|
282
|
+
end
|
283
|
+
unless processed
|
284
|
+
dont_understand('')
|
260
285
|
end
|
261
286
|
end
|
262
|
-
else
|
263
|
-
@logger.info "it is a direct message with no rules file selected so no rules file executed."
|
264
|
-
if command.match?(/^\s*bot\s+rules\s*$/i)
|
265
|
-
respond "No rules running. You can use the command `use rules from CHANNEL` to specify the rules you want to use on this private conversation.\n`bot help` to see available commands.", dest
|
266
|
-
end
|
267
|
-
unless processed
|
268
|
-
dont_understand('')
|
269
|
-
end
|
270
|
-
end
|
271
287
|
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
288
|
+
if processed and @listening.key?(nick)
|
289
|
+
if Thread.current[:on_thread] and @listening[nick].key?(Thread.current[:thread_ts])
|
290
|
+
@listening[nick][Thread.current[:thread_ts]] = Time.now
|
291
|
+
elsif !Thread.current[:on_thread] and @listening[nick].key?(dest)
|
292
|
+
@listening[nick][dest] = Time.now
|
293
|
+
end
|
277
294
|
end
|
278
|
-
end
|
279
295
|
|
296
|
+
end
|
280
297
|
end
|
281
298
|
rescue Exception => stack
|
282
299
|
@logger.fatal stack
|
@@ -4,42 +4,52 @@ class SlackSmartBot
|
|
4
4
|
begin
|
5
5
|
unless data.text.to_s.match(/\A\s*\z/)
|
6
6
|
#to remove italic, bold... from data.text since there is no method on slack api
|
7
|
-
#only works when no @user or #channel mentioned
|
8
7
|
if remove_blocks and !data.blocks.nil? and data.blocks.size > 0
|
8
|
+
data_text = ''
|
9
9
|
data.blocks.each do |b|
|
10
10
|
if b.type == 'rich_text'
|
11
11
|
if b.elements.size > 0
|
12
12
|
b.elements.each do |e|
|
13
|
-
if e.type == 'rich_text_section'
|
14
|
-
if e.elements.size > 0 and (e.elements.type.uniq - ['link', 'text']) == []
|
15
|
-
|
13
|
+
if e.type == 'rich_text_section' or e.type == 'rich_text_preformatted'
|
14
|
+
if e.elements.size > 0 and (e.elements.type.uniq - ['link', 'text', 'user', 'channel']) == []
|
15
|
+
data_text += '```' if e.type == 'rich_text_preformatted'
|
16
16
|
e.elements.each do |el|
|
17
17
|
if el.type == 'text'
|
18
|
-
|
18
|
+
data_text += el.text
|
19
|
+
elsif el.type == 'user'
|
20
|
+
data_text += "<@#{el.user_id}>"
|
21
|
+
elsif el.type == 'channel'
|
22
|
+
tch = data.text.scan(/(<##{el.channel_id}\|[^\>]+>)/).join
|
23
|
+
data_text += tch
|
19
24
|
else
|
20
|
-
|
25
|
+
data_text += el.url
|
21
26
|
end
|
22
27
|
end
|
28
|
+
data_text += '```' if e.type == 'rich_text_preformatted'
|
23
29
|
end
|
24
|
-
break
|
25
30
|
end
|
26
31
|
end
|
27
32
|
end
|
28
|
-
break
|
29
33
|
end
|
30
34
|
end
|
35
|
+
data.text = data_text unless data_text == ''
|
31
36
|
end
|
32
37
|
data.text = CGI.unescapeHTML(data.text)
|
33
38
|
data.text.gsub!("\u00A0", " ") #to change (asc char 160) into blank space
|
34
39
|
end
|
40
|
+
data.text.gsub!('‘', "'")
|
35
41
|
data.text.gsub!('’', "'")
|
36
|
-
data.text.gsub!('“', '"')
|
37
|
-
|
42
|
+
data.text.gsub!('“', '"')
|
43
|
+
data.text.gsub!('”', '"')
|
44
|
+
rescue Exception => exc
|
38
45
|
@logger.warn "Impossible to unescape or clean format for data.text:#{data.text}"
|
46
|
+
@logger.warn exc.inspect
|
39
47
|
end
|
48
|
+
data.routine = false unless data.key?(:routine)
|
49
|
+
|
40
50
|
if config[:testing] and config.on_master_bot
|
41
51
|
open("#{config.path}/buffer.log", "a") { |f|
|
42
|
-
f.puts "|#{data.channel}|#{data.user}|#{data.text}"
|
52
|
+
f.puts "|#{data.channel}|#{data.user}|#{data.user_name}|#{data.text}"
|
43
53
|
}
|
44
54
|
end
|
45
55
|
if data.key?(:dest) and data.dest.to_s!='' # for run routines and publish on different channels
|
@@ -58,14 +68,22 @@ class SlackSmartBot
|
|
58
68
|
@pings << $1
|
59
69
|
end
|
60
70
|
typem = :dont_treat
|
61
|
-
if !dest.nil? and !data.text.nil? and !data.text.to_s.match?(
|
62
|
-
if data.text.match(
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
71
|
+
if !dest.nil? and !data.text.nil? and !data.text.to_s.match?(/\A\s*\z/)
|
72
|
+
#if data.text.match(/^\s*<@#{config[:nick_id]}>\s+(on\s+)?<#(\w+)\|([^>]+)>\s*:?\s*(.*)/im)
|
73
|
+
if data.text.match(/^\s*<@#{config[:nick_id]}>\s+(on\s+)?((<#\w+\|[^>]+>\s*)+)\s*:?\s*(.*)/im)
|
74
|
+
channels_rules = $2 #multiple channels @smart-bot on #channel1 #channel2 echo AAA
|
75
|
+
data_text = $4
|
76
|
+
channel_rules_name = ''
|
77
|
+
channel_rules = ''
|
78
|
+
# to be treated only on the bots of the requested channels
|
79
|
+
channels_rules.scan(/<#(\w+)\|([^>]+)>/).each do |tcid, tcname|
|
80
|
+
if @channel_id == tcid
|
81
|
+
data.text = data_text
|
82
|
+
typem = :on_call
|
83
|
+
channel_rules = tcid
|
84
|
+
channel_rules_name = tcname
|
85
|
+
break
|
86
|
+
end
|
69
87
|
end
|
70
88
|
elsif data.channel == @master_bot_id
|
71
89
|
if config.on_master_bot #only to be treated on master bot channel
|
@@ -118,20 +136,27 @@ class SlackSmartBot
|
|
118
136
|
end
|
119
137
|
begin
|
120
138
|
#todo: when changed @questions user_id then move user_info inside the ifs to avoid calling it when not necessary
|
121
|
-
user_info =
|
139
|
+
user_info = get_user_info(data.user)
|
140
|
+
|
122
141
|
#user_info.user.id = data.user #todo: remove this line when slack issue with Wxxxx Uxxxx fixed
|
123
142
|
data.user = user_info.user.id #todo: remove this line when slack issue with Wxxxx Uxxxx fixed
|
124
|
-
if
|
143
|
+
if data.thread_ts.nil?
|
144
|
+
qdest = dest
|
145
|
+
else
|
146
|
+
qdest = data.thread_ts
|
147
|
+
end
|
148
|
+
if !answer(user_info.user.name, qdest).empty?
|
125
149
|
if data.text.match?(/^\s*(Bye|Bæ|Good\sBye|Adiós|Ciao|Bless|Bless\sBless|Adeu)\s(#{@salutations.join("|")})\s*$/i)
|
126
|
-
|
150
|
+
answer_delete(user_info.user.name, qdest)
|
127
151
|
command = data.text
|
128
152
|
else
|
129
|
-
command =
|
130
|
-
@
|
153
|
+
command = answer(user_info.user.name, qdest)
|
154
|
+
@answer[user_info.user.name][qdest] = data.text
|
155
|
+
@questions[user_info.user.name] = data.text # to be backwards compatible #todo remove it when 2.0
|
131
156
|
end
|
132
157
|
elsif @repl_sessions.key?(user_info.user.name) and data.channel==@repl_sessions[user_info.user.name][:dest] and
|
133
158
|
((@repl_sessions[user_info.user.name][:on_thread] and data.thread_ts == @repl_sessions[user_info.user.name][:thread_ts]) or
|
134
|
-
|
159
|
+
(!@repl_sessions[user_info.user.name][:on_thread] and data.thread_ts.to_s == '' ))
|
135
160
|
|
136
161
|
if data.text.match(/^\s*```(.*)```\s*$/im)
|
137
162
|
@repl_sessions[user_info.user.name][:command] = $1
|
@@ -144,16 +169,16 @@ class SlackSmartBot
|
|
144
169
|
end
|
145
170
|
|
146
171
|
#when added special characters on the message
|
147
|
-
if command.match(
|
172
|
+
if command.match(/\A\s*```(.*)```\s*\z/im)
|
148
173
|
command = $1
|
149
174
|
elsif command.size >= 2 and
|
150
|
-
|
175
|
+
((command[0] == "`" and command[-1] == "`") or (command[0] == "*" and command[-1] == "*") or (command[0] == "_" and command[-1] == "_"))
|
151
176
|
command = command[1..-2]
|
152
177
|
end
|
153
178
|
|
154
179
|
#ruby file attached
|
155
180
|
if !data.files.nil? and data.files.size == 1 and
|
156
|
-
|
181
|
+
(command.match?(/^(ruby|code)\s*$/) or (command.match?(/^\s*$/) and data.files[0].filetype == "ruby") or
|
157
182
|
(typem == :on_call and data.files[0].filetype == "ruby"))
|
158
183
|
res = Faraday.new("https://files.slack.com", headers: { "Authorization" => "Bearer #{config[:token]}" }).get(data.files[0].url_private)
|
159
184
|
command += " ruby" if command != "ruby"
|
@@ -164,13 +189,9 @@ class SlackSmartBot
|
|
164
189
|
command = "!" + command unless command[0] == "!" or command.match?(/^\s*$/) or command[0] == "^"
|
165
190
|
|
166
191
|
#todo: add pagination for case more than 1000 channels on the workspace
|
167
|
-
channels =
|
168
|
-
types: "private_channel,public_channel",
|
169
|
-
limit: "1000",
|
170
|
-
exclude_archived: "true",
|
171
|
-
).channels
|
192
|
+
channels = get_channels()
|
172
193
|
channel_found = channels.detect { |c| c.name == channel_rules_name }
|
173
|
-
members =
|
194
|
+
members = get_channel_members(@channels_id[channel_rules_name]) unless channel_found.nil?
|
174
195
|
if channel_found.nil?
|
175
196
|
@logger.fatal "Not possible to find the channel #{channel_rules_name}"
|
176
197
|
elsif channel_found.name == config.master_channel
|
@@ -178,21 +199,21 @@ class SlackSmartBot
|
|
178
199
|
elsif @status != :on
|
179
200
|
respond "The bot in that channel is not :on", data.channel
|
180
201
|
elsif data.user == channel_found.creator or members.include?(data.user)
|
181
|
-
process_first(user_info.user, command, dest, channel_rules, typem, data.files, data.ts, data.thread_ts)
|
202
|
+
process_first(user_info.user, command, dest, channel_rules, typem, data.files, data.ts, data.thread_ts, data.routine)
|
182
203
|
else
|
183
204
|
respond "You need to join the channel <##{channel_found.id}> to be able to use the rules.", data.channel
|
184
205
|
end
|
185
206
|
elsif config.on_master_bot and typem == :on_extended and
|
186
207
|
command.size > 0 and command[0] != "-"
|
187
208
|
# to run ruby only from the master bot for the case more than one extended
|
188
|
-
process_first(user_info.user, command, dest, @channel_id, typem, data.files, data.ts, data.thread_ts)
|
209
|
+
process_first(user_info.user, command, dest, @channel_id, typem, data.files, data.ts, data.thread_ts, data.routine)
|
189
210
|
elsif !config.on_master_bot and @bots_created[@channel_id].key?(:extended) and
|
190
211
|
@bots_created[@channel_id][:extended].include?(@channels_name[data.channel]) and
|
191
212
|
command.size > 0 and command[0] != "-"
|
192
|
-
process_first(user_info.user, command, dest, @channel_id, typem, data.files, data.ts, data.thread_ts)
|
213
|
+
process_first(user_info.user, command, dest, @channel_id, typem, data.files, data.ts, data.thread_ts, data.routine)
|
193
214
|
elsif (dest[0] == "D" or @channel_id == data.channel or data.user == config[:nick_id]) and
|
194
215
|
command.size > 0 and command[0] != "-"
|
195
|
-
process_first(user_info.user, command, dest, data.channel, typem, data.files, data.ts, data.thread_ts)
|
216
|
+
process_first(user_info.user, command, dest, data.channel, typem, data.files, data.ts, data.thread_ts, data.routine)
|
196
217
|
# if @botname on #channel_rules: do something
|
197
218
|
end
|
198
219
|
rescue Exception => stack
|
@@ -205,6 +226,29 @@ class SlackSmartBot
|
|
205
226
|
elsif !config.on_master_bot and !dest.nil? and data.user == config[:nick_id] and dest == @master_bot_id
|
206
227
|
# to treat on other bots the status messages populated on master bot
|
207
228
|
case data.text
|
229
|
+
when /From now on I'll be on maintenance status/i
|
230
|
+
sleep 2
|
231
|
+
if File.exist?("#{config.path}/config_tmp.status")
|
232
|
+
file_cts = IO.readlines("#{config.path}/config_tmp.status").join
|
233
|
+
unless file_cts.to_s() == ""
|
234
|
+
file_cts = eval(file_cts)
|
235
|
+
if file_cts.is_a?(Hash) and file_cts.key?(:on_maintenance)
|
236
|
+
config.on_maintenance = file_cts.on_maintenance
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
when /From now on I won't be on maintenance/i
|
241
|
+
sleep 2
|
242
|
+
if File.exist?("#{config.path}/config_tmp.status")
|
243
|
+
file_cts = IO.readlines("#{config.path}/config_tmp.status").join
|
244
|
+
unless file_cts.to_s() == ""
|
245
|
+
file_cts = eval(file_cts)
|
246
|
+
if file_cts.is_a?(Hash) and file_cts.key?(:on_maintenance)
|
247
|
+
config.on_maintenance = file_cts.on_maintenance
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
208
252
|
when /^Bot has been (closed|killed) by/i
|
209
253
|
sleep 2
|
210
254
|
get_bots_created()
|
@@ -217,6 +261,22 @@ class SlackSmartBot
|
|
217
261
|
when /removed the access to the rules of (.+) from (.+)\.$/i
|
218
262
|
sleep 2
|
219
263
|
get_bots_created()
|
264
|
+
when /global shortcut added/
|
265
|
+
sleep 2
|
266
|
+
if File.exist?("#{config.path}/shortcuts/shortcuts_global.rb")
|
267
|
+
file_sc = IO.readlines("#{config.path}/shortcuts/shortcuts_global.rb").join
|
268
|
+
unless file_sc.to_s() == ""
|
269
|
+
@shortcuts_global = eval(file_sc)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
when /global shortcut deleted/
|
273
|
+
sleep 2
|
274
|
+
if File.exist?("#{config.path}/shortcuts/shortcuts_global.rb")
|
275
|
+
file_sc = IO.readlines("#{config.path}/shortcuts/shortcuts_global.rb").join
|
276
|
+
unless file_sc.to_s() == ""
|
277
|
+
@shortcuts_global = eval(file_sc)
|
278
|
+
end
|
279
|
+
end
|
220
280
|
end
|
221
281
|
end
|
222
282
|
end
|