feat: wip mise en place status

This commit is contained in:
Max batleforc 2025-05-28 20:04:43 +02:00
parent fd6d1381a1
commit ace28c402f
No known key found for this signature in database
GPG Key ID: 25D243AB4B6AC9E7
3 changed files with 133 additions and 3 deletions

View File

@ -138,8 +138,10 @@ pub async fn config(
}
}
let optimize_querry = format!("OPTIMIZE TABLE {} FINAL", Trivial::table_name());
if let Err(e) = manager.execute_with_retry(&optimize_querry).await {
if let Err(e) = manager
.execute_with_retry(&Trivial::optimize_table_sql())
.await
{
tracing::error!("Failed to optimize trivia table: {}", e);
} else {
info!("Trivia table optimized successfully.");

View File

@ -1,11 +1,13 @@
pub mod config;
pub mod create;
pub mod list;
pub mod status;
use crate::{Context, Error};
use config::config;
use create::create;
use list::list;
use status::status;
use tracing::instrument;
/// Handle trivia command
@ -14,7 +16,7 @@ use tracing::instrument;
slash_command,
prefix_command,
category = "Trivia",
subcommands("create", "list", "config"),
subcommands("create", "list", "config", "status"),
guild_only = true
)]
pub async fn trivia(ctx: Context<'_>) -> Result<(), Error> {

View File

@ -0,0 +1,126 @@
use crate::helper::is_user_admin_right;
use crate::{Context, Error};
use clickhouse_pool::traits::Model;
use database::trivial::{Trivial, TrivialStatus};
use poise::serenity_prelude::Channel;
use tracing::{debug, info, instrument};
/// Get or set the status of an existing trivia game
#[instrument(name = "trivia_status", skip(ctx), level = "info", fields(channel = ctx.channel_id().get(), guild = ?ctx.guild_id().unwrap().get()))]
#[poise::command(
prefix_command,
slash_command,
guild_only,
category = "Trivia",
check = "is_user_admin_right"
)]
pub async fn status(
ctx: Context<'_>,
#[description = "Channel of the trivia game, or current"] channel_id: Option<Channel>,
#[description = "Whether to start/stop the trivia game"] enabled: Option<bool>,
) -> Result<(), Error> {
let guild_id = match ctx.guild_id() {
Some(id) => id.get(),
None => {
ctx.say("This command can only be used in a server.")
.await?;
return Ok(());
}
};
let channel_id = match channel_id {
Some(c) => c.id().get(),
None => {
info!("No channel specified, using current channel.");
ctx.channel_id().get()
}
};
let manager = ctx.data().datalake_config.clone();
let search_query = Trivial::build_select_query(
Some(&format!(
"channel_id = {} and guild_id = {}",
channel_id, guild_id
)),
None,
None,
);
let mut trivia_exists: Trivial = match manager
.execute_select_with_retry::<Trivial>(&search_query)
.await
{
Ok(trivia) => {
if trivia.is_empty() {
ctx.say("No trivia game found in this channel. Please create one first.")
.await?;
return Ok(());
}
trivia.into_iter().next().unwrap()
}
Err(e) => {
debug!("Error while searching for trivia game: {}", e);
ctx.say("An error occurred while searching for the trivia game.")
.await?;
return Ok(());
}
};
if let Some(enabled) = enabled {
let mut inserter = match manager.get_insert::<Trivial>(Trivial::table_name()).await {
Ok(inserter) => inserter,
Err(e) => {
tracing::error!("Failed to create inserter for Trivial: {}", e);
ctx.say("Failed to update trivia game. Please try again later.")
.await?;
return Ok(());
}
};
trivia_exists.sign = -1; // Set sign to -1 to indicate an update
inserter.write(&trivia_exists.clone()).await?;
trivia_exists.status = if enabled {
TrivialStatus::Started
} else {
TrivialStatus::Paused
};
trivia_exists.sign = 1; // Set sign to 1 to indicate a status change
inserter.write(&trivia_exists.clone()).await?;
match inserter.end().await {
Ok(_) => {
info!(
"Trivia game '{}' updated successfully in channel <#{}>.",
trivia_exists.name, channel_id
);
ctx.say(format!("Trivia game status updated to: {}", enabled))
.await?;
}
Err(e) => {
tracing::error!("Failed to update trivia game: {}", e);
ctx.say("Failed to update trivia game. Please try again later.")
.await?;
return Ok(());
}
}
if let Err(e) = manager
.execute_with_retry(&Trivial::optimize_table_sql())
.await
{
tracing::error!("Failed to optimize trivia table: {}", e);
} else {
info!("Trivia table optimized successfully.");
}
} else {
ctx.say(format!(
"Trivia game is currently {}.",
if trivia_exists.status == TrivialStatus::Started {
"Started"
} else {
"Paused"
}
))
.await?;
}
Ok(())
}