使用Microsoft Bot Framework设置计时器

时间:2019-03-01 06:36:44

标签: node.js botframework chatbot

如果用户在超过5秒钟内未对bot做出响应,Bot应提示“您在那里”。要实现此逻辑,请您提供帮助,如何使用Node Js SDK和V4版本在聊天bot中设置计时器在Microsoft Bot框架中

1 个答案:

答案 0 :(得分:1)

在用户闲置了一段时间后,您可以让WebChat或BotChat向bot发送反向通道事件,并且bot可以通过询问用户是否还存在来进行响应。注意,我建议使用WebChat,因为BotChat已被贬值,并且WebChat中的实现稍微干净一些。

enter image description here

网络聊天

在WebChat中,我们将创建一个自定义存储和中间件,以侦听用户发送消息时和机器人发送消息时(分别为WEB_CHAT/SEND_MESSAGEDIRECT_LINE/INCOMING_ACTIVITY)的事件。

当漫游器发送的消息不询问用户是否仍然存在时,我们将创建一个超时,该超时将在设置的时间段后执行回调-在这种情况下为五秒钟。回调将调度一个反向通道事件,以通知bot用户闲置时间超过了所分配的时间间隔,并且bot可以做出相应的响应。我们将在反向渠道事件中添加一个名称-'inactive'-因此我们可以在漫游器端对其进行识别。

当用户发送消息时,我们将清除漫游器发送消息时创建的超时,因此由于用户在分配的时间范围内做出响应,因此不会执行回调。有关更多详细信息,请参见下面的代码段。

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中创建相同的效果-在漫游器发送消息时创建超时,并在用户发送消息时清除超时;但是,我们必须创建一个自定义的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的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'
            });
        } 
        ...
    }
    ...
}

希望这会有所帮助!