上一篇文章我们解析了 teams bot 的主体代码逻辑,深入的了解它是怎么运作起来的。我们这篇文章来详细讲一下 adaptive card 在 Teams 里的互动,我们用上一个 app 里的 learn 卡片为例。

我们先运行我们的 Hello World Bot,然后给bot发送 learn 文字后,会等到一个回复的卡片,卡片上的 Like Count 是 0,我们点击一下 “I Like This!” 按钮。

稍等 1,2 秒后,我们就可以看到这个卡片的刷新了,Like Count 变成了 1。

再多点击几次后,数字会一直增加。

这实际上就让 bot 和用户之间有了一种互动,用户可以通过 adaptive card 上的按钮和 bot 进行沟通。

我们来看一下这是怎么做到的。先打开 learn.json 文件,看看这个卡片有什么特别的地方。

可以看到,在卡片的json文件中,那个数字是一个 placeholder ${likeCount},我们后面会讲它是怎么和代码联动的。对于 “I Like This!” 按钮,它的 type 是 Action.Execute,verb 是 userlike,fallback 是 Action.Submit,看到这里我们可以隐隐约约感觉到它像是给 bot 发了一个指令,让bot 去 execute 一个叫 userlike的指令。

    {"type": "Action.Execute","title": "I Like This!","verb": "userlike","fallback": "Action.Submit"}

我们再来看一下 teamsBot.ts 里的代码,看看它是如何和 adaptive card 联动的。由于这个文件比较长,我挑了和这个操作相关的代码,让大家看得更加清楚简单一些。

import rawLearnCard from "./adaptiveCards/learn.json";export interface DataInterface {likeCount: number;
}export class TeamsBot extends TeamsActivityHandler {// record the likeCountlikeCountObj: { likeCount: number };constructor() {super();this.likeCountObj = { likeCount: 0 };this.onMessage(async (context, next) => {let txt = context.activity.text;switch (txt) {case "learn": {this.likeCountObj.likeCount = 0;const card = AdaptiveCards.declare<DataInterface>(rawLearnCard).render(this.likeCountObj);await context.sendActivity({ attachments: [CardFactory.adaptiveCard(card)] });break;}}});}async onAdaptiveCardInvoke(context: TurnContext,invokeValue: AdaptiveCardInvokeValue): Promise<AdaptiveCardInvokeResponse> {// The verb "userlike" is sent from the Adaptive Card defined in adaptiveCards/learn.jsonif (invokeValue.action.verb === "userlike") {this.likeCountObj.likeCount++;const card = AdaptiveCards.declare<DataInterface>(rawLearnCard).render(this.likeCountObj);await context.updateActivity({type: "message",id: context.activity.replyToId,attachments: [CardFactory.adaptiveCard(card)],});return { statusCode: 200, type: undefined, value: undefined };}}
}

首先代码里先申明了一个 interface DataInterface,这个主要是为了填充 adaptive card 里的那个placeholder ${likeCount} 所使用。

在 class TeamsBot 里先弄了一个 likeCountObj: { likeCount: number }likeCountObject 实际上是一个 interface DataInterface 的实例,它记录了一共被 like 了几次,我觉得这句改成 likeCountObj: DataInterface; 更加清楚,所以我 raise 了一个 pr 给微软产品组 https://github.com/OfficeDev/TeamsFx-Samples/pull/491,看看能不能 merge 成功。

在 TeamsBot 的构造函数中,当用户发送了 learn 文字后,新建了一个 card,并且把当前的 like count 值填入到 card 中。由于 DataInterface 里的 likeCount 的名字和 json 里的placeholder 的名字 ${likeCount} 一致,所以这个 placeholder 就被赋值了 0。

const card = AdaptiveCards.declare<DataInterface>(rawLearnCard).render(this.likeCountObj);

然后就把卡片加到 activity 里,发送给用户。

await context.sendActivity({ attachments: [CardFactory.adaptiveCard(card)] });

当用户点击的 “I Like This!” 按钮后,onAdaptiveCardInvoke() 函数被触发,可以从代码清楚的看到,如果 verb 是 userlike,就把like计数器加一,然后通过 context.updateActivity() 来更新这个卡片。

看到这里我想大家已经清楚的明白了前后的逻辑和他们关联的方式。那我们就模仿这个来扩展一下,我们打开 learn.json,在 “I Like This!” 后增加另一个按钮 “Reset Like Count”

    {"type": "Action.Execute","title": "Reset Like Count","verb": "resetlike","fallback": "Action.Submit"},

然后在 teamsBot.ts 文件里刚才处理 userlike 的后面再加上一段:

    if (invokeValue.action.verb === "userlike") {...}else if (invokeValue.action.verb === "resetlike") {this.likeCountObj.likeCount == 0;const card = AdaptiveCards.declare<DataInterface>(rawLearnCard).render(this.likeCountObj);await context.updateActivity({type: "message",id: context.activity.replyToId,attachments: [CardFactory.adaptiveCard(card)],});return { statusCode: 200, type: undefined, value: undefined };}

