diff options
Diffstat (limited to 'src/command/revise.rs')
-rw-r--r-- | src/command/revise.rs | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/command/revise.rs b/src/command/revise.rs new file mode 100644 index 0000000..50b8c4e --- /dev/null +++ b/src/command/revise.rs @@ -0,0 +1,82 @@ +use std::sync::Arc; + +use time::format_description; +use twilight_model::{ + application::interaction::application_command::CommandData, + gateway::payload::incoming::InteractionCreate, + http::interaction::InteractionResponseData, + id::{Id, marker::GuildMarker}, +}; +use twilight_util::builder::{InteractionResponseDataBuilder, embed::EmbedBuilder}; + +use crate::{ + brain::Brain, + command::{check_command_permissions, parse_points_command_data}, + database::{BoardRow, Error as DbError}, +}; + +pub async fn revise( + brain: Arc<Brain>, + guild: Id<GuildMarker>, + create: &InteractionCreate, + data: &CommandData, +) -> InteractionResponseData { + let (point_data, date) = match parse_points_command_data(data) { + Err(e) => return e, + Ok(pcd) => match pcd.date { + Err(e) => return e, + Ok(date) => (pcd, date), + }, + }; + + brain.create_leaderboard_if_not_exists(guild); + if let Some(err) = check_command_permissions(&brain, guild, create.member.clone().unwrap()) { + return err; + } + + for user in &point_data.users { + match brain + .db + .give_user_points(guild.get(), user.get(), point_data.points) + { + Err(DbError::UserNotExist) => { + let member = brain.guild_member(guild, *user).await; + let row = BoardRow { + user_id: user.get(), + user_handle: member.handle, + user_nickname: member.nick.or(member.global_name), + points: point_data.points, + }; + brain.db.add_user_to_leaderboard(guild.get(), row).unwrap(); + } + _ => (), + } + + //FIXME: gen 2025-08-14: do not assume UTC! + brain + .db + .revise_last_history_date( + guild.get(), + user.get(), + point_data.points, + date.assume_utc(), + ) + .unwrap(); + } + + let datetime_fmt = + format_description::parse("[year]-[month]-[day] [hour]:[minute]:[second]").unwrap(); + + let points_verb = point_data.points_verb; + let users_string = point_data.user_string(); + + let msg = format!( + "{} points {points_verb} {users_string} on date {}", + point_data.points.abs(), + date.format(&datetime_fmt).unwrap() + ); + let embed = EmbedBuilder::new().description(msg).build(); + InteractionResponseDataBuilder::new() + .embeds([embed]) + .build() +} |