不会使用 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:

  1. Overriding methods starting with on.. and not ending in ..Event() (e.g. onTeamsMembersAdded()), or instead
  2. 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 }`);
        }
    });
}