refactor: make memberlist update logic easier to follow

This commit is contained in:
link2xt
2025-01-17 10:27:51 +00:00
committed by l
parent fa016b36fb
commit 0b9746b57e

View File

@@ -2237,7 +2237,7 @@ async fn apply_group_changes(
false false
}; };
let mut chat_contacts = let chat_contacts =
HashSet::<ContactId>::from_iter(chat::get_chat_contacts(context, chat_id).await?); HashSet::<ContactId>::from_iter(chat::get_chat_contacts(context, chat_id).await?);
let is_from_in_chat = let is_from_in_chat =
!chat_contacts.contains(&ContactId::SELF) || chat_contacts.contains(&from_id); !chat_contacts.contains(&ContactId::SELF) || chat_contacts.contains(&from_id);
@@ -2328,11 +2328,6 @@ async fn apply_group_changes(
} }
} }
// These are for adding info messages about implicit membership changes, so they are only
// filled when such messages are needed.
let mut added_ids = HashSet::<ContactId>::new();
let mut removed_ids = HashSet::<ContactId>::new();
if is_from_in_chat { if is_from_in_chat {
if let Some(ref chat_group_member_timestamps) = mime_parser.chat_group_member_timestamps() { if let Some(ref chat_group_member_timestamps) = mime_parser.chat_group_member_timestamps() {
send_event_chat_modified |= update_chats_contacts_timestamps( send_event_chat_modified |= update_chats_contacts_timestamps(
@@ -2344,41 +2339,31 @@ async fn apply_group_changes(
chat_group_member_timestamps, chat_group_member_timestamps,
) )
.await?; .await?;
let new_chat_contacts = HashSet::<ContactId>::from_iter(
chat::get_chat_contacts(context, chat_id)
.await?
.iter()
.copied(),
);
added_ids = new_chat_contacts
.difference(&chat_contacts)
.copied()
.collect();
removed_ids = chat_contacts
.difference(&new_chat_contacts)
.copied()
.collect();
} else { } else {
let mut new_members = HashSet::from_iter(to_ids.iter().copied()); let mut new_members;
new_members.insert(ContactId::SELF); if self_added {
if !from_id.is_special() { new_members = HashSet::from_iter(to_ids.iter().copied());
new_members.insert(from_id); new_members.insert(ContactId::SELF);
if !from_id.is_special() {
new_members.insert(from_id);
}
} else {
new_members = chat_contacts.clone();
} }
if !self_added { // Allow non-Delta Chat MUAs to add members.
if mime_parser.get_header(HeaderDef::ChatVersion).is_none() { if mime_parser.get_header(HeaderDef::ChatVersion).is_none() {
// Allow non-Delta Chat MUAs to add members.
added_ids = new_members.difference(&chat_contacts).copied().collect();
}
if let Some(added_id) = added_id {
added_ids.insert(added_id);
}
new_members.clone_from(&chat_contacts);
// Don't delete any members locally, but instead add absent ones to provide group // Don't delete any members locally, but instead add absent ones to provide group
// membership consistency for all members: // membership consistency for all members:
new_members.extend(added_ids.clone()); new_members.extend(to_ids.iter());
} }
// Apply explicit addition if any.
if let Some(added_id) = added_id {
new_members.insert(added_id);
}
// Apply explicit removal if any.
if let Some(removed_id) = removed_id { if let Some(removed_id) = removed_id {
new_members.remove(&removed_id); new_members.remove(&removed_id);
} }
@@ -2391,12 +2376,28 @@ async fn apply_group_changes(
&new_members, &new_members,
) )
.await?; .await?;
chat_contacts = new_members;
send_event_chat_modified = true; send_event_chat_modified = true;
} }
} }
} }
let new_chat_contacts = HashSet::<ContactId>::from_iter(
chat::get_chat_contacts(context, chat_id)
.await?
.iter()
.copied(),
);
// These are for adding info messages about implicit membership changes.
let mut added_ids: HashSet<ContactId> = new_chat_contacts
.difference(&chat_contacts)
.copied()
.collect();
let mut removed_ids: HashSet<ContactId> = chat_contacts
.difference(&new_chat_contacts)
.copied()
.collect();
if let Some(added_id) = added_id { if let Some(added_id) = added_id {
if !added_ids.remove(&added_id) && !self_added { if !added_ids.remove(&added_id) && !self_added {
// No-op "Member added" message. // No-op "Member added" message.
@@ -2437,12 +2438,12 @@ async fn apply_group_changes(
} }
if let Some(avatar_action) = &mime_parser.group_avatar { if let Some(avatar_action) = &mime_parser.group_avatar {
if !chat_contacts.contains(&ContactId::SELF) { if !new_chat_contacts.contains(&ContactId::SELF) {
warn!( warn!(
context, context,
"Received group avatar update for group chat {chat_id} we are not a member of." "Received group avatar update for group chat {chat_id} we are not a member of."
); );
} else if !chat_contacts.contains(&from_id) { } else if !new_chat_contacts.contains(&from_id) {
warn!( warn!(
context, context,
"Contact {from_id} attempts to modify group chat {chat_id} avatar without being a member.", "Contact {from_id} attempts to modify group chat {chat_id} avatar without being a member.",