html terminal
Diffstat (limited to 'src/bot/maps.rs')
| -rw-r--r-- | src/bot/maps.rs | 89 |
1 files changed, 47 insertions, 42 deletions
diff --git a/src/bot/maps.rs b/src/bot/maps.rs index fa00f58..b18a305 100644 --- a/src/bot/maps.rs +++ b/src/bot/maps.rs @@ -8,7 +8,7 @@ use std::borrow::Cow; use std::sync::atomic::{AtomicU64, Ordering::Relaxed}; use std::time::{Duration, Instant, SystemTime}; use tokio::sync::broadcast::{self, Sender}; -use tokio::sync::{MutexGuard, OnceCell}; +use tokio::sync::{Mutex, MutexGuard, OnceCell}; pub struct Maps; impl Maps { pub async fn find(map: &str, stdin: &broadcast::Sender<String>) -> usize { @@ -78,7 +78,6 @@ impl MapImage { stdin: &Sender<String>, // returning a guard is questionable ) -> Result<(MutexGuard<Vec<u8>>, Option<RenderInfo>)> { - let mut lock = self.0.lock().await; // me in a million years when its 1901 and we never get a new render let now = SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) @@ -90,53 +89,59 @@ impl MapImage { .fetch_update(Relaxed, Relaxed, |then| (now > then + 70).then_some(now)) .is_err() { - (lock, None) + (self.0.lock().await, None) } else { send!(stdin, "save 0")?; let _ = get_nextblock().await; // parsing the thing doesnt negate the need for a env var sooo let o = std::fs::read(std::env::var("SAVE_PATH").unwrap())?; - let then = Instant::now(); - let m = Map::deserialize(&mut mindus::data::DataRead::new(&o))?; - let deser_took = then.elapsed(); - let name = m.tags.get("mapname").unwrap().to_owned(); - let render_took = Instant::now(); - let i = m.render(); - let render_took = render_took.elapsed(); - let compression_took = Instant::now(); - let i = RawImage::new( - i.width(), - i.height(), - ColorType::RGB { - transparent_color: None, - }, - BitDepth::Eight, - i.take_buffer(), - ) - .unwrap(); - *lock = i - .create_optimized_png(&oxipng::Options { - filter: indexset! { RowFilter::None }, - bit_depth_reduction: false, - color_type_reduction: false, - palette_reduction: false, - grayscale_reduction: false, - ..oxipng::Options::from_preset(0) - }) + let (i, info) = tokio::task::spawn_blocking(move || { + let then = Instant::now(); + let m = Map::deserialize(&mut mindus::data::DataRead::new(&o))?; + let deser_took = then.elapsed(); + let name = m.tags.get("mapname").unwrap().to_owned(); + let render_took = Instant::now(); + let i = m.render(); + let render_took = render_took.elapsed(); + let compression_took = Instant::now(); + let i = RawImage::new( + i.width(), + i.height(), + ColorType::RGB { + transparent_color: None, + }, + BitDepth::Eight, + i.take_buffer(), + ) .unwrap(); - let compression_took = compression_took.elapsed(); - let total = then.elapsed(); - ( - lock, - Some(RenderInfo { - deserialization: deser_took, - render: render_took, - compression: compression_took, - name, - total, - }), - ) + let i = i + .create_optimized_png(&oxipng::Options { + filter: indexset! { RowFilter::None }, + bit_depth_reduction: false, + color_type_reduction: false, + palette_reduction: false, + grayscale_reduction: false, + ..oxipng::Options::from_preset(0) + }) + .unwrap(); + let compression_took = compression_took.elapsed(); + let total = then.elapsed(); + anyhow::Ok(( + i, + RenderInfo { + deserialization: deser_took, + render: render_took, + compression: compression_took, + name, + total, + }, + )) + }) + .await??; + let mut lock = self.0.lock().await; + *lock = i; + (lock, Some(info)) }, ) } |