From 921f28c84bbda56ec93df7dcde7c828eaabb0b58 Mon Sep 17 00:00:00 2001 From: Marvin W Date: Tue, 31 Jan 2023 14:43:17 +0100 Subject: [PATCH] Fix reaction display in private MUCs --- libdino/src/service/muc_manager.vala | 8 ++++++++ libdino/src/service/reactions.vala | 15 +++++++++++---- libdino/src/util/display_name.vala | 20 +++++++++++++++++--- xmpp-vala/src/module/xep/0045_muc/flag.vala | 9 +++++++++ 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/libdino/src/service/muc_manager.vala b/libdino/src/service/muc_manager.vala index 36a5599f..ff6ac941 100644 --- a/libdino/src/service/muc_manager.vala +++ b/libdino/src/service/muc_manager.vala @@ -323,6 +323,14 @@ public class MucManager : StreamInteractionModule, Object { return null; } + public Jid? get_occupant_jid(Account account, Jid room, Jid occupant_real_jid) { + Xep.Muc.Flag? flag = get_muc_flag(account); + if (flag != null) { + return flag.get_occupant_jid(occupant_real_jid, room); + } + return null; + } + public Xep.Muc.Role? get_role(Jid jid, Account account) { Xep.Muc.Flag? flag = get_muc_flag(account); if (flag != null) { diff --git a/libdino/src/service/reactions.vala b/libdino/src/service/reactions.vala index 6e8b166c..7cd7c146 100644 --- a/libdino/src/service/reactions.vala +++ b/libdino/src/service/reactions.vala @@ -199,6 +199,7 @@ public class Dino.Reactions : StreamInteractionModule, Object { .with(db.reaction.account_id, "=", account.id) .with(db.reaction.content_item_id, "=", content_item.id) .outer_join_with(db.occupantid, db.occupantid.id, db.reaction.occupant_id) + .outer_join_with(db.jid, db.jid.id, db.reaction.jid_id) .order_by(db.reaction.time, "DESC"); string? own_occupant_id = stream_interactor.get_module(MucManager.IDENTITY).get_own_occupant_id(account, content_item.jid); @@ -209,11 +210,17 @@ public class Dino.Reactions : StreamInteractionModule, Object { string emoji_str = row[db.reaction.emojis]; Jid jid = null; - if (row[db.occupantid.occupant_id] == own_occupant_id) { - jid = account.bare_jid; + if (!db.jid.bare_jid.is_null(row)) { + jid = new Jid(row[db.jid.bare_jid]); + } else if (!db.occupantid.occupant_id.is_null(row)) { + if (row[db.occupantid.occupant_id] == own_occupant_id) { + jid = account.bare_jid; + } else { + string nick = row[db.occupantid.last_nick]; + jid = content_item.jid.with_resource(nick); + } } else { - string nick = row[db.occupantid.last_nick]; - jid = content_item.jid.with_resource(nick); + warning("Reaction with neither JID nor occupant id"); } foreach (string emoji in emoji_str.split(",")) { diff --git a/libdino/src/util/display_name.vala b/libdino/src/util/display_name.vala index 0c05eda8..d99bc40b 100644 --- a/libdino/src/util/display_name.vala +++ b/libdino/src/util/display_name.vala @@ -30,7 +30,7 @@ namespace Dino { if (conversation.type_ == Conversation.Type.CHAT) { return get_real_display_name(stream_interactor, conversation.account, participant, self_word) ?? participant.bare_jid.to_string(); } - if ((conversation.type_ == Conversation.Type.GROUPCHAT || conversation.type_ == Conversation.Type.GROUPCHAT_PM) && conversation.counterpart.equals_bare(participant)) { + if ((conversation.type_ == Conversation.Type.GROUPCHAT || conversation.type_ == Conversation.Type.GROUPCHAT_PM)) { return get_occupant_display_name(stream_interactor, conversation, participant); } return participant.bare_jid.to_string(); @@ -75,8 +75,13 @@ namespace Dino { public static string get_occupant_display_name(StreamInteractor stream_interactor, Conversation conversation, Jid jid, string? self_word = null, bool muc_real_name = false) { if (muc_real_name) { MucManager muc_manager = stream_interactor.get_module(MucManager.IDENTITY); - if (muc_manager.is_private_room(conversation.account, jid.bare_jid)) { - Jid? real_jid = muc_manager.get_real_jid(jid, conversation.account); + if (muc_manager.is_private_room(conversation.account, conversation.counterpart)) { + Jid? real_jid = null; + if (jid.equals_bare(conversation.counterpart)) { + muc_manager.get_real_jid(jid, conversation.account); + } else { + real_jid = jid; + } if (real_jid != null) { string? display_name = get_real_display_name(stream_interactor, conversation.account, real_jid, self_word); if (display_name != null) return display_name; @@ -92,6 +97,15 @@ namespace Dino { } } + // If it's someone else's real jid, recover nickname + if (!jid.equals_bare(conversation.counterpart)) { + MucManager muc_manager = stream_interactor.get_module(MucManager.IDENTITY); + Jid? occupant_jid = muc_manager.get_occupant_jid(conversation.account, conversation.counterpart.bare_jid, jid); + if (occupant_jid != null && occupant_jid.resourcepart != null) { + return occupant_jid.resourcepart; + } + } + return jid.resourcepart ?? jid.to_string(); } } \ No newline at end of file diff --git a/xmpp-vala/src/module/xep/0045_muc/flag.vala b/xmpp-vala/src/module/xep/0045_muc/flag.vala index 976291b8..d0d2c359 100644 --- a/xmpp-vala/src/module/xep/0045_muc/flag.vala +++ b/xmpp-vala/src/module/xep/0045_muc/flag.vala @@ -26,6 +26,15 @@ public class Flag : XmppStreamFlag { public Jid? get_real_jid(Jid full_jid) { return occupant_real_jids[full_jid]; } + public Jid? get_occupant_jid(Jid real_jid, Jid room) { + foreach (Map.Entry entry in occupant_real_jids) { + if (entry.value.equals_bare(real_jid) && entry.key.equals_bare(room)) { + return entry.key; + } + } + return null; + } + public Gee.List get_offline_members(Jid muc_jid) { Gee.List ret = new ArrayList(Jid.equals_func); HashMap? muc_affiliations = affiliations[muc_jid.bare_jid];