Teams Bot如何解析和发送 at 用户

之前有好些看博客的开发者问我有什么较好的方法来解析 at 信息。用户在channel里发消息给 bot 的时候,通常需要 at bot的名字,当然在消息文字中可能还会 at 其他用户,比如 bot的名字是 MyBot,那 bot 收到的 Activity 里的 Text 值类似于:

<at>MyBot</at> 请帮我查看一下 <at>Tom</at> 的明天有空时间。

可以看到 Teams 使用了 at tag 来把用户 at 的信息包含起来。

看到这里,大家可能会想,这个简单啊,可以分析一下字符串,把 <at> 的内容find到,然后在找到结束的 tag </at> 。但是如果你仔细想想,怎么写循环,也不简单把,至少需要 5 到 10 行的c#代码,可能大家还会想到使用正则表达式,对,正则会简单一些,但是你要快速的写出这个正则表达式也不是特别简单的事情。

另外,我们还需要考虑一些转义的字符,是不是瞬间觉得也不简单了。

解析 at 信息

好在 bot 的 sdk 给我们提供了一个简单的方法。

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{Mention[] mentions = turnContext.Activity.GetMentions();if(mentions != null){foreach (var mention in mentions){...}}
}

GetMentions 是一个 Activity 的扩展方法,里面具体的实现可以到 sdk 的源代码里找到。这个方法会返回一个 Mention 的数组

public class Mention
{...public ChannelAccount Mentioned { get; set; }...
}public class ChannelAccount
{...public string Name { get; set; }...
}

从上面的代码可以看到,我可以通过 Mentioned 的 Name 来获取被 at 的对象的名字。

var name = mention.Mentioned.Name

发送 at 信息

除了解析,sdk 当然也提供了发送 at 信息的方法,如下:

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{var mention = new Mention{Mentioned = turnContext.Activity.From,Text = $"<at>{XmlConvert.EncodeName(turnContext.Activity.From.Name)}</at>",};var replyActivity = MessageFactory.Text($"Hello {mention.Text}.");replyActivity.Entities = new List<Entity> { mention };await turnContext.SendActivityAsync(replyActivity, cancellationToken);
}

从上面的额代码里可以看到,发送 at 信息并不是很简单,还是需要我们自己来组建一个 Mention 的对象,然后把这个对象放如到回复的 activity 的 Entities 属性里。

特别需要注意的一点是:需要 at 的人的名字,需要做 xml encode,来确保不会因为 name 里有特殊的字符,而导致整个text不合法。

看到这里,大家是不是对 at 的机制有了进一步的深入理解? :)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Elemet-ui组件Cascader中proper的配置问题

最近做一个地区的二级联动用上了Cascader组件&#xff0c;但是我的城市数据结构跟他 options的默认的结构不太一样&#xff1b; 默认的结构如下&#xff1a; 我的数据结构是&#xff1a; 先说我的解决办法&#xff1a; 一看我的数据结构跟他默认的数据结构不对劲&#xff0c;我…

将Teams app升级到net6

net6 发布已经有一个多月了&#xff0c;因为我的LuckyDraw app是使用Azure app service&#xff0c;当时我查了一下app service还没有ready&#xff0c;昨天我又查看了一下&#xff0c;发现app service已经默认装了net6。 那就是时候升级我的LuckyDraw了&#xff0c;如果大家的…

作为程序猿,一定要知道的电脑快捷键和Eclipse快捷键

2019独角兽企业重金招聘Python工程师标准>>> 转载自&#xff1a;Java资源社区 1. F2 当你选中一个文件的话&#xff0c;这意味着“重命名”2. F5 刷新3. CTRLF5 强行刷新4. F12另存为5. Alt &#xff0b;F4 关闭程序6. Home首行7. Ctrl Home游标移动到文字编辑的开…

QCustomplot(一) 能做什么事

阅读目录 一、QCustomPlot简介二、效果预览三、源码下载四、相关文章回到顶部一、QCustomPlot简介 之前在Qt之自绘制饼图这篇文章的说明中我简单的描述了下目前依赖于qt的第三方绘图库&#xff0c;此后我会针对自己使用QCustomPlot的情况做一总结&#xff0c;以方便大家参考 QC…

在Teams app代码中enable nullable

昨天讲了一下如何把代码升级到 net6&#xff0c;今天我优化了好几个小时更新代码&#xff0c;enable了nullable。 c#的nullable我一直非常喜欢&#xff0c;它可以帮助开发人员&#xff0c;让开发人员去思考&#xff0c;哪些地方需要可以为null&#xff0c;哪些地方不需要。它并…

shiro(一)简介、理论知识

2019独角兽企业重金招聘Python工程师标准>>> 开涛学shiro&#xff1a;http://jinnianshilongnian.iteye.com/blog/2018398 shirospirngmvc参考: https://www.cnblogs.com/sharpest/p/5865732.html http://peirenlei.iteye.com/blog/2086639 https://blog.csdn.net/c…

