| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- import loggerFactory from '~/utils/logger';
- const logger = loggerFactory('growi:service:SlackCommandHandler:slack-bot-response');
- const { markdownSectionBlock } = require('@growi/slack');
- const SlackbotError = require('../../models/vo/slackbot-error');
- async function respondIfSlackbotError(client, body, err) {
- // check if the request is to /commands OR /interactions
- const isInteraction = !body.channel_id;
- // throw non-SlackbotError
- if (!SlackbotError.isSlackbotError(err)) {
- logger.error(`A non-SlackbotError error occured.\n${err.toString()}`);
- throw err;
- }
- // for both postMessage and postEphemeral
- let toChannel;
- // for only postEphemeral
- let toUser;
- // decide which channel to send to
- switch (err.to) {
- case 'dm':
- toChannel = isInteraction ? JSON.parse(body.payload).user.id : body.user_id;
- toUser = toChannel;
- break;
- case 'channel':
- toChannel = isInteraction ? JSON.parse(body.payload).channel.id : body.channel_id;
- toUser = isInteraction ? JSON.parse(body.payload).user.id : body.user_id;
- break;
- default:
- logger.error('The "to" property of SlackbotError must be "dm" or "channel".');
- break;
- }
- // argumentObj object to pass to postMessage OR postEphemeral
- let argumentsObj = {};
- switch (err.method) {
- case 'postMessage':
- argumentsObj = {
- channel: toChannel,
- text: err.popupMessage,
- blocks: [
- markdownSectionBlock(err.mainMessage),
- ],
- };
- break;
- case 'postEphemeral':
- argumentsObj = {
- channel: toChannel,
- user: toUser,
- text: err.popupMessage,
- blocks: [
- markdownSectionBlock(err.mainMessage),
- ],
- };
- break;
- default:
- logger.error('The "method" property of SlackbotError must be "postMessage" or "postEphemeral".');
- break;
- }
- await client.chat[err.method](argumentsObj);
- }
- module.exports = { respondIfSlackbotError };
|