在 Micorsoft bot 框架中使用 c# 和 v4 版本在聊天机器人中使用 Microsoft Bot Framework 设置计时器
Set Timer Using Microsoft Bot Framework in chat bot using c# and v4 version in Micorsoft bot framework
你好有人会提供网络聊天超时实施的示例。
让我解释一下,我希望我的机器人在用户不活动 5 秒后收到一个事件,以便在机器人响应或提问后向他发送一条消息(你在吗?)。
我是 bot 框架的新手并使用 .net 核心。
预先感谢您的反馈
我对 C# 帮不上忙,但我在 nodejs 中实现了这个,也许你可以适应。基本流程是这样的:
在您的 onMessage 处理程序中:
- 获取你的对话状态object(我叫它
conversationData
)
- 获取当前对话引用并保存到对话状态
- 清除计时器object(例如
this.inactivityTimer
)设置计时器的新实例
- 当计时器运行时,启动一个新的 BotFrameworkAdapter 实例来发送主动消息
- 向用户发送不活动消息
请注意,除了设置超时值外,您还需要传入您的对话引用(或整个对话状态object)。这是我使用的具体示例:
// Inactivity messages
// 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('Bad Request. Please ensure your message contains the conversation reference and message text.');
console.log(error);
}
}, 300000, conversationData.conversationReference);
如果您不想使用主动消息 and/or 呈现一个新的机器人适配器,并且您只为直线通道执行此操作,您可以从您的网站创建一个自定义事件并设置一个 onEvent 处理程序寻找它。例如,如果您发送一个名为“inactive”的事件,您可以在您的事件处理程序中执行类似
if (context.activity.name && context.activity.name === 'inactive') {
await context.sendActivity({
text: 'Are you still there? Is there anything else I can help you with?',
name: 'inactive'
});
}
这将需要您拥有某种自定义商店。我不再这样做了,但这是我曾经在某个页面上看到的一个例子。我相信它应该仍然有效。您可以看到它与我的 onMessage 处理程序非常相似,但由于您必须检查消息的方式而稍微复杂一些。我也有代码来更改页面标题以获得更多可见性。对于它的价值,在我的例子中,用户讨厌它(一般的通知,尤其是页面闪烁)。但是可以做到。
const store = window.WebChat.createStore({}, function(dispatch) { return function(next) { return function(action) {
if (action.type === 'WEB_CHAT/SEND_MESSAGE') {
// Message sent by the user
PageTitleNotification.Off();
clearTimeout(interval);
} else if (action.type === 'DIRECT_LINE/INCOMING_ACTIVITY' && action.payload.activity.name !== "inactive") {
// Message sent by the bot
clearInterval(interval);
interval = setTimeout(function() {
// Change title to flash the page
PageTitleNotification.On('Are you still there?');
// Notify bot the user has been inactive
dispatch.dispatch({
type: 'WEB_CHAT/SEND_EVENT',
payload: {
name: 'inactive',
value: ''
}
});
}, 300000)
}
return next(action);
}}});
你好有人会提供网络聊天超时实施的示例。 让我解释一下,我希望我的机器人在用户不活动 5 秒后收到一个事件,以便在机器人响应或提问后向他发送一条消息(你在吗?)。 我是 bot 框架的新手并使用 .net 核心。 预先感谢您的反馈
我对 C# 帮不上忙,但我在 nodejs 中实现了这个,也许你可以适应。基本流程是这样的:
在您的 onMessage 处理程序中:
- 获取你的对话状态object(我叫它
conversationData
) - 获取当前对话引用并保存到对话状态
- 清除计时器object(例如
this.inactivityTimer
)设置计时器的新实例 - 当计时器运行时,启动一个新的 BotFrameworkAdapter 实例来发送主动消息
- 向用户发送不活动消息
请注意,除了设置超时值外,您还需要传入您的对话引用(或整个对话状态object)。这是我使用的具体示例:
// Inactivity messages
// 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('Bad Request. Please ensure your message contains the conversation reference and message text.');
console.log(error);
}
}, 300000, conversationData.conversationReference);
如果您不想使用主动消息 and/or 呈现一个新的机器人适配器,并且您只为直线通道执行此操作,您可以从您的网站创建一个自定义事件并设置一个 onEvent 处理程序寻找它。例如,如果您发送一个名为“inactive”的事件,您可以在您的事件处理程序中执行类似
if (context.activity.name && context.activity.name === 'inactive') {
await context.sendActivity({
text: 'Are you still there? Is there anything else I can help you with?',
name: 'inactive'
});
}
这将需要您拥有某种自定义商店。我不再这样做了,但这是我曾经在某个页面上看到的一个例子。我相信它应该仍然有效。您可以看到它与我的 onMessage 处理程序非常相似,但由于您必须检查消息的方式而稍微复杂一些。我也有代码来更改页面标题以获得更多可见性。对于它的价值,在我的例子中,用户讨厌它(一般的通知,尤其是页面闪烁)。但是可以做到。
const store = window.WebChat.createStore({}, function(dispatch) { return function(next) { return function(action) {
if (action.type === 'WEB_CHAT/SEND_MESSAGE') {
// Message sent by the user
PageTitleNotification.Off();
clearTimeout(interval);
} else if (action.type === 'DIRECT_LINE/INCOMING_ACTIVITY' && action.payload.activity.name !== "inactive") {
// Message sent by the bot
clearInterval(interval);
interval = setTimeout(function() {
// Change title to flash the page
PageTitleNotification.On('Are you still there?');
// Notify bot the user has been inactive
dispatch.dispatch({
type: 'WEB_CHAT/SEND_EVENT',
payload: {
name: 'inactive',
value: ''
}
});
}, 300000)
}
return next(action);
}}});