diff --git a/src/commands/sm_server.rs b/src/commands/sm_server.rs index 6fe08d4..69b0fb5 100644 --- a/src/commands/sm_server.rs +++ b/src/commands/sm_server.rs @@ -6,15 +6,28 @@ use serenity::model::channel::Message; use crate::utils; // COLOR ROLE IDS - +const ROLE_ID_RED: u64 = 279338933748236289; +const ROLE_ID_GREEN: u64 = 279338847102566400; +const ROLE_ID_BLUE: u64 = 279338904526782464; +const ROLE_ID_YELLOW: u64 = 279339011921805312; +const ROLE_ID_PINK: u64 = 279339051444862976; +const ROLE_ID_ORANGE: u64 = 279339077382438912; +const ROLE_ID_PURPLE: u64 = 284310454908747787; pub async fn parse_command(ctx: Context, msg: Message, server_id: GuildId) { + + if handle_meme(ctx.clone(), msg.clone(), server_id).await + { + return; + } + let command_lower = msg.content.to_lowercase(); let mut command_iter = command_lower.split_whitespace(); let command_start = command_iter.next(); + if command_start == Some(".randomizer") { let item = utils::get_random_item(); @@ -35,9 +48,66 @@ pub async fn parse_command(ctx: Context, msg: Message, server_id: GuildId) match arg { // TODO: add color roles + "red" => { set_color(ctx, msg, RoleId(ROLE_ID_RED), server_id).await; return; } + "green" => { set_color(ctx, msg, RoleId(ROLE_ID_GREEN), server_id).await; return; } + "blue" => { set_color(ctx, msg, RoleId(ROLE_ID_BLUE), server_id).await; return; } + "yellow" => { set_color(ctx, msg, RoleId(ROLE_ID_YELLOW), server_id).await; return; } + "orange" => { set_color(ctx, msg, RoleId(ROLE_ID_ORANGE), server_id).await; return; } + "pink" => { set_color(ctx, msg, RoleId(ROLE_ID_PINK), server_id).await; return; } + "purple" => { set_color(ctx, msg, RoleId(ROLE_ID_PURPLE), server_id).await; return; } _ => utils::Logger::log_error(ctx, &format!("unknown .color argument: {}", arg)).await }; } } +} + +///////////////////// HELPERS +async fn set_color(ctx: Context, msg: Message, role_id: RoleId, server_id: GuildId) +{ + // Unset all color roles + let colors = [ROLE_ID_RED, ROLE_ID_GREEN, ROLE_ID_BLUE, ROLE_ID_YELLOW, ROLE_ID_PINK, ROLE_ID_ORANGE, ROLE_ID_PURPLE]; + for color in colors + { + if let Err(why) = utils::remove_role(ctx.clone(), msg.author.clone().into(), RoleId(color), server_id).await + { + utils::send_msg(ctx.clone(), msg.channel_id, &format!("Could not set color")).await; + utils::Logger::log_error(ctx.clone(), &format!("set_color failed - could not remove other color roles: {}", why)).await; + return; + } + } + + // Set requested color role + match utils::add_role(ctx.clone(), msg.author.into(), role_id, server_id).await + { + Ok(role) => + { + utils::send_msg(ctx.clone(), msg.channel_id, &format!("Added role: {}", role.name)).await; + return; + } + + Err(why) => + { + utils::send_msg(ctx.clone(), msg.channel_id, &format!("Could not set color role")).await; + utils::Logger::log_error(ctx.clone(), &format!("set_color: Failed to set color role: {}", why)).await; + return; + } + } +} + +async fn handle_meme(ctx: Context, msg: Message, server_id: GuildId) -> bool +{ + let command_lower = msg.content.to_lowercase(); + + match command_lower.as_str() + { + ".beer" => { utils::send_msg(ctx, msg.channel_id, "https://www.youtube.com/watch?v=IZVHBMCdXIw").await; return true } + ".beeer" => { utils::send_msg(ctx, msg.channel_id, "https://youtu.be/nPtMHSYtPc4").await; return true } + ".ivan" => { utils::send_msg(ctx, msg.channel_id, "http://i.imgur.com/0sjR5lE.jpg").await; return true } + ".hotdog" => { utils::send_msg(ctx, msg.channel_id, "https://www.youtube.com/watch?v=ZXVhOPiM4mk").await; return true } + ".edu" => { utils::send_msg(ctx, msg.channel_id, "<:ThisIsFine:243880310859759616> http://imgur.com/1STAzsl").await; return true } + ".gari" => { utils::send_msg(ctx, msg.channel_id, "http://i.imgur.com/EYAti0a.jpg").await; return true } + ".deerforce" => { utils::send_msg(ctx, msg.channel_id, "https://i.imgur.com/PSxFfku.png").await; return true } + _ => { return false; } + } } \ No newline at end of file diff --git a/src/commands/test.rs b/src/commands/test.rs index 4abf5b7..3e44989 100644 --- a/src/commands/test.rs +++ b/src/commands/test.rs @@ -54,30 +54,5 @@ pub async fn parse_command(ctx: Context, msg: Message, server_id: GuildId) } return; - - - // if let Err(why) = server_id.edit_member(&ctx, msg.author, |m| - // { - // if let Some(mut member) = msg.member - // { - // member.roles.push(test_role); - // return m.roles(member.roles); - // } - - // m - // }).await - - // { - // utils::Logger::log_error(ctx, &format!("Error updating roles: {:?}", why)).await; - // } - // else - // { - // let role = &server_id.roles(&ctx).await.unwrap()[&test_role]; - // if let Err(why) = msg.channel_id.say(&ctx.http, format!("{} role added!", role)).await - // { - // utils::Logger::log_error(ctx, &format!("Error sending message: {:?}", why)).await; - // } - // } - //return; - } + } } diff --git a/src/utils.rs b/src/utils.rs index 38c7064..11fd1e9 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,6 +1,6 @@ use rand::prelude::*; -use serenity::{client::Context, model::{user::User, prelude::{Role, ChannelId, GuildId, RoleId, UserId}}}; +use serenity::{client::Context, model::{user::User, prelude::{Role, ChannelId, GuildId, RoleId, UserId}, guild}}; pub const SM_SERVER_ID: u64 = 98929157894836224; @@ -61,6 +61,27 @@ pub async fn add_role(ctx: Context, user_id: UserId, role_id: RoleId, server_id: } } +pub async fn remove_role(ctx: Context, user_id: UserId, role_id: RoleId, server_id: GuildId) -> Result +{ + if let Ok(mut member) = server_id.member(&ctx, user_id).await + { + if let Err(why) = member.remove_role(&ctx.http, role_id).await + { + return Err(why.to_string()); + } + + match &server_id.roles(&ctx).await + { + Ok(roles) => return Ok(roles[&role_id].clone()), + Err(why) => return Err(why.to_string()), + } + } + else + { + return Err(String::from("Could not get member from the server")); + } +} + pub fn get_random_item() -> String { let major_items = vec!["Missiles", "Super Missiles", "E Tank", "Power Bombs" ];