2

我一直盯着这个几个小时,找不到解决方案,即使所有建议都应该很容易 - 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
})
  • 但是,如果满足某个条件,我如何访问该特定用户并向他发送消息?(实际上是在 HTTP 请求上)

我相当肯定我们必须在某处写下对话 ID 或用户 ID。问题是在哪里?

function startProactiveDialog(address) {
    bot.beginDialog(address, "A notification!");
}
  • 这就是我认为应该是多么简单。但是你在哪里指定用户呢?
4

3 回答 3

1

您已通过将用户地址保存到session.userData.savedAddress. 当事件触发时,对您的数据库执行查询以检查满足两个条件的用户。

  1. 他们已注册监听事件
  2. 他们的地址已保存在数据库中。

在您的情况下,您可以将属性保存到session.userData对象,该属性列出了他们正在侦听的事件。如果您只是需要向用户发送消息,那么您可以简单地使用bot.loadSession(savedAddress)ping 用户。


编辑:

因此,您应该向 CosmosDB 发送查询,以查找具有与事件对应的“listen-to”布尔类型标志的条目,而不是专门通过用户 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
})
于 2018-03-09T00:37:42.507 回答
1

实际上,savedAddress应该是 的实例,而且Message类下IAddress的函数loadSession(address: IAddress, callback: (err: Error, session: Session) => void): void;和函数都需要作为参数。address(adr: IAddress): Message;IAddress

所以首先,你应该将整个地址 json 对象保存在 cosmosDB 中以供以后使用。

由于 Node.js 的 botbuilder 是基于 Restify 或 Express 构建的,因此您可以为您的用户构建附加路由来触发和发送主动消息。工作流程可能如下:

  1. 引导用户注册并保存用户的地址对象与您的数据库中的帐户映射
  2. 在 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();
    });
    
于 2018-03-13T08:57:23.027 回答
0

我创建了一个 users.json 文件,我将所有用户保存到该文件中。它按我需要的方式工作。我想数据库会更好,但我真的不知道从哪里开始。数据库是一个全新的章节,我还没有遇到过,所以当项目需求得到解决时,再去研究它是没有意义的。

于 2018-03-28T10:27:46.120 回答