Moblize IT
Moblize IT

Reputation: 1328

ms bot framework onMembersAddedActivity does not get invoked using nodejs

i am using nodejs google cloud functions with ms bot framework. I have the invoke code looks like below:

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)
    });
});

the teams class looks like below:

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();
        });
    }

Whenever i send a message to the bot the this.onMessage is getting invoked. However, when i add a new member to a group where my bot is already present, the onMembersAddedActivity is not invoked. what i am missing here?

Upvotes: 0

Views: 416

Answers (1)

mdrichardson
mdrichardson

Reputation: 7241

This is partially an issue in our docs and code comments, which I addressed here and here, respectively. The other issue is that you're using <method>Activity() instead of <method>Event().

The latest instructions are in the code comments, which just got merged, but basically,

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()).

So, for you, you can either:

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();
    });
}

or

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 }`);
        }
    });
}

Upvotes: 3

Related Questions