diff --git a/crates/rustmail/src/db/operations/banned_users.rs b/crates/rustmail/src/db/operations/banned_users.rs index 5c84a88..15e26ee 100644 --- a/crates/rustmail/src/db/operations/banned_users.rs +++ b/crates/rustmail/src/db/operations/banned_users.rs @@ -237,6 +237,23 @@ pub async fn save_banned_user(user: &BannedUser, pool: &SqlitePool) -> ModmailRe Ok(()) } +pub async fn delete_banned_user( + guild_id: &str, + user_id: &str, + pool: &SqlitePool, +) -> ModmailResult<()> { + sqlx::query("DELETE FROM banned_users WHERE guild_id = ? AND user_id = ?") + .bind(guild_id) + .bind(user_id) + .execute(pool) + .await + .map_err(|e| { + eprintln!("Failed to delete banned user: {e:?}"); + validation_failed("Failed to delete banned user") + })?; + Ok(()) +} + pub async fn get_banned_user_by_id( guild_id: &str, user_id: &str, diff --git a/crates/rustmail/src/handlers/guild_ban_handler.rs b/crates/rustmail/src/handlers/guild_ban_handler.rs index 710b83c..2d78972 100644 --- a/crates/rustmail/src/handlers/guild_ban_handler.rs +++ b/crates/rustmail/src/handlers/guild_ban_handler.rs @@ -89,6 +89,19 @@ impl EventHandler for GuildBanHandler { return; }; record_member(pool, &new_member).await; + + if let Err(e) = delete_banned_user( + &new_member.guild_id.to_string(), + &new_member.user.id.to_string(), + pool, + ) + .await + { + eprintln!( + "Failed to forget banned user {} after rejoining guild {}: {:?}", + new_member.user.id, new_member.guild_id, e + ); + } } async fn guild_member_update(