Activités d’écoute

Une activité est la charge utile spécifique à Teams qui circule entre l’utilisateur et votre bot. Alors que les événements décrivent des événements de haut niveau à l’intérieur de votre application, les activités sont les messages bruts de Teams, tels que le texte de conversation, les actions de la carte, les installations ou les appels.

Le SDK Teams expose un routeur Fluent afin que vous puissiez vous abonner à ces activités avec des méthodes de gestionnaire dédiées à l’aide d’un minimum d’API.

Le SDK Teams expose un routeur Fluent pour que vous puissiez vous abonner à ces activités avec @app.event("activity").

Le SDK Teams expose un routeur Fluent pour que vous puissiez vous abonner à ces activités avec app.on('<route>', …).

Organigramme montrant les événements Teams atteignant le serveur d’applications, qui envoie un événement d’activité au routeur d’activités (app.on()) qui appelle vos gestionnaires d’activités.

Voici un exemple de gestionnaire de messages de base :

teams.OnMessage(async (context, cancellationToken) =>
{
    await context.SendAsync($"you said: {context.Activity.Text}", cancellationToken);
});
@app.on_message
async def handle_message(ctx: ActivityContext[MessageActivity]):
    await ctx.send(f"You said '{ctx.activity.text}'")
app.on('message', async ({ activity, send }) => {
  await send(`You said: ${activity.text}`);
});

Dans l’exemple ci-dessus, la context.Activity propriété est de type MessageActivity, qui a une Text propriété. Vous remarquerez que le gestionnaire ici ne renvoie rien, mais gère à la place l’activité Senden renvoyant un message. Pour les activités de messagerie, Teams ne s’attend pas à ce que votre application renvoie quoi que ce soit (bien qu’il soit généralement judicieux d’envoyer une sorte d’accusé de réception amical !).

Dans l’exemple ci-dessus, le ctx.activity paramètre est de type MessageActivity, qui a une text propriété. Vous remarquerez que le gestionnaire ici ne renvoie rien, mais le traite senden renvoyant un message. Pour les activités de messagerie, Teams ne s’attend pas à ce que votre application renvoie quoi que ce soit (bien qu’il soit généralement judicieux d’envoyer une sorte d’accusé de réception amical !).

Dans l’exemple ci-dessus, le activity paramètre est de type MessageActivity, qui a une text propriété. Vous remarquerez que le gestionnaire ici ne renvoie rien, mais le traite senden renvoyant un message. Pour les activités de messagerie, Teams ne s’attend pas à ce que votre application renvoie quoi que ce soit (bien qu’il soit généralement judicieux d’envoyer une sorte d’accusé de réception amical !).

D’autres types d’activités ont des propriétés différentes et d’autres résultats requis. Pour un gestionnaire donné, le SDK déterminera automatiquement le type de retour et appliquera également le type de activity retour correct.

Commandes Slash

Les commandes Slash sont des commandes déclarées par un manifeste que les utilisateurs exécutent à partir de la zone de rédaction. Pour activer les commandes de barre oblique, définissez supportsTargetedMessages: true votre manifeste d’application dans la bots section. Vous pouvez choisir avec une liste de commandes explicite en déclarant des commandes spécifiques à l’aide commandLists de avec triggers: ["slash"], que Teams affiche dans le menu barre oblique lorsqu’un utilisateur tape /. Sans liste de commandes, les utilisateurs peuvent toujours appeler votre agent via /agent-name et fournir une entrée de forme libre.

{
  "bots": [
    {
      "botId": "{{BOT_ID}}",
      "scopes": ["personal", "team", "groupChat"],
      "supportsTargetedMessages": true,
      "commandLists": [
        {
          "scopes": ["team", "groupChat"],
          "triggers": ["slash"],
          "commands": [
            { "title": "Review", "description": "Review a document" }
          ]
        }
      ]
    }
  ]
}

Lorsqu’un utilisateur envoie une commande slash, elle apparaît sous la forme d’un message privé visible par lui seul. Votre agent peut répondre en privé ou, le cas échéant, partager une réponse avec le groupe ou le canal plus large.

Les commandes de barre oblique arrivent en tant qu’activités de message normales avec l’indicateur ciblé défini sur l’objet destinataire de l’activité.

Les commandes Slash arrivent sous forme de messages ciblés. Vérifiez-les Recipient.IsTargeted et traitez-les explicitement :

