potential fix
This commit is contained in:
@@ -14,7 +14,7 @@ base64 = "0.22.1"
|
|||||||
chrono = "0.4.42"
|
chrono = "0.4.42"
|
||||||
dotenvy = "0.15.7"
|
dotenvy = "0.15.7"
|
||||||
futures = "0.3"
|
futures = "0.3"
|
||||||
image = "0.25.9"
|
image = { version = "0.25.9", features = ["webp"] }
|
||||||
imageproc = "0.25.0"
|
imageproc = "0.25.0"
|
||||||
poise = "0.6.1"
|
poise = "0.6.1"
|
||||||
rand = "0.9.2"
|
rand = "0.9.2"
|
||||||
|
|||||||
@@ -95,7 +95,10 @@ pub async fn urban(
|
|||||||
ctx: Context<'_>,
|
ctx: Context<'_>,
|
||||||
#[description = "Word to search for"] term: String,
|
#[description = "Word to search for"] term: String,
|
||||||
) -> Result<(), Error> {
|
) -> 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 url = format!("https://api.urbandictionary.com/v0/define?term={}", term);
|
||||||
let response = reqwest::get(&url).await?.json::<UrbanResponse>().await?;
|
let response = reqwest::get(&url).await?.json::<UrbanResponse>().await?;
|
||||||
|
|||||||
@@ -545,44 +545,47 @@ pub async fn leaderboard(ctx: Context<'_>) -> Result<(), Error> {
|
|||||||
let mut tasks = Vec::new();
|
let mut tasks = Vec::new();
|
||||||
|
|
||||||
for (i, entry) in entries.iter().enumerate() {
|
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_level = entry.level;
|
||||||
let entry_xp = entry.xp;
|
let entry_xp = entry.xp;
|
||||||
|
let guild_id = guild_id; // capture
|
||||||
|
|
||||||
// Parse user ID
|
// Extract user id robustly from Surreal `Thing`
|
||||||
let id_str = entry.id.id.to_string();
|
let id_value = &entry.id.id;
|
||||||
let clean_id_str = id_str.trim_matches(|c| c == '"' || c == '<' || c == '>').to_string();
|
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 {
|
tasks.push(async move {
|
||||||
let parts: Vec<&str> = clean_id_str.split(':').collect();
|
let parts: Vec<&str> = clean_id_str.split(':').collect();
|
||||||
let user_id_str = parts.last().unwrap_or(&"0");
|
let user_id_str = parts.last().unwrap_or(&"0");
|
||||||
let user_id_u64 = user_id_str.parse::<u64>().unwrap_or(0);
|
let user_id_u64 = user_id_str.parse::<u64>().unwrap_or(0);
|
||||||
|
|
||||||
let user_name;
|
let mut user_name = String::from("Unknown User");
|
||||||
let avatar_url;
|
let mut avatar_url = String::new();
|
||||||
|
|
||||||
if user_id_u64 != 0 {
|
if user_id_u64 != 0 {
|
||||||
let user_id = serenity::UserId::new(user_id_u64);
|
let user_id = serenity::UserId::new(user_id_u64);
|
||||||
// Try cache first
|
// Prefer guild display name (nickname) when available
|
||||||
if let Some(user) = user_id.to_user_cached(&ctx) {
|
if let Ok(member) = ctx.http().get_member(guild_id, user_id).await {
|
||||||
user_name = user.name.clone();
|
user_name = member.display_name().to_string();
|
||||||
avatar_url = user.face();
|
let face = member.user.face();
|
||||||
|
avatar_url = normalize_avatar_url(&face);
|
||||||
} else {
|
} else {
|
||||||
// Fallback to HTTP
|
// Fallback to user object
|
||||||
match ctx.http().get_user(user_id).await {
|
if let Ok(user) = ctx.http().get_user(user_id).await {
|
||||||
Ok(user) => {
|
user_name = user
|
||||||
user_name = user.name.clone();
|
.global_name
|
||||||
avatar_url = user.face();
|
.as_ref()
|
||||||
}
|
.unwrap_or(&user.name)
|
||||||
Err(_) => {
|
.to_string();
|
||||||
user_name = "Unknown User".to_string();
|
let face = user.face();
|
||||||
avatar_url = String::new(); // Or default avatar URL
|
avatar_url = normalize_avatar_url(&face);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
user_name = "Unknown User".to_string();
|
// keep defaults
|
||||||
avatar_url = String::new();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetch avatar image if we have a URL
|
// Fetch avatar image if we have a URL
|
||||||
@@ -627,6 +630,21 @@ pub async fn leaderboard(ctx: Context<'_>) -> Result<(), Error> {
|
|||||||
Ok(())
|
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(
|
fn generate_leaderboard_image(
|
||||||
entries: Vec<LeaderboardRenderEntry>,
|
entries: Vec<LeaderboardRenderEntry>,
|
||||||
) -> Result<Vec<u8>, Error> {
|
) -> Result<Vec<u8>, Error> {
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ async fn main() -> Result<(), Error> {
|
|||||||
commands::level::set_levelup_message(),
|
commands::level::set_levelup_message(),
|
||||||
commands::level::levelup_role_bridger(),
|
commands::level::levelup_role_bridger(),
|
||||||
commands::fun::say(),
|
commands::fun::say(),
|
||||||
|
commands::fun::urban(),
|
||||||
commands::utility::auto_response(),
|
commands::utility::auto_response(),
|
||||||
commands::utility::view_auto_responses(),
|
commands::utility::view_auto_responses(),
|
||||||
commands::utility::delete_auto_response(),
|
commands::utility::delete_auto_response(),
|
||||||
|
|||||||
Reference in New Issue
Block a user