use crate::common::{Context, Error}; use poise::serenity_prelude as serenity; use serenity::Colour; // this code uses Member::permissions, which while it is a deprecated function, it doesn't actually matter // since it is only used to display information to the user. #[allow(deprecated)] fn get_dox_output(ctx: &mut Context<'_>, user: &serenity::User, member: Option<&serenity::Member>, show_permissions: bool) -> String { let mut output = String::new(); if user.bot { output.push_str("This user is a bot.\n"); } output.push_str(&format!("**User ID**: {}\n", user.id)); if let Some(locale) = &user.locale { output.push_str(&format!("**Locale**: {locale}\n")); } if let Some(verified) = &user.verified { output.push_str(&format!("**Verified**: {verified}\n")); } output.push_str(&format!("**Account Created**: {}\n", user.created_at())); if let Some(Some(join_date)) = member.as_ref().map(|m| m.joined_at) { output.push_str(&format!("**Joined this Server at**: {join_date}\n")); } if let Some(Some(premium_since)) = member.as_ref().map(|m| m.premium_since) { output.push_str( &format!("**Boosting this Server**: Yes\n**Boosting since**: {premium_since}\n")); } if let Some(Ok(permissions)) = member.map(|m| m.permissions(ctx)).filter(|_| show_permissions) { output.push_str(&format!("**Permissions**: {}\n", permissions.get_permission_names().join(", "))) } output } /// Display information about a given user #[poise::command(slash_command, prefix_command)] pub async fn dox(mut ctx: Context<'_>, #[description = "The user to display information of"] user: serenity::User, #[rename = "permissions"] #[description = "Rather or not to show the user's permissions"] show_permissions: Option) -> Result<(), Error> { let user = ctx.http().get_user(user.id).await?; let member = if let Some(guild) = ctx.guild_id() { guild.member(ctx.http(), user.id).await.ok() } else { None }; let embed = serenity::CreateEmbed::default() .title(format!("Information about {}", user.name)) .description(get_dox_output( &mut ctx, &user, member.as_ref(), show_permissions.unwrap_or(false))) .colour(member.and_then(|m| m.colour(ctx.cache())) .unwrap_or(user.accent_colour.unwrap_or(Colour::from_rgb(255, 255, 255)))) .image(user.face()); ctx.send(poise::CreateReply::default().embed(embed)).await?; Ok(()) }