From 5dd0248e16522a3672c58a7892d549840257e8dd Mon Sep 17 00:00:00 2001 From: dec05eba 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/Matrix.cpp') 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->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