From 9c26e22ad7d1d821feba6253703c074bcb3c1bf6 Mon Sep 17 00:00:00 2001 From: timokoesters Date: Sun, 24 May 2020 08:30:57 +0200 Subject: [PATCH] improvement: load aliases from database --- src/client_server.rs | 12 ++++++------ src/database/rooms.rs | 12 ++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/client_server.rs b/src/client_server.rs index 0701be1a..36cdb38b 100644 --- a/src/client_server.rs +++ b/src/client_server.rs @@ -1272,17 +1272,17 @@ pub fn join_room_by_id_or_alias_route( ) -> MatrixResult { let room_id = match RoomId::try_from(body.room_id_or_alias.clone()) { Ok(room_id) => room_id, - Err(room_alias) => { - if room_alias.server_name() == db.globals.server_name() { + Err(_) => { + if let Some(room_id) = db.rooms.id_from_alias(body.room_id_or_alias.as_ref()).unwrap() { + room_id + } else { + // Ask creator server of the room to join TODO ask someone else when not available + //server_server::send_request(data, destination, request) return MatrixResult(Err(Error { kind: ErrorKind::NotFound, message: "Room alias not found.".to_owned(), status_code: http::StatusCode::BAD_REQUEST, })); - } else { - // Ask creator server of the room to join TODO ask someone else when not available - //server_server::send_request(data, destination, request) - todo!(); } } }; diff --git a/src/database/rooms.rs b/src/database/rooms.rs index 8e626cb0..8969da11 100644 --- a/src/database/rooms.rs +++ b/src/database/rooms.rs @@ -26,6 +26,8 @@ pub struct Rooms { pub(super) roomid_pduleaves: sled::Tree, pub(super) roomstateid_pdu: sled::Tree, // RoomStateId = Room + StateType + StateKey + pub(super) alias_roomid: sled::Tree, + pub(super) userroomid_joined: sled::Tree, pub(super) roomuserid_joined: sled::Tree, pub(super) userroomid_invited: sled::Tree, @@ -646,6 +648,16 @@ impl Rooms { Ok(()) } + pub fn id_from_alias(&self, alias: &str) -> Result> { + if !alias.starts_with('#') { + return Err(Error::BadRequest("room alias does not start with #")); + } + + self.alias_roomid.get(alias)?.map_or(Ok(None), |bytes| { + Ok(Some(RoomId::try_from(utils::string_from_bytes(&bytes)?)?)) + }) + } + /// Returns an iterator over all rooms a user joined. pub fn room_members(&self, room_id: &RoomId) -> impl Iterator> { self.roomuserid_joined