Есть ли способ включить опцию календаря в качестве входа в чат-бот V4 C #, кроме использования адаптивных карт? - PullRequest
0 голосов
/ 27 мая 2019

Есть ли способ включить ввод даты и времени другими словами, параметры календаря в Chat Bot без использования адаптивных карт, как я понимаю из ссылки ниже, адаптивные карты поддерживаются не во всех каналах, кроме каналов Microsoft.

Как добавить собственные варианты выбора, отображаемые с помощью параметров «Подсказка» в меню «Карты», и инициировать действия по выбору, щелкнув в BOT V4 с помощью c #?

Я включил адаптивные карты с использованием следующих входов:

[BotFramework]: Как получить / извлечь значения, переданные через адаптивную карту, отображаемую в боте C # Web Chat в диалоговом окне с водопадом?

Тогда мой запрос: Как я могу включитьДата Ввод времени в BOT, кроме использования адаптивных карт, таких как Hero Card или любой другой карты (кроме адаптивной карты)?

Язык: C # SDK: V4 Канал: Канал веб-чата Развернут в: Azure

Если есть способ, я прошу вас предоставить подробное пошаговое руководство, поскольку я новичок в BOT и кодировании.

Спасибо & Regards -ChaitanyaNG

Я не могу попробовать нижеприведенное на GitHub, так как это связано с React, но мой код написан на C # и SDK V4 из AZURE:

https://github.com/microsoft/BotFramework-WebChat/tree/master/samples/10.a.customization-card-components

Ожидаемый результат: Показать опцию календаря и время, чтобы выбрать дату и время, чтобы я мог захватить входные значения и продолжить процесс в диалоговом окне с водопадом C #

Фактический результат: Невозможно достичь этого, так как адаптивная карта, кажется,не поддерживаться в канале веб-чата и только в каналах Microsoft, таких как Skype


@ mrichardson-MSFT: Спасибо за всю помощь до сих пор.

Описание проблемы:

У меня есть программа BOT с несколькими классами диалогов с водопадом. Последний класс диалога ШАГ № 1: Я показываю адаптивную карту с двумя входами даты и времени, один для запуска, а другой для остановки Фактический результат: Адаптив успешно отображается как на эмуляторе, так и на веб-канале чата без проблем. ШАГ №2: Когда я нажимаю SetSchedule на объявленииНа первом шаге отображается карта памяти, значения должны быть записаны на шаге 2 и отображаться на экране. Фактический результат : Отлично работает в эмуляторе, но не в боте канала веб-чата.Я получаю сообщение об ошибке в BOT канала чата.Пожалуйста, найдите HTML-файл для доступа к боту, класс диалога с водопадом и json-файл Adaptive card, прилагаемый для справки.Наряду с этим, пожалуйста, найдите скриншот ошибки, прикрепленный в канале чата для справки.

Не могли бы вы мне помочь решить эту проблему, как вы сделали для входа в систему?Запросите вашу немедленную помощь, это блокирует мою работу.

Спасибо и С уважением -ChaitanyaNG

using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Schema;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading.Tasks;

namespace EchoBot.Dialogs
{
    public class Adaptivecarddialog : WaterfallDialog
    {
        public const string cards = @"./AdaptiveCard.json";

        public Adaptivecarddialog(string dialogId, IEnumerable<WaterfallStep> steps = null)
            : base(dialogId, steps)
        {
            AddStep(async (stepContext, cancellationToken) =>
            {
                var cardAttachment = CreateAdaptiveCardAttachment(cards);

                var reply = stepContext.Context.Activity.CreateReply();
                reply.Attachments = new List<Attachment>() { cardAttachment };

                await stepContext.Context.SendActivityAsync(reply, cancellationToken);
                var opts = new PromptOptions
                {
                    Prompt = new Activity
                    {
                        Type = ActivityTypes.Message,
                        // You can comment this out if you don't want to display any text. Still works.
                    }
                };

                // Display a Text Prompt and wait for input
                return await stepContext.PromptAsync(nameof(TextPrompt), opts);
            });

            AddStep(async (stepContext, cancellationToken) =>
            {
                var res = stepContext.Result.ToString();
                dynamic jobject = JsonConvert.DeserializeObject(res);
                string NewStartDateTime = jobject.Startdate + " " + jobject.Starttime;
                string NewStopDateTime = jobject.Stopdate + " " + jobject.Stoptime;
                await stepContext.Context.SendActivityAsync($"StartDateTime:{NewStartDateTime}", cancellationToken: cancellationToken);
                await stepContext.Context.SendActivityAsync($"StopDateTime:{NewStopDateTime}", cancellationToken: cancellationToken);

                return await stepContext.EndDialogAsync();
            });

        }

        public static new string Id => "Adaptivecarddialog";

        public static Adaptivecarddialog Instance { get; } = new Adaptivecarddialog(Id);

        public static Attachment CreateAdaptiveCardAttachment(string filePath)
        {
            var adaptiveCardJson = File.ReadAllText(filePath);
            var adaptiveCardAttachment = new Attachment()
            {
                ContentType = "application/vnd.microsoft.card.adaptive",
                Content = JsonConvert.DeserializeObject(adaptiveCardJson),
            };
            return adaptiveCardAttachment;
        }
    }
}

