slack-smart-bot 1.7.0 → 1.9.2
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 +24 -12
- data/lib/slack-smart-bot.rb +53 -43
- data/lib/slack-smart-bot_general_rules.rb +7 -4
- data/lib/slack-smart-bot_rules.rb +8 -6
- data/lib/slack/smart-bot/comm.rb +6 -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 +38 -12
- data/lib/slack/smart-bot/comm/send_file.rb +1 -1
- 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 +29 -0
- 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 +6 -9
- 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/add_routine.rb +42 -9
- 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 +9 -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 +230 -186
- data/lib/slack/smart-bot/process_first.rb +104 -87
- data/lib/slack/smart-bot/treat_message.rb +128 -52
- 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 +48 -8
- 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 +24 -0
- metadata +23 -13
- data/lib/slack/smart-bot/commands/on_bot/admin_master/bot_stats.rb +0 -135
@@ -3,7 +3,6 @@ class SlackSmartBot
|
|
3
3
|
# help: `get repl SESSION_NAME`
|
4
4
|
# help: `get irb SESSION_NAME`
|
5
5
|
# help: `get live SESSION_NAME`
|
6
|
-
# help:
|
7
6
|
# help: Will get the Ruby commands sent on that SESSION_NAME.
|
8
7
|
# help:
|
9
8
|
def get_repl(dest, user, session_name)
|
@@ -16,22 +15,23 @@ class SlackSmartBot
|
|
16
15
|
Dir.mkdir("#{config.path}/repl") unless Dir.exist?("#{config.path}/repl")
|
17
16
|
Dir.mkdir("#{config.path}/repl/#{@channel_id}") unless Dir.exist?("#{config.path}/repl/#{@channel_id}")
|
18
17
|
if File.exist?("#{config.path}/repl/#{@channel_id}/#{session_name}.run")
|
19
|
-
if @repls.key?(session_name) and @repls[session_name][:type] == :private and
|
18
|
+
if @repls.key?(session_name) and (@repls[session_name][:type] == :private or @repls[session_name][:type] == :private_clean) and
|
20
19
|
@repls[session_name][:creator_name]!=user.name and
|
21
20
|
!config.admins.include?(user.name)
|
22
21
|
respond "The REPL with session name: #{session_name} is private", dest
|
23
22
|
else
|
23
|
+
content = "require 'nice_http'\n"
|
24
24
|
if @repls.key?(session_name)
|
25
25
|
@repls[session_name][:accessed] = Time.now.to_s
|
26
26
|
@repls[session_name][:gets] += 1
|
27
27
|
update_repls()
|
28
28
|
end
|
29
|
-
|
30
|
-
|
31
|
-
if File.exist?("#{project_folder}/.smart-bot-repl")
|
29
|
+
if !@repls.key?(session_name) or
|
30
|
+
(File.exist?("#{project_folder}/.smart-bot-repl") and @repls[session_name][:type] != :private_clean and @repls[session_name][:type] != :public_clean)
|
32
31
|
content += File.read("#{project_folder}/.smart-bot-repl")
|
33
32
|
content += "\n"
|
34
33
|
end
|
34
|
+
|
35
35
|
content += File.read("#{config.path}/repl/#{@channel_id}/#{session_name}.run").gsub(/^(quit|exit|bye)$/i,'') #todo: remove this gsub it will never contain it
|
36
36
|
File.write("#{config.path}/repl/#{@channel_id}/#{session_name}.rb", content, mode: "w+")
|
37
37
|
send_file(dest, "REPL #{session_name} on #{config.channel}", "#{config.path}/repl/#{@channel_id}/#{session_name}.rb", " REPL #{session_name} on #{config.channel}", 'text/plain', "ruby")
|
@@ -5,15 +5,16 @@ class SlackSmartBot
|
|
5
5
|
# help: `irb`
|
6
6
|
# help: `repl SESSION_NAME`
|
7
7
|
# help: `private repl SESSION_NAME`
|
8
|
+
# help: `clean repl SESSION_NAME`
|
8
9
|
# help: `repl ENV_VAR=VALUE`
|
9
10
|
# help: `repl SESSION_NAME ENV_VAR=VALUE ENV_VAR='VALUE'`
|
10
11
|
# help: `repl SESSION_NAME: "DESCRIPTION"`
|
11
12
|
# help: `repl SESSION_NAME: "DESCRIPTION" ENV_VAR=VALUE ENV_VAR='VALUE'`
|
12
|
-
# help:
|
13
13
|
# help: Will run all we write as a ruby command and will keep the session values.
|
14
14
|
# help: SESSION_NAME only admits from a to Z, numbers, - and _
|
15
15
|
# help: If no SESSION_NAME supplied it will be treated as a temporary REPL
|
16
16
|
# help: If 'private' specified the repl will be accessible only by you and it will be displayed only to you when `see repls`
|
17
|
+
# help: If 'clean' specified the repl won't pre execute the code written on the .smart-bot-repl file
|
17
18
|
# help: To avoid a message to be treated, start the message with '-'.
|
18
19
|
# help: Send _quit_, _bye_ or _exit_ to finish the session.
|
19
20
|
# help: Send puts, print, p or pp if you want to print out something when using `run repl` later.
|
@@ -78,7 +79,13 @@ class SlackSmartBot
|
|
78
79
|
}
|
79
80
|
update_repls()
|
80
81
|
end
|
81
|
-
|
82
|
+
react :running
|
83
|
+
if Thread.current[:ts].to_s == ''
|
84
|
+
@ts_react = Thread.current[:thread_ts]
|
85
|
+
else
|
86
|
+
@ts_react = Thread.current[:ts]
|
87
|
+
end
|
88
|
+
|
82
89
|
message = "Session name: *#{session_name}*
|
83
90
|
From now on I will execute all you write as a Ruby command and I will keep the session open until you send `quit` or `bye` or `exit`.
|
84
91
|
I will respond with the result so it is not necessary you send `print`, `puts`, `p` or `pp` unless you want it as the output when calling `run repl`.
|
@@ -96,6 +103,19 @@ class SlackSmartBot
|
|
96
103
|
File.write("#{config.path}/repl/#{@channel_id}/#{@repl_sessions[from][:name]}.output", "", mode: "a+")
|
97
104
|
File.write("#{config.path}/repl/#{@channel_id}/#{@repl_sessions[from][:name]}.run", "", mode: "a+")
|
98
105
|
|
106
|
+
if type != :private_clean and type != :public_clean
|
107
|
+
pre_execute = '
|
108
|
+
if File.exist?(\"./.smart-bot-repl\")
|
109
|
+
begin
|
110
|
+
eval(File.read(\"./.smart-bot-repl\"), bindme' + serialt + ')
|
111
|
+
rescue Exception => resp_repl
|
112
|
+
end
|
113
|
+
end
|
114
|
+
'
|
115
|
+
else
|
116
|
+
pre_execute = ''
|
117
|
+
end
|
118
|
+
|
99
119
|
process_to_run = '
|
100
120
|
ruby -e "' + env_vars.join("\n") + '
|
101
121
|
require \"amazing_print\"
|
@@ -105,17 +125,12 @@ class SlackSmartBot
|
|
105
125
|
(obj.methods - Object.methods)
|
106
126
|
end
|
107
127
|
|
108
|
-
file_input_repl = File.open(\"' +
|
109
|
-
|
110
|
-
begin
|
111
|
-
eval(File.read(\"./.smart-bot-repl\"), bindme' + serialt + ')
|
112
|
-
rescue Exception => resp_repl
|
113
|
-
end
|
114
|
-
end
|
128
|
+
file_input_repl = File.open(\"' + File.expand_path(config.path) + '/repl/' + @channel_id + '/' + session_name + '.input\", \"r\")
|
129
|
+
' + pre_execute + '
|
115
130
|
while true do
|
116
131
|
sleep 0.2
|
117
132
|
code_to_run_repl = file_input_repl.read
|
118
|
-
if code_to_run_repl.to_s
|
133
|
+
if code_to_run_repl.to_s!=\"\"
|
119
134
|
add_to_run_repl = true
|
120
135
|
if code_to_run_repl.to_s.match?(/^quit$/i) or
|
121
136
|
code_to_run_repl.to_s.match?(/^exit$/i) or
|
@@ -134,16 +149,16 @@ class SlackSmartBot
|
|
134
149
|
end
|
135
150
|
if resp_repl.to_s != \"\"
|
136
151
|
if code_to_run_repl.match?(/^\s*p\s+/i)
|
137
|
-
open(\"' +
|
152
|
+
open(\"' + File.expand_path(config.path) + '/repl/' + @channel_id + '/' + session_name + '.output\", \"a+\") {|f|
|
138
153
|
f.puts \"\`\`\`\n#{resp_repl.inspect}\n\`\`\`\"
|
139
154
|
}
|
140
155
|
else
|
141
|
-
open(\"' +
|
156
|
+
open(\"' + File.expand_path(config.path) + '/repl/' + @channel_id + '/' + session_name + '.output\", \"a+\") {|f|
|
142
157
|
f.puts \"\`\`\`\n#{resp_repl.ai}\n\`\`\`\"
|
143
158
|
}
|
144
159
|
end
|
145
160
|
unless error or !add_to_run_repl
|
146
|
-
open(\"' +
|
161
|
+
open(\"' + File.expand_path(config.path) + '/repl/' + @channel_id + '/' + session_name + '.run\", \"a+\") {|f|
|
147
162
|
f.puts code_to_run_repl
|
148
163
|
}
|
149
164
|
end
|
@@ -152,7 +167,6 @@ class SlackSmartBot
|
|
152
167
|
end
|
153
168
|
end"
|
154
169
|
'
|
155
|
-
|
156
170
|
unless rules_file.empty? # to get the project_folder
|
157
171
|
begin
|
158
172
|
eval(File.new(config.path+rules_file).read) if File.exist?(config.path+rules_file)
|
@@ -160,12 +174,12 @@ class SlackSmartBot
|
|
160
174
|
end
|
161
175
|
started = Time.now
|
162
176
|
process_to_run = ("cd #{project_folder} &&" + process_to_run) if defined?(project_folder)
|
163
|
-
|
177
|
+
|
164
178
|
stdin, stdout, stderr, wait_thr = Open3.popen3(process_to_run)
|
165
179
|
timeout = 30 * 60 # 30 minutes
|
166
180
|
|
167
181
|
file_output_repl = File.open("#{config.path}/repl/#{@channel_id}/#{session_name}.output", "r")
|
168
|
-
|
182
|
+
@repl_sessions[from][:pid] = wait_thr.pid
|
169
183
|
while (wait_thr.status == 'run' or wait_thr.status == 'sleep') and @repl_sessions.key?(from)
|
170
184
|
begin
|
171
185
|
if (Time.now-@repl_sessions[from][:finished]) > timeout
|
@@ -173,6 +187,14 @@ class SlackSmartBot
|
|
173
187
|
f.puts 'quit'
|
174
188
|
}
|
175
189
|
respond "REPL session finished: #{@repl_sessions[from][:name]}", dest
|
190
|
+
unreact :running, @ts_react
|
191
|
+
pids = `pgrep -P #{@repl_sessions[from][:pid]}`.split("\n").map(&:to_i) #todo: it needs to be adapted for Windows
|
192
|
+
pids.each do |pid|
|
193
|
+
begin
|
194
|
+
Process.kill("KILL", pid)
|
195
|
+
rescue
|
196
|
+
end
|
197
|
+
end
|
176
198
|
@repl_sessions.delete(from)
|
177
199
|
break
|
178
200
|
end
|
@@ -199,10 +221,12 @@ class SlackSmartBot
|
|
199
221
|
code.gsub!("\\r", "\r")
|
200
222
|
# Disabled for the moment since it is deleting lines with '}'
|
201
223
|
#code.gsub!(/^\W*$/, "") #to remove special chars from slack when copy/pasting.
|
202
|
-
if code.match?(/System/i) or code.match?(/Kernel/i) or code.include?("File") or
|
224
|
+
if code.match?(/System/i) or code.match?(/Kernel/i) or code.include?("File.") or
|
203
225
|
code.include?("`") or code.include?("exec") or code.include?("spawn") or code.include?("IO.") or
|
204
226
|
code.match?(/open3/i) or code.match?(/bundle/i) or code.match?(/gemfile/i) or code.include?("%x") or
|
205
|
-
code.include?("ENV") or code.match?(/=\s*IO/)
|
227
|
+
code.include?("ENV") or code.match?(/=\s*IO/) or code.include?("Dir.") or
|
228
|
+
code.match?(/=\s*File/) or code.match?(/=\s*Dir/) or code.match?(/<\s*File/) or code.match?(/<\s*Dir/) or
|
229
|
+
code.match?(/\w+:\s*File/) or code.match?(/\w+:\s*Dir/)
|
206
230
|
respond "Sorry I cannot run this due security reasons", dest
|
207
231
|
else
|
208
232
|
@repl_sessions[from][:input]<<code
|
@@ -212,6 +236,14 @@ class SlackSmartBot
|
|
212
236
|
f.puts code
|
213
237
|
}
|
214
238
|
respond "REPL session finished: #{@repl_sessions[from][:name]}", dest
|
239
|
+
unreact :running, @ts_react
|
240
|
+
pids = `pgrep -P #{@repl_sessions[from][:pid]}`.split("\n").map(&:to_i) #todo: it needs to be adapted for Windows
|
241
|
+
pids.each do |pid|
|
242
|
+
begin
|
243
|
+
Process.kill("KILL", pid)
|
244
|
+
rescue
|
245
|
+
end
|
246
|
+
end
|
215
247
|
@repl_sessions.delete(from)
|
216
248
|
when /^\s*-/i
|
217
249
|
#ommit
|
@@ -13,39 +13,64 @@ class SlackSmartBot
|
|
13
13
|
(!user.key?(:enterprise_user) or ( user.key?(:enterprise_user) and !config[:allow_access][__method__].include?(user[:enterprise_user].id)))
|
14
14
|
respond "You don't have access to use this command, please contact an Admin to be able to use it: <@#{config.admins.join(">, <@")}>"
|
15
15
|
else
|
16
|
-
unless code.match?(/System/i) or code.match?(/Kernel/i) or code.include?("File") or
|
16
|
+
unless code.match?(/System/i) or code.match?(/Kernel/i) or code.include?("File.") or
|
17
17
|
code.include?("`") or code.include?("exec") or code.include?("spawn") or code.include?("IO.") or
|
18
18
|
code.match?(/open3/i) or code.match?(/bundle/i) or code.match?(/gemfile/i) or code.include?("%x") or
|
19
|
-
code.include?("ENV") or code.match?(/=\s*IO/)
|
19
|
+
code.include?("ENV") or code.match?(/=\s*IO/) or code.include?("Dir.") or code.match?(/=\s*IO/) or
|
20
|
+
code.match?(/=\s*File/) or code.match?(/=\s*Dir/) or code.match?(/<\s*File/) or code.match?(/<\s*Dir/) or
|
21
|
+
code.match?(/\w+:\s*File/) or code.match?(/\w+:\s*Dir/)
|
22
|
+
react :running
|
20
23
|
unless rules_file.empty?
|
21
24
|
begin
|
22
25
|
eval(File.new(config.path+rules_file).read) if File.exist?(config.path+rules_file)
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
26
|
-
respond "Running", dest if code.size >
|
29
|
+
respond "Running", dest if code.size > 200
|
27
30
|
|
28
31
|
begin
|
29
32
|
code.gsub!(/^\W*$/, "") #to remove special chars from slack when copy/pasting
|
33
|
+
code.gsub!('$','\$') #to take $ as literal, fex: puts '$lolo' => puts '\$lolo'
|
30
34
|
ruby = "ruby -e \"#{code.gsub('"', '\"')}\""
|
31
35
|
if defined?(project_folder) and project_folder.to_s != "" and Dir.exist?(project_folder)
|
32
36
|
ruby = ("cd #{project_folder} &&" + ruby)
|
33
37
|
else
|
34
38
|
def project_folder() "" end
|
35
39
|
end
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
+
|
41
|
+
stdin, stdout, stderr, wait_thr = Open3.popen3(ruby)
|
42
|
+
timeout = timeoutt = 20
|
43
|
+
procstart = Time.now
|
44
|
+
while (wait_thr.status == 'run' or wait_thr.status == 'sleep') and timeout > 0
|
45
|
+
timeout -= 0.1
|
46
|
+
sleep 0.1
|
47
|
+
end
|
48
|
+
if timeout > 0
|
49
|
+
stdout = stdout.read
|
50
|
+
stderr = stderr.read
|
51
|
+
if stderr == ""
|
52
|
+
if stdout == ""
|
53
|
+
respond "Nothing returned. Remember you need to use p or puts to print", dest
|
54
|
+
else
|
55
|
+
respond stdout, dest
|
56
|
+
end
|
40
57
|
else
|
41
|
-
respond stdout, dest
|
58
|
+
respond "#{stderr}\n#{stdout}", dest
|
42
59
|
end
|
43
60
|
else
|
44
|
-
respond "#{
|
61
|
+
respond "The process didn't finish in #{timeoutt} secs so it was aborted. Timeout!"
|
62
|
+
pids = `pgrep -P #{wait_thr.pid}`.split("\n").map(&:to_i) #todo: it needs to be adapted for Windows
|
63
|
+
pids.each do |pid|
|
64
|
+
begin
|
65
|
+
Process.kill("KILL", pid)
|
66
|
+
rescue
|
67
|
+
end
|
68
|
+
end
|
45
69
|
end
|
46
70
|
rescue Exception => exc
|
47
71
|
respond exc, dest
|
48
72
|
end
|
73
|
+
unreact :running
|
49
74
|
else
|
50
75
|
respond "Sorry I cannot run this due security reasons", dest
|
51
76
|
end
|
@@ -4,7 +4,6 @@ class SlackSmartBot
|
|
4
4
|
# help: `run repl SESSION_NAME ENV_VAR=VALUE ENV_VAR=VALUE`
|
5
5
|
# help: `run live SESSION_NAME`
|
6
6
|
# help: `run irb SESSION_NAME`
|
7
|
-
# help:
|
8
7
|
# help: Will run the repl session specified and return the output.
|
9
8
|
# help: You can supply the Environmental Variables you need for the Session
|
10
9
|
# help: It will return only the values that were print out on the repl with puts, print, p or pp
|
@@ -22,7 +21,7 @@ class SlackSmartBot
|
|
22
21
|
Dir.mkdir("#{config.path}/repl") unless Dir.exist?("#{config.path}/repl")
|
23
22
|
Dir.mkdir("#{config.path}/repl/#{@channel_id}") unless Dir.exist?("#{config.path}/repl/#{@channel_id}")
|
24
23
|
if File.exist?("#{config.path}/repl/#{@channel_id}/#{session_name}.run")
|
25
|
-
if @repls.key?(session_name) and @repls[session_name][:type] == :private and
|
24
|
+
if @repls.key?(session_name) and (@repls[session_name][:type] == :private or @repls[session_name][:type] == :private_clean) and
|
26
25
|
@repls[session_name][:creator_name]!=user.name and
|
27
26
|
!config.admins.include?(user.name)
|
28
27
|
respond "The REPL with session name: #{session_name} is private", dest
|
@@ -44,7 +43,7 @@ class SlackSmartBot
|
|
44
43
|
eval(File.new(config.path+rules_file).read) if File.exist?(config.path+rules_file)
|
45
44
|
end
|
46
45
|
end
|
47
|
-
if File.exist?("#{project_folder}/.smart-bot-repl")
|
46
|
+
if File.exist?("#{project_folder}/.smart-bot-repl") and @repls[session_name][:type] != :private_clean and @repls[session_name][:type] != :public_clean
|
48
47
|
content += File.read("#{project_folder}/.smart-bot-repl")
|
49
48
|
content += "\n"
|
50
49
|
end
|
@@ -14,7 +14,7 @@ class SlackSmartBot
|
|
14
14
|
else
|
15
15
|
message = ""
|
16
16
|
@repls.sort.to_h.each do |session_name, repl|
|
17
|
-
if (repl.creator_name == user.name or repl.type == :public) or (config.admins.include?(user.name) and typem == :on_dm)
|
17
|
+
if (repl.creator_name == user.name or repl.type == :public or repl.type == :public_clean) or (config.admins.include?(user.name) and typem == :on_dm)
|
18
18
|
message += "(#{repl.type}) *#{session_name}*: #{repl.description} / created: #{repl.created} / accessed: #{repl.accessed} / creator: #{repl.creator_name} / runs: #{repl.runs_by_creator+repl.runs_by_others} / gets: #{repl.gets} \n"
|
19
19
|
end
|
20
20
|
end
|
@@ -13,26 +13,44 @@ class SlackSmartBot
|
|
13
13
|
else
|
14
14
|
unless typem == :on_extended
|
15
15
|
msg = ""
|
16
|
-
if @shortcuts[:all].keys.size > 0
|
16
|
+
if @shortcuts[:all].keys.size > 0 or @shortcuts_global[:all].keys.size > 0
|
17
17
|
msg = "*Available shortcuts for all:*\n"
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
|
19
|
+
if @shortcuts[:all].keys.size > 0
|
20
|
+
@shortcuts[:all].each { |name, value|
|
21
|
+
msg += " _#{name}: #{value}_\n"
|
22
|
+
}
|
23
|
+
end
|
24
|
+
if @shortcuts_global[:all].keys.size > 0
|
25
|
+
@shortcuts_global[:all].each { |name, value|
|
26
|
+
msg += " _#{name} (global): #{value}_\n"
|
27
|
+
}
|
28
|
+
end
|
21
29
|
respond msg, dest
|
22
30
|
end
|
23
|
-
|
31
|
+
msg2 = ''
|
24
32
|
if @shortcuts.keys.include?(from) and @shortcuts[from].keys.size > 0
|
25
33
|
new_hash = @shortcuts[from].dup
|
26
34
|
@shortcuts[:all].keys.each { |k| new_hash.delete(k) }
|
27
35
|
if new_hash.keys.size > 0
|
28
|
-
|
36
|
+
msg2 = "*Available shortcuts for #{from}:*\n"
|
29
37
|
new_hash.each { |name, value|
|
30
|
-
|
38
|
+
msg2 += " _#{name}: #{value}_\n"
|
39
|
+
}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
if @shortcuts_global.keys.include?(from) and @shortcuts_global[from].keys.size > 0
|
43
|
+
new_hash = @shortcuts_global[from].dup
|
44
|
+
@shortcuts_global[:all].keys.each { |k| new_hash.delete(k) }
|
45
|
+
if new_hash.keys.size > 0
|
46
|
+
msg2 = "*Available shortcuts for #{from}:*\n" if msg2 == ''
|
47
|
+
new_hash.each { |name, value|
|
48
|
+
msg2 += " _#{name} (global): #{value}_\n"
|
31
49
|
}
|
32
|
-
respond msg, dest
|
33
50
|
end
|
34
51
|
end
|
35
|
-
respond
|
52
|
+
respond msg2 unless msg2 == ''
|
53
|
+
respond "No shortcuts found" if (msg + msg2) == ""
|
36
54
|
end
|
37
55
|
end
|
38
56
|
end
|
@@ -7,7 +7,15 @@ class SlackSmartBot
|
|
7
7
|
respond "You don't have access to use this command, please contact an Admin to be able to use it: <@#{config.admins.join(">, <@")}>"
|
8
8
|
else
|
9
9
|
if typem == :on_extended or typem == :on_call #for the other cases above.
|
10
|
-
|
10
|
+
|
11
|
+
if help_command.to_s != ''
|
12
|
+
help_command = '' if help_command.to_s.match?(/^\s*expanded\s*$/i) or help_command.to_s.match?(/^\s*extended\s*$/i)
|
13
|
+
expanded = true
|
14
|
+
else
|
15
|
+
expanded = false
|
16
|
+
end
|
17
|
+
|
18
|
+
help_filtered = get_help(rules_file, dest, from, true, expanded)
|
11
19
|
|
12
20
|
if help_command.to_s != ""
|
13
21
|
help_found = false
|
@@ -38,6 +46,11 @@ class SlackSmartBot
|
|
38
46
|
def git_project() "" end
|
39
47
|
def project_folder() "" end
|
40
48
|
end
|
49
|
+
unless expanded
|
50
|
+
message_not_expanded = "*If you want to see the expanded version of `bot rules`, please call `bot rules expanded`*\n"
|
51
|
+
message_not_expanded += "*Also to get specific expanded help for a specific command or rule call `bot rules COMMAND`*\n"
|
52
|
+
respond message_not_expanded
|
53
|
+
end
|
41
54
|
end
|
42
55
|
end
|
43
56
|
end
|
@@ -11,10 +11,10 @@ class SlackSmartBot
|
|
11
11
|
save_stats(__method__)
|
12
12
|
if config.on_master_bot
|
13
13
|
if config.admins.include?(from) #admin user
|
14
|
-
|
14
|
+
if answer.empty?
|
15
15
|
ask("are you sure?", command, from, dest)
|
16
16
|
else
|
17
|
-
case
|
17
|
+
case answer
|
18
18
|
when /yes/i, /yep/i, /sure/i
|
19
19
|
respond "Game over!", dest
|
20
20
|
respond "Ciao #{display_name}!", dest
|
@@ -33,7 +33,7 @@ class SlackSmartBot
|
|
33
33
|
exit!
|
34
34
|
end
|
35
35
|
when /no/i, /nope/i, /cancel/i
|
36
|
-
|
36
|
+
answer_delete(from)
|
37
37
|
respond "Thanks, I'm happy to be alive", dest
|
38
38
|
else
|
39
39
|
ask("I don't understand, are you sure do you want me to close? (yes or no)", command, from, dest)
|
@@ -18,7 +18,7 @@ class SlackSmartBot
|
|
18
18
|
end
|
19
19
|
respond "Bot channels have been notified", dest
|
20
20
|
elsif where == "all" #all
|
21
|
-
myconv =
|
21
|
+
myconv = get_channels(bot_is_in: true)
|
22
22
|
myconv.each do |c|
|
23
23
|
respond message, c.id unless c.name == config.master_channel
|
24
24
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class SlackSmartBot
|
2
|
+
# helpmaster: ----------------------------------------------
|
3
|
+
# helpmaster: `set maintenance on`
|
4
|
+
# helpmaster: `set maintenance on MESSAGE`
|
5
|
+
# helpmaster: `set maintenance off`
|
6
|
+
# helpmaster: `turn maintenance on`
|
7
|
+
# helpmaster: `turn maintenance on MESSAGE`
|
8
|
+
# helpmaster: `turn maintenance off`
|
9
|
+
# helpmaster: The SmartBot will be on maintenance and responding with a generic message
|
10
|
+
# helpmaster: Only works if you are on Master channel and you are a master admin user
|
11
|
+
# helpmaster:
|
12
|
+
def set_maintenance(from, status, message)
|
13
|
+
save_stats(__method__)
|
14
|
+
if config.on_master_bot
|
15
|
+
if config.admins.include?(from) #admin user
|
16
|
+
if message == ''
|
17
|
+
config.on_maintenance_message = "Sorry I'm on maintenance so I cannot attend your request."
|
18
|
+
else
|
19
|
+
config.on_maintenance_message = message
|
20
|
+
end
|
21
|
+
|
22
|
+
if status == 'on'
|
23
|
+
config.on_maintenance = true
|
24
|
+
respond "From now on I'll be on maintenance status so I won't be responding accordingly."
|
25
|
+
else
|
26
|
+
config.on_maintenance = false
|
27
|
+
respond "From now on I won't be on maintenance. Everything is back to normal!"
|
28
|
+
end
|
29
|
+
|
30
|
+
file = File.open("#{config.path}/config_tmp.status", "w")
|
31
|
+
file.write config.inspect
|
32
|
+
file.close
|
33
|
+
|
34
|
+
else
|
35
|
+
respond 'Only master admins on master channel can use this command.'
|
36
|
+
end
|
37
|
+
else
|
38
|
+
respond 'Only master admins on master channel can use this command.'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|