Por exemplo, se o bot receber uma atividade de mensagem, o manipulador de turnos verá essa atividade de entrada e a enviará para o manipulador de atividade de mensagem. Ao criar o seu bot, a lógica do bot para lidar e responder a mensagens irá para este manipulador de atividade de mensagens. Da mesma forma, a sua lógica para lidar com membros que estão a ser adicionados à conversa irá no seu gestor de membros adicionados, que é chamado sempre que um membro é adicionado à conversa.
Para implementar a sua lógica para estes gestores, irá substituir esses métodos no seu bot, como na secção de manipulador de atividades de exemplo abaixo. Para cada um desses manipuladores, não existe uma implementação base, então basta adicionar a lógica desejada na sua substituição.
Há certas situações em que se desejará substituir o manipulador de turno base, como salvar o estado no final de um turno. Ao fazer isso, certifique-se de primeiro chamar await base.OnTurnAsync(turnContext, cancellationToken); para garantir que a implementação base de OnTurnAsync seja executada antes do seu código adicional. Essa implementação base é, entre outras coisas, responsável por chamar os outros manipuladores de atividade, como OnMessageActivityAsync.
O JavaScript ActivityHandler usa um emissor de eventos e um padrão de listener.
Por exemplo, use o método onMessage para registar um ouvinte de eventos para atividades de mensagem. Você pode registrar mais de um ouvinte. Quando o bot recebe uma atividade de mensagem, o gestor de atividades deteta essa atividade de entrada e envia-a para cada um dos ouvintes de onMessage atividade, pela ordem em que foram registados.
Ao criar o seu bot, a lógica do seu bot para lidar e responder a mensagens irá para os onMessage escutadores. Da mesma forma, sua lógica para lidar com membros que estão sendo adicionados à conversa irá para seus onMembersAdded ouvintes, que são chamados sempre que um membro é adicionado à conversa.
Para adicionar estes ouvintes, irá registá-los no seu bot, conforme visto na secção Lógica do bot abaixo. Para cada ouvinte, inclua a lógica do bot e, em seguida, certifique-se de chamar next() no final. Ao chamar next(), você garante que o próximo listener seja executado.
Certifique-se de guardar o estado antes que o turno termine. Você pode fazer isso substituindo o método de manipulador de atividades run e salvando o estado após a conclusão do método pai run.
Não há situações comuns em que se queira substituir o controlador de turno base, portanto tenha cuidado se tentar fazê-lo.
Há um manipulador especial chamado onDialog. O onDialog manipulador é executado no final, depois que o restante dos manipuladores é executado, e não está vinculado a um determinado tipo de atividade. Como acontece com todos os manipuladores acima, certifique-se de chamar next() para garantir que o resto do processo seja concluído.
Para implementar a sua lógica para estes gestores, irá substituir esses métodos no seu bot, como na secção de manipulador de atividades de exemplo abaixo. Não há implementação base para cada um desses manipuladores, portanto, adicione a lógica desejada ao substituir.
Há certas situações em que se desejará substituir o manipulador de turno base, como salvar o estado no final de um turno. Ao fazer isso, certifique-se de chamar super.onTurn(turnContext); primeiro para garantir que a implementação base de onTurn seja executada antes do seu código adicional. Essa implementação base é, entre outras coisas, responsável por chamar os outros manipuladores de atividade, como onMessageActivity.
Ao criar o seu bot, a lógica do seu bot para lidar e responder a mensagens irá para este on_message_activity manipulador. Da mesma forma, a sua lógica para lidar com membros que são adicionados à conversa vai para o seu on_members_added manipulador de eventos, que é chamado sempre que um membro é adicionado à conversa.
Por exemplo, se o bot receber uma atividade de mensagem, o gestor de turnos verá a atividade de entrada e enviá-la-á para o on_message_activity manipulador de atividades.
Para implementar a sua lógica para estes gestores, irá substituir esses métodos no seu bot, como na secção de manipulador de atividades de exemplo abaixo. Para cada um desses manipuladores, não existe uma implementação base, então basta adicionar a lógica desejada na sua substituição.
Há certas situações em que se desejará substituir o manipulador de turno base, como salvar o estado no final de um turno. Ao fazer isso, certifique-se de primeiro chamar await super().on_turn(turnContext); para garantir que a implementação base de on_turn seja executada antes do seu código adicional. Essa implementação base é, entre outras coisas, responsável por chamar os outros manipuladores de atividade, como on_message_activity.
A lógica do bot processa atividades de entrada de um ou mais canais e gera atividades de saída em resposta.
A lógica principal do bot é definida no código do bot. Para implementar um bot como um manipulador de atividades, derive sua classe de bot de ActivityHandler, que implementa a IBot interface.
ActivityHandler define vários manipuladores para diferentes tipos de atividades, como OnMessageActivityAsync, e OnMembersAddedAsync. Esses métodos são protegidos, mas podem ser substituídos, uma vez que estamos derivando de ActivityHandler.
Os manipuladores definidos em ActivityHandler são:
| Evento |
Manipulador |
Descrição |
| Qualquer tipo de atividade recebida |
OnTurnAsync |
Chama um dos outros gestores, com base no tipo de atividade recebida. |
| Atividade de mensagem recebida |
OnMessageActivityAsync |
Substitua esta funcionalidade para tratar de uma atividade message. |
| Atividade de atualização de conversação recebida |
OnConversationUpdateActivityAsync |
Em uma conversationUpdate atividade, chama um manipulador se outros membros além do bot entraram ou saíram da conversa. |
| Membros que não são bots se juntaram à conversa |
OnMembersAddedAsync |
Altere isto para lidar com membros que se juntam a uma conversa. |
| Membros que não são bots deixaram a conversa |
OnMembersRemovedAsync |
Substitua isso para lidar com membros que saem de uma conversa. |
| Atividade do evento recebida |
OnEventActivityAsync |
Em uma event atividade, chama um manipulador específico para o tipo de evento. |
| Atividade de evento de resposta ao token recebida |
OnTokenResponseEventAsync |
Substitua isso para manipular eventos de resposta de token. |
| Atividade de evento de resposta não tokenizada recebida |
OnEventAsync |
Redefina isto para lidar com outros tipos de eventos. |
| Atividade de reação de mensagem recebida |
OnMessageReactionActivityAsync |
Numa messageReaction atividade, chama um manipulador se uma ou mais reações forem adicionadas ou removidas de uma mensagem. |
| Reações adicionadas a uma mensagem |
OnReactionsAddedAsync |
Sobrescreva isto para tratar as reações adicionadas a uma mensagem. |
| As reações a uma mensagem foram removidas. |
OnReactionsRemovedAsync |
Sobreponha isto para lidar com reações removidas de uma mensagem. |
| Atividade de atualização de instalação recebida |
OnInstallationUpdateActivityAsync |
Em uma installationUpdate atividade, chama um manipulador com base em se o bot foi instalado ou desinstalado. |
| Bot instalado |
OnInstallationUpdateAddAsync |
Substitua esta parte para adicionar lógica quando o bot estiver instalado numa unidade organizacional. |
| Bot desinstalado |
OnInstallationUpdateRemoveAsync |
Altere isso para incluir lógica para quando o bot for desinstalado numa unidade organizacional. |
| Outro tipo de atividade recebida |
OnUnrecognizedActivityTypeAsync |
Modifique isto para lidar com qualquer outro tipo de atividade que, de outra forma, não seria tratada. |
Esses manipuladores diferentes têm um turnContext que fornece informações sobre a atividade de entrada, que corresponde à solicitação HTTP de entrada. As atividades podem ser de vários tipos, de modo que cada manipulador fornece uma atividade fortemente tipada no seu parâmetro de contexto de turno; na maioria dos casos, OnMessageActivityAsync será sempre tratado, sendo esta geralmente a mais comum.
Como nas versões 4.x anteriores desta estrutura, há também a opção de implementar o método OnTurnAsyncpúblico . Atualmente, a implementação base desse método lida com a verificação de erros e, em seguida, chama cada um dos manipuladores específicos (como os dois que definimos neste exemplo), dependendo do tipo de atividade de entrada. Na maioria dos casos, você pode deixar esse método sozinho e usar os manipuladores individuais, mas se sua situação exigir uma implementação personalizada do OnTurnAsync, ainda é uma opção.
Importante
Caso substitua o método OnTurnAsync, precisará chamar base.OnTurnAsync para obter a implementação base para chamar todos os outros manipuladores On<activity>Async ou chamar esses manipuladores por si mesmo. Caso contrário, esses manipuladores não serão chamados e esse código não será executado.
A lógica principal do bot é definida no código do bot. Para implementar um bot como um manipulador de atividades, estenda ActivityHandler.
ActivityHandler define vários eventos para diferentes tipos de atividades e você pode modificar o comportamento do bot registrando ouvintes de eventos, como com onMessage e onConversationUpdate.
Use estes métodos para registrar ouvintes para cada tipo de evento:
| Evento |
Método de registo |
Descrição |
| Qualquer tipo de atividade recebida |
onTurn |
Registra um ouvinte para quando qualquer atividade é recebida. |
| Atividade de mensagem recebida |
onMessage |
Registra um ouvinte para quando uma message atividade é recebida. |
| Atividade de atualização de conversação recebida |
onConversationUpdate |
Regista um ouvinte para quando uma atividade conversationUpdate é recebida. |
| Os membros juntaram-se à conversa |
onMembersAdded |
Registra um ouvinte para saber quando os membros entraram na conversa, incluindo o bot. |
| Os membros abandonaram a conversa |
onMembersRemoved |
Regista uma função de escuta para quando os membros saem da conversa, incluindo o bot. |
| Atividade de reação de mensagem recebida |
onMessageReaction |
Regista um ouvinte para quando uma atividade messageReaction é recebida. |
| Reações adicionadas a uma mensagem |
onReactionsAdded |
Registra um ouvinte para quando as reações são adicionadas a uma mensagem. |
| As reações a uma mensagem foram removidas. |
onReactionsRemoved |
Registra um ouvinte para quando as reações são removidas de uma mensagem. |
| Atividade do evento recebida |
onEvent |
Regista um ouvinte para quando uma atividade event é recebida. |
| Atividade de evento de resposta ao token recebida |
onTokenResponseEvent |
Regista um ouvinte para quando um evento tokens/response é recebido. |
| Atividade de atualização de instalação recebida |
onInstallationUpdate |
Regista um ouvinte para quando uma atividade installationUpdate é recebida. |
| Bot instalado |
onInstallationUpdateAdd |
Registra um ouvinte para quando o bot é instalado em uma unidade organizacional. |
| Bot desinstalado |
onInstallationUpdateRemove |
Registra um ouvinte para quando o bot é desinstalado dentro de uma unidade organizacional. |
| Outro tipo de atividade recebida |
onUnrecognizedActivityType |
Regista um escutador para o caso de não haver um manipulador definido para o tipo específico de atividade. |
| Os manipuladores de atividades concluíram |
onDialog |
Chamado após a conclusão de todos os manipuladores aplicáveis. |
Chame a next função de continuação de cada manipulador para permitir que o processamento continue. Se next não for chamado, o processamento da atividade termina.
A lógica principal do bot é definida no código do bot. Para implementar um bot como um manipulador de atividades, derive sua classe de bot de ActivityHandler, que implementa a Bot interface.
ActivityHandler define vários manipuladores para diferentes tipos de atividades, como onMessageActivity, e onMembersAdded. Esses métodos são protegidos, mas podem ser substituídos, uma vez que estamos derivando de ActivityHandler.
Os manipuladores definidos em ActivityHandler são:
| Evento |
Manipulador |
Descrição |
| Qualquer tipo de atividade recebida |
onTurn |
Chama um dos outros gestores, com base no tipo de atividade recebida. |
| Atividade de mensagem recebida |
onMessageActivity |
Substitua esta funcionalidade para tratar de uma atividade message. |
| Atividade de atualização de conversação recebida |
onConversationUpdateActivity |
Em uma conversationUpdate atividade, chama um manipulador se outros membros além do bot entraram ou saíram da conversa. |
| Membros que não são bots se juntaram à conversa |
onMembersAdded |
Altere isto para lidar com membros que se juntam a uma conversa. |
| Membros que não são bots deixaram a conversa |
onMembersRemoved |
Substitua isso para lidar com membros que saem de uma conversa. |
| Atividade do evento recebida |
onEventActivity |
Em uma event atividade, chama um manipulador específico para o tipo de evento. |
| Atividade de evento de resposta ao token recebida |
onTokenResponseEvent |
Substitua isso para manipular eventos de resposta de token. |
| Atividade de evento de resposta não tokenizada recebida |
onEvent |
Redefina isto para lidar com outros tipos de eventos. |
| Atividade de reação de mensagem recebida |
onMessageReactionActivity |
Numa messageReaction atividade, chama um manipulador se uma ou mais reações forem adicionadas ou removidas de uma mensagem. |
| Reações adicionadas a uma mensagem |
onReactionsAdded |
Sobrescreva isto para tratar as reações adicionadas a uma mensagem. |
| As reações a uma mensagem foram removidas. |
onReactionsRemoved |
Sobreponha isto para lidar com reações removidas de uma mensagem. |
| Atividade de atualização de instalação recebida |
onInstallationUpdate |
Em uma installationUpdate atividade, chama um manipulador com base em se o bot foi instalado ou desinstalado. |
| Bot instalado |
onInstallationUpdateAdd |
Substitua esta parte para adicionar lógica quando o bot estiver instalado numa unidade organizacional. |
| Bot desinstalado |
onInstallationUpdateRemove |
Altere isso para incluir lógica para quando o bot for desinstalado numa unidade organizacional. |
| Outro tipo de atividade recebida |
onUnrecognizedActivityType |
Modifique isto para lidar com qualquer outro tipo de atividade que, de outra forma, não seria tratada. |
Esses manipuladores diferentes têm um turnContext que fornece informações sobre a atividade de entrada, que corresponde à solicitação HTTP de entrada. As atividades podem ser de vários tipos, de modo que cada manipulador fornece uma atividade fortemente tipada no seu parâmetro de contexto de turno; na maioria dos casos, onMessageActivity será sempre tratado, sendo esta geralmente a mais comum.
Há também a opção de implementar o método onTurnpúblico. Atualmente, a implementação base desse método lida com a verificação de erros e, em seguida, chama cada um dos manipuladores específicos (como os dois que definimos neste exemplo), dependendo do tipo de atividade de entrada. Na maioria dos casos, você pode deixar esse método sozinho e usar os manipuladores individuais, mas se sua situação exigir uma implementação personalizada do onTurn, ainda é uma opção.
Importante
Caso substitua o método onTurn, precisará chamar super.onTurn para obter a implementação base para chamar todos os outros manipuladores on<activity> ou chamar esses manipuladores por si mesmo. Caso contrário, esses manipuladores não serão chamados e esse código não será executado.
A lógica principal do bot é definida no código do bot. Para implementar um bot como um manipulador de atividades, derive sua classe de bot de ActivityHandler, que, por sua vez, deriva da classe abstrata Bot .
ActivityHandler define vários manipuladores para diferentes tipos de atividades, como on_message_activity e on_members_added. Esses métodos são protegidos, mas podem ser substituídos, uma vez que estamos derivando de ActivityHandler.
Os manipuladores definidos em ActivityHandler são:
| Evento |
Manipulador |
Descrição |
| Qualquer tipo de atividade recebida |
on_turn |
Chama um dos outros gestores, com base no tipo de atividade recebida. |
| Atividade de mensagem recebida |
on_message_activity |
Substitua esta funcionalidade para tratar de uma atividade message. |
| Atividade de atualização de conversação recebida |
on_conversation_update_activity |
Em uma conversationUpdate atividade, chama um manipulador se outros membros além do bot entraram ou saíram da conversa. |
| Membros que não são bots se juntaram à conversa |
on_members_added_activity |
Altere isto para lidar com membros que se juntam a uma conversa. |
| Membros que não são bots deixaram a conversa |
on_members_removed_activity |
Substitua isso para lidar com membros que saem de uma conversa. |
| Atividade do evento recebida |
on_event_activity |
Em uma event atividade, chama um manipulador específico para o tipo de evento. |
| Atividade de evento de resposta ao token recebida |
on_token_response_event |
Substitua isso para manipular eventos de resposta de token. |
| Atividade de evento de resposta não tokenizada recebida |
on_event_activity |
Redefina isto para lidar com outros tipos de eventos. |
| Atividade de reação de mensagem recebida |
on_message_reaction_activity |
Numa messageReaction atividade, chama um manipulador se uma ou mais reações forem adicionadas ou removidas de uma mensagem. |
| Reações adicionadas a uma mensagem |
on_reactions_added |
Sobrescreva isto para tratar as reações adicionadas a uma mensagem. |
| As reações a uma mensagem foram removidas. |
on_reactions_removed |
Sobreponha isto para lidar com reações removidas de uma mensagem. |
| Atividade de atualização de instalação recebida |
on_installation_update |
Em uma installationUpdate atividade, chama um manipulador com base em se o bot foi instalado ou desinstalado. |
| Bot instalado |
on_installation_update_add |
Substitua esta parte para adicionar lógica quando o bot estiver instalado numa unidade organizacional. |
| Bot desinstalado |
on_installation_update_remove |
Altere isso para incluir lógica para quando o bot for desinstalado numa unidade organizacional. |
| Outro tipo de atividade recebida |
on_unrecognized_activity_type |
Modifique isto para lidar com qualquer outro tipo de atividade que, de outra forma, não seria tratada. |
Esses manipuladores diferentes têm um turn_context que fornece informações sobre a atividade de entrada, que corresponde à solicitação HTTP de entrada. As atividades podem ser de vários tipos, de modo que cada manipulador fornece uma atividade fortemente tipada no seu parâmetro de contexto de turno; na maioria dos casos, on_message_activity será sempre tratado, sendo esta geralmente a mais comum.
Como nas versões 4.x anteriores desta estrutura, há também a opção de implementar o método on_turnpúblico . Atualmente, a implementação base desse método lida com a verificação de erros e, em seguida, chama cada um dos manipuladores específicos (como os dois que definimos neste exemplo), dependendo do tipo de atividade de entrada. Na maioria dos casos, você pode deixar esse método sozinho e usar os manipuladores individuais, mas se sua situação exigir uma implementação personalizada do on_turn, ainda é uma opção.
Importante
Caso substitua o método on_turn, precisará chamar super().on_turn para obter a implementação base para chamar todos os outros manipuladores on_<activity> ou chamar esses manipuladores por si mesmo. Caso contrário, esses manipuladores não serão chamados e esse código não será executado.
public class EchoBot : ActivityHandler
{
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
var replyText = $"Echo: {turnContext.Activity.Text}";
await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);
}
protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
var welcomeText = "Hello and welcome!";
foreach (var member in membersAdded)
{
if (member.Id != turnContext.Activity.Recipient.Id)
{
await turnContext.SendActivityAsync(MessageFactory.Text(welcomeText, welcomeText), cancellationToken);
}
}
}
}
const { ActivityHandler, MessageFactory } = require('botbuilder');
class EchoBot extends ActivityHandler {
constructor() {
super();
// See https://aka.ms/about-bot-activity-message to learn more about the message and other activity types.
this.onMessage(async (context, next) => {
const replyText = `Echo: ${ context.activity.text }`;
await context.sendActivity(MessageFactory.text(replyText, replyText));
// By calling next() you ensure that the next BotHandler is run.
await next();
});
this.onMembersAdded(async (context, next) => {
const membersAdded = context.activity.membersAdded ?? [];
const welcomeText = 'Hello and welcome!';
for (let cnt = 0; cnt < membersAdded.length; ++cnt) {
if (membersAdded[cnt].id !== context.activity.recipient.id) {
await context.sendActivity(MessageFactory.text(welcomeText, welcomeText));
}
}
// By calling next() you ensure that the next BotHandler is run.
await next();
});
public class EchoBot extends ActivityHandler {
@Override
protected CompletableFuture<Void> onMessageActivity(TurnContext turnContext) {
return turnContext.sendActivity(
MessageFactory.text("Echo: " + turnContext.getActivity().getText())
).thenApply(sendResult -> null);
}
@Override
protected CompletableFuture<Void> onMembersAdded(
List<ChannelAccount> membersAdded,
TurnContext turnContext
) {
String welcomeText = "Hello and welcome!";
return membersAdded.stream()
.filter(
member -> !StringUtils
.equals(member.getId(), turnContext.getActivity().getRecipient().getId())
).map(channel -> turnContext.sendActivity(MessageFactory.text(welcomeText, welcomeText, null)))
.collect(CompletableFutures.toFutureList()).thenApply(resourceResponses -> null);
}
}
class EchoBot(ActivityHandler):
async def on_members_added_activity(
self, members_added: [ChannelAccount], turn_context: TurnContext
):
for member in members_added:
if member.id != turn_context.activity.recipient.id:
await turn_context.send_activity("Hello and welcome!")
async def on_message_activity(self, turn_context: TurnContext):
return await turn_context.send_activity(
MessageFactory.text(f"Echo: {turn_context.activity.text}")
)