From 11880ac1382aaf5f9573ca9366e9f6d734e8392c Mon Sep 17 00:00:00 2001 From: famfo Date: Thu, 13 Jan 2022 17:52:39 +0100 Subject: [PATCH 01/10] Gitea webhook reciver --- Cargo.toml | 1 + src/bots/git.rs | 64 ++++++++++++++++++++++++++++++++++++++++++++++ src/bots/mod.rs | 1 + src/main.rs | 22 +++++++++++++--- src/web_service.rs | 30 +++++++++++++--------- 5 files changed, 103 insertions(+), 15 deletions(-) create mode 100644 src/bots/git.rs diff --git a/Cargo.toml b/Cargo.toml index eef3f4a..7b617db 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ lazy_static = "1.4" sedregex = "0.2" rusqlite = { version = "0.26", features = ["bundled"] } hyper = { version = "0.14", features = ["server"] } +warp = "0.3" [features] tls = ["async-circe/tls"] diff --git a/src/bots/git.rs b/src/bots/git.rs new file mode 100644 index 0000000..c43389d --- /dev/null +++ b/src/bots/git.rs @@ -0,0 +1,64 @@ +use serde_json::Value::Null; +use std::net::SocketAddr; +use tokio::sync::mpsc::Sender; +use warp::Filter; + +#[derive(Clone)] +struct Tx { + tx: Sender, +} + +impl Tx { + fn new(tx: Sender) -> Self { + Tx { tx } + } +} + +async fn handle_post(json: serde_json::Value, tx: Tx) -> Result { + if json["commits"] != Null { + let commits = json["commits"].as_array().unwrap(); + let repo = &json["repository"]["full_name"].as_str().unwrap().trim(); + if commits.len() != 1 { + tx.tx + .send(format!("{} new commits on {}:", commits.len(), repo)) + .await + .expect("Failed to send string to main thread"); + for commit in commits { + let author = &commit["author"]["name"].as_str().unwrap().trim(); + let message = &commit["message"].as_str().unwrap().trim(); + tx.tx + .send(format!("{} - {}", author, message)) + .await + .expect("Failed to send string to main thread"); + } + } else { + let author = &json["commits"][0]["author"]["name"] + .as_str() + .unwrap() + .trim(); + let message = &json["commits"][0]["message"].as_str().unwrap().trim(); + tx.tx + .send(format!("New commit on {}: {} - {}", repo, message, author)) + .await + .expect("Failed to send string to main thread"); + } + } + + Ok(warp::reply::with_status("Ok", warp::http::StatusCode::OK)) +} + +pub async fn run(tx: Sender, listen: SocketAddr) -> Result<(), tokio::io::Error> { + //let addr = SocketAddr::from((Ipv4Addr::new(192, 168, 1, 66), 51001)); + //println!("{:?}", addr); + let tx = Tx::new(tx); + let tx_filter = warp::any().map(move || tx.clone()); + + let filter = warp::post() + .and(warp::body::json()) + .and(tx_filter) + .and_then(handle_post); + + warp::serve(filter).run(listen).await; + + Ok(()) +} diff --git a/src/bots/mod.rs b/src/bots/mod.rs index 99c5cd8..6a3a58d 100644 --- a/src/bots/mod.rs +++ b/src/bots/mod.rs @@ -1,3 +1,4 @@ +pub mod git; pub mod leek; pub mod misc; pub mod sed; diff --git a/src/main.rs b/src/main.rs index 893540b..e65fb10 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,10 +12,11 @@ use serde::Deserialize; use std::fmt::Write; use std::fs::File; use std::io::Read; +use std::net::SocketAddr; use std::thread; use std::{collections::HashMap, env}; -use std::net::SocketAddr; use tokio::select; +use tokio::sync::mpsc::{channel, Receiver}; use tracing_subscriber::EnvFilter; // this will be displayed when the help command is used @@ -54,6 +55,8 @@ pub struct AppState { last_eval: HashMap, titlebot: Titlebot, db: ExecutorConnection, + git_channel: String, + git_recv: Receiver, } #[derive(Deserialize)] @@ -68,7 +71,8 @@ struct ClientConf { spotify_client_secret: String, prefix: String, db_path: Option, - http_listen: Option + http_listen: Option, + git_channel: String, } #[tokio::main(flavor = "current_thread")] @@ -96,6 +100,13 @@ async fn main() -> anyhow::Result<()> { &client_config.spotify_client_secret, ); + let http_listen = client_config + .http_listen + .unwrap_or_else(|| SocketAddr::from(([127, 0, 0, 1], 5000))); + + let (git_tx, git_recv) = channel(512); + bots::git::run(git_tx, http_listen).await?; + let config = Config::runtime_config( client_config.channels, client_config.host, @@ -115,9 +126,10 @@ async fn main() -> anyhow::Result<()> { last_eval: HashMap::new(), titlebot: Titlebot::create(spotify_creds).await?, db: db_conn, + git_channel: client_config.git_channel, + git_recv, }; - let http_listen = client_config.http_listen.unwrap_or_else(|| SocketAddr::from(([127, 0, 0, 1], 5000))); if let Err(e) = executor(state, http_listen).await { tracing::error!("Error in message loop: {}", e); } @@ -153,6 +165,10 @@ async fn message_loop(state: &mut AppState) -> anyhow::Result<()> { .await?; } } + + if let Some(s) = state.git_recv.recv().await { + state.client.privmsg(&state.git_channel, &s).await?; + } } Ok(()) } diff --git a/src/web_service.rs b/src/web_service.rs index ce172ed..7a3c720 100644 --- a/src/web_service.rs +++ b/src/web_service.rs @@ -1,23 +1,29 @@ -use std::net::SocketAddr; use crate::ExecutorConnection; -use std::convert::Infallible; -use std::sync::Arc; -use hyper::{Body, Request, Response, Server}; use hyper::service::{make_service_fn, service_fn}; +use hyper::{Body, Request, Response, Server}; +use std::convert::Infallible; +use std::net::SocketAddr; +use std::sync::Arc; pub async fn run(db: ExecutorConnection, listen: SocketAddr) -> anyhow::Result<()> { let db = Arc::new(db); - Server::bind(&listen).serve(make_service_fn(|_| { - let db = Arc::clone(&db); - async move { - Ok::<_, Infallible>(service_fn(move |r| handle(r, Arc::clone(&db)))) - } - })).await?; + Server::bind(&listen) + .serve(make_service_fn(|_| { + let db = Arc::clone(&db); + async move { Ok::<_, Infallible>(service_fn(move |r| handle(r, Arc::clone(&db)))) } + })) + .await?; Ok(()) } -async fn handle(req: Request, db: Arc) -> Result, Infallible> { - Ok(Response::new(Body::from(format!("{:?}", db.get_quote(None).await)))) +async fn handle( + _req: Request, + db: Arc, +) -> Result, Infallible> { + Ok(Response::new(Body::from(format!( + "{:?}", + db.get_quote(None).await + )))) } From f7510864f68e785e42a84e72cf82711a52275335 Mon Sep 17 00:00:00 2001 From: famfo Date: Sat, 15 Jan 2022 12:05:50 +0100 Subject: [PATCH 02/10] Some stuff, fixme --- Cargo.toml | 2 +- src/bots/title.rs | 2 +- src/main.rs | 11 +++++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7b617db..cba371a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ serde = "1.0" arrayvec = "0.7" rand = "0.8" meval = "0.2" -async-circe = { git = "https://git.karx.xyz/circe/async-circe", default-features = false } +async-circe = { git = "https://git.karx.xyz/circe/async-circe" } lazy_static = "1.4" sedregex = "0.2" rusqlite = { version = "0.26", features = ["bundled"] } diff --git a/src/bots/title.rs b/src/bots/title.rs index 45543c7..99c756d 100644 --- a/src/bots/title.rs +++ b/src/bots/title.rs @@ -91,7 +91,7 @@ impl Titlebot { )?; let mut spotify = ClientCredsSpotify::new(spotify_creds); - spotify.request_token().await?; + //spotify.request_token().await?; Ok(Self { url_regex, title_regex, diff --git a/src/main.rs b/src/main.rs index e65fb10..daf2847 100644 --- a/src/main.rs +++ b/src/main.rs @@ -71,7 +71,8 @@ struct ClientConf { spotify_client_secret: String, prefix: String, db_path: Option, - http_listen: Option, + http_listen_db: Option, + http_listen_git: SocketAddr, git_channel: String, } @@ -101,11 +102,11 @@ async fn main() -> anyhow::Result<()> { ); let http_listen = client_config - .http_listen + .http_listen_db .unwrap_or_else(|| SocketAddr::from(([127, 0, 0, 1], 5000))); let (git_tx, git_recv) = channel(512); - bots::git::run(git_tx, http_listen).await?; + tokio::spawn(bots::git::run(git_tx, client_config.http_listen_git)); let config = Config::runtime_config( client_config.channels, @@ -145,7 +146,7 @@ async fn main() -> anyhow::Result<()> { async fn executor(mut state: AppState, http_listen: SocketAddr) -> anyhow::Result<()> { let web_db = state.db.clone(); select! { - r = web_service::run(web_db, http_listen) => r?, + //r = web_service::run(web_db, http_listen) => r?; r = message_loop(&mut state) => r?, _ = terminate_signal() => { tracing::info!("Sending QUIT message"); @@ -169,6 +170,8 @@ async fn message_loop(state: &mut AppState) -> anyhow::Result<()> { if let Some(s) = state.git_recv.recv().await { state.client.privmsg(&state.git_channel, &s).await?; } + + tracing::info!("aaa"); } Ok(()) } From cf99f5a4a116941627d7cf7fadcaec9c18cea7b4 Mon Sep 17 00:00:00 2001 From: famfo Date: Sat, 15 Jan 2022 12:24:27 +0100 Subject: [PATCH 03/10] Fixed me --- src/bots/title.rs | 2 +- src/main.rs | 28 +++++++++++++++++----------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/bots/title.rs b/src/bots/title.rs index 99c756d..45543c7 100644 --- a/src/bots/title.rs +++ b/src/bots/title.rs @@ -91,7 +91,7 @@ impl Titlebot { )?; let mut spotify = ClientCredsSpotify::new(spotify_creds); - //spotify.request_token().await?; + spotify.request_token().await?; Ok(Self { url_regex, title_regex, diff --git a/src/main.rs b/src/main.rs index daf2847..3e72f42 100644 --- a/src/main.rs +++ b/src/main.rs @@ -56,7 +56,6 @@ pub struct AppState { titlebot: Titlebot, db: ExecutorConnection, git_channel: String, - git_recv: Receiver, } #[derive(Deserialize)] @@ -128,10 +127,9 @@ async fn main() -> anyhow::Result<()> { titlebot: Titlebot::create(spotify_creds).await?, db: db_conn, git_channel: client_config.git_channel, - git_recv, }; - if let Err(e) = executor(state, http_listen).await { + if let Err(e) = executor(state, git_recv, http_listen).await { tracing::error!("Error in message loop: {}", e); } @@ -143,11 +141,17 @@ async fn main() -> anyhow::Result<()> { Ok(()) } -async fn executor(mut state: AppState, http_listen: SocketAddr) -> anyhow::Result<()> { +async fn executor( + mut state: AppState, + mut git_recv: Receiver, + http_listen: SocketAddr, +) -> anyhow::Result<()> { let web_db = state.db.clone(); + let git_channel = state.git_channel.clone(); select! { - //r = web_service::run(web_db, http_listen) => r?; + r = web_service::run(web_db, http_listen) => r?, r = message_loop(&mut state) => r?, + r = git_recv.recv() => state.client.privmsg(&git_channel, &get_str(r)).await?, _ = terminate_signal() => { tracing::info!("Sending QUIT message"); state.client.quit(Some("überbot shutting down")).await?; @@ -166,12 +170,6 @@ async fn message_loop(state: &mut AppState) -> anyhow::Result<()> { .await?; } } - - if let Some(s) = state.git_recv.recv().await { - state.client.privmsg(&state.git_channel, &s).await?; - } - - tracing::info!("aaa"); } Ok(()) } @@ -298,3 +296,11 @@ async fn handle_privmsg( } Ok(()) } + +fn get_str(r: Option) -> String { + if let Some(s) = r { + s + } else { + String::new() + } +} From 5ab4e3a22129059a49520e8e76d4b1ff200a3a30 Mon Sep 17 00:00:00 2001 From: famfo Date: Sat, 15 Jan 2022 14:50:47 +0100 Subject: [PATCH 04/10] Rewrote DB webserver to use warp --- src/web_service.rs | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/web_service.rs b/src/web_service.rs index 7a3c720..e68663f 100644 --- a/src/web_service.rs +++ b/src/web_service.rs @@ -1,29 +1,26 @@ use crate::ExecutorConnection; -use hyper::service::{make_service_fn, service_fn}; -use hyper::{Body, Request, Response, Server}; -use std::convert::Infallible; use std::net::SocketAddr; -use std::sync::Arc; +use warp::Filter; pub async fn run(db: ExecutorConnection, listen: SocketAddr) -> anyhow::Result<()> { - let db = Arc::new(db); + let db_filter = warp::any().map(move || db.clone()); + let filter = warp::any().and(db_filter).and_then(handle); - Server::bind(&listen) - .serve(make_service_fn(|_| { - let db = Arc::clone(&db); - async move { Ok::<_, Infallible>(service_fn(move |r| handle(r, Arc::clone(&db)))) } - })) - .await?; + warp::serve(filter).run(listen).await; Ok(()) } -async fn handle( - _req: Request, - db: Arc, -) -> Result, Infallible> { - Ok(Response::new(Body::from(format!( - "{:?}", - db.get_quote(None).await - )))) +async fn handle(db: ExecutorConnection) -> Result { + if let Some((a, b)) = db.get_quote(None).await { + Ok(warp::reply::with_status( + format!("{} {}", a, b), + warp::http::StatusCode::OK, + )) + } else { + Ok(warp::reply::with_status( + format!("None"), + warp::http::StatusCode::NO_CONTENT, + )) + } } From ad010adcfb10b1fbf9c97a7913924a85d15897e8 Mon Sep 17 00:00:00 2001 From: famfo Date: Sat, 15 Jan 2022 14:52:49 +0100 Subject: [PATCH 05/10] Updated sample config --- sample_uberbot.toml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sample_uberbot.toml b/sample_uberbot.toml index de3c2cd..7de780d 100644 --- a/sample_uberbot.toml +++ b/sample_uberbot.toml @@ -13,4 +13,9 @@ spotify_client_secret = "" prefix = "!" # Web service config -http_listen = "127.0.0.1:8080" +http_listen_db = "127.0.0.1:8080" + +# Git webhook config +http_listen_git = "127.0.0.1:51001" +git_channel = "#main" + From e3b2acf23fa50708c4a530cafed13929d030aa75 Mon Sep 17 00:00:00 2001 From: famfo Date: Sat, 15 Jan 2022 14:59:48 +0100 Subject: [PATCH 06/10] Removed dev comments --- src/bots/git.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/bots/git.rs b/src/bots/git.rs index c43389d..260875c 100644 --- a/src/bots/git.rs +++ b/src/bots/git.rs @@ -48,8 +48,6 @@ async fn handle_post(json: serde_json::Value, tx: Tx) -> Result, listen: SocketAddr) -> Result<(), tokio::io::Error> { - //let addr = SocketAddr::from((Ipv4Addr::new(192, 168, 1, 66), 51001)); - //println!("{:?}", addr); let tx = Tx::new(tx); let tx_filter = warp::any().map(move || tx.clone()); From e891c126bac4665ca94db2169d57b406283b5996 Mon Sep 17 00:00:00 2001 From: famfo Date: Sat, 15 Jan 2022 17:09:46 +0100 Subject: [PATCH 07/10] Moved both webservers into one, some other small fixes --- Cargo.toml | 1 - sample_uberbot.toml | 4 +--- src/bots/git.rs | 39 ++++++--------------------------------- src/main.rs | 27 +++++++++------------------ src/web_service.rs | 18 +++++++++++++++--- 5 files changed, 31 insertions(+), 58 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index cba371a..c6faf0f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,7 +25,6 @@ async-circe = { git = "https://git.karx.xyz/circe/async-circe" } lazy_static = "1.4" sedregex = "0.2" rusqlite = { version = "0.26", features = ["bundled"] } -hyper = { version = "0.14", features = ["server"] } warp = "0.3" [features] diff --git a/sample_uberbot.toml b/sample_uberbot.toml index 7de780d..5784662 100644 --- a/sample_uberbot.toml +++ b/sample_uberbot.toml @@ -13,9 +13,7 @@ spotify_client_secret = "" prefix = "!" # Web service config -http_listen_db = "127.0.0.1:8080" +http_listen = "127.0.0.1:8080" # Git webhook config -http_listen_git = "127.0.0.1:51001" git_channel = "#main" - diff --git a/src/bots/git.rs b/src/bots/git.rs index 260875c..5d2df41 100644 --- a/src/bots/git.rs +++ b/src/bots/git.rs @@ -1,33 +1,21 @@ use serde_json::Value::Null; -use std::net::SocketAddr; use tokio::sync::mpsc::Sender; -use warp::Filter; -#[derive(Clone)] -struct Tx { +pub async fn handle_post( + json: serde_json::Value, tx: Sender, -} - -impl Tx { - fn new(tx: Sender) -> Self { - Tx { tx } - } -} - -async fn handle_post(json: serde_json::Value, tx: Tx) -> Result { +) -> Result { if json["commits"] != Null { let commits = json["commits"].as_array().unwrap(); let repo = &json["repository"]["full_name"].as_str().unwrap().trim(); if commits.len() != 1 { - tx.tx - .send(format!("{} new commits on {}:", commits.len(), repo)) + tx.send(format!("{} new commits on {}:", commits.len(), repo)) .await .expect("Failed to send string to main thread"); for commit in commits { let author = &commit["author"]["name"].as_str().unwrap().trim(); let message = &commit["message"].as_str().unwrap().trim(); - tx.tx - .send(format!("{} - {}", author, message)) + tx.send(format!("{} - {}", author, message)) .await .expect("Failed to send string to main thread"); } @@ -37,8 +25,7 @@ async fn handle_post(json: serde_json::Value, tx: Tx) -> Result Result, listen: SocketAddr) -> Result<(), tokio::io::Error> { - let tx = Tx::new(tx); - let tx_filter = warp::any().map(move || tx.clone()); - - let filter = warp::post() - .and(warp::body::json()) - .and(tx_filter) - .and_then(handle_post); - - warp::serve(filter).run(listen).await; - - Ok(()) -} diff --git a/src/main.rs b/src/main.rs index 3e72f42..70d5b79 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,7 +16,7 @@ use std::net::SocketAddr; use std::thread; use std::{collections::HashMap, env}; use tokio::select; -use tokio::sync::mpsc::{channel, Receiver}; +use tokio::sync::mpsc::{channel, Receiver, Sender}; use tracing_subscriber::EnvFilter; // this will be displayed when the help command is used @@ -70,8 +70,7 @@ struct ClientConf { spotify_client_secret: String, prefix: String, db_path: Option, - http_listen_db: Option, - http_listen_git: SocketAddr, + http_listen: Option, git_channel: String, } @@ -101,12 +100,9 @@ async fn main() -> anyhow::Result<()> { ); let http_listen = client_config - .http_listen_db + .http_listen .unwrap_or_else(|| SocketAddr::from(([127, 0, 0, 1], 5000))); - let (git_tx, git_recv) = channel(512); - tokio::spawn(bots::git::run(git_tx, client_config.http_listen_git)); - let config = Config::runtime_config( client_config.channels, client_config.host, @@ -129,7 +125,9 @@ async fn main() -> anyhow::Result<()> { git_channel: client_config.git_channel, }; - if let Err(e) = executor(state, git_recv, http_listen).await { + let (git_tx, git_recv) = channel(512); + + if let Err(e) = executor(state, git_tx, git_recv, http_listen).await { tracing::error!("Error in message loop: {}", e); } @@ -143,15 +141,16 @@ async fn main() -> anyhow::Result<()> { async fn executor( mut state: AppState, + git_tx: Sender, mut git_recv: Receiver, http_listen: SocketAddr, ) -> anyhow::Result<()> { let web_db = state.db.clone(); let git_channel = state.git_channel.clone(); select! { - r = web_service::run(web_db, http_listen) => r?, + r = web_service::run(web_db, git_tx, http_listen) => r?, r = message_loop(&mut state) => r?, - r = git_recv.recv() => state.client.privmsg(&git_channel, &get_str(r)).await?, + r = git_recv.recv() => state.client.privmsg(&git_channel, &r.unwrap_or_default()).await?, _ = terminate_signal() => { tracing::info!("Sending QUIT message"); state.client.quit(Some("überbot shutting down")).await?; @@ -296,11 +295,3 @@ async fn handle_privmsg( } Ok(()) } - -fn get_str(r: Option) -> String { - if let Some(s) = r { - s - } else { - String::new() - } -} diff --git a/src/web_service.rs b/src/web_service.rs index e68663f..7d100a9 100644 --- a/src/web_service.rs +++ b/src/web_service.rs @@ -1,13 +1,25 @@ use crate::ExecutorConnection; use std::net::SocketAddr; +use tokio::sync::mpsc::Sender; use warp::Filter; -pub async fn run(db: ExecutorConnection, listen: SocketAddr) -> anyhow::Result<()> { +pub async fn run( + db: ExecutorConnection, + tx: Sender, + listen: SocketAddr, +) -> anyhow::Result<()> { let db_filter = warp::any().map(move || db.clone()); - let filter = warp::any().and(db_filter).and_then(handle); + let db_filter = warp::any().and(db_filter).and_then(handle); + let tx_filter = warp::any().map(move || tx.clone()); + let tx_filter = warp::path("webhook") + .and(warp::post()) + .and(warp::body::json()) + .and(tx_filter) + .and_then(crate::bots::git::handle_post); + + let filter = db_filter.or(tx_filter); warp::serve(filter).run(listen).await; - Ok(()) } From 018aa6ad95e0dc2d6e2f445af5abc6dfc385cf0c Mon Sep 17 00:00:00 2001 From: famfo Date: Sat, 15 Jan 2022 17:16:43 +0100 Subject: [PATCH 08/10] Hopefully fixed webhooks not arriving at the handler --- src/web_service.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/web_service.rs b/src/web_service.rs index 7d100a9..7d4fe51 100644 --- a/src/web_service.rs +++ b/src/web_service.rs @@ -9,7 +9,7 @@ pub async fn run( listen: SocketAddr, ) -> anyhow::Result<()> { let db_filter = warp::any().map(move || db.clone()); - let db_filter = warp::any().and(db_filter).and_then(handle); + let db_filter = warp::get().and(db_filter).and_then(handle); let tx_filter = warp::any().map(move || tx.clone()); let tx_filter = warp::path("webhook") From 47d3011552c9108add7f53f7875e30559625d50d Mon Sep 17 00:00:00 2001 From: famfo Date: Sat, 15 Jan 2022 18:18:26 +0100 Subject: [PATCH 09/10] Removed potential for emtpy messages --- src/main.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 70d5b79..9ae9762 100644 --- a/src/main.rs +++ b/src/main.rs @@ -150,7 +150,11 @@ async fn executor( select! { r = web_service::run(web_db, git_tx, http_listen) => r?, r = message_loop(&mut state) => r?, - r = git_recv.recv() => state.client.privmsg(&git_channel, &r.unwrap_or_default()).await?, + r = git_recv.recv() => { + if let Some(message) = r { + state.client.privmsg(&git_channel, &message).await?; + } + } _ = terminate_signal() => { tracing::info!("Sending QUIT message"); state.client.quit(Some("überbot shutting down")).await?; From 29429e099e494c666606601db9f55eb6021a50cb Mon Sep 17 00:00:00 2001 From: famfo Date: Sat, 15 Jan 2022 18:25:41 +0100 Subject: [PATCH 10/10] weeb services --- src/web_service.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/web_service.rs b/src/web_service.rs index 7d4fe51..7b2fd8b 100644 --- a/src/web_service.rs +++ b/src/web_service.rs @@ -31,7 +31,7 @@ async fn handle(db: ExecutorConnection) -> Result