Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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>', …).
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 |