Responder a la acción de envío del módulo de tareas

Importante

Los ejemplos de código de esta sección se basan en 4,6 y versiones posteriores del SDK de bot Framework. Si está buscando documentación para versiones anteriores, vea la sección de extensiones de mensajería-V3 SDK en la carpeta recursos de la documentación.

Una vez que un usuario envía el módulo de tareas, el servicio web recibirá un composeExtension/submitAction mensaje de invocación con los valores del identificador de comando y el parámetro establecidos. La aplicación tendrá cinco segundos para responder a la invocación, de lo contrario el usuario recibirá el mensaje de error "no se puede comunicar la aplicación" y cualquier respuesta a la invocación será ignorada por el cliente de Teams.

Tiene las siguientes opciones para responder.

En la tabla siguiente se muestran los tipos de respuestas disponibles en función de la ubicación de invocación ( commandContext ) de la extensión de mensajería. Para la autenticación o la configuración, una vez que el usuario completa el flujo, la invocación original se volverá a enviar a su servicio Web.

Tipo de respuesta elaborar barra de comandos mensaje
Respuesta de tarjeta x x x
Otro módulo de tareas x x x
Bot con tarjeta adaptable x x
Sin respuesta x x x

Evento Invoke de submitAction

A continuación se muestran ejemplos de cómo recibir el mensaje de invocación.

protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionSubmitActionAsync(
  ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken) {
  //code to handle the submit action
}

Responder con una tarjeta insertada en el área de redacción del mensaje

La forma más común de responder a la composeExtension/submitAction solicitud es con una tarjeta insertada en el área de redacción del mensaje. A continuación, el usuario puede elegir enviar la tarjeta a la conversación. Para obtener más información sobre el uso de tarjetas , consulte acciones de tarjetas y tarjetas.

protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionSubmitActionAsync(
  ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
    dynamic Data = JObject.Parse(action.Data.ToString());
    var response = new MessagingExtensionActionResponse
    {
        ComposeExtension = new MessagingExtensionResult
        {
            AttachmentLayout = "list",
            Type = "result",
        },
    };
    var card = new HeroCard
    {
        Title = Data["formField1"] as string,
        Subtitle = Data["formField2"]  as string,
        Text = Data["formField3"]  as string,
    };

    var attachments = new List<MessagingExtensionAttachment>();
    attachments.Add(new MessagingExtensionAttachment
    {
        Content = card,
        ContentType = HeroCard.ContentType,
        Preview = card.ToAttachment(),
    });

    response.ComposeExtension.Attachments = attachments;

    return response;

}

Responder con otro módulo de tareas

Puede elegir responder al submitAction evento con un módulo de tareas adicional. Esto puede ser útil cuando:

  • Tiene que recopilar grandes cantidades de información.
  • Si necesita cambiar dinámicamente la información que va a recopilar en función de los datos proporcionados por el usuario
  • Si necesita validar la información enviada por el usuario y, potencialmente, volver a enviar el formulario con un mensaje de error si algo es incorrecto.

El método para Response es el mismo que responder al fetchTask evento inicial. Si está usando el SDK de bot Framework, el mismo evento se activará para las acciones de envío. Esto significa que debe asegurarse de agregar una lógica que determine la respuesta correcta.

Respuesta de bot con tarjeta adaptable

Nota

Este flujo requiere que agregue el bot objeto al manifiesto de la aplicación y que haya definido el ámbito necesario para el bot. Use el mismo identificador que su extensión de mensajería para el bot.

También puede responder a la acción de envío Insertando un mensaje con una tarjeta adaptable en el canal con un bot. El usuario podrá obtener una vista previa del mensaje antes de enviarlo y, potencialmente, editarlo o interactuar con él. Esto puede ser muy útil en escenarios en los que necesite recopilar información de los usuarios antes de crear una respuesta de tarjeta adaptable, o cuando vaya a necesitar actualizar la tarjeta después de que alguien interactúe con ella. El siguiente escenario muestra cómo la aplicación Polly usa este flujo para configurar un sondeo sin incluir los pasos de configuración en la conversación de canal.

  1. El usuario hace clic en la extensión de mensajería para desencadenar el módulo de tareas.
  2. El usuario configura el sondeo con el módulo de tareas.
  3. Después de enviar el módulo de tareas, la aplicación usa la información proporcionada para compilar el sondeo como una tarjeta adaptable y enviarla como botMessagePreview respuesta al cliente.
  4. A continuación, el usuario puede obtener una vista previa del mensaje de tarjeta adaptable antes de que el bot lo inserte en el canal. Si la aplicación aún no es miembro del canal, al hacer clic Send se agregará.
    1. El usuario también puede elegir Edit el mensaje, que lo devuelve al módulo de tareas original.
  5. Interactuar con la tarjeta adaptable cambia el mensaje antes de enviarlo.
  6. Una vez que el usuario hace clic en Send el bot, el mensaje se envía al canal.

Responder a la acción de envío inicial

Para habilitar este flujo, el módulo de tareas debe responder al composeExtension/submitAction mensaje inicial con una vista previa de la tarjeta que el bot enviará al canal. De esta forma, el usuario tendrá la oportunidad de comprobar la tarjeta antes de enviarla y también intentará instalar el bot en la conversación, si no está ya instalado.

protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionSubmitActionAsync(
  ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
  dynamic Data = JObject.Parse(action.Data.ToString());
  var response = new MessagingExtensionActionResponse
  {
    ComposeExtension = new MessagingExtensionResult
    {
      Type = "botMessagePreview",
      ActivityPreview = MessageFactory.Attachment(new Attachment
      {
        Content = new AdaptiveCard("1.0")
        {
          Body = new List<AdaptiveElement>()
          {
            new AdaptiveTextBlock() { Text = "FormField1 value was:", Size = AdaptiveTextSize.Large },
            new AdaptiveTextBlock() { Text = Data["FormField1"] as string }
          },
          Height = AdaptiveHeight.Auto,
          Actions = new List<AdaptiveAction>()
          {
            new AdaptiveSubmitAction
            {
              Type = AdaptiveSubmitAction.TypeName,
              Title = "Submit",
              Data = new JObject { { "submitLocation", "messagingExtensionFetchTask" } },
            },
          }
        },
        ContentType = AdaptiveCard.ContentType
      }) as Activity
    }
  };

  return response;
}

Los eventos de envío y edición de botMessagePreview

La extensión de mensajes ahora tendrá que responder a dos nuevas variedades de la composeExtension/submitAction llamada, donde value.botMessagePreviewAction = "send" y value.botMessagePreviewAction = "edit" .

protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionBotMessagePreviewEditAsync(
  ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
  //handle the event
}

protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionBotMessagePreviewSendAsync(
  ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
  //handle the event
}

Responder a la edición de botMessagePreview

Si el usuario decide editar la tarjeta antes de enviarla haciendo clic en el botón Editar , recibirá una composeExtension/submitAction llamada con el value.botMessagePreviewAction = edit . Por lo general, debe responder devolviendo el módulo de tarea que envió como respuesta a la composeExtension/fetchTask invocación inicial que inició la interacción. Esto permite al usuario iniciar el proceso volviendo a introducir la información original. También debe considerar la posibilidad de usar la información que ya tiene disponible para rellenar previamente el módulo de tareas, de modo que el usuario no haya rellenado toda la información desde cero.

Consulte responder al fetchTask evento inicial.

Responder a botMessagePreview envío

Una vez que el usuario hace clic en el botón Enviar , recibirá una composeExtension/submitAction llamada con value.botMessagePreviewAction = send . El servicio Web tendrá que crear y enviar un mensaje proactivo con la tarjeta adaptable a la conversación y también responder a la invocación.

protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionBotMessagePreviewSendAsync(
  ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
  var activityPreview = action.BotActivityPreview[0];
  var attachmentContent = activityPreview.Attachments[0].Content;
  var previewedCard = JsonConvert.DeserializeObject<AdaptiveCard>(attachmentContent.ToString(),
          new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
  
  previewedCard.Version = "1.0";

  var responseActivity = Activity.CreateMessageActivity();
  Attachment attachment = new Attachment()
  {
    ContentType = AdaptiveCard.ContentType,
    Content = previewedCard
  };
  responseActivity.Attachments.Add(attachment);
  
  // Attribute the message to the user on whose behalf the bot is posting
  responseActivity.ChannelData = new {
    OnBehalfOf = new []
    {
      new
      {
        ItemId = 0,
        MentionType = "person",
        Mri = turnContext.Activity.From.Id,
        DisplayName = turnContext.Activity.From.Name
      }  
    }
  };
  
  await turnContext.SendActivityAsync(responseActivity);

  return new MessagingExtensionActionResponse();
}

Atribución de usuario para mensajes de bots

En los escenarios en los que un bot envía mensajes en nombre de un usuario, el mensaje a ese usuario puede ayudar con la contratación y exhibir un flujo de interacción más natural. Esta característica le permite atribuir un mensaje de su bot a un usuario en cuyo nombre se envió.

En la imagen siguiente, a la izquierda se encuentra un mensaje de tarjeta enviado por un bot sin atribución de usuario y a la derecha es una tarjeta enviada por un bot con atribución de usuario.

Captura de pantalla

Para usar la atribución de usuarios en Microsoft Teams, debe agregar la OnBehalfOf entidad mencionar a ChannelData en su Activity carga que se envía a Microsoft Teams.

    OnBehalfOf = new []
    {
      new
      {
        ItemId = 0,
        MentionType = "person",
        Mri = turnContext.Activity.From.Id,
        DisplayName = turnContext.Activity.From.Name
      }  
    }

A continuación se muestra una descripción de las entidades de la OnBehalfOf matriz:

Detalles del OnBehalfOf esquema de entidad

Campo Tipo Descripción
itemId Entero Debe ser 0
mentionType Cadena Debe ser "persona"
mri Cadena Identificador de recursos de mensajes (resonancia magnética) de la persona en cuyo nombre se envía el mensaje. El nombre del remitente del mensaje aparecería como " <user> Via <bot name> ".
displayName Cadena Nombre de la persona. Se usa como reserva en caso de que la resolución de nombres de casos no esté disponible.

Siguientes pasos

Agregar un comando de búsqueda

Más información

Pruébelo en un inicio rápido: