在 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 处理程序中:

  1. 获取你的对话状态object(我叫它conversationData
  2. 获取当前对话引用并保存到对话状态
  3. 清除计时器object(例如this.inactivityTimer)设置计时器的新实例
  4. 当计时器运行时,启动一个新的 BotFrameworkAdapter 实例来发送主动消息
  5. 向用户发送不活动消息

请注意,除了设置超时值外,您还需要传入您的对话引用(或整个对话状态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);
            }}});