silly goober bot
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}