【问题标题】:How send event from botframework v3 c# and listen at client side javascript using Direct Line?如何从 botframework v3 c# 发送事件并使用 Direct Line 在客户端 JavaScript 监听?
【发布时间】:2019-09-25 07:32:53
【问题描述】:

如何通过在 wc-shellinput 中使用 disabled 来禁用用户输入,仅当某些事件从 MessagesController 或任何对话框触发时,并在用户完成所需操作时启用它。 如果我想在与聊天机器人对话期间浏览 Web 应用程序怎么办? 这种类型的事件处理如何可能?

【问题讨论】:

    标签: c# botframework direct-line-botframework


    【解决方案1】:

    根据this WebChat sample,这是运行它的方法:

    将自定义 ChannelData 添加到您的传出活动(在机器人代码中)

    请参阅this sample 了解更多信息。

    var message = context.MakeMessage();
    

    禁用输入

    message.ChannelData = new { chatBox = "disable" }
    

    启用输入

    message.ChannelData = new { chatBox = "enable" }
    

    发送消息

    await context.PostAsync(message);
    

    channelData.chatBox 创建事件(在 index.html 脚本标签中)

    const store = window.WebChat.createStore(
        {},
        ({ dispatch }) => next => action => {
        if (action && action.payload && action.payload.activity && action.payload.activity.channelData && action.payload.activity.channelData.chatBox) {
            const event = new Event(`chatBox`);
            event.data = action.payload.activity.channelData.chatBox;
            window.dispatchEvent(event);
        }
    
        return next(action);
        }
    );
    

    监听事件并启用/禁用聊天框(在 index.html 脚本标签中)

    window.addEventListener('chatBox', ({ data }) => {
        const chatBox = document.querySelector(`[data-id="webchat-sendbox-input"]`);
        switch(data){
            case 'enable':
                chatBox.disabled = false;
                break;
            case 'disable':
                chatBox.disabled = true;
                break;
        }
    });
    

    已启用:

    已禁用:

    请务必确保在禁用后根据需要重新启用它!

    使用机器人聊天

    这几乎是一样的。您报告说 BotChat 没有检测到所有消息,所以我改用了事件。

    创建/发送事件

    var disable = new Activity()
    {
        Type = ActivityTypes.Event,
        Value = new { chatBox = "disable" }
    };
    var enable = new Activity()
    {
        Type = ActivityTypes.Event,
        Value = new { chatBox = "enable" }
    };
    await turnContext.SendActivityAsync(disable);
    

    在 BotChat 中监听事件

    botConnection.activity$
        .subscribe(function (activity) {
            if (activity.type === 'event' && activity.value.chatBox) {
                controlInput(activity.value.chatBox);
            }
        });
    
        function controlInput(action) {
        const chatBox = document.querySelector(`[class="wc-shellinput"]`);
        switch(action) {
            case 'enable':
                chatBox.disabled = false;
                break;
            case 'disable':
                chatBox.disabled = true;
                break;
        }
    }
    

    注意:如果您使用的是标准 BotChat css,则输入颜色不会改变。您需要自己添加 css。大致如下:

    input:disabled {
              background-color: black !important;
          }
    

    【讨论】:

    • 谢谢兄弟,但我正在使用 botchat.js 和 Ised 这种方法来识别消息活动,但问题是只获取欢迎消息的前几条日志而不是整个消息botConnection.activity$ .subscribe(function(activity){ if(activity.type == "message"){ console.log(activity.type) } });
    • 我明白了。切换到 WebChat 对您来说有多困难(我知道这是可能的)?我可以在 botchat 中尝试这个,但如果你还是要切换,我不会担心。
    • @MuhammadAsimZaman 我为 BotChat 添加了一个解决方案。请参阅编辑后的答案。
    • 谢谢@mdrichardson,其实我用的是自定义css,所以不想切换,但昨天我切换到webchat.js ......我想根据项目要求自定义按钮和其他东西我们可以动态更改按钮的属性吗?假设在一种情况下,我想更改应该不同的按钮颜色和形状在另一种情况下,如何在 webchat.js 中进行自定义...
    • 在根对话框的 StartAsync 方法中,我调用了 ShowAccountCard private async Task ShowAccountCard(IDialogContext context){ Attachment attachment = new Attachment(){ Content = await GetCardText("accountOptions"), ContentType = AdaptiveCard.ContentType }; var message = context.MakeMessage(); message.Attachments.Add(attachment); await context.PostAsync(message); context.Wait(MessageReceivedAsync1); } 显示卡片但调用了 MessageReceivedAsync1 却没有获得用户输入并单击提交,为什么?
    猜你喜欢
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多