From ed25ccb3ca2b0aa16c68190c7ff045540f8af84f Mon Sep 17 00:00:00 2001
From: Jonathan Krebs <jonathan.krebs@bruckbu.de>
Date: Tue, 6 Apr 2021 23:26:21 +0200
Subject: [PATCH] dinge. will schlafen.

---
 Cargo.toml          |  9 ++++++-
 src/screenshot.rs   |  3 +++
 src/server_jonny.rs | 59 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 70 insertions(+), 1 deletion(-)
 create mode 100644 src/server_jonny.rs

diff --git a/Cargo.toml b/Cargo.toml
index 5050fec..aa4a6f2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,9 +11,12 @@ structure = "0.1"
 async-stream = "*"
 futures-core = "*"
 futures-util = "*"
-tokio = { version = "0.2", features = ["full"] }
+futures = "*"
+warp = "*"
+tokio = { version = "1", features = ["full"] }
 png = "*"
 deflate = {version = "*", features = ["gzip"] }
+pretty_env_logger = "*"
 
 
 
@@ -25,3 +28,7 @@ path = "src/tipa.rs"
 [[bin]]
 name = "screenshot"
 path = "src/screenshot.rs"
+
+[[bin]]
+name = "server_jonny"
+path = "src/server_jonny.rs"
diff --git a/src/screenshot.rs b/src/screenshot.rs
index 4a8b700..e05ca32 100644
--- a/src/screenshot.rs
+++ b/src/screenshot.rs
@@ -146,6 +146,9 @@ impl Iterator for ScreenShotIter {
                     res.is_deflated = true;
                 }
             }
+            else{
+                res.png = make_png(&*new_frame, png::ColorType::Grayscale);
+            }
         }
         else{
             res.png = make_png(&*new_frame, png::ColorType::Grayscale);
diff --git a/src/server_jonny.rs b/src/server_jonny.rs
new file mode 100644
index 0000000..d9fef66
--- /dev/null
+++ b/src/server_jonny.rs
@@ -0,0 +1,59 @@
+use futures::{FutureExt, StreamExt};
+use warp::Filter;
+use std::time::Duration;
+use std::cell::RefCell;
+
+use std::sync::RwLock;
+use std::sync::Arc;
+
+mod screenshot;
+
+use screenshot::ScreenShot;
+
+async fn background_shooter(current_screenshot: Arc<RwLock<ScreenShot>>) {
+    let mut it = screenshot::ScreenShotIter::new().unwrap();
+    loop{
+        let (screenshot, itback) = tokio::task::spawn_blocking(move ||{
+            (it.next().unwrap(), it)
+        }).await.unwrap();
+        it = itback;
+
+        println!("screenshot: {} bytes", screenshot.png.len());
+        // save screenshot for webserver
+        *current_screenshot.write().unwrap() = screenshot;
+
+        // notify websockets
+
+        tokio::time::sleep(Duration::from_secs(2)).await;
+
+    }
+    
+}
+
+#[tokio::main]
+async fn main() {
+    pretty_env_logger::init();
+
+    let current_screenshot = Arc::new(RwLock::<ScreenShot>::new(Default::default()));
+    tokio::task::spawn(background_shooter(current_screenshot.clone()));
+
+    let bg_route = warp::path("bg.png").map(move || current_screenshot.read().unwrap().png.clone());
+    let routes = warp::path("echo")
+        // The `ws()` filter will prepare the Websocket handshake.
+        .and(warp::ws())
+        .map(|ws: warp::ws::Ws| {
+            // And then our closure will be called when it completes...
+            ws.on_upgrade(|websocket| {
+                // Just echo all messages back...
+                let (tx, rx) = websocket.split();
+                rx.forward(tx).map(|result| {
+                    if let Err(e) = result {
+                        eprintln!("websocket error: {:?}", e);
+                    }
+                })
+            })
+        })
+        .or(bg_route);
+
+    warp::serve(routes).run((std::net::Ipv6Addr::UNSPECIFIED, 3030)).await;
+}
-- 
GitLab