slack-smart-bot 1.7.0 → 1.9.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|