aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libdino/src/service/muc_manager.vala8
-rw-r--r--libdino/src/service/reactions.vala15
-rw-r--r--libdino/src/util/display_name.vala20
-rw-r--r--xmpp-vala/src/module/xep/0045_muc/flag.vala9
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<Jid, Jid> 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<Jid> get_offline_members(Jid muc_jid) {
Gee.List<Jid> ret = new ArrayList<Jid>(Jid.equals_func);
HashMap<Jid, Affiliation>? muc_affiliations = affiliations[muc_jid.bare_jid];