slacks 0.5.0 → 0.6.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.
- checksums.yaml +5 -5
- data/lib/slacks/connection.rb +56 -68
- data/lib/slacks/version.rb +1 -1
- data/slacks.gemspec +2 -2
- metadata +15 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3042bf152b61c2caa8a3b4fe792b49822d46915712a8573f6bcafc86132ae2b8
|
4
|
+
data.tar.gz: 116df1499c672f6d72c23894c4b9abe0133cbe855766175488384509845c5ec0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1f5d964031547e6d9160d465a4b894f76aa7bbe3174c98dc7bb36964c52eddbb5a5d527c9bcfbd67f7aad93b5fe0869acc8ea0faa07fa97217f129bd537ad27
|
7
|
+
data.tar.gz: 03b84265b6fe59c1d2858fc12a8274fdb1301575b142f224ea6dd8d6f811c81b94dd9cab6918548e4c7249b57dd695b39bead9a5d0173af964edd334689b2a26
|
data/lib/slacks/connection.rb
CHANGED
@@ -24,10 +24,8 @@ module Slacks
|
|
24
24
|
@user_ids_dm_ids = {}
|
25
25
|
@users_by_id = {}
|
26
26
|
@user_id_by_name = {}
|
27
|
-
@
|
28
|
-
@
|
29
|
-
@channels_by_id = {}
|
30
|
-
@channel_id_by_name = {}
|
27
|
+
@conversations_by_id = {}
|
28
|
+
@conversation_ids_by_name = {}
|
31
29
|
end
|
32
30
|
|
33
31
|
|
@@ -42,7 +40,7 @@ module Slacks
|
|
42
40
|
link_names: 1} # find and link channel names and user names
|
43
41
|
params.merge!(attachments: MultiJson.dump(attachments)) if attachments.any?
|
44
42
|
params.merge!(options.select { |key, _| SEND_MESSAGE_PARAMS.member?(key) })
|
45
|
-
api("chat.postMessage", params)
|
43
|
+
api("chat.postMessage", **params)
|
46
44
|
end
|
47
45
|
alias :say :send_message
|
48
46
|
|
@@ -50,7 +48,7 @@ module Slacks
|
|
50
48
|
params = {
|
51
49
|
channel: to_channel_id(channel),
|
52
50
|
timestamp: ts }
|
53
|
-
api("reactions.get", params)
|
51
|
+
api("reactions.get", **params)
|
54
52
|
end
|
55
53
|
|
56
54
|
def update_message(ts, message, options={})
|
@@ -65,15 +63,15 @@ module Slacks
|
|
65
63
|
params.merge!(attachments: MultiJson.dump(attachments)) if attachments.any?
|
66
64
|
params.merge!(options.select { |key, _| [:username, :as_user, :parse, :link_names,
|
67
65
|
:unfurl_links, :unfurl_media, :icon_url, :icon_emoji].member?(key) })
|
68
|
-
api("chat.update", params)
|
66
|
+
api("chat.update", **params)
|
69
67
|
end
|
70
68
|
|
71
69
|
def add_reaction(emojis, message)
|
72
70
|
Array(emojis).each do |emoji|
|
73
|
-
api("reactions.add",
|
71
|
+
api("reactions.add",
|
74
72
|
name: emoji.gsub(/^:|:$/, ""),
|
75
73
|
channel: message.channel.id,
|
76
|
-
timestamp: message.timestamp
|
74
|
+
timestamp: message.timestamp)
|
77
75
|
end
|
78
76
|
end
|
79
77
|
|
@@ -116,21 +114,16 @@ module Slacks
|
|
116
114
|
# one, we'll skill it.
|
117
115
|
next
|
118
116
|
|
119
|
-
when EVENT_GROUP_JOINED
|
120
|
-
|
121
|
-
@
|
122
|
-
@
|
117
|
+
when EVENT_GROUP_JOINED, EVENT_CHANNEL_CREATED
|
118
|
+
conversation = data["channel"]
|
119
|
+
@conversations_by_id[conversation["id"]] = conversation
|
120
|
+
@conversation_ids_by_name[conversation["name"]] = conversation["id"]
|
123
121
|
|
124
122
|
when EVENT_USER_JOINED
|
125
123
|
user = data["user"]
|
126
124
|
@users_by_id[user["id"]] = user
|
127
125
|
@user_id_by_name[user["name"]] = user["id"]
|
128
126
|
|
129
|
-
when EVENT_CHANNEL_CREATED
|
130
|
-
channel = data["channel"]
|
131
|
-
@channels_by_id[channel["id"]] = channel
|
132
|
-
@channel_id_by_name[channel["name"]] = channel["id"]
|
133
|
-
|
134
127
|
when EVENT_MESSAGE
|
135
128
|
# Don't respond to things that this bot said
|
136
129
|
next if data["user"] == bot.id
|
@@ -157,10 +150,9 @@ module Slacks
|
|
157
150
|
|
158
151
|
|
159
152
|
def channels
|
160
|
-
channels = user_id_by_name.keys +
|
153
|
+
channels = user_id_by_name.keys + conversation_ids_by_name.keys
|
161
154
|
if channels.empty?
|
162
|
-
|
163
|
-
fetch_groups!
|
155
|
+
fetch_conversations!
|
164
156
|
fetch_users!
|
165
157
|
end
|
166
158
|
channels
|
@@ -183,13 +175,9 @@ module Slacks
|
|
183
175
|
"id" => id,
|
184
176
|
"is_im" => true,
|
185
177
|
"name" => user.username }
|
186
|
-
when /^G/
|
187
|
-
Slacks::Channel.new(self, groups_by_id.fetch(id) do
|
188
|
-
raise ArgumentError, "Unable to find a group with the ID #{id.inspect}"
|
189
|
-
end)
|
190
178
|
else
|
191
|
-
Slacks::Channel.new(self,
|
192
|
-
raise ArgumentError, "Unable to find a
|
179
|
+
Slacks::Channel.new(self, conversations_by_id.fetch(id) do
|
180
|
+
raise ArgumentError, "Unable to find a conversation with the ID #{id.inspect}"
|
193
181
|
end)
|
194
182
|
end
|
195
183
|
end
|
@@ -224,10 +212,8 @@ module Slacks
|
|
224
212
|
attr_reader :user_ids_dm_ids,
|
225
213
|
:users_by_id,
|
226
214
|
:user_id_by_name,
|
227
|
-
:
|
228
|
-
:
|
229
|
-
:channels_by_id,
|
230
|
-
:channel_id_by_name,
|
215
|
+
:conversations_by_id,
|
216
|
+
:conversation_ids_by_name,
|
231
217
|
:websocket_url,
|
232
218
|
:websocket
|
233
219
|
|
@@ -238,14 +224,8 @@ module Slacks
|
|
238
224
|
@bot = BotUser.new(response.fetch("self"))
|
239
225
|
@team = Team.new(response.fetch("team"))
|
240
226
|
|
241
|
-
@
|
242
|
-
@
|
243
|
-
|
244
|
-
@users_by_id = Hash[response.fetch("users").map { |attrs| [attrs.fetch("id"), attrs] }]
|
245
|
-
@user_id_by_name = Hash[response.fetch("users").map { |attrs| ["@#{attrs.fetch("name")}", attrs.fetch("id")] }]
|
246
|
-
|
247
|
-
@groups_by_id = Hash[response.fetch("groups").map { |attrs| [attrs.fetch("id"), attrs] }]
|
248
|
-
@group_id_by_name = Hash[response.fetch("groups").map { |attrs| [attrs.fetch("name"), attrs.fetch("id")] }]
|
227
|
+
@conversations_by_id = Hash[response.fetch("channels").map { |attrs| [ attrs.fetch("id"), attrs ] }]
|
228
|
+
@conversation_ids_by_name = Hash[response.fetch("channels").map { |attrs| [ attrs["name"], attrs["id"] ] }]
|
249
229
|
end
|
250
230
|
|
251
231
|
|
@@ -254,13 +234,9 @@ module Slacks
|
|
254
234
|
return name.id if name.is_a?(Slacks::Channel)
|
255
235
|
return name if name =~ /^[DGC]/ # this already looks like a channel id
|
256
236
|
return get_dm_for_username(name) if name.start_with?("@")
|
257
|
-
return to_group_id(name) unless name.start_with?("#")
|
258
237
|
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
def to_group_id(name)
|
263
|
-
group_id_by_name[name] || fetch_groups![name] || missing_group!(name)
|
238
|
+
name = name.gsub(/^#/, "") # Leading hashes are no longer a thing in the conversations API
|
239
|
+
conversation_ids_by_name[name] || fetch_conversations![name] || missing_conversation!(name)
|
264
240
|
end
|
265
241
|
|
266
242
|
def to_user_id(name)
|
@@ -273,39 +249,29 @@ module Slacks
|
|
273
249
|
|
274
250
|
def get_dm_for_user_id(user_id)
|
275
251
|
user_ids_dm_ids[user_id] ||= begin
|
276
|
-
response = api("
|
252
|
+
response = api("conversations.open", user: user_id)
|
277
253
|
response["channel"]["id"]
|
278
254
|
end
|
279
255
|
end
|
280
256
|
|
281
257
|
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
@
|
286
|
-
@
|
287
|
-
end
|
288
|
-
|
289
|
-
def fetch_groups!
|
290
|
-
response = api("groups.list")
|
291
|
-
@groups_by_id = response["groups"].index_by { |attrs| attrs["id"] }
|
292
|
-
@group_id_by_name = Hash[response["groups"].map { |attrs| [attrs["name"], attrs["id"]] }]
|
258
|
+
def fetch_conversations!
|
259
|
+
conversations, ims = api("conversations.list")["channels"].partition { |attrs| attrs["is_channel"] || attrs["is_group"] }
|
260
|
+
user_ids_dm_ids.merge! Hash[ims.map { |attrs| attrs.values_at("user", "id") }]
|
261
|
+
@conversations_by_id = Hash[conversations.map { |attrs| [ attrs.fetch("id"), attrs ] }]
|
262
|
+
@conversation_ids_by_name = Hash[conversations.map { |attrs| [ attrs["name"], attrs["id"] ] }]
|
293
263
|
end
|
294
264
|
|
295
265
|
def fetch_users!
|
296
266
|
response = api("users.list")
|
297
|
-
@users_by_id = response["members"].
|
267
|
+
@users_by_id = response["members"].each_with_object({}) { |attrs, hash| hash[attrs["id"]] = attrs }
|
298
268
|
@user_id_by_name = Hash[response["members"].map { |attrs| ["@#{attrs["name"]}", attrs["id"]] }]
|
299
269
|
end
|
300
270
|
|
301
271
|
|
302
272
|
|
303
|
-
def
|
304
|
-
raise ArgumentError, "Couldn't find a
|
305
|
-
end
|
306
|
-
|
307
|
-
def missing_group!(name)
|
308
|
-
raise ArgumentError, "Couldn't find a private group named #{name}"
|
273
|
+
def missing_conversation!(name)
|
274
|
+
raise ArgumentError, "Couldn't find a conversation named #{name}"
|
309
275
|
end
|
310
276
|
|
311
277
|
def missing_user!(name)
|
@@ -317,8 +283,7 @@ module Slacks
|
|
317
283
|
def get_user_id_for_dm(dm)
|
318
284
|
user_id = user_ids_dm_ids.key(dm)
|
319
285
|
unless user_id
|
320
|
-
|
321
|
-
user_ids_dm_ids.merge! Hash[response["ims"].map { |attrs| attrs.values_at("user", "id") }]
|
286
|
+
fetch_conversations!
|
322
287
|
user_id = user_ids_dm_ids.key(dm)
|
323
288
|
end
|
324
289
|
raise ArgumentError, "Unable to find a user for the direct message ID #{dm.inspect}" unless user_id
|
@@ -327,8 +292,29 @@ module Slacks
|
|
327
292
|
|
328
293
|
|
329
294
|
|
330
|
-
def api(command, params
|
331
|
-
|
295
|
+
def api(command, page_limit: MAX_PAGES, **params)
|
296
|
+
params_with_token = params.merge(token: token)
|
297
|
+
response = api_post command, params_with_token
|
298
|
+
fetched_pages = 1
|
299
|
+
cursor = response.dig("response_metadata", "next_cursor")
|
300
|
+
while cursor && !cursor.empty? && fetched_pages < page_limit do
|
301
|
+
api_post(command, params_with_token.merge(cursor: cursor)).each do |key, value|
|
302
|
+
if value.is_a?(Array)
|
303
|
+
response[key].concat value
|
304
|
+
elsif value.is_a?(Hash)
|
305
|
+
response[key].merge! value
|
306
|
+
else
|
307
|
+
response[key] = value
|
308
|
+
end
|
309
|
+
end
|
310
|
+
fetched_pages += 1
|
311
|
+
cursor = response.dig("response_metadata", "next_cursor")
|
312
|
+
end
|
313
|
+
response
|
314
|
+
end
|
315
|
+
|
316
|
+
def api_post(command, params)
|
317
|
+
response = http.post(command, params)
|
332
318
|
response = MultiJson.load(response.body)
|
333
319
|
unless response["ok"]
|
334
320
|
response["error"].split(/,\s*/).each do |error_code|
|
@@ -364,5 +350,7 @@ module Slacks
|
|
364
350
|
reply_broadcast
|
365
351
|
}.freeze
|
366
352
|
|
353
|
+
MAX_PAGES = 9001
|
354
|
+
|
367
355
|
end
|
368
356
|
end
|
data/lib/slacks/version.rb
CHANGED
data/slacks.gemspec
CHANGED
@@ -25,8 +25,8 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_dependency "faraday-raise-errors"
|
26
26
|
spec.add_dependency "concurrent-ruby"
|
27
27
|
|
28
|
-
spec.add_development_dependency "bundler"
|
29
|
-
spec.add_development_dependency "rake"
|
28
|
+
spec.add_development_dependency "bundler"
|
29
|
+
spec.add_development_dependency "rake"
|
30
30
|
spec.add_development_dependency "minitest", "~> 5.0"
|
31
31
|
spec.add_development_dependency "pry"
|
32
32
|
spec.add_development_dependency "minitest-reporters"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slacks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bob Lail
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: websocket-driver
|
@@ -84,30 +84,30 @@ dependencies:
|
|
84
84
|
name: bundler
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rake
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - "
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
103
|
+
version: '0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - "
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
110
|
+
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: minitest
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,7 +164,7 @@ dependencies:
|
|
164
164
|
- - ">="
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
|
-
description:
|
167
|
+
description:
|
168
168
|
email:
|
169
169
|
- bob.lailfamily@gmail.com
|
170
170
|
executables: []
|
@@ -196,7 +196,7 @@ homepage: https://github.com/houston/slacks
|
|
196
196
|
licenses:
|
197
197
|
- MIT
|
198
198
|
metadata: {}
|
199
|
-
post_install_message:
|
199
|
+
post_install_message:
|
200
200
|
rdoc_options: []
|
201
201
|
require_paths:
|
202
202
|
- lib
|
@@ -211,9 +211,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
211
211
|
- !ruby/object:Gem::Version
|
212
212
|
version: '0'
|
213
213
|
requirements: []
|
214
|
-
|
215
|
-
|
216
|
-
signing_key:
|
214
|
+
rubygems_version: 3.1.2
|
215
|
+
signing_key:
|
217
216
|
specification_version: 4
|
218
217
|
summary: A library for communicating via Slack
|
219
218
|
test_files: []
|