slack-smart-bot 1.8.1 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +127 -21
- data/lib/slack/smart-bot/comm/ask.rb +55 -42
- data/lib/slack/smart-bot/comm/dont_understand.rb +2 -2
- data/lib/slack/smart-bot/comm/event_hello.rb +34 -0
- data/lib/slack/smart-bot/comm/get_channel_members.rb +13 -0
- data/lib/slack/smart-bot/comm/get_channels.rb +35 -0
- data/lib/slack/smart-bot/comm/get_user_info.rb +20 -0
- data/lib/slack/smart-bot/comm/get_users.rb +24 -0
- data/lib/slack/smart-bot/comm/react.rb +38 -8
- data/lib/slack/smart-bot/comm/respond.rb +219 -48
- data/lib/slack/smart-bot/comm/respond_direct.rb +2 -3
- data/lib/slack/smart-bot/comm/respond_thread.rb +5 -0
- data/lib/slack/smart-bot/comm/send_file.rb +38 -34
- data/lib/slack/smart-bot/comm/send_msg_channel.rb +27 -22
- data/lib/slack/smart-bot/comm/send_msg_user.rb +58 -33
- data/lib/slack/smart-bot/comm/unreact.rb +24 -7
- data/lib/slack/smart-bot/comm.rb +7 -1
- data/lib/slack/smart-bot/commands/general/add_announcement.rb +32 -0
- data/lib/slack/smart-bot/commands/general/bot_help.rb +68 -28
- data/lib/slack/smart-bot/commands/general/bot_stats.rb +314 -0
- data/lib/slack/smart-bot/commands/general/bot_status.rb +3 -5
- data/lib/slack/smart-bot/commands/general/bye_bot.rb +0 -7
- data/lib/slack/smart-bot/commands/general/delete_announcement.rb +34 -0
- data/lib/slack/smart-bot/commands/general/delete_share.rb +34 -0
- data/lib/slack/smart-bot/commands/general/hi_bot.rb +16 -11
- data/lib/slack/smart-bot/commands/general/leaderboard.rb +200 -0
- data/lib/slack/smart-bot/commands/general/see_announcements.rb +113 -0
- data/lib/slack/smart-bot/commands/general/see_favorite_commands.rb +54 -0
- data/lib/slack/smart-bot/commands/general/see_shares.rb +41 -0
- data/lib/slack/smart-bot/commands/general/see_statuses.rb +78 -0
- data/lib/slack/smart-bot/commands/general/share_messages.rb +58 -0
- data/lib/slack/smart-bot/commands/general/stop_using_rules.rb +11 -6
- data/lib/slack/smart-bot/commands/general/suggest_command.rb +30 -0
- data/lib/slack/smart-bot/commands/general/use_rules.rb +13 -16
- data/lib/slack/smart-bot/commands/general/whats_new.rb +19 -0
- data/lib/slack/smart-bot/commands/general_bot_commands.rb +243 -0
- data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +67 -38
- data/lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb +49 -14
- data/lib/slack/smart-bot/commands/on_bot/admin/extend_rules.rb +5 -7
- data/lib/slack/smart-bot/commands/on_bot/admin/pause_bot.rb +4 -1
- data/lib/slack/smart-bot/commands/on_bot/admin/pause_routine.rb +1 -0
- data/lib/slack/smart-bot/commands/on_bot/admin/remove_routine.rb +2 -3
- data/lib/slack/smart-bot/commands/on_bot/admin/run_routine.rb +6 -1
- data/lib/slack/smart-bot/commands/on_bot/admin/see_result_routine.rb +32 -0
- data/lib/slack/smart-bot/commands/on_bot/admin/see_routines.rb +12 -4
- data/lib/slack/smart-bot/commands/on_bot/admin/start_bot.rb +4 -1
- data/lib/slack/smart-bot/commands/on_bot/admin/start_routine.rb +1 -0
- data/lib/slack/smart-bot/commands/on_bot/admin/stop_using_rules_on.rb +2 -0
- data/lib/slack/smart-bot/commands/on_bot/admin_master/react_to.rb +32 -0
- data/lib/slack/smart-bot/commands/on_bot/admin_master/send_message.rb +24 -0
- data/lib/slack/smart-bot/commands/on_bot/delete_repl.rb +3 -5
- data/lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb +54 -25
- data/lib/slack/smart-bot/commands/on_bot/get_repl.rb +7 -9
- data/lib/slack/smart-bot/commands/on_bot/repl.rb +55 -25
- data/lib/slack/smart-bot/commands/on_bot/ruby_code.rb +36 -13
- data/lib/slack/smart-bot/commands/on_bot/run_repl.rb +5 -7
- data/lib/slack/smart-bot/commands/on_bot/see_repls.rb +4 -6
- data/lib/slack/smart-bot/commands/on_bot/see_shortcuts.rb +29 -13
- data/lib/slack/smart-bot/commands/on_extended/bot_rules.rb +55 -9
- data/lib/slack/smart-bot/commands/on_master/admin/kill_bot_on_channel.rb +4 -1
- data/lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb +5 -3
- data/lib/slack/smart-bot/commands/on_master/admin_master/notify_message.rb +2 -1
- data/lib/slack/smart-bot/commands/on_master/admin_master/publish_announcements.rb +32 -0
- data/lib/slack/smart-bot/commands/on_master/admin_master/set_general_message.rb +38 -0
- data/lib/slack/smart-bot/commands/on_master/admin_master/set_maintenance.rb +49 -0
- data/lib/slack/smart-bot/commands/on_master/create_bot.rb +30 -21
- data/lib/slack/smart-bot/commands.rb +19 -1
- data/lib/slack/smart-bot/listen.rb +7 -8
- data/lib/slack/smart-bot/process.rb +373 -192
- data/lib/slack/smart-bot/process_first.rb +202 -104
- data/lib/slack/smart-bot/treat_message.rb +325 -186
- 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 +83 -30
- data/lib/slack/smart-bot/utils/get_bots_created.rb +4 -1
- data/lib/slack/smart-bot/utils/get_channels_name_and_id.rb +1 -7
- data/lib/slack/smart-bot/utils/get_help.rb +87 -35
- data/lib/slack/smart-bot/utils/get_shares.rb +12 -0
- data/lib/slack/smart-bot/utils/has_access.rb +12 -0
- data/lib/slack/smart-bot/utils/save_stats.rb +23 -8
- data/lib/slack/smart-bot/utils/save_status.rb +52 -0
- data/lib/slack/smart-bot/utils/update_shortcuts_file.rb +6 -0
- data/lib/slack/smart-bot/utils.rb +5 -0
- data/lib/slack-smart-bot.rb +88 -47
- data/lib/slack-smart-bot_general_commands.rb +46 -0
- data/lib/slack-smart-bot_general_rules.rb +5 -2
- data/lib/slack-smart-bot_rules.rb +49 -23
- data/whats_new.txt +36 -0
- metadata +44 -13
- data/lib/slack/smart-bot/commands/on_bot/admin_master/bot_stats.rb +0 -195
@@ -4,25 +4,22 @@ 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
|
11
10
|
# help: Example:
|
12
11
|
# help: _run repl CreateCustomer LOCATION=spain HOST='https://10.30.40.50:8887'_
|
12
|
+
# help: <https://github.com/MarioRuiz/slack-smart-bot#repl|more info>
|
13
13
|
# help:
|
14
14
|
def run_repl(dest, user, session_name, env_vars, rules_file)
|
15
15
|
#todo: add tests
|
16
16
|
from = user.name
|
17
|
-
if
|
18
|
-
(!user.key?(:enterprise_user) or ( user.key?(:enterprise_user) and !config[:allow_access][__method__].include?(user[:enterprise_user].id)))
|
19
|
-
respond "You don't have access to use this command, please contact an Admin to be able to use it: <@#{config.admins.join(">, <@")}>"
|
20
|
-
else
|
17
|
+
if has_access?(__method__, user)
|
21
18
|
save_stats(__method__)
|
22
19
|
Dir.mkdir("#{config.path}/repl") unless Dir.exist?("#{config.path}/repl")
|
23
20
|
Dir.mkdir("#{config.path}/repl/#{@channel_id}") unless Dir.exist?("#{config.path}/repl/#{@channel_id}")
|
24
21
|
if File.exist?("#{config.path}/repl/#{@channel_id}/#{session_name}.run")
|
25
|
-
if @repls.key?(session_name) and @repls[session_name][:type] == :private and
|
22
|
+
if @repls.key?(session_name) and (@repls[session_name][:type] == :private or @repls[session_name][:type] == :private_clean) and
|
26
23
|
@repls[session_name][:creator_name]!=user.name and
|
27
24
|
!config.admins.include?(user.name)
|
28
25
|
respond "The REPL with session name: #{session_name} is private", dest
|
@@ -44,7 +41,8 @@ class SlackSmartBot
|
|
44
41
|
eval(File.new(config.path+rules_file).read) if File.exist?(config.path+rules_file)
|
45
42
|
end
|
46
43
|
end
|
47
|
-
if File.exist?("#{project_folder}/.smart-bot-repl")
|
44
|
+
if File.exist?("#{project_folder}/.smart-bot-repl") and
|
45
|
+
((@repls.key?(session_name) and @repls[session_name][:type] != :private_clean and @repls[session_name][:type] != :public_clean) or !@repls.key?(session_name))
|
48
46
|
content += File.read("#{project_folder}/.smart-bot-repl")
|
49
47
|
content += "\n"
|
50
48
|
end
|
@@ -2,19 +2,17 @@ class SlackSmartBot
|
|
2
2
|
# help: ----------------------------------------------
|
3
3
|
# help: `see repls`
|
4
4
|
# help: `see irbs`
|
5
|
-
# help:
|
5
|
+
# help: It will display the repls
|
6
|
+
# help: <https://github.com/MarioRuiz/slack-smart-bot#repl|more info>
|
6
7
|
# help:
|
7
8
|
def see_repls(dest, user, typem)
|
8
9
|
#todo: add tests
|
9
10
|
save_stats(__method__)
|
10
11
|
from = user.name
|
11
|
-
if
|
12
|
-
(!user.key?(:enterprise_user) or ( user.key?(:enterprise_user) and !config[:allow_access][__method__].include?(user[:enterprise_user].id)))
|
13
|
-
respond "You don't have access to use this command, please contact an Admin to be able to use it: <@#{config.admins.join(">, <@")}>"
|
14
|
-
else
|
12
|
+
if has_access?(__method__, user)
|
15
13
|
message = ""
|
16
14
|
@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)
|
15
|
+
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
16
|
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
17
|
end
|
20
18
|
end
|
@@ -3,36 +3,52 @@ class SlackSmartBot
|
|
3
3
|
# help: `see shortcuts`
|
4
4
|
# help: `see sc`
|
5
5
|
# help: It will display the shortcuts stored for the user and for :all
|
6
|
+
# help: <https://github.com/MarioRuiz/slack-smart-bot#shortcuts|more info>
|
6
7
|
# help:
|
7
8
|
def see_shortcuts(dest, user, typem)
|
8
9
|
save_stats(__method__)
|
9
10
|
from = user.name
|
10
|
-
if
|
11
|
-
(!user.key?(:enterprise_user) or ( user.key?(:enterprise_user) and !config[:allow_access][__method__].include?(user[:enterprise_user].id)))
|
12
|
-
respond "You don't have access to use this command, please contact an Admin to be able to use it: <@#{config.admins.join(">, <@")}>"
|
13
|
-
else
|
11
|
+
if has_access?(__method__, user)
|
14
12
|
unless typem == :on_extended
|
15
13
|
msg = ""
|
16
|
-
if @shortcuts[:all].keys.size > 0
|
14
|
+
if @shortcuts[:all].keys.size > 0 or @shortcuts_global[:all].keys.size > 0
|
17
15
|
msg = "*Available shortcuts for all:*\n"
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
|
17
|
+
if @shortcuts[:all].keys.size > 0
|
18
|
+
@shortcuts[:all].each { |name, value|
|
19
|
+
msg += " _#{name}: #{value}_\n"
|
20
|
+
}
|
21
|
+
end
|
22
|
+
if @shortcuts_global[:all].keys.size > 0
|
23
|
+
@shortcuts_global[:all].each { |name, value|
|
24
|
+
msg += " _#{name} (global): #{value}_\n"
|
25
|
+
}
|
26
|
+
end
|
21
27
|
respond msg, dest
|
22
28
|
end
|
23
|
-
|
29
|
+
msg2 = ''
|
24
30
|
if @shortcuts.keys.include?(from) and @shortcuts[from].keys.size > 0
|
25
31
|
new_hash = @shortcuts[from].dup
|
26
32
|
@shortcuts[:all].keys.each { |k| new_hash.delete(k) }
|
27
33
|
if new_hash.keys.size > 0
|
28
|
-
|
34
|
+
msg2 = "*Available shortcuts for #{from}:*\n"
|
29
35
|
new_hash.each { |name, value|
|
30
|
-
|
36
|
+
msg2 += " _#{name}: #{value}_\n"
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
if @shortcuts_global.keys.include?(from) and @shortcuts_global[from].keys.size > 0
|
41
|
+
new_hash = @shortcuts_global[from].dup
|
42
|
+
@shortcuts_global[:all].keys.each { |k| new_hash.delete(k) }
|
43
|
+
if new_hash.keys.size > 0
|
44
|
+
msg2 = "*Available shortcuts for #{from}:*\n" if msg2 == ''
|
45
|
+
new_hash.each { |name, value|
|
46
|
+
msg2 += " _#{name} (global): #{value}_\n"
|
31
47
|
}
|
32
|
-
respond msg, dest
|
33
48
|
end
|
34
49
|
end
|
35
|
-
respond
|
50
|
+
respond msg2 unless msg2 == ''
|
51
|
+
respond "No shortcuts found" if (msg + msg2) == ""
|
36
52
|
end
|
37
53
|
end
|
38
54
|
end
|
@@ -2,29 +2,59 @@ class SlackSmartBot
|
|
2
2
|
def bot_rules(dest, help_command, typem, rules_file, user)
|
3
3
|
save_stats(__method__)
|
4
4
|
from = user.name
|
5
|
-
if
|
6
|
-
(!user.key?(:enterprise_user) or ( user.key?(:enterprise_user) and !config[:allow_access][__method__].include?(user[:enterprise_user].id)))
|
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
|
-
else
|
5
|
+
if has_access?(__method__, user)
|
9
6
|
if typem == :on_extended or typem == :on_call #for the other cases above.
|
10
|
-
|
7
|
+
output = []
|
8
|
+
if help_command.to_s != ''
|
9
|
+
help_command = '' if help_command.to_s.match?(/^\s*expanded\s*$/i) or help_command.to_s.match?(/^\s*extended\s*$/i)
|
10
|
+
expanded = true
|
11
|
+
else
|
12
|
+
expanded = false
|
13
|
+
end
|
14
|
+
|
15
|
+
help_filtered = get_help(rules_file, dest, from, true, expanded)
|
11
16
|
|
17
|
+
commands = []
|
18
|
+
commands_search = []
|
12
19
|
if help_command.to_s != ""
|
13
20
|
help_found = false
|
14
21
|
help_filtered.split(/^\s*-------*$/).each do |h|
|
15
22
|
if h.match?(/[`_]#{help_command}/i)
|
16
|
-
|
23
|
+
output << "*#{config.channel}*:#{h}"
|
17
24
|
help_found = true
|
25
|
+
commands << h
|
26
|
+
elsif !h.match?(/\A\s*\*/) and !h.match?(/\A\s*=+/) #to avoid general messages for bot help *General rules...*
|
27
|
+
all_found = true
|
28
|
+
help_command.to_s.split(' ') do |hc|
|
29
|
+
unless hc.match?(/^\s*\z/)
|
30
|
+
if !h.match?(/#{hc}/i)
|
31
|
+
all_found = false
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
commands_search << h if all_found
|
36
|
+
end
|
37
|
+
end
|
38
|
+
if commands.size < 10 and help_command.to_s!='' and commands_search.size > 0
|
39
|
+
commands_search.shuffle!
|
40
|
+
(10-commands.size).times do |n|
|
41
|
+
unless commands_search[n].nil?
|
42
|
+
output << commands_search[n]
|
43
|
+
help_found = true
|
44
|
+
end
|
18
45
|
end
|
19
46
|
end
|
20
|
-
|
47
|
+
unless help_found
|
48
|
+
output << "*#{config.channel}*: I didn't find any command with `#{help_command}`"
|
49
|
+
end
|
50
|
+
|
21
51
|
else
|
22
52
|
message = "-\n\n\n===================================\n*Rules from channel #{config.channel}*\n"
|
23
53
|
if typem == :on_extended
|
24
54
|
message += "To run the commands on this extended channel, add `!`, `!!` or `^` before the command.\n"
|
25
55
|
end
|
26
56
|
message += help_filtered
|
27
|
-
|
57
|
+
output << message
|
28
58
|
end
|
29
59
|
|
30
60
|
unless rules_file.empty?
|
@@ -33,11 +63,27 @@ class SlackSmartBot
|
|
33
63
|
end
|
34
64
|
end
|
35
65
|
if defined?(git_project) and git_project.to_s != "" and help_command.to_s == ""
|
36
|
-
|
66
|
+
output << "Git project: #{git_project}"
|
37
67
|
else
|
38
68
|
def git_project() "" end
|
39
69
|
def project_folder() "" end
|
40
70
|
end
|
71
|
+
unless expanded
|
72
|
+
message_not_expanded = "If you want to see the *expanded* version of *`bot rules`*, please call *`bot rules expanded`*\n"
|
73
|
+
message_not_expanded += "Also to get specific *expanded* help for a specific command or rule call *`bot rules COMMAND`*\n"
|
74
|
+
output << message_not_expanded
|
75
|
+
end
|
76
|
+
if output.join("\n").lines.count > 50 and dest[0]!='D'
|
77
|
+
dest = :on_thread
|
78
|
+
output.unshift('Since there are many lines returned the results are returned on a thread by default.')
|
79
|
+
end
|
80
|
+
output.each do |h|
|
81
|
+
msg = h.gsub(/^\s*command_id:\s+:\w+\s*$/,'')
|
82
|
+
unless msg.match?(/\A\s*\z/)
|
83
|
+
respond msg, dest, unfurl_links: false, unfurl_media: false
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
41
87
|
end
|
42
88
|
end
|
43
89
|
end
|
@@ -3,6 +3,7 @@ class SlackSmartBot
|
|
3
3
|
# helpmaster: `kill bot on CHANNEL_NAME`
|
4
4
|
# helpmaster: kills the bot on the specified channel
|
5
5
|
# helpmaster: Only works if you are on Master channel and you created that bot or you are an admin user
|
6
|
+
# helpmaster: <https://github.com/MarioRuiz/slack-smart-bot#bot-management|more info>
|
6
7
|
# helpmaster:
|
7
8
|
def kill_bot_on_channel(dest, from, channel)
|
8
9
|
save_stats(__method__)
|
@@ -18,7 +19,8 @@ class SlackSmartBot
|
|
18
19
|
if channel_id.nil?
|
19
20
|
respond "There is no channel with that name: #{channel}, please be sure is written exactly the same", dest
|
20
21
|
elsif @bots_created.keys.include?(channel_id)
|
21
|
-
|
22
|
+
@bots_created[channel_id] ||= {}
|
23
|
+
if @bots_created[channel_id][:admins].to_s.split(",").include?(from)
|
22
24
|
if @bots_created[channel_id][:thread].kind_of?(Thread) and @bots_created[channel_id][:thread].alive?
|
23
25
|
@bots_created[channel_id][:thread].kill
|
24
26
|
end
|
@@ -26,6 +28,7 @@ class SlackSmartBot
|
|
26
28
|
update_bots_file()
|
27
29
|
respond "Bot on channel: #{channel}, has been killed and deleted.", dest
|
28
30
|
send_msg_channel(channel, "Bot has been killed by #{from}")
|
31
|
+
save_status :off, :killed, "The admin killed SmartBot on *<##{channel_id}|#{@channels_name[channel_id]}>*"
|
29
32
|
else
|
30
33
|
respond "You need to be the creator or an admin of that bot channel", dest
|
31
34
|
end
|
@@ -6,21 +6,23 @@ class SlackSmartBot
|
|
6
6
|
# helpadmin: `close bot`
|
7
7
|
# helpadmin: The bot stops running and also stops all the bots created from this master channel
|
8
8
|
# helpadmin: You can use this command only if you are an admin user and you are on the master channel
|
9
|
+
# helpadmin: <https://github.com/MarioRuiz/slack-smart-bot#bot-management|more info>
|
9
10
|
# helpadmin:
|
10
11
|
def exit_bot(command, from, dest, display_name)
|
11
12
|
save_stats(__method__)
|
12
13
|
if config.on_master_bot
|
13
14
|
if config.admins.include?(from) #admin user
|
14
|
-
|
15
|
+
if answer.empty?
|
15
16
|
ask("are you sure?", command, from, dest)
|
16
17
|
else
|
17
|
-
case
|
18
|
+
case answer
|
18
19
|
when /yes/i, /yep/i, /sure/i
|
19
20
|
respond "Game over!", dest
|
20
21
|
respond "Ciao #{display_name}!", dest
|
21
22
|
@bots_created.each { |key, value|
|
22
23
|
value[:thread] = ""
|
23
24
|
send_msg_channel(key, "Bot has been closed by #{from}")
|
25
|
+
save_status :off, :exited, "The admin closed SmartBot on *<##{key}|#{value.channel_name}>*"
|
24
26
|
sleep 0.5
|
25
27
|
}
|
26
28
|
update_bots_file()
|
@@ -33,7 +35,7 @@ class SlackSmartBot
|
|
33
35
|
exit!
|
34
36
|
end
|
35
37
|
when /no/i, /nope/i, /cancel/i
|
36
|
-
|
38
|
+
answer_delete(from)
|
37
39
|
respond "Thanks, I'm happy to be alive", dest
|
38
40
|
else
|
39
41
|
ask("I don't understand, are you sure do you want me to close? (yes or no)", command, from, dest)
|
@@ -7,6 +7,7 @@ class SlackSmartBot
|
|
7
7
|
# helpmaster: It will send a notification message to all channels the bot joined and private conversations with the bot
|
8
8
|
# helpmaster: It will send a notification message to the specified channel and to its extended channels
|
9
9
|
# helpmaster: Only works if you are on Master channel and you are a master admin user
|
10
|
+
# helpmaster: <https://github.com/MarioRuiz/slack-smart-bot#sending-notifications|more info>
|
10
11
|
# helpmaster:
|
11
12
|
def notify_message(dest, from, where, message)
|
12
13
|
save_stats(__method__)
|
@@ -18,7 +19,7 @@ class SlackSmartBot
|
|
18
19
|
end
|
19
20
|
respond "Bot channels have been notified", dest
|
20
21
|
elsif where == "all" #all
|
21
|
-
myconv =
|
22
|
+
myconv = get_channels(bot_is_in: true)
|
22
23
|
myconv.each do |c|
|
23
24
|
respond message, c.id unless c.name == config.master_channel
|
24
25
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class SlackSmartBot
|
2
|
+
# helpmaster: ----------------------------------------------
|
3
|
+
# helpmaster: `publish announcements`
|
4
|
+
# helpmaster: It will publish on all channels the announcements added by using 'add announcement' command.
|
5
|
+
# helpmaster: Only works if you are on Master channel and you are a master admin user
|
6
|
+
# helpmaster: The messages stored on a DM won't be published.
|
7
|
+
# helpmaster: This is very convenient to be called from a *Routine* for example every weekday at 09:00.
|
8
|
+
# helpmaster: <https://github.com/MarioRuiz/slack-smart-bot#announcements|more info>
|
9
|
+
# helpmaster:
|
10
|
+
def publish_announcements(user)
|
11
|
+
save_stats(__method__)
|
12
|
+
if config.on_master_bot
|
13
|
+
if config.admins.include?(user.name) #admin user
|
14
|
+
channels = Dir.entries("#{config.path}/announcements/")
|
15
|
+
channels.select! {|i| i[/\.csv$/]}
|
16
|
+
channels.each do |channel|
|
17
|
+
channel.gsub!('.csv','')
|
18
|
+
unless channel[0]== 'D'
|
19
|
+
see_announcements(user, '', channel, true, true)
|
20
|
+
sleep 0.5 # to avoid reach ratelimit
|
21
|
+
end
|
22
|
+
end
|
23
|
+
react :heavy_check_mark
|
24
|
+
|
25
|
+
else
|
26
|
+
respond 'Only master admins on master channel can use this command.'
|
27
|
+
end
|
28
|
+
else
|
29
|
+
respond 'Only master admins on master channel can use this command.'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class SlackSmartBot
|
2
|
+
# helpmaster: ----------------------------------------------
|
3
|
+
# helpmaster: `set general message MESSAGE`
|
4
|
+
# helpmaster: `set general message off`
|
5
|
+
# helpmaster: The SmartBot will display the specified message after treating every command
|
6
|
+
# helpmaster: Only works if you are on Master channel and you are a master admin user
|
7
|
+
# helpmaster: You can add interpolation to the message you are adding
|
8
|
+
# helpmaster: Examples:
|
9
|
+
# helpmaster: _set general message We will be on maintenance at 12:00_
|
10
|
+
# helpmaster: _set general message We will be on maintenance in #{((Time.new(2021,6,18,13,30,0)-Time.now)/60).to_i} minutes_
|
11
|
+
# helpmaster: _set general message `We will be on *maintenance* at *12:00*`_
|
12
|
+
# helpmaster: _set general message `:information_source: Pay attention: We will be on *maintenance* in *#{((Time.new(2021,6,18,13,30,0)-Time.now)/60).to_i} minutes*`_
|
13
|
+
# helpmaster: <https://github.com/MarioRuiz/slack-smart-bot#bot-management|more info>
|
14
|
+
# helpmaster:
|
15
|
+
def set_general_message(from, status, message)
|
16
|
+
save_stats(__method__)
|
17
|
+
if config.on_master_bot
|
18
|
+
if config.admins.include?(from) #admin user
|
19
|
+
if status == 'on'
|
20
|
+
config.general_message = message
|
21
|
+
respond "General message has been set."
|
22
|
+
else
|
23
|
+
config.general_message = ''
|
24
|
+
respond "General message won't be displayed anymore."
|
25
|
+
end
|
26
|
+
|
27
|
+
file = File.open("#{config.path}/config_tmp.status", "w")
|
28
|
+
file.write config.inspect
|
29
|
+
file.close
|
30
|
+
|
31
|
+
else
|
32
|
+
respond 'Only master admins on master channel can use this command.'
|
33
|
+
end
|
34
|
+
else
|
35
|
+
respond 'Only master admins on master channel can use this command.'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,49 @@
|
|
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: You can add interpolation to the message you are adding
|
12
|
+
# helpmaster: Examples:
|
13
|
+
# helpmaster: _set maintenance on_
|
14
|
+
# helpmaster: _set maintenance on We are on maintenance. We'll be available again in #{((Time.new(2021,6,18,13,30,0)-Time.now)/60).to_i} minutes_
|
15
|
+
# helpmaster: _turn maintenance on `We are on *maintenance* until *12:00*`_
|
16
|
+
# helpmaster: <https://github.com/MarioRuiz/slack-smart-bot#bot-management|more info>
|
17
|
+
# helpmaster:
|
18
|
+
def set_maintenance(from, status, message)
|
19
|
+
save_stats(__method__)
|
20
|
+
if config.on_master_bot
|
21
|
+
if config.admins.include?(from) #admin user
|
22
|
+
if message == ''
|
23
|
+
config.on_maintenance_message = "Sorry I'm on maintenance so I cannot attend your request."
|
24
|
+
else
|
25
|
+
config.on_maintenance_message = message
|
26
|
+
end
|
27
|
+
|
28
|
+
if status == 'on'
|
29
|
+
config.on_maintenance = true
|
30
|
+
respond "From now on I'll be on maintenance status so I won't be responding accordingly."
|
31
|
+
save_status :off, :maintenance_on, config.on_maintenance_message
|
32
|
+
else
|
33
|
+
config.on_maintenance = false
|
34
|
+
respond "From now on I won't be on maintenance. Everything is back to normal!"
|
35
|
+
save_status :on, :maintenance_off, config.on_maintenance_message
|
36
|
+
end
|
37
|
+
|
38
|
+
file = File.open("#{config.path}/config_tmp.status", "w")
|
39
|
+
file.write config.inspect
|
40
|
+
file.close
|
41
|
+
|
42
|
+
else
|
43
|
+
respond 'Only master admins on master channel can use this command.'
|
44
|
+
end
|
45
|
+
else
|
46
|
+
respond 'Only master admins on master channel can use this command.'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -2,18 +2,20 @@ class SlackSmartBot
|
|
2
2
|
# helpmaster: ----------------------------------------------
|
3
3
|
# helpmaster: `create bot on CHANNEL_NAME`
|
4
4
|
# helpmaster: `create cloud bot on CHANNEL_NAME`
|
5
|
-
# helpmaster:
|
6
|
-
# helpmaster:
|
7
|
-
# helpmaster:
|
8
|
-
# helpmaster:
|
5
|
+
# helpmaster: `create silent bot on CHANNEL_NAME`
|
6
|
+
# helpmaster: Creates a new bot on the channel specified
|
7
|
+
# helpmaster: It will work only if you are on Master channel
|
8
|
+
# helpmaster: The admins will be the master admins, the creator of the bot and the creator of the channel
|
9
|
+
# helpmaster: Follow the instructions in case creating cloud bots
|
10
|
+
# helpmaster: In case 'silent' won't display the Bot initialization message on the CHANNEL_NAME
|
11
|
+
# helpmaster: <https://github.com/MarioRuiz/slack-smart-bot#bot-management|more info>
|
9
12
|
# helpmaster:
|
10
|
-
def create_bot(dest, user,
|
13
|
+
def create_bot(dest, user, type, channel)
|
14
|
+
cloud = type.include?('cloud')
|
15
|
+
silent = type.include?('silent')
|
11
16
|
save_stats(__method__)
|
12
17
|
from = user.name
|
13
|
-
if
|
14
|
-
(!user.key?(:enterprise_user) or ( user.key?(:enterprise_user) and !config[:allow_access][__method__].include?(user[:enterprise_user].id)))
|
15
|
-
respond "You don't have access to use this command, please contact an Admin to be able to use it: <@#{config.admins.join(">, <@")}>"
|
16
|
-
else
|
18
|
+
if has_access?(__method__, user)
|
17
19
|
if config.on_master_bot
|
18
20
|
get_channels_name_and_id() unless @channels_name.keys.include?(channel) or @channels_id.keys.include?(channel)
|
19
21
|
channel_id = nil
|
@@ -24,13 +26,10 @@ class SlackSmartBot
|
|
24
26
|
channel_id = @channels_id[channel]
|
25
27
|
end
|
26
28
|
#todo: add pagination for case more than 1000 channels on the workspace
|
27
|
-
channels =
|
28
|
-
|
29
|
-
limit: "1000",
|
30
|
-
exclude_archived: "true",
|
31
|
-
).channels
|
29
|
+
channels = get_channels()
|
30
|
+
channel = @channels_name[channel] if @channels_name.key?(channel)
|
32
31
|
channel_found = channels.detect { |c| c.name == channel }
|
33
|
-
members =
|
32
|
+
members = get_channel_members(@channels_id[channel]) unless channel_found.nil?
|
34
33
|
|
35
34
|
if channel_id.nil?
|
36
35
|
respond "There is no channel with that name: #{channel}, please be sure is written exactly the same", dest
|
@@ -39,37 +38,45 @@ class SlackSmartBot
|
|
39
38
|
elsif @bots_created.keys.include?(channel_id)
|
40
39
|
respond "There is already a bot in this channel: #{channel}, kill it before", dest
|
41
40
|
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:
|
41
|
+
respond "You need to add first to the channel the smart bot user: <@#{config[:nick_id]}>", dest
|
43
42
|
else
|
44
43
|
if channel_id != config[:channel]
|
45
44
|
begin
|
46
45
|
rules_file = "slack-smart-bot_rules_#{channel_id}_#{from.gsub(" ", "_")}.rb"
|
47
|
-
if defined?(RULES_FOLDER)
|
46
|
+
if defined?(RULES_FOLDER) # consider removing RULES_FOLDER since we are not using it anywhere else
|
48
47
|
rules_file = RULES_FOLDER + rules_file
|
49
48
|
general_rules_file = RULES_FOLDER + 'general_rules.rb'
|
49
|
+
general_commands_file = RULES_FOLDER + 'general_commands.rb'
|
50
50
|
else
|
51
51
|
Dir.mkdir("#{config.path}/rules") unless Dir.exist?("#{config.path}/rules")
|
52
52
|
Dir.mkdir("#{config.path}/rules/#{channel_id}") unless Dir.exist?("#{config.path}/rules/#{channel_id}")
|
53
53
|
rules_file = "/rules/#{channel_id}/" + rules_file
|
54
54
|
general_rules_file = "/rules/general_rules.rb"
|
55
|
+
general_commands_file = "/rules/general_commands.rb"
|
55
56
|
end
|
56
57
|
default_rules = (__FILE__).gsub(/slack\/smart-bot\/commands\/on_master\/create_bot\.rb$/, "slack-smart-bot_rules.rb")
|
57
58
|
default_general_rules = (__FILE__).gsub(/slack\/smart-bot\/commands\/on_master\/create_bot\.rb$/, "slack-smart-bot_general_rules.rb")
|
59
|
+
default_general_commands = (__FILE__).gsub(/slack\/smart-bot\/commands\/on_master\/create_bot\.rb$/, "slack-smart-bot_general_commands.rb")
|
58
60
|
|
59
61
|
File.delete(config.path + rules_file) if File.exist?(config.path + rules_file)
|
60
62
|
FileUtils.copy_file(default_rules, config.path + rules_file) unless File.exist?(config.path + rules_file)
|
61
63
|
FileUtils.copy_file(default_general_rules, config.path + general_rules_file) unless File.exist?(config.path + general_rules_file)
|
64
|
+
FileUtils.copy_file(default_general_commands, config.path + general_commands_file) unless File.exist?(config.path + general_commands_file)
|
62
65
|
admin_users = Array.new()
|
63
|
-
creator_info =
|
64
|
-
|
66
|
+
creator_info = @users.select{|u| u.id == channel_found.creator or (u.key?(:enterprise_user) and u.enterprise_user.id == channel_found.creator)}[-1]
|
67
|
+
if creator_info.nil? or creator_info.empty? or creator_info.user.nil?
|
68
|
+
admin_users = [from] + config.masters
|
69
|
+
else
|
70
|
+
admin_users = [from, creator_info.user.name] + config.masters
|
71
|
+
end
|
65
72
|
admin_users.uniq!
|
66
|
-
@logger.info "ruby #{config.file_path} \"#{channel}\" \"#{admin_users.join(",")}\" \"#{rules_file}\" on"
|
73
|
+
@logger.info "BOT_SILENT=#{silent} ruby #{config.file_path} \"#{channel}\" \"#{admin_users.join(",")}\" \"#{rules_file}\" on"
|
67
74
|
|
68
75
|
if cloud
|
69
76
|
respond "Copy the bot folder to your cloud location and run `ruby #{config.file} \"#{channel}\" \"#{admin_users.join(",")}\" \"#{rules_file}\" on&`", dest
|
70
77
|
else
|
71
78
|
t = Thread.new do
|
72
|
-
`BOT_SILENT
|
79
|
+
`BOT_SILENT=#{silent} ruby #{config.file_path} \"#{channel}\" \"#{admin_users.join(",")}\" \"#{rules_file}\" on`
|
73
80
|
end
|
74
81
|
end
|
75
82
|
@bots_created[channel_id] = {
|
@@ -84,6 +91,8 @@ class SlackSmartBot
|
|
84
91
|
cloud: cloud,
|
85
92
|
thread: t,
|
86
93
|
}
|
94
|
+
@bots_created[channel_id].silent = true if silent
|
95
|
+
|
87
96
|
respond "The bot has been created on channel: #{channel}. Rules file: #{File.basename rules_file}. Admins: #{admin_users.join(", ")}", dest
|
88
97
|
update_bots_file()
|
89
98
|
rescue Exception => stack
|