summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTimo Kösters <timo@koesters.xyz>2022-10-30 21:23:10 +0100
committerTimo Kösters <timo@koesters.xyz>2022-10-30 21:23:43 +0100
commit0cf6545116f475db1e42f0c72ae30cdd2663f029 (patch)
tree9750810c3cd945841bae8b829a92a3278979d0a7 /src
parent5d691f405eb6cb13f40ec420b5fe99d99fe5feb9 (diff)
downloadconduit-0cf6545116f475db1e42f0c72ae30cdd2663f029.zip
fix: not sending enough state on join
Diffstat (limited to 'src')
-rw-r--r--src/api/client_server/sync.rs41
-rw-r--r--src/database/key_value/rooms/edus/typing.rs11
-rw-r--r--src/service/rooms/edus/typing/mod.rs5
3 files changed, 29 insertions, 28 deletions
diff --git a/src/api/client_server/sync.rs b/src/api/client_server/sync.rs
index 5c1c23d..94e4f5b 100644
--- a/src/api/client_server/sync.rs
+++ b/src/api/client_server/sync.rs
@@ -388,13 +388,35 @@ async fn sync_helper(
))
};
+ let since_sender_member: Option<RoomMemberEventContent> = since_shortstatehash
+ .and_then(|shortstatehash| {
+ services()
+ .rooms
+ .state_accessor
+ .state_get(
+ shortstatehash,
+ &StateEventType::RoomMember,
+ sender_user.as_str(),
+ )
+ .transpose()
+ })
+ .transpose()?
+ .and_then(|pdu| {
+ serde_json::from_str(pdu.content.get())
+ .map_err(|_| Error::bad_database("Invalid PDU in database."))
+ .ok()
+ });
+
+ let joined_since_last_sync =
+ since_sender_member.map_or(true, |member| member.membership != MembershipState::Join);
+
let (
heroes,
joined_member_count,
invited_member_count,
joined_since_last_sync,
state_events,
- ) = if since_shortstatehash.is_none() {
+ ) = if since_shortstatehash.is_none() || joined_since_last_sync {
// Probably since = 0, we will do an initial sync
let (joined_member_count, invited_member_count, heroes) = calculate_counts()?;
@@ -487,23 +509,6 @@ async fn sync_helper(
// Incremental /sync
let since_shortstatehash = since_shortstatehash.unwrap();
- let since_sender_member: Option<RoomMemberEventContent> = services()
- .rooms
- .state_accessor
- .state_get(
- since_shortstatehash,
- &StateEventType::RoomMember,
- sender_user.as_str(),
- )?
- .and_then(|pdu| {
- serde_json::from_str(pdu.content.get())
- .map_err(|_| Error::bad_database("Invalid PDU in database."))
- .ok()
- });
-
- let joined_since_last_sync = since_sender_member
- .map_or(true, |member| member.membership != MembershipState::Join);
-
let mut state_events = Vec::new();
let mut lazy_loaded = HashSet::new();
diff --git a/src/database/key_value/rooms/edus/typing.rs b/src/database/key_value/rooms/edus/typing.rs
index d50c000..d2d4306 100644
--- a/src/database/key_value/rooms/edus/typing.rs
+++ b/src/database/key_value/rooms/edus/typing.rs
@@ -54,10 +54,7 @@ impl service::rooms::edus::typing::Data for KeyValueDatabase {
Ok(())
}
- fn typings_maintain(
- &self,
- room_id: &RoomId,
- ) -> Result<()> {
+ fn typings_maintain(&self, room_id: &RoomId) -> Result<()> {
let mut prefix = room_id.as_bytes().to_vec();
prefix.push(0xff);
@@ -89,8 +86,10 @@ impl service::rooms::edus::typing::Data for KeyValueDatabase {
}
if found_outdated {
- self.roomid_lasttypingupdate
- .insert(room_id.as_bytes(), &services().globals.next_count()?.to_be_bytes())?;
+ self.roomid_lasttypingupdate.insert(
+ room_id.as_bytes(),
+ &services().globals.next_count()?.to_be_bytes(),
+ )?;
}
Ok(())
diff --git a/src/service/rooms/edus/typing/mod.rs b/src/service/rooms/edus/typing/mod.rs
index 6b066f0..7d44f7d 100644
--- a/src/service/rooms/edus/typing/mod.rs
+++ b/src/service/rooms/edus/typing/mod.rs
@@ -22,10 +22,7 @@ impl Service {
}
/// Makes sure that typing events with old timestamps get removed.
- fn typings_maintain(
- &self,
- room_id: &RoomId,
- ) -> Result<()> {
+ fn typings_maintain(&self, room_id: &RoomId) -> Result<()> {
self.db.typings_maintain(room_id)
}