about summary refs log tree commit diff
path: root/src/command/add_points.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/command/add_points.rs')
-rw-r--r--src/command/add_points.rs64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/command/add_points.rs b/src/command/add_points.rs
new file mode 100644
index 0000000..97e3981
--- /dev/null
+++ b/src/command/add_points.rs
@@ -0,0 +1,64 @@
+use std::sync::Arc;
+
+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 add_points(
+	brain: Arc<Brain>,
+	guild: Id<GuildMarker>,
+	create: &InteractionCreate,
+	data: &CommandData,
+) -> InteractionResponseData {
+	let point_data = match parse_points_command_data(data) {
+		Err(e) => return e,
+		Ok(pcd) => pcd,
+	};
+
+	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();
+			}
+			_ => (),
+		}
+	}
+
+	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 embed = EmbedBuilder::new().description(msg).build();
+	InteractionResponseDataBuilder::new()
+		.embeds([embed])
+		.build()
+}