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

wlzqhblo  于 2023-04-05  发布在  Node.js
关注(0)|答案(3)|浏览(117)

我在响应松弛对话框后更新交互式消息时遇到一些问题。我正在node.js服务器上使用botkit。
以下是我的工作流程:
1.用户通过斜杠命令触发交互式消息
1.用户单击该消息上的按钮
1.弹出一个对话框,用户填写表单并验证
1.在服务器端执行了一些操作
1.* 第一条消息应该更新 *
下面是我使用的逻辑:
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.弹出对话框,用户填写表单并验证
1.在服务器端执行了某些操作
在这里,我再次使用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它可以工作。第一条消息正在被新消息替换。
但我真的不满意这个解决方案,并想知道我是否错过了什么地方。我已经看到了夫妇的应用程序具有这种类型的工作流程,所以一定有一种方法。
谢谢你的帮助:)

f45qwnt8

f45qwnt81#

Slack现在改变了他们的API,使用新的Modals持久化数据的方式略有不同。
当提交对话框时,您的应用会收到一个HTTP请求。dialog_submission事件包含一个response_url,允许您发布与发起对话框的通道绑定的消息。但是,模态不依赖于通道上下文。这意味着view_submission事件将不包含response_url。
如果你想在打开一个Modal时持久化数据,你可以在private_metadata字段中传递任何你想持久化的数据。
你传递的任何数据都将在模态提交回调中返回给你。

zvms9eto

zvms9eto2#

我写信给Slack询问这种情况,并从Mark P那里得到了一个很好的建议:
使用state对话框字段将原始response_url传递到对话框。然后当您收到对话框数据时,您可以使用state代替response_url
我刚试过,效果很好。不需要在自己的服务器上存储任何状态。
我不知道这将如何与Node和botkit确切地工作,因为这不是我使用的。
让我们再补充一点:
1.有人点击一个按钮,Slack将该交互发布到您配置的“请求URL”。
1.从Slack的payload中获取“response_url”值。
1.当您dialog.open在Slack API中调用www.example.com时,沿着此response_url作为“state”值传递。
1.当对话框被提交时,Slack再次POST到您的“请求URL”。
1.从Slack的payload中,获取“state”值并将其用作response_url。
1.利润!

erhoui1w

erhoui1w3#

只有当您将原始消息对象保存在服务器上的某个位置以供将来引用时,这才有效。
所以在创建交互式对话框时,将其存储在某个地方并添加一个引用。我使用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

相关问题