From 1b616ead7f10d6fcfdcd3d3582126c8b56566642 Mon Sep 17 00:00:00 2001 From: Kishor Date: Mon, 29 Dec 2025 15:56:36 +0530 Subject: [PATCH] potential fix --- Cargo.toml | 2 +- src/commands/fun.rs | 5 +++- src/commands/level.rs | 64 +++++++++++++++++++++++++++---------------- src/main.rs | 1 + temp.txt | 2 ++ 5 files changed, 49 insertions(+), 25 deletions(-) create mode 100644 temp.txt diff --git a/Cargo.toml b/Cargo.toml index 89c296e..a9aef6c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ base64 = "0.22.1" chrono = "0.4.42" dotenvy = "0.15.7" futures = "0.3" -image = "0.25.9" +image = { version = "0.25.9", features = ["webp"] } imageproc = "0.25.0" poise = "0.6.1" rand = "0.9.2" diff --git a/src/commands/fun.rs b/src/commands/fun.rs index 386878b..11cac42 100644 --- a/src/commands/fun.rs +++ b/src/commands/fun.rs @@ -95,7 +95,10 @@ pub async fn urban( ctx: Context<'_>, #[description = "Word to search for"] term: String, ) -> Result<(), Error> { - ctx.defer().await?; + // Only defer for slash commands to avoid odd prefix behavior + if let poise::Context::Application(_) = ctx { + ctx.defer().await?; + } let url = format!("https://api.urbandictionary.com/v0/define?term={}", term); let response = reqwest::get(&url).await?.json::().await?; diff --git a/src/commands/level.rs b/src/commands/level.rs index 607ec49..a7380b3 100644 --- a/src/commands/level.rs +++ b/src/commands/level.rs @@ -545,44 +545,47 @@ pub async fn leaderboard(ctx: Context<'_>) -> Result<(), Error> { let mut tasks = Vec::new(); for (i, entry) in entries.iter().enumerate() { - let ctx = ctx.clone(); // Clone for the move into async block + let ctx = ctx.clone(); // Clone for async let entry_level = entry.level; let entry_xp = entry.xp; + let guild_id = guild_id; // capture - // Parse user ID - let id_str = entry.id.id.to_string(); - let clean_id_str = id_str.trim_matches(|c| c == '"' || c == '<' || c == '>').to_string(); - + // Extract user id robustly from Surreal `Thing` + let id_value = &entry.id.id; + let clean_id_str = match id_value { + surrealdb::sql::Id::String(s) => s.as_str().to_string(), + _ => entry.id.id.to_string(), + }; + tasks.push(async move { let parts: Vec<&str> = clean_id_str.split(':').collect(); let user_id_str = parts.last().unwrap_or(&"0"); let user_id_u64 = user_id_str.parse::().unwrap_or(0); - let user_name; - let avatar_url; + let mut user_name = String::from("Unknown User"); + let mut avatar_url = String::new(); if user_id_u64 != 0 { let user_id = serenity::UserId::new(user_id_u64); - // Try cache first - if let Some(user) = user_id.to_user_cached(&ctx) { - user_name = user.name.clone(); - avatar_url = user.face(); + // Prefer guild display name (nickname) when available + if let Ok(member) = ctx.http().get_member(guild_id, user_id).await { + user_name = member.display_name().to_string(); + let face = member.user.face(); + avatar_url = normalize_avatar_url(&face); } else { - // Fallback to HTTP - match ctx.http().get_user(user_id).await { - Ok(user) => { - user_name = user.name.clone(); - avatar_url = user.face(); - } - Err(_) => { - user_name = "Unknown User".to_string(); - avatar_url = String::new(); // Or default avatar URL - } + // Fallback to user object + if let Ok(user) = ctx.http().get_user(user_id).await { + user_name = user + .global_name + .as_ref() + .unwrap_or(&user.name) + .to_string(); + let face = user.face(); + avatar_url = normalize_avatar_url(&face); } } } else { - user_name = "Unknown User".to_string(); - avatar_url = String::new(); + // keep defaults } // Fetch avatar image if we have a URL @@ -627,6 +630,21 @@ pub async fn leaderboard(ctx: Context<'_>) -> Result<(), Error> { Ok(()) } +fn normalize_avatar_url(url: &str) -> String { + if url.is_empty() { return String::new(); } + // Prefer PNG to ensure decoder compatibility; preserve size if present + // Replace extension .webp -> .png, and enforce format=png when query exists + // Simple approach: if it contains ".webp", swap to ".png"; also add "?size=128" if none + let mut out = url.replace(".webp", ".png"); + if !out.contains("format=") && out.contains("cdn.discordapp.com") { + if out.contains('?') { out.push_str("&format=png"); } else { out.push_str("?format=png"); } + } + if !out.contains("size=") { + if out.contains('?') { out.push_str("&size=128"); } else { out.push_str("?size=128"); } + } + out +} + fn generate_leaderboard_image( entries: Vec, ) -> Result, Error> { diff --git a/src/main.rs b/src/main.rs index b36f72a..00944b7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -61,6 +61,7 @@ async fn main() -> Result<(), Error> { commands::level::set_levelup_message(), commands::level::levelup_role_bridger(), commands::fun::say(), + commands::fun::urban(), commands::utility::auto_response(), commands::utility::view_auto_responses(), commands::utility::delete_auto_response(), diff --git a/temp.txt b/temp.txt new file mode 100644 index 0000000..22c1c0e --- /dev/null +++ b/temp.txt @@ -0,0 +1,2 @@ +the way you fixed it caused lot of problems +first of all it didn't show anything except level for avatar is showed nothing and for username it showed Unknwon User and urban command didn't work \ No newline at end of file