Ajout de la gestion des messages observés : implémentation des fonctions pour récupérer et mettre à jour les messages dans la base de données lors de la suppression et de la mise à jour des messages.

This commit is contained in:
Puechberty Arthur
2026-04-10 19:11:30 +02:00
parent dc07a10c9f
commit 6110da331d
3 changed files with 126 additions and 8 deletions
+63
View File
@@ -2439,6 +2439,69 @@ pub async fn upsert_message_observed(
Ok(())
}
pub async fn get_observed_message(
pool: &PgPool,
bot_id: UserId,
message_id: MessageId,
) -> Result<Option<(Option<UserId>, String)>, sqlx::Error> {
let row = sqlx::query_as::<_, (Option<i64>, String)>(
r#"
SELECT author_id, content
FROM message_log
WHERE bot_id = $1
AND message_id = $2
LIMIT 1;
"#,
)
.bind(bot_id.get() as i64)
.bind(message_id.get() as i64)
.fetch_optional(pool)
.await?;
Ok(row.map(|(author_id, content)| {
(
author_id
.and_then(|id| u64::try_from(id).ok())
.map(UserId::new),
content,
)
}))
}
pub async fn upsert_message_observed_partial(
pool: &PgPool,
bot_id: UserId,
message_id: MessageId,
guild_id: Option<GuildId>,
channel_id: ChannelId,
author_id: Option<UserId>,
content: &str,
) -> Result<(), sqlx::Error> {
sqlx::query(
r#"
INSERT INTO message_log (bot_id, message_id, guild_id, channel_id, author_id, content)
VALUES ($1, $2, $3, $4, $5, $6)
ON CONFLICT (bot_id, message_id)
DO UPDATE SET
guild_id = EXCLUDED.guild_id,
channel_id = EXCLUDED.channel_id,
author_id = EXCLUDED.author_id,
content = EXCLUDED.content,
observed_at = NOW();
"#,
)
.bind(bot_id.get() as i64)
.bind(message_id.get() as i64)
.bind(guild_id.map(|id| id.get() as i64))
.bind(channel_id.get() as i64)
.bind(author_id.map(|id| id.get() as i64))
.bind(content)
.execute(pool)
.await?;
Ok(())
}
pub async fn mark_message_deleted(
pool: &PgPool,
bot_id: UserId,
+22 -6
View File
@@ -2,7 +2,9 @@ use serenity::model::prelude::*;
use serenity::prelude::*;
use crate::commands::logs_service;
use crate::db::{DbPoolKey, mark_message_deleted, mark_sent_mp_deleted_by_message};
use crate::db::{
DbPoolKey, get_observed_message, mark_message_deleted, mark_sent_mp_deleted_by_message,
};
pub async fn handle_message_delete(
ctx: &Context,
@@ -12,17 +14,31 @@ pub async fn handle_message_delete(
) {
let bot_id = ctx.cache.current_user().id;
let (fallback_author_id, fallback_content) =
let (cache_author_id, cache_content) =
if let Some(cached) = ctx.cache.message(channel_id, deleted_message_id) {
(Some(cached.author.id), Some(cached.content.clone()))
} else {
(None, None)
};
let mut resolved_author_id = cache_author_id;
let mut resolved_content = cache_content;
if let Some(pool) = {
let data = ctx.data.read().await;
data.get::<DbPoolKey>().cloned()
} {
if let Ok(Some((db_author_id, db_content))) =
get_observed_message(&pool, bot_id, deleted_message_id).await
{
if resolved_author_id.is_none() {
resolved_author_id = db_author_id;
}
if resolved_content.is_none() {
resolved_content = Some(db_content);
}
}
let _ =
mark_sent_mp_deleted_by_message(&pool, bot_id, channel_id, deleted_message_id).await;
@@ -32,8 +48,8 @@ pub async fn handle_message_delete(
guild_id,
channel_id,
deleted_message_id,
fallback_author_id,
fallback_content.clone(),
resolved_author_id,
resolved_content.clone(),
)
.await;
}
@@ -43,8 +59,8 @@ pub async fn handle_message_delete(
guild_id,
channel_id,
deleted_message_id,
fallback_author_id,
fallback_content,
resolved_author_id,
resolved_content,
)
.await;
}
+41 -2
View File
@@ -2,6 +2,7 @@ use serenity::model::prelude::*;
use serenity::prelude::*;
use crate::commands::logs_service;
use crate::db::{DbPoolKey, get_observed_message, upsert_message_observed_partial};
pub async fn handle_message_update(
ctx: &Context,
@@ -9,7 +10,30 @@ pub async fn handle_message_update(
new: Option<Message>,
event: &MessageUpdateEvent,
) {
let before = old_if_available.as_ref().map(|m| m.content.clone());
let bot_id = ctx.cache.current_user().id;
let pool = {
let data = ctx.data.read().await;
data.get::<DbPoolKey>().cloned()
};
let db_fallback = if let Some(pool) = pool.as_ref() {
get_observed_message(pool, bot_id, event.id)
.await
.ok()
.flatten()
} else {
None
};
let db_author_id = db_fallback
.as_ref()
.and_then(|(author_id, _)| author_id.clone());
let db_content = db_fallback.as_ref().map(|(_, content)| content.clone());
let before = old_if_available
.as_ref()
.map(|m| m.content.clone())
.or_else(|| db_content.clone());
let after = new
.as_ref()
.map(|m| m.content.clone())
@@ -17,7 +41,22 @@ pub async fn handle_message_update(
let author_id = old_if_available
.as_ref()
.map(|m| m.author.id)
.or_else(|| new.as_ref().map(|m| m.author.id));
.or_else(|| new.as_ref().map(|m| m.author.id))
.or_else(|| event.author.as_ref().map(|u| u.id))
.or(db_author_id);
if let (Some(pool), Some(after_content)) = (pool.as_ref(), after.as_ref()) {
let _ = upsert_message_observed_partial(
pool,
bot_id,
event.id,
event.guild_id,
event.channel_id,
author_id,
after_content,
)
.await;
}
logs_service::on_message_edited(
ctx,