diff --git a/crates/lavina-core/src/player.rs b/crates/lavina-core/src/player.rs index 9ffe831..633593e 100644 --- a/crates/lavina-core/src/player.rs +++ b/crates/lavina-core/src/player.rs @@ -112,7 +112,7 @@ impl PlayerConnection { } #[tracing::instrument(skip(self), name = "PlayerConnection::get_room_message_history")] - pub async fn get_room_message_history(&self, room_id: RoomId) -> Result<(Vec)> { + pub async fn get_room_message_history(&self, room_id: RoomId) -> Result> { let (promise, deferred) = oneshot(); let cmd = ClientCommand::GetRoomHistory { room_id, promise }; self.player_handle.send(ActorCommand::ClientCommand(cmd, self.connection_id.clone())).await; @@ -525,7 +525,6 @@ impl Player { let result = self.get_room_history(room_id).await; let _ = promise.send(result); } - _ => {} } } diff --git a/crates/lavina-core/src/repo/room.rs b/crates/lavina-core/src/repo/room.rs index eaeb1d0..bca612b 100644 --- a/crates/lavina-core/src/repo/room.rs +++ b/crates/lavina-core/src/repo/room.rs @@ -3,7 +3,7 @@ use chrono::{DateTime, Utc}; use sqlx::FromRow; use crate::repo::Storage; -use crate::room::{RoomId, StoredMessage, StoredUser}; +use crate::room::{RoomId, StoredMessage}; #[derive(FromRow)] pub struct StoredRoom { @@ -38,7 +38,6 @@ impl Storage { messages.id as id, content, created_at, - users.id as author_id, users.name as author_name from messages diff --git a/crates/lavina-core/src/room.rs b/crates/lavina-core/src/room.rs index ec542b9..1b1ce30 100644 --- a/crates/lavina-core/src/room.rs +++ b/crates/lavina-core/src/room.rs @@ -286,30 +286,10 @@ pub struct RoomInfo { pub topic: Str, } -#[derive(Debug)] -pub struct StoredUser { - pub id: u32, - pub name: String, -} - -#[derive(Debug)] +#[derive(Debug, FromRow)] pub struct StoredMessage { pub id: u32, - pub author: StoredUser, + pub author_name: String, pub content: String, pub created_at: DateTime, } - -impl FromRow<'_, SqliteRow> for StoredMessage { - fn from_row(row: &SqliteRow) -> sqlx::Result { - Ok(Self { - id: row.try_get("id")?, - author: StoredUser { - id: row.try_get("author_id")?, - name: row.try_get("author_name")?, - }, - content: row.try_get("content")?, - created_at: row.try_get("created_at")?, - }) - } -} diff --git a/crates/projection-xmpp/src/presence.rs b/crates/projection-xmpp/src/presence.rs index 5c51c52..2a0986d 100644 --- a/crates/projection-xmpp/src/presence.rs +++ b/crates/projection-xmpp/src/presence.rs @@ -2,7 +2,6 @@ use anyhow::Result; use quick_xml::events::Event; -use serde::Serialize; use lavina_core::room::RoomId; use proto_xmpp::bind::{Jid, Name, Resource, Server}; @@ -45,12 +44,13 @@ impl<'a> XmppConnection<'a> { custom: vec![], }; muc_presence.serialize(output); - subject.serialize(output); let messages = self.retrieve_message_history(&name).await?; for message in messages { message.serialize(output) } + // The subject is the last stanza sent during a MUC join process. + subject.serialize(output); } _ => { // TODO other presence cases @@ -88,7 +88,7 @@ impl<'a> XmppConnection<'a> { } } - async fn retrieve_muc_presence(&mut self, name: &Name) -> Result<(Presence)> { + async fn retrieve_muc_presence(&mut self, name: &Name) -> Result> { let a = self.user_handle.join_room(RoomId::try_from(name.0.clone())?).await?; // TODO handle bans let response = Presence { @@ -120,18 +120,11 @@ impl<'a> XmppConnection<'a> { Ok(response) } - /* - Retrieve a room's message history. The output can be serialized into a stream of XML stanzas. - - Example of such a stanza: - - - - - - */ + /// Retrieve a room's message history. The output can be serialized into a stream of XML stanzas. + /// + /// Example in [XmppHistoryMessage]'s docs. #[tracing::instrument(skip(self), name = "XmppConnection::retrieve_message_history")] - async fn retrieve_message_history(&self, room_name: &Name) -> Result<(Vec)> { + async fn retrieve_message_history(&self, room_name: &Name) -> Result> { let room_id = RoomId::try_from(room_name.0.clone())?; let history_messages = self.user_handle.get_room_message_history(room_id).await?; let mut response = vec![]; @@ -147,11 +140,11 @@ impl<'a> XmppConnection<'a> { from: Jid { name: Option::from(room_name.clone()), server: Server(self.hostname_rooms.clone()), - resource: Option::from(Resource(history_message.author.name.clone().into())), + resource: Option::from(Resource(history_message.author_name.clone().into())), }, delay: Delay { from: Jid { - name: Option::from(Name(history_message.author.name.clone().into())), + name: Option::from(Name(history_message.author_name.clone().into())), server: Server(self.hostname_rooms.clone()), resource: None, }, @@ -161,7 +154,7 @@ impl<'a> XmppConnection<'a> { }); tracing::info!( "Retrieved message: {:?} {:?}", - history_message.author, + history_message.author_name, history_message.content.clone() ); } diff --git a/crates/proto-xmpp/src/lib.rs b/crates/proto-xmpp/src/lib.rs index 5519c45..a4d5b45 100644 --- a/crates/proto-xmpp/src/lib.rs +++ b/crates/proto-xmpp/src/lib.rs @@ -15,7 +15,8 @@ pub mod streamerror; pub mod tls; pub mod xml; -pub mod testkit; +#[cfg(test)] +mod testkit; // Implemented as a macro instead of a fn due to borrowck limitations macro_rules! skip_text { diff --git a/crates/proto-xmpp/src/muc/mod.rs b/crates/proto-xmpp/src/muc/mod.rs index a2c77e4..7e59162 100644 --- a/crates/proto-xmpp/src/muc/mod.rs +++ b/crates/proto-xmpp/src/muc/mod.rs @@ -280,14 +280,15 @@ impl ToXml for Delay { } } -/* - Example of an XMPP message with a history stanza: - - - - - -*/ +/// Message-stanza of a historic message. +/// +/// Example: +/// ```xml +/// +/// +/// +/// +/// ``` #[derive(Debug, PartialEq, Eq)] pub struct XmppHistoryMessage { pub id: String, @@ -420,7 +421,7 @@ mod test { let history_message = XmppHistoryMessage { id: "id".to_string(), to: Jid { - name: Some(Name("sauer@oflor.me".into())), + name: Some(Name("sauer@example.com".into())), server: Server("localhost".into()), resource: Some(Resource("tester".into())), }, @@ -440,7 +441,7 @@ mod test { body: "Hello World.".to_string(), }; let mut events = vec![]; - let expected = r#"Hello World."#; + let expected = r#"Hello World."#; // Act history_message.serialize(&mut events);