slack-smart-bot 1.9.2 → 1.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +109 -11
- data/lib/slack/smart-bot/comm/ask.rb +55 -49
- data/lib/slack/smart-bot/comm/dont_understand.rb +1 -1
- data/lib/slack/smart-bot/comm/event_hello.rb +7 -3
- data/lib/slack/smart-bot/comm/get_channel_members.rb +9 -4
- data/lib/slack/smart-bot/comm/get_channels.rb +31 -16
- data/lib/slack/smart-bot/comm/get_user_info.rb +12 -8
- data/lib/slack/smart-bot/comm/get_users.rb +24 -0
- data/lib/slack/smart-bot/comm/react.rb +19 -2
- data/lib/slack/smart-bot/comm/respond.rb +217 -72
- 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 +22 -18
- data/lib/slack/smart-bot/comm.rb +2 -0
- data/lib/slack/smart-bot/commands/general/add_announcement.rb +32 -0
- data/lib/slack/smart-bot/commands/general/bot_help.rb +59 -32
- data/lib/slack/smart-bot/commands/general/bot_stats.rb +10 -9
- data/lib/slack/smart-bot/commands/general/bot_status.rb +2 -4
- 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 +7 -7
- data/lib/slack/smart-bot/commands/general_bot_commands.rb +243 -0
- data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +2 -5
- data/lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb +32 -11
- data/lib/slack/smart-bot/commands/on_bot/admin/extend_rules.rb +2 -0
- data/lib/slack/smart-bot/commands/on_bot/admin/pause_bot.rb +4 -2
- 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 +4 -2
- data/lib/slack/smart-bot/commands/on_bot/admin/start_bot.rb +4 -2
- 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 +2 -4
- data/lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb +2 -4
- data/lib/slack/smart-bot/commands/on_bot/get_repl.rb +2 -4
- data/lib/slack/smart-bot/commands/on_bot/repl.rb +5 -7
- data/lib/slack/smart-bot/commands/on_bot/ruby_code.rb +2 -4
- data/lib/slack/smart-bot/commands/on_bot/run_repl.rb +4 -5
- data/lib/slack/smart-bot/commands/on_bot/see_repls.rb +3 -5
- data/lib/slack/smart-bot/commands/on_bot/see_shortcuts.rb +2 -4
- data/lib/slack/smart-bot/commands/on_extended/bot_rules.rb +45 -12
- 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 +2 -0
- data/lib/slack/smart-bot/commands/on_master/admin_master/notify_message.rb +1 -0
- 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 +8 -0
- data/lib/slack/smart-bot/commands/on_master/create_bot.rb +27 -14
- data/lib/slack/smart-bot/commands.rb +16 -0
- data/lib/slack/smart-bot/listen.rb +1 -3
- data/lib/slack/smart-bot/process.rb +212 -74
- data/lib/slack/smart-bot/process_first.rb +118 -37
- data/lib/slack/smart-bot/treat_message.rb +313 -248
- data/lib/slack/smart-bot/utils/build_help.rb +3 -3
- data/lib/slack/smart-bot/utils/create_routine_thread.rb +81 -46
- data/lib/slack/smart-bot/utils/get_bots_created.rb +4 -1
- data/lib/slack/smart-bot/utils/get_help.rb +58 -68
- 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 +2 -0
- data/lib/slack/smart-bot/utils/save_status.rb +52 -0
- data/lib/slack/smart-bot/utils.rb +3 -0
- data/lib/slack-smart-bot.rb +45 -4
- 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 +43 -17
- data/whats_new.txt +32 -20
- metadata +24 -2
@@ -0,0 +1,54 @@
|
|
1
|
+
class SlackSmartBot
|
2
|
+
def see_favorite_commands(user, only_mine)
|
3
|
+
save_stats(__method__)
|
4
|
+
if config.stats
|
5
|
+
if Thread.current[:typem] == :on_call
|
6
|
+
channel = Thread.current[:dchannel]
|
7
|
+
elsif Thread.current[:using_channel].to_s==''
|
8
|
+
channel = Thread.current[:dest]
|
9
|
+
else
|
10
|
+
channel = Thread.current[:using_channel]
|
11
|
+
end
|
12
|
+
|
13
|
+
files = Dir["#{config.stats_path}.*.log"].sort.reverse[0..1]
|
14
|
+
if files.empty?
|
15
|
+
respond "There is no data stored."
|
16
|
+
else
|
17
|
+
count_commands = {}
|
18
|
+
files.each do |file|
|
19
|
+
CSV.foreach(file, headers: true, header_converters: :symbol, converters: :numeric) do |row|
|
20
|
+
row[:dest_channel_id] = row[:bot_channel_id] if row[:dest_channel_id].to_s[0] == "D"
|
21
|
+
|
22
|
+
if ((only_mine and row[:user_name]==user.name) or (!only_mine and !config.admins.include?(row[:user_name]))) and
|
23
|
+
row[:dest_channel_id] == channel and !row[:user_name].include?('routine/') and
|
24
|
+
row[:command] != 'dont_understand'
|
25
|
+
|
26
|
+
row[:command] = 'bot_help' if row[:command] == 'bot_rules'
|
27
|
+
count_commands[row[:command]] ||= 0
|
28
|
+
count_commands[row[:command]] += 1
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
commands = []
|
33
|
+
count_commands.sort_by {|k,v| -v}.each do |command, num|
|
34
|
+
commands << command
|
35
|
+
end
|
36
|
+
if commands.empty?
|
37
|
+
respond "There is no data stored."
|
38
|
+
else
|
39
|
+
output = ""
|
40
|
+
i = 0
|
41
|
+
commands.each do |command|
|
42
|
+
unless output.match?(/^\s*command_id:\s+:#{command}\s*$/)
|
43
|
+
i+=1
|
44
|
+
output += bot_help(user, user.name, Thread.current[:dest], channel, false, command.gsub('_',' '), config.rules_file, false)
|
45
|
+
break if i>=5
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
else
|
51
|
+
respond "Ask an admin to set stats to true to generate the stats when running the bot instance so you can get this command to work."
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class SlackSmartBot
|
2
|
+
|
3
|
+
def see_shares()
|
4
|
+
save_stats(__method__)
|
5
|
+
typem = Thread.current[:typem]
|
6
|
+
dest = Thread.current[:dest]
|
7
|
+
if typem == :on_call
|
8
|
+
channel = Thread.current[:dchannel]
|
9
|
+
else
|
10
|
+
channel = Thread.current[:dest]
|
11
|
+
end
|
12
|
+
|
13
|
+
general_message = "\nRelated commands `share messages /RegExp/ on #CHANNEL`, `share messages \"TEXT\" on #CHANNEL`, `delete share ID`"
|
14
|
+
if File.exist?("#{config.path}/shares/#{@channels_name[channel]}.csv")
|
15
|
+
t = CSV.table("#{config.path}/shares/#{@channels_name[channel]}.csv", headers: ['share_id', 'user_deleted', 'user_created', 'date', 'time', 'type', 'to_channel', 'condition'])
|
16
|
+
message =[]
|
17
|
+
t.each do |m|
|
18
|
+
if m[:user_deleted] == ''
|
19
|
+
if m[:type]=='text'
|
20
|
+
emoji = ":abc:"
|
21
|
+
elsif m[:type] == 'regexp'
|
22
|
+
emoji = ":heavy_plus_sign:"
|
23
|
+
else
|
24
|
+
emoji = ':white_square:'
|
25
|
+
end
|
26
|
+
message << "\t#{m[:share_id]} #{emoji} *_#{m[:date]}_* #{m[:time]} *#{m[:user_created]}* <##{@channels_id[m[:to_channel]]}|#{m[:to_channel]}> : \t`#{m[:condition]}`"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
if message.size == 0
|
30
|
+
message << "*There are no active shares right now.*"
|
31
|
+
else
|
32
|
+
message.unshift("*Shares from channel <##{channel}>*")
|
33
|
+
end
|
34
|
+
message << general_message
|
35
|
+
respond message.join("\n"), dest
|
36
|
+
else
|
37
|
+
respond "*There are no active shares right now.*#{general_message}"
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
class SlackSmartBot
|
2
|
+
def see_statuses(user, channel, types, dest, not_on)
|
3
|
+
save_stats(__method__)
|
4
|
+
react :runner
|
5
|
+
if channel == ""
|
6
|
+
if dest[0] == "D"
|
7
|
+
cdest = @channel_id
|
8
|
+
else
|
9
|
+
cdest = dest
|
10
|
+
end
|
11
|
+
else
|
12
|
+
get_channels_name_and_id() unless @channels_name.keys.include?(channel) or @channels_id.keys.include?(channel)
|
13
|
+
channel_id = nil
|
14
|
+
if @channels_name.key?(channel) #it is an id
|
15
|
+
channel_id = channel
|
16
|
+
channel = @channels_name[channel_id]
|
17
|
+
elsif @channels_id.key?(channel) #it is a channel name
|
18
|
+
channel_id = @channels_id[channel]
|
19
|
+
end
|
20
|
+
cdest = channel_id
|
21
|
+
end
|
22
|
+
members = get_channel_members(cdest)
|
23
|
+
if members.include?(user.id)
|
24
|
+
list = {}
|
25
|
+
members.each do |member|
|
26
|
+
info = get_user_info(member)
|
27
|
+
text = info.user.profile.status_text
|
28
|
+
emoji = info.user.profile.status_emoji
|
29
|
+
exp = info.user.profile.expiration
|
30
|
+
unless (((!types.empty? and !types.include?(emoji)) or (emoji.to_s == "" and text.to_s == "" and exp.to_s == "")) and !not_on) or
|
31
|
+
(not_on and types.include?(emoji)) or info.user.deleted or info.user.is_bot or info.user.is_app_user
|
32
|
+
emoji = ":white_square:" if emoji.to_s == ""
|
33
|
+
list[emoji] ||= []
|
34
|
+
list[emoji] << {
|
35
|
+
type: "context",
|
36
|
+
elements: [
|
37
|
+
{
|
38
|
+
type: "plain_text",
|
39
|
+
text: "\t\t",
|
40
|
+
},
|
41
|
+
{
|
42
|
+
type: "image",
|
43
|
+
image_url: info.user.profile.image_24,
|
44
|
+
alt_text: info.user.name,
|
45
|
+
},
|
46
|
+
{
|
47
|
+
type: "mrkdwn",
|
48
|
+
text: " *#{info.user.profile.real_name}* (#{info.user.name}) #{text} #{exp}",
|
49
|
+
},
|
50
|
+
],
|
51
|
+
}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
if list.size > 0
|
55
|
+
list.each do |emoji, users|
|
56
|
+
blocks = [
|
57
|
+
{
|
58
|
+
"type": "context",
|
59
|
+
elements: [
|
60
|
+
{
|
61
|
+
type: "mrkdwn",
|
62
|
+
text: "*Users* #{emoji} on <##{cdest}>",
|
63
|
+
},
|
64
|
+
],
|
65
|
+
},
|
66
|
+
]
|
67
|
+
users = users.sort_by { |hsh| hsh.elements[2].text }
|
68
|
+
respond blocks: (blocks+users)
|
69
|
+
end
|
70
|
+
else
|
71
|
+
respond "Nobody on <##{cdest}> with that status"
|
72
|
+
end
|
73
|
+
else
|
74
|
+
respond "You need to join <##{cdest}> to be able to see the statuses on that channel."
|
75
|
+
end
|
76
|
+
unreact :runner
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
class SlackSmartBot
|
2
|
+
#todo: reaction type not added yet since RTM doesn't support it. See if we can add it as an event
|
3
|
+
def share_messages(user, from_channel, to_channel, condition)
|
4
|
+
save_stats(__method__)
|
5
|
+
if has_access?(__method__, user)
|
6
|
+
#todo: add a @shared variable to control not to be shared more than once when using reactions
|
7
|
+
#todo: it is only possible to share if smartbot is a member in both channels and the person adding the share command also
|
8
|
+
if Thread.current[:typem] == :on_call or Thread.current[:typem] == :on_dm
|
9
|
+
respond "You can use this command only from the source channel."
|
10
|
+
elsif from_channel == to_channel
|
11
|
+
respond "You cannot share messages on the same channel than source channel."
|
12
|
+
else
|
13
|
+
channels = get_channels(types: 'public_channel')
|
14
|
+
channel_found = channels.detect { |c| c.name == from_channel }
|
15
|
+
get_channels_name_and_id() unless @channels_id.key?(to_channel)
|
16
|
+
channel_found = false if !@channels_id.key?(to_channel)
|
17
|
+
if channel_found
|
18
|
+
members = get_channel_members(@channels_id[to_channel])
|
19
|
+
if members.include?(config.nick_id) and members.include?(user.id)
|
20
|
+
if condition.match?(/^\/.+\/$/)
|
21
|
+
type = :regexp
|
22
|
+
elsif condition.match?(/^".+"$/) or condition.match?(/^'.+'$/)
|
23
|
+
type = :text
|
24
|
+
else
|
25
|
+
type = :reaction
|
26
|
+
end
|
27
|
+
if File.exists?("#{config.path}/shares/#{from_channel}.csv")
|
28
|
+
t = CSV.table("#{config.path}/shares/#{from_channel}.csv", headers: ['share_id', 'user_deleted', 'user_created', 'date', 'time', 'type', 'to_channel', 'condition'])
|
29
|
+
@shares[from_channel] = t
|
30
|
+
if t.size>0
|
31
|
+
num = t[:share_id].max + 1
|
32
|
+
else
|
33
|
+
num = 1
|
34
|
+
end
|
35
|
+
elsif !@shares.key?(from_channel)
|
36
|
+
File.open("#{config.path}/shares/#{from_channel}.csv","w")
|
37
|
+
t = CSV.table("#{config.path}/shares/#{from_channel}.csv", headers: ['share_id', 'user_deleted', 'user_created', 'date', 'time', 'type', 'to_channel', 'condition'])
|
38
|
+
num = 1
|
39
|
+
@shares[from_channel] = t
|
40
|
+
else
|
41
|
+
num = @shares[from_channel][:share_id].max + 1
|
42
|
+
end
|
43
|
+
values = [num, '', user.name, Time.now.strftime("%Y/%m/%d"), Time.now.strftime("%H:%M"), type.to_s, to_channel, condition]
|
44
|
+
@shares[from_channel] << values
|
45
|
+
CSV.open("#{config.path}/shares/#{from_channel}.csv", "a+") do |csv|
|
46
|
+
csv << values
|
47
|
+
end
|
48
|
+
respond "*Share command*: id:#{num} Messages #{condition} will be shared from now on. Related commands `see shares`, `delete share ID`"
|
49
|
+
else
|
50
|
+
respond "*Share command*: The channel ##{to_channel} need to exist and the SmartBot and you have to be members."
|
51
|
+
end
|
52
|
+
else
|
53
|
+
respond "*Share command*: The channel <##{@channels_id[from_channel]}|#{from_channel}> has to be a public channel and the destination channel has to be a valid channel."
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -1,10 +1,13 @@
|
|
1
1
|
class SlackSmartBot
|
2
2
|
# help: ----------------------------------------------
|
3
3
|
# help: `stop using rules from CHANNEL`
|
4
|
+
# help: `stop using CHANNEL`
|
4
5
|
# help: it will stop using the rules from the specified channel.
|
6
|
+
# help: <https://github.com/MarioRuiz/slack-smart-bot#using-rules-from-other-channels|more info>
|
5
7
|
# help:
|
6
8
|
def stop_using_rules(dest, channel, user, dchannel)
|
7
9
|
save_stats(__method__)
|
10
|
+
channel.gsub!('#','') # for the case the channel name is in plain text including #
|
8
11
|
if @channels_id.key?(channel)
|
9
12
|
channel_id = @channels_id[channel]
|
10
13
|
else
|
@@ -12,11 +15,12 @@ class SlackSmartBot
|
|
12
15
|
end
|
13
16
|
|
14
17
|
if dest[0] == "C" or dest[0] == "G" #channel
|
15
|
-
if @rules_imported.key?(user.
|
16
|
-
if @rules_imported[user.
|
18
|
+
if @rules_imported.key?(user.name) and @rules_imported[user.name].key?(dchannel)
|
19
|
+
if @rules_imported[user.name][dchannel] != channel_id
|
17
20
|
respond "You are not using those rules.", dest
|
18
21
|
else
|
19
|
-
@rules_imported[user.
|
22
|
+
@rules_imported[user.name].delete(dchannel)
|
23
|
+
sleep 0.5
|
20
24
|
update_rules_imported()
|
21
25
|
respond "You won't be using those rules from now on.", dest
|
22
26
|
|
@@ -27,11 +31,12 @@ class SlackSmartBot
|
|
27
31
|
respond "You were not using those rules.", dest
|
28
32
|
end
|
29
33
|
else #direct message
|
30
|
-
if @rules_imported.key?(user.
|
31
|
-
if @rules_imported[user.
|
34
|
+
if @rules_imported.key?(user.name) and @rules_imported[user.name].key?(user.name)
|
35
|
+
if @rules_imported[user.name][user.name] != channel_id
|
32
36
|
respond "You are not using those rules.", dest
|
33
37
|
else
|
34
|
-
@rules_imported[user.
|
38
|
+
@rules_imported[user.name].delete(user.name)
|
39
|
+
sleep 0.5
|
35
40
|
update_rules_imported()
|
36
41
|
respond "You won't be using those rules from now on.", dest
|
37
42
|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class SlackSmartBot
|
2
|
+
|
3
|
+
# help: ----------------------------------------------
|
4
|
+
# help: `suggest command`
|
5
|
+
# help: `random command`
|
6
|
+
# help: `command suggestion`
|
7
|
+
# help: `suggest rule`
|
8
|
+
# help: `random rule`
|
9
|
+
# help: `rule suggestion`
|
10
|
+
# help: it will display the help content for a random command.
|
11
|
+
# help: if used 'rule' then it will display a random rule.
|
12
|
+
# help: if used 'command' it will show any kind of command or rule.
|
13
|
+
# help:
|
14
|
+
def suggest_command(from, dest, dchannel, specific, rules_file)
|
15
|
+
save_stats(__method__)
|
16
|
+
help_message = get_help(rules_file, dest, from, specific, true, descriptions: false, only_normal_user: true)
|
17
|
+
commands = help_message.gsub(/====+/,'-'*30).split(/^\s*-------*$/).flatten
|
18
|
+
commands.reject!{|c| c.match?(/These are specific commands for this bot on this/i) || c.match?(/\A\s*\z/)}
|
19
|
+
@last_suggested_commands ||= []
|
20
|
+
@last_suggested_commands.shift if @last_suggested_commands.size >=5
|
21
|
+
command = ''
|
22
|
+
begin
|
23
|
+
command = commands.sample
|
24
|
+
end until !@last_suggested_commands.include?(command) or commands.size <= 5
|
25
|
+
@last_suggested_commands << command
|
26
|
+
message = "*Command suggestion*:\n#{command}"
|
27
|
+
respond message, dest, unfurl_links: false, unfurl_media: false
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -6,17 +6,16 @@ class SlackSmartBot
|
|
6
6
|
# help: `use CHANNEL`
|
7
7
|
# help: it will use the rules from the specified channel.
|
8
8
|
# help: you need to be part of that channel to be able to use the rules.
|
9
|
+
# help: <https://github.com/MarioRuiz/slack-smart-bot#using-rules-from-other-channels|more info>
|
9
10
|
# help:
|
10
11
|
def use_rules(dest, channel, user, dchannel)
|
11
12
|
save_stats(__method__)
|
12
13
|
get_bots_created()
|
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
|
14
|
+
if has_access?(__method__, user)
|
17
15
|
#todo: add pagination for case more than 1000 channels on the workspace
|
18
16
|
channels = get_channels()
|
19
17
|
channel.gsub!('#','') # for the case the channel name is in plain text including #
|
18
|
+
channel = @channels_name[channel] if @channels_name.key?(channel)
|
20
19
|
channel_found = channels.detect { |c| c.name == channel }
|
21
20
|
get_channels_name_and_id() unless @channels_id.key?(channel)
|
22
21
|
members = get_channel_members(@channels_id[channel]) unless channel_found.nil? or !@channels_id.key?(channel)
|
@@ -31,12 +30,13 @@ class SlackSmartBot
|
|
31
30
|
respond "The bot in that channel is not :on", dest
|
32
31
|
else
|
33
32
|
if user.id == channel_found.creator or members.include?(user.id)
|
34
|
-
@rules_imported[user.
|
33
|
+
@rules_imported[user.name] = {} unless @rules_imported.key?(user.name)
|
35
34
|
if dest[0] == "C" or dest[0] == "G" #todo: take in consideration bots that are not master
|
36
|
-
@rules_imported[user.
|
35
|
+
@rules_imported[user.name][dchannel] = channel_found.id
|
37
36
|
else
|
38
|
-
@rules_imported[user.
|
37
|
+
@rules_imported[user.name][user.name] = channel_found.id
|
39
38
|
end
|
39
|
+
sleep 0.5
|
40
40
|
update_rules_imported()
|
41
41
|
respond "I'm using now the rules from <##{channel_found.id}>", dest
|
42
42
|
|
@@ -0,0 +1,243 @@
|
|
1
|
+
# add here the general commands you will be using in any channel where The SmartBot is part of. Not necessary to use ! or ^, it will answer directly.
|
2
|
+
def general_bot_commands(user, command, dest, files = [])
|
3
|
+
|
4
|
+
begin
|
5
|
+
if config.simulate
|
6
|
+
display_name = user.profile.display_name
|
7
|
+
else
|
8
|
+
if user.profile.display_name.to_s.match?(/\A\s*\z/)
|
9
|
+
user.profile.display_name = user.profile.real_name
|
10
|
+
end
|
11
|
+
display_name = user.profile.display_name
|
12
|
+
end
|
13
|
+
|
14
|
+
case command
|
15
|
+
|
16
|
+
|
17
|
+
# help: ----------------------------------------------
|
18
|
+
# help: `bot help`
|
19
|
+
# help: `bot help COMMAND`
|
20
|
+
# help: `bot rules`
|
21
|
+
# help: `bot rules COMMAND`
|
22
|
+
# help: `bot help expanded`
|
23
|
+
# help: `bot rules expanded`
|
24
|
+
# help: `bot what can I do?`
|
25
|
+
# help: it will display this help. For a more detailed help call `bot help expanded` or `bot rules expanded`.
|
26
|
+
# help: if COMMAND supplied just help for that command
|
27
|
+
# help: you can use the option 'expanded' or the alias 'extended'
|
28
|
+
# help: `bot rules` will show only the specific rules for this channel.
|
29
|
+
# help: <https://github.com/MarioRuiz/slack-smart-bot#bot-help|more info>
|
30
|
+
# help:
|
31
|
+
|
32
|
+
|
33
|
+
# help: ----------------------------------------------
|
34
|
+
# help: `Hi Bot`
|
35
|
+
# help: `Hi Smart`
|
36
|
+
# help: `Hello Bot` `Hola Bot` `Hallo Bot` `What's up Bot` `Hey Bot` `Hæ Bot`
|
37
|
+
# help: `Hello THE_NAME_OF_THE_BOT`
|
38
|
+
# help: Bot starts listening to you if you are on a Bot channel
|
39
|
+
# help: After that if you want to avoid a single message to be treated by the smart bot, start the message by -
|
40
|
+
# help: Also apart of Hello you can use _Hallo, Hi, Hola, What's up, Hey, Hæ_
|
41
|
+
# help: <https://github.com/MarioRuiz/slack-smart-bot#how-to-access-the-smart-bot|more info>
|
42
|
+
# help:
|
43
|
+
when /\A\s*(Hello|Hallo|Hi|Hola|What's\sup|Hey|Hæ)\s+(#{@salutations.join("|")})\s*$/i
|
44
|
+
hi_bot(user, dest, user.name, display_name)
|
45
|
+
|
46
|
+
# help: ----------------------------------------------
|
47
|
+
# help: `Bye Bot`
|
48
|
+
# help: `Bye Smart`
|
49
|
+
# help: `Bye NAME_OF_THE_BOT`
|
50
|
+
# help: Bot stops listening to you if you are on a Bot channel
|
51
|
+
# help: Also apart of Bye you can use _Bæ, Good Bye, Adiós, Ciao, Bless, Bless Bless, Adeu_
|
52
|
+
# help: <https://github.com/MarioRuiz/slack-smart-bot#how-to-access-the-smart-bot|more info>
|
53
|
+
# help:
|
54
|
+
when /\A\s*(Bye|Bæ|Good\s+Bye|Adiós|Ciao|Bless|Bless\sBless|Adeu)\s+(#{@salutations.join("|")})\s*$/i
|
55
|
+
bye_bot(dest, user.name, display_name)
|
56
|
+
|
57
|
+
# help: ----------------------------------------------
|
58
|
+
# help: `add announcement MESSAGE`
|
59
|
+
# help: `add red announcement MESSAGE`
|
60
|
+
# help: `add green announcement MESSAGE`
|
61
|
+
# help: `add yellow announcement MESSAGE`
|
62
|
+
# help: `add white announcement MESSAGE`
|
63
|
+
# help: `add EMOJI announcement MESSAGE`
|
64
|
+
# help: It will store the message on the announcement list labeled with the color or emoji specified, white by default.
|
65
|
+
# help: aliases for announcement: statement, declaration, message
|
66
|
+
# help: Examples:
|
67
|
+
# help: _add green announcement :heavy_check_mark: All customer services are up and running_
|
68
|
+
# help: _add red declaration Customers db is down :x:_
|
69
|
+
# help: _add yellow statement Don't access the linux server without VPN_
|
70
|
+
# help: _add message `*Party* will start at *20:00* :tada:`_
|
71
|
+
# help: _add :heavy_exclamation_mark: message Pay attention all DB are on maintenance until 20:00 GMT_
|
72
|
+
# help: <https://github.com/MarioRuiz/slack-smart-bot#announcements|more info>
|
73
|
+
# help:
|
74
|
+
when /\A\s*(add|create)\s+(red\s+|green\s+|white\s+|yellow\s+)?(announcement|statement|declaration|message)\s+(.+)\s*\z/i,
|
75
|
+
/\A\s*(add|create)\s+(:\w+:)\s+(announcement|statement|declaration|message)\s+(.+)\s*\z/i
|
76
|
+
type = $2.to_s.downcase.strip
|
77
|
+
type = 'white' if type == ''
|
78
|
+
message = $4
|
79
|
+
add_announcement(user, type, message)
|
80
|
+
|
81
|
+
|
82
|
+
# help: ----------------------------------------------
|
83
|
+
# help: `delete announcement ID`
|
84
|
+
# help: It will delete the message on the announcement list.
|
85
|
+
# help: aliases for announcement: statement, declaration, message
|
86
|
+
# help: Examples:
|
87
|
+
# help: _delete announcement 24_
|
88
|
+
# help: _delete message 645_
|
89
|
+
# help: _delete statement 77_
|
90
|
+
# help: _delete declaration 334_
|
91
|
+
# help: <https://github.com/MarioRuiz/slack-smart-bot#announcements|more info>
|
92
|
+
# help:
|
93
|
+
when /\A\s*(delete|remove)\s+(announcement|statement|declaration|message)\s+(\d+)\s*\z/i
|
94
|
+
message_id = $3
|
95
|
+
delete_announcement(user, message_id)
|
96
|
+
|
97
|
+
# help: ----------------------------------------------
|
98
|
+
# help: `see announcements`
|
99
|
+
# help: `see red announcements`
|
100
|
+
# help: `see green announcements`
|
101
|
+
# help: `see yellow announcements`
|
102
|
+
# help: `see white announcements`
|
103
|
+
# help: `see EMOJI announcements`
|
104
|
+
# helpmaster: `see announcements #CHANNEL`
|
105
|
+
# helpmaster: `see all announcements`
|
106
|
+
# help: It will display the announcements for the channel.
|
107
|
+
# help: aliases for announcements: statements, declarations, messages
|
108
|
+
# helpmaster: In case #CHANNEL it will display the announcements for that channel. Only master admins can use it from a DM with the Smartbot.
|
109
|
+
# helpmaster: In case 'all' it will display all the announcements for all channels. Only master admins can use it from a DM with the Smartbot.
|
110
|
+
# help: Examples:
|
111
|
+
# help: _see announcements_
|
112
|
+
# help: _see white messages_
|
113
|
+
# help: _see red statements_
|
114
|
+
# help: _see yellow declarations_
|
115
|
+
# help: _see messages_
|
116
|
+
# help: _see :heavy_exclamation_mark: messages_
|
117
|
+
# help: <https://github.com/MarioRuiz/slack-smart-bot#announcements|more info>
|
118
|
+
# help:
|
119
|
+
when /\A\s*see\s+(red\s+|green\s+|white\s+|yellow\s+|:\w+:\s+)?(announcements|statements|declarations|messages)()\s*\z/i,
|
120
|
+
/\A\s*see\s+(all\s+)?(announcements|statements|declarations|messages)()\s*\z/i,
|
121
|
+
/\A\s*see\s+(red\s+|green\s+|white\s+|yellow\s+|:\w+:\s+)?(announcements|statements|declarations|messages)\s+#([\w\-]+)\s*\z/i,
|
122
|
+
/\A\s*see\s+(red\s+|green\s+|white\s+|yellow\s+|:\w+:\s+)?(announcements|statements|declarations|messages)\s+<#(C\w+)\|.*>\s*\z/i
|
123
|
+
|
124
|
+
type = $1.to_s.downcase.strip
|
125
|
+
channel = $3.to_s
|
126
|
+
|
127
|
+
see_announcements(user, type, channel)
|
128
|
+
|
129
|
+
|
130
|
+
# help: ----------------------------------------------
|
131
|
+
# help: `share messages /REGEXP/ on #CHANNEL`
|
132
|
+
# help: `share messages "TEXT" on #CHANNEL`
|
133
|
+
# xhelp: `share messages :EMOJI: on #CHANNEL`
|
134
|
+
# help: It will automatically share new messages published that meet the specified criteria.
|
135
|
+
# xhelp: In case :EMOJI: it will share the messages with the indicated reaction.
|
136
|
+
# help: SmartBot user and user adding the share need to be members on both channels.
|
137
|
+
# help: The Regexp will automatically add the parameters /im
|
138
|
+
# help: Only available on public channels.
|
139
|
+
# help: Examples:
|
140
|
+
# help: _share messages /(last\s+|previous\s+)?sales\s+results\s+/ on #sales_
|
141
|
+
# help: _share messages "share post" on #announcements_
|
142
|
+
# xhelp: _share messages :tada: on #announcements_
|
143
|
+
# xhelp: _share messages :moneybag: from #sales_
|
144
|
+
# help: <https://github.com/MarioRuiz/slack-smart-bot#share-messages|more info>
|
145
|
+
# help:
|
146
|
+
when /\A\s*share\s+messages\s+(\/.+\/|".+"|'.+')\s+on\s+<#\w+\|(.+)>\s*\z/i,
|
147
|
+
/\A\s*share\s+messages\s+(\/.+\/|".+"|'.+')\s+on\s+<#(\w+)\|>\s*\z/,
|
148
|
+
/\A\s*share\s+messages\s+(\/.+\/|".+"|'.+')\s+on\s+(.+)\s*\z/i
|
149
|
+
condition = $1
|
150
|
+
channel = $2
|
151
|
+
channel.gsub!('#','') # for the case the channel name is in plain text including #
|
152
|
+
channel = @channels_name[channel] if @channels_name.key?(channel)
|
153
|
+
channel_from = @channels_name[dest]
|
154
|
+
channel_to = channel
|
155
|
+
share_messages(user, channel_from, channel_to, condition)
|
156
|
+
|
157
|
+
# help: ----------------------------------------------
|
158
|
+
# help: `see shares`
|
159
|
+
# help: It will display the active shares from this channel.
|
160
|
+
# help: <https://github.com/MarioRuiz/slack-smart-bot#share-messages|more info>
|
161
|
+
# help:
|
162
|
+
when /\A\s*see\s+shares\s*\z/i
|
163
|
+
see_shares()
|
164
|
+
|
165
|
+
# help: ----------------------------------------------
|
166
|
+
# help: `delete share ID`
|
167
|
+
# help: It will delete the share id specified.
|
168
|
+
# help: Examples:
|
169
|
+
# help: _delete share 24_
|
170
|
+
# help: <https://github.com/MarioRuiz/slack-smart-bot#share-messages|more info>
|
171
|
+
# help:
|
172
|
+
when /\A\s*(delete|remove)\s+share\s+(\d+)\s*\z/i
|
173
|
+
share_id = $2
|
174
|
+
delete_share(user, share_id)
|
175
|
+
|
176
|
+
# help: ----------------------------------------------
|
177
|
+
# help: `see statuses`
|
178
|
+
# help: `see statuses #CHANNEL`
|
179
|
+
# help: `see status EMOJI`
|
180
|
+
# help: `see status EMOJI #CHANNEL`
|
181
|
+
# help: `see status EMOJI1 EMOJI99`
|
182
|
+
# help: `who is on vacation?`
|
183
|
+
# help: `who is on EMOJI`
|
184
|
+
# help: `who is on EMOJI #CHANNEL`
|
185
|
+
# help: `who is on EMOJI1 EMOJI99`
|
186
|
+
# help: `who is not on vacation?`
|
187
|
+
# help: `who is not on EMOJI`
|
188
|
+
# help: It will display the current statuses of the members of the channel where you are calling the command or on the channel you supply.
|
189
|
+
# help: <https://github.com/MarioRuiz/slack-smart-bot#see-statuses|more info>
|
190
|
+
# help:
|
191
|
+
when /\A\s*(see|get)\s+(statuses)()\s*\z/i,
|
192
|
+
/\A\s*(see\s+status|get\s+status|who\s+is\s+on|who\s+is\s+not\s+on)\s+(:[\w\-\:\s]+:)\s*\??()\s*\z/i,
|
193
|
+
/\A\s*(who\s+is\s+on|who\s+is\s+not\s+on)\s+(vacation|holiday)\s*\??()\s*\z/i,
|
194
|
+
/\A\s*(see|get)\s+(statuses)\s+#([\w\-]+)\s*\z/i,
|
195
|
+
/\A\s*(see\s+status|get\s+status|who\s+is\s+on|who\s+is\s+not\s+on)\s+(:[\w\-\:\s]+:)\s*\??\s+#([\w\-]+)\s*\z/i,
|
196
|
+
/\A\s*(who\s+is\s+on|who\s+is\s+not\s+on)\s+(vacation|holiday)\s*\??\s+#([\w\-]+)\s*\z/i,
|
197
|
+
/\A\s*(see|get)\s+(statuses)\s+<#(C\w+)\|.+>\s*\z/i,
|
198
|
+
/\A\s*(see\s+status|get\s+status|who\s+is\s+on|who\s+is\s+not\s+on)\s+(:[\w\-\:\s]+:)\s*\??\s+<#(C\w+)\|.+>\s*\z/i,
|
199
|
+
/\A\s*(who\s+is\s+on|who\s+is\s+not\s+on)\s+(vacation|holiday)\s*\??\s+<#(C\w+)\|.+>\s*\z/i
|
200
|
+
|
201
|
+
not_on = $1.match?(/who\s+is\s+not\s+on/i)
|
202
|
+
type = $2.downcase
|
203
|
+
channel = $3.to_s
|
204
|
+
if type == 'statuses'
|
205
|
+
types = []
|
206
|
+
elsif type =='vacation' or type == 'holiday'
|
207
|
+
types = [':palm_tree:']
|
208
|
+
else
|
209
|
+
type.gsub!(' ', '')
|
210
|
+
type.gsub!('::',': :')
|
211
|
+
types = type.split(' ')
|
212
|
+
end
|
213
|
+
see_statuses(user, channel, types, dest, not_on)
|
214
|
+
|
215
|
+
|
216
|
+
# help: ----------------------------------------------
|
217
|
+
# help: `see favorite commands`
|
218
|
+
# help: `see my favorite commands`
|
219
|
+
# help: `favorite commands`
|
220
|
+
# help: `my favorite commands`
|
221
|
+
# help: It will display the favorite commands.
|
222
|
+
# help: aliases for favorite: favourite, most used, fav
|
223
|
+
# helpmaster: You need to set stats to true to generate the stats when running the bot instance and get this info.
|
224
|
+
# help: <https://github.com/MarioRuiz/slack-smart-bot#see-favorite-commands|more info>
|
225
|
+
# help:
|
226
|
+
when /\A\s*(see\s+)?(my\s+)?(fav|favorite|favourite|most\s+used)\s+commands\s*\z/i
|
227
|
+
only_mine = $2.to_s!=''
|
228
|
+
see_favorite_commands(user, only_mine)
|
229
|
+
|
230
|
+
else
|
231
|
+
return false
|
232
|
+
end
|
233
|
+
return true
|
234
|
+
rescue => exception
|
235
|
+
if defined?(@logger)
|
236
|
+
@logger.fatal exception
|
237
|
+
respond "Unexpected error!! Please contact an admin to solve it: <@#{config.admins.join(">, <@")}>"
|
238
|
+
else
|
239
|
+
puts exception
|
240
|
+
end
|
241
|
+
return false
|
242
|
+
end
|
243
|
+
end
|