Невозможно отобразить приглашение фреймворка бота в slack, используя интерактивные сообщения - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь использовать интерактивные сообщения Slack, чтобы опубликовать набор блоков Slack JSON для раздела и кнопок.Однако я получаю сообщение об ошибке Invalid ChannelData

Я попытался опубликовать блок JSON через тестер Slack API, и он работает, но не с помощью кода, который я написал.Я написал некоторый пользовательский код для переопределения функции подсказки в среде бота специально для слабого канала.

Переопределенная подсказка

   public async prompt(stepContext: WaterfallStepContext, dialogId: string, options: PromptOptions): Promise<DialogTurnResult> {

        let promptText: string = '';
        if (isString(options.prompt)) {
            promptText = options.prompt;
        } else if (isActivity(options.prompt)) {
            promptText = options.prompt.text;
        }
        this.logger.log(`prompt: ${promptText}`);

        const choices = options.choices.map((choice) => {
            let text = '';
            this.logger.log(`choice: ${choice}`);
            if (isString(choice)) {
                text = choice;
            } else if (isChoice(choice)) {
                text = choice.value;
            }
            // return { name: text, type: 'button', text: text, value: text };
            return {
                type: 'button',
                text: {
                    type: "plain_text",
                    text: text
                },
                value: text
            };
        });

        const channelData = {
            text: '',
            blocks: [
                {
                    type: "section",
                    text:
                        {
                            type: "mrkdwn",
                            text: "Are you using a Mac or PC?"
                        }
                },
                {
                    type: "actions",
                    elements: choices
                }]
        };
        this.logger.log(`channelData: ${JSON.stringify(channelData)}`);

        return await stepContext.prompt('ChoicePrompt', { type: ActivityTypes.Message, channelData: channelData });
    }

вспомогательные функции:

function isString(str: any): str is string {
    return typeof str === 'string';
}

function isActivity(obj: any): obj is Activity {
    return obj && obj.text !== undefined;
}

function isChoice(obj: any): obj is Choice {
    return obj && obj.value !== undefined;
}

Вызывается с помощью:

const channel = getChannel(step.context);
        return await channel.prompt(step, 'ChoicePrompt', {
            choices: buttons,
            prompt: this.generateAssetInfoMessage(deviceType),
            retryPrompt: `Sorry, I didn't understand. Please choose one of the following:`,
        });

Я ожидаю увидеть сообщение с двумя кнопками, но получаю сообщение об ошибке: [onTurnError]: Ошибка: недопустимые ChannelData Вот строковые данные канала

{"text":"","blocks":[{"type":"section","text":{"type":"mrkdwn","text":"Are you using a Mac or PC?"}},{"type":"actions","elements":[{"type":"button","text":{"type":"plain_text","text":"I'm using a Mac"},"value":"I'm using a Mac"},{"type":"button","text":{"type":"plain_text","text":"I'm using Windows"},"value":"I'm using Windows"}]}]}

1 Ответ

1 голос
/ 21 июня 2019

К сожалению, вы не делаете ничего плохого.Пока мы этого не поддерживаем.

Я отправил Запрос на изменение проекта , чтобы мы могли отобразить полезную нагрузку из channelData в соответствующий Slack API. Вы также ничего не можете сделать локально, поскольку это зависит от частной / защищенной части API.

Обратите внимание, однако, что как только это будет реализовано, вы, вероятно, добавитеэто к вашему сообщению channelData как это:

"channelData": {
   "text": "Now back in stock! :tada:",
   "blocks": [
        [...]
   ]

Редактировать: Вы могли бы сделать это локально, но это было бы трудно, так как вы не могли сделатьэто напрямую с Bot Framework.Вам придется использовать Slack's Conversation API внутри вашего бота.Это возможно, и у вас будут все необходимые данные, кроме нового токена аутентификации.

...