summaryrefslogtreecommitdiff
path: root/src/animation.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-02-13 15:10:42 +0100
committermetamuffin <metamuffin@disroot.org>2023-02-13 15:10:42 +0100
commit78ac98926ebd97c5166a6c88b5abd9e85883462b (patch)
tree0ae0213f7a5226fb31b858b788a5d25423124c6a /src/animation.rs
parent4153ae68e4972c7e5a4a45ac1c91a9ceee52a7de (diff)
downloadmetamuffin-website-78ac98926ebd97c5166a6c88b5abd9e85883462b.tar
metamuffin-website-78ac98926ebd97c5166a6c88b5abd9e85883462b.tar.bz2
metamuffin-website-78ac98926ebd97c5166a6c88b5abd9e85883462b.tar.zst
fancy animation for licence
Diffstat (limited to 'src/animation.rs')
-rw-r--r--src/animation.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/animation.rs b/src/animation.rs
new file mode 100644
index 0000000..bfb17a4
--- /dev/null
+++ b/src/animation.rs
@@ -0,0 +1,50 @@
+use rocket::{
+ get,
+ http::{Cookie, CookieJar, Header},
+ response::{self, Responder},
+ Request,
+};
+
+pub struct Reload<T>(f64, pub T);
+
+#[rocket::async_trait]
+impl<'r, T: Responder<'r, 'static>> Responder<'r, 'static> for Reload<T> {
+ fn respond_to(self, request: &'r Request<'_>) -> response::Result<'static> {
+ let mut resp = self.1.respond_to(request);
+ if let Ok(resp) = &mut resp {
+ resp.set_header(Header::new("refresh", format!("{}", self.0)));
+ }
+ resp
+ }
+}
+
+const TEXT: &'static str = include_str!("../COPYING");
+const END_FRAME: isize = TEXT.len() as isize / 100 + 5;
+
+#[get("/wubbel")]
+pub fn r_wubbel(jar: &CookieJar) -> Reload<String> {
+ let frame = jar
+ .get("frame")
+ .and_then(|c| c.value().parse().ok())
+ .unwrap_or(0isize);
+ jar.add(Cookie::build("frame", format!("{}", (frame + 1) % (END_FRAME + 1))).finish());
+
+ let text = TEXT
+ .chars()
+ .enumerate()
+ .map(|(i, e)| {
+ if e == '\n' || frag(i as isize, frame) {
+ e
+ } else {
+ ' '
+ }
+ })
+ .collect::<String>();
+
+ Reload(if frame >= END_FRAME { 60.0 } else { 0.1 }, text)
+}
+
+#[inline]
+fn frag(i: isize, frame: isize) -> bool {
+ i % 5 < (frame - i / 100)
+}