Search code examples
botframeworkbotsmicrosoft-teamsazure-bot-service

UpdateActivity throws 400 "Unknown activity type"


I do have a Bot that is reachable via MS Teams. The bot sends an Adaptive Card with some Text and a submit-action. When the user clicks on this submit-action, I want to proceed the input and then update the prior sent Adaptive card via calling context.updateActivity. According to documentation, I can use activity.Id = turnContext.Activity.ReplyToId; to specify the message I want to update. But the call of context.updateActivity results in a 400 HTTP error, the message is "Unknown activity type".

Some investigation:

  • This error occurs when I want to send another Adaptive Card and when I want to send plain text
  • I verified, that the id of sendActivity is the same as turnContext.Activity.ReplyToId

Any idea?

Here is my code:

Adaptive Card

{
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "type": "AdaptiveCard",
    "version": "1.0",
    "body": [
        {
            "type": "TextBlock",
            "text": "Some text",
            "wrap": true
        },
        {
            "type": "Input.ChoiceSet",
            "id": "Feedback",
            "value": "",
            "style": "compact",
            "placeholder": "Wie hilfreich war diese Antwort?",
            "choices": [
                {
                    "title": "⭐",
                    "value": "1"
                },
                {
                    "title": "⭐⭐",
                    "value": "2"
                },
                {
                    "title": "⭐⭐⭐",
                    "value": "3"
                },
                {
                    "title": "⭐⭐⭐⭐",
                    "value": "4"
                },
                {
                    "title": "⭐⭐⭐⭐⭐",
                    "value": "5"
                }
            ]
        }
    ],
    "actions": [
        {
            "title": "Feedback absenden",
            "type": "Action.Submit"
        }
    ]
}

Sending the message:

private handleMessage = async (context: TurnContext, next: () => Promise<void>): Promise<void> => {
    const adaptiveCard = AdaptiveCardFactory.createAdaptiveCardFromTemplateAndData(AnswerWithFeedbackCard);
    const result = await context.sendActivity({ attachments: [adaptiveCard] });
    console.error("send msg with id " + result?.id);
}

code to update the message:

private handleMessage = async (context: TurnContext, next: () => Promise<void>): Promise<void> => {
    console.error("received msg with id  " + context.activity.replyToId);
    if (context.activity.value && !context.activity.text) {
        const updatedCard = CardFactory.adaptiveCard(this.botConfig.updatedCard);
        await context.updateActivity({ text: "updated :)", id: context.activity.replyToId});
        //or
        await context.updateActivity({ attachments: [updatedCard], id: context.activity.replyToId});
    }
}


Solution

  • Got it!

    const att = AdaptiveCardFactory.createAdaptiveCardFromTemplateAndData(AnswerWithAnsweredFeedbackCard, {
        answer: "Mir geht's super, danke der Nachfrage!",
        starsCount: context.activity.value.Feedback
    });
    const id = await context.updateActivity( { attachments: [ att ], id: context.activity.replyToId} );
    

    This does not work, but this does:

    const att = AdaptiveCardFactory.createAdaptiveCardFromTemplateAndData(AnswerWithAnsweredFeedbackCard, {
        answer: "Mir geht's super, danke der Nachfrage!",
        starsCount: context.activity.value.Feedback
    });
    const msg = MessageFactory.attachment( att )
    msg.id = context.activity.replyToId;
    const id = await context.updateActivity( msg )
    

    So, you need to save the save the sent msg in a variable and set the id of this variable instead of using the "inplace"-implementation of updateActivity