如果用户在超过5秒钟内未对bot做出响应,Bot应提示“您在那里”。要实现此逻辑,请您提供帮助,如何使用Node Js SDK和V4版本在聊天bot中设置计时器在Microsoft Bot框架中
答案 0 :(得分:1)
在用户闲置了一段时间后,您可以让WebChat或BotChat向bot发送反向通道事件,并且bot可以通过询问用户是否还存在来进行响应。注意,我建议使用WebChat,因为BotChat已被贬值,并且WebChat中的实现稍微干净一些。
网络聊天
在WebChat中,我们将创建一个自定义存储和中间件,以侦听用户发送消息时和机器人发送消息时(分别为WEB_CHAT/SEND_MESSAGE
和DIRECT_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'
});
}
...
}
...
}
希望这会有所帮助!