use rocket::fs::{relative, FileServer}; use rocket::http::Status; use rocket::Request; use rocket::State; use rocket_dyn_templates::{context, Template}; use std::borrow::Cow; mod scrobbles; mod skweets; struct Clients { listenbrainz: listenbrainz::raw::Client, skinnyverse: mastodon_async::Mastodon, } #[macro_use] extern crate rocket; #[get("/")] async fn home(clients: &State) -> Result { Ok(Template::render( "home", context! { is_live: false, listenbrainz: scrobbles::get_now_playing(&clients.listenbrainz).await.unwrap_or_default(), skweets: skweets::get_recents(&clients.skinnyverse).await.unwrap_or_default() }, )) } #[get("/contact")] async fn contact() -> Template { Template::render("contact", context! {}) } #[get("/plants")] async fn plants() -> Result { Err(BlossomError::Unimplemented(Status::NotImplemented)) } #[catch(default)] fn catcher(status: Status, req: &Request) -> Template { let message; if status.code == 404 { message = "i either haven't built this page yet or it looks like you're a little lost"; } else if status.code == 500 { message = "omg the server went kaputt!!"; } else if status.code == 501 { message = "it looks like this is not yet here!!!"; } else { message = "idk i got bored"; } let status = format!("{}", status); Template::render( "error", context! { status: status, req: req.uri(), message: message }, ) } #[tokio::main] async fn main() -> Result<(), rocket::Error> { let mut skinny_data = mastodon_async::Data::default(); skinny_data.base = Cow::from("https://skinnyver.se"); let _rocket = rocket::build() .manage(Clients { listenbrainz: listenbrainz::raw::Client::new(), skinnyverse: mastodon_async::Mastodon::from(skinny_data), }) .attach(Template::custom(|engines| { engines.tera.autoescape_on(vec![]); })) .mount("/", routes![home, contact, plants]) .register("/", catchers![catcher]) .mount("/", FileServer::from(relative!("static"))) .launch() .await?; Ok(()) } mod error; use error::BlossomError;