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
@@ -9,8 +9,8 @@ class SlackSmartBot
|
|
9
9
|
else
|
10
10
|
return help_message
|
11
11
|
end
|
12
|
-
|
13
12
|
files.each do |t|
|
13
|
+
|
14
14
|
if Dir.exist?(t)
|
15
15
|
res = build_help(t, expanded)
|
16
16
|
help_message[:master][t.scan(/\/(\w+)$/).join.to_sym] = res[:master]
|
@@ -50,8 +50,8 @@ class SlackSmartBot
|
|
50
50
|
elsif !explanation_done and line.match?(/^\s+[^`].+\s*/i)
|
51
51
|
resf += "\n#{line}"
|
52
52
|
explanation_done = true
|
53
|
-
elsif !example_done and line.match?(/^\s*_.+_\s
|
54
|
-
resf += "\n Example: #{line}"
|
53
|
+
elsif !example_done and line.match?(/^\s*>?\s*_.+_\s*$/i)
|
54
|
+
resf += "\n Example: #{line.gsub(/^\s*>/,'')}"
|
55
55
|
example_done = true
|
56
56
|
end
|
57
57
|
end
|
@@ -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,63 +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
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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
|
52
|
+
end
|
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
|
36
61
|
else
|
37
|
-
|
62
|
+
File.write("#{config.path}/routines/#{@channel_id}/#{name}_output.txt", stdout.to_s+stderr.to_s, mode: "a+")
|
38
63
|
end
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
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
|
43
71
|
end
|
44
|
-
|
45
|
-
|
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)
|
46
82
|
end
|
47
|
-
|
48
|
-
if !@routines[@channel_id]
|
49
|
-
|
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
|
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
|
54
86
|
end
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
text: @routines[@channel_id][name][:command],
|
60
|
-
files: nil,
|
61
|
-
routine: true }
|
62
|
-
treat_message(data)
|
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
|
63
91
|
end
|
64
|
-
# in case the routine was deleted while running the process
|
65
|
-
if !@routines.key?(@channel_id) or !@routines[@channel_id].key?(name)
|
66
|
-
Thread.exit
|
67
|
-
end
|
68
|
-
@routines[@channel_id][name][:last_run] = started.to_s
|
69
92
|
end
|
70
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
|
71
94
|
elapsed = 0
|
72
95
|
require "time"
|
73
96
|
every_in_seconds = Time.parse(@routines[@channel_id][name][:next_run]) - Time.now
|
74
97
|
elsif @routines[@channel_id][name][:at] != "" #coming from start after pause for 'at'
|
75
|
-
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
|
+
|
76
101
|
day = @routines[@channel_id][name][:dayweek]
|
77
102
|
days = ['sunday','monday','tuesday','wednesday','thursday','friday','saturday']
|
78
103
|
incr = days.index(day) - Time.now.wday
|
@@ -83,6 +108,16 @@ class SlackSmartBot
|
|
83
108
|
end
|
84
109
|
days = incr/(24*60*60)
|
85
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
|
86
121
|
else
|
87
122
|
days = 0
|
88
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,10 +1,10 @@
|
|
1
1
|
class SlackSmartBot
|
2
|
-
def get_help(rules_file, dest, from, only_rules, expanded)
|
2
|
+
def get_help(rules_file, dest, from, only_rules, expanded, descriptions: true, only_normal_user: false)
|
3
3
|
order = {
|
4
|
-
general: [:whats_new, :hi_bot, :bye_bot, :bot_help, :bot_status, :use_rules, :stop_using_rules, :bot_stats],
|
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
9
|
if config.masters.include?(from)
|
10
10
|
user_type = :master # master admin
|
@@ -13,6 +13,7 @@ class SlackSmartBot
|
|
13
13
|
else
|
14
14
|
user_type = :normal #normal user
|
15
15
|
end
|
16
|
+
|
16
17
|
# channel_type: :bot, :master_bot, :direct, :extended, :external
|
17
18
|
if dest[0] == "D"
|
18
19
|
channel_type = :direct
|
@@ -24,6 +25,15 @@ class SlackSmartBot
|
|
24
25
|
channel_type = :bot
|
25
26
|
end
|
26
27
|
|
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
|
+
|
27
37
|
@help_messages_expanded ||= build_help("#{__dir__}/../commands", true)
|
28
38
|
@help_messages_not_expanded ||= build_help("#{__dir__}/../commands", false)
|
29
39
|
if only_rules
|
@@ -33,7 +43,6 @@ class SlackSmartBot
|
|
33
43
|
else
|
34
44
|
help = @help_messages_not_expanded.deep_copy[user_type]
|
35
45
|
end
|
36
|
-
|
37
46
|
if rules_file != ""
|
38
47
|
help[:rules_file] = build_help(config.path+rules_file, expanded)[user_type].values.join("\n") + "\n"
|
39
48
|
|
@@ -55,6 +64,11 @@ class SlackSmartBot
|
|
55
64
|
help[:rules_file] += rhelp[user_type].values.join("\n") + "\n"
|
56
65
|
end
|
57
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"
|
71
|
+
end
|
58
72
|
help = remove_hash_keys(help, :admin_master) unless user_type == :master
|
59
73
|
help = remove_hash_keys(help, :admin) unless user_type == :admin or user_type == :master
|
60
74
|
help = remove_hash_keys(help, :on_master) unless channel_type == :master_bot
|
@@ -62,7 +76,7 @@ class SlackSmartBot
|
|
62
76
|
help = remove_hash_keys(help, :on_dm) unless channel_type == :direct
|
63
77
|
txt = ""
|
64
78
|
|
65
|
-
if (channel_type == :bot or channel_type == :master_bot) and expanded
|
79
|
+
if (channel_type == :bot or channel_type == :master_bot) and expanded and descriptions
|
66
80
|
txt += "===================================
|
67
81
|
For the Smart Bot start listening to you say *hi bot*
|
68
82
|
To run a command on demand even when the Smart Bot is not listening to you:
|
@@ -73,11 +87,11 @@ class SlackSmartBot
|
|
73
87
|
*^THE_COMMAND*
|
74
88
|
*!!THE_COMMAND*\n"
|
75
89
|
end
|
76
|
-
if channel_type == :direct and expanded
|
90
|
+
if channel_type == :direct and expanded and descriptions
|
77
91
|
txt += "===================================
|
78
92
|
When on a private conversation with the Smart Bot, I'm always listening to you.\n"
|
79
93
|
end
|
80
|
-
unless channel_type == :master_bot or channel_type == :extended or !expanded
|
94
|
+
unless channel_type == :master_bot or channel_type == :extended or !expanded or !descriptions
|
81
95
|
txt += "===================================
|
82
96
|
*Commands from Channels without a bot:*
|
83
97
|
----------------------------------------------
|
@@ -86,16 +100,22 @@ class SlackSmartBot
|
|
86
100
|
It will run the supplied command using the rules on the channel supplied.
|
87
101
|
You need to join the specified channel to be able to use those rules.
|
88
102
|
Also you can use this command to call another bot from a channel with a running bot.
|
89
|
-
|
103
|
+
\n"
|
104
|
+
txt +="
|
90
105
|
The commands you will be able to use from a channel without a bot:
|
91
106
|
*bot rules*, *ruby CODE*, *add shortcut NAME: COMMAND*, *delete shortcut NAME*, *see shortcuts*, *shortcut NAME*
|
92
107
|
*And all the specific rules of the Channel*\n"
|
93
108
|
end
|
94
109
|
|
95
|
-
if help.key?(:general)
|
96
|
-
|
97
|
-
|
98
|
-
|
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
|
99
119
|
end
|
100
120
|
order.general.each do |o|
|
101
121
|
txt += help.general[o]
|
@@ -105,19 +125,29 @@ class SlackSmartBot
|
|
105
125
|
end
|
106
126
|
end
|
107
127
|
|
108
|
-
if help.key?(:
|
109
|
-
|
110
|
-
|
111
|
-
|
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
|
112
143
|
end
|
113
144
|
order.on_bot.each do |o|
|
114
145
|
txt += help.on_bot[o]
|
115
146
|
end
|
116
147
|
end
|
117
|
-
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
|
118
149
|
txt += "===================================
|
119
|
-
*Admin commands:*\n"
|
120
|
-
txt += "\n\n"
|
150
|
+
*Admin commands:*\n\n" if descriptions
|
121
151
|
order.on_bot_admin.each do |o|
|
122
152
|
txt += help.on_bot.admin[o]
|
123
153
|
end
|
@@ -128,76 +158,36 @@ class SlackSmartBot
|
|
128
158
|
end
|
129
159
|
end
|
130
160
|
|
131
|
-
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
|
132
162
|
txt += "===================================
|
133
|
-
|
163
|
+
*Master Admin commands:*\n" if descriptions
|
134
164
|
help.on_bot.admin_master.each do |k, v|
|
135
165
|
txt += v if v.is_a?(String)
|
136
166
|
end
|
137
167
|
end
|
138
168
|
|
139
|
-
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
|
140
170
|
txt += "===================================
|
141
|
-
|
171
|
+
*Master Admin commands:*\n" unless txt.include?('*Master Admin commands*') or !descriptions
|
142
172
|
help.on_master.admin_master.each do |k, v|
|
143
173
|
txt += v if v.is_a?(String)
|
144
174
|
end
|
145
175
|
end
|
146
176
|
|
147
|
-
if help.key?(:rules_file)
|
177
|
+
if help.key?(:rules_file) and channel_type != :external
|
148
178
|
@logger.info channel_type if config.testing
|
149
179
|
if channel_type == :extended or channel_type == :direct
|
150
180
|
@logger.info help.rules_file if config.testing
|
151
181
|
help.rules_file = help.rules_file.gsub(/^\s*\*These are specific commands.+NAME_OF_BOT THE_COMMAND`\s*$/im, "")
|
152
182
|
end
|
153
183
|
|
154
|
-
|
155
|
-
|
156
|
-
|
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
|
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
|
197
187
|
end
|
188
|
+
|
198
189
|
txt += help.rules_file
|
199
190
|
end
|
200
|
-
|
201
191
|
return txt
|
202
192
|
end
|
203
193
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class SlackSmartBot
|
2
|
+
|
3
|
+
def get_shares()
|
4
|
+
channel = @channels_name[@channel_id]
|
5
|
+
if File.exist?("#{config.path}/shares/#{channel}.csv")
|
6
|
+
"#{config.path}/shares/#{channel}.csv"
|
7
|
+
t = CSV.table("#{config.path}/shares/#{channel}.csv", headers: ['share_id', 'user_deleted', 'user_created', 'date', 'time', 'type', 'to_channel', 'condition'])
|
8
|
+
t.delete_if {|row| row[:user_deleted] != ''}
|
9
|
+
@shares[channel] = t
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class SlackSmartBot
|
2
|
+
def has_access?(method, user=nil)
|
3
|
+
user = Thread.current[:user] if user.nil?
|
4
|
+
if config[:allow_access].key?(method) and !config[:allow_access][method].include?(user.name) and !config[:allow_access][method].include?(user.id) and
|
5
|
+
(!user.key?(:enterprise_user) or ( user.key?(:enterprise_user) and !config[:allow_access][method].include?(user[:enterprise_user].id)))
|
6
|
+
respond "You don't have access to use this command, please contact an Admin to be able to use it: <@#{config.admins.join(">, <@")}>"
|
7
|
+
return false
|
8
|
+
else
|
9
|
+
return true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|