2019.04.24笔记

*&#xff09;关于swing 今天同学误解了我的意思&#xff0c;以为我要用java代码做页面和图形&#xff0c;给我推荐了swing。 swing真是眼熟&#xff0c;大学课程里的。通过后台代码操作页面和图形。记得当年大学时&#xff0c;swing就已经沦为一种过时的技术了。到现在&#x…

Teams 的 Meeting App

Teams 的 Meeting App 已经正式推出了一段时间&#xff0c;相应的文档也已经较为完善了&#xff0c;我接下来会写一系列的文章&#xff0c;来介绍如何开发一个自己的Meeting app。这篇文章作为这个系列的第一篇&#xff0c;将介绍 meeting app 是如何被使用的&#xff0c;有哪些…

Github上最受欢迎的Python轻量级框架Flask入门

flask最近终于发布了它的1.0版本更新&#xff0c;从项目开源到最近的1.0版本flask已经走过了8个年头。# app.py from flask import Flask app Flask(__name__)app.route("/") def hello():return "Hello World!"if __name__ "__main__":app.ru…

mysql表关联

mysql的表关联&#xff1a; left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 inner join(等值连接) 只返回两个表中联结字段相等的行 转载于:https://www.cnblogs.com/bloghua…

开发第一个Meeting App

今天我们来看一下如何使用c# net6 来开发一个 teams的 meeting app。首先先确保本地安装了最新版本的 net6。创建一个目录&#xff0c;然后在目录下输入下面的命令行&#xff0c;让 dotnet 来生成一个初步的asp.net core 代码框架。 dotnet new razor代码框架生成如下的目录和…

solrCloud搭建

一.什么是solrCloud&#xff1f; SolrCoud(solr云)是solr提供的分布式搜索方案。当一个系统搜索请求并发很高的时候&#xff0c;就需要使用solrCloud来满足这些需求 solrCloud是基于solr和zookeeper的分布式的搜索方案&#xff0c;它的主要思想是使用zookeeper作为挤集群配置的…

Linux 添加新用户账号并赋予root权限

除了root用户之外&#xff0c;通常需要为每个管理创建各自的用户账号&#xff0c;方便每个管理员登录使用&#xff0c; 步骤如下&#xff1a; 1. 添加新用户账号 useradd mary.lee 2. 为新用户账号设置密码 passwd mary.lee 3. 为新用户账号赋予root权限 usermod -a -G root…

如何获取 Teams Meeting 的上下文信息

我们上一篇文章讲了如果使用 net6 和 c# 来快速开发一个最简单的 teams meeting app。为了让大家比较容易理解&#xff0c;上个sample非常简单&#xff0c;简单到没有什么功能&#xff0c;那我们现在就来慢慢扩展这个app的功能&#xff1a;看看如何获取 meeting 的上下文。 打…

php的运行流程

1、Zend引擎&#xff1a;Zend整体用纯C实现&#xff0c;是PHP的内核部分&#xff0c;他将PHP代码翻译&#xff08;词法、语法解析等一系列编译过程&#xff09;为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构&#xff08;如&#xff1a;hashtable、OO&#x…

内置方法

isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object):pass obj Foo() isinstance(obj, Foo) issubclass(sub, super)检查sub类是否是 super 类的派生类 class Foo(object):pass class Bar(Foo):pass issubclass…

会议中的Meeting App

接着我们上两篇博客文章&#xff0c;我们说了如何开发会议前和会议后的 meeting app&#xff0c;那如何开发一个会议中的 app 呢&#xff0c;实际上比较简单&#xff0c;我们只需要在 tab 的配置项中勾选下面这两个选项即可。 勾选后&#xff0c;我们安装app到我们的一个会议中…

0-2岁的app开发人员必读,Android开发APP前的准备事项

2019独角兽企业重金招聘Python工程师标准>>> 随着移动互联网的兴起&#xff0c;各行各业对移动应用的需求越来越大&#xff0c;从事APP开发的人也越来越多&#xff0c;APP开发行业可以说是方兴未艾。APP开发是比较复杂的事情&#xff0c;涉及产品、美工设计、服务器…

FixedThreadPool吞掉了异常

为了方便遍描述问题&#xff0c;如下是简化后的 public class RunException {public static void main(String[] args) { ExecutorService readerPool Executors.newFixedThreadPool(3); readerPool.submit(new Runnable() { public void run() { throw new RuntimeException(…

Teams Meeting App的 task 弹出框

前几篇文章我们介绍了 Teams Meeting App 的各种类型和如何从无到有的使用 net6 和 c# 来开发一个 Teams Meeting app&#xff0c;那今天我们开始讨论一些 meeting app 的高级互动&#xff1a; task 弹出框。我们先来快速修改一下之前的代码&#xff0c;看看什么是 task 弹出框…