代码之家  ›  专栏  ›  技术社区  ›  RomOne

在响应松弛对话框后更新bot消息

  •  3
  • RomOne  · 技术社区  · 7 年前

    我在响应松弛对话框后更新交互式消息时遇到了一些问题。我正在节点上使用botkit。js服务器。

    这是我的工作流程:

    1. 用户通过斜杠命令触发交互消息
    2. 用户单击该消息上的按钮
    3. 弹出一个对话框,用户填写表单并验证
    4. 服务器端完成了一些操作
    5. 第一条消息应该更新

    现在,我使用的逻辑是:

    1. 用户通过斜杠命令触发交互消息

    没什么特别的,我用:

    controller.on('slash_command', function (bot, message)
    

    然后我解析命令,并发送适当的消息,以及适当的附件(按钮)

    1. 用户单击该消息上的按钮

    同样,我使用botkit发送的事件:

    controller.on('interactive_message_callback', function (bot, message)
    

    然后创建一个对话框:

    var dialog = bot.createDialog(
                            'Which book?',
                            JSON.stringify(callback),
                            'Ok'
                        )
    

    在这里,我正在做一些非常(非常)肮脏的事情,不应该做。但这是我发现的在对话框填充后更新初始消息的唯一方法。 这个 callback_id 实际上包含一个对象 response_url 初始消息(以及用于标识表单的内容)。

    1. 弹出一个对话框,用户填写表单并验证
    2. 服务器端完成了一些操作

    在这里,我再次使用botkit提供的事件:

    controller.on('dialog_submission', function (bot, message)
    

    然后我解析 message.submission.callback_id 响应url . 有了这个,我可以创建一个我调用的对象 originalMessage .

    1. 第一条消息应该更新

    目前,我使用:

    bot.replyInteractive(originalMessage, 'DONE, everything is saved.');
    

    具有 包含 响应url 第一条消息。 它确实有效 . 第一条信息将被新信息取代。

    但我真的对这个解决方案不满意,我想知道我是否遗漏了什么。我见过一些应用程序有这种类型的工作流,所以一定有办法。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Henrik N    6 年前

    我写信给Slack询问这种情况,从Mark P那里得到了一个很好的建议:

    state 传递原件的对话框字段 response_url 到对话框。然后,当您收到对话框数据时,您可以使用 状态 而不是 响应url .

    我刚试过,效果很好。不需要在自己的服务器上存储任何状态。

    我不知道Node和botkit到底是如何工作的,因为这不是我使用的。

    要进一步充实这一点:

    1. 有人单击一个按钮,然后将有关该交互的帖子发布到您配置的“请求URL”。
    2. 从Slack的负载中,获取“response\u url”值。
    3. 提交对话框后,Slack会再次发布到您的“请求URL”。
    4. 从Slack的负载中,获取“state”值并将其用作response\u url。
    5. 利润
        2
  •  0
  •   MaxM    6 年前

    因此,在创建交互式对话框时,将其存储在某个位置并添加一个引用。我使用UUID。

        let newId = uuid();
        messageStore[newId] = message;
        var dialog = bot.createDialog(
            'My Dialog',
            'idPrefix_' + newId,
            'Submit'
        ).addText('Sample Input', 'input', '');
        bot.replyWithDialog(message, dialog.asObject());
    

    controller.on('dialog_submission', function handler(bot, message) {
        if (message.callback_id.indexOf('idPrefix') === 0) {
           let id = message.callback_id.substr('idPrefix_'.length);
           bot.dialogOk();
           let originalMessage = messageStore[id];
           bot.replyInteractive(originalMessage, {
                text: 'replacing the original message with this.'
           });
        }
    });
    

    小心 messageStore 随着时间的推移。

    推荐文章