c# botframework bots chatbot

[BotFramework]: ¿Cómo capturar/extraer los valores enviados a través de la tarjeta adaptable representada en el bot de chat de C#Web en un diálogo en cascada?



bots chatbot (1)

He creado chatbot en C # usando el SDK 4 que tiene múltiples cuadros de diálogo; cada cuadro de diálogo llama a otro; en un cuadro de diálogo, estoy mostrando la tarjeta adaptativa en el PASO # 1, que cuenta con solo 2 entradas y el botón OK: 1. Fecha 2. Hora 3. Botón OK Para que pueda extraer / capturar los valores enviados a través del botón OK en el PASO # 2 y continuar con el proceso.

Problema: ¿Cómo extraer los valores que se enviaron en el paso # 1 en el PASO # 2 en un diálogo de cascada en C #?

Idioma: C #

Bot SDK: V4

Por favor, ayúdeme, ya que soy nuevo en BOT y en la codificación al proporcionar una guía paso a paso.

Ya he intentado algunas cosas como: 1. Poner la tarjeta renderizada en el indicador 2. Intentar extraer / capturar valor a través de: stepContext.Context.Activity.Value

Todo esto no ayudó.

PASO # 1: var cardAttachment = CreateAdaptiveCardAttachment(this.cards); var reply = stepContext.Context.Activity.CreateReply(); reply.Attachments = new List<Attachment>() { cardAttachment }; return await stepContext.Context.SendActivityAsync(reply); // o return await stepContext.PromptAsync("datetextPrompt", new PromptOptions() { Prompt = reply, });

PASO # 2: ¿Quiero extraer o capturar valor? ¿Cómo hacerlo?


Uso de tarjetas adaptativas con diálogos en cascada

De forma nativa, las tarjetas adaptativas no funcionan como indicaciones. Con un aviso, este aparecerá y esperará la entrada del usuario antes de continuar. Pero con las tarjetas adaptativas (incluso si contiene un cuadro de entrada y un botón de envío), no hay ningún código en una tarjeta adaptativa que haga que un cuadro de diálogo de cascada espere la entrada del usuario antes de continuar con el cuadro de diálogo.

Por lo tanto, si está utilizando una Tarjeta adaptativa que acepta la entrada del usuario, generalmente desea manejar todo lo que el usuario envíe fuera del contexto de un diálogo de cascada.

Dicho esto, si desea utilizar una tarjeta adaptativa como parte de un diálogo de cascada, hay una solución alternativa. Básicamente, usted:

  1. Mostrar la tarjeta adaptativa
  2. Mostrar un mensaje de texto
  3. Convierta la entrada de la tarjeta adaptativa del usuario en la entrada de un mensaje de texto

En su clase de diálogo de cascada (pasos 1 y 2):

private async Task<DialogTurnResult> DisplayCardAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) { // Display the Adaptive Card var cardPath = Path.Combine(".", "AdaptiveCard.json"); var cardJson = File.ReadAllText(cardPath); var cardAttachment = new Attachment() { ContentType = "application/vnd.microsoft.card.adaptive", Content = JsonConvert.DeserializeObject(cardJson), }; var message = MessageFactory.Text(""); message.Attachments = new List<Attachment>() { cardAttachment }; await stepContext.Context.SendActivityAsync(message, cancellationToken); // Create the text prompt var opts = new PromptOptions { Prompt = new Activity { Type = ActivityTypes.Message, Text = "waiting for user input...", // 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); } private async Task<DialogTurnResult> HandleResponseAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) { // Do something with step.result // Adaptive Card submissions are objects, so you likely need to JObject.Parse(step.result) await stepContext.Context.SendActivityAsync($"INPUT: {stepContext.Result}"); return await stepContext.NextAsync(); }

En su clase de bot principal ( <your-bot>.cs ), en OnTurnAsync() , cerca del comienzo del método, en algún lugar antes de await dialogContext.ContinueDialogAsync(cancellationToken) se llama (paso 3):

var activity = turnContext.Activity; if (string.IsNullOrWhiteSpace(activity.Text) && activity.Value != null) { activity.Text = JsonConvert.SerializeObject(activity.Value); }

Contexto adicional

Las tarjetas adaptativas envían sus resultados de envío un poco diferentes al texto del usuario regular. Cuando un usuario escribe en el chat y envía un mensaje normal, termina en Context.Activity.Text . Cuando un usuario completa una entrada en una Tarjeta adaptativa, termina en Context.Activity.Value , que es un objeto donde los nombres de clave son la id en su tarjeta y los valores son los valores de campo en la tarjeta adaptativa.

Por ejemplo, el json:

{ "type": "AdaptiveCard", "body": [ { "type": "TextBlock", "text": "Test Adaptive Card" }, { "type": "ColumnSet", "columns": [ { "type": "Column", "items": [ { "type": "TextBlock", "text": "Text:" } ], "width": 20 }, { "type": "Column", "items": [ { "type": "Input.Text", "id": "userText", "placeholder": "Enter Some Text" } ], "width": 80 } ] } ], "actions": [ { "type": "Action.Submit", "title": "Submit" } ], "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "version": "1.0" }

.. crea una tarjeta que se parece a:

Si un usuario ingresa "Testing Testing 123" en el cuadro de texto y Context.Activity Enviar, Context.Activity se verá así:

{ type: ''message'', value: { userText: ''Testing Testing 123'' }, from: { id: ''xxxxxxxx-05d4-478a-9daa-9b18c79bb66b'', name: ''User'' }, locale: '''', channelData: { postback: true }, channelId: ''emulator'', conversation: { id: ''xxxxxxxx-182b-11e9-be61-091ac0e3a4ac|livechat'' }, id: ''xxxxxxxx-182b-11e9-ad8e-63b45e3ebfa7'', localTimestamp: 2019-01-14T18:39:21.000Z, recipient: { id: ''1'', name: ''Bot'', role: ''bot'' }, timestamp: 2019-01-14T18:39:21.773Z, serviceUrl: ''http://localhost:58453'' }

El envío del usuario se puede ver en Context.Activity.Value.userText .

Tenga en cuenta que los envíos de tarjetas adaptables se envían como un postBack, lo que significa que los datos del envío no aparecen en la ventana de chat como parte de la conversación, sino que permanecen en la Tarjeta adaptativa.