我一直盯着这几个小时,找不到解决方案,即使通过所有建议它也应该很容易 - https://docs.microsoft.com/en-us/bot-framework/nodejs/bot-builder-nodejs-proactive-messages。
我创建了一个简单的代码,用于“注册”用户并将其数据保存在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
})
我相当肯定我们必须在某处写对话ID或用户ID。问题是在哪里?
function startProactiveDialog(address) {
bot.beginDialog(address, "A notification!");
}
答案 0 :(得分:1)
您已将用户的地址保存到session.userData.savedAddress
,从而保存了数据库内的用户地址。当事件触发时,对数据库执行查询,以检查符合两个条件的用户。
在您的情况下,您可以将属性保存到session.userData
对象,该对象列出了他们正在侦听的事件。如果您只需要向用户发送消息,则只需使用bot.loadSession(savedAddress)
来ping用户。
因此,您应该向您的CosmosDB发送一个查询,而不是专门查看用户ID,而是查找具有" listen-to"的条目。与事件对应的布尔型标志。
您一开始并不担心用户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
})
答案 1 :(得分:1)
实际上,IAddress
应该是IAddress
的一个实例,loadSession(address: IAddress, callback: (err: Error, session: Session) => void): void;
类下的函数address(adr: IAddress): Message;
和Message都需要{{1}作为参数。
首先,您应该将整个地址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();
});
答案 2 :(得分:0)
我创建了一个users.json文件,我保存了所有用户。它按我需要的方式工作。我想数据库会更好,但我真的不知道从哪里开始。数据库是我尚未遇到的一个全新的章节,因此在解决项目需求时对它进行处理是没有意义的。