diff options
Diffstat (limited to 'src/web_server.rs')
| -rw-r--r-- | src/web_server.rs | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/web_server.rs b/src/web_server.rs new file mode 100644 index 0000000..1edbc50 --- /dev/null +++ b/src/web_server.rs @@ -0,0 +1,60 @@ +use std::sync::Arc; + +use actix::{Actor, Addr, Handler, Message, SyncArbiter, SyncContext}; +use actix_web::{get, middleware::Logger, web, App, HttpResponse, HttpServer, Responder}; + +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(", "))) +} + +pub struct WebServerArgs { + pub domain: String, + pub bind_address: String, + pub bot: Arc<MasterBot>, +} + +#[actix_rt::main] +pub async fn start(args: WebServerArgs) -> std::io::Result<()> { + let cbot = args.bot.clone(); + let bot_addr: Addr<BotExecutor> = SyncArbiter::start(4, move || BotExecutor(cbot.clone())); + + HttpServer::new(move || { + App::new() + .data(bot_addr.clone()) + .wrap(Logger::default()) + .service(index) + }) + .bind(args.bind_address)? + .run() + .await?; + + args.bot.quit(String::from("Stopping")); + + Ok(()) +} + +pub struct BotExecutor(pub Arc<MasterBot>); + +impl Actor for BotExecutor { + type Context = SyncContext<Self>; +} + +impl Handler<GetNames> for BotExecutor { + type Result = Result<Vec<String>, ()>; + + fn handle(&mut self, _: GetNames, _: &mut Self::Context) -> Self::Result { + let bot = &self.0; + + Ok(bot.names()) + } +} |
