slack-smart-bot 1.9.2 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -2,31 +2,36 @@ class SlackSmartBot
2
2
 
3
3
  # to: (String) Channel name or id
4
4
  # msg: (String) message to send
5
- def send_msg_channel(to, msg)
5
+ def send_msg_channel(to, msg, unfurl_links: true, unfurl_media: true)
6
6
  unless msg == ""
7
- get_channels_name_and_id() unless @channels_name.key?(to) or @channels_id.key?(to)
8
- if @channels_name.key?(to) #it is an id
9
- channel_id = to
10
- elsif @channels_id.key?(to) #it is a channel name
11
- channel_id = @channels_id[to]
12
- else
13
- @logger.fatal "Channel: #{to} not found. Message: #{msg}"
14
- end
15
- if config[:simulate]
16
- open("#{config.path}/buffer_complete.log", "a") { |f|
17
- f.puts "|#{channel_id}|#{config[:nick_id]}|#{config[:nick]}|#{msg}~~~"
18
- }
19
- else
20
- if Thread.current[:on_thread]
21
- client.message(channel: channel_id, text: msg, as_user: true, thread_ts: Thread.current[:thread_ts])
7
+ begin
8
+ get_channels_name_and_id() unless @channels_name.key?(to) or @channels_id.key?(to)
9
+ if @channels_name.key?(to) #it is an id
10
+ channel_id = to
11
+ elsif @channels_id.key?(to) #it is a channel name
12
+ channel_id = @channels_id[to]
22
13
  else
23
- client.message(channel: channel_id, text: msg, as_user: true)
14
+ @logger.fatal "Channel: #{to} not found. Message: #{msg}"
24
15
  end
25
- end
26
- if config[:testing] and config.on_master_bot
27
- open("#{config.path}/buffer.log", "a") { |f|
28
- f.puts "|#{channel_id}|#{config[:nick_id]}|#{config[:nick]}|#{msg}"
29
- }
16
+ if config[:simulate]
17
+ open("#{config.path}/buffer_complete.log", "a") { |f|
18
+ f.puts "|#{channel_id}|#{config[:nick_id]}|#{config[:nick]}|#{msg}~~~"
19
+ }
20
+ else
21
+ if Thread.current[:on_thread]
22
+ client.message(channel: channel_id, text: msg, as_user: true, thread_ts: Thread.current[:thread_ts], unfurl_links: unfurl_links, unfurl_media: unfurl_media)
23
+ else
24
+ client.message(channel: channel_id, text: msg, as_user: true, unfurl_links: unfurl_links, unfurl_media: unfurl_media)
25
+ end
26
+ end
27
+ if config[:testing] and config.on_master_bot and !@buffered
28
+ @buffered = true
29
+ open("#{config.path}/buffer.log", "a") { |f|
30
+ f.puts "|#{channel_id}|#{config[:nick_id]}|#{config[:nick]}|#{msg}"
31
+ }
32
+ end
33
+ rescue Exception => stack
34
+ @logger.warn stack
30
35
  end
31
36
  end
32
37
  end
@@ -1,43 +1,68 @@
1
1
  class SlackSmartBot
2
2
 
3
3
  #to send messages without listening for a response to users
4
- def send_msg_user(id_user, msg)
5
- unless msg == ""
6
- if id_user[0] == "D"
7
- if config[:simulate]
8
- open("#{config.path}/buffer_complete.log", "a") { |f|
9
- f.puts "|#{id_user}|#{config[:nick_id]}|#{config[:nick]}|#{msg}~~~"
10
- }
11
- else
12
- if Thread.current[:on_thread]
13
- client.message(channel: id_user, as_user: true, text: msg, thread_ts: Thread.current[:thread_ts])
4
+ def send_msg_user(id_user, msg='', on_thread=nil, unfurl_links: true, unfurl_media: true, blocks: [])
5
+ unless msg == "" and blocks.empty?
6
+ begin
7
+ on_thread = Thread.current[:on_thread] if on_thread.nil?
8
+ (!unfurl_links or !unfurl_media) ? web_client = true : web_client = false
9
+ web_client = true if !blocks.empty?
10
+ if id_user[0] == "D"
11
+ if config[:simulate]
12
+ open("#{config.path}/buffer_complete.log", "a") { |f|
13
+ f.puts "|#{id_user}|#{config[:nick_id]}|#{config[:nick]}|#{msg}~~~"
14
+ }
14
15
  else
