mirror of
https://github.com/arthur-pbty/shadowbot.git
synced 2026-06-03 23:36:25 +02:00
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:
@@ -2439,6 +2439,69 @@ pub async fn upsert_message_observed(
|
|||||||
Ok(())
|
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(
|
pub async fn mark_message_deleted(
|
||||||
pool: &PgPool,
|
pool: &PgPool,
|
||||||
bot_id: UserId,
|
bot_id: UserId,
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ use serenity::model::prelude::*;
|
|||||||
use serenity::prelude::*;
|
use serenity::prelude::*;
|
||||||
|
|
||||||
use crate::commands::logs_service;
|
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(
|
pub async fn handle_message_delete(
|
||||||
ctx: &Context,
|
ctx: &Context,
|
||||||
@@ -12,17 +14,31 @@ pub async fn handle_message_delete(
|
|||||||
) {
|
) {
|
||||||
let bot_id = ctx.cache.current_user().id;
|
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) {
|
if let Some(cached) = ctx.cache.message(channel_id, deleted_message_id) {
|
||||||
(Some(cached.author.id), Some(cached.content.clone()))
|
(Some(cached.author.id), Some(cached.content.clone()))
|
||||||
} else {
|
} else {
|
||||||
(None, None)
|
(None, None)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut resolved_author_id = cache_author_id;
|
||||||
|
let mut resolved_content = cache_content;
|
||||||
|
|
||||||
if let Some(pool) = {
|
if let Some(pool) = {
|
||||||
let data = ctx.data.read().await;
|
let data = ctx.data.read().await;
|
||||||
data.get::<DbPoolKey>().cloned()
|
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 _ =
|
let _ =
|
||||||
mark_sent_mp_deleted_by_message(&pool, bot_id, channel_id, deleted_message_id).await;
|
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,
|
guild_id,
|
||||||
channel_id,
|
channel_id,
|
||||||
deleted_message_id,
|
deleted_message_id,
|
||||||
fallback_author_id,
|
resolved_author_id,
|
||||||
fallback_content.clone(),
|
resolved_content.clone(),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
@@ -43,8 +59,8 @@ pub async fn handle_message_delete(
|
|||||||
guild_id,
|
guild_id,
|
||||||
channel_id,
|
channel_id,
|
||||||
deleted_message_id,
|
deleted_message_id,
|
||||||
fallback_author_id,
|
resolved_author_id,
|
||||||
fallback_content,
|
resolved_content,
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ use serenity::model::prelude::*;
|
|||||||
use serenity::prelude::*;
|
use serenity::prelude::*;
|
||||||
|
|
||||||
use crate::commands::logs_service;
|
use crate::commands::logs_service;
|
||||||
|
use crate::db::{DbPoolKey, get_observed_message, upsert_message_observed_partial};
|
||||||
|
|
||||||
pub async fn handle_message_update(
|
pub async fn handle_message_update(
|
||||||
ctx: &Context,
|
ctx: &Context,
|
||||||
@@ -9,7 +10,30 @@ pub async fn handle_message_update(
|
|||||||
new: Option<Message>,
|
new: Option<Message>,
|
||||||
event: &MessageUpdateEvent,
|
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
|
let after = new
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|m| m.content.clone())
|
.map(|m| m.content.clone())
|
||||||
@@ -17,7 +41,22 @@ pub async fn handle_message_update(
|
|||||||
let author_id = old_if_available
|
let author_id = old_if_available
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|m| m.author.id)
|
.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(
|
logs_service::on_message_edited(
|
||||||
ctx,
|
ctx,
|
||||||
|
|||||||
Reference in New Issue
Block a user