Eventos de conversación en el bot de Teams

Importante

Los ejemplos de código de esta sección se basan en la versión 4.6 y versiones posteriores del SDK de Bot Framework. Si busca documentación para versiones anteriores, consulte la sección bots - v3 SDK en la carpeta SDK heredados de la documentación.

Al crear bots conversacionales para Microsoft Teams, puede trabajar con eventos de conversación. Microsoft Teams envía notificaciones al bot para los eventos que se suceden en ámbitos donde el bot está activo. Puede capturar estos eventos en el código y tomar medidas como las siguientes:

  • Desencadenar un mensaje de bienvenida cuando se añade el bot a un equipo;
  • Desencadenar un mensaje de bienvenida cuando se añade o quita un nuevo miembro del equipo;
  • Desencadenar una notificación cuando se crea, cambia el nombre o elimina un canal;
  • Desencadenar una notificación cuando a un usuario le gusta un mensaje de bot.
  • Identifique el canal predeterminado del bot a partir de la entrada del usuario (selección) durante la instalación.

Eventos de actualización de conversación

Puede usar eventos de actualización de conversación para proporcionar mejores notificaciones y acciones de bot eficaces.

Importante

  • Puede agregar nuevos eventos en cualquier momento y el bot comienza a recibirlos.
  • Debe diseñar el bot para recibir eventos inesperados.
  • Si usa el SDK de Bot Framework, el bot responde automáticamente con un 200 - OK a los eventos que elija no controlar.
  • Cuando un cliente de Azure Communication Services (ACS) se une o deja la reunión de Teams, no se desencadena ningún evento de actualización de conversación.

Un bot recibe un conversationUpdate evento en cualquiera de los casos siguientes:

  • Cuando el bot se agrega a una conversación.
  • Otros miembros se agregan o quitan de una conversación.
  • Los metadatos de conversación han cambiado.

El evento conversationUpdate se envía al bot cuando recibe información sobre las actualizaciones de suscripción de los equipos donde se ha agregado. También recibe una actualización cuando se ha agregado por primera vez, específicamente para conversaciones personales.

En la tabla siguiente se muestra una lista de los eventos de conversación actualizados de Teams con más detalles:

Acción realizada EventType Método llamado Descripción Ámbito
Canal creado channelCreated OnTeamsChannelCreatedAsync Se crea un canal. Equipo
Se cambió el nombre del canal channelRenamed OnTeamsChannelRenamedAsync Se cambia el nombre de un canal. Equipo
Canal eliminado channelDeleted OnTeamsChannelDeletedAsync Se elimina un canal. Equipo
Canal restaurado channelRestored OnTeamsChannelRestoredAsync Se restaura un canal. Equipo
Miembros agregados membersAdded OnTeamsMembersAddedAsync Se agrega un miembro. Todo
Miembros eliminados membersRemoved OnTeamsMembersRemovedAsync Se elimina un miembro. todas
Se cambió el nombre del equipo teamRenamed OnTeamsTeamRenamedAsync Se cambia el nombre de un equipo. Equipo
Equipo eliminado teamDeleted OnTeamsTeamDeletedAsync Se elimina un equipo. Equipo
Equipo archivado teamArchived OnTeamsTeamArchivedAsync Se archiva un equipo. Equipo
Equipo desarchivado teamUnarchived OnTeamsTeamUnarchivedAsync Se desarchiva un equipo. Equipo
Equipo restaurado teamRestored OnTeamsTeamRestoredAsync Se restaura un equipo Equipo

Canal creado

El channelCreated evento se envía al bot cada vez que se crea un nuevo canal en un equipo donde está instalado el bot.

En el código siguiente se muestra un ejemplo de evento creado por el canal:

protected override async Task OnTeamsChannelCreatedAsync(ChannelInfo channelInfo, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
    var heroCard = new HeroCard(text: $"{channelInfo.Name} is the Channel created");
    // Sends an activity to the sender of the incoming activity.
    await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}

Se cambió el nombre del canal

El channelRenamed evento se envía al bot cada vez que se cambia el nombre de un canal en un equipo donde está instalado el bot.

En el código siguiente se muestra un ejemplo de evento con el nombre del canal:

protected override async Task OnTeamsChannelRenamedAsync(ChannelInfo channelInfo, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
    var heroCard = new HeroCard(text: $"{channelInfo.Name} is the new Channel name");
    // Sends an activity to the sender of the incoming activity.
    await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}

Canal eliminado

El channelDeleted evento se envía al bot cada vez que se elimina un canal en un equipo donde está instalado el bot.

