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
@@ -0,0 +1,314 @@
1
+ class SlackSmartBot
2
+ # help: ----------------------------------------------
3
+ # help: `bot stats`
4
+ # helpmaster: `bot stats USER_NAME`
5
+ # help: `bot stats exclude masters`
6
+ # help: `bot stats exclude routines`
7
+ # help: `bot stats from YYYY/MM/DD`
8
+ # help: `bot stats from YYYY/MM/DD to YYYY/MM/DD`
9
+ # help: `bot stats CHANNEL`
10
+ # help: `bot stats CHANNEL from YYYY/MM/DD`
11
+ # help: `bot stats CHANNEL from YYYY/MM/DD to YYYY/MM/DD`
12
+ # help: `bot stats command COMMAND`
13
+ # helpmaster: `bot stats USER_NAME from YYYY/MM/DD to YYYY/MM/DD`
14
+ # helpmaster: `bot stats CHANNEL USER_NAME from YYYY/MM/DD to YYYY/MM/DD`
15
+ # help: `bot stats CHANNEL exclude masters from YYYY/MM/DD to YYYY/MM/DD`
16
+ # help: `bot stats today`
17
+ # help: `bot stats exclude COMMAND_ID`
18
+ # help: `bot stats monthly`
19
+ # help: `bot stats alldata`
20
+ # help: To see the bot stats
21
+ # helpmaster: You can use this command only if you are a Master admin user and if you are in a private conversation with the bot
22
+ # helpmaster: You need to set stats to true to generate the stats when running the bot instance.
23
+ # help: If alldata option supplied then it will be attached files including all data and not only the top 10.
24
+ # help: Examples:
25
+ # help: _bot stats #sales_
26
+ # helpmaster: _bot stats @peter.wind_
27
+ # help: _bot stats #sales from 2019/12/15 to 2019/12/31_
28
+ # help: _bot stats #sales today_
29
+ # help: _bot stats #sales from 2020-01-01 monthly_
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>
32
+ # help:
33
+ def bot_stats(dest, from_user, typem, channel_id, from, to, user, st_command, exclude_masters, exclude_routines, exclude_command, monthly, all_data)
34
+ require 'csv'
35
+ if config.stats
36
+ message = []
37
+ else
38
+ message = ["You need to set stats to true to generate the stats when running the bot instance."]
39
+ end
40
+ save_stats(__method__)
41
+ if (from_user.id != user and (config.masters.include?(from_user.name) or @master_admin_users_id.include?(from_user.id)) and (typem==:on_dm or dest[0]=='D'))
42
+ on_dm_master = true #master admin user
43
+ else
44
+ on_dm_master = false
45
+ end
46
+ if on_dm_master or (from_user.id == user) # normal user can only see own stats
47
+ if !File.exist?("#{config.stats_path}.#{Time.now.strftime("%Y-%m")}.log")
48
+ message<<'No stats'
49
+ else
50
+ from = "#{Time.now.strftime("%Y-%m")}-01" if from == ''
51
+ to = "#{Time.now.strftime("%Y-%m-%d")}" if to == ''
52
+ from_short = from
53
+ to_short = to
54
+ from_file = from[0..3] + '-' + from[5..6]
55
+ to_file = to[0..3] + '-' + to[5..6]
56
+ from+= " 00:00:00 +0000"
57
+ to+= " 23:59:59 +0000"
58
+ rows = []
59
+ rows_month = {}
60
+ users_month = {}
61
+ commands_month = {}
62
+ users_id_name = {}
63
+ users_name_id = {}
64
+ count_users = {}
65
+ count_channels_dest = {}
66
+
67
+ # to translate global and enterprise users since sometimes was returning different names/ids
68
+ if from[0..3]=='2020' # this was an issue only on that period
69
+ Dir["#{config.stats_path}.*.log"].sort.each do |file|
70
+ if file >= "#{config.stats_path}.#{from_file}.log" or file <= "#{config.stats_path}.#{to_file}.log"
71
+ CSV.foreach(file, headers: true, header_converters: :symbol, converters: :numeric) do |row|
72
+ unless users_id_name.key?(row[:user_id])
73
+ users_id_name[row[:user_id]] = row[:user_name]
74
+ end
75
+ unless users_name_id.key?(row[:user_name])
76
+ users_name_id[row[:user_name]] = row[:user_id]
77
+ end
78
+
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ if user!=''
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]
88
+ else
89
+ user_name = user_info.name
90
+ end
91
+ if users_name_id.key?(user_info.name)
92
+ user_id = users_name_id[user_info.name]
93
+ else
94
+ user_id = user_info.id
95
+ end
96
+ end
97
+ master_admins = config.masters.dup
98
+ if users_id_name.size > 0
99
+ config.masters.each do |u|
100
+ if users_id_name.key?(u)
101
+ master_admins << users_id_name[u]
102
+ elsif users_name_id.key?(u)
103
+ master_admins << users_name_id[u]
104
+ end
105
+ end
106
+ end
107
+
108
+ Dir["#{config.stats_path}.*.log"].sort.each do |file|
109
+ if file >= "#{config.stats_path}.#{from_file}.log" and file <= "#{config.stats_path}.#{to_file}.log"
110
+ CSV.foreach(file, headers: true, header_converters: :symbol, converters: :numeric) do |row|
111
+ row[:date] = row[:date].to_s
112
+ if row[:dest_channel_id].to_s[0]=='D'
113
+ row[:dest_channel] = 'DM'
114
+ elsif row[:dest_channel].to_s == ''
115
+ row[:dest_channel] = row[:dest_channel_id]
116
+ end
117
+ if users_name_id.size > 0
118
+ row[:user_name] = users_id_name[row[:user_id]]
119
+ row[:user_id] = users_name_id[row[:user_name]]
120
+ else
121
+ users_id_name[row[:user_id]] ||= row[:user_name]
122
+ end
123
+ if !exclude_masters or (exclude_masters and !master_admins.include?(row[:user_name]) and
124
+ !master_admins.include?(row[:user_id]) and
125
+ !@master_admin_users_id.include?(row[:user_id]))
126
+ if !exclude_routines or (exclude_routines and !row[:user_name].match?(/^routine\//) )
127
+ if exclude_command == '' or (exclude_command!='' and row[:command]!=exclude_command)
128
+ if st_command == '' or (st_command != '' and row[:command] == st_command)
129
+ if row[:bot_channel_id] == channel_id or channel_id == '' or row[:dest_channel_id] == channel_id
130
+ if row[:date] >= from and row[:date] <= to
131
+ count_users[row[:user_id]] ||= 0
132
+ count_users[row[:user_id]] += 1
133
+ if user=='' or (user!='' and row[:user_name] == user_name) or (user!='' and row[:user_id] == user_id)
134
+ rows << row.to_h
135
+ count_channels_dest[row[:dest_channel]] ||= 0
136
+ count_channels_dest[row[:dest_channel]] += 1
137
+ if monthly
138
+ rows_month[row[:date][0..6]] = 0 unless rows_month.key?(row[:date][0..6])
139
+ users_month[row[:date][0..6]] = [] unless users_month.key?(row[:date][0..6])
140
+ commands_month[row[:date][0..6]] = [] unless commands_month.key?(row[:date][0..6])
141
+ rows_month[row[:date][0..6]] += 1
142
+ users_month[row[:date][0..6]] << row[:user_id]
143
+ commands_month[row[:date][0..6]] << row[:command]
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
155
+ total = rows.size
156
+ if exclude_masters
157
+ message << 'Excluding master admins'
158
+ end
159
+ if exclude_routines
160
+ message << 'Excluding routines'
161
+ end
162
+ if exclude_command != ''
163
+ message << "Excluding command #{exclude_command}"
164
+ end
165
+ if st_command != ''
166
+ message << "Including only command #{st_command}"
167
+ end
168
+ if user!=''
169
+ if user==from_user.id
170
+ message << "Bot stats for <@#{user}>"
171
+ else
172
+ message << "Showing only user <@#{user}>"
173
+ end
174
+ end
175
+ if channel_id == ''
176
+ message << "*Total calls*: #{total} from #{from_short} to #{to_short}"
177
+ else
178
+ message << "*Total calls <##{channel_id}>*: #{total} from #{from_short} to #{to_short}"
179
+ end
180
+ unless count_users.size == 0 or total == 0 or user == ''
181
+ my_place = (count_users.sort_by(&:last).reverse.to_h.keys.index(user_id)+1)
182
+ message <<"\tYou are the *\# #{my_place}* of *#{count_users.size}* users"
183
+ end
184
+ if total > 0
185
+ if monthly
186
+ if on_dm_master
187
+ message << '*Totals by month / commands / users (%new)*'
188
+ else
189
+ message << '*Totals by month / commands*'
190
+ end
191
+
192
+ all_users = []
193
+ new_users = []
194
+ rows_month.each do |k,v|
195
+ if all_users.empty?
196
+ message_new_users = ''
197
+ else
198
+ new_users = (users_month[k]-all_users).uniq
199
+ message_new_users = "(#{new_users.size*100/users_month[k].uniq.size}%)"
200
+ end
201
+ all_users += users_month[k]
202
+ if on_dm_master
203
+ message << "\t#{k}: #{v} (#{(v.to_f*100/total).round(2)}%) / #{commands_month[k].uniq.size} / #{users_month[k].uniq.size} #{message_new_users}"
204
+ else
205
+ message << "\t#{k}: #{v} (#{(v.to_f*100/total).round(2)}%) / #{commands_month[k].uniq.size}"
206
+ end
207
+ end
208
+ end
209
+
210
+ if channel_id == ''
211
+ message << "*SmartBots*"
212
+ channels = rows.bot_channel.uniq.sort
213
+ channels.each do |channel|
214
+ count = rows.count {|h| h.bot_channel==channel}
215
+ message << "\t#{channel}: #{count} (#{(count.to_f*100/total).round(2)}%)"
216
+ end
217
+ end
218
+ channels_dest_attachment = []
219
+ count_channels_dest = count_channels_dest.sort_by(&:last).reverse.to_h
220
+ if count_channels_dest.size > 10
221
+ message << "*From Channel* - #{count_channels_dest.size} (Top 10)"
222
+ else
223
+ message << "*From Channel* - #{count_channels_dest.size}"
224
+ end
225
+
226
+ count_channels_dest.keys[0..9].each do |ch|
227
+ message << "\t#{ch}: #{count_channels_dest[ch]} (#{(count_channels_dest[ch].to_f*100/total).round(2)}%)"
228
+ end
229
+ if count_channels_dest.size > 10 and all_data
230
+ count_channels_dest.each do |ch, value|
231
+ channels_dest_attachment << "\t#{ch}: #{value} (#{(value.to_f*100/total).round(2)}%)"
232
+ end
233
+ end
234
+
235
+
236
+ users_attachment = []
237
+ if user==''
238
+ users = rows.user_id.uniq.sort
239
+ if users.size > 10
240
+ message << "*Users* - #{users.size} (Top 10)"
241
+ else
242
+ message << "*Users* - #{users.size}"
243
+ end
244
+ count_user = {}
245
+ users.each do |user|
246
+ count = rows.count {|h| h.user_id==user}
247
+ count_user[user] = count
248
+ end
249
+ i = 0
250
+ count_user.sort_by {|k,v| -v}.each do |user, count|
251
+ i+=1
252
+ if i <= 10
253
+ message << "\t#{users_id_name[user]}: #{count} (#{(count.to_f*100/total).round(2)}%)"
254
+ end
255
+ if users.size > 10 and all_data
256
+ users_attachment << "\t#{users_id_name[user]}: #{count} (#{(count.to_f*100/total).round(2)}%)"
257
+ end
258
+ end
259
+ end
260
+ commands_attachment = []
261
+
262
+ if st_command == ''
263
+ commands = rows.command.uniq.sort
264
+ count_command = {}
265
+ commands.each do |command|
266
+ count = rows.count {|h| h.command==command}
267
+ count_command[command] = count
268
+ end
269
+
270
+ if commands.size > 10
271
+ message << "*Commands* - #{commands.size} (Top 10)"
272
+ else
273
+ message << "*Commands* - #{commands.size}"
274
+ end
275
+
276
+ i = 0
277
+ count_command.sort_by {|k,v| -v}.each do |command, count|
278
+ i+=1
279
+ if i <= 10
280
+ message << "\t#{command}: #{count} (#{(count.to_f*100/total).round(2)}%)"
281
+ end
282
+ if commands.size > 10 and all_data
283
+ commands_attachment << "\t#{command}: #{count} (#{(count.to_f*100/total).round(2)}%)"
284
+ end
285
+ end
286
+ end
287
+
288
+ message << "*Message type*"
289
+ types = rows.type_message.uniq.sort
290
+ types.each do |type|
291
+ count = rows.count {|h| h.type_message==type}
292
+ message << "\t#{type}: #{count} (#{(count.to_f*100/total).round(2)}%)"
293
+ end
294
+
295
+ if on_dm_master
296
+ message << "*Last activity*: #{rows[-1].date} #{rows[-1].bot_channel} #{rows[-1].type_message} #{rows[-1].user_name} #{rows[-1].command}"
297
+ end
298
+ if users_attachment.size>0
299
+ send_file(dest, "", 'users.txt', "", 'text/plain', "text", content: users_attachment.join("\n"))
300
+ end
301
+ if commands_attachment.size>0
302
+ send_file(dest, "", 'commands.txt', "", 'text/plain', "text", content: commands_attachment.join("\n"))
303
+ end
304
+ if channels_dest_attachment.size>0
305
+ send_file(dest, "", 'channels_dest.txt', "", 'text/plain', "text", content: channels_dest_attachment.join("\n"))
306
+ end
307
+ end
308
+ end
309
+ else
310
+ message<<"Only Master admin users on a private conversation with the bot can see this kind of bot stats."
311
+ end
312
+ respond "#{message.join("\n")}", dest
313
+ end
314
+ end
@@ -3,18 +3,16 @@ class SlackSmartBot
3
3
  # helpadmin: `bot status`
4
4
  # helpadmin: Displays the status of the bot
5
5
  # helpadmin: If on master channel and admin user also it will display info about bots created
6
+ # helpadmin: <https://github.com/MarioRuiz/slack-smart-bot#bot-management|more info>
6
7
  # helpadmin:
7
8
  def bot_status(dest, user)
8
9
  save_stats(__method__)
9
10
  get_bots_created()
10
- if config[:allow_access].key?(__method__) and !config[:allow_access][__method__].include?(user.name) and !config[:allow_access][__method__].include?(user.id) and
11
- (!user.key?(:enterprise_user) or ( user.key?(:enterprise_user) and !config[:allow_access][__method__].include?(user[:enterprise_user].id)))
12
- respond "You don't have access to use this command, please contact an Admin to be able to use it: <@#{config.admins.join(">, <@")}>"
13
- else
11
+ if has_access?(__method__, user)
14
12
  gems_remote = `gem list slack-smart-bot --remote`
15
13
  version_remote = gems_remote.to_s().scan(/slack-smart-bot \((\d+\.\d+\.\d+)/).join
16
14
  version_message = ""
17
- if version_remote != VERSION
15
+ if Gem::Version.new(version_remote) > Gem::Version.new(VERSION)
18
16
  version_message = " There is a new available version: #{version_remote}."
19
17
  end
20
18
  require "socket"
@@ -1,12 +1,5 @@
1
1
  class SlackSmartBot
2
2
 
3
- # help: ----------------------------------------------
4
- # help: `Bye Bot`
5
- # help: `Bye Smart`
6
- # help: `Bye NAME_OF_THE_BOT`
7
- # help: Also apart of Bye you can use _Bæ, Good Bye, Adiós, Ciao, Bless, Bless Bless, Adeu_
8
- # help: Bot stops listening to you
9
- # help:
10
3
  def bye_bot(dest, from, display_name)
11
4
  if @status == :on
12
5
  save_stats(__method__)
@@ -0,0 +1,34 @@
1
+ class SlackSmartBot
2
+
3
+ def delete_announcement(user, message_id)
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
+ end
15
+ found = false
16
+ message = ''
17
+ if @announcements.key?(channel) and @announcements[channel][:message_id].include?(message_id.to_i)
18
+ CSV.open("#{config.path}/announcements/#{channel}.csv", "w") do |csv|
19
+ @announcements[channel].each do |row|
20
+ if row[:message_id].to_i == message_id.to_i
21
+ message = row[:message]
22
+ row[:user_deleted] = user.name
23
+ end
24
+ csv << row
25
+ end
26
+ end
27
+ respond "The announcement has been deleted: #{message}"
28
+ else
29
+ respond "Sorry but I didn't find the message id #{message_id}. Call `see announcements` to see the ids."
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ class SlackSmartBot
2
+
3
+ def delete_share(user, share_id)
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}/shares/#{@channels_name[channel]}.csv") and !@shares.key?(@channels_name[channel])
12
+ t = CSV.table("#{config.path}/shares/#{@channels_name[channel]}.csv", headers: ['share_id', 'user_deleted', 'user_created', 'date', 'time', 'type', 'to_channel', 'condition'])
13
+ @shares[@channels_name[channel]] = t
14
+ end
15
+ found = false
16
+ message = ''
17
+ if @shares[@channels_name[channel]][:share_id].include?(share_id.to_i)
18
+ CSV.open("#{config.path}/shares/#{@channels_name[channel]}.csv", "w") do |csv|
19
+ @shares[@channels_name[channel]].each do |row|
20
+ if row[:share_id].to_i == share_id.to_i
21
+ message = row[:condition]
22
+ row[:user_deleted] = user.name
23
+ end
24
+ csv << row
25
+ end
26
+ end
27
+ respond "The share has been deleted: #{message}"
28
+ else
29
+ respond "Sorry but I didn't find the share id #{share_id}. Call `see shares` to see all the ids."
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -1,21 +1,26 @@
1
1
  class SlackSmartBot
2
2
 
3
- # help: ----------------------------------------------
4
- # help: `Hi Bot`
5
- # help: `Hi Smart`
6
- # help: `Hello Bot` `Hola Bot` `Hallo Bot` `What's up Bot` `Hey Bot` `Hæ Bot`
7
- # help: `Hello THE_NAME_OF_THE_BOT`
8
- # help: Also apart of Hello you can use _Hallo, Hi, Hola, What's up, Hey, Hæ_
9
- # help: Bot starts listening to you
10
- # help: After that if you want to avoid a single message to be treated by the smart bot, start the message by -
11
- # help:
12
- def hi_bot(user, dest, dchannel, from, display_name)
3
+ def hi_bot(user, dest, from, display_name)
13
4
  if @status == :on
14
5
  save_stats(__method__)
15
6
  greetings = ["Hello", "Hallo", "Hi", "Hola", "What's up", "Hey", "Hæ"].sample
16
7
  respond "#{greetings} #{display_name}", dest
8
+ if Thread.current[:typem] == :on_pub or Thread.current[:typem] == :on_pg
9
+ respond "You are on a channel where the SmartBot is just a member. You can only run general bot commands.\nCall `bot help` to see the commands you can use."
10
+ elsif Thread.current[:typem] == :on_extended
11
+ message = ["You are on an extended channel from <##{@channel_id}> so you can use all specific commands from that channel just adding !, !! or ^ before the command."]
12
+ message << "Call `bot help` to see the commands you can use."
13
+ respond message.join("\n")
14
+ elsif Thread.current[:typem] == :on_dm and Thread.current[:using_channel] == ''
15
+ respond "To start using the rules from a Bot channel call `use #CHANNEL`.\nAvailable SmartBots: <##{@bots_created.keys.join('>, <#')}>\nIf you want to call just one command from a specific channel: `#CHANNEL COMMAND`"
16
+ else
17
+ respond "You are on <##{@channel_id}> SmartBot channel. Call `bot help` to see all commands you can use or `bot rules` just to see the specific commands for this Bot channel."
18
+ end
17
19
  if Thread.current[:using_channel]!=''
18
- respond "You are using specific rules for channel: <##{Thread.current[:using_channel]}>", dest
20
+ message = ["You are using rules from <##{Thread.current[:using_channel]}>"]
21
+ message << "If you want to change bot channel rules call `use #CHANNEL` or `stop using rules from <##{Thread.current[:using_channel]}>` to stop using rules from this channel."
22
+ message << "You can call a command from any other channel by calling `#CHANNEL COMMAND`" if Thread.current[:typem] == :on_dm
23
+ respond message.join("\n")
19
24
  end
20
25
  @listening[from] = {} unless @listening.key?(from)
21
26
  if Thread.current[:on_thread]