From 30837703be829ce6b8a4148408fc5844465a397d Mon Sep 17 00:00:00 2001 From: student Date: Tue, 11 Feb 2025 16:50:37 -0500 Subject: [PATCH] add streaks leaderboard, making /leaderboard tokens and /leaderboard dailies both new subcommands --- src/commands/gambling/leaderboard.rs | 90 ++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 17 deletions(-) diff --git a/src/commands/gambling/leaderboard.rs b/src/commands/gambling/leaderboard.rs index dfc025b..a4f6644 100644 --- a/src/commands/gambling/leaderboard.rs +++ b/src/commands/gambling/leaderboard.rs @@ -3,28 +3,84 @@ use crate::common::{Context, Error}; use poise::serenity_prelude::UserId; use sqlx::Row; -/// Display a leaderboard of the top 10 wealthiest players -#[poise::command(slash_command, prefix_command, aliases("lb"))] -pub async fn leaderboard(ctx: Context<'_>) -> Result<(), Error> { +enum LeaderboardType { + Tokens(usize), + Dailies(usize), +} + +async fn display_leaderboard(ctx: Context<'_>, t: LeaderboardType) -> Result<(), Error> { let db = &ctx.data().database; - let rows = sqlx::query( - r#" - SELECT id, balance FROM bank - ORDER BY balance DESC - LIMIT 10 - "# - ).fetch_all(db).await?; + match t { + LeaderboardType::Tokens(count) => { + let rows = sqlx::query( + r#" + SELECT id, balance FROM bank + ORDER BY balance DESC + LIMIT $1 + "# + ).bind(count as i32).fetch_all(db).await?; - let users: Vec<(_, i32)> = rows.iter().map(|row| (UserId::new(row.get::(0) as u64), row.get(1))).collect(); - let mut output = String::new(); + let users: Vec<(_, i32)> = rows.iter().map(|row| (UserId::new(row.get::(0) as u64), row.get(1))).collect(); + let mut output = String::new(); - for (id, balance) in users { - let user = id.to_user(ctx).await?; - output += &format!("{} - {}\n", user.display_name(), balance); + for (id, balance) in users { + let user = id.to_user(ctx).await?; + output += &format!("{} - {}\n", user.display_name(), balance); + } + + ctx.reply(format!("```\n{output}```")).await?; + } + LeaderboardType::Dailies(count) => { + let rows = sqlx::query( + r#" + SELECT userid, streak FROM dailies + ORDER BY streak DESC + LIMIT $1 + "# + ).bind(count as i32).fetch_all(db).await?; + + let users: Vec<(_, i32)> = rows.iter().map(|row| (UserId::new(row.get::(0) as u64), row.get(1))).collect(); + let mut output = String::new(); + + for (id, streak) in users { + let user = id.to_user(ctx).await?; + output += &format!("{} - {}\n", user.display_name(), streak); + } + + ctx.reply(format!("```\n{output}```")).await?; + } } - ctx.reply(format!("```\n{output}```")).await?; - Ok(()) } + +#[poise::command(slash_command, prefix_command)] +pub async fn tokens(ctx: Context<'_>, count: Option) -> Result<(), Error> { + let count = count.unwrap_or(10); + + if count < 1 || count > 20 { + ctx.reply(format!("Sorry, I cannot display {count} entries.")).await?; + return Ok(()); + } + + display_leaderboard(ctx, LeaderboardType::Tokens(count)).await +} + +#[poise::command(slash_command, prefix_command)] +pub async fn dailies(ctx: Context<'_>, count: Option) -> Result<(), Error> { + let count = count.unwrap_or(10); + + if count < 1 || count > 20 { + ctx.reply(format!("Sorry, I cannot display {count} entries.")).await?; + return Ok(()); + } + + display_leaderboard(ctx, LeaderboardType::Dailies(count)).await +} + +/// Display a leaderboard +#[poise::command(slash_command, prefix_command, aliases("lb"), subcommands("tokens", "dailies"))] +pub async fn leaderboard(ctx: Context<'_>) -> Result<(), Error> { + display_leaderboard(ctx, LeaderboardType::Tokens(10)).await +}