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.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +109 -11
  3. data/lib/slack/smart-bot/comm/ask.rb +55 -49
  4. data/lib/slack/smart-bot/comm/dont_understand.rb +1 -1
  5. data/lib/slack/smart-bot/comm/event_hello.rb +7 -3
  6. data/lib/slack/smart-bot/comm/get_channel_members.rb +9 -4
  7. data/lib/slack/smart-bot/comm/get_channels.rb +31 -16
  8. data/lib/slack/smart-bot/comm/get_user_info.rb +12 -8
  9. data/lib/slack/smart-bot/comm/get_users.rb +24 -0
  10. data/lib/slack/smart-bot/comm/react.rb +19 -2
  11. data/lib/slack/smart-bot/comm/respond.rb +217 -72
  12. data/lib/slack/smart-bot/comm/respond_direct.rb +2 -3
  13. data/lib/slack/smart-bot/comm/respond_thread.rb +5 -0
  14. data/lib/slack/smart-bot/comm/send_file.rb +38 -34
  15. data/lib/slack/smart-bot/comm/send_msg_channel.rb +27 -22
  16. data/lib/slack/smart-bot/comm/send_msg_user.rb +58 -33
  17. data/lib/slack/smart-bot/comm/unreact.rb +22 -18
  18. data/lib/slack/smart-bot/comm.rb +2 -0
  19. data/lib/slack/smart-bot/commands/general/add_announcement.rb +32 -0
  20. data/lib/slack/smart-bot/commands/general/bot_help.rb +59 -32
  21. data/lib/slack/smart-bot/commands/general/bot_stats.rb +10 -9
  22. data/lib/slack/smart-bot/commands/general/bot_status.rb +2 -4
  23. data/lib/slack/smart-bot/commands/general/bye_bot.rb +0 -7
  24. data/lib/slack/smart-bot/commands/general/delete_announcement.rb +34 -0
  25. data/lib/slack/smart-bot/commands/general/delete_share.rb +34 -0
  26. data/lib/slack/smart-bot/commands/general/hi_bot.rb +16 -11
  27. data/lib/slack/smart-bot/commands/general/leaderboard.rb +200 -0
  28. data/lib/slack/smart-bot/commands/general/see_announcements.rb +113 -0
  29. data/lib/slack/smart-bot/commands/general/see_favorite_commands.rb +54 -0
  30. data/lib/slack/smart-bot/commands/general/see_shares.rb +41 -0
  31. data/lib/slack/smart-bot/commands/general/see_statuses.rb +78 -0
  32. data/lib/slack/smart-bot/commands/general/share_messages.rb +58 -0
  33. data/lib/slack/smart-bot/commands/general/stop_using_rules.rb +11 -6
  34. data/lib/slack/smart-bot/commands/general/suggest_command.rb +30 -0
  35. data/lib/slack/smart-bot/commands/general/use_rules.rb +7 -7
  36. data/lib/slack/smart-bot/commands/general_bot_commands.rb +243 -0
  37. data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +2 -5
  38. data/lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb +32 -11
  39. data/lib/slack/smart-bot/commands/on_bot/admin/extend_rules.rb +2 -0
  40. data/lib/slack/smart-bot/commands/on_bot/admin/pause_bot.rb +4 -2
  41. data/lib/slack/smart-bot/commands/on_bot/admin/pause_routine.rb +1 -0
  42. data/lib/slack/smart-bot/commands/on_bot/admin/remove_routine.rb +2 -3
  43. data/lib/slack/smart-bot/commands/on_bot/admin/run_routine.rb +6 -1
  44. data/lib/slack/smart-bot/commands/on_bot/admin/see_result_routine.rb +32 -0
  45. data/lib/slack/smart-bot/commands/on_bot/admin/see_routines.rb +4 -2
  46. data/lib/slack/smart-bot/commands/on_bot/admin/start_bot.rb +4 -2
  47. data/lib/slack/smart-bot/commands/on_bot/admin/start_routine.rb +1 -0
  48. data/lib/slack/smart-bot/commands/on_bot/admin/stop_using_rules_on.rb +2 -0
  49. data/lib/slack/smart-bot/commands/on_bot/admin_master/react_to.rb +32 -0
  50. data/lib/slack/smart-bot/commands/on_bot/admin_master/send_message.rb +24 -0
  51. data/lib/slack/smart-bot/commands/on_bot/delete_repl.rb +2 -4
  52. data/lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb +2 -4
  53. data/lib/slack/smart-bot/commands/on_bot/get_repl.rb +2 -4
  54. data/lib/slack/smart-bot/commands/on_bot/repl.rb +5 -7
  55. data/lib/slack/smart-bot/commands/on_bot/ruby_code.rb +2 -4
  56. data/lib/slack/smart-bot/commands/on_bot/run_repl.rb +4 -5
  57. data/lib/slack/smart-bot/commands/on_bot/see_repls.rb +3 -5
  58. data/lib/slack/smart-bot/commands/on_bot/see_shortcuts.rb +2 -4
  59. data/lib/slack/smart-bot/commands/on_extended/bot_rules.rb +45 -12
  60. data/lib/slack/smart-bot/commands/on_master/admin/kill_bot_on_channel.rb +4 -1
  61. data/lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb +2 -0
  62. data/lib/slack/smart-bot/commands/on_master/admin_master/notify_message.rb +1 -0
  63. data/lib/slack/smart-bot/commands/on_master/admin_master/publish_announcements.rb +32 -0
  64. data/lib/slack/smart-bot/commands/on_master/admin_master/set_general_message.rb +38 -0
  65. data/lib/slack/smart-bot/commands/on_master/admin_master/set_maintenance.rb +8 -0
  66. data/lib/slack/smart-bot/commands/on_master/create_bot.rb +27 -14
  67. data/lib/slack/smart-bot/commands.rb +16 -0
  68. data/lib/slack/smart-bot/listen.rb +1 -3
  69. data/lib/slack/smart-bot/process.rb +212 -74
  70. data/lib/slack/smart-bot/process_first.rb +118 -37
  71. data/lib/slack/smart-bot/treat_message.rb +313 -248
  72. data/lib/slack/smart-bot/utils/build_help.rb +3 -3
  73. data/lib/slack/smart-bot/utils/create_routine_thread.rb +81 -46
  74. data/lib/slack/smart-bot/utils/get_bots_created.rb +4 -1
  75. data/lib/slack/smart-bot/utils/get_help.rb +58 -68
  76. data/lib/slack/smart-bot/utils/get_shares.rb +12 -0
  77. data/lib/slack/smart-bot/utils/has_access.rb +12 -0
  78. data/lib/slack/smart-bot/utils/save_stats.rb +2 -0
  79. data/lib/slack/smart-bot/utils/save_status.rb +52 -0
  80. data/lib/slack/smart-bot/utils.rb +3 -0
  81. data/lib/slack-smart-bot.rb +45 -4
  82. data/lib/slack-smart-bot_general_commands.rb +46 -0
  83. data/lib/slack-smart-bot_general_rules.rb +5 -2
  84. data/lib/slack-smart-bot_rules.rb +43 -17
  85. data/whats_new.txt +32 -20
  86. 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*/i)
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
- if @routines[@channel_id][name][:file_path] != ""
20
- process_to_run = "#{ruby}#{Dir.pwd}#{@routines[@channel_id][name][:file_path][1..-1]}"
21
- process_to_run = ("cd #{project_folder} &&" + process_to_run) if defined?(project_folder)
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)
31
- stdout, stderr, status = Open3.capture3(process_to_run)
32
- if !@routines[@channel_id][name][:silent] or (@routines[@channel_id][name][:silent] and
33
- (!stderr.match?(/\A\s*\z/) or !stdout.match?(/\A\s*\z/)))
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]
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
- respond "routine *`#{name}`*: #{@routines[@channel_id][name][:file_path]}", @routines[@channel_id][name][:dest]
62
+ File.write("#{config.path}/routines/#{@channel_id}/#{name}_output.txt", stdout.to_s+stderr.to_s, mode: "a+")
38
63
  end
39
- end
40
- if stderr == ""
41
- unless stdout.match?(/\A\s*\z/)
42
- respond stdout, @routines[@channel_id][name][:dest]
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
- else
45
- respond "#{stdout} #{stderr}", @routines[@channel_id][name][:dest]
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
- else #command
48
- if !@routines[@channel_id][name][:silent]
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
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
- started = Time.now
56
- data = { channel: @channel_id,
57
- dest: @routines[@channel_id][name][:dest],
58
- user: @routines[@channel_id][name][:creator_id],
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
- unless channel_type == :direct
97
- txt += "===================================
98
- *General commands even when the Smart Bot is not listening to you:*\n"
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?(:on_bot)
109
- unless channel_type == :direct
110
- txt += "===================================
111
- *General commands only when the Smart Bot is listening to you or on demand:*\n"
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
- *Master Admin commands:*\n"
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
- *Master Admin commands:*\n" unless txt.include?('*Master Admin commands*')
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
- 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
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