Teams Bot开发系列:Teams的Activity处理
上一篇文章講了activity處理的流程,我們bot的核心處理邏輯放在ActivityHandler的子類里,通過重載OnMessageActivityAsync()方法來實(shí)現(xiàn)。
這篇文章我來講一下對(duì)于Teams的bot來說,整個(gè)處理的邏輯會(huì)有哪些不同點(diǎn)。
通過之前的文章,大家應(yīng)該已經(jīng)知道,Teams bot是Azure bot service支持的眾多bot聊天平臺(tái)里的一種channel(注意:這里的channel指bot service里的channel,和Teams里的channel是完全不同的概念)。但是Teams實(shí)際上提供了很多特有的事件和動(dòng)作。使用bot sdk的通用模型,我們當(dāng)然可以處理這些事情,但是Teams作為微軟的主打產(chǎn)品,微軟的bot sdk當(dāng)然要為它提供更多的開發(fā)便利性。
SDK提供了一個(gè)針對(duì)Teams的ActivityHandler。這個(gè)handler有下面這些特殊的ConversationUpdateActivity的處理函數(shù)
| channelCreated | OnTeamsChannelCreatedAsync | 當(dāng)Teams的channel被創(chuàng)建 |
| channelDeleted | OnTeamsChannelDeletedAsync | 當(dāng)Teams的channel被刪除 |
| channelRenamed | OnTeamsChannelRenamedAsync | 當(dāng)Teams的channel被重命名 |
| teamRenamed | OnTeamsTeamRenamedAsync | 當(dāng)Teams的一個(gè)team被重命名 |
| MembersAdded | OnTeamsMembersAddedAsync | 當(dāng)Teams的一個(gè)team中有新用戶加入 |
| MembersRemoved | OnTeamsMembersRemovedAsync | 當(dāng)Teams的一個(gè)team中有用戶被移除 |
除了ConversationUpdateActivity這些Teams的特殊事件,handler還提供了一些Teams特有的invoke動(dòng)作的處理
| CardAction.Invoke | OnTeamsCardActionInvokeAsync | 關(guān)于卡片的動(dòng)作,比如卡片上一個(gè)按鈕被點(diǎn)擊了 |
| fileConsent/invoke | OnTeamsFileConsentAcceptAsync | 用戶同意了上傳文件 |
| fileConsent/invoke | OnTeamsFileConsentAsync | 用戶要上傳文件. |
| fileConsent/invoke | OnTeamsFileConsentDeclineAsync | 用戶拒絕了上傳文件. |
| actionableMessage/executeAction | OnTeamsO365ConnectorCardActionAsync | O365連接器的卡片動(dòng)作 |
| signin/verifyState | OnTeamsSigninVerifyStateAsync | 登入驗(yàn)證狀態(tài) |
| task/fetch | OnTeamsTaskModuleFetchAsync | Teams的Task Module的獲取 |
| task/submit | OnTeamsTaskModuleSubmitAsync | Teams的Task Module的提交 |
上面表格中的OnTeamsFileConsentAsync實(shí)際上是OnTeamsFileConsentAcceptAsync和OnTeamsFileConsentDeclineAsync的一個(gè)綜合處理,你可以重載OnTeamsFileConsentAsync,或者分別重載 accept 和 decline 函數(shù)。下面的sdk代碼可以讓你有直觀的了解
protected virtual async Task<InvokeResponse> OnTeamsFileConsentAsync(ITurnContext<IInvokeActivity> turnContext, FileConsentCardResponse fileConsentCardResponse, CancellationToken cancellationToken) {switch (fileConsentCardResponse.Action){case "accept":await OnTeamsFileConsentAcceptAsync(turnContext, fileConsentCardResponse, cancellationToken).ConfigureAwait(false);return CreateInvokeResponse();case "decline":await OnTeamsFileConsentDeclineAsync(turnContext, fileConsentCardResponse, cancellationToken).ConfigureAwait(false);return CreateInvokeResponse();default:throw new InvokeResponseException(HttpStatusCode.BadRequest, $"{fileConsentCardResponse.Action} is not a supported Action.");} }對(duì)于喜歡把問題研究透徹的朋友可能會(huì)問,Teams的ActivityHandler到底是怎么處理的?讓我們跳入sdk源代碼一探究竟。
public class TeamsActivityHandler : ActivityHandler {protected override async Task<InvokeResponse> OnInvokeActivityAsync(ITurnContext<IInvokeActivity> turnContext, CancellationToken cancellationToken){...switch (turnContext.Activity.Name){case "fileConsent/invoke":return await OnTeamsFileConsentAsync(turnContext, SafeCast<FileConsentCardResponse>(turnContext.Activity.Value), cancellationToken).ConfigureAwait(false);case "task/fetch":return CreateInvokeResponse(await OnTeamsTaskModuleFetchAsync(turnContext, SafeCast<TaskModuleRequest>(turnContext.Activity.Value), cancellationToken).ConfigureAwait(false));case "task/submit":return CreateInvokeResponse(await OnTeamsTaskModuleSubmitAsync(turnContext, SafeCast<TaskModuleRequest>(turnContext.Activity.Value), cancellationToken).ConfigureAwait(false));......default:return await base.OnInvokeActivityAsync(turnContext, cancellationToken).ConfigureAwait(false);}...}protected override Task OnConversationUpdateActivityAsync(ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken){...switch (channelData.EventType){case "channelCreated":return OnTeamsChannelCreatedAsync(channelData.Channel, channelData.Team, turnContext, cancellationToken);case "channelDeleted":return OnTeamsChannelDeletedAsync(channelData.Channel, channelData.Team, turnContext, cancellationToken);case "channelRenamed":return OnTeamsChannelRenamedAsync(channelData.Channel, channelData.Team, turnContext, cancellationToken);case "teamRenamed":return OnTeamsTeamRenamedAsync(channelData.Team, turnContext, cancellationToken);default:return base.OnConversationUpdateActivityAsync(turnContext, cancellationToken);}...} }從上面的代碼里可以看到?jīng)]有什么特別的magic,TeamsActivityHandler重載了OnConversationUpdateActivityAsync,并且根據(jù)channelData.EventType判斷出不同teams的事件,然后調(diào)用相應(yīng)的方法。對(duì)于invoke也類似,重載了OnInvokeActivityAsync,根據(jù)turnContext.Activity.Name來調(diào)用不同的方法。
回到我們的EchoBot代碼,讓EchoBot從TeamsActivityHandler繼承下來,然后我們可以添加OnTeamsChannelRenamedAsync方法。把EchoBot設(shè)置到Teams里,修改安裝了EchoBot的channel的名字,就可以看到這個(gè)方法被促發(fā)的。
public class EchoBot : TeamsActivityHandler {protected virtual Task OnTeamsChannelRenamedAsync(ChannelInfo channelInfo, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken){var replyText = "Channel renamed.";await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);} }總結(jié)
以上是生活随笔為你收集整理的Teams Bot开发系列:Teams的Activity处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python Selenium:键盘
- 下一篇: 楷书书法规则_书法结构|楷书10大结构原