Bot Framework Node.js 给特定用户的临时消息
Bot Framework Node.js ad hoc message TO A SPECIFIC USER
我已经盯着这个看了好几个小时了,但找不到解决方案,尽管根据所有建议,它应该很简单 - https://docs.microsoft.com/en-us/bot-framework/nodejs/bot-builder-nodejs-proactive-messages.
我创建了一个简单的代码,它将 "register" 用户并将他们的数据保存在我在 Azure 上的 cosmosDatabse 中。效果很好。
//ON "register" SAVE USER DATA AND SAY REGISTERED MESSAGE
bot.dialog('adhocDialog', function(session, args) {
var savedAddress = session.message.address;
session.userData.savedAddress = savedAddress;
//REGISTERED MESSAGE
session.endDialog("*Congratulations! You are now registered in our network! (goldmedal)*");
})
.triggerAction({
matches: /^register$/i
})
- 但是如果满足某个条件,我如何才能访问该特定用户并向他发送消息?(实际上是在 HTTP 请求上)
我相当确定我们必须在某处写下对话 ID 或用户 ID。问题是在哪里?
function startProactiveDialog(address) {
bot.beginDialog(address, "A notification!");
}
- 我认为这应该是多么简单。但是你在哪里指定用户呢?
您已将用户地址保存到 session.userData.savedAddress
,从而将其保存在数据库中。当事件触发时,对您的数据库执行查询以检查满足两个条件的用户。
- 他们已注册监听事件
- 他们的地址已保存在数据库中。
在您的情况下,您可以将 属性 保存到 session.userData
对象,一个 属性 列出了他们正在侦听的事件。如果您只是需要向用户发送消息,那么您可以简单地使用 bot.loadSession(savedAddress)
来 ping 用户。
编辑:
因此,您应该向 CosmosDB 发送一个查询,以查找具有与事件相对应的 "listen-to" Boolean-type 标志的条目,而不是专门通过用户 ID 进行查找。
您一开始并不担心用户 ID,您只是使用(一般来说)如下所示的查询检索所有条目:
SELECT * FROM BotState WHERE data LIKE 'listenForEvent=1
.
因此,要设置您的 session.userData
以便上述理论查询有效,您需要将问题中的代码片段修改为如下所示:
bot.dialog('adhocDialog', function(session, args) {
var savedAddress = session.message.address;
session.userData.savedAddress = savedAddress;
session.userData.listenForEvent = 1 // Our property we're going to look for.
session.endDialog("*Congratulations! You are now registered in our network! (goldmedal)*");
})
.triggerAction({
matches: /^register$/i
})
其实savedAddress
应该是IAddress
, and also, the function loadSession(address: IAddress, callback: (err: Error, session: Session) => void): void;
and address(adr: IAddress): Message;
under Message的实例class都需要IAddress
作为参数
所以首先,您应该将整个地址 json 对象保存在 cosmosDB 中以备后用。
由于 Node.js 的 botbuilder 是基于 Restify 或 Express 构建的,您可以为您的用户构建一个附加路由来触发和发送主动消息。工作流程如下:
- 引导用户注册并在您的数据库中使用帐户映射保存用户的地址对象
在 Restify 或 Expressjs 中创建路由以触发主动消息:
server.get('/api/CustomWebApi', (req, res, next) => {
//find the user's address in your DB as `savedAddress`
var msg = new builder.Message().address(savedAddress);
msg.text('Hello, this is a notification');
bot.send(msg);
res.send('triggered');
next();
}
);
或者如果您想利用 loadSession
server.get('/api/CustomWebApi', function (req, res, next) {
bot.loadSession(savedAddress, (err, session) => {
if (!err) {
session.send('Hello, this is a notification')
session.endConversation();
}
})
res.send('triggered');
next();
});
我创建了一个 users.json 文件,我将所有用户保存到该文件中。它按照我需要的方式工作。我想数据库会更好,但我真的不知道从哪里开始。数据库是一个全新的篇章,我还没有接触过,等项目需求解决了再去搞,意义不大。
我已经盯着这个看了好几个小时了,但找不到解决方案,尽管根据所有建议,它应该很简单 - https://docs.microsoft.com/en-us/bot-framework/nodejs/bot-builder-nodejs-proactive-messages.
我创建了一个简单的代码,它将 "register" 用户并将他们的数据保存在我在 Azure 上的 cosmosDatabse 中。效果很好。
//ON "register" SAVE USER DATA AND SAY REGISTERED MESSAGE
bot.dialog('adhocDialog', function(session, args) {
var savedAddress = session.message.address;
session.userData.savedAddress = savedAddress;
//REGISTERED MESSAGE
session.endDialog("*Congratulations! You are now registered in our network! (goldmedal)*");
})
.triggerAction({
matches: /^register$/i
})
- 但是如果满足某个条件,我如何才能访问该特定用户并向他发送消息?(实际上是在 HTTP 请求上)
我相当确定我们必须在某处写下对话 ID 或用户 ID。问题是在哪里?
function startProactiveDialog(address) {
bot.beginDialog(address, "A notification!");
}
- 我认为这应该是多么简单。但是你在哪里指定用户呢?
您已将用户地址保存到 session.userData.savedAddress
,从而将其保存在数据库中。当事件触发时,对您的数据库执行查询以检查满足两个条件的用户。
- 他们已注册监听事件
- 他们的地址已保存在数据库中。
在您的情况下,您可以将 属性 保存到 session.userData
对象,一个 属性 列出了他们正在侦听的事件。如果您只是需要向用户发送消息,那么您可以简单地使用 bot.loadSession(savedAddress)
来 ping 用户。
编辑:
因此,您应该向 CosmosDB 发送一个查询,以查找具有与事件相对应的 "listen-to" Boolean-type 标志的条目,而不是专门通过用户 ID 进行查找。
您一开始并不担心用户 ID,您只是使用(一般来说)如下所示的查询检索所有条目:
SELECT * FROM BotState WHERE data LIKE 'listenForEvent=1
.
因此,要设置您的 session.userData
以便上述理论查询有效,您需要将问题中的代码片段修改为如下所示:
bot.dialog('adhocDialog', function(session, args) {
var savedAddress = session.message.address;
session.userData.savedAddress = savedAddress;
session.userData.listenForEvent = 1 // Our property we're going to look for.
session.endDialog("*Congratulations! You are now registered in our network! (goldmedal)*");
})
.triggerAction({
matches: /^register$/i
})
其实savedAddress
应该是IAddress
, and also, the function loadSession(address: IAddress, callback: (err: Error, session: Session) => void): void;
and address(adr: IAddress): Message;
under Message的实例class都需要IAddress
作为参数
所以首先,您应该将整个地址 json 对象保存在 cosmosDB 中以备后用。
由于 Node.js 的 botbuilder 是基于 Restify 或 Express 构建的,您可以为您的用户构建一个附加路由来触发和发送主动消息。工作流程如下:
- 引导用户注册并在您的数据库中使用帐户映射保存用户的地址对象
在 Restify 或 Expressjs 中创建路由以触发主动消息:
server.get('/api/CustomWebApi', (req, res, next) => { //find the user's address in your DB as `savedAddress` var msg = new builder.Message().address(savedAddress); msg.text('Hello, this is a notification'); bot.send(msg); res.send('triggered'); next(); } );
或者如果您想利用
loadSession
server.get('/api/CustomWebApi', function (req, res, next) { bot.loadSession(savedAddress, (err, session) => { if (!err) { session.send('Hello, this is a notification') session.endConversation(); } }) res.send('triggered'); next(); });
我创建了一个 users.json 文件,我将所有用户保存到该文件中。它按照我需要的方式工作。我想数据库会更好,但我真的不知道从哪里开始。数据库是一个全新的篇章,我还没有接触过,等项目需求解决了再去搞,意义不大。