Événements de conversation dans votre robot Teams

Importante

Les exemples de code de cette section sont basés sur la version 4.6 et les versions ultérieures du Kit de développement logiciel (SDK) Bot Framework. Si vous recherchez de la documentation pour les versions antérieures, consultez la section bots - Kit de développement logiciel (SDK) v3 dans le dossier Kits de développement logiciel (SDK) hérités de la documentation.

Lorsque vous créez vos bots conversationnels pour Microsoft Teams, vous pouvez utiliser des événements de conversation. Teams envoie des notifications à votre bot pour les événements de conversation qui se produisent dans les étendues où votre bot est actif. Vous pouvez capturer ces événements dans votre code et effectuer les actions suivantes :

  • Déclenchez un message de bienvenue lorsque votre bot est ajouté à une équipe.
  • Déclenchez un message de bienvenue lorsqu’un nouveau membre d’équipe est ajouté ou supprimé.
  • Déclenchez une notification lorsqu’un canal est créé, renommé ou supprimé.
  • Déclenchez une notification lorsqu’un message de bot est aimé par un utilisateur.
  • Identifiez le canal par défaut de votre bot à partir de l’entrée utilisateur (sélection) lors de l’installation.

La vidéo suivante montre comment un bot de conversation peut améliorer l’engagement client grâce à des interactions fluides et intelligentes :


Événements de mise à jour de conversation

Vous pouvez utiliser des événements de mise à jour de conversation pour fournir de meilleures notifications et des actions de bot efficaces.

Importante

  • Vous pouvez ajouter de nouveaux événements à tout moment et votre bot commence à les recevoir.
  • Vous devez concevoir votre bot pour recevoir des événements inattendus.
  • Si vous utilisez le SDK Bot Framework, votre bot répond automatiquement avec un 200 - OK à tous les événements que vous choisissez de ne pas gérer.
  • Lorsqu’un client Azure Communication Services (ACS) rejoint ou quitte la réunion Teams, aucun événement de mise à jour de conversation n’est déclenché.

Un bot reçoit un événement conversationUpdate dans l’un des cas suivants :

  • Lorsque le bot est ajouté à une conversation.
  • D’autres membres sont ajoutés ou supprimés d’une conversation.
  • Les métadonnées de conversation ont changé.

L’événement conversationUpdate est envoyé à votre robot lorsqu’il reçoit des informations sur les mises à jour d’appartenance pour les équipes dans lesquelles il a été ajouté. Il reçoit également une mise à jour lorsqu’elle a été ajoutée pour la première fois pour les conversations personnelles.

Le tableau suivant affiche une liste des événements de mise à jour de conversation Teams avec plus de détails :

Action exécutée EventType Méthode appelée Description Portée
Chaîne créée channelCreated OnTeamsChannelCreatedAsync Un canal est créé. Équipe
Canal renommé channelRenamed OnTeamsChannelRenamedAsync Un canal est renommé. Équipe
Canal supprimé ChannelDeleted OnTeamsChannelDeletedAsync Un canal est supprimé. Équipe
Canal restauré channelRestored OnTeamsChannelRestoredAsync Un canal est restauré. Équipe
Membres ajoutés membersAdded OnTeamsMembersAddedAsync Un membre est ajouté. Tous
Membres supprimés membersRemoved OnTeamsMembersRemovedAsync Un membre est supprimé. tous
Équipe renommée teamRenamed OnTeamsTeamRenamedAsync Une équipe est renommée. Équipe
Équipe supprimée TeamDeleted OnTeamsTeamDeletedAsync Une équipe est supprimée. Équipe
Équipe archivée teamArchived OnTeamsTeamArchivedAsync Une équipe est archivée. Équipe
Équipe non archivée teamUnarchived OnTeamsTeamUnarchivedAsync Une équipe n’est pasarchived. Équipe
Équipe restaurée teamRestored OnTeamsTeamRestoredAsync Une équipe est restaurée Équipe

Chaîne créée

L’événement channelCreated est envoyé à votre bot chaque fois qu’un nouveau canal est créé dans une équipe où votre bot est installé.

Le code suivant montre un exemple d’événement créé par un 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);
}

Canal renommé

L’événement channelRenamed est envoyé à votre bot chaque fois qu’un canal est renommé dans une équipe où votre bot est installé.

Le code suivant montre un exemple d’événement renommé de 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 supprimé

L’événement channelDeleted est envoyé à votre bot, chaque fois qu’un canal est supprimé dans une équipe où votre bot est installé.

Le code suivant montre un exemple d’événement de suppression 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 restauré

L’événement channelRestored est envoyé à votre bot, chaque fois qu’un canal précédemment supprimé est restauré dans une équipe où votre bot est déjà installé.

Le code suivant montre un exemple d’événement de restauration de 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);
}

Membres ajoutés

