slack-smart-bot 1.8.1 → 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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +127 -21
  3. data/lib/slack/smart-bot/comm/ask.rb +55 -42
  4. data/lib/slack/smart-bot/comm/dont_understand.rb +2 -2
  5. data/lib/slack/smart-bot/comm/event_hello.rb +34 -0
  6. data/lib/slack/smart-bot/comm/get_channel_members.rb +13 -0
  7. data/lib/slack/smart-bot/comm/get_channels.rb +35 -0
  8. data/lib/slack/smart-bot/comm/get_user_info.rb +20 -0
  9. data/lib/slack/smart-bot/comm/get_users.rb +24 -0
  10. data/lib/slack/smart-bot/comm/react.rb +38 -8
  11. data/lib/slack/smart-bot/comm/respond.rb +219 -48
  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 +24 -7
  18. data/lib/slack/smart-bot/comm.rb +7 -1
  19. data/lib/slack/smart-bot/commands/general/add_announcement.rb +32 -0
  20. data/lib/slack/smart-bot/commands/general/bot_help.rb +68 -28
  21. data/lib/slack/smart-bot/commands/general/bot_stats.rb +314 -0
  22. data/lib/slack/smart-bot/commands/general/bot_status.rb +3 -5
  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 +13 -16
  36. data/lib/slack/smart-bot/commands/general/whats_new.rb +19 -0
  37. data/lib/slack/smart-bot/commands/general_bot_commands.rb +243 -0
  38. data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +67 -38
  39. data/lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb +49 -14
  40. data/lib/slack/smart-bot/commands/on_bot/admin/extend_rules.rb +5 -7
  41. data/lib/slack/smart-bot/commands/on_bot/admin/pause_bot.rb +4 -1
  42. data/lib/slack/smart-bot/commands/on_bot/admin/pause_routine.rb +1 -0
  43. data/lib/slack/smart-bot/commands/on_bot/admin/remove_routine.rb +2 -3
  44. data/lib/slack/smart-bot/commands/on_bot/admin/run_routine.rb +6 -1
  45. data/lib/slack/smart-bot/commands/on_bot/admin/see_result_routine.rb +32 -0
  46. data/lib/slack/smart-bot/commands/on_bot/admin/see_routines.rb +12 -4
  47. data/lib/slack/smart-bot/commands/on_bot/admin/start_bot.rb +4 -1
  48. data/lib/slack/smart-bot/commands/on_bot/admin/start_routine.rb +1 -0
  49. data/lib/slack/smart-bot/commands/on_bot/admin/stop_using_rules_on.rb +2 -0
  50. data/lib/slack/smart-bot/commands/on_bot/admin_master/react_to.rb +32 -0
  51. data/lib/slack/smart-bot/commands/on_bot/admin_master/send_message.rb +24 -0
  52. data/lib/slack/smart-bot/commands/on_bot/delete_repl.rb +3 -5
  53. data/lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb +54 -25
  54. data/lib/slack/smart-bot/commands/on_bot/get_repl.rb +7 -9
  55. data/lib/slack/smart-bot/commands/on_bot/repl.rb +55 -25
  56. data/lib/slack/smart-bot/commands/on_bot/ruby_code.rb +36 -13
  57. data/lib/slack/smart-bot/commands/on_bot/run_repl.rb +5 -7
  58. data/lib/slack/smart-bot/commands/on_bot/see_repls.rb +4 -6
  59. data/lib/slack/smart-bot/commands/on_bot/see_shortcuts.rb +29 -13
  60. data/lib/slack/smart-bot/commands/on_extended/bot_rules.rb +55 -9
  61. data/lib/slack/smart-bot/commands/on_master/admin/kill_bot_on_channel.rb +4 -1
  62. data/lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb +5 -3
  63. data/lib/slack/smart-bot/commands/on_master/admin_master/notify_message.rb +2 -1
  64. data/lib/slack/smart-bot/commands/on_master/admin_master/publish_announcements.rb +32 -0
  65. data/lib/slack/smart-bot/commands/on_master/admin_master/set_general_message.rb +38 -0
  66. data/lib/slack/smart-bot/commands/on_master/admin_master/set_maintenance.rb +49 -0
  67. data/lib/slack/smart-bot/commands/on_master/create_bot.rb +30 -21
  68. data/lib/slack/smart-bot/commands.rb +19 -1
  69. data/lib/slack/smart-bot/listen.rb +7 -8
  70. data/lib/slack/smart-bot/process.rb +373 -192
  71. data/lib/slack/smart-bot/process_first.rb +202 -104
  72. data/lib/slack/smart-bot/treat_message.rb +325 -186
  73. data/lib/slack/smart-bot/utils/answer.rb +18 -0
  74. data/lib/slack/smart-bot/utils/answer_delete.rb +15 -0
  75. data/lib/slack/smart-bot/utils/build_help.rb +57 -5
  76. data/lib/slack/smart-bot/utils/create_routine_thread.rb +83 -30
  77. data/lib/slack/smart-bot/utils/get_bots_created.rb +4 -1
  78. data/lib/slack/smart-bot/utils/get_channels_name_and_id.rb +1 -7
  79. data/lib/slack/smart-bot/utils/get_help.rb +87 -35
  80. data/lib/slack/smart-bot/utils/get_shares.rb +12 -0
  81. data/lib/slack/smart-bot/utils/has_access.rb +12 -0
  82. data/lib/slack/smart-bot/utils/save_stats.rb +23 -8
  83. data/lib/slack/smart-bot/utils/save_status.rb +52 -0
  84. data/lib/slack/smart-bot/utils/update_shortcuts_file.rb +6 -0
  85. data/lib/slack/smart-bot/utils.rb +5 -0
  86. data/lib/slack-smart-bot.rb +88 -47
  87. data/lib/slack-smart-bot_general_commands.rb +46 -0
  88. data/lib/slack-smart-bot_general_rules.rb +5 -2
  89. data/lib/slack-smart-bot_rules.rb +49 -23
  90. data/whats_new.txt +36 -0
  91. metadata +44 -13
  92. data/lib/slack/smart-bot/commands/on_bot/admin_master/bot_stats.rb +0 -195
