Bot activity handlers
This document builds on the article on how bots work in the core Bot Framework documentation. The primary difference between bots developed for Microsoft Teams and the core Bot Framework is in the features provided in Teams.
An activity handler is used to organize the conversational logic for your bot. Activities are handled in two ways using Teams activity handlers and bot logic. The Teams activity handler adds support for Teams-specific events and interactions. The bot object contains the conversational reasoning or logic for a turn and exposes a turn handler, which is the method that can accept incoming activities from the bot adapter.
Teams activity handlers
Teams activity handler is derived from Microsoft Bot Framework's activity handler. It routes all Teams activities before allowing any non-Teams specific activities to be handled.
When a bot for Teams receives an activity, it's routed to the activity handlers. All activities are routed through one base handler called the turn handler. The turn handler calls the required activity handler to manage any activity received. The Teams bot is derived from TeamsActivityHandler
class, which is derived from the Bot Framework's ActivityHandler
class.
Note
If the bot activity takes more than 15 seconds to process, Teams send a retry request to bot endpoint. Hence, you'll see duplicate requests in your bot.
Bots are created using the Bot Framework. If the bots receive a message activity, then the turn handler receives a notification of that incoming activity. The turn handler then sends the incoming activity to the OnMessageActivityAsync
activity handler. In Teams, this functionality remains the same. If the bot receives a conversation update activity, then the turn handler receives a notification of that incoming activity and sends the incoming activity to OnConversationUpdateActivityAsync
. The Teams activity handler first checks for any Teams specific events. If no events are found, it then passes them along to the Bot Framework's activity handler.
In the Teams activity handler class, there are two primary Teams activity handlers, OnConversationUpdateActivityAsync
and OnInvokeActivityAsync
. OnConversationUpdateActivityAsync
routes all conversation update activities and OnInvokeActivityAsync
routes all Teams invoke activities.
To implement your logic for Teams specific activity handlers, you must override the methods in your bot as shown in the bot logic section. There's no base implementation for these handlers. Therefore, add the logic that you want in your override.
The code snippets for Teams activity handlers:
OnTeamsChannelCreatedAsync
protected override Task OnTeamsChannelCreatedAsync(ChannelInfo channelInfo, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
// Code logic here
}
OnTeamsChannelDeletedAsync
protected override Task OnTeamsChannelDeletedAsync(ChannelInfo channelInfo, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
// Code logic here
}
OnTeamsChannelRenamedAsync
protected override Task OnTeamsChannelRenamedAsync(ChannelInfo channelInfo, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
// Code logic here
}
OnTeamsTeamRenamedAsync
protected override Task OnTeamsTeamRenamedAsync(TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
// Code logic here
}
OnTeamsMembersAddedAsync
protected override Task OnTeamsMembersAddedAsync(IList<TeamsChannelAccount> teamsMembersAdded, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
// Code logic here
}
OnTeamsMembersRemovedAsync
protected override Task OnTeamsMembersRemovedAsync(IList<TeamsChannelAccount> teamsMembersRemoved, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken);
{
// Code logic here
}
OnTeamsMessageEditAsync
protected override async Task OnTeamsMessageEditAsync(ITurnContext<IMessageUpdateActivity> turnContext, CancellationToken cancellationToken)
{
// Code logic here
}
OnTeamsMessageUndeleteAsync
protected override async Task OnTeamsMessageUndeleteAsync(ITurnContext<IMessageUpdateActivity> turnContext, CancellationToken cancellationToken)
{
// Code logic here
}
OnTeamsMessageSoftDeleteAsync
protected override async Task OnTeamsMessageSoftDeleteAsync(ITurnContext<IMessageDeleteActivity> turnContext, CancellationToken cancellationToken)
{
// Code logic here
}
Bot logic
The bot logic processes incoming activities from one or more of your bot channels and in response generates outgoing activities. It's still true of bots derived from the Teams activity handler class, which first checks for Teams activities. After checking for Teams activities, it passes all other activities to the Bot Framework's activity handler.
Core Bot Framework handlers
Note
- Except for the added and removed members' activities, all the activity handlers described in this section continue to work as they do with a non-Teams bot.
onInstallationUpdateActivityAsync()
method is used to get Teams Locale while adding the bot to Teams.
Activity handlers are different in context of a team, where a new member is added to the team instead of a message thread.
The list of handlers defined in ActivityHandler
includes the following events:
Event | Handler | Description |
---|---|---|
Any activity type received | OnTurnAsync |
This method calls one of the other handlers, based on the type of activity received. |
Message activity received | OnMessageActivityAsync |
You can override this method to handle a Message activity. |
Message update activity received | OnMessageUpdateActivityAsync |
You can override this method to handle a message update activity. |
Message delete activity received | OnMessageDeleteActivityAsync |
You can override this method to handle a message delete activity. |
Conversation update activity received | OnConversationUpdateActivityAsync |
This method calls a handler if members other than the bot joined or left the conversation, on a ConversationUpdate activity. |
Non-bot members joined the conversation | OnMembersAddedAsync |
This method can be overridden to handle members joining a conversation. |
Non-bot members left the conversation | OnMembersRemovedAsync |
This method can be overridden to handle members leaving a conversation. |
Event activity received | OnEventActivityAsync |
This method calls a handler specific to the event type, on an Event activity. |
Token-response event activity received | OnTokenResponseEventAsync |
This method can be overridden to handle token response events. |
Non-token-response event activity received | OnEventAsync |
This method can be overridden to handle other types of events. |
Other activity type received | OnUnrecognizedActivityTypeAsync |
This method can be overridden to handle any activity type otherwise unhandled. |
Teams specific activity handlers
The TeamsActivityHandler
extends the list of handlers in the core Bot Framework handlers section to include the following events:
Event | Handler | Description |
---|---|---|
channelCreated | OnTeamsChannelCreatedAsync |
This method can be overridden to handle a Teams channel being created. For more information, see channel created in Conversation update events. |
channelDeleted | OnTeamsChannelDeletedAsync |
This method can be overridden to handle a Teams channel being deleted. For more information, see channel deleted in Conversation update events. |
channelRenamed | OnTeamsChannelRenamedAsync |
This method can be overridden to handle a Teams channel being renamed. For more information, see channel renamed in Conversation update events. |
teamRenamed | OnTeamsTeamRenamedAsync |
return Task.CompletedTask; This method can be overridden to handle a Teams team being renamed. For more information, see team renamed in Conversation update events. |
MembersAdded | OnTeamsMembersAddedAsync |
This method calls the OnMembersAddedAsync method in ActivityHandler . The method can be overridden to handle members joining a team. For more information, see team members added in Conversation update events. |
MembersRemoved | OnTeamsMembersRemovedAsync |
This method calls the OnMembersRemovedAsync method in ActivityHandler . The method can be overridden to handle members leaving a team. For more information, see team members removed in Conversation update events. |
messageEdit | OnTeamsMessageEditAsync |
You can override this method to handle a Teams message edit event. |
messageUndelete | OnTeamsMessageUndeleteAsync |
You can override this method to handle a Teams message undelete event. |
messageSoftDelete | OnTeamsMessageSoftDeleteAsync |
You can override this method to handle a Teams message soft delete event. |
Teams invoke activities
The list of Teams activity handlers called from the OnInvokeActivityAsync
Teams activity handler includes the following invoke types:
Invoke types | Handler | Description |
---|---|---|
CardAction.Invoke | OnTeamsCardActionInvokeAsync |
When the connector receives a card action invoke activity, this method is invoked. |
fileConsent/invoke | OnTeamsFileConsentAcceptAsync |
When a user accepts a file consent card, this method is invoked. |
fileConsent/invoke | OnTeamsFileConsentAsync |
When the connector receives a file consent card activity, this method is invoked. |
fileConsent/invoke | OnTeamsFileConsentDeclineAsync |
When a user declines a file consent card, this method is invoked. |
actionableMessage/executeAction | OnTeamsO365ConnectorCardActionAsync |
When the connector receives a connector card for Microsoft 365 Groups action activity, this method is invoked. |
signin/verifyState | OnTeamsSigninVerifyStateAsync |
When the connector receives a signIn verify state activity, this method is invoked. |
task/fetch | OnTeamsTaskModuleFetchAsync |
You can override this method in a derived class to provide logic when a dialog (referred as task module in TeamsJS v1.x) is fetched. |
task/submit | OnTeamsTaskModuleSubmitAsync |
You can override this method in a derived class to provide logic when a dialog is submitted. |
The Invoke activities listed in this section are for conversational bots in Teams. The Bot Framework SDK also supports invoke activities specific to message extensions. For more information, see what are message extensions.
Now that you've familiarized yourself with bot activity handlers, let us see how bots behave differently depending on the conversation and the messages it receives or sends.
Code sample
Sample name | Description | .NET | Node.js | Python |
---|---|---|---|---|
Teams conversation bot | This sample app shows how to use different bot conversation events available in Bot Framework v4. | View | View | View |
Bot samples | Set of Bot Framework v4 samples. | View | View | View |