{
  "type": "AdaptiveCard",
  "body": [
    {
      "type": "TextBlock",
      "id": "Start date text",
      "separator": true,
      "text": "Schedule Start DateTime:"
    },
    {
      "type": "Input.Date",
      "id": "Startdate",
      "separator": true,
      "value": "2019-05-24"
    },
    {
      "type": "Input.Time",
      "id": "Starttime",
      "separator": true,
      "value": "08:00"
    },
    {
      "type": "TextBlock",
      "id": "Stop date text",
      "separator": true,
      "text": "Schedule Stop DateTime:"
    },
    {
      "type": "Input.Date",
      "id": "Stopdate",
      "separator": true,
      "value": "2019-05-25"
    },
    {
      "type": "Input.Time",
      "id": "Stoptime",
      "separator": true,
      "value": "08:00"
    }
  ],
  "actions": [
    {
      "type": "Action.Submit",
      "id": "SubmitBtn",
      "title": "SetSchedule"
    }
  ],
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "version": "1.0"
}

Сообщения об ошибках при повторной попытке: Первая попытка {error: {code: "BotError", сообщение: "Не удалось отправить действие: истекло время ожидания бота"}, httpStatusCode: 504} ошибка: {code:" BotError ", сообщение:" Не удалось отправить действие: истекло время ожидания бота "} code:" BotError "сообщение:" Не удалось отправить действие: истекло время ожидания бота "httpStatusCode: 504

enter image description here SecondTry {error: {code: "BotError", сообщение: "Не удалось отправить действие: бот вернул ошибку"},…} ошибка:{code: «BotError», сообщение: «Не удалось отправить действие: бот вернул ошибку»} code: «BotError»: «Не удалось отправить действие: бот вернул ошибку» httpStatusCode: 500

HTML-файл:

<!DOCTYPE html>
<html lang="en-US">
<head>
    <title>Web Chat: Custom style options</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!--
      For demonstration purposes, we are using the development branch of Web Chat at "/master/webchat.js".
      When you are using Web Chat for production, you should use the latest stable release at "/latest/webchat.js",
      or lock down on a specific version with the following format: "/4.1.0/webchat.js".
    -->
    <script src="https://cdn.botframework.com/botframework-webchat/master/webchat.js"></script>
    <style>
        html, body {
            height: 100%
        }

        body {
            margin: 0
        }

        #webchat {
            height: 100%;
            width: 100%;
        }
    </style>
</head>
<body>
    <div id="webchat" role="main">

    </div>
    <script>
        (async function () {
            // In this demo, we are using Direct Line token from MockBot.
            // To talk to your bot, you should use the token exchanged using your Direct Line secret.
            // You should never put the Direct Line secret in the browser or client app.
            // https://docs.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-direct-line-3-0-authentication

            // Token is found by going to Azure Portal > Your Web App Bot > Channels > Web Chat - Edit > Secret Keys - Show
            // It looks something like this: pD*********xI.8ZbgTHof3GL_nM5***********aggt5qLOBrigZ8
            const token = '<<Your Direct Line Secret Key>>';

            // You can modify the style set by providing a limited set of style options
            const styleOptions = {
                botAvatarImage: 'https://docs.microsoft.com/en-us/azure/bot-service/v4sdk/media/logo_bot.svg?view=azure-bot-service-4.0',
                botAvatarInitials: 'BF',
                userAvatarImage: 'https://avatars1.githubusercontent.com/u/45868722?s=96&v=4',
                userAvatarInitials: 'WC',
                bubbleBackground: 'rgba(0, 0, 255, .1)',
                bubbleFromUserBackground: 'rgba(0, 255, 0, .1)'
            };

            // We are using a customized store to add hooks to connect event
            const store = window.WebChat.createStore({}, ({ dispatch }) => next => action => {
                if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
                    // When we receive DIRECT_LINE/CONNECT_FULFILLED action, we will send an event activity using WEB_CHAT/SEND_EVENT
                    dispatch({
                        type: 'WEB_CHAT/SEND_EVENT',
                        payload: {
                            name: 'webchat/join',
                            value: { language: window.navigator.language }
                        }
                    });
                }
                return next(action);
            });

            window.WebChat.renderWebChat({
                directLine: window.WebChat.createDirectLine({ token }),
                styleOptions,store
            }, document.getElementById('webchat'));

            document.querySelector('#webchat > *').focus();
        })().catch(err => console.error(err));
    </script>
</body>
</html>

1 Ответ

0 голосов
/ 27 мая 2019

Краткий ответ: эта функция недоступна. Адаптивные карты - это лучший путь для выбора даты / времени на основе пользовательского интерфейса. И да, Adaptive Cards полностью поддерживаются на каналах Microsoft (включая WebChat) и в меньшей степени на других каналах.

Наилучшим вариантом будет использование DateTime Prompt .

Существует множество различных методов различной сложности для реализации этого, но Умение календаря Virtual Assistant использует его довольно широко. Его DatePrompt и TimePrompt могут быть хорошими местами для начала.

CoreBot также имеет DateResolverDialog , который может помочь и его немного легче понять.


С DateTime довольно сложно работать в чат-ботах, потому что «среда в 4 часа» может означать среду в 4 утра или 4 часа дня. Образец разрешения Timex должен предоставить дополнительные идеи для решения этой проблемы, если вы собираетесь использовать текстовый ввод.


Возможно, это не работает в WebChat из-за вашей другой проблемы . Я только что проверил ввод даты и времени для этой карты, и она работает:

{
    "type": "AdaptiveCard",
    "actions": [{
        "type": "Action.Submit",
        "id": "submit",
        "title": "Submit"
    }],
    "body": [
        {
            "type": "Input.Date",
            "id": "date",
            "title": "New Input.Toggle"
        },
        {
            "type": "Container",
            "items": [
                {
                    "type": "Input.Time",
                    "id": "time",
                    "title": "New Input.Toggle"
                }
            ]
        }
    ],
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.0"
}

enter image description here

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...