不会使用 nodejs 调用 ms bot 框架 onMembersAddedActivity
ms bot framework onMembersAddedActivity does not get invoked using nodejs
我正在使用 nodejs google 云函数和 ms bot 框架。我的调用代码如下所示:
const BotFrameworkAdapter = require('botbuilder').BotFrameworkAdapter
const { TeamsConversationBot } = require('./flashmsteamsbot');
const msadapter = new BotFrameworkAdapter({
appId: 'XXX',
appPassword: 'XXX'
});
const msteamsbot = new TeamsConversationBot()
const app = express();
app.post('/api/messages', (req:any, res:any) => {
msadapter.processActivity(req, res, async (context:any) => {
// Route to main dialog.
await msteamsbot.run(context)
});
});
团队 class 如下所示:
const {
TurnContext,
TeamsActivityHandler,
CardFactory,
AttachmentLayoutTypes,
ActionTypes
} = require('botbuilder');
class TeamsConversationBot extends TeamsActivityHandler {
constructor() {
super();
this.onMessage(async (context:any, next:any) => {
TurnContext.removeRecipientMention(context.activity);
let msg = context.activity.text
const senderId = context.activity.from.aadObjectId
switch (msg) {
case 'don1':
await this.don1(context, keyword.trim(), userKey)
break;
default:
await this.help(context)
break;
}
await next();
});
this.onMembersAddedActivity(async (context:any, next:any) => {
functions.logger.log("start of onMembersAddedActivity", context)
context.activity.membersAdded.forEach(async (teamMember:any) => {
if (teamMember.id !== context.activity.recipient.id) {
await context.sendActivity(`Welcome to the team ${ teamMember.givenName } ${ teamMember.surname }`);
}
});
await next();
});
}
每当我向机器人发送消息时,this.onMessage 就会被调用。但是,当我将新成员添加到我的机器人已经存在的组时,不会调用 onMembersAddedActivity。我在这里缺少什么?
这分别是 an issue in our docs and code comments, which I addressed here and here 的一部分。另一个问题是您使用的是 <method>Activity()
而不是 <method>Event()
.
最新的说明在刚刚合并的 code comments 中,但基本上,
Developers may handle Conversation Update activities sent from Microsoft Teams via two methods:
- Overriding methods starting with
on..
and not ending in ..Event()
(e.g. onTeamsMembersAdded()
), or instead
- Passing callbacks to methods starting with
on..
and ending in ...Event()
(e.g. onTeamsMembersAddedEvent()
),
to stay in line with older {@link ActivityHandler} implementation.
Developers should use either #1 or #2, above for all Conversation Update activities and not both #2 and #3 for the same activity. Meaning,
developers should override onTeamsMembersAdded()
and not use both onTeamsMembersAdded()
and onTeamsMembersAddedEvent()
.
Developers wanting to handle Invoke activities must override methods starting with handle...()
(e.g. handleTeamsTaskModuleFetch()
).
因此,对于您来说,您可以:
constructor() {
[...]
// This is passing in a callback
this.onTeamsMembersAddedEvent(async (
membersAdded: TeamsChannelAccount[],
teamInfo: TeamInfo,
context: TurnContext,
next: () => Promise<void>) => {
functions.logger.log("start of onMembersAddedActivity", context)
context.activity.membersAdded.forEach(async (teamMember:any) => {
if (teamMember.id !== context.activity.recipient.id) {
await context.sendActivity(`Welcome to the team ${ teamMember.givenName } ${ teamMember.surname }`);
}
});
await next();
});
}
或
constructor() {
[...]
}
[...]
// This is an override
async onTeamsMembersAdded(context: TurnContext): Promise<void> {
functions.logger.log("start of onMembersAddedActivity", context)
context.activity.membersAdded.forEach(async (teamMember:any) => {
if (teamMember.id !== context.activity.recipient.id) {
await context.sendActivity(`Welcome to the team ${ teamMember.givenName } ${ teamMember.surname }`);
}
});
}
我正在使用 nodejs google 云函数和 ms bot 框架。我的调用代码如下所示:
const BotFrameworkAdapter = require('botbuilder').BotFrameworkAdapter
const { TeamsConversationBot } = require('./flashmsteamsbot');
const msadapter = new BotFrameworkAdapter({
appId: 'XXX',
appPassword: 'XXX'
});
const msteamsbot = new TeamsConversationBot()
const app = express();
app.post('/api/messages', (req:any, res:any) => {
msadapter.processActivity(req, res, async (context:any) => {
// Route to main dialog.
await msteamsbot.run(context)
});
});
团队 class 如下所示:
const {
TurnContext,
TeamsActivityHandler,
CardFactory,
AttachmentLayoutTypes,
ActionTypes
} = require('botbuilder');
class TeamsConversationBot extends TeamsActivityHandler {
constructor() {
super();
this.onMessage(async (context:any, next:any) => {
TurnContext.removeRecipientMention(context.activity);
let msg = context.activity.text
const senderId = context.activity.from.aadObjectId
switch (msg) {
case 'don1':
await this.don1(context, keyword.trim(), userKey)
break;
default:
await this.help(context)
break;
}
await next();
});
this.onMembersAddedActivity(async (context:any, next:any) => {
functions.logger.log("start of onMembersAddedActivity", context)
context.activity.membersAdded.forEach(async (teamMember:any) => {
if (teamMember.id !== context.activity.recipient.id) {
await context.sendActivity(`Welcome to the team ${ teamMember.givenName } ${ teamMember.surname }`);
}
});
await next();
});
}
每当我向机器人发送消息时,this.onMessage 就会被调用。但是,当我将新成员添加到我的机器人已经存在的组时,不会调用 onMembersAddedActivity。我在这里缺少什么?
这分别是 an issue in our docs and code comments, which I addressed here and here 的一部分。另一个问题是您使用的是 <method>Activity()
而不是 <method>Event()
.
最新的说明在刚刚合并的 code comments 中,但基本上,
Developers may handle Conversation Update activities sent from Microsoft Teams via two methods:
- Overriding methods starting with
on..
and not ending in..Event()
(e.g.onTeamsMembersAdded()
), or instead- Passing callbacks to methods starting with
on..
and ending in...Event()
(e.g.onTeamsMembersAddedEvent()
), to stay in line with older {@link ActivityHandler} implementation.
Developers should use either #1 or #2, above for all Conversation Update activities and not both #2 and #3 for the same activity. Meaning, developers should override
onTeamsMembersAdded()
and not use bothonTeamsMembersAdded()
andonTeamsMembersAddedEvent()
.
Developers wanting to handle Invoke activities must override methods starting with
handle...()
(e.g.handleTeamsTaskModuleFetch()
).
因此,对于您来说,您可以:
constructor() {
[...]
// This is passing in a callback
this.onTeamsMembersAddedEvent(async (
membersAdded: TeamsChannelAccount[],
teamInfo: TeamInfo,
context: TurnContext,
next: () => Promise<void>) => {
functions.logger.log("start of onMembersAddedActivity", context)
context.activity.membersAdded.forEach(async (teamMember:any) => {
if (teamMember.id !== context.activity.recipient.id) {
await context.sendActivity(`Welcome to the team ${ teamMember.givenName } ${ teamMember.surname }`);
}
});
await next();
});
}
或
constructor() {
[...]
}
[...]
// This is an override
async onTeamsMembersAdded(context: TurnContext): Promise<void> {
functions.logger.log("start of onMembersAddedActivity", context)
context.activity.membersAdded.forEach(async (teamMember:any) => {
if (teamMember.id !== context.activity.recipient.id) {
await context.sendActivity(`Welcome to the team ${ teamMember.givenName } ${ teamMember.surname }`);
}
});
}