html terminal
Diffstat (limited to 'src/bot/logic.rs')
| -rw-r--r-- | src/bot/logic.rs | 90 |
1 files changed, 0 insertions, 90 deletions
diff --git a/src/bot/logic.rs b/src/bot/logic.rs deleted file mode 100644 index f31fdc9..0000000 --- a/src/bot/logic.rs +++ /dev/null @@ -1,90 +0,0 @@ -use super::{Context, Result}; -use lemu::Executor; -use poise::{serenity_prelude::AttachmentType, CodeBlock, KeyValueArgs}; -use std::borrow::Cow; - -#[poise::command(prefix_command, category = "Misc", track_edits, rename = "eval")] -pub async fn run( - ctx: Context<'_>, - #[description = "number of iterations"] kv: KeyValueArgs, - #[description = "Script"] block: CodeBlock, -) -> Result<()> { - let _ = ctx.channel_id().start_typing(&ctx.serenity_context().http); - let lemu::Output { - output: Some(output), - displays, - .. - } = (match tokio::task::spawn_blocking(move || { - Executor::with_output(vec![]) - .large_display() - .limit_iterations( - kv.get("iters") - .map_or(1, |v| v.parse::<usize>().unwrap_or(1).clamp(1, 50)), - ) - .limit_instructions(52789849) - .program(&block.code) - .map(|mut v| { - v.run(); - v.output() - }) - .map_err(|e| format!("{}", e.diagnose(&block.code)).replace("`", "\u{200b}`")) - }) - .await? - { - Ok(o) => o, - Err(e) => { - ctx.send(|c| { - c.allowed_mentions(|a| a.empty_parse()) - .content(format!("```ansi\n{e}\n```")) - }) - .await?; - return Ok(()); - } - }) - else { - unreachable!() - }; - let displays: Box<[_; 1]> = displays.try_into().unwrap(); - let [(display, _)] = *displays; - let display = if display.buffer().iter().any(|&n| n != 0) { - Some( - tokio::task::spawn_blocking(move || { - let p = oxipng::RawImage::new( - display.width(), - display.height(), - oxipng::ColorType::RGBA, - oxipng::BitDepth::Eight, - display.take_buffer(), - ) - .unwrap(); - p.create_optimized_png(&oxipng::Options::default()).unwrap() - }) - .await?, - ) - } else { - None - }; - - ctx.send(|c| { - if output.is_empty() && display.is_none() { - c.content("no output"); - } - if !output.is_empty() { - c.content(format!( - "```\n{}\n```", - String::from_utf8_lossy(&output).replace('`', "\u{200b}`") - )); - } - if let Some(display) = display { - c.attachment(AttachmentType::Bytes { - data: Cow::from(display), - filename: "display1.png".to_string(), - }) - .embed(|e| e.attachment("display1.png")); - } - c.allowed_mentions(|a| a.empty_parse()) - }) - .await?; - - Ok(()) -} |