From ced035cf60020a651d26b922db84cbc0d778db03 Mon Sep 17 00:00:00 2001 From: videogame hacker Date: Sun, 12 Sep 2021 10:54:41 +0100 Subject: [PATCH] Store message relations as they are sent This lets us look up previous messages by ID and correlate them in order to support rich replies :) --- .gitignore | 2 -- data/.gitignore | 2 ++ src/bridgers.rs | 32 ++++++++++++++++++++++++++++---- src/main.rs | 2 -- src/matrix.rs | 2 +- src/messages.rs | 2 +- 6 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 data/.gitignore diff --git a/.gitignore b/.gitignore index e906ee7..ea8c4bf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1 @@ /target -/credentials.txt -/matrix_state diff --git a/data/.gitignore b/data/.gitignore new file mode 100644 index 0000000..005717e --- /dev/null +++ b/data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/src/bridgers.rs b/src/bridgers.rs index 76d14d7..11b71ab 100644 --- a/src/bridgers.rs +++ b/src/bridgers.rs @@ -1,5 +1,7 @@ use std::{cell::RefCell, str::FromStr, sync::Mutex}; +use sled::Db; + use crate::{ discord::{self, forward_to_discord}, matrix::{self, forward_to_matrix}, @@ -7,13 +9,17 @@ use crate::{ }; pub struct Bridgers { + pub db: Db, pub discord: Mutex>>, pub matrix: Mutex>>, } impl Bridgers { pub fn new() -> Self { + let db = sled::open("data/phoebe.sled").expect("Failed to open database"); + Self { + db, discord: Mutex::new(RefCell::new(None)), matrix: Mutex::new(RefCell::new(None)), } @@ -40,12 +46,12 @@ impl Bridgers { } pub async fn send_message(&self, message: SentMessage) -> Vec { - let mut created_messages = Vec::new(); + let mut related_messages = vec![message.source.clone()]; if let Some(discord) = self.discord.lock().unwrap().borrow().as_ref() { if let Some(channel) = self.get_linked_discord_channel(&message.source) { if let Some(m) = forward_to_discord(discord, channel, &message).await { - created_messages.push(m); + related_messages.push(m); } } } @@ -53,11 +59,29 @@ impl Bridgers { if let Some(matrix) = self.matrix.lock().unwrap().borrow().as_ref() { if let Some(room_id) = self.get_linked_matrix_room(&message.source) { if let Some(m) = forward_to_matrix(matrix, room_id, &message).await { - created_messages.push(m); + related_messages.push(m); } } } - created_messages + for source in related_messages.iter() { + let relations = related_messages + .iter() + .filter(|r| r != &source) + .collect::>(); + + let tree = self + .db + .open_tree("message_relations") + .expect("Failed to open relations tree"); + + tree.insert( + bincode::serialize(source).expect("Failed to serialize message reference"), + bincode::serialize(&relations).expect("Failed to serialize message relations"), + ) + .expect("Failed to store message relations"); + } + + related_messages } } diff --git a/src/main.rs b/src/main.rs index d5893ad..e570895 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,8 +14,6 @@ use bridgers::Bridgers; use messages::SentMessage; use tokio::sync::mpsc; -use crate::message_ast::Styled; - async fn setup_discord( token: String, bridgers: Arc, diff --git a/src/matrix.rs b/src/matrix.rs index b622a2f..db8712c 100644 --- a/src/matrix.rs +++ b/src/matrix.rs @@ -153,7 +153,7 @@ pub async fn create_matrix_client( password: String, message_tx: mpsc::UnboundedSender, ) -> Client { - let client_config = ClientConfig::new().store_path("./matrix_state"); + let client_config = ClientConfig::new().store_path("./data/matrix_state"); let homeserver_url = Url::parse(&homeserver_url).expect("Failed to parse the matrix homeserver URL"); diff --git a/src/messages.rs b/src/messages.rs index 242fff1..bdb29c5 100644 --- a/src/messages.rs +++ b/src/messages.rs @@ -2,7 +2,7 @@ use serde::{Deserialize, Serialize}; use crate::message_ast::MessageContent; -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq)] pub enum MessageReference { Discord(u64, u64), Matrix(String, String),