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, guild: Id, 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() }