teams.OnMessage(async (context, cancellationToken) =>
{
    if (context.Activity.Recipient?.IsTargeted == true)
    {
        await context.SendAsync($"Received slash command: {context.Activity.Text}", cancellationToken);
    }
});
@app.on_message
async def handle_message(ctx: ActivityContext[MessageActivity]):
    if ctx.activity.recipient and ctx.activity.recipient.is_targeted:
        await ctx.send(f"Received slash command: {ctx.activity.text}")
        return

    await ctx.next()
app.on('message', async ({ activity, send, next }) => {
  if (activity.recipient?.isTargeted) {
    await send(`Received slash command: ${activity.text}`);
    return;
  }

  await next();
});

Chaînage de gestionnaires d’activités

Dans le SDK Teams pour .NET, les gestionnaires d’activités ne forment pas une chaîne de traitement de type next(). Au lieu de cela, chaque gestionnaire qui correspond à une activité est appelé dans l’ordre dans lequel elle a été enregistrée, et un gestionnaire ne peut pas empêcher l’exécution des gestionnaires correspondants suivants. Si vous devez intercepter, court-circuiter ou encapsuler le traitement des demandes (par exemple, pour arrêter l’exécution lorsqu’une condition est remplie), implémentez ITurnMiddleware et contrôlez s’il faut appeler nextTurn(...).

Les event gestionnaires d’activité (et les attributs) suivent un modèle d’intergiciel similaire au python fonctionnement des intergiciels. Cela signifie que pour chaque gestionnaire d’activité, une next fonction est passée et peut être appelée pour passer le contrôle au gestionnaire suivant. Cela vous permet de créer une chaîne de gestionnaires qui peuvent traiter la même activité de différentes manières.

@app.on_message
async def handle_message(ctx: ActivityContext[MessageActivity]):
    """Handle message activities using the new generated handler system."""
    print(f"[GENERATED onMessage] Message received: {ctx.activity.text}")
    await ctx.next()
@app.on_message
async def handle_message(ctx: ActivityContext[MessageActivity]):
    """Handle message activities using the new generated handler system."""
    if ctx.activity.text == "/help":
        await ctx.send("Here are all the ways I can help you...")
    await ctx.next()
@app.on_message
async def handle_message(ctx: ActivityContext[MessageActivity]):
    await ctx.send(f"You said '{ctx.activity.text}'")

Les on gestionnaires d’activités suivent un modèle d’intergiciel similaire au express fonctionnement des intergiciels. Cela signifie que pour chaque gestionnaire d’activité, une next fonction est passée et peut être appelée pour passer le contrôle au gestionnaire suivant. Cela vous permet de créer une chaîne de gestionnaires qui peuvent traiter la même activité de différentes manières.

app.on('message', async ({ next }) => {
  console.log('global logger');
  next(); // pass control onward
});
app.on('message', async ({ activity, next }) => {
  if (activity.text === '/help') {
    await send('Here are all the ways I can help you...');
    return;
  }

  // Conditionally pass control to the next handler
  next();
});
app.on('message', async ({ activity }) => {
  // Fallthrough to the final handler
  await send(`Hello! you said ${activity.text}`);
});

Référence d’activité

L’application prend en charge un certain nombre de types d’activités :

Itinéraires d’activités principales

Acheminer Responsabilité
message L’utilisateur envoie un message à l’application
typing Envoie un indicateur de saisie pour indiquer que l’application a reçu le message de l’utilisateur et calcule une réponse
deleteUserData Déclenché lorsqu’un utilisateur demande la suppression de ses données conformément aux réglementations en matière de confidentialité
mention Déclenché lorsque le bot est @mentioned en conversation

Itinéraires de configuration

Acheminer Appeler le chemin Responsabilité
config.open config/fetch Lorsque l’application est installée, l’utilisateur peut la configurer via une boîte de dialogue
config.submit config/submit Envoi de boîte de dialogue de configuration
tab.open tab/fetch Initialise les expériences de configuration d’onglets
tab.submit tab/submit Envois de configuration de l’onglet Processus

Itinéraires de dialogue

Acheminer Appeler le chemin Responsabilité
dialog.open task/fetch Ouvrir une boîte de dialogue
dialog.submit task/submit Traite les soumissions de boîte de dialogue

Voies d’authentification

Acheminer Appeler le chemin Responsabilité
signin.token-exchange signin/tokenExchange Lorsqu’un échange de jetons se produit pendant l’authentification SSO
signin.verify-state signin/verifyState Lorsqu’une vérification réussit après OAuth

