feat: improved the count command

This commit is contained in:
silver 2025-03-14 04:03:20 +00:00
parent 421d425f5d
commit b44518c467
Signed by untrusted user: silver
GPG key ID: 36F93D61BAD3FD7D

View file

@ -83,9 +83,12 @@ pub mod committee {
pub mod servers { pub mod servers {
// get the list of all the current clubs/socs // get the list of all the current clubs/socs
use serde::{Deserialize, Serialize};
use serenity::all::{CommandInteraction, CommandOptionType, Context, CreateCommand, CreateCommandOption}; use serenity::all::{CommandInteraction, CommandOptionType, Context, CreateCommand, CreateCommandOption};
use skynet_discord_bot::common::database::{get_server_config_bulk, DataBase}; use skynet_discord_bot::common::database::{get_server_config_bulk, DataBase};
use skynet_discord_bot::common::set_roles::committee::get_committees; use skynet_discord_bot::common::set_roles::committee::get_committees;
use skynet_discord_bot::get_now_iso;
use sqlx::{Pool, Sqlite};
use std::collections::HashMap; use std::collections::HashMap;
pub async fn run(_command: &CommandInteraction, ctx: &Context) -> String { pub async fn run(_command: &CommandInteraction, ctx: &Context) -> String {
@ -108,7 +111,15 @@ pub mod servers {
} }
} }
cs.sort_by_key(|(count, _, _)| *count); // get all members
let (wolves_current, wolves_past) = get_wolves_total(&db).await;
cs.push((wolves_current, wolves_past, String::from("Skynet Network")));
// treat teh committee server as its own thing
let committee_current = get_wolves_committee(&db).await;
cs.push((committee_current, 0, String::from("Committee")));
cs.sort_by_key(|(current, _, _)| *current);
cs.reverse(); cs.reverse();
// msg can be a max 2000 chars long // msg can be a max 2000 chars long
@ -148,6 +159,74 @@ pub mod servers {
response.join("\n") response.join("\n")
} }
#[derive(Debug, Clone, Deserialize, Serialize, sqlx::FromRow)]
pub struct Count {
pub count: i64,
}
async fn get_wolves_total(db: &Pool<Sqlite>) -> (i64, i64) {
let total = match sqlx::query_as::<_, Count>(
r#"
SELECT COUNT(DISTINCT id_wolves) as count
FROM wolves
WHERE discord IS NOT NULL
"#,
)
.fetch_one(db)
.await
{
Ok(res) => res.count,
Err(e) => {
dbg!(e);
0
}
};
let current = match sqlx::query_as::<_, Count>(
r#"
SELECT COUNT(DISTINCT id_wolves) as count
FROM server_members
JOIN wolves USING (id_wolves)
WHERE (
wolves.discord IS NOT NULL
AND server_members.expiry > ?
)
"#,
)
.bind(get_now_iso(true))
.fetch_one(db)
.await
{
Ok(res) => res.count,
Err(e) => {
dbg!(e);
0
}
};
(current, total)
}
async fn get_wolves_committee(db: &Pool<Sqlite>) -> i64 {
// expiry
match sqlx::query_as::<_, Count>(
"
SELECT count
FROM committee_roles
WHERE id_wolves = '0'
",
)
.fetch_one(db)
.await
{
Ok(res) => res.count,
Err(e) => {
dbg!(e);
0
}
}
}
pub fn register() -> CreateCommand { pub fn register() -> CreateCommand {
CreateCommand::new("count") CreateCommand::new("count")
.description("Count the servers") .description("Count the servers")