Eventos de conversa em seu bot do Teams

Importante

Os exemplos de código nesta seção são baseados na versão 4.6 e versões posteriores do SDK do Bot Framework. Se você estiver procurando documentação para versões anteriores, consulte a seção bots – v3 SDK na pasta SDKs Herdados da documentação.

Ao criar seus bots de conversa do Microsoft Teams, você poderá trabalhar com eventos de conversa. O Teams envia notificações ao bot de eventos de conversa que ocorrem em escopos onde o bot está ativo. Você poderá capturar esses eventos em seu código e executar as seguintes ações:

  • Dispare uma mensagem de boas-vindas quando seu bot for adicionado a uma equipe.
  • Dispare uma mensagem de boas-vindas quando um novo membro da equipe for adicionado ou removido.
  • Dispare uma notificação quando um canal for criado, renomeado ou excluído.
  • Dispare uma notificação quando uma mensagem de bot for curtida por um usuário.
  • Identifique o canal padrão do bot na entrada do usuário (seleção) durante a instalação.

Eventos de atualização de conversa

Você pode usar eventos de atualização de conversa para fornecer notificações melhores e ações efetivas de bot.

Importante

  • Você poderá adicionar novos eventos a qualquer momento e seu bot começará a recebê-los.
  • Você deve projetar seu bot para receber eventos inesperados.
  • Se estiver usando o SDK do Bot Framework, o bot responderá automaticamente com um 200 - OK a todos os eventos que você escolher não manipular.
  • Quando um cliente de Serviços de Comunicação do Azure (ACS) entra ou sai da reunião do Teams, nenhum evento de atualização de conversa é disparado.

Um bot receberá um evento conversationUpdate em um dos seguintes casos:

  • Quando o bot é adicionado a uma conversa.
  • Outros membros são adicionados ou removidos de uma conversa.
  • Os metadados da conversa foram alterados.

O evento conversationUpdate é enviado ao seu bot quando ele recebe informações sobre atualizações de membros para as equipes onde foi adicionado. Ele também receberá uma atualização quando for adicionado pela primeira vez para conversas pessoais.

A tabela a seguir mostra uma lista de eventos de atualização de conversa do Teams com mais detalhes:

Ação realizada EventType Método chamado Descrição Escopo
Canal criado channelCreated OnTeamsChannelCreatedAsync Um canal é criado. Equipe
Canal renomeado channelRenamed OnTeamsChannelRenamedAsync Um canal é renomeado. Equipe
Canal excluído channelDeleted OnTeamsChannelDeletedAsync Um canal é excluído. Equipe
Canal restaurado channelRestored OnTeamsChannelRestoredAsync Um canal é restaurado. Equipe
Membros adicionados membersAdded OnTeamsMembersAddedAsync Um membro é adicionado. Tudo
Membros removidos membersRemoved OnTeamsMembersRemovedAsync Um membro é removido. Todos
Equipe renomeada teamRenamed OnTeamsTeamRenamedAsync Uma equipe é renomeada. Equipe
Equipe excluída teamDeleted OnTeamsTeamDeletedAsync Uma equipe é excluída. Equipe
Equipe arquivada teamArchived OnTeamsTeamArchivedAsync Uma equipe é arquivada. Equipe
Equipe desarquivada teamUnarchived OnTeamsTeamUnarchivedAsync Uma equipe é desarquivada. Equipe
Equipe restaurada teamRestored OnTeamsTeamRestoredAsync Uma equipe é restaurada Equipe

Canal criado

O channelCreated evento é enviado para o bot sempre que um novo canal é criado em uma equipe em que o bot está instalado.

O código a seguir mostra um exemplo do evento Canal criado:

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);
}

Canal renomeado

O channelRenamed evento é enviado para o bot sempre que um canal é renomeado em uma equipe em que o bot está instalado.

O código a seguir mostra um exemplo do evento Canal renomeado:

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 excluído

O channelDeleted evento é enviado para o bot sempre que um canal é excluído em uma equipe em que o bot está instalado.

O código a seguir mostra um exemplo do evento Canal excluído:

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

O channelRestored evento é enviado para o bot, sempre que um canal que foi excluído anteriormente é restaurado em uma equipe em que o bot já está instalado.

O código a seguir mostra um exemplo do evento Canal restaurado:

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);
}

Membros adicionados

