|
|
|
|
@ -92,6 +92,7 @@ void AvatarManager::onMembers(const QString& channel, int count, const uint8_t*
|
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
QSet<QString> seen; |
|
|
|
|
const auto previousServers = m_servers.value(group); bool referencesChanged = false; |
|
|
|
|
if (full) m_servers[group].clear(); |
|
|
|
|
for (int i = 0; i < count; i++) { |
|
|
|
|
chat_member_display member{}; chat_core_deserialize_member(data + i * CHAT_MEMBER_DISPLAY_SIZE, &member); |
|
|
|
|
@ -103,19 +104,24 @@ void AvatarManager::onMembers(const QString& channel, int count, const uint8_t*
|
|
|
|
|
if (!ref.server || !mf_avatar_file_valid(member.avatar_file)) { ref.server = 0; ref.hash.clear(); } |
|
|
|
|
const Ref old = m_refs.value(context); m_refs[context] = ref; |
|
|
|
|
if (old.hash != ref.hash || old.server != ref.server) { |
|
|
|
|
referencesChanged = true; |
|
|
|
|
m_retry.remove(context); m_failures.remove(context); emit changed(channel, ref.owner); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (full) for (const auto& context : m_refs.keys()) |
|
|
|
|
if (m_refs[context].group == group && !seen.contains(context)) removeMember(channel, m_refs[context].owner); |
|
|
|
|
emit serversChanged(); scheduleOwn(group); pump(); |
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_MEDIA, "avatar: member snapshot channel=%s count=%d full=%d servers=%d refs=%d", |
|
|
|
|
qPrintable(channel), count, int(full), m_servers.value(group).size(), m_refs.size()); |
|
|
|
|
const bool serversChangedNow = previousServers != m_servers.value(group); |
|
|
|
|
if (serversChangedNow) emit serversChanged(); |
|
|
|
|
scheduleOwn(group); pump(); |
|
|
|
|
if (full || referencesChanged || serversChangedNow) |
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_MEDIA, "avatar: member snapshot channel=%s count=%d full=%d servers=%d refs=%d", |
|
|
|
|
qPrintable(channel), count, int(full), m_servers.value(group).size(), m_refs.size()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AvatarManager::removeMember(const QString& channel, quint64 owner) { |
|
|
|
|
const quint64 group = channel.toULongLong(); const QString context = key(group, owner); |
|
|
|
|
m_refs.remove(context); m_wanted.remove(context); m_servers[group].remove(owner); |
|
|
|
|
m_refs.remove(context); m_wanted.remove(context); |
|
|
|
|
if (m_servers[group].remove(owner)) emit serversChanged(); |
|
|
|
|
emit changed(channel, owner); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|