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
@@ -0,0 +1,18 @@
|
|
1
|
+
class SlackSmartBot
|
2
|
+
def answer(from = Thread.current[:user].name, dest = Thread.current[:dest])
|
3
|
+
if @answer.key?(from)
|
4
|
+
if Thread.current[:on_thread]
|
5
|
+
dest = Thread.current[:thread_ts]
|
6
|
+
end
|
7
|
+
if @answer[from].key?(dest)
|
8
|
+
return @answer[from][dest]
|
9
|
+
else
|
10
|
+
return ''
|
11
|
+
end
|
12
|
+
else
|
13
|
+
return ''
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class SlackSmartBot
|
2
|
+
def answer_delete(from = Thread.current[:user].name, dest = Thread.current[:dest])
|
3
|
+
if @answer.key?(from)
|
4
|
+
if Thread.current[:on_thread]
|
5
|
+
dest = Thread.current[:thread_ts]
|
6
|
+
end
|
7
|
+
if @answer[from].key?(dest)
|
8
|
+
@answer[from].delete(dest)
|
9
|
+
end
|
10
|
+
@questions.delete(from) # to be backwards compatible #todo: remove when 2.0
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
@@ -1,12 +1,64 @@
|
|
1
1
|
class SlackSmartBot
|
2
2
|
|
3
|
-
def build_help(path)
|
4
|
-
help_message = {}
|
5
|
-
Dir
|
3
|
+
def build_help(path, expanded)
|
4
|
+
help_message = {normal: {}, admin: {}, master: {}}
|
5
|
+
if Dir.exist?(path)
|
6
|
+
files = Dir["#{path}/*"]
|
7
|
+
elsif File.exist?(path)
|
8
|
+
files = [path]
|
9
|
+
else
|
10
|
+
return help_message
|
11
|
+
end
|
12
|
+
|
13
|
+
files.each do |t|
|
6
14
|
if Dir.exist?(t)
|
7
|
-
|
15
|
+
res = build_help(t, expanded)
|
16
|
+
help_message[:master][t.scan(/\/(\w+)$/).join.to_sym] = res[:master]
|
17
|
+
help_message[:admin][t.scan(/\/(\w+)$/).join.to_sym] = res[:admin]
|
18
|
+
help_message[:normal][t.scan(/\/(\w+)$/).join.to_sym] = res[:normal]
|
8
19
|
else
|
9
|
-
|
20
|
+
lines = IO.readlines(t)
|
21
|
+
data = {master:{}, admin:{}, normal:{}}
|
22
|
+
data.master = lines.join #normal user help
|
23
|
+
data.admin = lines.reject {|l| l.match?(/^\s*#\s*help\s*master\s*:.+$/i)}.join #not master help
|
24
|
+
data.normal = lines.reject {|l| l.match?(/^\s*#\s*help\s*(admin|master)\s*:.+$/i)}.join #not admin or master help
|
25
|
+
if expanded
|
26
|
+
help_message[:master][t.scan(/\/(\w+)\.rb$/).join.to_sym] = data.master.scan(/#\s*help\s*\w*:(.*)/i).join("\n")
|
27
|
+
help_message[:admin][t.scan(/\/(\w+)\.rb$/).join.to_sym] = data.admin.scan(/#\s*help\s*\w*:(.*)/i).join("\n")
|
28
|
+
help_message[:normal][t.scan(/\/(\w+)\.rb$/).join.to_sym] = data.normal.scan(/#\s*help\s*\w*:(.*)/i).join("\n")
|
29
|
+
else
|
30
|
+
data.keys.each do |key|
|
31
|
+
res = data[key].scan(/#\s*help\s*\w*:(.*)/i).join("\n")
|
32
|
+
resf = ""
|
33
|
+
command_done = false
|
34
|
+
explanation_done = false
|
35
|
+
example_done = false
|
36
|
+
|
37
|
+
res.split("\n").each do |line|
|
38
|
+
if line.match?(/^\s*======+$/)
|
39
|
+
command_done = true
|
40
|
+
explanation_done = true
|
41
|
+
example_done = true
|
42
|
+
elsif line.match?(/^\s*\-\-\-\-+\s*$/i)
|
43
|
+
resf += "\n#{line}"
|
44
|
+
command_done = false
|
45
|
+
explanation_done = false
|
46
|
+
example_done = false
|
47
|
+
elsif !command_done and line.match?(/^\s*`.+`\s*/i)
|
48
|
+
resf += "\n#{line}"
|
49
|
+
command_done = true
|
50
|
+
elsif !explanation_done and line.match?(/^\s+[^`].+\s*/i)
|
51
|
+
resf += "\n#{line}"
|
52
|
+
explanation_done = true
|
53
|
+
elsif !example_done and line.match?(/^\s*_.+_\s*/i)
|
54
|
+
resf += "\n Example: #{line}"
|
55
|
+
example_done = true
|
56
|
+
end
|
57
|
+
end
|
58
|
+
resf += "\n\n"
|
59
|
+
help_message[key][t.scan(/\/(\w+)\.rb$/).join.to_sym] = resf
|
60
|
+
end
|
61
|
+
end
|
10
62
|
end
|
11
63
|
end
|
12
64
|
return help_message
|
@@ -13,18 +13,29 @@ class SlackSmartBot
|
|
13
13
|
ruby = ""
|
14
14
|
end
|
15
15
|
@routines[@channel_id][name][:silent] = false if !@routines[@channel_id][name].key?(:silent)
|
16
|
-
|
17
16
|
if @routines[@channel_id][name][:at] == "" or
|
18
17
|
(@routines[@channel_id][name][:at] != "" and @routines[@channel_id][name][:running] and
|
19
18
|
@routines[@channel_id][name][:next_run] != "" and Time.now.to_s >= @routines[@channel_id][name][:next_run])
|
20
19
|
if @routines[@channel_id][name][:file_path] != ""
|
21
20
|
process_to_run = "#{ruby}#{Dir.pwd}#{@routines[@channel_id][name][:file_path][1..-1]}"
|
22
21
|
process_to_run = ("cd #{project_folder} &&" + process_to_run) if defined?(project_folder)
|
23
|
-
|
22
|
+
data = {
|
23
|
+
dest: @routines[@channel_id][name][:dest],
|
24
|
+
typem: 'routine_file',
|
25
|
+
user: {id: @routines[@channel_id][name][:creator_id], name: @routines[@channel_id][name][:creator]},
|
26
|
+
files: false,
|
27
|
+
command: @routines[@channel_id][name][:file_path],
|
28
|
+
routine: true
|
29
|
+
}
|
30
|
+
save_stats(name, data: data)
|
24
31
|
stdout, stderr, status = Open3.capture3(process_to_run)
|
25
32
|
if !@routines[@channel_id][name][:silent] or (@routines[@channel_id][name][:silent] and
|
26
33
|
(!stderr.match?(/\A\s*\z/) or !stdout.match?(/\A\s*\z/)))
|
27
|
-
|
34
|
+
if @routines[@channel_id][name][:dest]!=@channel_id
|
35
|
+
respond "routine from <##{@channel_id}> *`#{name}`*: #{@routines[@channel_id][name][:file_path]}", @routines[@channel_id][name][:dest]
|
36
|
+
else
|
37
|
+
respond "routine *`#{name}`*: #{@routines[@channel_id][name][:file_path]}", @routines[@channel_id][name][:dest]
|
38
|
+
end
|
28
39
|
end
|
29
40
|
if stderr == ""
|
30
41
|
unless stdout.match?(/\A\s*\z/)
|
@@ -35,13 +46,19 @@ class SlackSmartBot
|
|
35
46
|
end
|
36
47
|
else #command
|
37
48
|
if !@routines[@channel_id][name][:silent]
|
38
|
-
|
49
|
+
if @routines[@channel_id][name][:dest]!=@channel_id
|
50
|
+
respond "routine from <##{@channel_id}> *`#{name}`*: #{@routines[@channel_id][name][:command]}", @routines[@channel_id][name][:dest]
|
51
|
+
else
|
52
|
+
respond "routine *`#{name}`*: #{@routines[@channel_id][name][:command]}", @routines[@channel_id][name][:dest]
|
53
|
+
end
|
39
54
|
end
|
40
55
|
started = Time.now
|
41
|
-
data = { channel: @
|
56
|
+
data = { channel: @channel_id,
|
57
|
+
dest: @routines[@channel_id][name][:dest],
|
42
58
|
user: @routines[@channel_id][name][:creator_id],
|
43
59
|
text: @routines[@channel_id][name][:command],
|
44
|
-
files: nil
|
60
|
+
files: nil,
|
61
|
+
routine: true }
|
45
62
|
treat_message(data)
|
46
63
|
end
|
47
64
|
# in case the routine was deleted while running the process
|
@@ -55,11 +72,34 @@ class SlackSmartBot
|
|
55
72
|
require "time"
|
56
73
|
every_in_seconds = Time.parse(@routines[@channel_id][name][:next_run]) - Time.now
|
57
74
|
elsif @routines[@channel_id][name][:at] != "" #coming from start after pause for 'at'
|
58
|
-
if
|
75
|
+
if @routines[@channel_id][name].key?(:dayweek) and @routines[@channel_id][name][:dayweek].to_s!=''
|
76
|
+
day = @routines[@channel_id][name][:dayweek]
|
77
|
+
days = ['sunday','monday','tuesday','wednesday','thursday','friday','saturday']
|
78
|
+
incr = days.index(day) - Time.now.wday
|
79
|
+
if incr < 0
|
80
|
+
incr = (7+incr)*24*60*60
|
81
|
+
else
|
82
|
+
incr = incr * 24 * 60 * 60
|
83
|
+
end
|
84
|
+
days = incr/(24*60*60)
|
85
|
+
weekly = true
|
86
|
+
else
|
87
|
+
days = 0
|
88
|
+
weekly = false
|
89
|
+
end
|
90
|
+
|
91
|
+
if started.strftime("%H:%M:%S") < @routines[@channel_id][name][:at] and days == 0
|
59
92
|
nt = @routines[@channel_id][name][:at].split(":")
|
60
93
|
next_run = Time.new(started.year, started.month, started.day, nt[0], nt[1], nt[2])
|
61
94
|
else
|
62
|
-
|
95
|
+
if days == 0 and started.strftime("%H:%M:%S") >= @routines[@channel_id][name][:at]
|
96
|
+
if weekly
|
97
|
+
days = 7
|
98
|
+
else
|
99
|
+
days = 1
|
100
|
+
end
|
101
|
+
end
|
102
|
+
next_run = started + (days * 24 * 60 * 60) # one more day/week
|
63
103
|
nt = @routines[@channel_id][name][:at].split(":")
|
64
104
|
next_run = Time.new(next_run.year, next_run.month, next_run.day, nt[0], nt[1], nt[2])
|
65
105
|
end
|
@@ -1,13 +1,7 @@
|
|
1
1
|
class SlackSmartBot
|
2
2
|
|
3
3
|
def get_channels_name_and_id
|
4
|
-
|
5
|
-
channels = client.web_client.conversations_list(
|
6
|
-
types: "private_channel,public_channel",
|
7
|
-
limit: "1000",
|
8
|
-
exclude_archived: "true",
|
9
|
-
).channels
|
10
|
-
|
4
|
+
channels = get_channels()
|
11
5
|
@channels_id = Hash.new()
|
12
6
|
@channels_name = Hash.new()
|
13
7
|
channels.each do |ch|
|
@@ -1,18 +1,17 @@
|
|
1
1
|
class SlackSmartBot
|
2
|
-
def get_help(rules_file, dest, from, only_rules
|
2
|
+
def get_help(rules_file, dest, from, only_rules, expanded)
|
3
3
|
order = {
|
4
|
-
general: [:hi_bot, :bye_bot, :bot_help, :bot_status, :use_rules, :stop_using_rules],
|
4
|
+
general: [:whats_new, :hi_bot, :bye_bot, :bot_help, :bot_status, :use_rules, :stop_using_rules, :bot_stats],
|
5
5
|
on_bot: [:ruby_code, :repl, :get_repl, :run_repl, :delete_repl, :see_repls, :add_shortcut, :delete_shortcut, :see_shortcuts],
|
6
6
|
on_bot_admin: [:extend_rules, :stop_using_rules_on, :start_bot, :pause_bot, :add_routine,
|
7
7
|
:see_routines, :start_routine, :pause_routine, :remove_routine, :run_routine]
|
8
8
|
}
|
9
|
-
# user_type: :admin, :user, :admin_master
|
10
9
|
if config.masters.include?(from)
|
11
|
-
user_type = :
|
10
|
+
user_type = :master # master admin
|
12
11
|
elsif config.admins.include?(from)
|
13
12
|
user_type = :admin
|
14
13
|
else
|
15
|
-
user_type = :user
|
14
|
+
user_type = :normal #normal user
|
16
15
|
end
|
17
16
|
# channel_type: :bot, :master_bot, :direct, :extended, :external
|
18
17
|
if dest[0] == "D"
|
@@ -25,27 +24,45 @@ class SlackSmartBot
|
|
25
24
|
channel_type = :bot
|
26
25
|
end
|
27
26
|
|
28
|
-
@
|
27
|
+
@help_messages_expanded ||= build_help("#{__dir__}/../commands", true)
|
28
|
+
@help_messages_not_expanded ||= build_help("#{__dir__}/../commands", false)
|
29
29
|
if only_rules
|
30
30
|
help = {}
|
31
|
+
elsif expanded
|
32
|
+
help = @help_messages_expanded.deep_copy[user_type]
|
31
33
|
else
|
32
|
-
help = @
|
34
|
+
help = @help_messages_not_expanded.deep_copy[user_type]
|
33
35
|
end
|
36
|
+
|
34
37
|
if rules_file != ""
|
35
|
-
help[:rules_file] =
|
36
|
-
|
37
|
-
|
38
|
-
|
38
|
+
help[:rules_file] = build_help(config.path+rules_file, expanded)[user_type].values.join("\n") + "\n"
|
39
|
+
|
40
|
+
# to get all the help from other rules files added to the main rules file by using require or load. For example general_rules.rb
|
41
|
+
res = IO.readlines(config.path+rules_file).join.scan(/$\s*(load|require)\s("|')(.+)("|')/)
|
42
|
+
rules_help = []
|
43
|
+
txt = ''
|
44
|
+
if res.size>0
|
45
|
+
res.each do |r|
|
46
|
+
begin
|
47
|
+
eval("txt = \"#{r[2]}\"")
|
48
|
+
rules_help << txt if File.exist?(txt)
|
49
|
+
rescue
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
rules_help.each do |rh|
|
54
|
+
rhelp = build_help(rh, expanded)
|
55
|
+
help[:rules_file] += rhelp[user_type].values.join("\n") + "\n"
|
39
56
|
end
|
40
57
|
end
|
41
|
-
help = remove_hash_keys(help, :admin_master) unless user_type == :
|
42
|
-
help = remove_hash_keys(help, :admin) unless user_type == :admin or user_type == :
|
58
|
+
help = remove_hash_keys(help, :admin_master) unless user_type == :master
|
59
|
+
help = remove_hash_keys(help, :admin) unless user_type == :admin or user_type == :master
|
43
60
|
help = remove_hash_keys(help, :on_master) unless channel_type == :master_bot
|
44
61
|
help = remove_hash_keys(help, :on_extended) unless channel_type == :extended
|
45
62
|
help = remove_hash_keys(help, :on_dm) unless channel_type == :direct
|
46
63
|
txt = ""
|
47
64
|
|
48
|
-
if channel_type == :bot or channel_type == :master_bot
|
65
|
+
if (channel_type == :bot or channel_type == :master_bot) and expanded
|
49
66
|
txt += "===================================
|
50
67
|
For the Smart Bot start listening to you say *hi bot*
|
51
68
|
To run a command on demand even when the Smart Bot is not listening to you:
|
@@ -56,11 +73,11 @@ class SlackSmartBot
|
|
56
73
|
*^THE_COMMAND*
|
57
74
|
*!!THE_COMMAND*\n"
|
58
75
|
end
|
59
|
-
if channel_type == :direct
|
76
|
+
if channel_type == :direct and expanded
|
60
77
|
txt += "===================================
|
61
78
|
When on a private conversation with the Smart Bot, I'm always listening to you.\n"
|
62
79
|
end
|
63
|
-
unless channel_type == :master_bot or channel_type == :extended
|
80
|
+
unless channel_type == :master_bot or channel_type == :extended or !expanded
|
64
81
|
txt += "===================================
|
65
82
|
*Commands from Channels without a bot:*
|
66
83
|
----------------------------------------------
|
@@ -121,7 +138,7 @@ class SlackSmartBot
|
|
121
138
|
|
122
139
|
if help.key?(:on_master) and help.on_master.key?(:admin_master) and help.on_master.admin_master.size > 0
|
123
140
|
txt += "===================================
|
124
|
-
*Master Admin commands:*\n"
|
141
|
+
*Master Admin commands:*\n" unless txt.include?('*Master Admin commands*')
|
125
142
|
help.on_master.admin_master.each do |k, v|
|
126
143
|
txt += v if v.is_a?(String)
|
127
144
|
end
|
@@ -133,6 +150,51 @@ class SlackSmartBot
|
|
133
150
|
@logger.info help.rules_file if config.testing
|
134
151
|
help.rules_file = help.rules_file.gsub(/^\s*\*These are specific commands.+NAME_OF_BOT THE_COMMAND`\s*$/im, "")
|
135
152
|
end
|
153
|
+
|
154
|
+
unless expanded
|
155
|
+
resf = ''
|
156
|
+
help.rules_file.split(/^\s*\-+\s*$/).each do |rule|
|
157
|
+
command_done = false
|
158
|
+
explanation_done = false
|
159
|
+
example_done = false
|
160
|
+
if rule.match?(/These are specific commands for this/i)
|
161
|
+
resf += rule
|
162
|
+
resf += "-"*50
|
163
|
+
resf += "\n"
|
164
|
+
elsif rule.match?(/To run a command on demand and add the respond on a thread/i)
|
165
|
+
resf += rule
|
166
|
+
resf += "-"*50
|
167
|
+
resf += "\n"
|
168
|
+
else
|
169
|
+
rule.split("\n").each do |line|
|
170
|
+
if line.match?(/^\s*\-+\s*/i)
|
171
|
+
resf += line
|
172
|
+
elsif !command_done and line.match?(/^\s*`.+`\s*/i)
|
173
|
+
resf += "\n#{line}"
|
174
|
+
command_done = true
|
175
|
+
elsif !explanation_done and line.match?(/^\s+[^`].+\s*/i)
|
176
|
+
resf += "\n#{line}"
|
177
|
+
explanation_done = true
|
178
|
+
elsif !example_done and line.match?(/^\s*_.+_\s*/i)
|
179
|
+
resf += "\n Example: #{line}"
|
180
|
+
example_done = true
|
181
|
+
end
|
182
|
+
end
|
183
|
+
resf += "\n\n"
|
184
|
+
end
|
185
|
+
end
|
186
|
+
unless resf.match?(/These are specific commands for this bot on this Channel/i)
|
187
|
+
if resf.match?(/\A\s*[=\-]+$/)
|
188
|
+
pre = ''
|
189
|
+
post = ''
|
190
|
+
else
|
191
|
+
pre = ('='*50) + "\n"
|
192
|
+
post = ('-'*50) + "\n"
|
193
|
+
end
|
194
|
+
resf = "#{pre}*These are specific commands for this bot on this Channel:*\n#{post}" + resf
|
195
|
+
end
|
196
|
+
help.rules_file = resf
|
197
|
+
end
|
136
198
|
txt += help.rules_file
|
137
199
|
end
|
138
200
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class SlackSmartBot
|
2
2
|
|
3
|
-
def save_stats(method)
|
3
|
+
def save_stats(method, data: {})
|
4
4
|
if config.stats
|
5
5
|
begin
|
6
6
|
require 'csv'
|
@@ -9,18 +9,31 @@ class SlackSmartBot
|
|
9
9
|
csv << ['date','bot_channel', 'bot_channel_id', 'dest_channel', 'dest_channel_id', 'type_message', 'user_name', 'user_id', 'text', 'command', 'files']
|
10
10
|
end
|
11
11
|
end
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
if data.empty?
|
13
|
+
data = {
|
14
|
+
dest: Thread.current[:dest],
|
15
|
+
typem: Thread.current[:typem],
|
16
|
+
user: Thread.current[:user],
|
17
|
+
files: Thread.current[:files?],
|
18
|
+
command: Thread.current[:command],
|
19
|
+
routine: Thread.current[:routine]
|
20
|
+
}
|
21
|
+
end
|
22
|
+
if method.to_s == 'ruby_code' and data.files
|
17
23
|
command_txt = 'ruby'
|
18
24
|
else
|
19
|
-
command_txt =
|
25
|
+
command_txt = data.command
|
20
26
|
end
|
21
27
|
|
28
|
+
if data.routine
|
29
|
+
user_name = "routine/#{data.user.name}"
|
30
|
+
user_id = "routine/#{data.user.id}"
|
31
|
+
else
|
32
|
+
user_name = data.user.name
|
33
|
+
user_id = data.user.id
|
34
|
+
end
|
22
35
|
CSV.open("#{config.stats_path}.#{Time.now.strftime("%Y-%m")}.log", "a+") do |csv|
|
23
|
-
csv << [Time.now, config.channel, @channel_id, @channels_name[dest], dest, typem,
|
36
|
+
csv << [Time.now, config.channel, @channel_id, @channels_name[data.dest], data.dest, data.typem, user_name, user_id, command_txt, method, data.files]
|
24
37
|
end
|
25
38
|
rescue Exception => exception
|
26
39
|
@logger.fatal "There was a problem on the stats"
|
@@ -3,5 +3,11 @@ class SlackSmartBot
|
|
3
3
|
file = File.open("#{config.path}/shortcuts/#{config.shortcuts_file}", "w")
|
4
4
|
file.write @shortcuts.inspect
|
5
5
|
file.close
|
6
|
+
|
7
|
+
if config.on_master_bot
|
8
|
+
file = File.open("#{config.path}/shortcuts/shortcuts_global.rb", "w")
|
9
|
+
file.write @shortcuts_global.inspect
|
10
|
+
file.close
|
11
|
+
end
|
6
12
|
end
|
7
13
|
end
|
data/whats_new.txt
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
*Version 1.9.2* Released 2021-Apr-27
|
2
|
+
|
3
|
+
- Bugfixing and small improvements
|
4
|
+
|
5
|
+
------------------------------
|
6
|
+
|
7
|
+
*Version 1.9.0* Released 2021-Mar-18
|
8
|
+
|
9
|
+
*For General users*
|
10
|
+
- Added command `what's new` that will show this.
|
11
|
+
- `bot stats` will return detailed statistics using the SmartBot. If you call it from a DM with the SmartBot you will see all stats for all Bot channels.
|
12
|
+
- Possible to create 'global' shortcuts that will be available on any SmartBot Channel.
|
13
|
+
- Added option to start a `repl` without pre-executing '.smart-bot-repl' source code in case exists. Just add `clean` before the `repl` command. For example: `clean repl Example`
|
14
|
+
- When using `Ruby` command in case the process doesn't finish in 20 seconds will be aborted.
|
15
|
+
- When creating rules/commands and asking a question now you can use 'answer' instead of '@questions'. Take a look at README.md for an example.
|
16
|
+
- Using external calls, it is possible to send to more than one bot channel the same rule: `@smart-bot on #channel1 #channel2 #channel3 echo Lala`
|
17
|
+
- `bot help` and `bot rules` return by default a short version of the commands. Call `bot help expanded` or `bot rules expanded` to get a full desciption of the commands.
|
18
|
+
- It is possible to exclude routines from results when using `bot stats`
|
19
|
+
------------------------------
|
20
|
+
*For Admin users*
|
21
|
+
- `Bot stats` now shows the top 10 users and attaches the full list of users and commands.
|
22
|
+
- Bot Stats. Now the routines are displayed as routine/USER
|
23
|
+
- When creating routines now it is possible to publish in a different channel: `add routine run_tests at 17:05 #thechannel !run api tests`
|
24
|
+
- `Turn maintenance on/off` command available
|