15
- client.message(channel: id_user, as_user: true, text: msg)
16
+ if web_client
17
+ if on_thread
18
+ client.web_client.chat_postMessage(channel: id_user, text: msg, blocks: blocks, as_user: true, unfurl_links: unfurl_links, unfurl_media: unfurl_media, thread_ts: Thread.current[:thread_ts])
19
+ else
20
+ client.web_client.chat_postMessage(channel: id_user, text: msg, blocks: blocks, as_user: true, unfurl_links: unfurl_links, unfurl_media: unfurl_media)
21
+ end
22
+ else
23
+ if on_thread
24
+ client.message(channel: id_user, as_user: true, text: msg, thread_ts: Thread.current[:thread_ts], unfurl_links: unfurl_links, unfurl_media: unfurl_media)
25
+ else
26
+ client.message(channel: id_user, as_user: true, text: msg, unfurl_links: unfurl_links, unfurl_media: unfurl_media)
27
+ end
28
+ end
16
29
  end
17
- end
18
- if config[:testing] and config.on_master_bot
19
- open("#{config.path}/buffer.log", "a") { |f|
20
- f.puts "|#{id_user}|#{config[:nick_id]}|#{config[:nick]}|#{msg}"
21
- }
22
- end
23
- else
24
- im = client.web_client.im_open(user: id_user)
25
- if config[:simulate]
26
- open("#{config.path}/buffer_complete.log", "a") { |f|
27
- f.puts "|#{im["channel"]["id"]}|#{config[:nick_id]}|#{config[:nick]}|#{msg}~~~"
28
- }
29
- else
30
- if Thread.current[:on_thread]
31
- client.message(channel: im["channel"]["id"], as_user: true, text: msg, thread_ts: Thread.current[:thread_ts])
32
- else
33
- client.message(channel: im["channel"]["id"], as_user: true, text: msg)
30
+ if config[:testing] and config.on_master_bot and !@buffered
31
+ @buffered = true
32
+ open("#{config.path}/buffer.log", "a") { |f|
33
+ f.puts "|#{id_user}|#{config[:nick_id]}|#{config[:nick]}|#{msg}#{blocks.join}"
34
+ }
35
+ end
36
+ else
37
+ if config[:simulate]
38
+ open("#{config.path}/buffer_complete.log", "a") { |f|
39
+ f.puts "|#{DIRECT[id_user.to_sym].ubot}|#{config[:nick_id]}|#{config[:nick]}|#{msg}#{blocks.join}~~~"
40
+ }
41
+ else
42
+ im = client.web_client.conversations_open(users: id_user)
43
+ if web_client
44
+ if on_thread
45
+ client.web_client.chat_postMessage(channel: im["channel"]["id"], text: msg, blocks: blocks, as_user: true, unfurl_links: unfurl_links, unfurl_media: unfurl_media, thread_ts: Thread.current[:thread_ts])
46
+ else
47
+ client.web_client.chat_postMessage(channel: im["channel"]["id"], text: msg, blocks: blocks, as_user: true, unfurl_links: unfurl_links, unfurl_media: unfurl_media)
48
+ end
49
+ else
50
+ if on_thread
51
+ client.message(channel: im["channel"]["id"], as_user: true, text: msg, thread_ts: Thread.current[:thread_ts], unfurl_links: unfurl_links, unfurl_media: unfurl_media)
52
+ else
53
+ client.message(channel: im["channel"]["id"], as_user: true, text: msg, unfurl_links: unfurl_links, unfurl_media: unfurl_media)
54
+ end
55
+ end
56
+ end
57
+ if config[:testing] and config.on_master_bot and !@buffered
58
+ @buffered = true
59
+ open("#{config.path}/buffer.log", "a") { |f|
60
+ f.puts "|#{im["channel"]["id"]}|#{config[:nick_id]}|#{config[:nick]}|#{msg}#{blocks.join}"
61
+ }
34
62
  end
35
63
  end
36
- if config[:testing] and config.on_master_bot
37
- open("#{config.path}/buffer.log", "a") { |f|
38
- f.puts "|#{im["channel"]["id"]}|#{config[:nick_id]}|#{config[:nick]}|#{msg}"
39
- }
40
- end
64
+ rescue Exception => stack
65
+ @logger.warn stack
41
66
  end
42
67
  end
43
68
  end
@@ -3,27 +3,31 @@ class SlackSmartBot
3
3
  # unreact(:thumbsup)
4
4
  # ts: can be true, false or a specific ts
5
5
  def unreact(emoji, ts=false)
