slack-smart-bot 1.8.1 → 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 +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
@@ -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
|
+
files.each do |t|
|
13
|
+
|
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*_.+_\s*$/i)
|
54
|
+
resf += "\n Example: #{line.gsub(/^\s*>/,'')}"
|
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
|
@@ -1,11 +1,15 @@
|
|
1
1
|
class SlackSmartBot
|
2
2
|
|
3
|
-
def create_routine_thread(name)
|
3
|
+
def create_routine_thread(name, hroutine)
|
4
4
|
t = Thread.new do
|
5
5
|
while @routines.key?(@channel_id) and @routines[@channel_id].key?(name)
|
6
6
|
@routines[@channel_id][name][:thread] = Thread.current
|
7
7
|
started = Time.now
|
8
8
|
if @status == :on and @routines[@channel_id][name][:status] == :on
|
9
|
+
if !@routines[@channel_id][name].key?(:creator_id) or @routines[@channel_id][name][:creator_id].to_s == ''
|
10
|
+
user_info = @users.select{|u| u.name == @routines[@channel_id][name][:creator]}[-1]
|
11
|
+
@routines[@channel_id][name][:creator_id] = user_info.id unless user_info.nil? or user_info.empty?
|
12
|
+
end
|
9
13
|
@logger.info "Routine: #{@routines[@channel_id][name].inspect}"
|
10
14
|
if @routines[@channel_id][name][:file_path].match?(/\.rb$/i)
|
11
15
|
ruby = "ruby "
|
@@ -16,45 +20,84 @@ class SlackSmartBot
|
|
16
20
|
if @routines[@channel_id][name][:at] == "" or
|
17
21
|
(@routines[@channel_id][name][:at] != "" and @routines[@channel_id][name][:running] and
|
18
22
|
@routines[@channel_id][name][:next_run] != "" and Time.now.to_s >= @routines[@channel_id][name][:next_run])
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
23
|
+
|
24
|
+
if !@routines[@channel_id][name].key?(:dayweek) or
|
25
|
+
(@routines[@channel_id][name].key?(:dayweek) and @routines[@channel_id][name][:dayweek].to_s!='weekday' and @routines[@channel_id][name][:dayweek].to_s!='weekend') or
|
26
|
+
(@routines[@channel_id][name].key?(:dayweek) and @routines[@channel_id][name][:dayweek].to_s=='weekday' and Date.today.wday>=1 and Date.today.wday<=5) or
|
27
|
+
(@routines[@channel_id][name].key?(:dayweek) and @routines[@channel_id][name][:dayweek].to_s=='weekend' and (Date.today.wday==6 or Date.today.wday==0))
|
28
|
+
File.delete "#{config.path}/routines/#{@channel_id}/#{name}_output.txt" if File.exists?("#{config.path}/routines/#{@channel_id}/#{name}_output.txt")
|
29
|
+
if @routines[@channel_id][name][:file_path] != ""
|
30
|
+
process_to_run = "#{ruby}#{Dir.pwd}#{@routines[@channel_id][name][:file_path][1..-1]}"
|
31
|
+
process_to_run = ("cd #{project_folder} &&" + process_to_run) if defined?(project_folder)
|
32
|
+
data = {
|
33
|
+
dest: @routines[@channel_id][name][:dest],
|
34
|
+
typem: 'routine_file',
|
35
|
+
user: {id: @routines[@channel_id][name][:creator_id], name: @routines[@channel_id][name][:creator]},
|
36
|
+
files: false,
|
37
|
+
command: @routines[@channel_id][name][:file_path],
|
38
|
+
routine: true,
|
39
|
+
routine_name: name,
|
40
|
+
routine_type: hroutine[:routine_type]
|
41
|
+
}
|
42
|
+
save_stats(name, data: data)
|
43
|
+
stdout, stderr, status = Open3.capture3(process_to_run)
|
44
|
+
if !@routines[@channel_id][name][:silent]
|
45
|
+
unless config.on_maintenance
|
46
|
+
if @routines[@channel_id][name][:dest]!=@channel_id
|
47
|
+
respond "routine from <##{@channel_id}> *`#{name}`*: #{@routines[@channel_id][name][:file_path]}", @routines[@channel_id][name][:dest]
|
48
|
+
else
|
49
|
+
respond "routine *`#{name}`*: #{@routines[@channel_id][name][:file_path]}", @routines[@channel_id][name][:dest]
|
50
|
+
end
|
51
|
+
end
|
31
52
|
end
|
32
|
-
|
33
|
-
|
53
|
+
if hroutine[:routine_type].to_s!='bgroutine'
|
54
|
+
if stderr == ""
|
55
|
+
unless stdout.match?(/\A\s*\z/)
|
56
|
+
respond stdout, @routines[@channel_id][name][:dest]
|
57
|
+
end
|
58
|
+
else
|
59
|
+
respond "#{stdout} #{stderr}", @routines[@channel_id][name][:dest]
|
60
|
+
end
|
61
|
+
else
|
62
|
+
File.write("#{config.path}/routines/#{@channel_id}/#{name}_output.txt", stdout.to_s+stderr.to_s, mode: "a+")
|
63
|
+
end
|
64
|
+
else #command
|
65
|
+
if !@routines[@channel_id][name][:silent] and !config.on_maintenance
|
66
|
+
if @routines[@channel_id][name][:dest]!=@channel_id
|
67
|
+
respond "routine from <##{@channel_id}> *`#{name}`*: #{@routines[@channel_id][name][:command]}", @routines[@channel_id][name][:dest]
|
68
|
+
else
|
69
|
+
respond "routine *`#{name}`*: #{@routines[@channel_id][name][:command]}", @routines[@channel_id][name][:dest]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
started = Time.now
|
73
|
+
data = { channel: @channel_id,
|
74
|
+
dest: @routines[@channel_id][name][:dest],
|
75
|
+
user: @routines[@channel_id][name][:creator_id],
|
76
|
+
text: @routines[@channel_id][name][:command],
|
77
|
+
files: nil,
|
78
|
+
routine: true,
|
79
|
+
routine_name: name,
|
80
|
+
routine_type: hroutine[:routine_type] }
|
81
|
+
treat_message(data)
|
34
82
|
end
|
35
|
-
|
36
|
-
if !@routines[@channel_id]
|
37
|
-
|
83
|
+
# in case the routine was deleted while running the process
|
84
|
+
if !@routines.key?(@channel_id) or !@routines[@channel_id].key?(name)
|
85
|
+
Thread.exit
|
38
86
|
end
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
files: nil }
|
44
|
-
treat_message(data)
|
45
|
-
end
|
46
|
-
# in case the routine was deleted while running the process
|
47
|
-
if !@routines.key?(@channel_id) or !@routines[@channel_id].key?(name)
|
48
|
-
Thread.exit
|
87
|
+
@routines[@channel_id][name][:last_run] = started.to_s
|
88
|
+
elsif (@routines[@channel_id][name].key?(:dayweek) and @routines[@channel_id][name][:dayweek].to_s=='weekday' and (Date.today.wday==6 or Date.today.wday==0)) or
|
89
|
+
(@routines[@channel_id][name].key?(:dayweek) and @routines[@channel_id][name][:dayweek].to_s=='weekend' and Date.today.wday>=1 and Date.today.wday<=5)
|
90
|
+
@routines[@channel_id][name][:last_run] = started.to_s
|
49
91
|
end
|
50
|
-
@routines[@channel_id][name][:last_run] = started.to_s
|
51
92
|
end
|
52
93
|
if @routines[@channel_id][name][:last_run] == "" and @routines[@channel_id][name][:next_run] != "" #for the first create_routine of one routine with at
|
53
94
|
elapsed = 0
|
54
95
|
require "time"
|
55
96
|
every_in_seconds = Time.parse(@routines[@channel_id][name][:next_run]) - Time.now
|
56
97
|
elsif @routines[@channel_id][name][:at] != "" #coming from start after pause for 'at'
|
57
|
-
if @routines[@channel_id][name].key?(:dayweek) and @routines[@channel_id][name][:dayweek].to_s!=''
|
98
|
+
if @routines[@channel_id][name].key?(:dayweek) and @routines[@channel_id][name][:dayweek].to_s!=''and
|
99
|
+
@routines[@channel_id][name][:dayweek].to_s!='weekend' and @routines[@channel_id][name][:dayweek].to_s!='weekday'
|
100
|
+
|
58
101
|
day = @routines[@channel_id][name][:dayweek]
|
59
102
|
days = ['sunday','monday','tuesday','wednesday','thursday','friday','saturday']
|
60
103
|
incr = days.index(day) - Time.now.wday
|
@@ -65,6 +108,16 @@ class SlackSmartBot
|
|
65
108
|
end
|
66
109
|
days = incr/(24*60*60)
|
67
110
|
weekly = true
|
111
|
+
elsif @routines[@channel_id][name].key?(:dayweek) and @routines[@channel_id][name][:dayweek].to_s!='' and
|
112
|
+
@routines[@channel_id][name][:dayweek].to_s=='weekend'
|
113
|
+
|
114
|
+
weekly = false
|
115
|
+
days = 0
|
116
|
+
elsif @routines[@channel_id][name].key?(:dayweek) and @routines[@channel_id][name][:dayweek].to_s!='' and
|
117
|
+
@routines[@channel_id][name][:dayweek].to_s=='weekday'
|
118
|
+
|
119
|
+
weekly = false
|
120
|
+
days = 0
|
68
121
|
else
|
69
122
|
days = 0
|
70
123
|
weekly = false
|
@@ -1,7 +1,9 @@
|
|
1
1
|
class SlackSmartBot
|
2
2
|
def get_bots_created
|
3
3
|
if File.exist?(config.file_path.gsub(".rb", "_bots.rb"))
|
4
|
+
|
4
5
|
if !defined?(@datetime_bots_created) or @datetime_bots_created != File.mtime(config.file_path.gsub(".rb", "_bots.rb"))
|
6
|
+
|
5
7
|
file_conf = IO.readlines(config.file_path.gsub(".rb", "_bots.rb")).join
|
6
8
|
if file_conf.to_s() == ""
|
7
9
|
@bots_created = {}
|
@@ -16,8 +18,9 @@ class SlackSmartBot
|
|
16
18
|
@extended_from[ch] = [] unless @extended_from.key?(ch)
|
17
19
|
@extended_from[ch] << k
|
18
20
|
end
|
21
|
+
v[:rules_file] ||= ''
|
19
22
|
v[:rules_file].gsub!(/^\./, '')
|
20
|
-
end
|
23
|
+
end
|
21
24
|
end
|
22
25
|
end
|
23
26
|
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,19 +1,19 @@
|
|
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, descriptions: true, only_normal_user: false)
|
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, :suggest_command, :bot_status, :use_rules, :stop_using_rules, :bot_stats, :leaderboard],
|
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
|
-
:see_routines, :start_routine, :pause_routine, :remove_routine, :run_routine]
|
7
|
+
:see_routines, :start_routine, :pause_routine, :remove_routine, :see_result_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
|
16
|
+
|
17
17
|
# channel_type: :bot, :master_bot, :direct, :extended, :external
|
18
18
|
if dest[0] == "D"
|
19
19
|
channel_type = :direct
|
@@ -25,27 +25,58 @@ class SlackSmartBot
|
|
25
25
|
channel_type = :bot
|
26
26
|
end
|
27
27
|
|
28
|
-
|
28
|
+
if Thread.current[:typem] == :on_pg or Thread.current[:typem] == :on_pub
|
29
|
+
channel_type = :external
|
30
|
+
end
|
31
|
+
|
32
|
+
if only_normal_user
|
33
|
+
user_type = :normal
|
34
|
+
channel_type = :bot
|
35
|
+
end
|
36
|
+
|
37
|
+
@help_messages_expanded ||= build_help("#{__dir__}/../commands", true)
|
38
|
+
@help_messages_not_expanded ||= build_help("#{__dir__}/../commands", false)
|
29
39
|
if only_rules
|
30
40
|
help = {}
|
41
|
+
elsif expanded
|
42
|
+
help = @help_messages_expanded.deep_copy[user_type]
|
31
43
|
else
|
32
|
-
help = @
|
44
|
+
help = @help_messages_not_expanded.deep_copy[user_type]
|
33
45
|
end
|
34
46
|
if rules_file != ""
|
35
|
-
help[:rules_file] =
|
36
|
-
|
37
|
-
|
38
|
-
|
47
|
+
help[:rules_file] = build_help(config.path+rules_file, expanded)[user_type].values.join("\n") + "\n"
|
48
|
+
|
49
|
+
# 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
|
50
|
+
res = IO.readlines(config.path+rules_file).join.scan(/$\s*(load|require)\s("|')(.+)("|')/)
|
51
|
+
rules_help = []
|
52
|
+
txt = ''
|
53
|
+
if res.size>0
|
54
|
+
res.each do |r|
|
55
|
+
begin
|
56
|
+
eval("txt = \"#{r[2]}\"")
|
57
|
+
rules_help << txt if File.exist?(txt)
|
58
|
+
rescue
|
59
|
+
end
|
60
|
+
end
|
39
61
|
end
|
62
|
+
rules_help.each do |rh|
|
63
|
+
rhelp = build_help(rh, expanded)
|
64
|
+
help[:rules_file] += rhelp[user_type].values.join("\n") + "\n"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
help[:general_commands_file] = build_help("#{__dir__}/../commands/general_bot_commands.rb", expanded)[user_type].values.join("\n") + "\n" unless only_rules
|
69
|
+
if File.exists?(config.path + '/rules/general_commands.rb') and !only_rules
|
70
|
+
help[:general_commands_file] += build_help(config.path+'/rules/general_commands.rb', expanded)[user_type].values.join("\n") + "\n"
|
40
71
|
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 == :
|
72
|
+
help = remove_hash_keys(help, :admin_master) unless user_type == :master
|
73
|
+
help = remove_hash_keys(help, :admin) unless user_type == :admin or user_type == :master
|
43
74
|
help = remove_hash_keys(help, :on_master) unless channel_type == :master_bot
|
44
75
|
help = remove_hash_keys(help, :on_extended) unless channel_type == :extended
|
45
76
|
help = remove_hash_keys(help, :on_dm) unless channel_type == :direct
|
46
77
|
txt = ""
|
47
78
|
|
48
|
-
if channel_type == :bot or channel_type == :master_bot
|
79
|
+
if (channel_type == :bot or channel_type == :master_bot) and expanded and descriptions
|
49
80
|
txt += "===================================
|
50
81
|
For the Smart Bot start listening to you say *hi bot*
|
51
82
|
To run a command on demand even when the Smart Bot is not listening to you:
|
@@ -56,11 +87,11 @@ class SlackSmartBot
|
|
56
87
|
*^THE_COMMAND*
|
57
88
|
*!!THE_COMMAND*\n"
|
58
89
|
end
|
59
|
-
if channel_type == :direct
|
90
|
+
if channel_type == :direct and expanded and descriptions
|
60
91
|
txt += "===================================
|
61
92
|
When on a private conversation with the Smart Bot, I'm always listening to you.\n"
|
62
93
|
end
|
63
|
-
unless channel_type == :master_bot or channel_type == :extended
|
94
|
+
unless channel_type == :master_bot or channel_type == :extended or !expanded or !descriptions
|
64
95
|
txt += "===================================
|
65
96
|
*Commands from Channels without a bot:*
|
66
97
|
----------------------------------------------
|
@@ -69,16 +100,22 @@ class SlackSmartBot
|
|
69
100
|
It will run the supplied command using the rules on the channel supplied.
|
70
101
|
You need to join the specified channel to be able to use those rules.
|
71
102
|
Also you can use this command to call another bot from a channel with a running bot.
|
72
|
-
|
103
|
+
\n"
|
104
|
+
txt +="
|
73
105
|
The commands you will be able to use from a channel without a bot:
|
74
106
|
*bot rules*, *ruby CODE*, *add shortcut NAME: COMMAND*, *delete shortcut NAME*, *see shortcuts*, *shortcut NAME*
|
75
107
|
*And all the specific rules of the Channel*\n"
|
76
108
|
end
|
77
109
|
|
78
|
-
if help.key?(:general)
|
79
|
-
|
80
|
-
|
81
|
-
|
110
|
+
if help.key?(:general) and channel_type != :external and channel_type != :extended
|
111
|
+
if descriptions
|
112
|
+
if channel_type == :direct
|
113
|
+
txt += "===================================
|
114
|
+
*General commands:*\n"
|
115
|
+
else
|
116
|
+
txt += "===================================
|
117
|
+
*General commands even when the Smart Bot is not listening to you:*\n"
|
118
|
+
end
|
82
119
|
end
|
83
120
|
order.general.each do |o|
|
84
121
|
txt += help.general[o]
|
@@ -88,19 +125,29 @@ class SlackSmartBot
|
|
88
125
|
end
|
89
126
|
end
|
90
127
|
|
91
|
-
if help.key?(:
|
92
|
-
|
93
|
-
|
94
|
-
|
128
|
+
if help.key?(:general_commands_file)
|
129
|
+
txt += "===================================
|
130
|
+
*General commands on any channel where the Smart Bot is a member:*\n" if descriptions
|
131
|
+
txt += help.general_commands_file
|
132
|
+
end
|
133
|
+
|
134
|
+
if help.key?(:on_bot) and channel_type != :external and channel_type != :extended
|
135
|
+
if descriptions
|
136
|
+
if channel_type == :direct
|
137
|
+
txt += "===================================
|
138
|
+
*General commands on bot, DM or on external call on demand:*\n"
|
139
|
+
else
|
140
|
+
txt += "===================================
|
141
|
+
*General commands only when the Smart Bot is listening to you or on demand:*\n"
|
142
|
+
end
|
95
143
|
end
|
96
144
|
order.on_bot.each do |o|
|
97
145
|
txt += help.on_bot[o]
|
98
146
|
end
|
99
147
|
end
|
100
|
-
if help.key?(:on_bot) and help.on_bot.key?(:admin)
|
148
|
+
if help.key?(:on_bot) and help.on_bot.key?(:admin) and channel_type != :external and channel_type != :extended
|
101
149
|
txt += "===================================
|
102
|
-
*Admin commands:*\n"
|
103
|
-
txt += "\n\n"
|
150
|
+
*Admin commands:*\n\n" if descriptions
|
104
151
|
order.on_bot_admin.each do |o|
|
105
152
|
txt += help.on_bot.admin[o]
|
106
153
|
end
|
@@ -111,31 +158,36 @@ class SlackSmartBot
|
|
111
158
|
end
|
112
159
|
end
|
113
160
|
|
114
|
-
if help.key?(:on_bot) and help.on_bot.key?(:admin_master) and help.on_bot.admin_master.size > 0
|
161
|
+
if help.key?(:on_bot) and help.on_bot.key?(:admin_master) and help.on_bot.admin_master.size > 0 and channel_type != :external and channel_type != :extended
|
115
162
|
txt += "===================================
|
116
|
-
|
163
|
+
*Master Admin commands:*\n" if descriptions
|
117
164
|
help.on_bot.admin_master.each do |k, v|
|
118
165
|
txt += v if v.is_a?(String)
|
119
166
|
end
|
120
167
|
end
|
121
168
|
|
122
|
-
if help.key?(:on_master) and help.on_master.key?(:admin_master) and help.on_master.admin_master.size > 0
|
169
|
+
if help.key?(:on_master) and help.on_master.key?(:admin_master) and help.on_master.admin_master.size > 0 and channel_type != :external and channel_type != :extended
|
123
170
|
txt += "===================================
|
124
|
-
|
171
|
+
*Master Admin commands:*\n" unless txt.include?('*Master Admin commands*') or !descriptions
|
125
172
|
help.on_master.admin_master.each do |k, v|
|
126
173
|
txt += v if v.is_a?(String)
|
127
174
|
end
|
128
175
|
end
|
129
176
|
|
130
|
-
if help.key?(:rules_file)
|
177
|
+
if help.key?(:rules_file) and channel_type != :external
|
131
178
|
@logger.info channel_type if config.testing
|
132
179
|
if channel_type == :extended or channel_type == :direct
|
133
180
|
@logger.info help.rules_file if config.testing
|
134
181
|
help.rules_file = help.rules_file.gsub(/^\s*\*These are specific commands.+NAME_OF_BOT THE_COMMAND`\s*$/im, "")
|
135
182
|
end
|
183
|
+
|
184
|
+
if !help.rules_file.to_s.include?('These are specific commands') and help.rules_file!=''
|
185
|
+
txt += "===================================
|
186
|
+
*Specific commands on this Channel, call them !THE_COMMAND or !!THE_COMMAND:*\n" if descriptions
|
187
|
+
end
|
188
|
+
|
136
189
|
txt += help.rules_file
|
137
190
|
end
|
138
|
-
|
139
191
|
return txt
|
140
192
|
end
|
141
193
|
end
|