diff --git a/src/euph/room.rs b/src/euph/room.rs index a8b8783..30938ef 100644 --- a/src/euph/room.rs +++ b/src/euph/room.rs @@ -3,6 +3,7 @@ use std::sync::Arc; use std::time::Duration; use anyhow::bail; +use chrono::Utc; use log::{error, info, warn}; use parking_lot::Mutex; use tokio::sync::{mpsc, oneshot}; @@ -170,7 +171,7 @@ impl State { } Data::SnapshotEvent(d) => { info!("e&{}: successfully joined", self.name); - self.vault.join(); + self.vault.join(Utc::now()); self.last_msg_id = Some(d.log.last().map(|m| m.id)); self.vault.add_messages(d.log, None); let _ = self.ui_event_tx.send(UiEvent::Redraw); diff --git a/src/vault/euph.rs b/src/vault/euph.rs index bd6a194..16b5181 100644 --- a/src/vault/euph.rs +++ b/src/vault/euph.rs @@ -93,9 +93,10 @@ pub struct EuphVault { } impl EuphVault { - pub fn join(&self) { + pub fn join(&self, time: DateTime) { let request = EuphRequest::Join { room: self.room.clone(), + time, }; let _ = self.tx.send(request.into()); } @@ -214,6 +215,7 @@ pub(super) enum EuphRequest { }, Join { room: String, + time: DateTime, }, Delete { room: String, @@ -266,7 +268,7 @@ impl EuphRequest { pub(super) fn perform(self, conn: &mut Connection) { let result = match self { EuphRequest::Rooms { result } => Self::rooms(conn, result), - EuphRequest::Join { room } => Self::join(conn, room), + EuphRequest::Join { room, time } => Self::join(conn, room, time), EuphRequest::Delete { room } => Self::delete(conn, room), EuphRequest::AddMsg { room, @@ -313,13 +315,15 @@ impl EuphRequest { Ok(()) } - fn join(conn: &mut Connection, room: String) -> rusqlite::Result<()> { + fn join(conn: &mut Connection, room: String, time: DateTime) -> rusqlite::Result<()> { conn.execute( " - INSERT OR IGNORE INTO euph_rooms (room) - VALUES (?) + INSERT INTO euph_rooms (room, first_joined, last_joined) + VALUES (:room, :time, :time) + ON CONFLICT (room) DO UPDATE + SET last_joined = :time ", - [room], + named_params! {":room": room, ":time": time}, )?; Ok(()) } diff --git a/src/vault/migrate.rs b/src/vault/migrate.rs index 14e4516..78fda14 100644 --- a/src/vault/migrate.rs +++ b/src/vault/migrate.rs @@ -22,7 +22,9 @@ fn m1(tx: &mut Transaction) -> rusqlite::Result<()> { tx.execute_batch( " CREATE TABLE euph_rooms ( - room TEXT NOT NULL PRIMARY KEY + room TEXT NOT NULL PRIMARY KEY, + first_joined TEXT NOT NULL, + last_joined TEXT NOT NULL ) STRICT; CREATE TABLE euph_msgs (