@@ -13,7 +13,9 @@ def general_rules(user, command, processed, dest, files = [], rules_file = "")
13
13
  # help: Examples:
14
14
  # help: _echo I am the Smart Bot_
15
15
  # help: _100 echo :heart:_
16
- when /^(\d*)\s*echo\s(.+)/i
16
+ # help: command_id: :echo
17
+ # help:
18
+ when /\A\s*(\d*)\s*echo\s(.+)/i
17
19
  save_stats :echo
18
20
  $1.to_s == '' ? times = 1 : times = $1.to_i
19
21
  respond ($2*times).to_s
@@ -25,9 +27,10 @@ def general_rules(user, command, processed, dest, files = [], rules_file = "")
25
27
  rescue => exception
26
28
  if defined?(@logger)
27
29
  @logger.fatal exception
28
- respond "Unexpected error!! Please contact an admin to solve it: <@#{ADMIN_USERS.join(">, <@")}>"
30
+ respond "Unexpected error!! Please contact an admin to solve it: <@#{config.admins.join(">, <@")}>"
29
31
  else
30
32
  puts exception
31
33
  end
34
+ return false
32
35
  end
33
36
  end
@@ -2,7 +2,7 @@
2
2
  #path to the project folder
3
3
  # for example "#{`eval echo ~$USER`.chop}/projects/the_project"
4
4
  def project_folder()
5
- "#{`eval echo ~$USER`.chop}/"
5
+ "#{Dir.pwd}/"
6
6
  end
7
7
 
8
8
  #link to the project
@@ -40,22 +40,25 @@ def rules(user, command, processed, dest, files = [], rules_file = "")
40
40
 
41
41
  load "#{config.path}/rules/general_rules.rb"
42
42
 
43
- unless general_rules(user, command, processed, dest, files, rules_file)
43
+ if general_rules(user, command, processed, dest, files, rules_file)
44
+ return true
45
+ else
44
46
  begin
45
47
  case command
46
48
 
47
49
  # help: ----------------------------------------------
48
50
  # help: `go to sleep`
49
51
  # help: it will sleep the bot for 5 seconds
52
+ # help: command_id: :go_to_sleep
50
53
  # help:
51
- when /^go\sto\ssleep/i
54
+ when /\A\s*go\sto\ssleep/i
52
55
  save_stats :go_to_sleep
53
- unless @questions.keys.include?(from)
56
+ if answer.empty?
54
57
  ask "do you want me to take a siesta?"
55
58
  else
56
- case @questions[from]
59
+ case answer
57
60
  when /yes/i, /yep/i, /sure/i
58
- @questions.delete(from)
61
+ answer_delete
59
62
  respond "I'll be sleeping for 5 secs... just for you"
