Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Uma Atividade é o conteúdo específico do Teams que flui entre o usuário e seu bot. Onde os eventos descrevem acontecimentos de alto nível dentro de seu aplicativo, as atividades são as mensagens brutas do Teams, como texto de chat, ações de card, instalações ou chamadas de invocação.
O SDK do Teams expõe um roteador fluente para que você possa assinar essas atividades com métodos de manipulador dedicados usando APIs mínimas.
O SDK do Teams expõe um roteador fluente para que você possa assinar essas atividades com @app.event("activity")o .
O SDK do Teams expõe um roteador fluente para que você possa assinar essas atividades com app.on('<route>', …)o .
Aqui está um exemplo de um manipulador de mensagens básico:
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}`);
});
No exemplo acima, a context.Activity propriedade é do tipo MessageActivity, que tem uma Text propriedade. Você notará que o manipulador aqui não retorna nada, mas, em vez disso, manipula a atividade enviando Senduma mensagem de volta. Para atividades de mensagem, o Teams não espera que seu aplicativo retorne nada (embora geralmente seja uma boa ideia enviar algum tipo de reconhecimento amigável!).
No exemplo acima, o ctx.activity parâmetro é do tipo MessageActivity, que tem uma text propriedade. Você notará que o manipulador aqui não retorna nada, mas, em vez disso, manipula isso sending uma mensagem de volta. Para atividades de mensagem, o Teams não espera que seu aplicativo retorne nada (embora geralmente seja uma boa ideia enviar algum tipo de reconhecimento amigável!).
No exemplo acima, o activity parâmetro é do tipo MessageActivity, que tem uma text propriedade. Você notará que o manipulador aqui não retorna nada, mas, em vez disso, manipula isso sending uma mensagem de volta. Para atividades de mensagem, o Teams não espera que seu aplicativo retorne nada (embora geralmente seja uma boa ideia enviar algum tipo de reconhecimento amigável!).
Outros tipos de atividade têm propriedades diferentes e resultados necessários diferentes. Para um determinado manipulador, o SDK determinará automaticamente o tipo de retorno correto e também imporá o tipo de activity retorno correto.
Comandos de barra
Os comandos de barra são comandos declarados pelo manifesto que os usuários executam na caixa de redação. Para habilitar comandos de barra, defina supportsTargetedMessages: true o manifesto bots do aplicativo na seção. Você pode optar por uma lista de comandos explícita declarando comandos específicos usando commandLists com triggers: ["slash"], que o Teams mostra no menu de barra quando um usuário digita /. Sem uma lista de comandos, os usuários ainda podem invocar seu agente por meio /agent-name de e fornecer entrada de formulário livre.
{
"bots": [
{
"botId": "{{BOT_ID}}",
"scopes": ["personal", "team", "groupChat"],
"supportsTargetedMessages": true,
"commandLists": [
{
"scopes": ["team", "groupChat"],
"triggers": ["slash"],
"commands": [
{ "title": "Review", "description": "Review a document" }
]
}
]
}
]
}
Quando um usuário envia um comando de barra, ele aparece como uma mensagem privada visível apenas para ele. Seu agente pode responder em particular ou, quando apropriado, compartilhar uma resposta com o grupo ou canal mais amplo.
Os comandos de barra chegam como atividades normais de mensagem com o sinalizador de destino definido no objeto destinatário da atividade.
Os comandos de barra chegam como mensagens direcionadas. Verifique Recipient.IsTargeted e manipule-os explicitamente:
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();
});
Encadeamento do manipulador de atividades
No SDK do Teams para .NET, os manipuladores de atividade não formam uma cadeia de processamento no estilo next(). Em vez disso, cada manipulador que corresponde a uma atividade é invocado na ordem em que foi registrada e um manipulador não pode impedir que manipuladores correspondentes subsequentes sejam executados. Se você precisar interceptar, causar curto-circuito ou encapsular o processamento de solicitações (por exemplo, para interromper a execução quando uma condição for atendida), implemente ITurnMiddleware e controle se deve chamar nextTurn(...).
Os event manipuladores de atividade (e atributos) seguem um padrão de middleware semelhante ao funcionamento python dos middlewares. Isso significa que, para cada manipulador de atividade, uma next função é passada na qual pode ser chamada para passar o controle para o próximo manipulador. Isso permite que você crie uma cadeia de manipuladores que podem processar a mesma atividade de maneiras diferentes.
@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}'")
Os on manipuladores de atividades seguem um padrão de middleware semelhante ao funcionamento express dos middlewares. Isso significa que, para cada manipulador de atividade, uma next função é passada na qual pode ser chamada para passar o controle para o próximo manipulador. Isso permite que você crie uma cadeia de manipuladores que podem processar a mesma atividade de maneiras diferentes.
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}`);
});
Referência de atividade
O aplicativo dá suporte a vários tipos de atividade:
Principais rotas de atividade
| Rota | Responsabilidade |
|---|---|
message |
O usuário envia mensagens para o aplicativo |
typing |
Envia um indicador de digitação para indicar que o aplicativo recebeu a mensagem do usuário e está computando uma resposta |
deleteUserData |
Acionada quando um usuário solicita que seus dados sejam excluídos de acordo com os regulamentos de privacidade |
mention |
Acionada quando o bot está @mentioned em uma conversa |
Rotas de configuração
| Rota | Invocar Caminho | Responsabilidade |
|---|---|---|
config.open |
config/fetch |
Quando o aplicativo é instalado, o usuário pode configurá-lo por meio de uma caixa de diálogo |
config.submit |
config/submit |
Envio da caixa de diálogo de configuração |
tab.open |
tab/fetch |
Inicializa experiências de configuração de guia |
tab.submit |
tab/submit |
Envios de configuração da guia Processos |
Rotas de Caixa de Diálogo
| Rota | Invocar Caminho | Responsabilidade |
|---|---|---|
dialog.open |
task/fetch |
Abre uma caixa de diálogo |
dialog.submit |
task/submit |
Envios de diálogo de processos |
Rotas de autenticação
| Rota | Invocar Caminho | Responsabilidade |
|---|---|---|
signin.token-exchange |
signin/tokenExchange |
Quando uma troca de token acontece durante a autenticação SSO |
signin.verify-state |
signin/verifyState |
Quando uma verificação for aprovada após OAuth |
Rotas de interação de mensagens
| Rota | Invocar Caminho | Responsabilidade |
|---|---|---|
message.execute |
actionableMessage/executeAction |
Foi executada uma ação em uma mensagem |
message.submit |
message/submitAction |
Lida com envios de ação de mensagem |
card.action |
adaptiveCard/action |
Disparado quando um usuário interage com um botão ou controle do Cartão Adaptável |
Rotas de manipulação de arquivos
| Rota | Responsabilidade |
|---|---|
file.consent |
Gerencia fluxos de trabalho de permissão de compartilhamento de arquivos no Teams |
file.consent.accept |
Acionada quando o usuário aceita um card de consentimento de arquivo para compartilhamento |
file.consent.decline |
Acionada quando o usuário recusa um arquivo consent card para compartilhamento |
Rotas de extensão de mensagem
| Rota | Invocar Caminho | Responsabilidade |
|---|---|---|
message.ext.query-link |
composeExtension/queryLink |
Uma solicitação de descompactação de link para um aplicativo instalado |
message.ext.anon-query-link |
composeExtension/anonymousQueryLink |
Uma solicitação de desfralde de link anônimo |
message.ext.query |
composeExtension/query |
Consulta de pesquisa de extensão de mensagem |
message.ext.select-item |
composeExtension/selectItem |
Seleção de item de extensão de mensagem |
message.ext.submit |
composeExtension/submitAction |
Envio de ação de extensão de mensagem |
message.ext.open |
composeExtension/fetchTask |
Busca de tarefa de extensão de mensagem para uma ação |
message.ext.query-settings-url |
composeExtension/querySettingUrl |
Recupera URLs de configuração para extensões de mensagem |
message.ext.setting |
composeExtension/setting |
Processa alterações nas configurações de extensão de mensagem |
message.ext.card-button-clicked |
composeExtension/onCardButtonClicked |
Manipulação de cliques de botão de cartão em extensões de mensagem |
message.ext.edit |
N/D | Processa edições em visualizações de extensão de mensagem |
message.ext.send |
N/D | Lida com o envio de conteúdo de extensão de mensagem |
Rotas do ciclo de vida
| Rota | Responsabilidade |
|---|---|
install.add |
Acionada quando o aplicativo é recém-instalado em uma equipe ou chat |
install.remove |
Acionada quando o aplicativo é desinstalado de uma equipe ou chat |
install.update |
Acionada quando o aplicativo é atualizado em uma equipe ou chat |
handoff.action |
Gerencia entregas de um agente diferente para seu aplicativo |
Rotas de atualização de conversa
| Rota | Responsabilidade |
|---|---|
membersAdded |
Acionada quando novos usuários ingressam em uma equipe ou são adicionados a um chat em que o bot está ativo |
membersRemoved |
Disparado quando os usuários deixam uma equipe ou são removidos de um chat em que o bot está ativo |
channelCreated |
Disparado quando um novo canal é criado em uma equipe onde o bot está instalado |
channelRenamed |
Disparado quando um canal é renomeado em uma equipe onde o bot está instalado |
channelDeleted |
Disparado quando um canal é excluído de uma equipe onde o bot está instalado |
channelRestored |
Acionada quando um canal excluído anteriormente é restaurado |
teamArchived |
Acionada quando uma equipe é arquivada |
teamDeleted |
Acionado quando uma equipe é excluída onde o bot está instalado |
teamHardDeleted |
Acionada quando uma equipe é excluída permanentemente (além da recuperação) |
teamRenamed |
Acionada quando uma equipe é renomeada onde o bot está instalado |
teamRestored |
Acionado quando uma equipe excluída anteriormente é restaurada |
teamUnarchived |
Acionada quando uma equipe é desarquivada |
messageUpdate |
Acionada quando uma mensagem é editada em uma conversa com o bot |
messageDelete |
Disparado quando uma mensagem é excluída em uma conversa com o bot |
Rotas de reunião
| Rota | Invocar Caminho | Responsabilidade |
|---|---|---|
meetingStart |
application/vnd.microsoft.meetingStart |
Disparado no início de uma reunião do Teams em que o bot está presente |
meetingEnd |
application/vnd.microsoft.meetingEnd |
Disparado no final de uma reunião do Teams em que o bot está presente |
meetingParticipantJoin |
application/vnd.microsoft.meetingParticipantJoin |
Acionada quando os participantes ingressam em uma reunião do Teams em que o bot está presente |
meetingParticipantLeave |
application/vnd.microsoft.meetingParticipantLeave |
Acionada quando os participantes saem de uma reunião do Teams em que o bot está presente |
readReceipt |
application/vnd.microsoft.readReceipt |
Controla quando as mensagens são lidas pelos usuários |