@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.
@@ -62,8 +62,7 @@ jobs:
62
62
  strategy:
63
63
  matrix:
64
64
  node-version:
65
- - '20.x'
66
- - '22.x'
65
+ - '23.x'
67
66
  if: github.ref == 'refs/heads/main' && ${{ success() }}
68
67
  steps:
69
68
  - name: Checkout
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hubot-friends/hubot-slack",
3
- "version": "3.0.3",
3
+ "version": "3.1.0",
4
4
  "description": "A new Slack adapter for Hubot",
5
5
  "homepage": "https://github.com/hubot-friends/hubot-slack#readme",
6
6
  "main": "./index.mjs",
@@ -172,15 +172,16 @@ class SlackAdapter extends Adapter {
172
172
  }
173
173
  async mapToHubotMessage(event) {
174
174
  // console.error(event)
175
- const fromBrain = this.robot.brain.users()[event.user]
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 this.#webClient.users.info({
178
- user: event.user
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()[event.user]
183
- return new TextMessage(new User(event.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: 'U123ABC456',
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 ?? 'U123ABC456',
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 ?? 'U123ABC456',
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: BOT_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['U123ABC456'] = {
154
- id: 'U123ABC456',
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
- "type": "message",
261
- "channel": "C123ABC456",
262
- "user": "U123ABC456",
263
- "text": "Hello world",
264
- "ts": "1355517523.000005"
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
  })