add new autocomplete for colors

This commit is contained in:
2024-12-09 18:00:34 -05:00
parent ada6348824
commit 65a91a51a0

View File

@@ -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<HashMap<&'static str, Color>> = 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<Item = &'static str> + 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?;