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