【问题标题】:Update a bot message after responding to a slack dialog响应松弛对话框后更新机器人消息
【发布时间】:2018-03-19 16:24:13
【问题描述】:

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

这是我的工作流程:

  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 并检测response_url。有了这个,我可以创建一个我称之为originalMessage的对象。

  1. 第一条消息应该更新

目前我正在使用:

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

originalMessage包含第一条消息的response_url确实有效。第一条消息正在被新消息替换。

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

感谢您的帮助:)

【问题讨论】:

  • 你想出办法了吗?我有点坚持同样的事情,想要整理触发触发 dialog_submission 事件的对话框的原始消息。我以为我可以用 delete_original 回复Interactive,但没有参考原始问题消息...
  • 不幸的是,我仍然将response_url 存储在callback_id 中。基本上,一旦你有了 originalMessage 的 url,你就可以使用 replyInteractive 和一个新对象,你可以在其中粘贴你的 response_url、团队和用户。这就是我正在做的事情,并且有效。这真是肮脏的方式......
  • 哇,感觉很脏。我现在的想法是在单击打开对话框的按钮后删除我的消息。然后,当对话完成并且某些操作已完成处理时,我会添加一条新消息或耳语以反映这一点。如果感觉干净,则需要进行试验。谢谢@RomOne
  • 是的,其实我也是这么想的。似乎好多了!唯一的问题是,如果用户按下取消,他们将一无所有。
  • 是的,这就是我仍然不喜欢的缺点。他们必须再次提示机器人工作流程。我检查了松弛 API 通道,看起来取消按钮没有回调。还不确定如何处理。

标签: node.js slack botkit


【解决方案1】:

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

使用state 对话框字段将原始response_url 传递给对话框。那么当你收到对话数据时,就可以用state代替response_url

我刚试了一下,效果很好。无需在您自己的服务器上存储任何状态。

我不知道这将如何与 Node 和 botkit 一起工作,因为我不使用它。

进一步充实这一点:

  1. 有人单击一个按钮,然后 Slack 将有关该交互的帖子发布到您配置的“请求 URL”。
  2. 从 Slack 的负载中,获取“response_url”值。
  3. 当您在 Slack API 中调用 dialog.open 时,将此 response_url 作为“状态”值传递。
  4. 提交对话框后,Slack 会再次 POST 到您的“请求 URL”。
  5. 从 Slack 的负载中,获取“状态”值并将其用作 response_url。
  6. 利润!

【讨论】:

  • 不错!非常感谢那个,我仍在使用我的解决方法,而且那个看起来更干净。再次感谢
【解决方案2】:

这仅在您将原始消息对象保存在服务器上的某个位置以供将来参考时才有效。

因此,在创建交互式对话框时将其存储在某处并添加参考。我使用 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());

然后,一旦您返回交互式对话响应,就反汇编前缀和 uuid,并从服务器内存中取回原始消息对象。然后在那里使用“replayInteractive”。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2016-10-27
    • 2017-03-02
    相关资源
    最近更新 更多