6
- if ts.is_a?(TrueClass) or ts.is_a?(FalseClass)
7
- parent = ts
8
- ts = nil
9
- else
10
- parent = false
11
- end
12
- if ts.nil?
13
- if parent or Thread.current[:ts].to_s == ''
14
- ts = Thread.current[:thread_ts]
6
+ begin
7
+ if ts.is_a?(TrueClass) or ts.is_a?(FalseClass)
8
+ parent = ts
9
+ ts = nil
15
10
  else
16
- ts = Thread.current[:ts]
11
+ parent = false
17
12
  end
18
- end
19
- if ts.nil?
20
- @logger.warn 'unreact method no ts supplied'
21
- else
22
- begin
23
- client.web_client.reactions_remove(channel: Thread.current[:dest], name: emoji, timestamp: ts) unless config.simulate
24
- rescue Exception => stack
25
- @logger.warn stack
13
+ if ts.nil?
14
+ if parent or Thread.current[:ts].to_s == ''
15
+ ts = Thread.current[:thread_ts]
16
+ else
17
+ ts = Thread.current[:ts]
18
+ end
19
+ end
20
+ if ts.nil?
21
+ @logger.warn 'unreact method no ts supplied'
22
+ else
23
+ begin
24
+ client.web_client.reactions_remove(channel: Thread.current[:dest], name: emoji, timestamp: ts) unless config.simulate
25
+ rescue Exception => stack
26
+ @logger.warn stack
27
+ end
26
28
  end
29
+ rescue Exception => stack
30
+ @logger.warn stack
27
31
  end
28
32
  end
29
33
  end
@@ -1,5 +1,6 @@
1
1
  require_relative 'comm/ask'
2
2
  require_relative 'comm/dont_understand'
3
+ require_relative 'comm/respond_thread'
3
4
  require_relative 'comm/respond_direct'
4
5
  require_relative 'comm/respond'
5
6
  require_relative 'comm/send_file'
@@ -8,6 +9,7 @@ require_relative 'comm/send_msg_user'
8
9
  require_relative 'comm/react'
9
10
  require_relative 'comm/unreact'
10
11
  require_relative 'comm/get_user_info'
12
+ require_relative 'comm/get_users'
11
13
  require_relative 'comm/event_hello'
12
14
  require_relative 'comm/get_channel_members'
13
15
  require_relative 'comm/get_channels'
@@ -0,0 +1,32 @@
1
+ class SlackSmartBot
2
+
3
+ def add_announcement(user, type, message)
4
+ save_stats(__method__)
5
+ if has_access?(__method__, user)
6
+ if Thread.current[:typem] == :on_call
7
+ channel = Thread.current[:dchannel]
8
+ else
9
+ channel = Thread.current[:dest]
10
+ end
11
+ if File.exists?("#{config.path}/announcements/#{channel}.csv") and !@announcements.key?(channel)
12
+ t = CSV.table("#{config.path}/announcements/#{channel}.csv", headers: ['message_id', 'user_deleted', 'user_created', 'date', 'time', 'type', 'message'])
13
+ @announcements[channel] = t
14
+ num = t[:message_id].max + 1
15
+ elsif !@announcements.key?(channel)
16
+ File.open("#{config.path}/announcements/#{channel}.csv","w")
17
+ t = CSV.table("#{config.path}/announcements/#{channel}.csv", headers: ['message_id', 'user_deleted', 'user_created', 'date', 'time', 'type', 'message'])
18
+ num = 1
19
+ @announcements[channel] = t
20
+ else
21
+ num = @announcements[channel][:message_id].max + 1
22
+ end
23
+ values = [num, '', user.name, Time.now.strftime("%Y/%m/%d"), Time.now.strftime("%H:%M"), type, message]
24
+ @announcements[channel] << values
25
+ CSV.open("#{config.path}/announcements/#{channel}.csv", "a+") do |csv|
26
+ csv << values
27
+ end
28
+ respond "The announcement has been added. (id: #{num}).\nRelated commands `see announcements`, `delete announcement ID`"
29
+
30
+ end
31
+ end
32
+ end
@@ -1,24 +1,9 @@
1
1
  class SlackSmartBot
2
2
 
