From 5dd0248e16522a3672c58a7892d549840257e8dd Mon Sep 17 00:00:00 2001
From: dec05eba <dec05eba@protonmail.com>
Date: Sun, 22 Nov 2020 10:29:58 +0100
Subject: Matrix: add reactions

---
 src/plugins/Matrix.cpp | 37 +++++++++++++++++++++++++------------
 1 file changed, 25 insertions(+), 12 deletions(-)

(limited to 'src/plugins')

diff --git a/src/plugins/Matrix.cpp b/src/plugins/Matrix.cpp
index 6dabad9..e5e4922 100644
--- a/src/plugins/Matrix.cpp
+++ b/src/plugins/Matrix.cpp
@@ -1754,19 +1754,30 @@ namespace QuickMedia {
         std::string related_event_id;
         const rapidjson::Value &relates_to_json = GetMember(*content_json, "m.relates_to");
         if(relates_to_json.IsObject()) {
-            const rapidjson::Value &replaces_event_id_json = GetMember(relates_to_json, "event_id");
+            const rapidjson::Value &relates_to_event_id_json = GetMember(relates_to_json, "event_id");
             const rapidjson::Value &rel_type_json = GetMember(relates_to_json, "rel_type");
-            if(replaces_event_id_json.IsString() && rel_type_json.IsString() && strcmp(rel_type_json.GetString(), "m.replace") == 0) {
-                related_event_id = replaces_event_id_json.GetString();
+            const rapidjson::Value &in_reply_to_json = GetMember(relates_to_json, "m.in_reply_to");
+            const rapidjson::Value &key_json = GetMember(relates_to_json, "key");
+            if(relates_to_event_id_json.IsString() && rel_type_json.IsString() && strcmp(rel_type_json.GetString(), "m.replace") == 0) {
+                related_event_id = relates_to_event_id_json.GetString();
                 related_event_type = RelatedEventType::EDIT;
-            } else {
-                const rapidjson::Value &in_reply_to_json = GetMember(relates_to_json, "m.in_reply_to");
-                if(in_reply_to_json.IsObject()) {
-                    const rapidjson::Value &in_reply_to_event_id = GetMember(in_reply_to_json, "event_id");
-                    if(in_reply_to_event_id.IsString()) {
-                        related_event_id = in_reply_to_event_id.GetString();
-                        related_event_type = RelatedEventType::REPLY;
-                    }
+            } else if(in_reply_to_json.IsObject()) {
+                const rapidjson::Value &in_reply_to_event_id = GetMember(in_reply_to_json, "event_id");
+                if(in_reply_to_event_id.IsString()) {
+                    related_event_id = in_reply_to_event_id.GetString();
+                    related_event_type = RelatedEventType::REPLY;
+                }
+            } else if(relates_to_event_id_json.IsString() && rel_type_json.IsString() && strcmp(rel_type_json.GetString(), "m.annotation") == 0 && key_json.IsString()) {
+                if(strcmp(type_json.GetString(), "m.reaction") == 0) {
+                    auto message = std::make_shared<Message>();
+                    message->type = MessageType::REACTION;
+                    message->user = user;
+                    message->event_id = event_id_str;
+                    message->body = key_json.GetString();
+                    message->related_event_id = relates_to_event_id_json.GetString();
+                    message->related_event_type = RelatedEventType::REACTION;
+                    message->timestamp = timestamp;
+                    return message;
                 }
             }
         }
@@ -1799,7 +1810,9 @@ namespace QuickMedia {
         }
 
         if(strcmp(type_json.GetString(), "m.room.message") == 0 || strcmp(type_json.GetString(), "m.sticker") == 0) {
-
+        } else if(strcmp(type_json.GetString(), "m.reaction") == 0) {
+            // An old reaction that has been removed. New reactions are removed with m.redact
+            return nullptr;
         } else if(strcmp(type_json.GetString(), "m.room.member") == 0) {
             std::string user_display_name = room_data->get_user_display_name(user);
             std::string sender_display_name = room_data->get_user_display_name(user_sender);
-- 
cgit v1.2.3-70-g09d2