En el código siguiente se muestra un ejemplo de evento eliminado de canal:

protected override async Task OnTeamsChannelDeletedAsync(ChannelInfo channelInfo, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
    var heroCard = new HeroCard(text: $"{channelInfo.Name} is the Channel deleted");
    await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}

Canal restaurado

El channelRestored evento se envía al bot, siempre que se restaure un canal que se eliminó anteriormente en un equipo donde el bot ya está instalado.

En el código siguiente se muestra un ejemplo de evento restaurado por el canal:

protected override async Task OnTeamsChannelRestoredAsync(ChannelInfo channelInfo, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
    var heroCard = new HeroCard(text: $"{channelInfo.Name} is the Channel restored.");
    await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}

Miembros agregados

Se envía un evento agregado de miembro al bot en los siguientes escenarios:

  1. Cuando el bot, en sí mismo, se instala y se agrega a una conversación

    En el contexto del equipo, el conversation.id de la actividad se establece en el id del canal seleccionado por el usuario durante la instalación de la aplicación o en el canal donde se instaló el bot.

  2. Cuando se agrega un usuario a una conversación en la que está instalado el bot

    Los identificadores de usuario recibidos en la carga del evento son únicos para el bot y se pueden almacenar en caché para su uso futuro, como la mensajería directa de un usuario.

La actividad eventType agregada de miembro se establece en teamMemberAdded cuando el evento se envía desde un contexto de equipo. Para determinar si el nuevo miembro agregado era el propio bot o un usuario, compruebe el Activity objeto de turnContext. Si la MembersAdded lista contiene un objeto donde id es el mismo que el id campo del Recipient objeto, el miembro agregado es el bot; de lo contrario, es un usuario. El bot tiene id el formato 28:<MicrosoftAppId>.

Sugerencia

Use el InstallationUpdate evento para determinar cuándo se agrega o quita el bot de una conversación.

En el código siguiente se muestra un ejemplo de evento agregado de miembros del equipo:

protected override async Task OnTeamsMembersAddedAsync(IList<TeamsChannelAccount> teamsMembersAdded , TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
    foreach (TeamsChannelAccount member in teamsMembersAdded)
    {
        if (member.Id == turnContext.Activity.Recipient.Id)
        {
            // Send a message to introduce the bot to the team.
            var heroCard = new HeroCard(text: $"The {member.Name} bot has joined {teamInfo.Name}");
            // Sends an activity to the sender of the incoming activity.
            await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
        }
        else
        {
            var heroCard = new HeroCard(text: $"{member.Name} joined {teamInfo.Name}");
            // Sends an activity to the sender of the incoming activity.
            await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
        }
    }
}

Miembros eliminados

Se envía un evento quitado de miembro al bot en los siguientes escenarios:

  1. Cuando el bot, en sí mismo, se desinstala y se quita de una conversación.
  2. Cuando se quita un usuario de una conversación en la que está instalado el bot.

La actividad eventType quitada de miembro se establece en teamMemberRemoved cuando el evento se envía desde un contexto de equipo. Para determinar si el nuevo miembro eliminado era el propio bot o un usuario, compruebe el objeto Activity de turnContext. Si la MembersRemoved lista contiene un objeto donde id es el mismo que el id campo del Recipient objeto, el miembro agregado es el bot; de lo contrario, es un usuario. El identificador del bot tiene el formato 28:<MicrosoftAppId>.

Nota:

Cuando un usuario se elimina permanentemente de un inquilino, se desencadena el evento membersRemoved conversationUpdate.

En el código siguiente se muestra un ejemplo de evento quitado de miembros del equipo:

protected override async Task OnTeamsMembersRemovedAsync(IList<ChannelAccount> membersRemoved, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
    foreach (TeamsChannelAccount member in membersRemoved)
    {
        if (member.Id == turnContext.Activity.Recipient.Id)
        {
            // The bot was removed.
            // You should clear any cached data you have for this team.
        }
        else
        {
            var heroCard = new HeroCard(text: $"{member.Name} was removed from {teamInfo.Name}");
            // Sends an activity to the sender of the incoming activity.
            await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
        }
    }
}

Se cambió el nombre del equipo

El bot recibe una notificación cuando se cambia el nombre del equipo. Recibe un evento conversationUpdate con eventType.teamRenamed en el objeto channelData.

En el código siguiente se muestra un ejemplo de evento cuyo nombre ha cambiado el equipo:

protected override async Task OnTeamsTeamRenamedAsync(TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
    var heroCard = new HeroCard(text: $"{teamInfo.Name} is the new Team name");
    // Sends an activity to the sender of the incoming activity.
    await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}

