slack-smart-bot 1.9.1 → 1.11.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 (121) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +184 -16
  3. data/lib/slack/smart-bot/comm/ask.rb +55 -49
  4. data/lib/slack/smart-bot/comm/delete.rb +13 -0
  5. data/lib/slack/smart-bot/comm/dont_understand.rb +3 -3
  6. data/lib/slack/smart-bot/comm/event_hello.rb +8 -4
  7. data/lib/slack/smart-bot/comm/get_channel_members.rb +13 -4
  8. data/lib/slack/smart-bot/comm/get_channels.rb +31 -16
  9. data/lib/slack/smart-bot/comm/get_presence.rb +20 -0
  10. data/lib/slack/smart-bot/comm/get_user_info.rb +12 -8
  11. data/lib/slack/smart-bot/comm/get_users.rb +24 -0
  12. data/lib/slack/smart-bot/comm/react.rb +19 -2
  13. data/lib/slack/smart-bot/comm/respond.rb +224 -53
  14. data/lib/slack/smart-bot/comm/respond_direct.rb +2 -3
  15. data/lib/slack/smart-bot/comm/respond_thread.rb +5 -0
  16. data/lib/slack/smart-bot/comm/send_file.rb +38 -34
  17. data/lib/slack/smart-bot/comm/send_msg_channel.rb +27 -22
  18. data/lib/slack/smart-bot/comm/send_msg_user.rb +59 -33
  19. data/lib/slack/smart-bot/comm/unreact.rb +22 -18
  20. data/lib/slack/smart-bot/comm.rb +4 -0
  21. data/lib/slack/smart-bot/commands/general/add_admin.rb +51 -0
  22. data/lib/slack/smart-bot/commands/general/add_announcement.rb +32 -0
  23. data/lib/slack/smart-bot/commands/general/add_team.rb +80 -0
  24. data/lib/slack/smart-bot/commands/general/allow_access.rb +67 -0
  25. data/lib/slack/smart-bot/commands/general/bot_help.rb +69 -33
  26. data/lib/slack/smart-bot/commands/general/bye_bot.rb +0 -7
  27. data/lib/slack/smart-bot/commands/general/delete_announcement.rb +34 -0
  28. data/lib/slack/smart-bot/commands/general/delete_share.rb +34 -0
  29. data/lib/slack/smart-bot/commands/general/delete_team.rb +34 -0
  30. data/lib/slack/smart-bot/commands/general/deny_access.rb +36 -0
  31. data/lib/slack/smart-bot/commands/general/hi_bot.rb +16 -11
  32. data/lib/slack/smart-bot/commands/general/ping_team.rb +100 -0
  33. data/lib/slack/smart-bot/commands/general/poster.rb +116 -0
  34. data/lib/slack/smart-bot/commands/general/remove_admin.rb +58 -0
  35. data/lib/slack/smart-bot/commands/general/see_access.rb +24 -0
  36. data/lib/slack/smart-bot/commands/general/see_admins.rb +33 -0
  37. data/lib/slack/smart-bot/commands/general/see_announcements.rb +115 -0
  38. data/lib/slack/smart-bot/commands/general/see_command_ids.rb +29 -0
  39. data/lib/slack/smart-bot/commands/general/see_favorite_commands.rb +53 -0
  40. data/lib/slack/smart-bot/commands/general/see_shares.rb +41 -0
  41. data/lib/slack/smart-bot/commands/general/see_statuses.rb +91 -0
  42. data/lib/slack/smart-bot/commands/general/see_teams.rb +252 -0
  43. data/lib/slack/smart-bot/commands/general/share_messages.rb +58 -0
  44. data/lib/slack/smart-bot/commands/general/update_team.rb +109 -0
  45. data/lib/slack/smart-bot/commands/general_bot_commands.rb +504 -0
  46. data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +4 -6
  47. data/lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb +45 -14
  48. data/lib/slack/smart-bot/commands/on_bot/admin/extend_rules.rb +4 -1
  49. data/lib/slack/smart-bot/commands/on_bot/admin/pause_bot.rb +6 -3
  50. data/lib/slack/smart-bot/commands/on_bot/admin/pause_routine.rb +3 -1
  51. data/lib/slack/smart-bot/commands/on_bot/admin/remove_routine.rb +4 -4
  52. data/lib/slack/smart-bot/commands/on_bot/admin/run_routine.rb +8 -2
  53. data/lib/slack/smart-bot/commands/on_bot/admin/see_result_routine.rb +33 -0
  54. data/lib/slack/smart-bot/commands/on_bot/admin/see_routines.rb +13 -10
  55. data/lib/slack/smart-bot/commands/on_bot/admin/start_bot.rb +6 -3
  56. data/lib/slack/smart-bot/commands/on_bot/admin/start_routine.rb +3 -1
  57. data/lib/slack/smart-bot/commands/on_bot/admin/stop_using_rules_on.rb +4 -1
  58. data/lib/slack/smart-bot/commands/on_bot/admin_master/delete_message.rb +25 -0
  59. data/lib/slack/smart-bot/commands/on_bot/admin_master/get_bot_logs.rb +1 -0
  60. data/lib/slack/smart-bot/commands/on_bot/admin_master/react_to.rb +34 -0
  61. data/lib/slack/smart-bot/commands/on_bot/admin_master/send_message.rb +37 -0
  62. data/lib/slack/smart-bot/commands/on_bot/delete_repl.rb +4 -5
  63. data/lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb +7 -8
  64. data/lib/slack/smart-bot/commands/on_bot/general/bot_stats.rb +400 -0
  65. data/lib/slack/smart-bot/commands/{general → on_bot/general}/bot_status.rb +3 -4
  66. data/lib/slack/smart-bot/commands/on_bot/general/leaderboard.rb +201 -0
  67. data/lib/slack/smart-bot/commands/{general → on_bot/general}/stop_using_rules.rb +12 -6
  68. data/lib/slack/smart-bot/commands/on_bot/general/suggest_command.rb +36 -0
  69. data/lib/slack/smart-bot/commands/{general → on_bot/general}/use_rules.rb +13 -11
  70. data/lib/slack/smart-bot/commands/{general → on_bot/general}/whats_new.rb +2 -1
  71. data/lib/slack/smart-bot/commands/on_bot/get_repl.rb +4 -5
  72. data/lib/slack/smart-bot/commands/on_bot/repl.rb +76 -21
  73. data/lib/slack/smart-bot/commands/on_bot/ruby_code.rb +3 -4
  74. data/lib/slack/smart-bot/commands/on_bot/run_repl.rb +15 -7
  75. data/lib/slack/smart-bot/commands/on_bot/see_repls.rb +5 -6
  76. data/lib/slack/smart-bot/commands/on_bot/see_shortcuts.rb +5 -6
  77. data/lib/slack/smart-bot/commands/on_extended/bot_rules.rb +45 -12
  78. data/lib/slack/smart-bot/commands/on_master/admin/kill_bot_on_channel.rb +7 -3
  79. data/lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb +4 -1
  80. data/lib/slack/smart-bot/commands/on_master/admin_master/notify_message.rb +3 -1
  81. data/lib/slack/smart-bot/commands/on_master/admin_master/publish_announcements.rb +33 -0
  82. data/lib/slack/smart-bot/commands/on_master/admin_master/set_general_message.rb +39 -0
  83. data/lib/slack/smart-bot/commands/on_master/admin_master/set_maintenance.rb +10 -1
  84. data/lib/slack/smart-bot/commands/on_master/create_bot.rb +28 -14
  85. data/lib/slack/smart-bot/commands/on_master/where_smartbot.rb +41 -0
  86. data/lib/slack/smart-bot/commands.rb +36 -5
  87. data/lib/slack/smart-bot/listen.rb +31 -33
  88. data/lib/slack/smart-bot/process.rb +234 -73
  89. data/lib/slack/smart-bot/process_first.rb +119 -38
  90. data/lib/slack/smart-bot/treat_message.rb +310 -237
  91. data/lib/slack/smart-bot/utils/build_help.rb +2 -2
  92. data/lib/slack/smart-bot/utils/create_routine_thread.rb +81 -46
  93. data/lib/slack/smart-bot/utils/get_access_channels.rb +13 -0
  94. data/lib/slack/smart-bot/utils/get_admins_channels.rb +13 -0
  95. data/lib/slack/smart-bot/utils/get_bots_created.rb +28 -8
  96. data/lib/slack/smart-bot/utils/get_channels_name_and_id.rb +7 -2
  97. data/lib/slack/smart-bot/utils/get_command_ids.rb +84 -0
  98. data/lib/slack/smart-bot/utils/get_help.rb +79 -73
  99. data/lib/slack/smart-bot/utils/get_repls.rb +22 -2
  100. data/lib/slack/smart-bot/utils/get_routines.rb +22 -2
  101. data/lib/slack/smart-bot/utils/get_shares.rb +12 -0
  102. data/lib/slack/smart-bot/utils/get_teams.rb +22 -0
  103. data/lib/slack/smart-bot/utils/has_access.rb +28 -0
  104. data/lib/slack/smart-bot/utils/is_admin.rb +27 -0
  105. data/lib/slack/smart-bot/utils/save_stats.rb +46 -41
  106. data/lib/slack/smart-bot/utils/save_status.rb +67 -0
  107. data/lib/slack/smart-bot/utils/update_access_channels.rb +8 -0
  108. data/lib/slack/smart-bot/utils/update_admins_channels.rb +8 -0
  109. data/lib/slack/smart-bot/utils/update_bots_file.rb +28 -7
  110. data/lib/slack/smart-bot/utils/update_repls.rb +7 -4
  111. data/lib/slack/smart-bot/utils/update_routines.rb +9 -3
  112. data/lib/slack/smart-bot/utils/update_shortcuts_file.rb +13 -6
  113. data/lib/slack/smart-bot/utils/update_teams.rb +16 -0
  114. data/lib/slack/smart-bot/utils.rb +11 -0
  115. data/lib/slack-smart-bot.rb +72 -12
  116. data/lib/slack-smart-bot_general_commands.rb +61 -0
  117. data/lib/slack-smart-bot_general_rules.rb +5 -2
  118. data/lib/slack-smart-bot_rules.rb +43 -17
  119. data/whats_new.txt +20 -15
  120. metadata +76 -9
  121. data/lib/slack/smart-bot/commands/general/bot_stats.rb +0 -313
