fix(moderation): properly convert UserId to Member (#50)

This commit is contained in:
Ax333l 2023-01-07 01:03:46 +01:00 committed by GitHub
parent 8376eb9b4e
commit 05ff0a27d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 3 deletions

View File

@ -7,6 +7,7 @@ use poise::serenity_prelude::{
use tracing::{debug, error, trace}; use tracing::{debug, error, trace};
use crate::db::model::{LockedChannel, Muted}; use crate::db::model::{LockedChannel, Muted};
use crate::utils::bot::get_member;
use crate::utils::macros::to_user; use crate::utils::macros::to_user;
use crate::utils::moderation::{ use crate::utils::moderation::{
ban_moderation, queue_unmute_member, respond_moderation, BanKind, ModerationKind, ban_moderation, queue_unmute_member, respond_moderation, BanKind, ModerationKind,
@ -244,7 +245,6 @@ pub async fn mute(
let guild_id = ctx.guild_id().unwrap(); let guild_id = ctx.guild_id().unwrap();
let discord = ctx.discord(); let discord = ctx.discord();
let cache = &discord.cache;
let unmute_time = if !mute_duration.is_zero() { let unmute_time = if !mute_duration.is_zero() {
Some((now + mute_duration).timestamp() as u64) Some((now + mute_duration).timestamp() as u64)
@ -260,7 +260,7 @@ pub async fn mute(
}; };
let result = async { let result = async {
if let Some(mut member) = cache.member(guild_id, id) { if let Some(mut member) = get_member(discord, guild_id, id).await? {
let (is_currently_muted, removed_roles) = let (is_currently_muted, removed_roles) =
crate::utils::moderation::mute_moderation(&ctx, &mut member, mute).await?; crate::utils::moderation::mute_moderation(&ctx, &mut member, mute).await?;
// Prevent the bot from overriding the "take" field. // Prevent the bot from overriding the "take" field.

View File

@ -13,3 +13,22 @@ pub fn load_configuration() -> Configuration {
pub async fn get_data_lock(ctx: &serenity::Context) -> Arc<RwLock<Data>> { pub async fn get_data_lock(ctx: &serenity::Context) -> Arc<RwLock<Data>> {
ctx.data.read().await.get::<Data>().unwrap().clone() ctx.data.read().await.get::<Data>().unwrap().clone()
} }
pub async fn get_member(
ctx: &serenity::Context,
guild_id: serenity::GuildId,
user_id: serenity::UserId,
) -> serenity::Result<Option<serenity::Member>> {
match guild_id.member(ctx, user_id).await {
Ok(member) => Ok(Some(member)),
Err(serenity::SerenityError::Http(err))
if matches!(
err.status_code(),
Some(serenity::http::StatusCode::NOT_FOUND)
) =>
{
Ok(None)
},
Err(err) => Err(err),
}
}

View File

@ -12,6 +12,7 @@ use crate::db::database::Database;
use crate::db::model::Muted; use crate::db::model::Muted;
use crate::model::application::{Configuration, Mute}; use crate::model::application::{Configuration, Mute};
use crate::serenity::SerenityError; use crate::serenity::SerenityError;
use crate::utils::bot::get_member;
use crate::{Context, Error}; use crate::{Context, Error};
pub enum ModerationKind { pub enum ModerationKind {
@ -94,7 +95,7 @@ pub fn queue_unmute_member(
.ok_or("User was not muted.")?; .ok_or("User was not muted.")?;
// Update roles if they didn't leave the guild. // Update roles if they didn't leave the guild.
if let Some(mut member) = ctx.cache.member(guild_id, user_id) { if let Some(mut member) = get_member(&ctx, guild_id, user_id).await? {
let http = &ctx.http; let http = &ctx.http;
if let Some(taken_roles) = db_result.taken_roles { if let Some(taken_roles) = db_result.taken_roles {