use poise::serenity_prelude::{self as serenity, ChannelId, ComponentInteraction, CreateInteractionResponse, CreateInteractionResponseMessage, EditMessage, Embed, Member, MessageId}; use regex::Regex; use serde_json::Value; use crate::{Context, Data, Error, messages::{EmbedOptions, JSON_TEXT_END, JSON_TEXT_START, decode_and_decompress_json, embed_from_options, make_post_embed, make_removed_embed, send_embed, send_msg}}; pub fn is_bk_mod(mod_list: Vec, uid: u64) -> bool { return mod_list.contains(&uid); } pub async fn is_bk_mod_msg(ctx: Context<'_>) -> bool { if is_bk_mod(ctx.data().env_vars.reddit_mod_discord_ids.clone(), ctx.author().id.get()) { return true; } let sr = get_readable_subreddits(ctx.data()).await.unwrap(); send_msg(ctx, ctx.data().lang.get("dc.re.not_mod", &[sr]), true, true).await; return false } pub async fn is_bk_mod_serenity(ctx: &serenity::Context, data: &Data, author: &Member, component: &ComponentInteraction) -> bool { if is_bk_mod(data.env_vars.reddit_mod_discord_ids.clone(), author.user.id.get()) { return true; } let sr = get_readable_subreddits(data).await.unwrap(); serenity_send_msg(ctx, component, data.lang.get("dc.re.not_mod", &[sr]), true).await; return true } pub async fn serenity_send_msg(ctx: &serenity::Context, component: &ComponentInteraction, t: String, ephemeral: bool) { let r = CreateInteractionResponse::Message(CreateInteractionResponseMessage::new().content(t).ephemeral(ephemeral)); let _ = component.create_response(ctx.http.clone(), r).await; } pub async fn serenity_edit_msg_embed(ctx: &serenity::Context, c_id: &ChannelId, m_id: &MessageId, e: EmbedOptions) { let r = EditMessage::new() .embed(embed_from_options(e.clone())) .components(e.actionrows.unwrap()); let _ = c_id.edit_message(ctx.http.clone(), m_id, r).await; } pub fn to_shorturl(url: &str) -> Result { let re = Regex::new(r"comments/([a-zA-Z0-9]+)").unwrap(); if let Some(caps) = re.captures(url) { let post_id = &caps[1]; let short_url = format!("https://redd.it/{}", post_id); return Ok(short_url); } return Err("Invalid URL"); } pub async fn send_embed_for_post(ctx: Context<'_>, post: Value, url: &str) -> Result<(), Error> { send_embed(ctx, make_post_embed(&ctx.data().lang, &post, url, true), true).await; return Ok(()); } pub async fn send_embed_for_removed(ctx: Context<'_>, url: &str, post: &Value) { send_embed( ctx, make_removed_embed(&ctx.data().lang, post, url, true), true ).await; } pub async fn get_readable_subreddits(data: &Data) -> Result { let sr = data.cfg["reddit"]["subreddits"].as_array().unwrap(); let sr_str: Vec<&str> = sr .iter() .map(|v| v.as_str().unwrap()) .collect(); let mut join = sr_str.join(", r/"); if join.len() != 0 { join = format!("r/{}", join); } else { join = "[no subreddits assigned]".to_string(); } return Ok(join); } pub fn embed_to_json(embed: &Embed) -> Result { let msg_desc = embed.description.clone().unwrap(); let msg_lines = msg_desc.split("\n"); let msg_last_len = msg_lines.clone().last().unwrap().len(); let msg_json_str = &msg_lines.clone().last().unwrap()[JSON_TEXT_START.len()..msg_last_len - JSON_TEXT_END.len()]; return decode_and_decompress_json(msg_json_str.to_string()); }