Um evento adicionado ao membro é enviado ao bot nos seguintes cenários:

  1. Quando o bot, em si, é instalado e adicionado a uma conversa

    No contexto de equipe, o conversation.id da atividade é definido como o id do canal selecionado pelo usuário durante a instalação do aplicativo ou o canal em que o bot foi instalado.

  2. Quando um usuário é adicionado a uma conversa em que o bot é instalado

    As IDs de usuário recebidas no conteúdo do evento são exclusivas do bot e podem ser armazenadas em cache para uso futuro, como enviar mensagens diretas a um usuário.

A atividade eventType adicionada ao membro é definida como teamMemberAdded quando o evento é enviado de um contexto de equipe. Para determinar se o novo membro adicionado era o próprio bot ou um usuário, marcar o Activity objeto do turnContext. Se a MembersAdded lista contiver um objeto em que id é o mesmo que o id campo do Recipient objeto, o membro adicionado será o bot, caso contrário, é um usuário. O bot é id formatado como 28:<MicrosoftAppId>.

Dica

Use o InstallationUpdate evento para determinar quando o bot é adicionado ou removido de uma conversa.

O código a seguir mostra um exemplo do evento Membros da equipe adicionados:

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);
        }
    }
}

Membros removidos

Um evento removido por membro é enviado ao bot nos seguintes cenários:

  1. Quando o bot, em si, é desinstalado e removido de uma conversa.
  2. Quando um usuário é removido de uma conversa em que o bot é instalado.

A atividade eventType removida do membro é definida como teamMemberRemoved quando o evento é enviado de um contexto de equipe. Para determinar se o novo membro removido foi o próprio bot ou um usuário, verifique o objeto Activity do turnContext. Se a MembersRemoved lista contiver um objeto em que id é o mesmo que o id campo do Recipient objeto, o membro adicionado será o bot, caso contrário, é um usuário. A ID do bot é formatada como 28:<MicrosoftAppId>.

Observação

Quando um usuário for excluído permanentemente de um locatário, o evento membersRemoved conversationUpdate será disparado.

O código a seguir mostra um exemplo do evento Membros da equipe removidos:

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);
        }
    }
}

Equipe renomeada

Seu bot será notificado quando a equipe for renomeada. Ele receberá um evento conversationUpdate com eventType.teamRenamed no objeto channelData.

O código a seguir mostra um exemplo do evento Equipe renomeada:

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);
}

Equipe excluída

O bot recebe uma notificação quando a equipe é excluída. Ele receberá um evento conversationUpdate com eventType.teamDeleted no objeto channelData.

O código a seguir mostra um exemplo do evento Equipe excluída:

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

Equipe restaurada

O bot receberá uma notificação quando uma equipe for restaurada após ser excluída. Ele receberá um evento conversationUpdate com eventType.teamrestored no objeto channelData.

O código a seguir mostra um exemplo do evento Equipe restaurada:

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);
}

Equipe arquivada

O bot receberá uma notificação quando a equipe for instalada e arquivada. Ele receberá um evento conversationUpdate com eventType.teamarchived no objeto channelData.

O código a seguir mostra um exemplo do evento Equipe arquivada:

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);
}

Equipe desarquivada

O bot receberá uma notificação quando a equipe for instalada e desarquivada. Ele receberá um evento conversationUpdate com eventType.teamUnarchived no objeto channelData.

O código a seguir mostra um exemplo do evento Equipe desarquivada:

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);
}

Agora que você trabalhou com os eventos de atualização de conversa, você pode entender os eventos de reação da mensagem que ocorrem para diferentes reações a uma mensagem.

Eventos de reação de mensagem

O messageReaction evento é enviado quando um usuário adiciona ou remove as reações a uma mensagem, que foi enviada pelo bot. O replyToId contém a ID da mensagem e o Type é o tipo de reação no formato de texto. Os tipos de reações incluem irritado, coração, gargalhada, curtir, triste e surpreso. Este evento não contém o conteúdo da mensagem original. Se o processamento de reações às suas mensagens for importante para o bot, você deverá armazenar as mensagens ao enviá-las. A tabela a seguir fornece mais informações sobre o tipo de evento e os objetos do conteúdo:

EventType Objeto do conteúdo Descrição Escopo
messageReaction reactionsAdded Reações adicionadas à mensagem do bot. Tudo
messageReaction reactionsRemoved Reações removidas da mensagem do bot. Tudo

Reações adicionadas à mensagem do bot

