use cipher_core::repository::RepositoryProvider; use serenity::all::Color; use serenity::all::GuildId; use serenity::all::Member; use crate::app::{AppCommand, AppContext, AppError}; pub async fn register_in_guilds(serenity_ctx: &serenity::client::Context, commands: &[AppCommand], guilds: &[GuildId]) where R: RepositoryProvider, { for guild in guilds { let result = poise::builtins::register_in_guild(serenity_ctx, commands, *guild).await; match (guild.name(serenity_ctx), result) { (None, Err(err)) => log::warn!("Failed to register command in guild with id {}: {}", guild.get().to_string(), err), (None, Ok(())) => log::info!("Successfully registered commands in guild with id {}", guild.get().to_string()), (Some(guild_name), Err(err)) => log::warn!("Failed to register command in guild with id {} ({}): {}", guild.get().to_string(), guild_name, err), (Some(guild_name), Ok(())) => log::info!("Successfully registered commands in guild with id {} ({})", guild.get().to_string(), guild_name), } } } pub async fn bot_color(ctx: &AppContext<'_, R, R::BackendError>) -> Color where R: RepositoryProvider + Send + Sync, { let member = match ctx.guild_id() { Some(guild) => guild.member(ctx, ctx.framework.bot_id).await.ok(), None => None, }; member.and_then(|m| m.colour(ctx)).unwrap_or(Color::BLURPLE) } pub async fn bot_avatar_url( ctx: &AppContext<'_, R, R::BackendError>, ) -> Result> where R: RepositoryProvider + Send + Sync, { let member_avatar_url = match ctx.guild_id() { Some(guild) => guild.member(ctx, ctx.framework.bot_id).await?.avatar_url(), None => None, }; let avatar_url = match member_avatar_url { Some(url) => url, None => { let user = ctx.framework.bot_id.to_user(ctx).await?; user.avatar_url() .or_else(|| user.static_avatar_url()) .unwrap_or_else(|| user.default_avatar_url()) } }; Ok(avatar_url) } pub fn member_avatar_url(member: &Member) -> String { member .avatar_url() .or_else(|| member.user.avatar_url()) .or_else(|| member.user.static_avatar_url()) .unwrap_or_else(|| member.user.default_avatar_url()) }