Equipo eliminado

El bot recibe una notificación cuando se elimina el equipo. Recibe un evento conversationUpdate con eventType.teamDeleted en el objeto channelData.

En el código siguiente se muestra un ejemplo de evento eliminado por el equipo:

protected override async Task OnTeamsTeamDeletedAsync(TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
    // Handle delete event.
}

Equipo restaurado

El bot recibe una notificación cuando se restaura un equipo después de eliminarse. Recibe un evento conversationUpdate con eventType.teamrestored en el objeto channelData.

En el código siguiente se muestra un ejemplo de evento restaurado por el equipo:

protected override async Task OnTeamsTeamrestoredAsync(TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
    var heroCard = new HeroCard(text: $"{teamInfo.Name} is the team name");
    // Sends an activity to the sender of the incoming activity.
    await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}

Equipo archivado

El bot recibe una notificación cuando el equipo está instalado y archivado. Recibe un evento conversationUpdate con eventType.teamarchived en el objeto channelData.

En el código siguiente se muestra un ejemplo de evento archivado por el equipo:

protected override async Task OnTeamsTeamArchivedAsync(TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
    var heroCard = new HeroCard(text: $"{teamInfo.Name} is the team name");
     // Sends an activity to the sender of the incoming activity.
    await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}

Equipo desarchivado

El bot recibe una notificación cuando el equipo está instalado y desarchivo. Recibe un evento conversationUpdate con eventType.teamUnarchived en el objeto channelData.

En el código siguiente se muestra un ejemplo de evento desarchivado de equipo:

protected override async Task OnTeamsTeamUnarchivedAsync(TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
    var heroCard = new HeroCard(text: $"{teamInfo.Name} is the team name");
    // Sends an activity to the sender of the incoming activity.
    await turnContext.SendActivityAsync(MessageFactory.Attachment(heroCard.ToAttachment()), cancellationToken);
}

Ahora que ha trabajado con los eventos de actualización de conversación, puede comprender los eventos de reacción del mensaje que se producen para diferentes reacciones a un mensaje.

Eventos de reacción de mensajes

El messageReaction evento se envía cuando un usuario agrega o quita las reacciones a un mensaje que envió el bot. replyToId contiene el identificador del mensaje y Type es el tipo de reacción en formato de texto. Los tipos de reacciones incluyen enfado, corazón, risa, me gusta, triste y sorprendido. Este evento no contiene el contenido del mensaje original. Si el procesamiento de reacciones a los mensajes es importante para el bot, debe almacenarlos cuando los envíe. En la tabla siguiente se proporciona más información sobre el tipo de evento y los objetos de carga:

EventType Objeto de carga Descripción Ámbito
messageReaction reactionsAdded Reacciones agregadas al mensaje del bot. Todo
messageReaction reactionsRemoved Reacciones eliminadas del mensaje del bot. Todo

Reacciones agregadas al mensaje del bot

En el código siguiente se muestra un ejemplo de reacciones a un mensaje de bot:

protected override async Task OnReactionsAddedAsync(IList<MessageReaction> messageReactions, ITurnContext<IMessageReactionActivity> turnContext, CancellationToken cancellationToken)
{
    foreach (var reaction in messageReactions)
    {
      var newReaction = $"You reacted with '{reaction.Type}' to the following message: '{turnContext.Activity.ReplyToId}'";
      var replyActivity = MessageFactory.Text(newReaction);
      // Sends an activity to the sender of the incoming activity.
      var resourceResponse = await turnContext.SendActivityAsync(replyActivity, cancellationToken);
    }
}

Reacciones eliminadas del mensaje del bot

En el código siguiente se muestra un ejemplo de reacciones eliminadas del mensaje del bot:

protected override async Task OnReactionsRemovedAsync(IList<MessageReaction> messageReactions, ITurnContext<IMessageReactionActivity> turnContext, CancellationToken cancellationToken)
{
    foreach (var reaction in messageReactions)
    {
      var newReaction = $"You removed the reaction '{reaction.Type}' from the following message: '{turnContext.Activity.ReplyToId}'";

      var replyActivity = MessageFactory.Text(newReaction);
      // Sends an activity to the sender of the incoming activity.
      var resourceResponse = await turnContext.SendActivityAsync(replyActivity, cancellationToken);
    }
}

Evento de actualización de instalación

