diff --git a/src/commands/self_roles/color.rs b/src/commands/self_roles/color.rs index 860634b..92500f7 100644 --- a/src/commands/self_roles/color.rs +++ b/src/commands/self_roles/color.rs @@ -1,45 +1,67 @@ use crate::common::{Context, Error}; +use once_cell::sync::Lazy; +use std::collections::HashMap; + use hex_color::HexColor; use poise::serenity_prelude::{colours, Color, EditRole}; +static COLORS: Lazy> = Lazy::new(|| { + HashMap::from([ + ("reset", colours::roles::DEFAULT), + ("default", colours::roles::DEFAULT), + ("teal", colours::roles::TEAL), + ("dark teal", colours::roles::DARK_TEAL), + ("green", colours::roles::GREEN), + ("dark green", colours::roles::DARK_GREEN), + ("blue", colours::roles::BLUE), + ("dark blue", colours::roles::DARK_BLUE), + ("purple", colours::roles::PURPLE), + ("dark purple", colours::roles::DARK_PURPLE), + ("magenta", colours::roles::MAGENTA), + ("dark magenta", colours::roles::DARK_MAGENTA), + ("gold", colours::roles::GOLD), + ("dark gold", colours::roles::DARK_GOLD), + ("orange", colours::roles::DARK_ORANGE), + ("dark orange", colours::roles::DARK_ORANGE), + ("red", colours::roles::RED), + ("dark red", colours::roles::DARK_RED), + ("lighter grey", colours::roles::LIGHTER_GREY), + ("lighter gray", colours::roles::LIGHTER_GREY), + ("light grey", colours::roles::LIGHT_GREY), + ("light gray", colours::roles::LIGHT_GREY), + ("dark grey", colours::roles::DARK_GREY), + ("dark gray", colours::roles::DARK_GREY), + ("darker grey", colours::roles::DARKER_GREY), + ("darker gray", colours::roles::DARKER_GREY), + ("white", Color::new(0xffffff)), + ("black", Color::new(0x010101)), + ("blurple", Color::BLURPLE), + ("yellow", Color::new(0xe4f10a)), + ]) +}); + +async fn autocomplete_colors<'a>( + _ctx: Context<'_>, + partial: &'a str, +) -> impl Iterator + use<'a> { + COLORS.clone().into_keys().filter(move |x| + x.starts_with(partial) + || x.starts_with(&format!("light {partial}")) + || x.starts_with(&format!("lighter {partial}")) + || x.starts_with(&format!("dark {partial}")) + || x.starts_with(&format!("darker {partial}"))) +} + /// Change the color of your personal role #[poise::command(slash_command, prefix_command)] -pub async fn color(ctx: Context<'_>, color: String) -> Result<(), Error> { - let color = match color.to_lowercase().as_str() { - "reset" | "default" => colours::roles::DEFAULT, - "teal" => colours::roles::TEAL, - "dark teal" => colours::roles::DARK_TEAL, - "green" => colours::roles::GREEN, - "dark green" => colours::roles::DARK_GREEN, - "blue" => colours::roles::BLUE, - "dark blue" => colours::roles::DARK_BLUE, - "purple" => colours::roles::PURPLE, - "dark purple" => colours::roles::DARK_PURPLE, - "magenta" => colours::roles::MAGENTA, - "dark magenta" => colours::roles::DARK_MAGENTA, - "gold" => colours::roles::GOLD, - "dark gold" => colours::roles::DARK_GOLD, - "orange" => colours::roles::DARK_ORANGE, - "dark orange" => colours::roles::DARK_ORANGE, - "red" => colours::roles::RED, - "dark red" => colours::roles::DARK_RED, - "lighter grey" | "lighter gray" => colours::roles::LIGHTER_GREY, - "light grey" | "light gray" => colours::roles::LIGHT_GREY, - "dark grey" | "dark gray" => colours::roles::DARK_GREY, - "darker grey" | "darker gray" => colours::roles::DARKER_GREY, - "white" => Color::new(0xffffff), - "black" => Color::new(0x010101), - "blurple" => Color::BLURPLE, - "yellow" => Color::new(0xe4f10a), - hex => match HexColor::parse_rgb(hex) { - Ok(color) => Color::from_rgb(color.r, color.g, color.b), - Err(_) => { - ctx.reply(format!("Unable to parse `{}` as a color.", color)).await?; - return Ok(()); - } - } +pub async fn color(ctx: Context<'_>, #[autocomplete = "autocomplete_colors"] color: String) -> Result<(), Error> { + let color = if let Some(named) = COLORS.get(color.as_str()) { + named.clone() + } else { + let rgb = HexColor::parse_rgb(&color)?; + Color::from_rgb(rgb.r, rgb.g, rgb.b) }; let mut tx = ctx.data().database.begin().await?;