Bot Framework получает адрес пользователя из Cosmos DB для отправки упреждающего сообщения NODE JS

Я никогда не работал с Cosmos DB, поэтому не знаю, как работает соединение. Я долго искал ответы, но не нашел. В документации я только нашел, как ПОДКЛЮЧИТЬ бота к моей Cosmos DB, что я действительно сделал.

Ответ мне нужен:

  • какой код для получения адреса пользователя, который я сохранил в моей БД при регистрации пользователя (//REGISTER)

- В //TEST у меня есть простой код для отправки упреждающего сообщения, прямо сейчас, как вы можете видеть, он отправляет только текущее состояние адреса в приложении. Вместо этого мне нужно получить его из моей Azure Cosmos DB, где я сохраняю пользователей.

ЗДЕСЬ ССЫЛКА НА МОЙ БОТ-КОД

Заранее очень благодарен всем, кто хотя бы попытается ответить. =)

Встроенный код:

var restify = require('restify');
var builder = require('botbuilder');
var fs = require('fs');

//RESTIFY SETUP

var https_options = {
    key: fs.readFileSync('./herobot.hero-translating.com.key'), //on current folder
    certificate: fs.readFileSync('./herobot.hero-translating.com.crt')
};

var server = restify.createServer(https_options);
server.listen(process.env.port || process.env.PORT || 8081, function() {
    console.log('%s listening to %s', server.name, server.url);
});

//BOT CONNECTOR
var connector = new builder.ChatConnector({
    appId: 'HIDDEN',
    appPassword: 'HIDDEN'
});

//COSMOS DB CONNECTION

var azure = require('botbuilder-azure');

var documentDbOptions = {
    host: 'https://HIDDEN.documents.azure.com:443/',
    masterKey: 'HIDDEN',
    database: 'HIDDEN',
    collection: 'HIDDEN',
};

var docDbClient = new azure.DocumentDbClient(documentDbOptions);
var cosmosStorage = new azure.AzureBotStorage({ gzipData: false }, docDbClient);

var bot = new builder.UniversalBot(connector);
bot.set('storage', cosmosStorage);

server.post('/api/smessages', connector.listen());

//DIALOGS

String.prototype.contains = function(content) {
    return this.indexOf(content) !== -1;
};

bot.dialog('/', function(session) {

    function sendProactiveMessage(address) {
        var msg = new builder.Message().address(address);
        msg.text('Test message.');
        msg.textLocale('en-US');
        bot.send(msg);
    }

    const userText = session.message.text.toLowerCase();

    String.prototype.is = function() {
        const args = Array.prototype.slice.call(arguments);
        const text = userText;
        for (let i = 0; i < args.length; i++)
            if (text.includes(args[i])) return true;
        return false;
    };



    //Greeting  
    if (userText.is('hello', 'hi', 'good morning', 'good afternoon', 'hey'))
        session.send(`Hello.`);

    //Thanks    
    else if (userText.is('thank you', 'thanks', 'thx'))
        session.send(`You are welcome!`);

    //REGISTER
    else if (userText.is('register')) {
        var savedAddress = session.message.address;
        session.userData.savedAddress = savedAddress;
        //REGISTERED MESSAGE
        session.send("*Congratulations! You are now registered in our network! (goldmedal)*");
        console.log(JSON.stringify(savedAddress));
    }

    //TEST
    else if (userText.is('test')) {
        sendProactiveMessage(savedAddress);
    }

    //Unrecognized messages    
    else
        session.send(`I don't understand your input.`);
});

person Richard Franek    schedule 22.03.2018    source источник


Ответы (1)


Я думаю, что вам нужно отправлять пользователям упреждающие сообщения из Cosmos DB.

Когда вы РЕГИСТРАЦИЯ пользователя в своем коде, вы сохранили session.message.address в userData пользователей сеанса. Вы можете наблюдать за этими данными в своей Cosmos DB. Запустив свой эмулятор бота, я увижу 3 документа (мин.) В моей Cosmos DB / botdocs / botdata:

  1. пользователь по умолчанию, userData
  2. [идентификатор разговора], данные разговора
  3. [идентификатор разговора], пользователь по умолчанию

default-user - это, по сути, идентификатор пользователя бота. И вы сохранили адрес (session.userData.savedAddress = savedAddress;) в userData.

Чтобы отправить превентивное сообщение, вам просто нужно запросить в Cosmos DB документы, подобные (1.), с сохраненным адресом и отправить сообщение.

Вы можете обратиться к моему коду. Текущий триггер для этого образца использует таймер через 5 секунд, который отправит упреждающее сообщение ВСЕМ зарегистрированным пользователям. Вы можете изменить запрос, чтобы выбрать конкретного пользователя, или изменить триггер на HTTP-запросы.

person Helen Lo    schedule 26.03.2018