slack-smart-bot 1.13.1 → 1.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +100 -4
  3. data/lib/slack/smart-bot/ai/open_ai/connect.rb +61 -0
  4. data/lib/slack/smart-bot/ai/open_ai/models.rb +21 -0
  5. data/lib/slack/smart-bot/ai/open_ai/send_gpt_chat.rb +24 -0
  6. data/lib/slack/smart-bot/ai/open_ai/send_image_edit.rb +23 -0
  7. data/lib/slack/smart-bot/ai/open_ai/send_image_generation.rb +18 -0
  8. data/lib/slack/smart-bot/ai/open_ai/send_image_variation.rb +22 -0
  9. data/lib/slack/smart-bot/ai/open_ai/whisper_transcribe.rb +21 -0
  10. data/lib/slack/smart-bot/ai.rb +8 -0
  11. data/lib/slack/smart-bot/comm/get_channel_members.rb +15 -13
  12. data/lib/slack/smart-bot/comm/get_channels.rb +31 -29
  13. data/lib/slack/smart-bot/comm/respond_thread.rb +2 -2
  14. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat.rb +40 -0
  15. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_edit_image.rb +66 -0
  16. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_generate_image.rb +65 -0
  17. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_models.rb +37 -0
  18. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_variations_image.rb +84 -0
  19. data/lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_whisper.rb +51 -0
  20. data/lib/slack/smart-bot/commands/general/bot_help.rb +1 -0
  21. data/lib/slack/smart-bot/commands/general/personal_settings.rb +38 -0
  22. data/lib/slack/smart-bot/commands/general/poster.rb +107 -104
  23. data/lib/slack/smart-bot/commands/general/public_holidays.rb +116 -114
  24. data/lib/slack/smart-bot/commands/general/set_public_holidays.rb +6 -2
  25. data/lib/slack/smart-bot/commands/general/teams/add_team.rb +87 -0
  26. data/lib/slack/smart-bot/commands/general/teams/delete_team.rb +69 -0
  27. data/lib/slack/smart-bot/commands/general/teams/memos/add_memo_team.rb +136 -0
  28. data/lib/slack/smart-bot/commands/general/teams/memos/add_memo_team_comment.rb +37 -0
  29. data/lib/slack/smart-bot/commands/general/teams/memos/delete_memo_team.rb +83 -0
  30. data/lib/slack/smart-bot/commands/general/teams/memos/see_memo_team.rb +97 -0
  31. data/lib/slack/smart-bot/commands/general/teams/memos/see_memos_team.rb +304 -0
  32. data/lib/slack/smart-bot/commands/general/teams/memos/set_memo_status.rb +66 -0
  33. data/lib/slack/smart-bot/commands/general/teams/ping_team.rb +104 -0
  34. data/lib/slack/smart-bot/commands/general/teams/see_teams.rb +236 -0
  35. data/lib/slack/smart-bot/commands/general/teams/see_vacations_team.rb +183 -0
  36. data/lib/slack/smart-bot/commands/general/teams/update_team.rb +137 -0
  37. data/lib/slack/smart-bot/commands/general_bot_commands.rb +905 -741
  38. data/lib/slack/smart-bot/commands/on_bot/general/bot_stats.rb +379 -353
  39. data/lib/slack/smart-bot/commands/on_bot/repl.rb +87 -189
  40. data/lib/slack/smart-bot/commands/on_bot/repl_client.rb +233 -0
  41. data/lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb +17 -4
  42. data/lib/slack/smart-bot/commands.rb +26 -10
  43. data/lib/slack/smart-bot/process.rb +14 -3
  44. data/lib/slack/smart-bot/process_first.rb +36 -2
  45. data/lib/slack/smart-bot/treat_message.rb +28 -0
  46. data/lib/slack/smart-bot/utils/check_vacations.rb +1 -0
  47. data/lib/slack/smart-bot/utils/create_routine_thread.rb +1 -1
  48. data/lib/slack/smart-bot/utils/display_calendar.rb +17 -10
  49. data/lib/slack/smart-bot/utils/encryption/decrypt.rb +23 -0
  50. data/lib/slack/smart-bot/utils/encryption/encrypt.rb +27 -0
  51. data/lib/slack/smart-bot/utils/{encryption_get_key_iv.rb → encryption/encryption_get_key_iv.rb} +12 -8
  52. data/lib/slack/smart-bot/utils/get_help.rb +3 -1
  53. data/lib/slack/smart-bot/utils/get_personal_settings.rb +14 -0
  54. data/lib/slack/smart-bot/utils/get_teams.rb +2 -2
  55. data/lib/slack/smart-bot/utils/get_vacations.rb +2 -2
  56. data/lib/slack/smart-bot/utils/save_stats.rb +3 -1
  57. data/lib/slack/smart-bot/utils/update_personal_settings.rb +18 -0
  58. data/lib/slack/smart-bot/utils/update_teams.rb +1 -1
  59. data/lib/slack/smart-bot/utils/update_vacations.rb +1 -1
  60. data/lib/slack/smart-bot/utils.rb +5 -3
  61. data/lib/slack-smart-bot.rb +12 -0
  62. data/whats_new.txt +13 -14
  63. metadata +63 -15
  64. data/lib/slack/smart-bot/commands/general/add_memo_team.rb +0 -117
  65. data/lib/slack/smart-bot/commands/general/add_team.rb +0 -81
  66. data/lib/slack/smart-bot/commands/general/delete_memo_team.rb +0 -69
  67. data/lib/slack/smart-bot/commands/general/delete_team.rb +0 -55
  68. data/lib/slack/smart-bot/commands/general/ping_team.rb +0 -100
  69. data/lib/slack/smart-bot/commands/general/see_memos_team.rb +0 -202
  70. data/lib/slack/smart-bot/commands/general/see_teams.rb +0 -230
  71. data/lib/slack/smart-bot/commands/general/see_vacations_team.rb +0 -136
  72. data/lib/slack/smart-bot/commands/general/set_memo_status.rb +0 -58
  73. data/lib/slack/smart-bot/commands/general/update_team.rb +0 -131
  74. data/lib/slack/smart-bot/utils/decrypt.rb +0 -15
  75. data/lib/slack/smart-bot/utils/encrypt.rb +0 -15
