From 5a04559cb47ed14ce23f1a88a52c8c908a45001a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timo=20K=C3=B6sters?= <timo@koesters.xyz>
Date: Sun, 9 Oct 2022 11:26:08 +0200
Subject: [PATCH] fix: maintain server list again

---
 src/database/key_value/rooms/state_cache.rs | 30 +++++++++++++++++++++
 src/service/rooms/state_cache/mod.rs        |  8 ------
 2 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/src/database/key_value/rooms/state_cache.rs b/src/database/key_value/rooms/state_cache.rs
index 4ca6ac40..cbc05764 100644
--- a/src/database/key_value/rooms/state_cache.rs
+++ b/src/database/key_value/rooms/state_cache.rs
@@ -124,6 +124,36 @@ impl service::rooms::state_cache::Data for KeyValueDatabase {
             .unwrap()
             .insert(room_id.to_owned(), Arc::new(real_users));
 
+        for old_joined_server in self.room_servers(room_id).filter_map(|r| r.ok()) {
+            if !joined_servers.remove(&old_joined_server) {
+                // Server not in room anymore
+                let mut roomserver_id = room_id.as_bytes().to_vec();
+                roomserver_id.push(0xff);
+                roomserver_id.extend_from_slice(old_joined_server.as_bytes());
+
+                let mut serverroom_id = old_joined_server.as_bytes().to_vec();
+                serverroom_id.push(0xff);
+                serverroom_id.extend_from_slice(room_id.as_bytes());
+
+                self.roomserverids.remove(&roomserver_id)?;
+                self.serverroomids.remove(&serverroom_id)?;
+            }
+        }
+
+        // Now only new servers are in joined_servers anymore
+        for server in joined_servers {
+            let mut roomserver_id = room_id.as_bytes().to_vec();
+            roomserver_id.push(0xff);
+            roomserver_id.extend_from_slice(server.as_bytes());
+
+            let mut serverroom_id = server.as_bytes().to_vec();
+            serverroom_id.push(0xff);
+            serverroom_id.extend_from_slice(room_id.as_bytes());
+
+            self.roomserverids.insert(&roomserver_id, &[])?;
+            self.serverroomids.insert(&serverroom_id, &[])?;
+        }
+
         self.appservice_in_room_cache
             .write()
             .unwrap()
diff --git a/src/service/rooms/state_cache/mod.rs b/src/service/rooms/state_cache/mod.rs
index 2b4762ae..9431d3a1 100644
--- a/src/service/rooms/state_cache/mod.rs
+++ b/src/service/rooms/state_cache/mod.rs
@@ -39,14 +39,6 @@ impl Service {
             // TODO: displayname, avatar url
         }
 
-        let mut roomserver_id = room_id.as_bytes().to_vec();
-        roomserver_id.push(0xff);
-        roomserver_id.extend_from_slice(user_id.server_name().as_bytes());
-
-        let mut serverroom_id = user_id.server_name().as_bytes().to_vec();
-        serverroom_id.push(0xff);
-        serverroom_id.extend_from_slice(room_id.as_bytes());
-
         match &membership {
             MembershipState::Join => {
                 // Check if the user never joined this room