QoL
* Made todo added responses ephemeral if /settings ephemeral is on * Enabled systemd watchdog * Move metrics to rocket
This commit is contained in:
@ -22,9 +22,9 @@ impl Recordable for Options {
|
||||
CreateEmbed::new()
|
||||
.title("Confirmations ephemeral")
|
||||
.description(concat!(
|
||||
"Reminder confirmations will be sent privately, and removed when your client",
|
||||
" restarts."
|
||||
))
|
||||
"Reminder and todo confirmations will be sent privately, and removed when ",
|
||||
"your client restarts."
|
||||
))
|
||||
.color(*THEME_COLOR),
|
||||
),
|
||||
)
|
||||
|
@ -22,8 +22,8 @@ impl Recordable for Options {
|
||||
CreateEmbed::new()
|
||||
.title("Confirmations public")
|
||||
.description(concat!(
|
||||
"Reminder confirmations will be sent as regular messages, and won't be ",
|
||||
"removed automatically."
|
||||
"Reminder and todo confirmations will be sent as regular messages, and",
|
||||
" won't be removed automatically."
|
||||
))
|
||||
.color(*THEME_COLOR),
|
||||
),
|
||||
|
@ -1,3 +1,4 @@
|
||||
use poise::CreateReply;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{
|
||||
@ -33,7 +34,13 @@ impl Recordable for Options {
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
ctx.say("Item added to todo list").await?;
|
||||
let ephemeral = ctx
|
||||
.guild_data()
|
||||
.await
|
||||
.map_or(false, |gr| gr.map_or(false, |g| g.ephemeral_confirmations));
|
||||
|
||||
ctx.send(CreateReply::default().content("Item added to todo list").ephemeral(ephemeral))
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
use poise::CreateReply;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{
|
||||
models::CtxData,
|
||||
utils::{Extract, Recordable},
|
||||
Context, Error,
|
||||
};
|
||||
@ -26,7 +28,13 @@ impl Recordable for Options {
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
ctx.say("Item added to todo list").await?;
|
||||
let ephemeral = ctx
|
||||
.guild_data()
|
||||
.await
|
||||
.map_or(false, |gr| gr.map_or(false, |g| g.ephemeral_confirmations));
|
||||
|
||||
ctx.send(CreateReply::default().content("Item added to todo list").ephemeral(ephemeral))
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
use poise::CreateReply;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{
|
||||
models::CtxData,
|
||||
utils::{Extract, Recordable},
|
||||
Context, Error,
|
||||
};
|
||||
@ -27,7 +29,13 @@ impl Recordable for Options {
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
ctx.say("Item added to todo list").await?;
|
||||
let ephemeral = ctx
|
||||
.guild_data()
|
||||
.await
|
||||
.map_or(false, |gr| gr.map_or(false, |g| g.ephemeral_confirmations));
|
||||
|
||||
ctx.send(CreateReply::default().content("Item added to todo list").ephemeral(ephemeral))
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
@ -212,7 +212,6 @@ async fn _main(tx: Sender<()>) -> Result<(), Box<dyn StdError + Send + Sync>> {
|
||||
|
||||
// Start metrics
|
||||
init_metrics();
|
||||
tokio::spawn(async { metrics::serve().await });
|
||||
|
||||
let database =
|
||||
Pool::connect(&env::var("DATABASE_URL").expect("No database URL provided")).await.unwrap();
|
||||
|
@ -1,6 +1,4 @@
|
||||
use axum::{routing::get, Router};
|
||||
use lazy_static::lazy_static;
|
||||
use log::warn;
|
||||
use prometheus::{IntCounterVec, Opts, Registry};
|
||||
|
||||
lazy_static! {
|
||||
@ -26,21 +24,3 @@ pub fn init_metrics() {
|
||||
REGISTRY.register(Box::new(REMINDER_FAIL_COUNTER.clone())).unwrap();
|
||||
REGISTRY.register(Box::new(COMMAND_COUNTER.clone())).unwrap();
|
||||
}
|
||||
|
||||
pub async fn serve() {
|
||||
let app = Router::new().route("/metrics", get(metrics));
|
||||
|
||||
let listener = tokio::net::TcpListener::bind("localhost:31756").await.unwrap();
|
||||
axum::serve(listener, app).await.unwrap();
|
||||
}
|
||||
|
||||
async fn metrics() -> String {
|
||||
let encoder = prometheus::TextEncoder::new();
|
||||
let res_custom = encoder.encode_to_string(®ISTRY.gather());
|
||||
|
||||
res_custom.unwrap_or_else(|e| {
|
||||
warn!("Error encoding metrics: {:?}", e);
|
||||
|
||||
String::new()
|
||||
})
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ use std::env;
|
||||
|
||||
use log::{info, warn};
|
||||
use poise::serenity_prelude::client::Context;
|
||||
use sd_notify::{self, NotifyState};
|
||||
use sqlx::{Executor, MySql};
|
||||
use tokio::{
|
||||
sync::broadcast::Receiver,
|
||||
@ -33,6 +34,15 @@ async fn _initialize(ctx: Context, pool: impl Executor<'_, Database = Database>
|
||||
.flatten()
|
||||
.unwrap_or(10);
|
||||
|
||||
let mut watchdog_interval = 0;
|
||||
let watchdog = sd_notify::watchdog_enabled(false, &mut watchdog_interval);
|
||||
|
||||
if watchdog {
|
||||
warn!("Watchdog enabled. Don't die!");
|
||||
} else {
|
||||
warn!("No watchdog running")
|
||||
}
|
||||
|
||||
loop {
|
||||
let sleep_to = Instant::now() + Duration::from_secs(remind_interval);
|
||||
let reminders = sender::Reminder::fetch_reminders(pool).await;
|
||||
@ -46,5 +56,6 @@ async fn _initialize(ctx: Context, pool: impl Executor<'_, Database = Database>
|
||||
}
|
||||
|
||||
sleep_until(sleep_to).await;
|
||||
let _ = sd_notify::notify(false, &[NotifyState::Watchdog]);
|
||||
}
|
||||
}
|
||||
|
1
src/web/fairings/mod.rs
Normal file
1
src/web/fairings/mod.rs
Normal file
@ -0,0 +1 @@
|
||||
pub mod metrics;
|
@ -2,9 +2,10 @@ mod consts;
|
||||
#[macro_use]
|
||||
mod macros;
|
||||
mod catchers;
|
||||
mod fairings;
|
||||
mod guards;
|
||||
mod metrics;
|
||||
mod routes;
|
||||
|
||||
pub mod string {
|
||||
use std::{fmt::Display, str::FromStr};
|
||||
|
||||
@ -79,7 +80,7 @@ use sqlx::{MySql, Pool};
|
||||
|
||||
use crate::web::{
|
||||
consts::{CNC_GUILD, DISCORD_OAUTH_AUTHORIZE, DISCORD_OAUTH_TOKEN, SUBSCRIPTION_ROLES},
|
||||
metrics::MetricProducer,
|
||||
fairings::metrics::MetricProducer,
|
||||
};
|
||||
|
||||
type Database = MySql;
|
||||
@ -149,6 +150,7 @@ pub async fn initialize(
|
||||
routes::report::report_error,
|
||||
routes::return_to_same_site,
|
||||
routes::terms,
|
||||
routes::metrics,
|
||||
],
|
||||
)
|
||||
.mount(
|
||||
|
@ -2,11 +2,14 @@ pub mod dashboard;
|
||||
pub mod login;
|
||||
pub mod report;
|
||||
|
||||
use std::collections::HashMap;
|
||||
use std::{collections::HashMap, net::IpAddr};
|
||||
|
||||
use log::warn;
|
||||
use rocket::{get, request::FlashMessage, serde::json::Value as JsonValue};
|
||||
use rocket_dyn_templates::Template;
|
||||
|
||||
use crate::metrics::REGISTRY;
|
||||
|
||||
pub type JsonResult = Result<JsonValue, JsonValue>;
|
||||
|
||||
#[get("/")]
|
||||
@ -107,3 +110,19 @@ pub async fn help_iemanager() -> Template {
|
||||
let map: HashMap<&str, String> = HashMap::new();
|
||||
Template::render("support/iemanager", &map)
|
||||
}
|
||||
|
||||
#[get("/metrics")]
|
||||
pub async fn metrics(client_ip: IpAddr) -> String {
|
||||
if !client_ip.is_loopback() {
|
||||
String::new()
|
||||
} else {
|
||||
let encoder = prometheus::TextEncoder::new();
|
||||
let res_custom = encoder.encode_to_string(®ISTRY.gather());
|
||||
|
||||
res_custom.unwrap_or_else(|e| {
|
||||
warn!("Error encoding metrics: {:?}", e);
|
||||
|
||||
String::new()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user