Как отправить сообщение пользователю, если бот простаивает в течение 5 минут в botframework v4 - PullRequest
1 голос
/ 20 апреля 2020

Я хочу отправить приглашение (я жду), если я не получу сообщение от пользователя, скажем, через 5 минут в прямом канале чата.

Это демонстрационный бот, поэтому я использую локальный память для хранения.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 23 апреля 2020

Есть несколько способов справиться с этим. Если вы вызываете это через скрипт (используя что-то вроде опции botframework-webchat с использованием канала Directline), вы можете проверить этот ответ на SO , который показывает, как его настроить, в файле HTML.

Если вы хотите реализовать это непосредственно в своем боте, вы можете использовать функцию времени, подобную Sainath Reddy. Тем не менее, я заметил, что объект контекста становится недействительным, поэтому вы должны использовать вместо этого Проактивный обмен сообщениями. Я не уверен, что это самый эффективный метод, но вот как я смог выполнить sh this.

Во-первых, вы должны импортировать TurnContext и BotFrameworkAdapter из botbuilder

const { TurnContext, BotFrameworkAdapter } = require('botbuilder');

Затем добавьте следующий код в функцию onMessage (или onTurn, если вы используете более раннюю настройку). setTimeout будет работать только один раз. Вместо этого вы можете использовать setInterval, если хотите, чтобы оно повторялось.

            // Save the conversationReference
            var conversationReference = TurnContext.getConversationReference(context.activity);

            // Reset the inactivity timer
            clearTimeout(this.inactivityTimer);
            this.inactivityTimer = setTimeout(async function(conversationReference) {
                console.log('User is inactive');
                try {
                    const adapter = new BotFrameworkAdapter({
                        appId: process.env.microsoftAppID,
                        appPassword: process.env.microsoftAppPassword
                    });
                    await adapter.continueConversation(conversationReference, async turnContext => {
                        await turnContext.sendActivity('Are you still there?');
                    });
                } catch (error) {
                    console.log(error);
                }
            }, 300000, conversationReference);

Я предпочитаю этот метод, потому что он также работает, если вы используете botframework-webchat или аналогичный. На самом деле, это будет работать на каждом канале. Если есть определенные каналы, где вы не хотите, чтобы это происходило, вам нужно добавить некоторые дополнительные логики c в функцию. Или, если вы хотите это только в чем-то вроде botframework-webchat, вы можете просто использовать первый метод, который я связал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...