diff --git a/phoebe-main/src/main.rs b/phoebe-main/src/main.rs index 6583b97..7e15bef 100644 --- a/phoebe-main/src/main.rs +++ b/phoebe-main/src/main.rs @@ -37,9 +37,12 @@ async fn handle_events( ) } - if let Err(e) = link_messages(&mut conn, &message.origin, &resulting_messages).await - { - tracing::error!("Failed to link messages: {e}"); + if !resulting_messages.is_empty() { + if let Err(e) = + link_messages(&mut conn, &message.origin, &resulting_messages).await + { + tracing::error!("Failed to link messages: {e}"); + } } } } diff --git a/phoebe/src/lib.rs b/phoebe/src/lib.rs index 700d687..cbfc4a4 100644 --- a/phoebe/src/lib.rs +++ b/phoebe/src/lib.rs @@ -74,24 +74,29 @@ pub async fn link_messages( Ok(()) } +pub async fn get_message_link_id( + conn: &mut SqliteConnection, + message: &ChatMessageReference, +) -> sqlx::Result { + let service = &message.channel.service; + let channel = &message.channel.id; + let message_id = &message.message_id; + let query = sqlx::query!( + "SELECT link_id FROM messages WHERE service = ? AND channel = ? AND message = ?", + service, + channel, + message_id + ); + let r = query.fetch_one(&mut *conn).await?; + Ok(r.link_id) +} + pub async fn get_linked_messages<'a>( conn: &'a mut SqliteConnection, dyn_service: DynServiceLookup, message: &ChatMessageReference, ) -> sqlx::Result> { - let link_id = { - let service = &message.channel.service; - let channel = &message.channel.id; - let message_id = &message.message_id; - let query = sqlx::query!( - "SELECT link_id FROM messages WHERE service = ? AND channel = ? AND message = ?", - service, - channel, - message_id - ); - query.fetch_one(&mut *conn).await - }? - .link_id; + let link_id = get_message_link_id(&mut *conn, message).await?; let stream = sqlx::query("SELECT * FROM messages WHERE link_id = ?") .bind(link_id) diff --git a/services/phoebe-discord/src/handler.rs b/services/phoebe-discord/src/handler.rs index 3b2dccf..a352927 100644 --- a/services/phoebe-discord/src/handler.rs +++ b/services/phoebe-discord/src/handler.rs @@ -1,4 +1,4 @@ -use phoebe::{mid_chat::*, prelude::*}; +use phoebe::{get_message_link_id, mid_chat::*, prelude::*}; use serenity::{ client::{Context, EventHandler}, model::prelude::*, @@ -50,6 +50,13 @@ impl EventHandler for DiscordHandler { async fn message(&self, ctx: Context, message: Message) { let origin = ChatMessageReference::new(discord_reference(message.channel_id), message.id); + // skip messages linked to ones we have already seen + if let Ok(mut conn) = self.core_db.acquire().await { + if get_message_link_id(&mut conn, &origin).await.is_ok() { + return; + } + } + let author = self.get_author(&ctx, &message).await; let content = discord_message_format::parse(&message.content);