diff --git a/src/main/java/eu/siacs/conversations/entities/MucOptions.java b/src/main/java/eu/siacs/conversations/entities/MucOptions.java index 63a4b987b32550f9857024e51186e74d6edbf282..780ee0cc4356e2426616e96b045773d97f4b0dcb 100644 --- a/src/main/java/eu/siacs/conversations/entities/MucOptions.java +++ b/src/main/java/eu/siacs/conversations/entities/MucOptions.java @@ -862,6 +862,23 @@ public class MucOptions { this.occupantId = occupantId; this.nick = nick; this.hats = hats; + + if (occupantId != null && options != null) { + final var sha1sum = options.getConversation().getAttribute("occupantAvatar/" + occupantId); + if (sha1sum != null) { + avatar = new Avatar(); + avatar.sha1sum = sha1sum; + avatar.owner = fullJid; + } + + if (nick == null) { + this.nick = options.getConversation().getAttribute("occupantNick/" + occupantId); + } else if (!getNick().equals(getName())) { + options.getConversation().setAttribute("occupantNick/" + occupantId, nick); + } else { + options.getConversation().setAttribute("occupantNick/" + occupantId, (String) null); + } + } } public String getName() { @@ -933,6 +950,9 @@ public class MucOptions { } public boolean setAvatar(Avatar avatar) { + if (occupantId != null) { + options.getConversation().setAttribute("occupantAvatar/" + occupantId, getContact() == null ? avatar.sha1sum : null); + } if (this.avatar != null && this.avatar.equals(avatar)) { return false; } else { diff --git a/src/main/java/eu/siacs/conversations/parser/PresenceParser.java b/src/main/java/eu/siacs/conversations/parser/PresenceParser.java index 23c5f93e2d541b5f06395eecfcb5c7455ef00c80..cf627573e6743aabd2e0b3762c7c9deb91ca9949 100644 --- a/src/main/java/eu/siacs/conversations/parser/PresenceParser.java +++ b/src/main/java/eu/siacs/conversations/parser/PresenceParser.java @@ -211,7 +211,7 @@ public class PresenceParser extends AbstractParser implements OnPresencePacketRe mucOptions.updateUser(parseItem(conversation, item, from, occupantId, nick == null ? null : nick.getContent(), hats)); } MucOptions.User user = mucOptions.deleteUser(from); - if (user != null) { + if (user != null && occupantId == null) { mXmppConnectionService.getAvatarService().clear(user); } } diff --git a/src/main/java/eu/siacs/conversations/services/AvatarService.java b/src/main/java/eu/siacs/conversations/services/AvatarService.java index 09d9c2b949b522d8ad82b8b04264acec40cbbff2..bde69912089f531ff694fe6ab59a0ec84fe0b3a3 100644 --- a/src/main/java/eu/siacs/conversations/services/AvatarService.java +++ b/src/main/java/eu/siacs/conversations/services/AvatarService.java @@ -270,7 +270,9 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded { '\0' + user.getAccount().getJid().asBareJid() + '\0' + - emptyOnNull(user.getFullJid()) + + user.getMuc() + + '\0' + + user.getOccupantId() == null ? emptyOnNull(user.getFullJid()) : user.getOccupantId() + '\0' + emptyOnNull(user.getRealJid()) + '\0' + @@ -493,7 +495,9 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded { final MucOptions mucOptions = ((Conversation) conversation).getMucOptions(); MucOptions.User user; if (trueCounterpart != null) { - user = mucOptions.findOrCreateUserByRealJid(trueCounterpart, message.getCounterpart(), null); + user = mucOptions.findOrCreateUserByRealJid(trueCounterpart, message.getCounterpart(), message.getOccupantId()); + } else if(message.getOccupantId() != null) { + user = mucOptions.findUserByOccupantId(message.getOccupantId(), message.getCounterpart()); } else { user = mucOptions.findUserByFullJid(message.getCounterpart()); }