aboutsummaryrefslogtreecommitdiffstats
path: root/src/web_server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/web_server.rs')
-rw-r--r--src/web_server.rs63
1 files changed, 46 insertions, 17 deletions
diff --git a/src/web_server.rs b/src/web_server.rs
index 1edbc50..94f043a 100644
--- a/src/web_server.rs
+++ b/src/web_server.rs
@@ -1,21 +1,12 @@
use std::sync::Arc;
use actix::{Actor, Addr, Handler, Message, SyncArbiter, SyncContext};
-use actix_web::{get, middleware::Logger, web, App, HttpResponse, HttpServer, Responder};
+use actix_web::{get, middleware::Logger, web, App, HttpServer, Responder};
+use askama::actix_web::TemplateIntoResponse;
+use askama::Template;
use crate::bot::MasterBot;
-
-struct GetNames;
-
-impl Message for GetNames {
- type Result = Result<Vec<String>, ()>;
-}
-
-#[get("/")]
-async fn index(bot: web::Data<Addr<BotExecutor>>) -> impl Responder {
- let names = bot.send(GetNames).await.unwrap().unwrap();
- HttpResponse::Ok().body(&format!("Music bots connected: {}", names.join(", ")))
-}
+use crate::youtube_dl::AudioMetadata;
pub struct WebServerArgs {
pub domain: String,
@@ -33,6 +24,7 @@ pub async fn start(args: WebServerArgs) -> std::io::Result<()> {
.data(bot_addr.clone())
.wrap(Logger::default())
.service(index)
+ .service(actix_files::Files::new("/static", "static/"))
})
.bind(args.bind_address)?
.run()
@@ -49,12 +41,49 @@ impl Actor for BotExecutor {
type Context = SyncContext<Self>;
}
-impl Handler<GetNames> for BotExecutor {
- type Result = Result<Vec<String>, ()>;
+impl Handler<PlaylistRequest> for BotExecutor {
+ type Result = Result<Vec<BotData>, ()>;
- fn handle(&mut self, _: GetNames, _: &mut Self::Context) -> Self::Result {
+ fn handle(&mut self, _: PlaylistRequest, _: &mut Self::Context) -> Self::Result {
let bot = &self.0;
- Ok(bot.names())
+ Ok(bot.bot_datas())
+ }
+}
+
+struct PlaylistRequest;
+
+impl Message for PlaylistRequest {
+ type Result = Result<Vec<BotData>, ()>;
+}
+
+#[derive(Template)]
+#[template(path = "index.htm")]
+struct PlaylistTemplate<'a> {
+ bots: &'a [BotData],
+}
+
+#[derive(Debug)]
+pub struct BotData {
+ pub name: String,
+ pub state: crate::bot::State,
+ pub volume: f64,
+ pub currently_playing: Option<AudioMetadata>,
+ pub playlist: Vec<AudioMetadata>,
+}
+
+#[get("/")]
+async fn index(bot: web::Data<Addr<BotExecutor>>) -> impl Responder {
+ let bot_datas = match bot.send(PlaylistRequest).await.unwrap() {
+ Ok(data) => data,
+ Err(_) => {
+ //error!("Playlist error: {}", e);
+ Vec::with_capacity(0)
+ }
+ };
+
+ PlaylistTemplate {
+ bots: &bot_datas[..],
}
+ .into_response()
}