aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.rs
blob: 63a8c1049ad4ce7da3fdac6ce7cf4795fcfd4e03 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
use listenbrainz::raw::response::UserPlayingNowResponse;
use rocket::fs::{relative, FileServer};
use rocket::http::Status;
use rocket::response::Responder;
use rocket::Request;
use rocket_dyn_templates::{context, Template};
use serde::{Deserialize, Serialize};

#[macro_use]
extern crate rocket;

#[derive(Serialize, Deserialize)]
struct ScrobbleData {
    is_scrobbling: bool,
    song: Option<String>,
    artist: Option<String>,
}

impl ScrobbleData {
    fn new(playingnow: UserPlayingNowResponse) -> Self {
        let is_scrobbling = playingnow.payload.count > 0;
        if is_scrobbling {
            Self {
                is_scrobbling,
                song: Some(
                    playingnow
                        .payload
                        .listens
                        .first()
                        .unwrap()
                        .track_metadata
                        .track_name
                        .clone(),
                ),
                artist: Some(
                    playingnow
                        .payload
                        .listens
                        .first()
                        .unwrap()
                        .track_metadata
                        .artist_name
                        .clone(),
                ),
            }
        } else {
            Self {
                is_scrobbling,
                song: None,
                artist: None,
            }
        }
    }
}

#[get("/")]
async fn home() -> Template {
    let listenbrainz = listenbrainz::raw::Client::new();
    let playingnow = listenbrainz.user_playing_now("celblossom").unwrap();
    let listenbrainz_data = ScrobbleData::new(playingnow);
    println!("{}", listenbrainz_data.is_scrobbling);

    Template::render(
        "home",
        context! { is_live: false, listenbrainz: listenbrainz_data },
    )
}

#[get("/contact")]
async fn contact() -> Template {
    Template::render("contact", context! {})
}

// #[get("/test")]
// async fn test() -> Result<Template, BlossomError> {
//     let posts = reqwest::get("https://skinnyver.se/api/v1/accounts/cel/statuses").await;
//     posts
// }

#[catch(404)]
fn not_found(req: &Request) -> Template {
    let message = "i either haven't built this page yet or it looks like you're a little lost";
    Template::render(
        "error",
        context! { status: "404", req: req.uri(), message: message },
    )
}

#[catch(501)]
fn server_error(req: &Request) -> Template {
    let message = "it looks like this is not yet here!!!";
    Template::render(
        "error",
        context! { status: "501", req: req.uri(), message: message },
    )
}

#[catch(default)]
fn error(status: Status, req: &Request) -> Template {
    let status = format!("{}", status);
    let message = "there was an error";
    Template::render(
        "error",
        context! { status: status, req: req.uri(), message: message },
    )
}

#[tokio::main]
async fn main() -> Result<(), rocket::Error> {
    let _rocket = rocket::build()
        .attach(Template::fairing())
        .mount("/", routes![home, contact])
        .register("/", catchers![not_found, server_error, error])
        .mount("/", FileServer::from(relative!("static")))
        .launch()
        .await?;

    Ok(())
}

#[derive(Responder)]
enum BlossomError {
    #[response(status = 500)]
    Reqwest(&'static str, #[response(ignore)] reqwest::Error),
}

impl From<reqwest::Error> for BlossomError {
    fn from(e: reqwest::Error) -> Self {
        BlossomError::Reqwest("reqwest error", e)
    }
}