Search code examples
botframeworkmicrosoft-teams

What's the right way to handle message reactions in a notification only bot?


I have created a one way notification only bot in Teams (only personal scope), I am able to send proactive messages but however, when someone reacts to a message, Teams is showing a notification for the message which was reacted to. How do I prevent this behavior and just silently ignore the message reaction. I was hoping since it's a one way notification bot, there would be an option to disable it, but apparently there isn't.

I have a PHP REST API endpoint which is configured to be the bot endpoint address. This API is pretty basic and handles only certain types of requests like installationUpdate. For all other types, it just sends a HTTP 200 response with an empty body.

When the user first installs the App in teams, I am storing the conversationId, tenantId and the serviceUrl and later use these values to send notifications (proactive messages) when certain events happen in a web application. These are sent via a C# Console Application.

When a user reacts to a message, I get a request with the type messageReaction, this is where I am unable to figure out how to handle this so that the message reaction is ignored and does not cause a notification in Teams.

This is what my PHP REST API (bot endpoint) looks like

function onBotRequest() {
    if ($_SERVER['REQUEST_METHOD'] != 'POST') {
        http_response_code(404);
        return;
    }
    $requestJson = json_decode(file_get_contents('php://input'), true);
    if ($requestJson['channelId'] != 'msteams') {
        http_response_code(404);
        return;
    } elseif ($requestJson['type'] == 'installationUpdate') {
        $serviceUrl = $requestJson["serviceUrl"];
        $conversationId = $requestJson["conversation"]["id"];
        $tenantId = $requestJson["conversation"]["tenantId"];

        if ($requestJson['action'] == 'add') {
            // App installed 
            // Store conversationId, tenantId, serviceUrl in db
        } elseif($requestJson['action'] == 'remove') {
            // App uninstalled
            // Remove conversationId, tenantId, serviceUrl from db
        }
    } elseif ($requestJson['type'] == 'messageReaction') {
        // What should be sent as the response here to ignore the message reaction?
    }
    header('Content-Type: application/json');
    http_response_code(200);
}

The code used for sending proactive messages

var credentials = new MicrosoftAppCredentials(appId, appPassword);
var connectorClient = new ConnectorClient(new Uri(serviceUrl), credentials);
var response = await connectorClient.Conversations.SendToConversationAsync(conversationId, activity);

I tried sending different HTTP status codes like 400 but irrespective of the response status code, the notification still occurs. I guess I am missing some required params in the response body, but I couldn't find any documentation.


Solution

  • Removing the call to TeamsNotifyUser will prevent Teams sending notifications when message reactions are added/removed.