Itinéraires d’interaction de message

Acheminer Appeler le chemin Responsabilité
message.execute actionableMessage/executeAction Une action a été exécutée sur un message
message.submit message/submitAction Gère les soumissions d’actions de message
card.action adaptiveCard/action Déclenché lorsqu’un utilisateur interagit avec un bouton ou un contrôle de carte adaptative

Itinéraires de gestion des fichiers

Acheminer Responsabilité
file.consent Gérer les flux de travail d’autorisation de partage de fichiers dans Teams
file.consent.accept Déclenché lorsque l’utilisateur accepte une carte de consentement pour le partage
file.consent.decline Déclenché lorsque l’utilisateur refuse une carte de consentement à un fichier pour le partage

Itinéraires d’extension de message

Acheminer Appeler le chemin Responsabilité
message.ext.query-link composeExtension/queryLink Demande de déploiement d’un lien pour une application installée
message.ext.anon-query-link composeExtension/anonymousQueryLink Demande de déploiement d’un lien anonyme
message.ext.query composeExtension/query Requête de recherche d’extension de message
message.ext.select-item composeExtension/selectItem Sélection d’élément d’extension de message
message.ext.submit composeExtension/submitAction Envoi d’une action d’extension de message
message.ext.open composeExtension/fetchTask Extension de message Récupération de tâche pour une action
message.ext.query-settings-url composeExtension/querySettingUrl Récupère les URL de configuration des extensions de message
message.ext.setting composeExtension/setting Traite les changements de paramètres d’extension de message
message.ext.card-button-clicked composeExtension/onCardButtonClicked Gestion des clics sur le bouton de carte dans les extensions de message
message.ext.edit S/O Traite les modifications apportées aux aperçus d’extension de message
message.ext.send S/O Gère l’envoi de contenu d’extension de message

Itinéraires du cycle de vie

Acheminer Responsabilité
install.add Déclenché lorsque l’application est nouvellement installée dans une équipe ou une conversation
install.remove Déclenché lorsque l’application est désinstallée d’une équipe ou d’une conversation
install.update Déclenché lorsque l’application est mise à jour dans une équipe ou une conversation
handoff.action Gérer les transferts d’un autre agent vers votre application

Itinéraires de mise à jour de conversation

Acheminer Responsabilité
membersAdded Déclenché lorsque de nouveaux utilisateurs rejoignent une équipe ou sont ajoutés à une conversation dans laquelle le bot est actif
membersRemoved Déclenché lorsque des utilisateurs quittent une équipe ou sont supprimés d’une conversation dans laquelle le bot est actif
channelCreated Déclenché lorsqu’un nouveau canal est créé dans une équipe où le bot est installé
channelRenamed Déclenché lorsqu’un canal est renommé dans une équipe où le bot est installé
channelDeleted Déclenché lorsqu’un canal est supprimé d’une équipe dans laquelle le bot est installé
channelRestored Déclenché lorsqu’un canal précédemment supprimé est restauré
teamArchived Déclenché lorsqu’une équipe est archivée
teamDeleted Déclenché lorsqu’une équipe est supprimée à l’emplacement où le bot est installé
teamHardDeleted Déclenché lorsqu’une équipe est définitivement supprimée (irrécupérable)
teamRenamed Déclenché lorsqu’une équipe est renommée à l’emplacement d’installation du bot
teamRestored Déclenché lorsqu’une équipe précédemment supprimée est restaurée
teamUnarchived Déclenché lorsqu’une équipe n’est pas archivée
messageUpdate Déclenché lorsqu’un message est modifié dans une conversation avec le bot
messageDelete Déclenché lorsqu’un message est supprimé dans une conversation avec le bot

Itinéraires de réunion

Acheminer Appeler le chemin Responsabilité
meetingStart application/vnd.microsoft.meetingStart Déclenché au début d’une réunion Teams où le bot est présent
meetingEnd application/vnd.microsoft.meetingEnd Déclenché à la fin d’une réunion Teams où le bot est présent
meetingParticipantJoin application/vnd.microsoft.meetingParticipantJoin Déclenché lorsque les participants rejoignent une réunion Teams où le bot est présent
meetingParticipantLeave application/vnd.microsoft.meetingParticipantLeave Déclenché lorsque les participants quittent une réunion Teams où le bot est présent
readReceipt application/vnd.microsoft.readReceipt Détecte quand les messages sont lus par les utilisateurs