60
63
  respond "zZzzzzzZZZZZZzzzzzzz!"
61
64
  react :sleeping
@@ -63,43 +66,52 @@ def rules(user, command, processed, dest, files = [], rules_file = "")
63
66
  unreact :sleeping
64
67
  react :sunny
65
68
  when /no/i, /nope/i, /cancel/i
66
- @questions.delete(from)
69
+ answer_delete
67
70
  respond "Thanks, I'm happy to be awake"
68
71
  else
69
72
  respond "I don't understand"
70
- ask "are you sure do you want me to sleep? (yes or no)"
73
+ ask "are you sure you want me to sleep? (yes or no)"
71
74
  end
72
75
  end
73
76
 
74
77
  # help: ----------------------------------------------
75
78
  # help: `run something`
76
79
  # help: It will run the process and report the results when done
80
+ # help: command_id: :run_something
77
81
  # help:
78
- when /^run something/i
82
+ when /\Arun something/i
79
83
  save_stats :run_something
80
- react :runner
84
+ if has_access?(:run_something, user)
85
+ react :runner
81
86
 
82
- process_to_run = "ruby -v"
83
- process_to_run = ("cd #{project_folder} &&" + process_to_run) if defined?(project_folder)
84
- stdout, stderr, status = Open3.capture3(process_to_run)
85
- unreact :runner
86
- if stderr == ""
87
- if stdout == ""
88
- respond "#{display_name}: Nothing returned."
87
+ process_to_run = "ruby -v"
88
+ process_to_run = ("cd #{project_folder} &&" + process_to_run) if defined?(project_folder)
89
+ stdout, stderr, status = Open3.capture3(process_to_run)
90
+ unreact :runner
91
+ if stderr == ""
92
+ if stdout == ""
93
+ respond "#{display_name}: Nothing returned."
94
+ else
95
+ respond "#{display_name}: #{stdout}"
96
+ end
89
97
  else
90
- respond "#{display_name}: #{stdout}"
98
+ respond "#{display_name}: #{stdout} #{stderr}"
91
99
  end
92
- else
93
- respond "#{display_name}: #{stdout} #{stderr}"
94
100
  end
95
101
 
96
102
  # Emoticons you can use with `react` command https://www.webfx.com/tools/emoji-cheat-sheet/
97
103
 
98
- # Examples for respond and respond_direct
104
+ # Examples for respond, respond_thread and respond_direct
99
105
  # # send 'the message' to the channel or direct message where the command was written
100
106
  # respond "the message"
101
107
  # # send 'the message' privately as a direct message to the user that sent the command
102
108
  # respond_direct "the message"
109
+ # # same thing can be done:
110
+ # respond "the message", :direct
111
+ # # send 'the message' opening a thread
112
+ # respond_thread "the message"
113
+ # # same thing can be done:
114
+ # respond 'the message', :on_thread
103
115
  # # send 'the message' to a specific channel name
104
116
  # respond "the message", 'my_channel'
105
117
  # # send 'the message' to a specific channel id
@@ -109,6 +121,19 @@ def rules(user, command, processed, dest, files = [], rules_file = "")
109
121
  # # send 'the message' to a specific user id as direct message
110
122
  # respond "the message", 'US3344D3'
111
123
 
124
+ # Example sending blocks https://api.slack.com/block-kit
125
+ # my_blocks = [
126
+ # { type: "context",
127
+ # elements:
128
+ # [
129
+ # { type: "plain_text", :text=>"\tInfo: " },
130
+ # { type: "image", image_url: "https://avatars.slack-edge.com/2021-03-23/182815_e54abb1dd_24.jpg", alt_text: "mario" },
131
+ # { type: "mrkdwn", text: " *Mario Ruiz* (marior) " }
132
+ # ]
133
+ # }
134
+ # ]
135
+ # respond blocks: my_blocks
136
+
112
137
  # Example downloading a file from slack
113
138
  # if !files.nil? and files.size == 1 and files[0].filetype == 'yaml'
114
139
  # require 'nice_http'
@@ -120,16 +145,17 @@ def rules(user, command, processed, dest, files = [], rules_file = "")
120
145
  # send_file(to, msg, filepath, title, format, type = "text")
121
146
  # send_file(dest, 'the message', "#{project_folder}/temp/logs_ptBI.log", 'title', 'text/plain', "text")
