made 1 button do something. Only all of them left because it doesn't do what it should.

This commit is contained in:
2025-06-07 22:20:29 +02:00
parent b68586261c
commit f0e3ab5e8f
6 changed files with 104 additions and 36 deletions
+48 -6
View File
@@ -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,10 +10,20 @@ 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<Box<dyn Future<Output = Result<(), Error>> + Send + 'a>> {
Box::pin(async move {
if let serenity::FullEvent::Ready { data_about_bot } = event {
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,
@@ -24,7 +35,38 @@ pub fn event_handler<'a>(
ctx.online();
ctx.set_activity(Some(custom_activity));
}
return Ok(());
})
}
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(());
}
+3 -2
View File
@@ -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?;
}
+2 -6
View File
@@ -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<bool>
) -> 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?;
+40 -3
View File
@@ -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<u64>, 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<String, &str> {
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<String, Error> {
let d = get_toml_mutex(&ctx.data().cfg).await.unwrap();
pub async fn get_readable_subreddits(data: &Data) -> Result<String, Error> {
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<Value, serde_json::Error> {
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<Value, serde_json::Error> = serde_json::from_str(msg_json_str);
return msg_json;
}
+1 -1
View File
@@ -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(());
}
+2 -10
View File
@@ -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<Message>, 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();