Teams Bot開發系列:Teams的Activity處理

上一篇文章講了activity處理的流程,我們bot的核心處理邏輯放在ActivityHandler的子類里,通過重載OnMessageActivityAsync()方法來實現。

這篇文章我來講一下對于Teams的bot來說,整個處理的邏輯會有哪些不同點。

通過之前的文章,大家應該已經知道,Teams bot是Azure bot service支持的眾多bot聊天平臺里的一種channel(注意:這里的channel指bot service里的channel,和Teams里的channel是完全不同的概念)。但是Teams實際上提供了很多特有的事件和動作。使用bot sdk的通用模型,我們當然可以處理這些事情,但是Teams作為微軟的主打產品,微軟的bot sdk當然要為它提供更多的開發便利性。

SDK提供了一個針對Teams的ActivityHandler。這個handler有下面這些特殊的ConversationUpdateActivity的處理函數

事件函數說明
channelCreatedOnTeamsChannelCreatedAsync當Teams的channel被創建
channelDeletedOnTeamsChannelDeletedAsync當Teams的channel被刪除
channelRenamedOnTeamsChannelRenamedAsync當Teams的channel被重命名
teamRenamedOnTeamsTeamRenamedAsync當Teams的一個team被重命名
MembersAddedOnTeamsMembersAddedAsync當Teams的一個team中有新用戶加入
MembersRemovedOnTeamsMembersRemovedAsync當Teams的一個team中有用戶被移除

除了ConversationUpdateActivity這些Teams的特殊事件,handler還提供了一些Teams特有的invoke動作的處理

Invoke類型函數說明
CardAction.InvokeOnTeamsCardActionInvokeAsync關于卡片的動作,比如卡片上一個按鈕被點擊了
fileConsent/invokeOnTeamsFileConsentAcceptAsync用戶同意了上傳文件
fileConsent/invokeOnTeamsFileConsentAsync用戶要上傳文件.
fileConsent/invokeOnTeamsFileConsentDeclineAsync用戶拒絕了上傳文件.
actionableMessage/executeActionOnTeamsO365ConnectorCardActionAsyncO365連接器的卡片動作
signin/verifyStateOnTeamsSigninVerifyStateAsync登入驗證狀態
task/fetchOnTeamsTaskModuleFetchAsyncTeams的Task Module的獲取
task/submitOnTeamsTaskModuleSubmitAsyncTeams的Task Module的提交

上面表格中的OnTeamsFileConsentAsync實際上是OnTeamsFileConsentAcceptAsyncOnTeamsFileConsentDeclineAsync的一個綜合處理,你可以重載OnTeamsFileConsentAsync,或者分別重載 accept 和 decline 函數。下面的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.");}
}

對于喜歡把問題研究透徹的朋友可能會問,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);}...}
}

從上面的代碼里可以看到沒有什么特別的magic,TeamsActivityHandler重載了OnConversationUpdateActivityAsync,并且根據channelData.EventType判斷出不同teams的事件,然后調用相應的方法。對于invoke也類似,重載了OnInvokeActivityAsync,根據turnContext.Activity.Name來調用不同的方法。

回到我們的EchoBot代碼,讓EchoBot從TeamsActivityHandler繼承下來,然后我們可以添加OnTeamsChannelRenamedAsync方法。把EchoBot設置到Teams里,修改安裝了EchoBot的channel的名字,就可以看到這個方法被促發的。

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);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277935.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277935.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277935.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

取球博弈

兩個人玩取球的游戲。一共有N個球&#xff0c;每人輪流取球&#xff0c;每次可取集合{n1,n2,n3}中的任何一個數目。 如果無法繼續取球&#xff0c;則游戲結束。 此時&#xff0c;持有奇數個球的一方獲勝。 如果兩人都是奇數&#xff0c;則為平局。 假設雙方都采用最聰明的取法…

MySQL修改字符集

MySQL數據庫修改字符集,介紹一下修改的方法 1&#xff09;系統工具iconv #file filename #mysqldump --default-character-setutf8 >20180523xxx.sql #file 20180523xxx.sql #iconv -t utf8mb4 -c 20180523xxx.sql>20180523xxxutf8mb4.sql #file 20180523xxxutf8mb4.sql…

Teams Bot開發系列:Bot驗證

我們今天來說一下authentication&#xff0c;authentication一直是一個復雜的問題。bot里的authentication也不簡單。我們先來看一個概念&#xff1a;Bot Framework Token Service&#xff0c;根據官方定義&#xff0c;這個token service主要是&#xff1a; Facilitating the u…

堆排序

目錄 一、定義二、算法分析三、代碼地址一、定義 1.1 堆 ? 此處的堆&#xff0c;指數據結構中的堆。而不是內存中的那種內存堆&#xff0c;內存堆是基于數據結構的一種實現。堆的數據結構是一棵完全二叉樹&#xff0c;它有如下特點&#xff1a;&#xff08;具體參考下文鏈接&a…

Teams Bot開發系列:Middleware

middleware是目前一些framework比較流行的概念&#xff0c;通常一個開發框架需要提供一些可擴展可定制化的功能。所以middleware這種pattern就很實用。 熟悉asp.net core的開發可能第一個想到的就是asp.net core的middleware&#xff0c;如下圖&#xff1a; 當一個http reques…

如何獲取租戶中所有的Team