122
147
  # send_file(dest, 'the message', "#{project_folder}/temp/example.jpeg", 'title', 'image/jpeg', "jpg")
123
-
124
-
125
148
  else
126
149
  unless processed
127
150
  dont_understand()
128
151
  end
152
+ return false
129
153
  end
154
+ return true
130
155
  rescue => exception
131
156
  @logger.fatal exception
132
157
  respond "Unexpected error!! Please contact an admin to solve it: <@#{config.admins.join(">, <@")}>"
158
+ return false
133
159
  end
134
160
  end
135
161
  end
data/whats_new.txt ADDED
@@ -0,0 +1,36 @@
1
+ *Version 1.10.0* Released 2021-Sep-17
2
+
3
+ *For General users*
4
+ - When on a private conversation with the SmartBot (DM) and not using any channels rule on the conversation, the general_rules will be available.
5
+ - On DM with the SmartBot if you want to use a rule from a specific channel you can use also: `#CHANNEL RULE` or `on #CHANNEL RULE`. For example: `#sales get report for India`
6
+ - Now when using general commands, the SmartBot will be responding on any channel where is a member, even though is not listening to you. For example: `clear screen`
7
+ - Added command `suggest command` that will return the help content for a random command.
8
+ - New command `leaderboard` returns useful information about the use of the SmartBot.
9
+ - `add COLOR announcement MESSAGE`, `add EMOJI announcement MESSAGE` command stores the message on the announcement list labeled with the color/emoji specified, white by default. Aliases for announcement: statement, declaration, message. Related: `see announcements`, `delete announcement id`
10
+ - `hi bot` and `bye bot` can be called from any channel where the SmartBot is a member.
11
+ - Added general command `see statuses`, `who is on vacation?`, `who is not on vacation?`
12
+ - New general command `see favorite commands`. It will display the favorite commands in that channel.
13
+ - Now when running the `ruby` command it can be supplied a code block.
14
+ - New general command `share messages /REGEXP/ on #CHANNEL`, `share messages "TEXT" on #CHANNEL`, `see shares', `delete share ID`. It will automatically share new messages published that meet the specified criteria.
15
+
16
+ *For Admin users*
17
+ - respond_thread method will send the respond creating a thread if necessary. It can be used also `respond 'msg', :on_thread`
18
+ - `respond 'msg', :direct` will send a direct message to the person that is executing the rule.
19
+ - You can add general commands that will be responding on any channel where the Smart Bot is a member even though is not 'listening to you'. Add them to '/rules/general_commands.rb
20
+ - when using `respond` you can supply two options: unfurl_links and unfurl_media. By default is a boolean: true
21
+ - added option 'weekdays' and 'weekends' for `create routine` command, for example: `add silent routine suggestions on weekdays at 09:00 suggest command`
22
+ - Added a new config for the SmartBot to log all RTM communication, admits `true` or `false`, by default `false`: `logrtm`
23
+ - Use the command `send message to` and `react to` to impersonate the SmartBot. Only accessible for Master Admins on a DM with the SmartBot.
24
+ - New command to see the result of the last run of a routine: `see result routine NAME`
25
+ - Now it is possible to create *bgroutine* then the results of the routine run won't be published.
26
+ - To display a general message after every command use: `set general message MESSAGE`. Use `set general message off` to stop displaying it.
27
+ - When adding a general message is possible to use interpolation
28
+ - If you are a master admin and you are on master channel then you can call `publish announcements` that will publish the announcements on all channels. The messages stored on a DM won't be published. This is very convenient to be called from a *Routine* for example every weekday at 09:00.
29
+ - Now it is possible to send blocks `respond blocks: my_blocks`. More info about blocks: https://api.slack.com/block-kit
30
+ - When using bgroutines if we want to avoid a file to be sent:
31
+ send_file(dest, 'description', "file_path", 'desc', 'text/plain', "text") unless Thread.current[:routine_type] == 'bgroutine'
32
+ - SmartBot will notify about SmartBot status changes if defined the status_channel in config file and the channel exists. By default: smartbot-status
33
+
34
+ ------------------------------
35
+
36
+ *Previous*: <https://github.com/MarioRuiz/slack-smart-bot/blob/dd23939f93ee95aca3c04d33cd1ce197d6efbd37/whats_new.txt|1.9.0>
metadata CHANGED
@@ -1,35 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slack-smart-bot
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.1
4
+ version: 1.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mario Ruiz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-13 00:00:00.000000000 Z
11
+ date: 2021-09-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: slack-ruby-client
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '0.15'
20
17
  - - ">="
21
18
  - !ruby/object:Gem::Version
22
- version: 0.15.1
19
+ version: 0.17.0
20
+ - - "~>"
21
+ - !ruby/object:Gem::Version
22
+ version: '0.17'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - "~>"
28
- - !ruby/object:Gem::Version
29
- version: '0.15'
30
27
  - - ">="
31
28
  - !ruby/object:Gem::Version
32
- version: 0.15.1
29
+ version: 0.17.0
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.17'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: nice_http
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -81,7 +81,7 @@ dependencies:
81
81
  version: '1'
82
82
  - - ">="
83
83
  - !ruby/object:Gem::Version
84
- version: 1.2.1
84
+ version: 1.3.0
85
85
  type: :runtime
86
86
  prerelease: false
87
87
  version_requirements: !ruby/object:Gem::Requirement
@@ -91,7 +91,7 @@ dependencies:
91
91
  version: '1'
92
92
  - - ">="
93
93
  - !ruby/object:Gem::Version
94
- version: 1.2.1
94
+ version: 1.3.0
95
95
  - !ruby/object:Gem::Dependency
96
96
  name: rspec
97
97
  requirement: !ruby/object:Gem::Requirement
@@ -125,25 +125,45 @@ files:
125
125
  - LICENSE
126
126
  - README.md
127
127
  - lib/slack-smart-bot.rb
128
+ - lib/slack-smart-bot_general_commands.rb
128
129
  - lib/slack-smart-bot_general_rules.rb
129
130
  - lib/slack-smart-bot_rules.rb
130
131
  - lib/slack/smart-bot/comm.rb
131
132
  - lib/slack/smart-bot/comm/ask.rb
132
133
  - lib/slack/smart-bot/comm/dont_understand.rb
134
+ - lib/slack/smart-bot/comm/event_hello.rb
135
+ - lib/slack/smart-bot/comm/get_channel_members.rb
136
+ - lib/slack/smart-bot/comm/get_channels.rb
137
+ - lib/slack/smart-bot/comm/get_user_info.rb
138
+ - lib/slack/smart-bot/comm/get_users.rb
133
139
  - lib/slack/smart-bot/comm/react.rb
134
140
  - lib/slack/smart-bot/comm/respond.rb
135
141
  - lib/slack/smart-bot/comm/respond_direct.rb
142
+ - lib/slack/smart-bot/comm/respond_thread.rb
136
143
  - lib/slack/smart-bot/comm/send_file.rb
137
144
  - lib/slack/smart-bot/comm/send_msg_channel.rb
138
145
  - lib/slack/smart-bot/comm/send_msg_user.rb
139
146
  - lib/slack/smart-bot/comm/unreact.rb
140
147
  - lib/slack/smart-bot/commands.rb
148
+ - lib/slack/smart-bot/commands/general/add_announcement.rb
141
149
  - lib/slack/smart-bot/commands/general/bot_help.rb
150
+ - lib/slack/smart-bot/commands/general/bot_stats.rb
142
151
  - lib/slack/smart-bot/commands/general/bot_status.rb
143
152
  - lib/slack/smart-bot/commands/general/bye_bot.rb
153
+ - lib/slack/smart-bot/commands/general/delete_announcement.rb
154
+ - lib/slack/smart-bot/commands/general/delete_share.rb
144
155
  - lib/slack/smart-bot/commands/general/hi_bot.rb
156
+ - lib/slack/smart-bot/commands/general/leaderboard.rb
157
+ - lib/slack/smart-bot/commands/general/see_announcements.rb
158
+ - lib/slack/smart-bot/commands/general/see_favorite_commands.rb
159
+ - lib/slack/smart-bot/commands/general/see_shares.rb
160
+ - lib/slack/smart-bot/commands/general/see_statuses.rb
161
+ - lib/slack/smart-bot/commands/general/share_messages.rb
145
162
  - lib/slack/smart-bot/commands/general/stop_using_rules.rb
163
+ - lib/slack/smart-bot/commands/general/suggest_command.rb
146
164
  - lib/slack/smart-bot/commands/general/use_rules.rb
165
+ - lib/slack/smart-bot/commands/general/whats_new.rb
166
+ - lib/slack/smart-bot/commands/general_bot_commands.rb
147
167
  - lib/slack/smart-bot/commands/on_bot/add_shortcut.rb
148
168
  - lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb
149
169
  - lib/slack/smart-bot/commands/on_bot/admin/extend_rules.rb
@@ -151,12 +171,14 @@ files:
151
171
  - lib/slack/smart-bot/commands/on_bot/admin/pause_routine.rb
152
172
  - lib/slack/smart-bot/commands/on_bot/admin/remove_routine.rb
153
173
  - lib/slack/smart-bot/commands/on_bot/admin/run_routine.rb
174
+ - lib/slack/smart-bot/commands/on_bot/admin/see_result_routine.rb
154
175
  - lib/slack/smart-bot/commands/on_bot/admin/see_routines.rb
155
176
  - lib/slack/smart-bot/commands/on_bot/admin/start_bot.rb
156
177
  - lib/slack/smart-bot/commands/on_bot/admin/start_routine.rb
157
178
  - lib/slack/smart-bot/commands/on_bot/admin/stop_using_rules_on.rb
158
- - lib/slack/smart-bot/commands/on_bot/admin_master/bot_stats.rb
159
179
  - lib/slack/smart-bot/commands/on_bot/admin_master/get_bot_logs.rb
180
+ - lib/slack/smart-bot/commands/on_bot/admin_master/react_to.rb
181
+ - lib/slack/smart-bot/commands/on_bot/admin_master/send_message.rb
160
182
  - lib/slack/smart-bot/commands/on_bot/delete_repl.rb
161
183
  - lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb
162
184
  - lib/slack/smart-bot/commands/on_bot/get_repl.rb
@@ -169,12 +191,17 @@ files:
169
191
  - lib/slack/smart-bot/commands/on_master/admin/kill_bot_on_channel.rb
170
192
  - lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb
171
193
  - lib/slack/smart-bot/commands/on_master/admin_master/notify_message.rb
194
+ - lib/slack/smart-bot/commands/on_master/admin_master/publish_announcements.rb
195
+ - lib/slack/smart-bot/commands/on_master/admin_master/set_general_message.rb
196
+ - lib/slack/smart-bot/commands/on_master/admin_master/set_maintenance.rb
172
197
  - lib/slack/smart-bot/commands/on_master/create_bot.rb
173
198
  - lib/slack/smart-bot/listen.rb
174
199
  - lib/slack/smart-bot/process.rb
175
200
  - lib/slack/smart-bot/process_first.rb
176
201
  - lib/slack/smart-bot/treat_message.rb
177
202
  - lib/slack/smart-bot/utils.rb
203
+ - lib/slack/smart-bot/utils/answer.rb
204
+ - lib/slack/smart-bot/utils/answer_delete.rb
178
205
  - lib/slack/smart-bot/utils/build_help.rb
179
206
  - lib/slack/smart-bot/utils/create_routine_thread.rb
180
207
  - lib/slack/smart-bot/utils/get_bots_created.rb
@@ -183,13 +210,17 @@ files:
183
210
  - lib/slack/smart-bot/utils/get_repls.rb
184
211
  - lib/slack/smart-bot/utils/get_routines.rb
185
212
  - lib/slack/smart-bot/utils/get_rules_imported.rb
213
+ - lib/slack/smart-bot/utils/get_shares.rb
214
+ - lib/slack/smart-bot/utils/has_access.rb
186
215
  - lib/slack/smart-bot/utils/remove_hash_keys.rb
187
216
  - lib/slack/smart-bot/utils/save_stats.rb
217
+ - lib/slack/smart-bot/utils/save_status.rb
188
218
  - lib/slack/smart-bot/utils/update_bots_file.rb
189
219
  - lib/slack/smart-bot/utils/update_repls.rb
190
220
  - lib/slack/smart-bot/utils/update_routines.rb
191
221
  - lib/slack/smart-bot/utils/update_rules_imported.rb
192
222
  - lib/slack/smart-bot/utils/update_shortcuts_file.rb
223
+ - whats_new.txt
193
224
  homepage: https://github.com/MarioRuiz/slack-smart-bot
194
225
  licenses:
195
226
  - MIT
@@ -1,195 +0,0 @@
1
- class SlackSmartBot
2
- # helpadmin: ----------------------------------------------
3
- # helpadmin: `bot stats`
4
- # helpadmin: `bot stats USER_NAME`
5
- # helpadmin: `bot stats exclude masters`
6
- # helpadmin: `bot stats from YYYY/MM/DD`
7
- # helpadmin: `bot stats from YYYY/MM/DD to YYYY/MM/DD`
8
- # helpadmin: `bot stats CHANNEL`
9
- # helpadmin: `bot stats CHANNEL from YYYY/MM/DD`
10
- # helpadmin: `bot stats CHANNEL from YYYY/MM/DD to YYYY/MM/DD`
11
- # helpadmin: `bot stats USER_NAME from YYYY/MM/DD to YYYY/MM/DD`
12
- # helpadmin: `bot stats CHANNEL USER_NAME from YYYY/MM/DD to YYYY/MM/DD`
13
- # helpadmin: `bot stats CHANNEL exclude masters from YYYY/MM/DD to YYYY/MM/DD`
14
- # helpadmin: `bot stats today`
15
- # helpadmin: `bot stats exclude COMMAND_ID`
16
- # helpadmin: `bot stats monthly`
17
- # helpadmin: To see the bot stats
18
- # helpadmin: You can use this command only if you are a Master admin user and if you are in a private conversation with the bot
19
- # helpadmin: You need to set stats to true to generate the stats when running the bot instance.
20
- # helpadmin: Examples:
21
- # helpadmin: _bot stats #sales_
22
- # helpadmin: _bot stats @peter.wind_
23
- # helpadmin: _bot stats #sales from 2019/12/15 to 2019/12/31_
24
- # helpadmin: _bot stats #sales today_
25
- # helpadmin: _bot stats #sales from 2020-01-01 monthly_
26
- # helpadmin:
27
- def bot_stats(dest, from_user, typem, channel_id, from, to, user, exclude_masters, exclude_command, monthly)
28
- require 'csv'
29
- if config.stats
30
- message = []
31
- else
32
- message = ["You need to set stats to true to generate the stats when running the bot instance."]
33
- end
34
- save_stats(__method__)
35
- if (config.masters.include?(from_user) or @master_admin_users_id.include?(from_user)) and typem==:on_dm #master admin user
36
- if !File.exist?("#{config.stats_path}.#{Time.now.strftime("%Y-%m")}.log")
37
- message<<'No stats'
38
- else
39
- from = "#{Time.now.strftime("%Y-%m")}-01" if from == ''
40
- to = "#{Time.now.strftime("%Y-%m-%d")}" if to == ''
41
- from_short = from
42
- to_short = to
43
- from_file = from[0..3] + '-' + from[5..6]
44
- to_file = to[0..3] + '-' + to[5..6]
45
- from+= " 00:00:00 +0000"
46
- to+= " 23:59:59 +0000"
47
- rows = []
48
- rows_month = {}
49
- users_month = {}
50
- commands_month = {}
51
- users_id_name = {}
52
- users_name_id = {}
53
-
54
- # to translate global and enterprise users since sometimes was returning different names/ids
55
- Dir["#{config.stats_path}.*.log"].sort.each do |file|
56
- if file >= "#{config.stats_path}.#{from_file}.log" or file <= "#{config.stats_path}.#{to_file}.log"
57
- CSV.foreach(file, headers: true, header_converters: :symbol, converters: :numeric) do |row|
58
- unless users_id_name.key?(row[:user_id])
59
- users_id_name[row[:user_id]] = row[:user_name]
60
- end
61
- unless users_name_id.key?(row[:user_name])
62
- users_name_id[row[:user_name]] = row[:user_id]
63
- end
64
-
65
- end
66
- end
67
- end
68
-
69
- if user!=''
70
- user_info = client.web_client.users_info(user: user)
71
- if users_id_name.key?(user_info.user.id)
72
- user_name = users_id_name[user_info.user.id]
73
- else
74
- user_name = user_info.user.name
75
- end
76
- if users_name_id.key?(user_info.user.name)
77
- user_id = users_name_id[user_info.user.name]
78
- else
79
- user_id = user_info.user.id
80
- end
81
- end
82
- master_admins = config.masters.dup
83
- config.masters.each do |u|
84
- if users_id_name.key?(u)
85
- master_admins << users_id_name[u]
86
- elsif users_name_id.key?(u)
87
- master_admins << users_name_id[u]
88
- end
89
- end
90
-
91
- Dir["#{config.stats_path}.*.log"].sort.each do |file|
92
- if file >= "#{config.stats_path}.#{from_file}.log" or file <= "#{config.stats_path}.#{to_file}.log"
93
- CSV.foreach(file, headers: true, header_converters: :symbol, converters: :numeric) do |row|
94
- row[:date] = row[:date].to_s
95
- row[:user_name] = users_id_name[row[:user_id]]
96
- row[:user_id] = users_name_id[row[:user_name]]
97
- if !exclude_masters or (exclude_masters and !master_admins.include?(row[:user_name]) and
98
- !master_admins.include?(row[:user_id]) and
99
- !@master_admin_users_id.include?(row[:user_id]))
100
- if user=='' or (user!='' and row[:user_name] == user_name) or (user!='' and row[:user_id] == user_id)
101
- if exclude_command == '' or (exclude_command!='' and row[:command]!=exclude_command)
102
- if row[:bot_channel_id] == channel_id or channel_id == ''
103
- if row[:date] >= from and row[:date] <= to
104
- rows << row.to_h
105
- if monthly
106
- rows_month[row[:date][0..6]] = 0 unless rows_month.key?(row[:date][0..6])
107
- users_month[row[:date][0..6]] = [] unless users_month.key?(row[:date][0..6])
108
- commands_month[row[:date][0..6]] = [] unless commands_month.key?(row[:date][0..6])
109
- rows_month[row[:date][0..6]] += 1
110
- users_month[row[:date][0..6]] << row[:user_id]
111
- commands_month[row[:date][0..6]] << row[:command]
112
- end
113
- end
114
- end
115
- end
116
- end
117
- end
118
- end
119
- end
120
- end
121
- total = rows.size
122
- if exclude_masters
123
- message << 'Excluding master admins'
124
- end
125
- if exclude_command != ''
126
- message << "Excluding command #{exclude_command}"
127
- end
128
- if user!=''
129
- message << "Showing only user <@#{user}>"
130
- end
131
- if channel_id == ''
132
- message << "*Total calls*: #{total} from #{from_short} to #{to_short}"
133
- else
134
- message << "*Total calls <##{channel_id}>*: #{total} from #{from_short} to #{to_short}"
135
- end
136
- if total > 0
137
- if monthly
138
- message << '*Totals by month / commands / users (%new)*'
139
- all_users = []
140
- new_users = []
141
- rows_month.each do |k,v|
142
- if all_users.empty?
143
- message_new_users = ''
144
- else
145
- new_users = (users_month[k]-all_users).uniq
146
- message_new_users = "(#{new_users.size*100/users_month[k].uniq.size}%)"
147
- end
148
- all_users += users_month[k]
149
- message << "\t#{k}: #{v} (#{(v.to_f*100/total).round(2)}%) / #{commands_month[k].uniq.size} / #{users_month[k].uniq.size} #{message_new_users}"
150
- end
151
- end
152
-
153
- if channel_id == ''
154
- message << "*Channels*"
155
- channels = rows.bot_channel.uniq.sort
156
- channels.each do |channel|
157
- count = rows.count {|h| h.bot_channel==channel}
158
- message << "\t#{channel}: #{count} (#{(count.to_f*100/total).round(2)}%)"
159
- end
160
- end
161
- if user==''
162
- users = rows.user_id.uniq.sort
163
- message << "*Users* - #{users.size}"
164
- count_user = {}
165
- users.each do |user|
166
- count = rows.count {|h| h.user_id==user}
167
- count_user[user] = count
168
- end
169
- count_user.sort_by {|k,v| -v}.each do |user, count|
170
- message << "\t#{users_id_name[user]}: #{count} (#{(count.to_f*100/total).round(2)}%)"
171
- end
172
- end
173
-
174
- commands = rows.command.uniq.sort
175
- message << "*Commands* - #{commands.size}"
176
- commands.each do |command|
177
- count = rows.count {|h| h.command==command}
178
- message << "\t#{command}: #{count} (#{(count.to_f*100/total).round(2)}%)"
179
- end
180
-
181
- message << "*Message type*"
182
- types = rows.type_message.uniq.sort
183
- types.each do |type|
184
- count = rows.count {|h| h.type_message==type}
185
- message << "\t#{type}: #{count} (#{(count.to_f*100/total).round(2)}%)"
186
- end
187
- message << "*Last activity*: #{rows[-1].date} #{rows[-1].bot_channel} #{rows[-1].type_message} #{rows[-1].user_name} #{rows[-1].command}"
188
- end
189
- end
190
- else
191
- message<<"Only Master admin users on a private conversation with the bot can see the bot stats."
192
- end
193
- respond "#{message.join("\n")}", dest
194
- end
195
- end