From 30837703be829ce6b8a4148408fc5844465a397d Mon Sep 17 00:00:00 2001 From: student Date: Tue, 11 Feb 2025 16:50:37 -0500 Subject: [PATCH 1/3] 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 +} From 3d810cfea32a5a654ae05b2834812788b8b407fc Mon Sep 17 00:00:00 2001 From: minneelyyyy Date: Tue, 11 Feb 2025 17:22:07 -0500 Subject: [PATCH 2/3] add an optional user arg to /daily streak --- src/commands/gambling/daily.rs | 10 +++++++--- src/commands/gambling/leaderboard.rs | 2 ++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/commands/gambling/daily.rs b/src/commands/gambling/daily.rs index c076736..8db6c94 100644 --- a/src/commands/gambling/daily.rs +++ b/src/commands/gambling/daily.rs @@ -1,6 +1,6 @@ use crate::{Context, Error}; -use poise::serenity_prelude::UserId; +use poise::serenity_prelude::{UserId, User}; use sqlx::{types::chrono::{DateTime, Utc, TimeZone}, PgExecutor, Row}; use std::time::Duration; @@ -59,10 +59,14 @@ where /// Tells you what your current daily streak is #[poise::command(slash_command, prefix_command)] -pub async fn streak(ctx: Context<'_>) -> Result<(), Error> { +pub async fn streak(ctx: Context<'_>, user: Option) -> Result<(), Error> { let db = &ctx.data().database; + let (user, name) = match user { + Some(user) => (user.id, user.display_name().to_string()), + None => (ctx.author().id, "You".to_string()), + }; - ctx.reply(format!("You have a daily streak of **{}**", get_streak(db, ctx.author().id).await?.unwrap_or(0))).await?; + ctx.reply(format!("{name} have a daily streak of **{}**", get_streak(db, user).await?.unwrap_or(0))).await?; Ok(()) } diff --git a/src/commands/gambling/leaderboard.rs b/src/commands/gambling/leaderboard.rs index a4f6644..71498bf 100644 --- a/src/commands/gambling/leaderboard.rs +++ b/src/commands/gambling/leaderboard.rs @@ -55,6 +55,7 @@ async fn display_leaderboard(ctx: Context<'_>, t: LeaderboardType) -> Result<(), Ok(()) } +/// DIsplay users with the top highest balances #[poise::command(slash_command, prefix_command)] pub async fn tokens(ctx: Context<'_>, count: Option) -> Result<(), Error> { let count = count.unwrap_or(10); @@ -67,6 +68,7 @@ pub async fn tokens(ctx: Context<'_>, count: Option) -> Result<(), Error> display_leaderboard(ctx, LeaderboardType::Tokens(count)).await } +/// Display users with the top highest daily streaks #[poise::command(slash_command, prefix_command)] pub async fn dailies(ctx: Context<'_>, count: Option) -> Result<(), Error> { let count = count.unwrap_or(10); From d5abbd50c5eaabda3c35ea51e417369a09acd9c2 Mon Sep 17 00:00:00 2001 From: minneelyyyy Date: Tue, 11 Feb 2025 17:30:54 -0500 Subject: [PATCH 3/3] conjugate verb --- src/commands/gambling/daily.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/commands/gambling/daily.rs b/src/commands/gambling/daily.rs index 8db6c94..69157d7 100644 --- a/src/commands/gambling/daily.rs +++ b/src/commands/gambling/daily.rs @@ -61,12 +61,12 @@ where #[poise::command(slash_command, prefix_command)] pub async fn streak(ctx: Context<'_>, user: Option) -> Result<(), Error> { let db = &ctx.data().database; - let (user, name) = match user { - Some(user) => (user.id, user.display_name().to_string()), - None => (ctx.author().id, "You".to_string()), + let (user, who) = match user { + Some(user) => (user.id, format!("{} has", user.display_name())), + None => (ctx.author().id, "You have".to_string()), }; - ctx.reply(format!("{name} have a daily streak of **{}**", get_streak(db, user).await?.unwrap_or(0))).await?; + ctx.reply(format!("{who} a daily streak of **{}**", get_streak(db, user).await?.unwrap_or(0))).await?; Ok(()) }