Un événement de membre ajouté est envoyé à votre bot dans les scénarios suivants :

  1. Lorsque le bot, lui-même, est installé et ajouté à une conversation

    Dans le contexte de l’équipe, le conversation.id de l’activité est défini sur le id du canal sélectionné par l’utilisateur lors de l’installation de l’application ou sur le canal sur lequel le bot a été installé.

  2. Lorsqu’un utilisateur est ajouté à une conversation où le bot est installé

    Les ID d’utilisateur reçus dans la charge utile d’événement sont propres au bot et peuvent être mis en cache pour une utilisation ultérieure, par exemple pour envoyer directement un message à un utilisateur.

L’activité eventType ajoutée au membre est définie sur teamMemberAdded lorsque l’événement est envoyé à partir d’un contexte d’équipe. Pour déterminer si le nouveau membre ajouté était le bot lui-même ou un utilisateur, case activée l’objet Activity du turnContext. Si la MembersAdded liste contient un objet où id est identique au id champ de l’objet Recipient , le membre ajouté est le bot, sinon il s’agit d’un utilisateur. Le du id bot est au 28:<MicrosoftAppId>format .

Conseil

Utilisez l’événementInstallationUpdate pour déterminer quand votre bot est ajouté ou supprimé d’une conversation.

Le code suivant montre un exemple d’événement ajouté par les membres de l’équipe :

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

Membres supprimés

Un événement de membre supprimé est envoyé à votre bot dans les scénarios suivants :

  1. Lorsque le bot, lui-même, est désinstallé et supprimé d’une conversation.
  2. Lorsqu’un utilisateur est supprimé d’une conversation où le bot est installé.

L’activité eventType supprimée du membre est définie sur teamMemberRemoved lorsque l’événement est envoyé à partir d’un contexte d’équipe. Pour déterminer si le nouveau membre supprimé était le bot lui-même ou un utilisateur, vérifiez l’objet Activity du turnContext. Si la MembersRemoved liste contient un objet où id est identique au id champ de l’objet Recipient , le membre ajouté est le bot, sinon il s’agit d’un utilisateur. L’ID du bot est au 28:<MicrosoftAppId>format .

Remarque

Lorsqu’un utilisateur est définitivement supprimé d’un locataire, membersRemoved conversationUpdate événement est déclenché.

Le code suivant montre un exemple d’événement de suppression des membres de l’équipe :

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

Équipe renommée

Votre bot est averti lorsque l’équipe est renommée. Il reçoit un événement de conversationUpdate avec eventType.teamRenamed dans l’objet channelData .

Le code suivant montre un exemple d’événement renommé par l’équipe :

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

Équipe supprimée

Le bot reçoit une notification lorsque l’équipe est supprimée. Il reçoit un conversationUpdate événement avec eventType.teamDeleted l’objet channelData .

Le code suivant montre un exemple d’événement supprimé par l’équipe :

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

Équipe restaurée

Le bot reçoit une notification lorsqu’une équipe est restaurée après sa suppression. Il reçoit un événement de conversationUpdate avec eventType.teamrestored dans l’objet channelData .

Le code suivant montre un exemple d’événement restauré par l’équipe :

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

Équipe archivée

Le bot reçoit une notification lorsque l’équipe est installée et archivée. Il reçoit un événement de conversationUpdate avec eventType.teamarchived dans l’objet channelData .

Le code suivant montre un exemple d’événement archivé d’équipe :

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

Équipe non archivée

Le bot reçoit une notification lorsque l’équipe est installée et non archivée. Il reçoit un événement de conversationUpdate avec eventType.teamUnarchived dans l’objet channelData .

Le code suivant montre un exemple d’événement non archivé d’équipe :

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

Maintenant que vous avez travaillé avec les événements de mise à jour de conversation, vous pouvez comprendre les événements de réaction de message qui se produisent pour différentes réactions à un message.

Événements de réaction aux messages

L’événement messageReaction est envoyé lorsqu’un utilisateur ajoute ou supprime des réactions à un message envoyé par votre bot. Le replyToId contient l’ID du message, et le Type est le type de réaction au format texte. Les types de réactions sont les suivants : en colère, cœur, rire, genre, triste et surprise. Cet événement ne contient pas le contenu du message d’origine. Si le traitement des réactions à vos messages est important pour votre bot, vous devez stocker les messages lorsque vous les envoyez. Le tableau suivant fournit plus d’informations sur le type d’événement et les objets de charge utile :

EventType Objet de charge utile Description Portée
messageReaction reactionsAdded Réactions ajoutées au message du bot. Tous
messageReaction reactionsRemoved Réactions supprimées du message du bot. Tous

Réactions ajoutées au message du bot

Le code suivant montre un exemple de réactions à un message 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);
    }
}

Réactions supprimées du message du bot

