about summary refs log tree commit diff
path: root/src/command/revise.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/command/revise.rs')
-rw-r--r--src/command/revise.rs82
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()
+}