@@ -1,202 +0,0 @@
1
- class SlackSmartBot
2
- def see_memos_team(user, type: "all", name: nil, topic: "", add_stats: true, team: nil)
3
- save_stats(__method__) if add_stats
4
-
5
- get_teams()
6
- type = "all" if type.match?(/all\s+memo/i)
7
- message = []
8
- if @teams.size > 0
9
- if team.nil?
10
- @teams.each do |team_name, teamv|
11
- if (team_name.to_s == name.to_s) or (name.to_s.gsub("-", "").gsub("_", "") == team_name.to_s)
12
- if teamv.key?(:memos) and teamv[:memos].size > 0
13
- team = teamv.deep_copy
14
- else
15
- respond "There are no memos for the team #{name}." unless !add_stats
16
- end
17
- break
18
- end
19
- end
20
- end
21
- if team
22
- all_memos = {}
23
- assigned_members, unassigned_members, not_on_team_channel, channels_members, all_team_members = get_team_members(team)
24
- users_link = (Thread.current[:dest][0] == "D")
25
- memos_filtered = []
26
- all_topics = []
27
- team[:memos].each do |memo|
28
- if (type == "all" or type.to_s == memo[:type].to_s or type == "") and (topic == "" or memo[:topic].to_s.downcase == topic.to_s.downcase)
29
- memos_filtered << memo
30
- all_topics << memo.topic
31
- end
32
- end
33
- all_topics.uniq!
34
- all_topics.delete(:no_topic)
35
- if memos_filtered.size >= 10 and !add_stats
36
- message << " > *_memos_*"
37
- message << " There are too many memos to show. "
38
- message << " Please use the `see MEMO_TYPE team #{team.name} TOPIC` command."
39
- message << " Available topics: #{all_topics.join(", ")}" if all_topics.size > 0
40
- message << " Examples: `see bugs #{team.name} team`, `see all memos #{team.name} team #{all_topics.sample}`, `see tasks #{team.name} team #{all_topics.sample}`"
41
- elsif memos_filtered.size > 0
42
- memos_filtered.each do |memo|
43
- if memo.privacy.empty? or
44
- (memo.privacy == "private" and (all_team_members.include?(user.name) and (users_link or channels_members.include?(Thread.current[:dest])))) or
45
- (memo.privacy == "personal" and memo.user == user.name and users_link)
46
- if memo.type == "jira" and config.jira.host != ""
47
- http = NiceHttp.new(config.jira.host)
48
- http.headers.authorization = NiceHttpUtils.basic_authentication(user: config.jira.user, password: config.jira.password)
49
- if memo.message.match?(/^\w+\-\d+$/)
50
- resp = http.get("/rest/api/latest/issue/#{memo.message}")
51
- issues = [resp.data.json] if resp.code == 200
52
- else
53
- resp = http.get("/rest/api/latest/search/?jql=#{memo.message}")
54
- issues = resp.data.json().issues if resp.code == 200
55
- end
56
- if resp.code == 200
57
- unless issues.empty?
58
- issues.each do |issue|
59
- jira_memo = { jira: true, github: false, status: "", memo_id: memo.memo_id, topic: memo.topic, privacy: memo.privacy, user: memo.user, date: memo.date, message: "", type: memo.type }
60
- jira_memo.message = issue.fields.summary
61
- jira_memo.user = issue.fields.reporter.name
62
- jira_memo.date = issue.fields.created
63
- if memo.topic == :no_topic and !issue.fields.labels.empty?
64
- jira_memo.topic = issue.fields.labels.sort.join("_").split(" ").join("_")
65
- end
66
- case issue.fields.issuetype.name
67
- when "Story"; jira_memo.type = ":abc:"
68
- when "Bug"; jira_memo.type = ":bug:"
69
- when "Task"; jira_memo.type = ":clock1:"
70
- when "New Feature", "Improvement"; jira_memo.type = ":sunny:"
71
- else jira_memo.type = ":memo:"
72
- end
73
- case issue.fields.status.statusCategory.name
74
- when "Done"; jira_memo.status = ":heavy_check_mark:"
75
- when "To Do"; jira_memo.status = ":new:"
76
- when "In Progress"; jira_memo.status = ":runner:"
77
- else jira_memo.status = ":heavy_minus_sign:"
78
- end
79
- #todo: check if possible to add link to status instead of jira issue
80
- #jira_memo.status = " <#{config.jira.host}/browse/#{issue[:key]}|#{jira_memo.status}> "
81
- jira_memo.status += " <#{config.jira.host}/browse/#{issue[:key]}|#{issue[:key]}>"
82
-
83
- all_memos[jira_memo.topic] ||= []
84
- all_memos[jira_memo.topic] << jira_memo
85
- end
86
- end
87
- end
88
- http.close
89
- elsif memo.type == "github" and config.github.host != ""
90
- http = NiceHttp.new(config.github.host)
91
- http.headers.authorization = "token #{config.github.token}"
92
- memo.message += "?" unless memo.message.include?("?")
93
- memo.message += "&per_page=50"
94
-
95
- resp = http.get("/repos/#{memo.message}")
96
- issues = resp.data.json()
97
- issues = [issues] unless issues.is_a?(Array)
98
- if resp.code == 200
99
- unless issues.empty?
100
- issues.each do |issue|
101
- github_memo = { jira: false, github: true, status: "", memo_id: memo.memo_id, topic: memo.topic, privacy: memo.privacy, user: memo.user, date: memo.date, message: "", type: memo.type }
102
- github_memo.message = issue.title
103
- github_memo.user = issue.user.login
104
- github_memo.date = issue.created_at
105
- if issue.labels.empty?
106
- labels = ""
107
- else
108
- labels = issue.labels.name.sort.join("_").split(" ").join("_")
109
- end
110
- if memo.topic == :no_topic and !issue.labels.empty?
111
- github_memo.topic = labels
112
- end
113
- case labels
114
- when /bug/i; github_memo.type = ":bug:"
115
- when /docum/i; github_memo.type = ":abc:"
116
- when /task/i; github_memo.type = ":clock1:"
117
- when /enhancem/i, /improvement/i; github_memo.type = ":sunny:"
118
- else github_memo.type = ":memo:"
119
- end
120
- if issue.key?(:events_url)
121
- resp_events = http.get(issue.events_url)
122
- events = resp_events.data.json(:event)
123
- issue.state = "in progress" if events.include?("referenced")
124
- end
125
- case issue.state
126
- when "closed"; github_memo.status = ":heavy_check_mark:"
127
- when "open"; github_memo.status = ":new:"
128
- when "in progress"; github_memo.status = ":runner:"
129
- else github_memo.status = ":heavy_minus_sign:"
130
- end
131
- #todo: check if possible to add link to status instead of github issue
132
- github_memo.status += " <#{issue.html_url}|##{issue.number}>"
133
-
134
- all_memos[github_memo.topic] ||= []
135
- all_memos[github_memo.topic] << github_memo
136
- end
137
- end
138
- end
139
- http.close
140
- else
141
- memo.jira = false
142
- memo.github = false
143
- all_memos[memo.topic] ||= []
144
- case memo.type
145
- when "memo"; memo.type = ":memo:"
146
- when "note"; memo.type = ":abc:"
147
- when "bug"; memo.type = ":bug:"
148
- when "task"; memo.type = ":clock1:"
149
- when "feature"; memo.type = ":sunny:"
150
- when "issue"; memo.type = ":hammer:"
151
- else memo.type = ":heavy_minus_sign:"
152
- end
153
- all_memos[memo.topic] << memo
154
- end
155
- end
156
- end
157
- if !add_stats
158
- message << " > *_memos_*" unless all_memos.empty?
159
- else
160
- message << " > *_#{team.name} team #{type}_*"
161
- end
162
-
163
- if all_memos.key?(:no_topic)
164
- all_memos[:no_topic].sort_by { |memo| memo[:date] }.each do |memo|
165
- case memo.privacy
166
- when "private"; priv = " `private`"
167
- when "personal"; priv = " `personal`"
168
- else priv = ""
169
- end
170
- message << " #{memo.type} #{memo.date.gsub("-", "/")[0..9]}: #{memo.status} #{memo.message} (#{memo.user} #{memo.memo_id})#{priv}"
171
- end
172
- end
173
- all_memos[:no_topic] = []
174
- all_memos.each do |topic, mems|
175
- unless mems.empty?
176
- message << " _`#{topic}`_:"
177
- mems.sort_by { |m| m[:date] }.each do |memo|
178
- case memo.privacy
179
- when "private"; priv = " `private`"
180
- when "personal"; priv = " `personal`"
181
- else priv = ""
182
- end
183
- message << " #{memo.type} #{memo.date.gsub("-", "/")[0..9]}: #{memo.status} #{memo.message} (#{memo.user} #{memo.memo_id})#{priv}"
184
- end
185
- end
186
- end
187
- else
188
- message << "There are no memos #{type} #{topic}." unless !add_stats
189
- end
190
- else
191
- respond "There is no team named #{name}." unless !add_stats
192
- end
193
- if add_stats
194
- respond message.join("\n")
195
- else
196
- return message
197
- end
198
- else
199
- respond "There are no teams added yet\. Use `add team` command to add a team" unless !add_stats
200
- end
201
- end
202
- end
@@ -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