html terminal
Diffstat (limited to 'src/bot/logic.rs')
-rw-r--r--src/bot/logic.rs83
1 files changed, 41 insertions, 42 deletions
diff --git a/src/bot/logic.rs b/src/bot/logic.rs
index e41733e..4f4314a 100644
--- a/src/bot/logic.rs
+++ b/src/bot/logic.rs
@@ -14,8 +14,8 @@ pub async fn run(
output: Some(output),
displays,
..
- } = ({
- match Executor::with_output(vec![])
+ } = (match tokio::task::spawn_blocking(move || {
+ Executor::with_output(vec![])
.display()
.limit_iterations(
kv.get("iters")
@@ -23,20 +23,22 @@ pub async fn run(
)
.limit_instructions(30000)
.program(&block.code)
- {
- Ok(mut v) => {
+ .map(|mut v| {
v.run();
v.output()
- }
- Err(e) => {
- let s = format!("{}", e.diagnose(&block.code)).replace("`", "\u{200b}`");
- ctx.send(|c| {
- c.allowed_mentions(|a| a.empty_parse())
- .content(format!("```ansi\n{s}\n```"))
- })
- .await?;
- return Ok(());
- }
+ })
+ .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 {
@@ -44,44 +46,41 @@ pub async fn run(
};
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| {
- let mut empty = true;
+ 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}`")
));
- empty = false;
}
- if display.buffer().iter().any(|&n| n != 0) {
- let p = oxipng::RawImage::new(
- display.width(),
- display.height(),
- oxipng::ColorType::RGBA,
- oxipng::BitDepth::Eight,
- display.take_buffer(),
- )
- .unwrap();
- let p = p
- .create_optimized_png(&oxipng::Options {
- filter: oxipng::indexset! { oxipng::RowFilter::None },
- bit_depth_reduction: false,
- color_type_reduction: false,
- palette_reduction: false,
- grayscale_reduction: false,
- ..oxipng::Options::from_preset(0)
- })
- .unwrap();
+ if let Some(display) = display {
c.attachment(AttachmentType::Bytes {
- data: Cow::from(p),
+ data: Cow::from(display),
filename: "display1.png".to_string(),
- });
- c.embed(|e| e.attachment("display1.png"));
- empty = false;
- }
- if empty {
- c.content("no output");
+ })
+ .embed(|e| e.attachment("display1.png"));
}
c.allowed_mentions(|a| a.empty_parse())
})