我的代码有一个简单的卡片轮播,它有如下所示的操作按钮:
actions = [
{
"type": "Action.Submit",
"title": "Qualify",
"data": { "action" : "qualify_lead" }
},
{
"type": "Action.OpenUrl",
"title": "Retire",
"url": "{viewUrl}"
},
{
"type": "Action.ShowCard",
"title": "Add Note",
"card": this.noteCard(item.LeadId, "leads")
}
]
我有一种方法来处理如下所示qualify_lead操作
async qualifyLead(context:any){
console.log("in qualifyLead:" + JSON.stringify(context.activity))
await context.updateActivity(this.successCard('Lead is qualified'))
}
我故意做的只是用简单的短信替换整个轮播。但它失败并显示错误:
错误:BotFrameworkAdapter.updateActivity((:缺少 activity.id
我从哪里得到这个?
我为此使用谷歌火力基地,包装器代码如下所示
const {
TurnContext,
TeamsActivityHandler,
CardFactory,
AttachmentLayoutTypes,
ActionTypes
} = require('botbuilder');
class TeamsConversationBot extends TeamsActivityHandler {
constructor() {
super();
this.leadState =
this.conversationState.createProperty('leadCarouselState');
this.onMessage(async (context:any, next:any) => {
TurnContext.removeRecipientMention(context.activity);
let msg = context.activity.text
const action = context.activity.value
let objNum = ''
let keyword = ''
if(msg === undefined && action === undefined)
msg = 'help'
else if(msg !== undefined){
msg = msg.trim().toLowerCase()
if(msg.indexOf("help") > -1)
msg = 'help'
else{
if(msg.startsWith('lead')){
msg = 'lead'
}
}
}
switch (msg) {
case 'lead':
await this.lead(context, userKey, platform)
break;
case 'qualify_lead':
await this.qualifyLead(context)
break;
}
await next();
});
}
我不确定this.successCard('Lead is qualified')
到底是做什么的,但大概它返回了一个活动。据我所知,为了使此活动替换另一个活动,您需要设置其 Id 属性以匹配上一条消息。这意味着,当您发送上一条消息(即卡片(时,您需要捕获从上下文上的 send 方法返回的引用(例如进入机器人状态(,然后将其用于此新活动。
正如我在回答您的另一个问题时所解释的那样,您需要将活动 ID 保存在机器人状态中,然后将其应用于要发送的更新。机器人框架无法更新活动,除非你告诉它要更新哪个活动,并且你使用活动 ID 执行此操作。
这是保存 ID 的部分:
const dict = await this.carouselState.get(turnContext, {}); dict[batchId] = { [KEYACTIVITYID]: response.id, [KEYLEADS]: leads };
这是将其应用于更新活动的部分:
const update = this.createCarousel(batchId, leads); update.id = info[KEYACTIVITYID];