El bot recibe un evento installationUpdate al instalar un bot en un subproceso de conversación. La desinstalación del bot desde el subproceso también desencadena el evento. Al instalar un bot, el campo de acción del evento se establece en agregar y, cuando se desinstala el bot, el campo de acción se establece en remove.

Nota:

Al actualizar una aplicación, el bot recibe el installationUpdate evento solo para agregar o quitar un bot del manifiesto. En todos los demás casos, el installationUpdate evento no se desencadena. El campo de acción se establece en agregar actualización si agrega un bot o eliminar actualización si quita un bot.

Instalar evento de actualización

Use el evento installationUpdate para enviar un mensaje de introducción desde el bot durante la instalación. Este evento le ayuda a cumplir sus requisitos de privacidad y retención de datos. También puede limpiar y eliminar datos de usuario o subproceso cuando se desinstala el bot.

De forma similar al conversationUpdate evento que se envía cuando se agrega el bot a un equipo, el conversation.id del installationUpdate evento se establece en el identificador del canal seleccionado por un usuario durante la instalación de la aplicación o en el canal donde se produjo la instalación. El identificador representa el canal donde el usuario pretende que el bot funcione y el bot debe usarlo al enviar un mensaje de bienvenida. Para escenarios en los que se requiere explícitamente el identificador del canal General, puede obtenerlo desde team.id en channelData.

En este ejemplo, el conversation.id de las conversationUpdate actividades y installationUpdate se establecerá en el identificador del canal de respuesta en el equipo de demostración de Daves.

Creación de un canal seleccionado

Nota:

El identificador de canal seleccionado solo se establece en agregarinstallationUpdate eventos que se envían cuando se instala una aplicación en un equipo.

protected override async Task OnInstallationUpdateActivityAsync(ITurnContext<IInstallationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
    var activity = turnContext.Activity;
    if (string.Equals(activity.Action, "Add", StringComparison.InvariantCultureIgnoreCase))
    {
        // TO:DO Installation workflow.
    }
    else
    {
        // TO:DO Uninstallation workflow.
    }
    return;
}

También puede usar un controlador dedicado para agregar o quitar escenarios como método alternativo para capturar un evento.

protected override async Task OnInstallationUpdateAddAsync(ITurnContext<IInstallationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
    // TO:DO Installation workflow return;
}

Comportamiento de desinstalación de la aplicación personal con bot

Al desinstalar una aplicación, también se desinstala el bot. Cuando un usuario envía un mensaje a la aplicación, recibe un código de respuesta 403. El bot recibe un código de respuesta 403 para los nuevos mensajes publicados por el bot. El comportamiento posterior a la desinstalación de los bots en el ámbito personal con los ámbitos Teams y groupChat ahora está alineado. No puede enviar ni recibir mensajes después de desinstalar una aplicación.

Desinstalar código de respuesta

Control de eventos para eventos de instalación y desinstalación

Cuando se usan estos eventos de instalación y desinstalación, hay algunas instancias en las que los bots dan excepciones en la recepción de eventos inesperados de Teams, que se producen en los casos siguientes:

  • El bot se compila sin el SDK de Microsoft Bot Framework y, como resultado, el bot proporciona una excepción al recibir un evento inesperado.
  • Compile el bot con el SDK de Microsoft Bot Framework y seleccione modificar el comportamiento del evento predeterminado reemplazando el identificador de eventos base.

Es importante saber que los nuevos eventos se pueden agregar en cualquier momento en el futuro y que el bot comienza a recibirlos. Por lo tanto, debe diseñar para la posibilidad de recibir eventos inesperados. Si usa el SDK de Bot Framework, el bot responde automáticamente con un valor 200 : correcto para los eventos que no elija controlar.

Control de errores en eventos de conversación

Cuando un bot encuentra un error al controlar diferentes eventos o actividades, no envíe mensajes que no tengan ningún contexto significativo a la conversación, como se muestra en la captura de pantalla siguiente:

Captura de pantalla que muestra la respuesta del mensaje de error en la conversación del bot.

En la fase de desarrollo, siempre resulta útil enviar mensajes significativos en las conversaciones, lo que proporciona detalles adicionales sobre un error específico para una mejor depuración. Sin embargo, en el entorno de producción, debe registrar los errores o eventos en Aplicación de Azure Insights. Para obtener más información, consulte Adición de telemetría al bot.

Ejemplo de código

Nombre de ejemplo Descripción .NET Node.js Python Manifiesto
Bot conversacional En este ejemplo se muestra cómo usar diferentes eventos de conversación de bot disponibles en Bot Framework v4 para el ámbito personal y de teams. View View View View

Paso siguiente

Vea también