运行程序后,就能看到多了一个按钮,点击 “Reset Like Count” 按钮后,就能够重置 like 计数器。

所以 teams bot 并不是一个非常难的东西,通过我们对代码一步步的解析,然后做一些简单修改,希望各位读者大致明白了 bot 运行的机理。

Teams Bot App 用户互动相关推荐

  1. Teams Bot App 代码解析

    上一篇文章我们讲了如何使用 teams toolkit 来快速弄一个 teams bot,可以看到 toolkit 给我们提供了极大的方便性,让开发人员可以更好的把重心放在 coding 上,而不是各 ...

  2. Teams Bot App 初探

    上一篇文章深入讲了incoming webhook.这篇文章我们来看一个稍微复杂点的,正式点的 teams app:bot. 我们先来和之前一样,通过teams toolkit 的 sample ga ...

  3. Teams Bot App Manifest 文件解析

    这篇文章我们继续以 Hello World Bot 这个 sample 来讲一下 manifest template. 实际上在 Teams app 开发的时候,有 manifest 的概念,mani ...

  4. Teams Bot如何判断用户所在的时区

    一说到时间,就会联想到时区,夏令时等头痛的问题,不同国家有不同国家的规定.如果你希望你的Teams Bot可以判断出当前用户所在的时区,从而可以针对性的进行一些处理时,你要做好心理准备,这个复杂程度远 ...

  5. 你知道的APP中,有哪些比较好用有特色的用户互动功能(指用户可以参与进来的功能,比较常见的如评论、关注、投票、聊天室等)?你觉得一个功能具有什么特征,才会让用户愿意互动进来?

    比较好用有特色的用户互动功能 1.微信公众号文章的"在看": 向好友展示了自己最近在看的文章,是另一种展现自己的方式:朋友可以对你的"在看"点赞,可以对你&qu ...

  6. Teams Meeting App的 task 弹出框

    前几篇文章我们介绍了 Teams Meeting App 的各种类型和如何从无到有的使用 net6 和 c# 来开发一个 Teams Meeting app,那今天我们开始讨论一些 meeting a ...

  7. 如何开发Teams Bot

    很多朋友问我如何开发一个成功的Teams Bot,他们说Bot Framework SDK看起来简单,但是真要的去开发一款成熟的bot,很多地方还是不知道如何使用.我从最早的bot framework ...

  8. Teams bot的调用限制

    上个月Teams团队发布了对Teams app/bot调用api的频率的限制.这也从侧面说明Teams app越来越多,Teams团队需要优先保证Teams本身的计算资源,来提供流畅的用户体验. 具体 ...

  9. 什么是Microsoft Teams的App Studio

    Teams的app studio很多用户可能不知道,但是对于一个teams平台的开发人员来说,这个是开发利器,利用这个工具你可以轻松的配置manifest文件,可以轻松的一站式创建teams app所 ...

最新文章

  1. mechanism and analysis
  2. 同学们对《现代软件工程》课程的意见
  3. 16节课搞懂大数据,视频教程限时免费领取
  4. 使用lex与yacc词法语法工具进行简单的SQL语义检查
  5. ios系统软件迁移到安卓_苹果系统怎么把文件转到安卓手机?
  6. Matlab 绘制直方图、面积图、饼图、针状图
  7. S.O. 推出程序员身价计算器,看看自己值多少钱?
  8. 产品经理的23个OKR案例(下)
  9. Azure CDN 服务详解
  10. PIPIOJ 1169: PIPI倒水
  11. RFID电子标签打印机如何维护
  12. linux配置ftp错误530,ubuntu16安装配置ftp服务(和530错误解决)
  13. seo外包公司可以为企业带来什么好处
  14. CSS,font-family,好看的中文字体
  15. 螺栓、螺柱、螺钉的分类
  16. JAVA毕业生就业信息管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  17. 第一部分 思科九年 一(2)
  18. 软件工程系列- 软件开发的可行性研究
  19. [Window] Windows批处理(cmd/bat)常用命令小结
  20. 绘制一个具备基本功能的计算机模型原理图,数字信号处理仿真实验二

热门文章

  1. 微信小程序轨迹回放实现及遇到的坑
  2. 完结撒花!吴恩达DeepLearning.ai《深度学习》课程笔记目录总集
  3. criteo marketing api 相关
  4. SAP ABAP 关于SMARTFORMS打印中英文时候出现乱码的问题
  5. larval 策略模式
  6. vue元素显示隐藏 v-if 和 v-show 指令
  7. android 怎么看架构,怎么查看手机设备架构
  8. uniApp使用高德地图api
  9. 2019年9月省市区/县SQL数据——第二篇
  10. 实时语音趣味变声,大叔变声“妙音娘子”Get一下