Files
botpress--botpress/integrations/slack/src/setup.ts
T
2026-07-13 13:34:48 +08:00

71 lines
2.0 KiB
TypeScript

import { RuntimeError } from '@botpress/sdk'
import { isValidUrl } from './misc/utils'
import { SlackClient } from './slack-api'
import type * as bp from '.botpress'
export const REQUIRED_SLACK_SCOPES = [
'channels:history',
'channels:manage',
'channels:read',
'chat:write',
'files:read',
'files:write',
'groups:history',
'groups:read',
'groups:write',
'im:history',
'im:read',
'im:write',
'mpim:history',
'mpim:read',
'mpim:write',
'reactions:read',
'reactions:write',
'team:read',
'users.profile:read',
'users:read',
'users:read.email',
]
export const register: bp.IntegrationProps['register'] = async ({ client, ctx, logger }) => {
logger.forBot().debug('Registering Slack integration')
await _updateBotpressBotNameAndAvatar({ client, ctx, logger })
const slackClient = await SlackClient.createFromStates({ client, ctx, logger })
await slackClient.testAuthentication()
const hasRequiredScopes = slackClient.hasAllScopes(REQUIRED_SLACK_SCOPES)
if (!hasRequiredScopes) {
const grantedScopes = slackClient.getGrantedScopes()
const missingScopes = REQUIRED_SLACK_SCOPES.filter((scope) => !grantedScopes.includes(scope))
throw new RuntimeError(
'The Slack access token is missing required scopes. Please re-authorize the app.\n\n' +
`Missing scopes: ${missingScopes.join(', ')}.\n` +
`Granted scopes: ${grantedScopes.join(', ')}.`
)
}
}
const _updateBotpressBotNameAndAvatar = async ({ client, ctx, logger }: bp.CommonHandlerProps) => {
const { botAvatarUrl } = ctx.configuration
const isUrlValid = botAvatarUrl && isValidUrl(botAvatarUrl)
if (!isUrlValid) {
logger.forBot().warn('The provided bot avatar URL is invalid. Skipping avatar picture update.')
}
await client.updateUser({
id: ctx.botUserId,
pictureUrl: isUrlValid ? botAvatarUrl.trim() : undefined,
name: ctx.configuration.botName?.trim(),
})
}
export const unregister: bp.IntegrationProps['unregister'] = async () => {
// nothing to unregister
}