使用 Microsoft Bot Framework 设置计时器

Sri*_*kha 4 chatbot node.js botframework

如果用户超过 5 秒没有响应机器人,机器人应提示“你在吗”。要实现此逻辑,请您帮忙,如何使用 Node Js SDK 和 Microsoft Bot 中的 V4 版本在聊天机器人中设置计时器框架

tdu*_*ord 5

用户处于不活动状态一段时间后,您可以让 WebChat 或 BotChat 向机器人发送反向通道事件,机器人可以通过询问用户是否仍然存在来进行响应。请注意,我建议使用 WebChat,因为 BotChat 已被弃用,并且 WebChat 中的实现稍微干净一些。

在此输入图像描述

网络聊天

在 WebChat 中,我们将创建一个自定义存储和中间件来分别监听用户发送消息和机器人发送消息的WEB_CHAT/SEND_MESSAGE事件DIRECT_LINE/INCOMING_ACTIVITY

当机器人发送一条消息而不询问用户是否仍在那里时,我们将创建一个超时,在设定的时间范围(在本例中为五秒)后执行回调。该回调将调度一个反向通道事件,以通知机器人用户处于不活动状态的时间超过了分配的时间间隔,并且机器人可以做出相应的响应。我们将为反向通道事件添加一个名称 - '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'));
Run Code Online (Sandbox Code Playgroud)

聊天机器人

我们可以在 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);
  })
Run Code Online (Sandbox Code Playgroud)

机器人代码 - 节点

在机器人的onTurn方法中,我们将检查是否有任何传入活动被命名为“非活动”。如果该活动被命名为不活动,则发送一个活动询问用户是否仍然在那里;否则,继续正常的机器人对话。我们还将询问用户是否处于“不活动”状态的活动命名为“不活动”,这样当用户没有响应时,我们就不会每五秒创建一个新的超时。请参阅下面的代码片段。

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

希望这可以帮助!