about summary refs log tree commit diff
path: root/src/command/add_points.rs
diff options
context:
space:
mode:
authorgennyble <gen@nyble.dev>2025-08-15 17:53:53 -0500
committergennyble <gen@nyble.dev>2025-08-15 17:53:53 -0500
commitdb62e4ab9c54a370e15ad6944963b2ceb8d2638b (patch)
tree24b7d59356a117b1c684a237bf7ecfb6477a50e7 /src/command/add_points.rs
parentd997d8a3d640cf36b0e705db249e1a8865f0b54f (diff)
downloadleaberblord-db62e4ab9c54a370e15ad6944963b2ceb8d2638b.tar.gz
leaberblord-db62e4ab9c54a370e15ad6944963b2ceb8d2638b.zip
refactor add_point and revise
Diffstat (limited to 'src/command/add_points.rs')
-rw-r--r--src/command/add_points.rs90
1 files changed, 22 insertions, 68 deletions
diff --git a/src/command/add_points.rs b/src/command/add_points.rs
index 453be2d..97e3981 100644
--- a/src/command/add_points.rs
+++ b/src/command/add_points.rs
@@ -1,21 +1,17 @@
 use std::sync::Arc;
 
 use twilight_model::{
-	application::interaction::application_command::{CommandData, CommandOptionValue},
+	application::interaction::application_command::CommandData,
 	gateway::payload::incoming::InteractionCreate,
 	http::interaction::InteractionResponseData,
-	id::{
-		Id,
-		marker::{GuildMarker, UserMarker},
-	},
+	id::{Id, marker::GuildMarker},
 };
 use twilight_util::builder::{InteractionResponseDataBuilder, embed::EmbedBuilder};
 
 use crate::{
-	bail,
 	brain::Brain,
-	database::{BoardRow, Error as DbError, PermissionSetting},
-	success, util,
+	command::{check_command_permissions, parse_points_command_data},
+	database::{BoardRow, Error as DbError},
 };
 
 pub async fn add_points(
@@ -24,71 +20,28 @@ pub async fn add_points(
 	create: &InteractionCreate,
 	data: &CommandData,
 ) -> InteractionResponseData {
-	let mut points = None;
-	let mut users: Vec<Id<UserMarker>> = vec![];
-
-	for opt in &data.options {
-		match opt.name.as_str() {
-			"points" => match opt.value {
-				CommandOptionValue::Integer(num) => points = Some(num),
-				_ => unreachable!(),
-			},
-			"users" => match &opt.value {
-				CommandOptionValue::String(raw) => {
-					let mentions = util::extract_user_mentions(&raw);
-					users = mentions;
-				}
-				_ => unreachable!(),
-			},
-			_ => unreachable!(),
-		}
-	}
-
-	if users.len() == 0 {
-		bail!("No users mentioned! Who do we add points to?")
-	}
-
-	let (points, points_display, points_verb) = match points {
-		Some(p) if p > 0 => (p, p, "added to"),
-		Some(p) if p < 0 => (p, -p, "removed from"),
-		Some(0) => {
-			return success!("adding 0 points is a no-operation! I won't do anything :)");
-		}
-		Some(_) | None => unreachable!(),
+	let point_data = match parse_points_command_data(data) {
+		Err(e) => return e,
+		Ok(pcd) => pcd,
 	};
 
 	brain.create_leaderboard_if_not_exists(guild);
-
-	let settings = brain.db.get_leaderboard_settings(guild.get()).unwrap();
-	if let PermissionSetting::RoleRequired = settings.permission {
-		if let Some(role) = settings.role {
-			let member = create.member.clone().unwrap();
-			let found_role = member.roles.iter().find(|vrole| vrole.get() == role);
-
-			if found_role.is_none() {
-				bail!("You do not have the right permissions to change the score");
-			}
-		} else {
-			// Seeing as the role is a required input on the subcommand, this
-			// would only happen with direct database fiddling or like, some
-			// really weird arcane bullshit?
-			bail!(
-				"Permissions set to Role Required, but no role is set. \
-				This shouldn't be able to happen. \
-				Maybe try to set the permissions again?"
-			);
-		}
+	if let Some(err) = check_command_permissions(&brain, guild, create.member.clone().unwrap()) {
+		return err;
 	}
 
-	for user in &users {
-		match brain.db.give_user_points(guild.get(), user.get(), points) {
+	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,
+					points: point_data.points,
 				};
 				brain.db.add_user_to_leaderboard(guild.get(), row).unwrap();
 			}
@@ -96,13 +49,14 @@ pub async fn add_points(
 		}
 	}
 
-	let users_string = users
-		.into_iter()
-		.map(|u| format!("<@{u}>"))
-		.collect::<Vec<String>>()
-		.join(", ");
+	let users_string = point_data.user_string();
+	let points_verb = point_data.points_verb;
+
+	let msg = format!(
+		"{} points {points_verb} {users_string}",
+		point_data.points.abs()
+	);
 
-	let msg = format!("{points_display} points {points_verb} {users_string}");
 	let embed = EmbedBuilder::new().description(msg).build();
 	InteractionResponseDataBuilder::new()
 		.embeds([embed])