From f0e3ab5e8f7168e6a06c3595caebd0cc80b61967 Mon Sep 17 00:00:00 2001 From: ByteDice Date: Sat, 7 Jun 2025 22:20:29 +0200 Subject: [PATCH] made 1 button do something. Only all of them left because it doesn't do what it should. --- src/events.rs | 70 ++++++++++++++++++++++++++++++-------- src/re_cmds/add.rs | 5 +-- src/re_cmds/approve.rs | 8 ++--- src/re_cmds/generic_fns.rs | 43 +++++++++++++++++++++-- src/re_cmds/remove.rs | 2 +- src/re_cmds/update.rs | 12 ++----- 6 files changed, 104 insertions(+), 36 deletions(-) diff --git a/src/events.rs b/src/events.rs index b3eeba8..5789f55 100644 --- a/src/events.rs +++ b/src/events.rs @@ -1,6 +1,7 @@ +use crate::re_cmds::generic_fns::{embed_to_json, is_bk_mod_serenity, serenity_send_msg}; use crate::{rs_println, Data, Error}; -use poise::serenity_prelude::{self as serenity, ActivityData}; +use poise::serenity_prelude::{self as serenity, ActivityData, ComponentInteraction, Interaction, Member, Ready}; use std::future::Future; use std::pin::Pin; @@ -9,22 +10,63 @@ pub fn event_handler<'a>( ctx: &'a serenity::Context, event: &'a serenity::FullEvent, _framework: poise::FrameworkContext<'a, Data, Error>, - _data: &'a Data, + data: &'a Data, ) -> Pin> + Send + 'a>> { Box::pin(async move { - if let serenity::FullEvent::Ready { data_about_bot } = event { - rs_println!( - "Bot started as user \"{}\" with id {}", - data_about_bot.user.name, - data_about_bot.user.id - ); - - let file_text = std::fs::read_to_string("./cfg/status.txt").unwrap(); - let custom_activity = ActivityData::custom(file_text); - - ctx.online(); - ctx.set_activity(Some(custom_activity)); + match event { + serenity::FullEvent::Ready { data_about_bot } => on_ready(ctx, data_about_bot), + serenity::FullEvent::InteractionCreate { interaction } => { let _ = handle_buttons(ctx, data, interaction).await; }, + _ => {} } return Ok(()); }) +} + + +fn on_ready(ctx: &serenity::Context, data_about_bot: &Ready) { + rs_println!( + "Bot started as user \"{}\" with id {}", + data_about_bot.user.name, + data_about_bot.user.id + ); + + let file_text = std::fs::read_to_string("./cfg/status.txt").unwrap(); + let custom_activity = ActivityData::custom(file_text); + + ctx.online(); + ctx.set_activity(Some(custom_activity)); +} + + +async fn handle_buttons(ctx: &serenity::Context, data: &Data, interaction: &Interaction) -> Result<(), Error> { + let component = match interaction { + Interaction::Component(component) => component, + _ => return Err(Error::from("Not a message component interaction")) + }; + + let i_msg = interaction.clone().message_component(); + if i_msg.is_none() { return Err(Error::from("message_component is None!")); } + let i_embed = i_msg.unwrap().message.embeds[0].clone(); + + let json = embed_to_json(&i_embed); + if json.is_err() { return Err(Error::from("Failed to pase message JSON!")); } + + return match component.data.custom_id.as_str() { + "approve_btn" => approve_btn(ctx, data, &component.member.as_ref().unwrap(), component).await, + "remove_btn" => Ok(()), + "unapprove_btn" => Ok(()), + "unremove_btn" => Ok(()), + "unvote_btn" => Ok(()), + "vote_btn" => Ok(()), + _ => Err("Message button with that ID isn't handled.".into()) + } +} + + +async fn approve_btn(ctx: &serenity::Context, data: &Data, c_member: &Member, component: &ComponentInteraction) -> Result<(), Error> { + if !is_bk_mod_serenity(ctx, data, c_member, component).await { return Ok(()); } + + serenity_send_msg(ctx, component, "Hello from this stupid program that tastes oddly like pasta.".to_string(), true).await; + + return Ok(()); } \ No newline at end of file diff --git a/src/re_cmds/add.rs b/src/re_cmds/add.rs index 570ac95..c623a95 100644 --- a/src/re_cmds/add.rs +++ b/src/re_cmds/add.rs @@ -1,6 +1,6 @@ use serde_json::json; -use crate::data::get_mutex_data; +use crate::data::{get_mutex_data, update_re_data}; use crate::messages::send_msg; use crate::re_cmds::get::get_post_from_data; use crate::{data, websocket::send_cmd_json, Context, Error, CFG_DATA_RE}; @@ -22,7 +22,7 @@ pub async fn cmd( ) -> Result<(), Error> { if !is_bk_mod(ctx.data().bk_mods.clone(), ctx.author().id.get()) { - let sr = get_readable_subreddits(ctx).await?; + let sr = get_readable_subreddits(ctx.data()).await?; send_msg(ctx, lang!("dc_msg_re_permdeny_not_re_mod", sr), false, false).await; return Ok(()); } @@ -59,6 +59,7 @@ pub async fn cmd( if a { send_msg(ctx, lang!("dc_msg_re_also_approved"), true, true).await; } } + update_re_data(ctx.data()).await; if let Some(post) = get_post_from_data(ctx, &reddit_data, &url).await? { send_embed_for_post(ctx, post, &url).await?; } diff --git a/src/re_cmds/approve.rs b/src/re_cmds/approve.rs index 6901ca0..84ce74d 100644 --- a/src/re_cmds/approve.rs +++ b/src/re_cmds/approve.rs @@ -1,6 +1,6 @@ use serde_json::{json, Value}; -use crate::{data::{self, get_mutex_data}, lang, messages::send_msg, re_cmds::generic_fns::{get_readable_subreddits, is_bk_mod}, websocket, Context, Error, CFG_DATA_RE}; +use crate::{data::{self, get_mutex_data}, lang, messages::send_msg, re_cmds::generic_fns::is_bk_mod_msg, websocket, Context, Error, CFG_DATA_RE}; use super::generic_fns::send_embed_for_removed; @@ -18,11 +18,7 @@ pub async fn cmd( #[description = "Wether to approve or disapprove the post"] disapprove: Option ) -> Result<(), Error> { - if !is_bk_mod(ctx.data().bk_mods.clone(), ctx.author().id.get()) { - let sr = get_readable_subreddits(ctx).await?; - send_msg(ctx, lang!("dc_msg_re_permdeny_not_re_mod", sr), false, false).await; - return Ok(()); - } + if is_bk_mod_msg(ctx).await { return Ok(()); } data::update_re_data(ctx.data()).await; let reddit_data = get_mutex_data(&ctx.data().reddit_data).await?; diff --git a/src/re_cmds/generic_fns.rs b/src/re_cmds/generic_fns.rs index e8758f2..f4aedce 100644 --- a/src/re_cmds/generic_fns.rs +++ b/src/re_cmds/generic_fns.rs @@ -1,12 +1,38 @@ +use poise::serenity_prelude::{self as serenity, ComponentInteraction, CreateInteractionResponse, CreateInteractionResponseMessage, Embed, Member}; use regex::Regex; use serde_json::Value; -use crate::{data::get_toml_mutex, messages::{make_post_embed, make_removed_embed, send_embed}, Context, Error}; +use crate::{data::get_toml_mutex, lang, messages::{make_post_embed, make_removed_embed, send_embed, send_msg, JSON_TEXT_END, JSON_TEXT_START}, Context, Data, Error}; 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().bk_mods.clone(), ctx.author().id.get()) { return true; } + + let sr = get_readable_subreddits(ctx.data()).await.unwrap(); + send_msg(ctx, lang!("dc_msg_re_permdeny_not_re_mod", sr), false, false).await; + return true +} + + +pub async fn is_bk_mod_serenity(ctx: &serenity::Context, data: &Data, author: &Member, component: &ComponentInteraction) -> bool { + if is_bk_mod(data.bk_mods.clone(), author.user.id.get()) { return true; } + + let sr = get_readable_subreddits(data).await.unwrap(); + serenity_send_msg(ctx, component, lang!("dc_msg_re_permdeny_not_re_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 fn to_shorturl(url: &str) -> Result { let re = Regex::new(r"comments/([a-zA-Z0-9]+)").unwrap(); @@ -34,11 +60,22 @@ pub async fn send_embed_for_removed(ctx: Context<'_>, url: &str, post: &Value) { } -pub async fn get_readable_subreddits(ctx: Context<'_>) -> Result { - let d = get_toml_mutex(&ctx.data().cfg).await.unwrap(); +pub async fn get_readable_subreddits(data: &Data) -> Result { + let d = get_toml_mutex(&data.cfg).await.unwrap(); let sr = d["reddit"]["subreddits"].as_str().ok_or("Item of key \"subreddit\" is not a string type.\nTrace: `get_readable_subreddits -> let sr = ...`")?; let split: Vec<&str> = sr.split("+").collect(); let join = split.join(", r/"); 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()]; + let msg_json: Result = serde_json::from_str(msg_json_str); + return msg_json; } \ No newline at end of file diff --git a/src/re_cmds/remove.rs b/src/re_cmds/remove.rs index 0755f8e..bd240bd 100644 --- a/src/re_cmds/remove.rs +++ b/src/re_cmds/remove.rs @@ -17,7 +17,7 @@ pub async fn cmd( ) -> Result<(), Error> { if !is_bk_mod(ctx.data().bk_mods.clone(), ctx.author().id.get()) { - let sr = get_readable_subreddits(ctx).await?; + let sr = get_readable_subreddits(ctx.data()).await?; send_msg(ctx, lang!("dc_msg_re_permdeny_not_re_mod", sr), false, false).await; return Ok(()); } diff --git a/src/re_cmds/update.rs b/src/re_cmds/update.rs index a2586db..efa36f5 100644 --- a/src/re_cmds/update.rs +++ b/src/re_cmds/update.rs @@ -3,7 +3,7 @@ use std::time::{SystemTime, UNIX_EPOCH}; use poise::{serenity_prelude::{ChannelId, EditMessage, GetMessages, Http, Message, MessageId, UserId}, ReplyHandle}; use serde_json::{json, Map, Value}; -use crate::{data::{self, get_mutex_data, DC_POSTS_CHANNEL_KEY}, lang, messages::{edit_reply, embed_from_options, http_send_embed, make_post_embed, make_removed_embed, send_msg, JSON_TEXT_END, JSON_TEXT_START}, websocket::send_cmd_json, Context, Error, CFG_DATA_RE}; +use crate::{data::{self, get_mutex_data, DC_POSTS_CHANNEL_KEY}, lang, messages::{edit_reply, embed_from_options, http_send_embed, make_post_embed, make_removed_embed, send_msg}, re_cmds::generic_fns::embed_to_json, websocket::send_cmd_json, Context, Error, CFG_DATA_RE}; #[poise::command( slash_command, @@ -175,15 +175,7 @@ async fn msgs_to_json(msgs: Vec, reddit_data: &Value, max_age: u64) -> continue; } - let msg_desc = &msg.embeds[0].description.clone().unwrap(); - let msg_lines = msg_desc.split("\n"); - let msg_last_len = msg_lines.clone().last().unwrap().len(); - - if msg_last_len < 13 { continue; } - - let msg_json_str = &msg_lines.clone().last().unwrap()[JSON_TEXT_START.len()..msg_last_len - JSON_TEXT_END.len()]; - - let msg_json = serde_json::from_str(msg_json_str); + let msg_json = embed_to_json(&msg.embeds[0]); if msg_json.is_err() { continue; } let mut u_json: Value = msg_json.unwrap();