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.mzph.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;我…