From ff4118e21d4320dfc7f95710fdaf8b50fcce7a8a Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 8 Aug 2022 15:00:20 +0200 Subject: [PATCH] Query and set seen status via store --- src/euph/small_message.rs | 5 +++++ src/logger.rs | 6 ++++++ src/store.rs | 2 ++ src/vault/euph.rs | 36 +++++++++++++++++++++++++++++++++++- 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/euph/small_message.rs b/src/euph/small_message.rs index 559e5c1..bd1ad18 100644 --- a/src/euph/small_message.rs +++ b/src/euph/small_message.rs @@ -94,6 +94,7 @@ pub struct SmallMessage { pub time: Time, pub nick: String, pub content: String, + pub seen: bool, } fn as_me(content: &str) -> Option<&str> { @@ -144,6 +145,10 @@ impl Msg for SmallMessage { self.parent } + fn seen(&self) -> bool { + self.seen + } + fn last_possible_id() -> Self::Id { Snowflake::MAX } diff --git a/src/logger.rs b/src/logger.rs index 6528591..fd4d30b 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -31,6 +31,10 @@ impl Msg for LogMsg { None } + fn seen(&self) -> bool { + true + } + fn last_possible_id() -> Self::Id { Self::Id::MAX } @@ -118,6 +122,8 @@ impl MsgStore for Logger { async fn newer_msg_id(&self, id: &usize) -> Option { self.next_tree_id(id).await } + + async fn set_seen(&self, _id: &usize, _seen: bool) {} } impl Log for Logger { diff --git a/src/store.rs b/src/store.rs index 0952757..0e6cc33 100644 --- a/src/store.rs +++ b/src/store.rs @@ -9,6 +9,7 @@ pub trait Msg { type Id: Clone + Debug + Hash + Eq + Ord; fn id(&self) -> Self::Id; fn parent(&self) -> Option; + fn seen(&self) -> bool; fn last_possible_id() -> Self::Id; } @@ -128,4 +129,5 @@ pub trait MsgStore { async fn newest_msg_id(&self) -> Option; async fn older_msg_id(&self, id: &M::Id) -> Option; async fn newer_msg_id(&self, id: &M::Id) -> Option; + async fn set_seen(&self, id: &M::Id, seen: bool); } diff --git a/src/vault/euph.rs b/src/vault/euph.rs index aa9fa9b..b194ed2 100644 --- a/src/vault/euph.rs +++ b/src/vault/euph.rs @@ -258,6 +258,15 @@ impl MsgStore for EuphVault { let _ = self.vault.tx.send(request.into()); rx.await.unwrap() } + + async fn set_seen(&self, id: &Snowflake, seen: bool) { + let request = EuphRequest::SetSeen { + room: self.room.clone(), + id: *id, + seen, + }; + let _ = self.vault.tx.send(request.into()); + } } pub(super) enum EuphRequest { @@ -350,6 +359,11 @@ pub(super) enum EuphRequest { id: Snowflake, result: oneshot::Sender>, }, + SetSeen { + room: String, + id: Snowflake, + seen: bool, + }, } impl EuphRequest { @@ -399,6 +413,7 @@ impl EuphRequest { EuphRequest::GetNewerMsgId { room, id, result } => { Self::get_newer_msg_id(conn, room, id, result) } + EuphRequest::SetSeen { room, id, seen } => Self::set_seen(conn, room, id, seen), }; if let Err(e) = result { // If an error occurs here, the rest of the UI will likely panic and @@ -778,7 +793,7 @@ impl EuphRequest { ON tree.room = euph_msgs.room AND tree.id = euph_msgs.parent ) - SELECT id, parent, time, name, content + SELECT id, parent, time, name, content, seen FROM euph_msgs JOIN tree USING (room, id) ORDER BY id ASC @@ -791,6 +806,7 @@ impl EuphRequest { time: row.get(2)?, nick: row.get(3)?, content: row.get(4)?, + seen: row.get(5)?, }) })? .collect::>()?; @@ -974,4 +990,22 @@ impl EuphRequest { let _ = result.send(tree); Ok(()) } + + fn set_seen( + conn: &Connection, + room: String, + id: Snowflake, + seen: bool, + ) -> rusqlite::Result<()> { + conn.execute( + " + UPDATE euph_msgs + SET seen = :seen + WHERE room = :room + AND id = :id + ", + named_params! {":room": room, ":id": id, ":seen": seen}, + )?; + Ok(()) + } }