@@ -0,0 +1,252 @@
1
+ class SlackSmartBot
2
+ def see_teams(user, team_name, search = "", add_stats: true)
3
+ save_stats(__method__) if add_stats
4
+
5
+ get_teams()
6
+ teams = @teams.deep_copy
7
+ if teams.empty?
8
+ respond "There are no teams added yet. Use `add team` command to add a team."
9
+ elsif team_name.to_s != "" and !teams.key?(team_name.to_sym) and (teams.keys.select {|t| (t.to_s.gsub('-','').gsub('_','') == team_name.to_s)}).empty?
10
+ respond "It seems like the team *#{team_name}* doesn't exist.\nRelated commands `add team TEAM_NAME PROPERTIES`, `see team TEAM_NAME`, `see teams`"
11
+ else
12
+ users_link = (Thread.current[:dest][0] == "D")
13
+ filter = (search != '')
14
+ react :runner
15
+ @users = get_users() if add_stats
16
+
17
+ messages = []
18
+ search_members = []
19
+ search_channels = []
20
+ search_info = []
21
+ if filter
22
+ search.split(' ').each do |s|
23
+ if s.match(/<@(\w+)>/i)
24
+ m = $1
25
+ user_info = @users.select { |u| u.id.downcase == m.downcase or (u.key?(:enterprise_user) and u.enterprise_user.id.downcase == m.downcase) }[-1]
26
+ search_members << user_info.name unless user_info.nil?
27
+ elsif s.match(/<#(\w+)\|[^>]*>/i)
28
+ c = $1.upcase
29
+ search_channels << @channels_name[c] if @channels_name.key?(c)
30
+ else
31
+ search_info << s
32
+ end
33
+ end
34
+ end
35
+ if team_name.to_s == '' and search.to_s == ''
36
+ dest = :on_thread
37
+ messages.unshift('Since there are many lines returned the results are returned on a thread by default.')
38
+ else
39
+ dest = Thread.current[:dest]
40
+ end
41
+
42
+ teams.each do |name, team|
43
+ filter ? add = false : add = true
44
+ if team_name.to_s == "" or (team_name.to_s == name.to_s) or (name.to_s.gsub('-','').gsub('_','') == team_name.to_s)
45
+ message = []
46
+ message << "*#{name.capitalize}*"
47
+
48
+ if filter and search_info.size > 0
49
+ all_info = true
50
+ search_info.each do |s|
51
+ if (team.members.keys.find { |e| /#{s}/i =~ e})
52
+ add = true
53
+ break
54
+ end
55
+ if !name.match?(/#{s}/i)
56
+ all_info = false
57
+ break
58
+ end
59
+ end
60
+ add = true if all_info
61
+ end
62
+
63
+ message << " > *_members_*"
64
+
65
+ assigned_members = team.members.values.flatten
66
+ assigned_members.uniq!
67
+ assigned_members.dup.each do |m|
68
+ user_info = @users.select { |u| u.id == m or (u.key?(:enterprise_user) and u.enterprise_user.id == m) or u.name == m or (u.key?(:enterprise_user) and u.enterprise_user.name == m) }[-1]
69
+ assigned_members.delete(m) if user_info.nil? or user_info.deleted
70
+ end
71
+
72
+ if team.channels.key?("members")
73
+ team_members = []
74
+ team.channels["members"].each do |ch|
75
+ get_channels_name_and_id() unless @channels_id.key?(ch)
76
+ tm = get_channel_members(@channels_id[ch])
77
+ if tm.nil?
78
+ respond ":exclamation: Add the Smart Bot to *##{ch}* channel to be able to get the list of members.", dest
79
+ else
80
+ tm.each do |m|
81
+ user_info = @users.select { |u| u.id == m or (u.key?(:enterprise_user) and u.enterprise_user.id == m) }[-1]
82
+ team_members << user_info.name unless user_info.is_app_user or user_info.is_bot
83
+ end
84
+ end
85
+ end
86
+ team_members.flatten!
87
+ team_members.uniq!
88
+ unassigned_members = team_members - assigned_members
89
+ unassigned_members.delete(config.nick)
90
+ not_on_team_channel = assigned_members - team_members
91
+ else
92
+ unassigned_members = []
93
+ not_on_team_channel = []
94
+ end
95
+ unless unassigned_members.empty?
96
+ um = unassigned_members.dup
97
+ um.each do |m|
98
+ user_info = @users.select { |u| u.name == m or (u.key?(:enterprise_user) and u.enterprise_user.name == m) }[-1]
99
+ unless user_info.nil? or user_info.profile.title.to_s==''
100
+ team.members[user_info.profile.title.to_snake_case] ||= []
101
+ team.members[user_info.profile.title.to_snake_case] << m
102
+ unassigned_members.delete(m)
103
+ end
104
+ end
105
+ unless unassigned_members.empty?
106
+ team.members["unassigned"] ||= []
107
+ team.members["unassigned"] += unassigned_members
108
+ team.members["unassigned"].sort!
109
+ end
110
+ end
111
+ unless not_on_team_channel.empty?
112
+ team.members["not on members channel"] = not_on_team_channel
113
+ team.members["not on members channel"].sort!
114
+ end
115
+ add = true if (team.members.values.flatten & search_members).size > 0
116
+ add = true if (team.channels.values.flatten & search_channels).size > 0
117
+ if filter and search_info.size > 0
118
+ all_info = true
119
+ search_info.each do |s|
120
+ if (team.members.keys.find { |e| /#{s}/i =~ e})
121
+ add = true
122
+ break
123
+ end
124
+ if !team.info.match?(/#{s}/i)
125
+ all_info = false
126
+ break
127
+ end
128
+ end
129
+ add = true if all_info
130
+ end
131
+
132
+ if add
133
+ if team_name.to_s != ""
134
+ team.members.each do |type, members|
135
+ message << " _`#{type}`_: "
136
+ members.each do |member|
137
+ types = [":palm_tree:", ":spiral_calendar_pad:", ":face_with_thermometer:"]
138
+ member_info = @users.select { |u| u.name == member }[-1]
139
+ if !member_info.nil? and !member_info.deleted
140
+ member_id = member_info.id
141
+ info = get_user_info(member_id)
142
+ emoji = info.user.profile.status_emoji
143
+ if types.include?(emoji)
144
+ status = emoji
145
+ else
146
+ active = (get_presence(member_id).presence.to_s == "active")
147
+ if active
148
+ user_info = @users.select { |u| u.id == member_id or (u.key?(:enterprise_user) and u.enterprise_user.name == member_id) }[-1]
149
+ if (user_info.tz_offset-user.tz_offset).abs <= (4*3600)
150
+ status = ":large_green_circle:"
151
+ else
152
+ status = ":large_yellow_circle:"
153
+ end
154
+ else
155
+ status = ":white_circle:"
156
+ end
157
+ end
158
+ else
159
+ status = ":exclamation:"
160
+ end
161
+ unless status == ':exclamation:'
162
+ if users_link
163
+ message[-1] += " #{status}<@#{member}>, "
164
+ else
165
+ user_info = @users.select { |u| u.name == member or (u.key?(:enterprise_user) and u.enterprise_user.name == member) }[-1]
166
+ unless user_info.nil?
167
+ if user_info.profile.display_name == ''
168
+ name = user_info.name
169
+ else
170
+ name = user_info.profile.display_name
171
+ end
172
+ message[-1] += " #{status} #{name}, "
173
+ end
174
+ end
175
+ end
176
+ end
177
+ message[-1].chop!
178
+ message[-1].chop!
179
+ end
180
+ else
181
+ team.members.each do |type, members|
182
+ if users_link
183
+ message << " _`#{type}`_: <@#{members.join(">, <@")}>"
184
+ else
185
+ membersn = []
186
+ members.each do |m|
187
+ user_info = @users.select { |u| u.name == m or (u.key?(:enterprise_user) and u.enterprise_user.name == m) }[-1]
188
+ unless user_info.nil? or user_info.deleted
189
+ if user_info.profile.display_name == ''
190
+ name = user_info.name
191
+ else
192
+ name = user_info.profile.display_name
193
+ end
194
+ membersn << name
195
+ end
196
+ end
197
+ message << " _`#{type}`_: #{membersn.join(" / ")}"
198
+ end
199
+ end
200
+ end
201
+ end
202
+
203
+
204
+ if add
205
+ message << " > *_channels_*"
206
+ team.channels.each do |type, channels|
207
+ channel_ids = []
208
+ channels.each do |ch|
209
+ channel_info = @channels_list.select { |c| c.name.to_s.downcase == ch.to_s.downcase}[-1]
210
+ if @channels_id.key?(ch) and (!channel_info.is_private or (channel_info.is_private and (team.members.values+[team.creator]).flatten.include?(user.name)))
211
+ channel_ids << @channels_id[ch]
212
+ end
213
+ end
214
+ message << " _`#{type}`_: <##{channel_ids.join("> <#")}>" unless channel_ids.empty?
215
+ end
216
+
217
+ unless team.info.empty?
218
+ team.info.split("\n").each do |m|
219
+ message << ">#{m}"
220
+ end
221
+ message << "> "
222
+ message << "> "
223
+ end
224
+ messages << message.join("\n")
225
+ end
226
+ end
227
+ end
228
+ unreact :runner
229
+ if messages.empty?
230
+ if filter
231
+ respond "It seems like we didn't find any team with the criteria supplied. Call `see teams` for a full list of teams."
232
+ else
233
+ respond "It seems like there are no teams added.\nUse `add team TEAM_NAME PROPERTIES` to add one. Call `bot help add team` for extended info."
234
+ end
235
+ else
236
+ if team_name.to_s != ""
237
+ message = "\n\n:palm_tree: On vacation / "
238
+ message += ":spiral_calendar_pad: In a meeting / "
239
+ message += ":face_with_thermometer: Sick leave / "
240
+ message += ":white_circle: Away / "
241
+ message += ":large_yellow_circle: Available in remote timezone / "
242
+ message += ":large_green_circle: Available"
243
+ messages[-1] << message
244
+ messages[-1] << "\n:information_source: Remote Time zone is >4h away from your current (#{user.tz_label})"
245
+ end
246
+ messages.each do |msg|
247
+ respond msg, dest, unfurl_links: false, unfurl_media: false
248
+ end
249
+ end
250
+ end
251
+ end
252
+ end
@@ -0,0 +1,58 @@
1
+ class SlackSmartBot
2
+ #todo: reaction type not added yet since RTM doesn't support it. See if we can add it as an event
3
+ def share_messages(user, from_channel, to_channel, condition)
4
+ save_stats(__method__)
5
+ if has_access?(__method__, user)
6
+ #todo: add a @shared variable to control not to be shared more than once when using reactions
7
+ #todo: it is only possible to share if smartbot is a member in both channels and the person adding the share command also
8
+ if Thread.current[:typem] == :on_call or Thread.current[:typem] == :on_dm
9
+ respond "You can use this command only from the source channel."
10
+ elsif from_channel == to_channel
11
+ respond "You cannot share messages on the same channel than source channel."
12
+ else
13
+ channels = get_channels(types: 'public_channel')
14
+ channel_found = channels.detect { |c| c.name == from_channel }
15
+ get_channels_name_and_id() unless @channels_id.key?(to_channel)
16
+ channel_found = false if !@channels_id.key?(to_channel)
17
+ if channel_found
18
+ members = get_channel_members(@channels_id[to_channel])
19
+ if members.include?(config.nick_id) and members.include?(user.id)
20
+ if condition.match?(/^\/.+\/$/)
21
+ type = :regexp
22
+ elsif condition.match?(/^".+"$/) or condition.match?(/^'.+'$/)
23
+ type = :text
24
+ else
25
+ type = :reaction
26
+ end
27
+ if File.exist?("#{config.path}/shares/#{from_channel}.csv")
28
+ t = CSV.table("#{config.path}/shares/#{from_channel}.csv", headers: ['share_id', 'user_deleted', 'user_created', 'date', 'time', 'type', 'to_channel', 'condition'])
29
+ @shares[from_channel] = t
30
+ if t.size>0
31
+ num = t[:share_id].max + 1
32
+ else
33
+ num = 1
34
+ end
35
+ elsif !@shares.key?(from_channel)
36
+ File.open("#{config.path}/shares/#{from_channel}.csv","w")
37
+ t = CSV.table("#{config.path}/shares/#{from_channel}.csv", headers: ['share_id', 'user_deleted', 'user_created', 'date', 'time', 'type', 'to_channel', 'condition'])
38
+ num = 1
39
+ @shares[from_channel] = t
40
+ else
41
+ num = @shares[from_channel][:share_id].max + 1
42
+ end
43
+ values = [num, '', user.name, Time.now.strftime("%Y/%m/%d"), Time.now.strftime("%H:%M"), type.to_s, to_channel, condition]
44
+ @shares[from_channel] << values
45
+ CSV.open("#{config.path}/shares/#{from_channel}.csv", "a+") do |csv|
46
+ csv << values
47
+ end
48
+ respond "*Share command*: id:#{num} Messages #{condition} will be shared from now on. Related commands `see shares`, `delete share ID`"
49
+ else
50
+ respond "*Share command*: The channel ##{to_channel} need to exist and the SmartBot and you have to be members."
51
+ end
52
+ else
53
+ respond "*Share command*: The channel <##{@channels_id[from_channel]}|#{from_channel}> has to be a public channel and the destination channel has to be a valid channel."
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,109 @@
1
+ class SlackSmartBot
2
+ def update_team(user, team_name, new_name: "", new_info: "", delete_opts: "", add_opts: "")
3
+ save_stats(__method__)
4
+ get_teams()
5
+ if !@teams.key?(team_name.to_sym)
6
+ respond "It seems like the team *#{team_name}* doesn't exist.\nRelated commands `add team TEAM_NAME PROPERTIES`, `see team TEAM_NAME`, `see teams`"
7
+ elsif !(@teams[team_name.to_sym].members.values + [@teams[team_name.to_sym].creator] + config.masters).flatten.include?(user.name)
8
+ respond "You have to be a member of the team, the creator or a Master admin to be able to update this team."
9
+ else
10
+ wrong = false
11
+ if new_name != ""
12
+ team = @teams[team_name.to_sym].deep_copy
13
+ @teams[new_name.to_sym] = team
14
+ @teams.delete(team_name.to_sym)
15
+ message = "The *#{team_name}* team has been renamed #{new_name}."
16
+ team_name = new_name
17
+ elsif new_info != ""
18
+ @teams[team_name.to_sym].info = new_info
19
+ elsif delete_opts != ""
20
+ last_type = nil
21
+ delete_opts.split(" ").each do |opt|
22
+ if opt.match?(/^\s*$/)
23
+ #blank
24
+ elsif opt.match?(/^[\w\-]+$/i)
25
+ last_type = opt
26
+ elsif opt.match(/<?@(\w+)>?/i) #accepts also @username for the case the user has been deactivated
27
+ member_id = $1
28
+ member_info = @users.select { |u| u.id == member_id or u.name == member_id or (u.key?(:enterprise_user) and u.enterprise_user.id == member_id) }[-1]
29
+ if last_type.nil?
30
+ @teams[team_name.to_sym].members.each do |type, members|
31
+ @teams[team_name.to_sym].members[type].delete(member_info.name)
32
+ end
33
+ else
34
+ @teams[team_name.to_sym].members[last_type] ||= []
35
+ @teams[team_name.to_sym].members[last_type].delete(member_info.name)
36
+ end
37
+ elsif opt.match(/<#(\w+)\|[^>]*>/i)
38
+ channel_id = $1
39
+ get_channels_name_and_id() unless @channels_name.keys.include?(channel_id)
40
+ channel = @channels_name[channel_id]
41
+ if last_type.nil?
42
+ @teams[team_name.to_sym].channels.each do |type, channels|
43
+ @teams[team_name.to_sym].channels[type].delete(channel)
44
+ end
45
+ else
46
+ @teams[team_name.to_sym].channels[last_type] ||= []
47
+ @teams[team_name.to_sym].channels[last_type].delete(channel)
48
+ end
49
+ else
50
+ respond "It seems like the members or channel list is not correct. Please double check."
51
+ wrong = true
52
+ break
53
+ end
54
+ end
55
+ tmembers = @teams[team_name.to_sym].members.deep_copy
56
+ tmembers.each do |type, members|
57
+ @teams[team_name.to_sym].members.delete(type) if members.empty?
58
+ end
59
+ tchannels = @teams[team_name.to_sym].channels.deep_copy
60
+ tchannels.each do |type, channels|
61
+ @teams[team_name.to_sym].channels.delete(type) if channels.empty?
62
+ end
63
+ elsif add_opts != ""
64
+ last_type = nil
65
+ add_opts.split(" ").each do |opt|
66
+ if opt.match?(/^\s*$/)
67
+ #blank
68
+ elsif opt.match?(/^[\w\-]+$/i)
69
+ last_type = opt
70
+ elsif opt.match(/<@(\w+)>/i)
71
+ member_id = $1
72
+ member_info = @users.select { |u| u.id == member_id or (u.key?(:enterprise_user) and u.enterprise_user.id == member_id) }[-1]
73
+ @teams[team_name.to_sym].members[last_type] ||= []
74
+ @teams[team_name.to_sym].members[last_type] << member_info.name
75
+ @teams[team_name.to_sym].members[last_type].uniq!
76
+ elsif opt.match(/<#(\w+)\|[^>]*>/i)
77
+ channel_id = $1
78
+ get_channels_name_and_id() unless @channels_name.keys.include?(channel_id)
79
+ channel = @channels_name[channel_id]
80
+ @teams[team_name.to_sym].channels[last_type] ||= []
81
+ @teams[team_name.to_sym].channels[last_type] << channel
82
+ @teams[team_name.to_sym].channels[last_type].uniq!
83
+ else
84
+ respond "It seems like the members or channel list is not correct. Please double check."
85
+ wrong = true
86
+ break
87
+ end
88
+ end
89
+ tmembers = @teams[team_name.to_sym].members.deep_copy
90
+ tmembers.each do |type, members|
91
+ @teams[team_name.to_sym].members.delete(type) if members.empty?
92
+ end
93
+ tchannels = @teams[team_name.to_sym].channels.deep_copy
94
+ tchannels.each do |type, channels|
95
+ @teams[team_name.to_sym].channels.delete(type) if channels.empty?
96
+ end
97
+ end
98
+ unless wrong
99
+ message ||= "The *#{team_name}* team has been updated."
100
+ @teams[team_name.to_sym].status = :updated
101
+ @teams[team_name.to_sym].user = user.name
102
+ @teams[team_name.to_sym].date = Time.now.strftime("%Y-%m-%dT%H:%M:%S.000Z")[0..18]
103
+ update_teams()
104
+ end
105
+ respond message
106
+ see_teams(user, team_name, add_stats: false) unless wrong
107
+ end
108
+ end
109
+ end