大家在使用Graph API開發Teams App的時候&#xff0c;有時候會需要獲取某個租戶Tenant的所有team&#xff0c;在寫這篇文章的時候Graph API并沒有提供這么一個功能&#xff0c;沒有一個類似于”GET /teams”的api。 在Micorsoft Graph官方文檔的已知問題中&#xff0c;也提到了…

mysql常用快速查詢修改操作

mysql常用快速查詢修改操作 一、查找并修改非innodb引擎為innodb引擎 # 通用操作 mysql> select concat(alter table ,table_schema,.,table_name, engineinnodb;) from information_schema.tables where table_schema not in (information_schema,mysql,performance_schem…

ElasticSearch教程——自定義分詞器(轉學習使用)

一、分詞器 Elasticsearch中&#xff0c;內置了很多分詞器&#xff08;analyzers&#xff09;&#xff0c;例如standard&#xff08;標準分詞器&#xff09;、english&#xff08;英文分詞&#xff09;和chinese&#xff08;中文分詞&#xff09;&#xff0c;默認是standard. s…

使用Azure Serverless來開發Teams App

Azure Function可以說比較早期的一個serverless服務&#xff0c;隨著這些年云服務的大行其道&#xff0c;Serverless在概念越來越火&#xff0c;什么叫serverless&#xff1f; Serverless computing (or serverless for short), is an execution model where the cloud provide…

Angular之RouterModule的forRoot與forChild

Angular 提供了一種方式來把服務提供商從模塊中分離出來&#xff0c;以便模塊既可以帶著 providers 被根模塊導入&#xff0c;也可以不帶 providers 被子模塊導入。 區別&#xff1a; forRoot creates a module that contains all the directives, the given routes, and the r…

關于 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh的解決辦法

關于 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh的解決辦法 記錄工作中遇到的問題 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh  由于遠程機器或者重組或者更新了ssh server導致本地記錄的驗證信…

使用AzureFunction開發最簡單的Teams Outgoing Webhook

上篇文章講了teams app的serverless架構&#xff0c;這篇主要講如何真正使用Azure Function來開發一個最最簡單的Teams Outgoing Webhook。 我們先登入azure的portal&#xff0c;創建一個azure function。我這里創建了一個名字叫outgoing-webhook的azure function。完成后如下…

Java 基礎 之 標識符

www.verejava.com/?id1699254… /* 標識符的命名規則: 1. 是以字母&#xff0c;數字&#xff0c;下滑線_和美元符號$ 組成 2. 不能以數字開頭 3. 區分大小寫 4. 不能是java的保留關鍵字 5. 最好是見名思意 */ public class Identifier {public static void main(String[] args…

Ubuntu宿主機與VMware中其他系統虛擬機的互通

Ubuntu做宿主機&#xff0c;VMware中創建Windows10&#xff0c;并且通過三種模式實現兩系統互通&#xff0c;其實并非是件難事。在有線網卡未接網線的環境下&#xff0c;關閉兩系統防火墻&#xff0c;基本遵從下文便可實現。 轉載&#xff1a;https://note.youdao.com/ynotesha…

使用Azure輕松實現Teams App的全球合規性

我在之前的一篇博客里面講了合規性對于我們Teams app是非常重要的&#xff0c;因為office365平臺就是面向全世界用戶的&#xff0c;我們開發的teams app一旦發布后&#xff0c;立刻就會有各國各地區的用戶來進行安裝使用&#xff0c;所以符合用戶所在地區的要求是非常重要的。 …

【php復習之】php創建數組的幾種方式

1、array()函數 1.1無key值 $arrarray(1,2,3,4); 1.2鍵值對 $arrarray( name>myj,age>18,phone>1888888888);1.3空數組 $arrarray(); 2、compact()函數 compact函數可以把變量轉換為數組。 $a aaa;$b bbb;$c ccc;$arr3 compact(a,b,c);輸出&#xff1a;{"a&q…

ADC知識(2)——直流參數(輸入電壓參考,參考電流輸入,積分非線性誤差,差分非線性誤差)...

目錄 四、 輸入參考電壓范圍 五、 參考電流 六、 非線性問題 差分非線性誤差 積分非線性 四、 輸入參考電壓范圍 大多數數據手冊中&#xff0c;將它定義為一個特定的參考電壓值&#xff0c;通常這個電壓作為 此轉換器最常用的參考電壓。在參考輸入電壓…

LuckyDraw app使用CosmosDB的成本分析

我在以前的博客里說過我的LuckyDraw app在數據存儲方面使用的是 Azure Table Storage&#xff0c;當時選擇這個的原因是成本考慮&#xff0c;因為它實在是便宜&#xff0c;對于我這種個人開發維護的免費的teams app來說&#xff0c;成本是一個很重要的考量點。 當然&#xff0…

React 重溫之 組件生命周期

生命周期 任何事物都不會憑空產生&#xff0c;也不會無故消亡。一個事物從產生到消亡經理的各個階段&#xff0c;我們稱之為 生命周期。 具體到我們的前端組件上來&#xff0c;一個組件的生命周期可以大體分為創建、更新、銷毀這個三個階段。 本文主要介紹React 的組件生命周期…

遷移聊天記錄到Teams

有一些朋友問我teams是否支持將其他平臺/系統里的聊天記錄遷移某個channel里&#xff0c;答案是肯定的&#xff0c;teams團隊在去年年中的時候就提供了這個功能。這個功能是通過graph api來完成的&#xff0c;我們今天就來看看如何遷移聊天記錄到teams里。 首先&#xff0c;我…