Le code suivant montre un exemple de réactions supprimées du message du 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);
    }
}

Événement de mise à jour d’installation

Le bot reçoit un événement installationUpdate lorsque vous installez un bot sur un thread de conversation. La désinstallation du bot du thread déclenche également l’événement. Lors de l’installation d’un bot, le champ d’action de l’événement est défini pour être ajouté et, lorsque le bot est désinstallé, le champ action est défini pour être supprimé.

Remarque

Lorsque vous mettez à niveau une application, le bot reçoit l’événement installationUpdate uniquement pour ajouter ou supprimer un bot du manifeste. Dans tous les autres cas, l’événement installationUpdate n’est pas déclenché. Le champ d’action est défini sur ajouter-mettre à jour si vous ajoutez un bot ou supprimer-mettre à jour si vous supprimez un bot.

Installer l’événement de mise à jour

Utilisez l’événement installationUpdate pour envoyer un message d’introduction à partir de votre bot lors de l’installation. Cet événement vous aide à répondre à vos exigences en matière de confidentialité et de conservation des données. Vous pouvez également nettoyer et supprimer des données d’utilisateur ou de thread lorsque le bot est désinstallé.

À l’instar de l’événement conversationUpdate envoyé lors de l’ajout d’un bot à une équipe, le conversation.id de l’événement installationUpdate est défini sur l’ID du canal sélectionné par un utilisateur lors de l’installation de l’application ou sur le canal où l’installation s’est produite. L’ID représente le canal dans lequel l’utilisateur a l’intention de faire fonctionner le bot et doit être utilisé par le bot lors de l’envoi d’un message de bienvenue. Pour les scénarios où l’ID du canal Général est explicitement requis, vous pouvez l’obtenir à partir de team.id dans channelData.

Dans cet exemple, le conversation.id des conversationUpdate activités et installationUpdate est défini sur l’ID du canal de réponse dans l’équipe de démonstration Daves.

Créer un canal sélectionné

Remarque

L’ID de canal sélectionné est défini uniquement sur installationUpdate les événements d’ajout envoyés lorsqu’une application est installée dans une équipe.

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

Vous pouvez également utiliser un gestionnaire dédié pour ajouter ou supprimer des scénarios comme méthode alternative pour capturer un événement.

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

Comportement de désinstallation pour une application personnelle avec un bot

Lorsque vous désinstallez une application, le bot est également désinstallé. Lorsqu’un utilisateur envoie un message à votre application, il reçoit un code de réponse 403. Votre bot reçoit un code de réponse 403 pour les nouveaux messages publiés par votre bot. Le comportement de post-désinstallation pour les bots dans l’étendue personnelle avec les étendues Teams et groupChat est désormais aligné. Vous ne pouvez pas envoyer ou recevoir de messages après la désinstallation d’une application.

Désinstaller le code de réponse

Gestion des événements pour les événements d’installation et de désinstallation

Lorsque vous utilisez ces événements d’installation et de désinstallation, il existe des cas où les bots accordent des exceptions lors de la réception d’événements inattendus de Teams, ce qui se produit dans les cas suivants :

  • Vous générez votre bot sans le kit de développement logiciel (SDK) Microsoft Bot Framework et, par conséquent, le bot donne une exception lors de la réception d’un événement inattendu.
  • Vous générez votre bot avec le SDK Microsoft Bot Framework et vous choisissez de modifier le comportement d’événement par défaut en remplaçant le handle d’événement de base.

Il est important de savoir que de nouveaux événements peuvent être ajoutés à tout moment à l’avenir et que votre bot commence à les recevoir. Vous devez donc concevoir la possibilité de recevoir des événements inattendus. Si vous utilisez le Kit de développement logiciel (SDK) Bot Framework, votre bot répond automatiquement avec une valeur 200 – OK aux événements que vous ne choisissez pas de gérer.

Gestion des erreurs dans les événements de conversation

Lorsqu’un bot rencontre une erreur lors de la gestion d’événements ou d’activités différents, n’envoyez pas de messages sans contexte significatif à la conversation, comme illustré dans la capture d’écran suivante :

Capture d’écran montrant la réponse au message d’erreur dans la conversation du bot.

Dans la phase de développement, il est toujours utile d’envoyer des messages significatifs dans les conversations, qui fournissent des détails supplémentaires sur une erreur spécifique pour un meilleur débogage. Toutefois, dans l’environnement de production, vous devez enregistrer les erreurs ou les événements dans Azure Application Insights. Pour plus d’informations, consultez Ajouter des données de télémétrie à votre bot.

Exemple de code

Exemple de nom Description .NET Node.js Python Manifeste
Bot de conversation Cet exemple montre comment utiliser différents événements de conversation de bot disponibles dans Bot Framework v4 pour l’étendue personnelle et teams. View View View View

Étape suivante

Voir aussi