Search code examples
node.jsbotframeworkmicrosoft-teams

Microsoft Bot - Node SDK: How to mention a user in Microsoft Teams


Trying to mention a user in Microsoft Teams using the NodeJs SDK:

I'm saving a ref. to the conversation and then restoring it. When restored, filling entities with - what I understand - it's a Mention object.

const message = "Konnichi wa";
const conversation = await .... // restored from db
await adapter.continueConversation(conversation, async (context) => {
  const topLevelMessage = MessageFactory.text(message);
  topLevelMessage.entities = [
    {
      type: "Mention", // have tried with "mention" as well
      mentioned: context.activity.from,
      text: `@${context.activity.from.name}`,
    },
  ];
  await context.sendActivity(topLevelMessage);
});

this code is actually sending to the emulator an activity with the expected data:

{
  "type": "message",
  "serviceUrl": "https://b9372952.ngrok.io",
  "channelId": "emulator",
  "from": {
    "id": "0c00d490-99db-11ea-a447-1de8c692dbf4",
    "name": "Bot",
    "role": "bot"
  },
  "conversation": {
    "id": "0e086460-99db-11ea-a447-1de8c692dbf4|livechat"
  },
  "recipient": {
    "id": "4c2e3fee-fb06-43a1-b9bb-279cc67ed6e6",
    "role": "user"
  },
  "text": "Konnichi wa",
  "inputHint": "...",
  "entities": [
    {
      "type": "Mention",
      "text": "@User",
      "mentioned": {
        "id": "4c2e3fee-fb06-43a1-b9bb-279cc67ed6e6",
        "name": "User",
        "role": "user"
      }
    }
  ],
  "replyToId": "...",
  "id": "...",
  "localTimestamp": "...",
  "timestamp": "...",
  "locale": "..."
}

But the shown activity is just a regular message with no mention at all. What am I missing?

=== EDIT ===

Another try has been using TextEncoder and <at> as this sample:

const encodedUserName = new TextEncoder().encode(context.activity.from.name);
const mention = {
    type: "mention",
    mentioned: context.activity.from,
    text: `<at>${encodedUserName}</at>`,
};

const topLevelMessage = MessageFactory.text(`${mention.text}: ${message}`);
topLevelMessage.entities = [mention];
await context.sendActivity(topLevelMessage);

Solution

  • Posting the final answer so anyone can copy-paste it quickly.

    await adapter.continueConversation(conversation, async (context) => {
        const encodedUserName = new TextEncoder().encode(context.activity.from.name);
        const mention = {
            type: "mention",
            mentioned: context.activity.from,
            text: `<at>${encodedUserName}</at>`,
        };
        const topLevelMessage = MessageFactory.text(`${message} ${mention.text}`);
        topLevelMessage.entities = [mention];
        await context.sendActivity(topLevelMessage);
    });