Cleanly shutdown on ctrl_c
Signed-off-by: pep <pep@bouah.net>
This commit is contained in:
parent
f90b152abf
commit
e064263f96
3 changed files with 54 additions and 22 deletions
56
src/main.rs
56
src/main.rs
|
|
@ -33,10 +33,10 @@ use clap::{command, value_parser, Arg};
|
|||
use hyper::{server::conn::http1, service::service_fn};
|
||||
use hyper_util::rt::tokio::{TokioIo, TokioTimer};
|
||||
use log::error;
|
||||
use tokio::{net::TcpListener, sync::mpsc};
|
||||
use tokio::{net::TcpListener, signal::ctrl_c, sync::mpsc};
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<!, Error> {
|
||||
async fn main() -> Result<(), Error> {
|
||||
pretty_env_logger::init();
|
||||
|
||||
let matches = command!()
|
||||
|
|
@ -60,9 +60,12 @@ async fn main() -> Result<!, Error> {
|
|||
config.nickname,
|
||||
);
|
||||
|
||||
tokio::task::spawn(async move {
|
||||
let xmpp_handle = tokio::task::spawn(async move {
|
||||
bot.receive(value_rx).await;
|
||||
error!("XMPP client exited early");
|
||||
match bot.disconnect().await {
|
||||
Err(err) => error!("XMPP disconnect error: {err}"),
|
||||
_ => (),
|
||||
}
|
||||
});
|
||||
|
||||
let tcp_bind = TcpListener::bind(config.addr).await?;
|
||||
|
|
@ -71,24 +74,35 @@ async fn main() -> Result<!, Error> {
|
|||
let value_tx = value_tx.clone();
|
||||
let secret = config.secret.clone();
|
||||
|
||||
if let Ok((tcp, _)) = tcp_bind.accept().await {
|
||||
let io = TokioIo::new(tcp);
|
||||
tokio::task::spawn(async move {
|
||||
if let Err(err) = http1::Builder::new()
|
||||
.timer(TokioTimer::new())
|
||||
.serve_connection(
|
||||
io,
|
||||
service_fn(|request| {
|
||||
let value_tx = value_tx.clone();
|
||||
let secret = secret.clone();
|
||||
async move { hooks(request, &secret, value_tx).await }
|
||||
}),
|
||||
)
|
||||
.await
|
||||
{
|
||||
println!("Error serving connection: {:?}", err);
|
||||
tokio::select! {
|
||||
accept = tcp_bind.accept() => {
|
||||
if let Ok((tcp, _)) = accept {
|
||||
let io = TokioIo::new(tcp);
|
||||
tokio::task::spawn(async move {
|
||||
if let Err(err) = http1::Builder::new()
|
||||
.timer(TokioTimer::new())
|
||||
.serve_connection(
|
||||
io,
|
||||
service_fn(|request| {
|
||||
let value_tx = value_tx.clone();
|
||||
let secret = secret.clone();
|
||||
async move { hooks(request, &secret, value_tx).await }
|
||||
}),
|
||||
)
|
||||
.await
|
||||
{
|
||||
println!("Error serving connection: {:?}", err);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
_ = ctrl_c() => {
|
||||
break;
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
let _ = xmpp_handle.await;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue