Установить таймер с помощью Microsoft Bot Framework - PullRequest
0 голосов
/ 01 марта 2019

Если пользователь не отвечает боту более 5 секунд, бот должен запросить «Вы здесь». Чтобы реализовать эту логику, не могли бы вы помочь, как установить таймер в бот-чате с использованием Node Js SDK и версии V4?в рамках Microsoft Bot

1 Ответ

0 голосов
/ 02 марта 2019

После определенного периода бездействия пользователя вы можете сделать так, чтобы WebChat или BotChat отправляли боту событие обратного канала, и бот может ответить, спросив пользователя, все ли они еще там.Обратите внимание, я бы рекомендовал использовать WebChat, так как BotChat устарел, а реализация в WebChat немного чище.

enter image description here

WebChat

В WebChat мы собираемся создать собственный магазин и промежуточное программное обеспечение для прослушиваниясобытия, когда пользователь отправляет сообщение и когда бот отправляет сообщение - WEB_CHAT/SEND_MESSAGE и DIRECT_LINE/INCOMING_ACTIVITY соответственно.

Когда бот отправляет сообщение, которое не спрашивает пользователя, находятся ли они еще там, мы создадим тайм-аут, который выполнит обратный вызов через заданный период времени - в данном случае, пять секунд.Обратный вызов отправит событие обратного канала, чтобы уведомить бота о том, что пользователь неактивен в течение более чем выделенного промежутка времени, и бот может ответить соответствующим образом.Мы добавим имя к событию обратного канала - «неактивное» - чтобы мы могли идентифицировать его на стороне бота.

Когда пользователь отправляет сообщение, мы очищаем время ожидания, которое было создано, когда бот отправил сообщение, поэтому обратный вызов не будет выполнен, так как пользователь ответил в течение выделенного периода времени.См. Фрагмент кода ниже для получения дополнительной информации.

let interval;

// We are using a customized store to add hooks to connect event
const store = window.WebChat.createStore({}, ({ dispatch }) => next => action => {

  if (action.type === 'WEB_CHAT/SEND_MESSAGE') {
    // Message sent by the user
    clearTimeout(interval);
  } else if (action.type === 'DIRECT_LINE/INCOMING_ACTIVITY' && action.payload.activity.name !== "inactive") {
    // Message sent by the bot
    clearInterval(interval);
    interval = setTimeout(() => {
      // Notify bot the user has been inactive
      dispatch({
        type: 'WEB_CHAT/SEND_EVENT',
        payload: {
          name: 'inactive',
          value: ''
        }
      });
    }, 5000)
  }

  return next(action);
  });

window.WebChat.renderWebChat({
directLine: window.WebChat.createDirectLine({ token }),
store,
}, document.getElementById('webchat'));

BotChat

Мы можем создать тот же эффект в BotChat - создание тайм-аута, когда бот отправляет сообщение иочистка таймаута, когда пользователь отправляет сообщение;однако нам нужно создать пользовательский объект DirectLine, чтобы видеть, когда пользователь отправляет сообщение, подписываться и фильтровать действия, чтобы мы могли определить, когда бот отправил сообщение.См. Фрагмент кода ниже для получения более подробной информации.

let timeout;
let dl = new BotChat.DirectLine({ secret: <Secret> });

BotChat.App({
  botConnection: { ...dl,
    postActivity: activity => {
      // Listen for when the user sends a message and clear the timeout;
      clearTimeout(timeout);
      return dl.postActivity(activity);
    }
  },
  user: { id: 'userid' },
  bot: { id: 'botid' },
  resize: 'detect'
}, document.getElementById("bot"));

// Listen for incoming activities from the bot and create timeout
dl.activity$
  .filter(activity => activity.name !== 'inactive')
  .filter(activity => activity.from.id !== 'userid')
  .subscribe(activity => {

    clearTimeout(timeout);
    timeout = setTimeout(() => {
      // Notify bot the user has been inactive
      dl.postActivity({
        type: 'Event',
        value: '',
        from: {
          id: 'userid'
        },
        name: 'inactive'
      })
      .subscribe()
    }, 5000);
  })

Bot Code - Node

В методе Bot onTurn мы собираемся проверить, нет ли каких-либо входящихдействия называются «неактивными».Если действие названо неактивным, отправьте действие, спрашивая, есть ли еще пользователь;в противном случае продолжите диалог с обычным ботом.Мы также назовем действие, спрашивающее пользователя, не находятся ли они там, «неактивно», поэтому мы не создаем новый тайм-аут каждые пять секунд, пока пользователь не отвечает.См. Фрагмент кода ниже.

async onTurn(turnContext) {
    if(turnContext.activity.type === ActivityTypes.Message) {
        if (turnContext.activity.name && turnContext.activity.name === 'inactive') {
            await turnContext.sendActivity({
                text: 'Are you still there?',
                name: 'inactive'
            });
        } 
        ...
    }
    ...
}

Надеюсь, это поможет!

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