diff --git a/libdino/src/service/muc_manager.vala b/libdino/src/service/muc_manager.vala index cd4ff852..e9ad1b81 100644 --- a/libdino/src/service/muc_manager.vala +++ b/libdino/src/service/muc_manager.vala @@ -98,7 +98,14 @@ public class MucManager : StreamInteractionModule, Object { public Gee.List? get_occupants(Jid jid, Account account) { if (is_groupchat(jid, account)) { - return stream_interactor.get_module(PresenceManager.IDENTITY).get_full_jids(jid, account); + Gee.List ret = new ArrayList(Jid.equals_func); + Gee.List? full_jids = stream_interactor.get_module(PresenceManager.IDENTITY).get_full_jids(jid, account); + if (full_jids != null) { + ret.add_all(full_jids); + // Remove eventual presence from bare jid + ret.remove(jid); + } + return ret; } return null; } @@ -107,10 +114,7 @@ public class MucManager : StreamInteractionModule, Object { Gee.List? occupants = get_occupants(jid, account); Jid? own_jid = get_own_jid(jid, account); if (occupants != null && own_jid != null) { - Gee.List occupants_ = new ArrayList(Jid.equals_func); - occupants_.add_all(occupants); - occupants_.remove(own_jid); - return occupants_; + occupants.remove(own_jid); } return occupants; } @@ -207,6 +211,11 @@ public class MucManager : StreamInteractionModule, Object { return null; } + public bool has_avatar(Jid muc_jid, Account account) { + Gee.List? full_jids = stream_interactor.get_module(PresenceManager.IDENTITY).get_full_jids(muc_jid, account); + return full_jids != null && full_jids.contains(muc_jid); + } + private Xep.Muc.Flag? get_muc_flag(Account account) { XmppStream? stream = stream_interactor.get_stream(account); if (stream != null) { diff --git a/main/src/ui/avatar_image.vala b/main/src/ui/avatar_image.vala index baee12c7..26955ae0 100644 --- a/main/src/ui/avatar_image.vala +++ b/main/src/ui/avatar_image.vala @@ -178,8 +178,8 @@ public class AvatarImage : Misc { stream_interactor.connection_manager.connection_state_changed.connect(on_connection_changed); stream_interactor.get_module(RosterManager.IDENTITY).updated_roster_item.connect(on_roster_updated); } - if (muc_manager.is_groupchat(jid_, account)) { - // Groupchat + if (muc_manager.is_groupchat(jid_, account) && !muc_manager.has_avatar(jid_, account)) { + // Groupchat without avatar Gee.List? occupants = muc_manager.get_other_occupants(jid_, account); jid = jid_; if (occupants == null || occupants.size == 0) { @@ -211,7 +211,7 @@ public class AvatarImage : Misc { } } } else { - // Single user + // Single user or MUC with vcard avatar this.jid = jid_; if (force_update || current_jids.length != 1 || !current_jids[0].equals(jid) || gray != (allow_gray && (!is_counterpart_online(jid) || !is_self_online()))) { set_jids_(new Jid[] { jid }, false, !is_counterpart_online(jid) || !is_self_online());