From 390939b5cebbbae5e803d79acdfd8135a253ba94 Mon Sep 17 00:00:00 2001 From: stifskere Date: Mon, 25 Nov 2024 06:41:36 +0100 Subject: [PATCH] feat: migrate to pistones --- Cargo.lock | 12 +++ Cargo.toml | 1 + src/bot/events/compile.rs | 120 +++++++--------------------- src/bot/events/compile/api.rs | 73 ----------------- src/bot/events/read_github_links.rs | 11 ++- 5 files changed, 50 insertions(+), 167 deletions(-) delete mode 100644 src/bot/events/compile/api.rs diff --git a/Cargo.lock b/Cargo.lock index 25144ac..15dd6f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -374,6 +374,7 @@ dependencies = [ "lazy_static", "once_cell", "parking_lot", + "pistones", "poise", "regex", "reqwest", @@ -2247,6 +2248,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pistones" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "036e98b0459c7eb67dc6591231cfb2d1e112214ec408f548fa2cc854806e95fe" +dependencies = [ + "reqwest", + "serde", + "thiserror", +] + [[package]] name = "pkg-config" version = "0.3.30" diff --git a/Cargo.toml b/Cargo.toml index 14ffc89..7d23167 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,3 +45,4 @@ tracing = "0.1.37" once_cell = "1.18.0" urlencoding = "2.1.3" lazy_static = "1.5.0" +pistones = "0.2.1" diff --git a/src/bot/events/compile.rs b/src/bot/events/compile.rs index d721927..837977a 100644 --- a/src/bot/events/compile.rs +++ b/src/bot/events/compile.rs @@ -1,11 +1,8 @@ -mod api; - +use pistones::Client; use poise::serenity_prelude::{ - Context, CreateEmbed, CreateEmbedFooter, CreateMessage, Message, ReactionType, + Context, CreateEmbed, CreateMessage, Message, ReactionType }; use regex::Regex; -use std::time::Duration; -use tokio::time::sleep; use crate::bot; @@ -142,7 +139,6 @@ static MISSING_CODE_BLOCK: &str = static MISSING_LANGUAGE: &str = "Falta especificar un lenguaje a tu bloque de código, especificalo después de los \\`\\`\\`."; static INVALID_LANGUAGE: &str = "El lenguaje especificado es invalido, los lenguajes validos son: "; -static INVALID_RESPONSE: &str = "La respuesta recibida del compilador no se pudo leer."; pub async fn message(ctx: &Context, msg: &Message) -> Result { if msg.author.bot || !msg.content.starts_with("&compile") { @@ -243,98 +239,36 @@ pub async fn message(ctx: &Context, msg: &Message) -> Result { code_block = code_block.replace(r"\`", "`"); } - let args = args_and_code[end_code.unwrap() + 3..] - .to_string() - .replace("\n", " "); - - let api_response = api::compile_code(language, code_block, args).await; - - if let Some(parsed_res) = api_response { - let mut response = parsed_res; - while response.status != "completed" { - sleep(Duration::from_secs(3)).await; - response = if let Some(new_status) = api::check_status(response.id).await { - new_status - } else { - msg.reply(ctx, INVALID_RESPONSE).await?; - return Ok(true); - }; - } - - let mut response_embed = CreateEmbed::default(); - - let mut succeded = false; - if let Some(build_details) = api::check_details(response.id).await { - if build_details.build_result.unwrap_or("success".to_string()) != "success" { - response_embed = response_embed - .title("Error de build!") - .description(format!( - "```\n{}\n```", - build_details - .build_stderr - .unwrap_or("".to_string()) - .replace("```", r"`‎`‎`") + let result = Client::new() + .await? + .run(language, code_block) + .await? + .run; + + msg.channel_id.send_message( + &ctx.http, + CreateMessage::new() + .embed( + CreateEmbed::new() + .color(if result.code != 0 { 0xFF0000 } else { 0x00FF00 }) + .title(format!( + "El programa se terminó {}", + if let Some(signal) = result.signal { + format!("con {signal} ({})", result.code) + } else { + format!("con código {}", result.code) + } )) - .color(0xFF0000) - .footer(CreateEmbedFooter::new(format!( - "El compilador salio con el código: {}", - build_details.build_exit_code.unwrap_or_default() - ))); - } else if build_details.result.unwrap_or("success".to_string()) != "success" { - response_embed = response_embed - .title("Error de ejecución!") .description(format!( - "```\n{}\n```", - build_details - .stderr - .unwrap_or("".to_string()) - .replace("```", r"`‎`‎`") - )) - .color(0xFF0000) - .footer(CreateEmbedFooter::new(format!( - "El programa salio con el código: {}", - build_details.exit_code.unwrap_or_default() - ))) - } else { - response_embed = response_embed - .title("El código se ejecuto correctamente") - .description(format!( - "```\n{}\n```", - build_details + "```{}```", + result .stdout - .unwrap_or("".to_string()) - .replace("```", r"`‎`‎`") + .replace("```", "`‎`‎`") )) - .color(0x00FF00) - .footer(CreateEmbedFooter::new(format!( - "El programa salio con el código: {}", - build_details.exit_code.unwrap_or_default() - ))); - - succeded = true; - } - - msg.channel_id - .send_message( - ctx, - CreateMessage::new() - .embed(response_embed) - .reference_message(msg), - ) - .await?; - - if !succeded { - msg.react(ctx, ReactionType::Unicode("❌".to_string())) - .await - .unwrap(); - } - } else { - msg.reply(ctx, INVALID_RESPONSE).await?; - } - } else { - msg.reply(ctx, INVALID_RESPONSE).await?; - } + ) + ) + .await?; Ok(true) } diff --git a/src/bot/events/compile/api.rs b/src/bot/events/compile/api.rs deleted file mode 100644 index fcdbea2..0000000 --- a/src/bot/events/compile/api.rs +++ /dev/null @@ -1,73 +0,0 @@ -use reqwest::Client; -use serde::{Deserialize, Serialize}; -use tracing::error; -use urlencoding::encode; - -#[derive(Deserialize)] -pub struct RunnerResponse { - pub id: String, - pub status: String, -} - -#[derive(Deserialize, Serialize)] -pub struct RunnerDetails { - pub build_stderr: Option, - pub build_exit_code: Option, - pub build_result: Option, - - pub stdout: Option, - pub stderr: Option, - pub result: Option, - pub exit_code: Option, -} - -pub async fn compile_code(language: String, code: String, args: String) -> Option { - Client::new() - .post(format!( - "https://api.paiza.io/runners/create?source_code={}&language={}&api_key=guest{}", - encode(&code), - encode(&language), - if args.is_empty() { - "".to_string() - } else { - format!("&input={args}") - } - )) - .send() - .await - .unwrap() - .json::() - .await - .inspect_err(|e| error!("Hubo un error: {e:?}")) - .ok() -} - -pub async fn check_status(runner_id: String) -> Option { - Client::new() - .get(format!( - "https://api.paiza.io/runners/get_status?id={}&api_key=guest", - encode(&runner_id) - )) - .send() - .await - .unwrap() - .json::() - .await - .inspect_err(|e| error!("Hubo un error: {e:?}")) - .ok() -} - -pub async fn check_details(runner_id: String) -> Option { - Client::new() - .get(format!( - "https://api.paiza.io/runners/get_details?id={}&api_key=guest", - encode(&runner_id) - )) - .send() - .await - .unwrap() - .json::() - .await - .inspect_err(|e| error!("Hubo un error: {e:?}")) - .ok() -} diff --git a/src/bot/events/read_github_links.rs b/src/bot/events/read_github_links.rs index a9c1358..946b042 100644 --- a/src/bot/events/read_github_links.rs +++ b/src/bot/events/read_github_links.rs @@ -2,6 +2,7 @@ use lazy_static::lazy_static; use poise::serenity_prelude::{ButtonStyle, ComponentInteraction, Context, CreateButton, CreateInteractionResponse, CreateInteractionResponseMessage, CreateMessage, Message, MESSAGE_CODE_LIMIT}; use regex::{Captures, Regex}; use reqwest::get; +use tracing::info; use std::collections::{HashMap, HashSet}; use std::option::Option; @@ -213,7 +214,15 @@ pub async fn handle_delete_embed(ctx: &Context, interaction: &ComponentInteracti return false; } - if interaction.message.author.id != interaction.user.id { + info!("{:?}", interaction.message.mentions); + + let reference_message = interaction + .message + .referenced_message + .as_ref() + .unwrap(); + + if reference_message.author.id != interaction.user.id { interaction .create_response( ctx,