O código a seguir mostra um exemplo de reações a uma mensagem do 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);
    }
}

Reações removidas da mensagem do bot

O código a seguir mostra um exemplo de reações removidas da mensagem do 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 atualização de instalação

O bot receberá um evento installationUpdate quando você instalar um bot em uma thread da conversa. A desinstalação do bot da thread também disparará o evento. Ao instalar um bot, o campo ação no evento será definido como adicionar, e quando o bot for desinstalado, o campo ação será definido como remover.

Observação

Quando você atualiza um aplicativo, o bot recebe o installationUpdate evento apenas para adicionar ou remover um bot do manifesto. Para todos os outros casos, o installationUpdate evento não é disparado. O campo ação será definido como add-upgrade se você adicionar um bot ou remove-upgrade se você remover um bot.

Evento Instalar atualização

Use o evento installationUpdate para enviar uma mensagem introdutória do bot na instalação. Esse evento ajuda você a atender aos seus requisitos de privacidade e retenção. Você também poderá limpar e excluir dados de usuário ou thread quando o bot for desinstalado.

Semelhante ao evento enviado quando o conversationUpdate bot é adicionado a uma equipe, o conversation.id do installationUpdate evento é definido como a ID do canal selecionado por um usuário durante a instalação do aplicativo ou o canal em que a instalação ocorreu. A id representa o canal em que o usuário pretende que o bot opere e deve ser usado pelo bot ao enviar uma mensagem de boas-vindas. Para cenários em que a ID do canal Geral é explicitamente necessária, você pode obtê-la no team.idchannelData.

Neste exemplo, as conversation.idconversationUpdate atividades e installationUpdate serão definidas como a ID do canal Response na equipe de demonstração do Daves.

Criar um canal selecionado

Observação

A ID do canal selecionada só é definida em installationUpdateadicionar eventos enviados quando um aplicativo é instalado em uma equipe.

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;
}

Você também poderá usar um manipulador dedicado para cenários adicionar ou remover como um método alternativo para capturar um evento.

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

Comportamento de desinstalação do aplicativo pessoal com o bot

Quando você desinstalar um aplicativo, o bot também será desinstalado. Quando um usuário enviar uma mensagem para seu aplicativo, ele receberá um código de resposta 403. Seu bot receberá um código de resposta 403 para novas mensagens postadas pelo bot. O comportamento pós-desinstalação de bots no escopo pessoal com os escopos do Teams e do groupChat agora está alinhado. Você não pode enviar ou receber mensagens depois que um aplicativo foi desinstalado.

Código de resposta de desinstalação

Manipulação de eventos para instalar e desinstalar eventos

Quando você usa esses eventos de instalação e desinstalação, há algumas instâncias em que os bots dão exceções ao recebimento de eventos inesperados do Teams, que ocorrem nos seguintes casos:

  • Você projeta seu bot sem o SDK do Microsoft Bot Framework e, como resultado, o bot fornece uma exceção ao receber um evento inesperado.
  • Você projeta seu bot com o SDK do Microsoft Bot Framework e seleciona alterar o comportamento padrão do evento substituindo o identificador de evento base.

É importante saber que novos eventos podem ser adicionados a qualquer momento no futuro e seu bot começa a recebê-los. Portanto, você deve projetar considerando a possibilidade de receber eventos inesperados. Se você estiver usando o SDK do Bot Framework, o bot responderá automaticamente com um 200 – OK a todos os eventos que você não optar por manipular.

Manipulação de erros em eventos de conversa

Quando um bot encontra um erro ao lidar com diferentes eventos ou atividades, não envie mensagens que não tenham nenhum contexto significativo para a conversa, conforme mostrado na captura de tela a seguir:

A captura de tela mostra a resposta da mensagem de erro na conversa do bot.

Na fase de desenvolvimento, é sempre útil enviar mensagens significativas em conversas, que fornecem detalhes adicionais sobre um erro específico para melhor depuração. No entanto, no ambiente de produção, você deve registrar os erros ou eventos para Aplicativo Azure Insights. Para obter mais informações, consulte Adicionar telemetria ao bot.

Exemplo de código

Nome de exemplo Descrição .NET Node.js Python Manifesto
Bot de conversa Este exemplo mostra como usar diferentes eventos de conversa de bot disponíveis no Bot Framework v4 para escopo pessoal e de equipes. View View View Exibir

Próxima etapa

Confira também