Atividades de escuta

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 .

Fluxograma mostrando os eventos do Teams que chegam ao servidor de aplicativos, que envia um evento de atividade para o roteador de atividade (app.on()) que invoca seus manipuladores de atividade.

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