silly goober bot
at main 45 lines 1.5 kB view raw
1use crate::types::Context; 2use color_eyre::eyre::Result; 3use poise::{ 4 serenity_prelude::{CreateEmbed, User}, 5 CreateReply, 6}; 7 8/// Displays your or another user's info 9#[poise::command(slash_command)] 10pub async fn whois( 11 ctx: Context<'_>, 12 #[description = "Selected user"] user: Option<User>, 13) -> Result<()> { 14 let user = user.as_ref().unwrap_or_else(|| ctx.author()); 15 let membership = ctx.guild_id().unwrap().member(ctx.http(), user.id).await?; 16 17 let created_at = user.created_at().unix_timestamp(); 18 let joined_at = membership.joined_at.unwrap().unix_timestamp(); 19 20 let embed = CreateReply::default().embed( 21 CreateEmbed::default() 22 .title(&user.name) 23 .thumbnail(user.avatar_url().expect("avatar failed")) 24 .color(0x00ff_ffff) 25 .field("ID", user.id.to_string(), false) 26 .field("Username", &user.name, false) 27 .field("Created at", format!("<t:{created_at}:R>"), false) 28 .field("Joined at", format!("<t:{joined_at}:R>"), false) 29 .field( 30 "Roles", 31 membership 32 .roles(ctx.cache()) 33 .expect("No roles found") 34 .iter() 35 .map(|role| role.name.clone()) 36 .collect::<Vec<String>>() 37 .join(", "), 38 false, 39 ) 40 .field("Bot", user.bot.to_string(), false), 41 ); 42 43 ctx.send(embed).await?; 44 Ok(()) 45}