slack-smart-bot 1.9.1 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
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