@hubot-friends/hubot-slack 3.0.3 → 3.1.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.
- package/.github/workflows/ci-build.yml +1 -2
- package/package.json +1 -1
- package/src/SlackAdapter.mjs +8 -7
- package/src/SlackAdapter.test.mjs +146 -13
package/package.json
CHANGED
package/src/SlackAdapter.mjs
CHANGED
|
@@ -172,15 +172,16 @@ class SlackAdapter extends Adapter {
|
|
|
172
172
|
}
|
|
173
173
|
async mapToHubotMessage(event) {
|
|
174
174
|
// console.error(event)
|
|
175
|
-
const
|
|
175
|
+
const getUser = event.user ? this.#webClient.users.info.bind(this.#webClient.users.info) : this.#webClient.bots.info.bind(this.#webClient.bots.info)
|
|
176
|
+
const lookUpId = event.user ?? event.bot_id
|
|
177
|
+
const queryParameter = event.user ? { user: event.user } : { bot: event.bot_id }
|
|
178
|
+
const fromBrain = this.robot.brain.users()[lookUpId]
|
|
176
179
|
if(!fromBrain) {
|
|
177
|
-
const response = await
|
|
178
|
-
|
|
179
|
-
})
|
|
180
|
-
this.robot.brain.userForId(event.user, response.user)
|
|
180
|
+
const response = await getUser(queryParameter)
|
|
181
|
+
this.robot.brain.userForId(lookUpId, response.user ?? response.bot)
|
|
181
182
|
}
|
|
182
|
-
const fromUser = this.robot.brain.users()[
|
|
183
|
-
return new TextMessage(new User(
|
|
183
|
+
const fromUser = this.robot.brain.users()[lookUpId]
|
|
184
|
+
return new TextMessage(new User(lookUpId, {
|
|
184
185
|
room: event.channel,
|
|
185
186
|
name: fromUser.name
|
|
186
187
|
}), event.text, event.ts)
|
|
@@ -5,7 +5,9 @@ import { Robot, TextMessage } from 'hubot'
|
|
|
5
5
|
import EventEmitter from 'node:events'
|
|
6
6
|
|
|
7
7
|
const BOT_ID = 'U0AAATTTTTAAAAA'
|
|
8
|
-
|
|
8
|
+
const SOME_USER_ID = 'U123ABC456'
|
|
9
|
+
const WORKFLOW_BOT_ID = 'BB12033'
|
|
10
|
+
const APP_ID = 'ASADFASDFASDDDS'
|
|
9
11
|
class SlackClientMock extends EventEmitter {
|
|
10
12
|
#useRtmConnect = false
|
|
11
13
|
#delegate = null
|
|
@@ -22,10 +24,27 @@ class SlackClientMock extends EventEmitter {
|
|
|
22
24
|
this.emit('authenticated', new Error('Not authenticated'))
|
|
23
25
|
}
|
|
24
26
|
}
|
|
27
|
+
const buildATestBot = id => ({
|
|
28
|
+
ok: true,
|
|
29
|
+
bot: {
|
|
30
|
+
id: id,
|
|
31
|
+
deleted: false,
|
|
32
|
+
name: "beforebot",
|
|
33
|
+
updated: 1449272004,
|
|
34
|
+
app_id: "A123456",
|
|
35
|
+
user_id: "U123456",
|
|
36
|
+
icons: {
|
|
37
|
+
image_36: "https://...",
|
|
38
|
+
image_48: "https://...",
|
|
39
|
+
image_72: "https://..."
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
|
|
25
44
|
const buildATestUser = () => ({
|
|
26
45
|
ok: true,
|
|
27
46
|
user: {
|
|
28
|
-
id:
|
|
47
|
+
id: SOME_USER_ID,
|
|
29
48
|
team_id: 'TASDASDFSDD',
|
|
30
49
|
name: 'bossdog',
|
|
31
50
|
deleted: false,
|
|
@@ -90,6 +109,61 @@ const buildATestUser = () => ({
|
|
|
90
109
|
}
|
|
91
110
|
})
|
|
92
111
|
|
|
112
|
+
const buildSlackMessageFromBot = (event, toBotId) => ({
|
|
113
|
+
ack: () => {},
|
|
114
|
+
envelope_id: 'e9b92395-bedd-4da7',
|
|
115
|
+
body: {
|
|
116
|
+
token: 'ASDFASFASDFASDFASDFASD',
|
|
117
|
+
team_id: 'TASDASDFSDD',
|
|
118
|
+
context_team_id: 'TASDASDFSDD',
|
|
119
|
+
context_enterprise_id: null,
|
|
120
|
+
api_app_id: 'ASADFASDFASDDDS',
|
|
121
|
+
event: {
|
|
122
|
+
subtype: 'bot_message',
|
|
123
|
+
text: event?.text ?? `<@${toBotId}> help`,
|
|
124
|
+
username: event?.username ?? 'Workflow',
|
|
125
|
+
type: event?.type ?? 'message',
|
|
126
|
+
bot_id: event?.bot_id ?? 'BB12033',
|
|
127
|
+
app_id: event?.app_id ?? APP_ID,
|
|
128
|
+
ts: event?.ts ?? '1688420854.574989',
|
|
129
|
+
blocks: event?.blocks ?? [],
|
|
130
|
+
channel: event?.channel ?? 'CASDFASDFASDSD',
|
|
131
|
+
event_ts: event?.ts ?? '1688420854.574989',
|
|
132
|
+
channel_type: event.channel_type ?? 'channel'
|
|
133
|
+
},
|
|
134
|
+
type: 'event_callback',
|
|
135
|
+
event_id: 'Ev05F9TNCNDB',
|
|
136
|
+
event_time: 1688420854,
|
|
137
|
+
authorizations: [
|
|
138
|
+
{
|
|
139
|
+
enterprise_id: null,
|
|
140
|
+
team_id: 'TASDASDFSDD',
|
|
141
|
+
user_id: toBotId,
|
|
142
|
+
is_bot: true,
|
|
143
|
+
is_enterprise_install: false
|
|
144
|
+
}
|
|
145
|
+
],
|
|
146
|
+
is_ext_shared_channel: false,
|
|
147
|
+
event_context: '4-eyJldCI6Im'
|
|
148
|
+
},
|
|
149
|
+
event: {
|
|
150
|
+
subtype: 'bot_message',
|
|
151
|
+
text: event?.text ?? `<@${toBotId}> help`,
|
|
152
|
+
username: event?.username ?? 'Workflow',
|
|
153
|
+
type: event?.type ?? 'message',
|
|
154
|
+
bot_id: event?.bot_id ?? 'BB12033',
|
|
155
|
+
app_id: event?.app_id ?? APP_ID,
|
|
156
|
+
ts: event?.ts ?? '1688420854.574989',
|
|
157
|
+
blocks: event?.blocks ?? [],
|
|
158
|
+
channel: event?.channel ?? 'CASDFASDFASDSD',
|
|
159
|
+
event_ts: event?.ts ?? '1688420854.574989',
|
|
160
|
+
channel_type: event.channel_type ?? 'channel'
|
|
161
|
+
},
|
|
162
|
+
retry_num: 0,
|
|
163
|
+
retry_reason: '',
|
|
164
|
+
accepts_response_payload: false
|
|
165
|
+
})
|
|
166
|
+
|
|
93
167
|
const buildSlackMessage = event => ({
|
|
94
168
|
ack: () => {},
|
|
95
169
|
envelope_id: 'e9b92395-bedd-4da7',
|
|
@@ -103,7 +177,7 @@ const buildSlackMessage = event => ({
|
|
|
103
177
|
client_msg_id: event?.messageId ?? 'be201e20-d035-44dc-a0e2',
|
|
104
178
|
type: event?.type ?? 'message',
|
|
105
179
|
text: event?.text ?? `<@${BOT_ID}> help`,
|
|
106
|
-
user: event?.user ??
|
|
180
|
+
user: event?.user ?? SOME_USER_ID,
|
|
107
181
|
ts: event?.ts ?? '1688420854.574989',
|
|
108
182
|
blocks: event?.blocks ?? [],
|
|
109
183
|
team: event?.team ?? 'TASDASDFSDD',
|
|
@@ -122,7 +196,7 @@ const buildSlackMessage = event => ({
|
|
|
122
196
|
client_msg_id: event?.messageId ?? 'be201e20-d035-44dc-a0e2-befc2b5bd13d',
|
|
123
197
|
type: event?.type ?? 'message',
|
|
124
198
|
text: event?.text ?? `<@${BOT_ID}> help`,
|
|
125
|
-
user: event?.user ??
|
|
199
|
+
user: event?.user ?? SOME_USER_ID,
|
|
126
200
|
ts: event?.ts ?? '1688420854.574989',
|
|
127
201
|
blocks: event?.blocks ?? [],
|
|
128
202
|
team: event?.team ?? 'TASDASDFSDD',
|
|
@@ -142,7 +216,7 @@ const authenticatedPerson = obj => ({
|
|
|
142
216
|
name: 'Team Name'
|
|
143
217
|
},
|
|
144
218
|
self: {
|
|
145
|
-
id:
|
|
219
|
+
id: SOME_USER_ID,
|
|
146
220
|
token: 'fake-token',
|
|
147
221
|
}
|
|
148
222
|
})
|
|
@@ -150,9 +224,9 @@ const authenticatedPerson = obj => ({
|
|
|
150
224
|
const token = 'some-fake-token'
|
|
151
225
|
const makeRobot = (delegate, webClientMock = {}) => {
|
|
152
226
|
const robot = new Robot('Slack', false, 'hubot')
|
|
153
|
-
robot.brain.data.users[
|
|
154
|
-
id:
|
|
155
|
-
name: 'hubot',
|
|
227
|
+
robot.brain.data.users[SOME_USER_ID] = {
|
|
228
|
+
id: SOME_USER_ID,
|
|
229
|
+
name: 'not hubot',
|
|
156
230
|
room: 'CASDFASDFASDSD'
|
|
157
231
|
}
|
|
158
232
|
|
|
@@ -235,6 +309,12 @@ describe('Listen to messages', async () => {
|
|
|
235
309
|
async start(adapter) {
|
|
236
310
|
adapter.emit('authenticated', authenticatedPerson(), null)
|
|
237
311
|
}
|
|
312
|
+
}, {
|
|
313
|
+
users: {
|
|
314
|
+
info(params) {
|
|
315
|
+
return buildATestUser()
|
|
316
|
+
}
|
|
317
|
+
}
|
|
238
318
|
})
|
|
239
319
|
await robot.run()
|
|
240
320
|
})
|
|
@@ -257,11 +337,11 @@ describe('Listen to messages', async () => {
|
|
|
257
337
|
assert.ok(true, 'should be called for message')
|
|
258
338
|
})
|
|
259
339
|
const message = await robot.adapter.mapToHubotMessage(buildSlackMessage({
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
340
|
+
type: 'message',
|
|
341
|
+
channel: 'C123ABC456',
|
|
342
|
+
user: 'U123ABC456',
|
|
343
|
+
text: 'Hello world',
|
|
344
|
+
ts: 1355517523.000005
|
|
265
345
|
}).event)
|
|
266
346
|
await robot.receive(message)
|
|
267
347
|
assert.deepEqual(wasCalled, true)
|
|
@@ -337,4 +417,57 @@ describe('Send messages back', async () => {
|
|
|
337
417
|
assert.deepEqual(wasCalled, true)
|
|
338
418
|
robot.shutdown()
|
|
339
419
|
})
|
|
420
|
+
|
|
421
|
+
it('should reply to a message that was sent by a different bot, like Workflow situations', async () => {
|
|
422
|
+
let wasCalled = false
|
|
423
|
+
const robot = makeRobot({
|
|
424
|
+
async start(adapter) {
|
|
425
|
+
adapter.emit('authenticated', authenticatedPerson(), null)
|
|
426
|
+
}
|
|
427
|
+
}, {
|
|
428
|
+
chat: {
|
|
429
|
+
async postMessage({ channel, text }) {
|
|
430
|
+
assert.deepEqual(channel, 'C123ABC456')
|
|
431
|
+
assert.deepEqual(text, 'hi')
|
|
432
|
+
}
|
|
433
|
+
},
|
|
434
|
+
bots: {
|
|
435
|
+
info(params) {
|
|
436
|
+
return buildATestBot(WORKFLOW_BOT_ID)
|
|
437
|
+
}
|
|
438
|
+
},
|
|
439
|
+
auth: {
|
|
440
|
+
test() {
|
|
441
|
+
return {
|
|
442
|
+
user_id: BOT_ID,
|
|
443
|
+
user: 'hubot',
|
|
444
|
+
team_id: 'T12345678',
|
|
445
|
+
team: 'Team Name'
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
})
|
|
450
|
+
robot.respond(/deploy (?<appName>.*) (?<environment>.*)/i, {id: 'message responder'},
|
|
451
|
+
context => {
|
|
452
|
+
console.log('called', context.message)
|
|
453
|
+
assert.deepEqual(context.message.text, '@hubot deploy redirector staging --version main-d349664')
|
|
454
|
+
context.reply('deploying')
|
|
455
|
+
robot.shutdown()
|
|
456
|
+
wasCalled = true
|
|
457
|
+
})
|
|
458
|
+
await robot.run()
|
|
459
|
+
const message = await robot.adapter.mapToHubotMessage(buildSlackMessageFromBot(
|
|
460
|
+
{
|
|
461
|
+
type: "message",
|
|
462
|
+
ts: 1355517523.000005,
|
|
463
|
+
text: `<@${BOT_ID}> deploy redirector staging --version main-d349664`,
|
|
464
|
+
bot_id: WORKFLOW_BOT_ID,
|
|
465
|
+
username: "github",
|
|
466
|
+
icons: {}
|
|
467
|
+
}, BOT_ID).event)
|
|
468
|
+
message.text = robot.adapter.replaceBotIdWithName(message)
|
|
469
|
+
await robot.receive(message)
|
|
470
|
+
robot.shutdown()
|
|
471
|
+
assert.deepEqual(wasCalled, true)
|
|
472
|
+
})
|
|
340
473
|
})
|