3
- # help: ----------------------------------------------
4
- # help: `bot help`
5
- # help: `bot help COMMAND`
6
- # help: `bot rules`
7
- # help: `bot rules COMMAND`
8
- # help: `bot help expanded`
9
- # help: `bot rules expanded`
10
- # help: `bot what can I do?`
11
- # help: it will display this help. For a more detailed help call `bot help expanded` or `bot rules expanded`.
12
- # help: if COMMAND supplied just help for that command
13
- # help: you can use the option 'expanded' or the alias 'extended'
14
- # help: `bot rules` will show only the specific rules for this channel.
15
- # help:
16
- def bot_help(user, from, dest, dchannel, specific, help_command, rules_file)
17
- save_stats(__method__)
18
- if config[:allow_access].key?(__method__) and !config[:allow_access][__method__].include?(user.name) and !config[:allow_access][__method__].include?(user.id) and
19
- (!user.key?(:enterprise_user) or ( user.key?(:enterprise_user) and !config[:allow_access][__method__].include?(user[:enterprise_user].id)))
20
- respond "You don't have access to use this command, please contact an Admin to be able to use it: <@#{config.admins.join(">, <@")}>"
21
- else
3
+ def bot_help(user, from, dest, dchannel, specific, help_command, rules_file, savestats=true)
4
+ save_stats(__method__) if savestats
5
+ output = []
6
+ if has_access?(__method__, user)
22
7
  help_found = false
23
8
 
24
9
  message = ""
@@ -28,36 +13,65 @@ class SlackSmartBot
28
13
  message_not_expanded = ''
29
14
  else
30
15
  expanded = false
31
- message_not_expanded = "*If you want to see the expanded version of `bot help` or `bot rules`, please call `bot help expanded` or `bot rules expanded`*\n"
32
- message_not_expanded += "*Also to get specific expanded help for a specific command or rule call `bot help COMMAND`*\n"
16
+ message_not_expanded = "If you want to see the *expanded* version of *`bot help`* or *`bot rules`*, please call *`bot help expanded`* or *`bot rules expanded`*\n"
17
+ message_not_expanded += "Also to get specific *expanded* help for a specific command or rule call *`bot help COMMAND`*\n"
33
18
  end
34
-
35
19
  help_message = get_help(rules_file, dest, from, specific, expanded)
36
-
20
+ commands = []
21
+ commands_search = []
37
22
  if help_command.to_s != ""
38
23
  help_message.gsub(/====+/,'-'*30).split(/^\s*-------*$/).each do |h|
