slack-smart-bot 1.13.2 → 1.14.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +142 -69
- data/lib/slack/smart-bot/ai/open_ai/connect.rb +61 -0
- data/lib/slack/smart-bot/ai/open_ai/models.rb +21 -0
- data/lib/slack/smart-bot/ai/open_ai/send_gpt_chat.rb +24 -0
- data/lib/slack/smart-bot/ai/open_ai/send_image_edit.rb +23 -0
- data/lib/slack/smart-bot/ai/open_ai/send_image_generation.rb +18 -0
- data/lib/slack/smart-bot/ai/open_ai/send_image_variation.rb +22 -0
- data/lib/slack/smart-bot/ai/open_ai/whisper_transcribe.rb +21 -0
- data/lib/slack/smart-bot/ai.rb +8 -0
- data/lib/slack/smart-bot/comm/get_channel_members.rb +15 -13
- data/lib/slack/smart-bot/comm/get_channels.rb +31 -29
- data/lib/slack/smart-bot/comm/respond_thread.rb +2 -2
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat.rb +40 -0
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_edit_image.rb +66 -0
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_generate_image.rb +65 -0
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_models.rb +37 -0
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_variations_image.rb +84 -0
- data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_whisper.rb +51 -0
- data/lib/slack/smart-bot/commands/general/bot_help.rb +1 -0
- data/lib/slack/smart-bot/commands/general/personal_settings.rb +38 -0
- data/lib/slack/smart-bot/commands/general/poster.rb +107 -104
- data/lib/slack/smart-bot/commands/general/public_holidays.rb +116 -114
- data/lib/slack/smart-bot/commands/general/set_public_holidays.rb +6 -2
- data/lib/slack/smart-bot/commands/general/teams/add_team.rb +87 -0
- data/lib/slack/smart-bot/commands/general/teams/delete_team.rb +69 -0
- data/lib/slack/smart-bot/commands/general/teams/memos/add_memo_team.rb +136 -0
- data/lib/slack/smart-bot/commands/general/teams/memos/add_memo_team_comment.rb +37 -0
- data/lib/slack/smart-bot/commands/general/teams/memos/delete_memo_team.rb +83 -0
- data/lib/slack/smart-bot/commands/general/teams/memos/see_memo_team.rb +97 -0
- data/lib/slack/smart-bot/commands/general/teams/memos/see_memos_team.rb +304 -0
- data/lib/slack/smart-bot/commands/general/teams/memos/set_memo_status.rb +66 -0
- data/lib/slack/smart-bot/commands/general/teams/ping_team.rb +104 -0
- data/lib/slack/smart-bot/commands/general/teams/see_teams.rb +236 -0
- data/lib/slack/smart-bot/commands/general/teams/see_vacations_team.rb +183 -0
- data/lib/slack/smart-bot/commands/general/teams/update_team.rb +137 -0
- data/lib/slack/smart-bot/commands/general_bot_commands.rb +905 -741
- data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +1 -0
- data/lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb +2 -2
- data/lib/slack/smart-bot/commands/on_bot/general/bot_stats.rb +379 -353
- data/lib/slack/smart-bot/commands/on_bot/repl.rb +6 -107
- data/lib/slack/smart-bot/commands/on_bot/repl_client.rb +233 -0
- data/lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb +17 -4
- data/lib/slack/smart-bot/commands.rb +26 -10
- data/lib/slack/smart-bot/process.rb +14 -3
- data/lib/slack/smart-bot/process_first.rb +36 -2
- data/lib/slack/smart-bot/treat_message.rb +28 -0
- data/lib/slack/smart-bot/utils/check_vacations.rb +1 -0
- data/lib/slack/smart-bot/utils/create_routine_thread.rb +1 -1
- data/lib/slack/smart-bot/utils/display_calendar.rb +17 -10
- data/lib/slack/smart-bot/utils/encryption/decrypt.rb +23 -0
- data/lib/slack/smart-bot/utils/encryption/encrypt.rb +27 -0
- data/lib/slack/smart-bot/utils/{encryption_get_key_iv.rb → encryption/encryption_get_key_iv.rb} +12 -8
- data/lib/slack/smart-bot/utils/get_help.rb +3 -1
- data/lib/slack/smart-bot/utils/get_personal_settings.rb +14 -0
- data/lib/slack/smart-bot/utils/get_teams.rb +2 -2
- data/lib/slack/smart-bot/utils/get_vacations.rb +2 -2
- data/lib/slack/smart-bot/utils/save_stats.rb +3 -1
- data/lib/slack/smart-bot/utils/update_personal_settings.rb +18 -0
- data/lib/slack/smart-bot/utils/update_teams.rb +1 -1
- data/lib/slack/smart-bot/utils/update_vacations.rb +1 -1
- data/lib/slack/smart-bot/utils.rb +5 -3
- data/lib/slack-smart-bot.rb +12 -0
- data/whats_new.txt +13 -14
- metadata +63 -15
- data/lib/slack/smart-bot/commands/general/add_memo_team.rb +0 -117
- data/lib/slack/smart-bot/commands/general/add_team.rb +0 -81
- data/lib/slack/smart-bot/commands/general/delete_memo_team.rb +0 -69
- data/lib/slack/smart-bot/commands/general/delete_team.rb +0 -55
- data/lib/slack/smart-bot/commands/general/ping_team.rb +0 -100
- data/lib/slack/smart-bot/commands/general/see_memos_team.rb +0 -202
- data/lib/slack/smart-bot/commands/general/see_teams.rb +0 -230
- data/lib/slack/smart-bot/commands/general/see_vacations_team.rb +0 -136
- data/lib/slack/smart-bot/commands/general/set_memo_status.rb +0 -58
- data/lib/slack/smart-bot/commands/general/update_team.rb +0 -131
- data/lib/slack/smart-bot/utils/decrypt.rb +0 -15
- data/lib/slack/smart-bot/utils/encrypt.rb +0 -15
@@ -1,230 +0,0 @@
|
|
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, unassigned_members, not_on_team_channel, channels_members, all_team_members = get_team_members(team)
|
66
|
-
|
67
|
-
unless unassigned_members.empty?
|
68
|
-
um = unassigned_members.dup
|
69
|
-
um.each do |m|
|
70
|
-
user_info = @users.select { |u| u.name == m or (u.key?(:enterprise_user) and u.enterprise_user.name == m) }[-1]
|
71
|
-
unless user_info.nil? or user_info.profile.title.to_s == ""
|
72
|
-
team.members[user_info.profile.title.to_snake_case] ||= []
|
73
|
-
team.members[user_info.profile.title.to_snake_case] << m
|
74
|
-
unassigned_members.delete(m)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
unless unassigned_members.empty?
|
78
|
-
team.members["unassigned"] ||= []
|
79
|
-
team.members["unassigned"] += unassigned_members
|
80
|
-
team.members["unassigned"].sort!
|
81
|
-
end
|
82
|
-
end
|
83
|
-
unless not_on_team_channel.empty?
|
84
|
-
team.members["not on members channel"] = not_on_team_channel
|
85
|
-
team.members["not on members channel"].sort!
|
86
|
-
end
|
87
|
-
add = true if (team.members.values.flatten & search_members).size > 0
|
88
|
-
add = true if (team.channels.values.flatten & search_channels).size > 0
|
89
|
-
if filter and search_info.size > 0
|
90
|
-
all_info = true
|
91
|
-
search_info.each do |s|
|
92
|
-
if (team.members.keys.find { |e| /#{s}/i =~ e })
|
93
|
-
add = true
|
94
|
-
break
|
95
|
-
end
|
96
|
-
if !team.info.match?(/#{s}/i)
|
97
|
-
all_info = false
|
98
|
-
break
|
99
|
-
end
|
100
|
-
end
|
101
|
-
add = true if all_info
|
102
|
-
end
|
103
|
-
|
104
|
-
if add
|
105
|
-
if team_name.to_s != ""
|
106
|
-
team.members.each do |type, members|
|
107
|
-
message << " _`#{type}`_: "
|
108
|
-
members.each do |member|
|
109
|
-
types = [":palm_tree:", ":spiral_calendar_pad:", ":face_with_thermometer:", ":baby:"]
|
110
|
-
member_info = @users.select { |u| u.name == member }[-1]
|
111
|
-
if !member_info.nil? and !member_info.deleted
|
112
|
-
member_id = member_info.id
|
113
|
-
info = get_user_info(member_id)
|
114
|
-
emoji = info.user.profile.status_emoji
|
115
|
-
if types.include?(emoji)
|
116
|
-
status = emoji
|
117
|
-
else
|
118
|
-
active = (get_presence(member_id).presence.to_s == "active")
|
119
|
-
if active
|
120
|
-
user_info = @users.select { |u| u.id == member_id or (u.key?(:enterprise_user) and u.enterprise_user.name == member_id) }[-1]
|
121
|
-
if (user_info.tz_offset - user.tz_offset).abs <= (4 * 3600)
|
122
|
-
status = ":large_green_circle:"
|
123
|
-
else
|
124
|
-
status = ":large_yellow_circle:"
|
125
|
-
end
|
126
|
-
else
|
127
|
-
status = ":white_circle:"
|
128
|
-
end
|
129
|
-
end
|
130
|
-
else
|
131
|
-
status = ":exclamation:"
|
132
|
-
end
|
133
|
-
unless status == ":exclamation:"
|
134
|
-
if users_link
|
135
|
-
message[-1] += " #{status}<@#{member}>, "
|
136
|
-
else
|
137
|
-
user_info = @users.select { |u| u.name == member or (u.key?(:enterprise_user) and u.enterprise_user.name == member) }[-1]
|
138
|
-
unless user_info.nil?
|
139
|
-
if user_info.profile.display_name == ""
|
140
|
-
name = user_info.name
|
141
|
-
else
|
142
|
-
name = user_info.profile.display_name
|
143
|
-
end
|
144
|
-
message[-1] += " #{status} #{name}, "
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
149
|
-
message[-1].chop!
|
150
|
-
message[-1].chop!
|
151
|
-
end
|
152
|
-
else
|
153
|
-
team.members.each do |type, members|
|
154
|
-
if users_link
|
155
|
-
message << " _`#{type}`_: <@#{members.join(">, <@")}>"
|
156
|
-
else
|
157
|
-
membersn = []
|
158
|
-
members.each do |m|
|
159
|
-
user_info = @users.select { |u| u.name == m or (u.key?(:enterprise_user) and u.enterprise_user.name == m) }[-1]
|
160
|
-
unless user_info.nil? or user_info.deleted
|
161
|
-
if user_info.profile.display_name == ""
|
162
|
-
name = user_info.name
|
163
|
-
else
|
164
|
-
name = user_info.profile.display_name
|
165
|
-
end
|
166
|
-
membersn << name
|
167
|
-
end
|
168
|
-
end
|
169
|
-
message << " _`#{type}`_: #{membersn.join(" / ")}"
|
170
|
-
end
|
171
|
-
end
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
if add
|
176
|
-
message << " > *_channels_*"
|
177
|
-
team.channels.each do |type, channels|
|
178
|
-
channel_ids = []
|
179
|
-
channels.each do |ch|
|
180
|
-
channel_info = @channels_list.select { |c| c.name.to_s.downcase == ch.to_s.downcase }[-1]
|
181
|
-
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)))
|
182
|
-
channel_ids << @channels_id[ch]
|
183
|
-
end
|
184
|
-
end
|
185
|
-
message << " _`#{type}`_: <##{channel_ids.join("> <#")}>" unless channel_ids.empty?
|
186
|
-
end
|
187
|
-
|
188
|
-
unless !team.key?(:memos) or team.memos.empty? or (team_name.to_s == "" and search.to_s == "")
|
189
|
-
message += see_memos_team(user, type: "all", add_stats: false, team: team)
|
190
|
-
end
|
191
|
-
|
192
|
-
unless team.info.empty?
|
193
|
-
team.info.split("\n").each do |m|
|
194
|
-
message << ">#{m}"
|
195
|
-
end
|
196
|
-
message << "> "
|
197
|
-
message << "> "
|
198
|
-
end
|
199
|
-
messages << message.join("\n")
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
|
-
unreact :runner
|
204
|
-
if messages.empty?
|
205
|
-
if filter
|
206
|
-
respond "It seems like we didn't find any team with the criteria supplied. Call `see teams` for a full list of teams."
|
207
|
-
else
|
208
|
-
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."
|
209
|
-
end
|
210
|
-
else
|
211
|
-
if team_name.to_s != ""
|
212
|
-
message = "\n\n:palm_tree: On vacation / "
|
213
|
-
message += ":spiral_calendar_pad: In a meeting / "
|
214
|
-
message += ":face_with_thermometer: :baby: Sick leave / "
|
215
|
-
message += ":white_circle: Away / "
|
216
|
-
message += ":large_yellow_circle: Available in remote timezone / "
|
217
|
-
message += ":large_green_circle: Available"
|
218
|
-
messages[-1] << message
|
219
|
-
messages[-1] << "\n:information_source: Remote Time zone is >4h away from your current (#{user.tz_label})"
|
220
|
-
end
|
221
|
-
messages.each do |msg|
|
222
|
-
respond msg, dest, unfurl_links: false, unfurl_media: false
|
223
|
-
end
|
224
|
-
unless team_name.to_s.empty?
|
225
|
-
see_vacations_team(user, team_name, Date.today.strftime("%Y/%m/%d"), add_stats: false)
|
226
|
-
end
|
227
|
-
end
|
228
|
-
end
|
229
|
-
end
|
230
|
-
end
|
@@ -1,136 +0,0 @@
|
|
1
|
-
class SlackSmartBot
|
2
|
-
def see_vacations_team(user, team_name, date, 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
|
-
teams.each do |name, team|
|
13
|
-
if team_name==name.to_s or (name.to_s.gsub("-", "").gsub("_", "") == team_name.to_s)
|
14
|
-
team_name = name.to_s
|
15
|
-
break
|
16
|
-
end
|
17
|
-
end
|
18
|
-
date.gsub!('-','/')
|
19
|
-
get_vacations()
|
20
|
-
team = teams[team_name.to_sym]
|
21
|
-
assigned_members = team.members.values.flatten
|
22
|
-
assigned_members.uniq!
|
23
|
-
assigned_members.dup.each do |m|
|
24
|
-
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]
|
25
|
-
assigned_members.delete(m) if user_info.nil? or user_info.deleted
|
26
|
-
end
|
27
|
-
|
28
|
-
channels_members = []
|
29
|
-
all_team_members = assigned_members.dup
|
30
|
-
if team.channels.key?("members")
|
31
|
-
team_members = []
|
32
|
-
team.channels["members"].each do |ch|
|
33
|
-
get_channels_name_and_id() unless @channels_id.key?(ch)
|
34
|
-
tm = get_channel_members(@channels_id[ch])
|
35
|
-
if tm.nil?
|
36
|
-
respond ":exclamation: Add the Smart Bot to *##{ch}* channel to be able to get the list of members.", dest
|
37
|
-
else
|
38
|
-
channels_members << @channels_id[ch]
|
39
|
-
tm.each do |m|
|
40
|
-
user_info = @users.select { |u| u.id == m or (u.key?(:enterprise_user) and u.enterprise_user.id == m) }[-1]
|
41
|
-
team_members << user_info.name unless user_info.is_app_user or user_info.is_bot
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
team_members.flatten!
|
46
|
-
all_team_members += team_members
|
47
|
-
all_team_members.uniq!
|
48
|
-
end
|
49
|
-
unless all_team_members.empty?
|
50
|
-
blocks_header =
|
51
|
-
{
|
52
|
-
"type": "context",
|
53
|
-
elements: [
|
54
|
-
{
|
55
|
-
type: "mrkdwn",
|
56
|
-
text: "*Time Off #{team_name} team* from #{date} ",
|
57
|
-
},
|
58
|
-
],
|
59
|
-
}
|
60
|
-
|
61
|
-
from = Date.parse(date, "%Y/%m/%d")
|
62
|
-
blocks = []
|
63
|
-
all_team_members.each do |m|
|
64
|
-
@users = get_users() if @users.empty?
|
65
|
-
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]
|
66
|
-
unless info.nil?
|
67
|
-
info = get_user_info(info.id)
|
68
|
-
if @vacations.key?(m)
|
69
|
-
v = ""
|
70
|
-
(from..(from+20)).each do |d|
|
71
|
-
v+="#{d.strftime("%d")} " if d.wday==1 or d==from
|
72
|
-
on_vacation = false
|
73
|
-
@vacations[m].periods.each do |p|
|
74
|
-
if p.from <= d.strftime("%Y/%m/%d") and p.to >= d.strftime("%Y/%m/%d")
|
75
|
-
if d.wday == 0 or d.wday == 6
|
76
|
-
v+=":large_orange_square: "
|
77
|
-
else
|
78
|
-
v+=":large_red_square: "
|
79
|
-
end
|
80
|
-
on_vacation=true
|
81
|
-
break
|
82
|
-
end
|
83
|
-
end
|
84
|
-
unless on_vacation
|
85
|
-
if d.wday == 0 or d.wday == 6
|
86
|
-
v += ":large_yellow_square: "
|
87
|
-
else
|
88
|
-
v+= ":white_square: "
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
else
|
93
|
-
v = ""
|
94
|
-
(from..(from+20)).each do |d|
|
95
|
-
if d.wday==1 or d==from
|
96
|
-
v += "#{d.strftime("%d")} "
|
97
|
-
end
|
98
|
-
if d.wday == 0 or d.wday == 6
|
99
|
-
v += ":large_yellow_square: "
|
100
|
-
else
|
101
|
-
v += ":white_square: "
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
blocks << {
|
107
|
-
type: "context",
|
108
|
-
elements: [
|
109
|
-
{
|
110
|
-
type: "image",
|
111
|
-
image_url: info.user.profile.image_24,
|
112
|
-
alt_text: info.user.name,
|
113
|
-
},
|
114
|
-
{
|
115
|
-
type: "plain_text",
|
116
|
-
text: v
|
117
|
-
}
|
118
|
-
],
|
119
|
-
}
|
120
|
-
end
|
121
|
-
end
|
122
|
-
first = true
|
123
|
-
blocks.each_slice(10).each do |b|
|
124
|
-
if first
|
125
|
-
b.unshift(blocks_header)
|
126
|
-
first = false
|
127
|
-
end
|
128
|
-
respond blocks: b
|
129
|
-
end
|
130
|
-
|
131
|
-
end
|
132
|
-
|
133
|
-
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
class SlackSmartBot
|
2
|
-
def set_memo_status(user, team_name, memo_id, status)
|
3
|
-
save_stats(__method__) if answer.empty?
|
4
|
-
|
5
|
-
get_teams()
|
6
|
-
if @teams.key?(team_name.to_sym)
|
7
|
-
assigned_members = @teams[team_name.to_sym].members.values.flatten
|
8
|
-
assigned_members.uniq!
|
9
|
-
all_team_members = assigned_members.dup
|
10
|
-
team_members = []
|
11
|
-
if @teams[team_name.to_sym].channels.key?("members")
|
12
|
-
@teams[team_name.to_sym].channels["members"].each do |ch|
|
13
|
-
get_channels_name_and_id() unless @channels_id.key?(ch)
|
14
|
-
tm = get_channel_members(@channels_id[ch])
|
15
|
-
tm.each do |m|
|
16
|
-
user_info = @users.select { |u| u.id == m or (u.key?(:enterprise_user) and u.enterprise_user.id == m) }[-1]
|
17
|
-
team_members << user_info.name unless user_info.is_app_user or user_info.is_bot
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
team_members.flatten!
|
22
|
-
team_members.uniq!
|
23
|
-
all_team_members += team_members
|
24
|
-
all_team_members.uniq!
|
25
|
-
end
|
26
|
-
|
27
|
-
if !@teams.key?(team_name.to_sym)
|
28
|
-
respond "It seems like the team *#{team_name}* doesn't exist.\nRelated commands `add team TEAM_NAME PROPERTIES`, `see team TEAM_NAME`, `see teams`"
|
29
|
-
elsif !(all_team_members + config.masters).flatten.include?(user.name)
|
30
|
-
respond "You have to be a member of the team or a Master admin to be able to set the status of a memo."
|
31
|
-
elsif !@teams[team_name.to_sym].key?(:memos) or @teams[team_name.to_sym][:memos].empty? or !@teams[team_name.to_sym][:memos].memo_id.include?(memo_id.to_i)
|
32
|
-
respond "It seems like there is no memo with id #{memo_id}"
|
33
|
-
elsif @teams[team_name.to_sym][:memos].memo_id.include?(memo_id.to_i)
|
34
|
-
memo_selected = @teams[team_name.to_sym][:memos].select { |m| m.memo_id == memo_id.to_i }[-1]
|
35
|
-
if memo_selected.type == 'jira' or memo_selected.type == 'github'
|
36
|
-
#todo: add tests for jira and github
|
37
|
-
respond "The memo specified is a #{memo_selected.type} and the status in those cases are linked to the specific issues in #{memo_selected.type}."
|
38
|
-
elsif memo_selected.privacy == "personal" and memo_selected.user != user.name
|
39
|
-
respond "Only the creator can set the status of a personal memo."
|
40
|
-
else
|
41
|
-
answer_delete
|
42
|
-
memos = []
|
43
|
-
message = ""
|
44
|
-
get_teams()
|
45
|
-
@teams[team_name.to_sym][:memos].each do |memo|
|
46
|
-
if memo.memo_id == memo_id.to_i
|
47
|
-
memo.status = status
|
48
|
-
message = memo.message
|
49
|
-
end
|
50
|
-
memos << memo
|
51
|
-
end
|
52
|
-
@teams[team_name.to_sym][:memos] = memos
|
53
|
-
update_teams()
|
54
|
-
respond "The memo status has been updated on team #{team_name}: #{message}"
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
@@ -1,131 +0,0 @@
|
|
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
|
-
assigned_members = @teams[team_name.to_sym].members.values.flatten
|
7
|
-
assigned_members.uniq!
|
8
|
-
all_team_members = assigned_members.dup
|
9
|
-
team_members = []
|
10
|
-
if @teams[team_name.to_sym].channels.key?("members")
|
11
|
-
@teams[team_name.to_sym].channels["members"].each do |ch|
|
12
|
-
get_channels_name_and_id() unless @channels_id.key?(ch)
|
13
|
-
tm = get_channel_members(@channels_id[ch])
|
14
|
-
tm.each do |m|
|
15
|
-
user_info = @users.select { |u| u.id == m or (u.key?(:enterprise_user) and u.enterprise_user.id == m) }[-1]
|
16
|
-
team_members << user_info.name unless user_info.is_app_user or user_info.is_bot
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
team_members.flatten!
|
21
|
-
team_members.uniq!
|
22
|
-
all_team_members += team_members
|
23
|
-
all_team_members.uniq!
|
24
|
-
end
|
25
|
-
if !@teams.key?(team_name.to_sym)
|
26
|
-
respond "It seems like the team *#{team_name}* doesn't exist.\nRelated commands `add team TEAM_NAME PROPERTIES`, `see team TEAM_NAME`, `see teams`"
|
27
|
-
elsif !(all_team_members + [@teams[team_name.to_sym].creator] + config.masters).flatten.include?(user.name)
|
28
|
-
respond "You have to be a member of the team, the creator or a Master admin to be able to update this team."
|
29
|
-
else
|
30
|
-
wrong = false
|
31
|
-
if new_name != ""
|
32
|
-
team = @teams[team_name.to_sym].deep_copy
|
33
|
-
@teams[new_name.to_sym] = team
|
34
|
-
@teams.delete(team_name.to_sym)
|
35
|
-
File.delete(File.join(config.path, "teams", "t_#{team_name}.yaml"))
|
36
|
-
message = "The *#{team_name}* team has been renamed #{new_name}."
|
37
|
-
team_name = new_name
|
38
|
-
elsif new_info != ""
|
39
|
-
@teams[team_name.to_sym].info = new_info
|
40
|
-
elsif delete_opts != ""
|
41
|
-
last_type = nil
|
42
|
-
delete_opts.split(" ").each do |opt|
|
43
|
-
if opt.match?(/^\s*$/)
|
44
|
-
#blank
|
45
|
-
elsif opt.match?(/^[\w\-]+$/i)
|
46
|
-
last_type = opt
|
47
|
-
elsif opt.match(/<?@(\w+)>?/i) #accepts also @username for the case the user has been deactivated
|
48
|
-
member_id = $1
|
49
|
-
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]
|
50
|
-
if last_type.nil?
|
51
|
-
@teams[team_name.to_sym].members.each do |type, members|
|
52
|
-
@teams[team_name.to_sym].members[type].delete(member_info.name)
|
53
|
-
end
|
54
|
-
else
|
55
|
-
@teams[team_name.to_sym].members[last_type] ||= []
|
56
|
-
@teams[team_name.to_sym].members[last_type].delete(member_info.name)
|
57
|
-
end
|
58
|
-
elsif opt.match(/<#(\w+)\|[^>]*>/i)
|
59
|
-
channel_id = $1
|
60
|
-
get_channels_name_and_id() unless @channels_name.keys.include?(channel_id)
|
61
|
-
channel = @channels_name[channel_id]
|
62
|
-
if last_type.nil?
|
63
|
-
@teams[team_name.to_sym].channels.each do |type, channels|
|
64
|
-
@teams[team_name.to_sym].channels[type].delete(channel)
|
65
|
-
end
|
66
|
-
else
|
67
|
-
@teams[team_name.to_sym].channels[last_type] ||= []
|
68
|
-
@teams[team_name.to_sym].channels[last_type].delete(channel)
|
69
|
-
end
|
70
|
-
else
|
71
|
-
respond "It seems like the members or channel list is not correct. Please double check."
|
72
|
-
wrong = true
|
73
|
-
break
|
74
|
-
end
|
75
|
-
end
|
76
|
-
tmembers = @teams[team_name.to_sym].members.deep_copy
|
77
|
-
tmembers.each do |type, members|
|
78
|
-
@teams[team_name.to_sym].members.delete(type) if members.empty?
|
79
|
-
end
|
80
|
-
tchannels = @teams[team_name.to_sym].channels.deep_copy
|
81
|
-
tchannels.each do |type, channels|
|
82
|
-
@teams[team_name.to_sym].channels.delete(type) if channels.empty?
|
83
|
-
end
|
84
|
-
elsif add_opts != ""
|
85
|
-
last_type = nil
|
86
|
-
add_opts.split(" ").each do |opt|
|
87
|
-
if opt.match?(/^\s*$/)
|
88
|
-
#blank
|
89
|
-
elsif opt.match?(/^[\w\-]+$/i)
|
90
|
-
last_type = opt
|
91
|
-
elsif opt.match(/<@(\w+)>/i)
|
92
|
-
member_id = $1
|
93
|
-
last_type = 'no_type' if last_type.nil?
|
94
|
-
member_info = @users.select { |u| u.id == member_id or (u.key?(:enterprise_user) and u.enterprise_user.id == member_id) }[-1]
|
95
|
-
@teams[team_name.to_sym].members[last_type] ||= []
|
96
|
-
@teams[team_name.to_sym].members[last_type] << member_info.name
|
97
|
-
@teams[team_name.to_sym].members[last_type].uniq!
|
98
|
-
elsif opt.match(/<#(\w+)\|[^>]*>/i)
|
99
|
-
channel_id = $1
|
100
|
-
get_channels_name_and_id() unless @channels_name.keys.include?(channel_id)
|
101
|
-
channel = @channels_name[channel_id]
|
102
|
-
@teams[team_name.to_sym].channels[last_type] ||= []
|
103
|
-
@teams[team_name.to_sym].channels[last_type] << channel
|
104
|
-
@teams[team_name.to_sym].channels[last_type].uniq!
|
105
|
-
else
|
106
|
-
respond "It seems like the members or channel list is not correct. Please double check."
|
107
|
-
wrong = true
|
108
|
-
break
|
109
|
-
end
|
110
|
-
end
|
111
|
-
tmembers = @teams[team_name.to_sym].members.deep_copy
|
112
|
-
tmembers.each do |type, members|
|
113
|
-
@teams[team_name.to_sym].members.delete(type) if members.empty?
|
114
|
-
end
|
115
|
-
tchannels = @teams[team_name.to_sym].channels.deep_copy
|
116
|
-
tchannels.each do |type, channels|
|
117
|
-
@teams[team_name.to_sym].channels.delete(type) if channels.empty?
|
118
|
-
end
|
119
|
-
end
|
120
|
-
unless wrong
|
121
|
-
message ||= "The *#{team_name}* team has been updated."
|
122
|
-
@teams[team_name.to_sym].status = :updated
|
123
|
-
@teams[team_name.to_sym].user = user.name
|
124
|
-
@teams[team_name.to_sym].date = Time.now.strftime("%Y-%m-%dT%H:%M:%S.000Z")[0..18]
|
125
|
-
update_teams()
|
126
|
-
end
|
127
|
-
respond message
|
128
|
-
see_teams(user, team_name, add_stats: false) unless wrong
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
class SlackSmartBot
|
2
|
-
def decrypt(data)
|
3
|
-
require "openssl"
|
4
|
-
require "base64"
|
5
|
-
|
6
|
-
key, iv = encryption_get_key_iv()
|
7
|
-
encrypted = Base64.decode64(data)
|
8
|
-
cipher = OpenSSL::Cipher.new("AES-256-CBC")
|
9
|
-
cipher.decrypt
|
10
|
-
cipher.key = key
|
11
|
-
cipher.iv = iv
|
12
|
-
plain = cipher.update(encrypted) + cipher.final
|
13
|
-
return plain
|
14
|
-
end
|
15
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
class SlackSmartBot
|
2
|
-
def encrypt(data)
|
3
|
-
require "openssl"
|
4
|
-
require "base64"
|
5
|
-
|
6
|
-
key, iv = encryption_get_key_iv()
|
7
|
-
cipher = OpenSSL::Cipher::Cipher.new "AES-256-CBC"
|
8
|
-
cipher.encrypt
|
9
|
-
cipher.key = key
|
10
|
-
cipher.iv = iv
|
11
|
-
encrypted = cipher.update(data) + cipher.final
|
12
|
-
encrypted = Base64.encode64(encrypted)
|
13
|
-
return encrypted
|
14
|
-
end
|
15
|
-
end
|