/* This file is part of jellything (https://codeberg.org/metamuffin/jellything) which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2025 metamuffin */ use crate::{helper::A, locale::AcceptLanguage, CONF}; use error::MyResult; use home::rocket_uri_macro_r_home; use jellylogic::session::Session; use jellyui::{render_page, scaffold::RenderInfo, CustomPage}; use rocket::{ futures::FutureExt, get, response::{content::RawHtml, Redirect}, Either, }; use std::{future::Future, pin::Pin}; use tokio::{ fs::{read_to_string, File}, io::AsyncRead, }; pub mod account; pub mod admin; pub mod assets; pub mod error; pub mod home; pub mod items; pub mod node; pub mod player; pub mod search; pub mod stats; pub mod style; #[get("/")] pub async fn r_index( lang: AcceptLanguage, sess: Option>, ) -> MyResult>> { let AcceptLanguage(lang) = lang; if sess.is_some() { Ok(Either::Left(Redirect::temporary(rocket::uri!(r_home())))) } else { let front = read_to_string(CONF.asset_path.join("front.htm")).await?; Ok(Either::Right(RawHtml(render_page( &CustomPage { title: "Jellything".to_string(), body: front, }, RenderInfo { importing: false, session: None, }, lang, )))) } } #[get("/favicon.ico")] pub async fn r_favicon() -> MyResult { Ok(File::open(CONF.asset_path.join("favicon.ico")).await?) } pub struct Defer(Pin + Send>>); impl AsyncRead for Defer { fn poll_read( mut self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>, buf: &mut tokio::io::ReadBuf<'_>, ) -> std::task::Poll> { match self.0.poll_unpin(cx) { std::task::Poll::Ready(r) => { buf.put_slice(r.as_bytes()); std::task::Poll::Ready(Ok(())) } std::task::Poll::Pending => std::task::Poll::Pending, } } }