39
- if h.match?(/[`_]#{help_command}/i)
40
- respond h, dest
24
+ if h.match?(/[`_]#{help_command}/i) or h.match?(/^\s*command_id:\s+:#{help_command.gsub(' ', '_')}\s*$/)
25
+ output << h
41
26
  help_found = true
27
+ commands << h
28
+ elsif !h.match?(/\A\s*\*/) and !h.match?(/\A\s*=+/) #to avoid general messages for bot help *General commands...*
29
+ all_found = true
30
+ help_command.to_s.split(' ') do |hc|
31
+ unless hc.match?(/^\s*\z/)
32
+ if !h.match?(/#{hc}/i)
33
+ all_found = false
34
+ end
35
+ end
36
+ end
37
+ commands_search << h if all_found
42
38
  end
43
39
  end
44
40
  else
45
41
  if Thread.current[:using_channel]!=''
46
42
  message += "*You are using rules from another channel: <##{Thread.current[:using_channel]}>. These are the specific commands for that channel:*"
47
43
  end
48
- respond message, dest
44
+ output << message
49
45
  end
50
46
 
51
47
  if (help_command.to_s == "")
52
48
  help_message.split(/^\s*=========*$/).each do |h|
53
- respond("#{"=" * 35}\n#{h}", dest) unless h.match?(/\A\s*\z/)
49
+ unless h.match?(/\A\s*\z/)
50
+ output << "#{"=" * 35}\n#{h}"
51
+ end
52
+ end
53
+ if Thread.current[:typem] == :on_pg or Thread.current[:typem] == :on_pub
54
+ if @bots_created.size>0
55
+ txt = "\nThese are the *SmartBots* running on this Slack workspace: *<##{@master_bot_id}>, <##{@bots_created.keys.join('>, <#')}>*\n"
56
+ txt += "Join one channel and call *`bot rules`* to see specific commands for that channel or *`bot help`* to see all commands for that channel.\n"
57
+ output << txt
58
+ end
54
59
  end
55
60
  else
61
+ if commands.size < 10 and help_command.to_s!='' and commands_search.size > 0
62
+ commands_search.shuffle!
63
+ (10-commands.size).times do |n|
64
+ unless commands_search[n].nil?
65
+ output << commands_search[n]
66
+ help_found = true
67
+ end
68
+ end
69
+ end
56
70
  unless help_found
57
71
  if specific
58
- respond("I didn't find any rule starting by `#{help_command}`", dest)
72
+ output << "I didn't find any rule with `#{help_command}`"
59
73
  else
60
- respond("I didn't find any command starting by `#{help_command}`", dest)
74
+ output << "I didn't find any command with `#{help_command}`"
61
75
  end
62
76
  end
63
77
  end
@@ -69,7 +83,7 @@ class SlackSmartBot
69
83
  end
70
84
  end
71
85
  if defined?(git_project) && (git_project.to_s != "") && (help_command.to_s == "")
72
- respond "Git project: #{git_project}", dest
86
+ output << "Git project: #{git_project}"
73
87
  else
74
88
  def git_project
75
89
  ""
@@ -80,9 +94,22 @@ class SlackSmartBot
80
94
  end
81
95
  end
82
96
  elsif help_command.to_s == ""
83
- respond "Slack Smart Bot Github project: https://github.com/MarioRuiz/slack-smart-bot", dest
97
+ output << "Slack Smart Bot Github project: https://github.com/MarioRuiz/slack-smart-bot"
98
+ end
99
+ unless expanded
100
+ output << message_not_expanded
101
+ end
102
+ end
103
+ if output.join("\n").lines.count > 50 and dest[0]!='D'
104
+ dest = :on_thread
105
+ output.unshift('Since there are many lines returned the results are returned on a thread by default.')
106
+ end
107
+ output.each do |h|
108
+ msg = h.gsub(/^\s*command_id:\s+:\w+\s*$/,'')
109
+ unless msg.match?(/\A\s*\z/)
110
+ respond msg, dest, unfurl_links: false, unfurl_media: false
84
111
  end
85
- respond message_not_expanded unless expanded
86
112
  end
113
+ return output.join("\n")
87
114
  end
88
115
  end
@@ -28,6 +28,7 @@ class SlackSmartBot
28
28
  # help: _bot stats #sales today_
29
29
  # help: _bot stats #sales from 2020-01-01 monthly_
30
30
  # help: _bot stats exclude routines masters from 2021/01/01 monthly_
31
+ # help: <https://github.com/MarioRuiz/slack-smart-bot#bot-management|more info>
31
32
  # help:
32
33
  def bot_stats(dest, from_user, typem, channel_id, from, to, user, st_command, exclude_masters, exclude_routines, exclude_command, monthly, all_data)
33
34
  require 'csv'
@@ -81,16 +82,16 @@ class SlackSmartBot
81
82
  end
82
83
 
83
84
  if user!=''
84
- user_info = get_user_info(user)
85
- if users_id_name.key?(user_info.user.id)
86
- user_name = users_id_name[user_info.user.id]
85
+ user_info = @users.select{|u| u.id == user or (u.key?(:enterprise_user) and u.enterprise_user.id == user)}[-1]
86
+ if users_id_name.key?(user_info.id)
87
+ user_name = users_id_name[user_info.id]
87
88
  else
88
- user_name = user_info.user.name
89
+ user_name = user_info.name
89
90
  end
90
- if users_name_id.key?(user_info.user.name)
91
- user_id = users_name_id[user_info.user.name]
91
+ if users_name_id.key?(user_info.name)
92
+ user_id = users_name_id[user_info.name]
92
93
  else
93
- user_id = user_info.user.id
94
+ user_id = user_info.id
94
95
  end
95
96
  end
96
97
  master_admins = config.masters.dup
@@ -105,7 +106,7 @@ class SlackSmartBot
105
106
  end
106
107
 
107
108
  Dir["#{config.stats_path}.*.log"].sort.each do |file|
108
- if file >= "#{config.stats_path}.#{from_file}.log" or file <= "#{config.stats_path}.#{to_file}.log"
109
+ if file >= "#{config.stats_path}.#{from_file}.log" and file <= "#{config.stats_path}.#{to_file}.log"
109
110
  CSV.foreach(file, headers: true, header_converters: :symbol, converters: :numeric) do |row|
110
111
  row[:date] = row[:date].to_s
111
112
  if row[:dest_channel_id].to_s[0]=='D'
@@ -125,7 +126,7 @@ class SlackSmartBot
125
126
  if !exclude_routines or (exclude_routines and !row[:user_name].match?(/^routine\//) )
126
127
  if exclude_command == '' or (exclude_command!='' and row[:command]!=exclude_command)
127
128
  if st_command == '' or (st_command != '' and row[:command] == st_command)
128
- if row[:bot_channel_id] == channel_id or channel_id == ''
129
+ if row[:bot_channel_id] == channel_id or channel_id == '' or row[:dest_channel_id] == channel_id
129
130
  if row[:date] >= from and row[:date] <= to
130
131
  count_users[row[:user_id]] ||= 0
131
132
  count_users[row[:user_id]] += 1