Merge pull request 'drop locks before holding pagination timeouts' (#21) from xyon-patch-1 into main
Badgey Deployment / build (push) Successful in 6m36s Details
Badgey Deployment / deploy (BADGEY) (push) Successful in 11s Details
Badgey Deployment / deploy (M5_COMPUTER) (push) Successful in 10s Details

Reviewed-on: #21
This commit is contained in:
Xyon 2025-06-13 02:26:20 +00:00
commit 8ab3d67542
1 changed files with 91 additions and 88 deletions

View File

@ -1,88 +1,91 @@
use poise::serenity_prelude as serenity; use poise::serenity_prelude as serenity;
use manifold::error::{ManifoldError, ManifoldResult}; use manifold::error::{ManifoldError, ManifoldResult};
use manifold::{ManifoldContext, ManifoldData}; use manifold::{ManifoldContext, ManifoldData};
use poise::serenity_prelude::{CreateEmbed, Mentionable}; use poise::serenity_prelude::{CreateEmbed, Mentionable};
use url::Url; use url::Url;
use crate::badgey::models::custom_response::{CustomResponse, CustomResponseInserter}; use crate::badgey::models::custom_response::{CustomResponse, CustomResponseInserter};
#[poise::command(slash_command, prefix_command, required_permissions = "MODERATE_MEMBERS" )] #[poise::command(slash_command, prefix_command, required_permissions = "MODERATE_MEMBERS" )]
async fn add_custom_response(ctx: ManifoldContext<'_>, target: serenity::User, trigger: String, response: String) -> ManifoldResult<()> { async fn add_custom_response(ctx: ManifoldContext<'_>, target: serenity::User, trigger: String, response: String) -> ManifoldResult<()> {
let db = &ctx.data().database; let db = &ctx.data().database;
match CustomResponseInserter::new(trigger, response, target, ctx.author().clone()).insert(db) { match CustomResponseInserter::new(trigger, response, target, ctx.author().clone()).insert(db) {
Ok(_) => ctx.reply(t!("commands.custom_response.added")).await?, Ok(_) => ctx.reply(t!("commands.custom_response.added")).await?,
Err(e) => ctx.reply(t!("commands.custom_response.added.error", error = e)).await?, Err(e) => ctx.reply(t!("commands.custom_response.added.error", error = e)).await?,
}; };
Ok(()) Ok(())
} }
#[poise::command(slash_command, prefix_command, required_permissions = "MODERATE_MEMBERS")] #[poise::command(slash_command, prefix_command, required_permissions = "MODERATE_MEMBERS")]
async fn remove_custom_response(ctx: ManifoldContext<'_>, id: i32) -> ManifoldResult<()> { async fn remove_custom_response(ctx: ManifoldContext<'_>, id: i32) -> ManifoldResult<()> {
let db = &ctx.data().database; let db = &ctx.data().database;
let mut response = CustomResponse::find_by_id(db, &id)?; let mut response = CustomResponse::find_by_id(db, &id)?;
response.deleted = Some(true); response.deleted = Some(true);
response.insert(db)?; response.insert(db)?;
ctx.reply(t!("commands.custom_response.marked_deleted", response_id=id)).await?; ctx.reply(t!("commands.custom_response.marked_deleted", response_id=id)).await?;
Ok(()) Ok(())
} }
#[poise::command(slash_command, prefix_command, required_permissions = "MODERATE_MEMBERS")] #[poise::command(slash_command, prefix_command, required_permissions = "MODERATE_MEMBERS")]
async fn undelete_custom_response(ctx: ManifoldContext<'_>, id: i32) -> ManifoldResult<()> { async fn undelete_custom_response(ctx: ManifoldContext<'_>, id: i32) -> ManifoldResult<()> {
let db = &ctx.data().database; let db = &ctx.data().database;
let mut response = CustomResponse::find_by_id(db, &id)?; let mut response = CustomResponse::find_by_id(db, &id)?;
if let Some(_) = response.deleted { if let Some(_) = response.deleted {
response.deleted = None; response.deleted = None;
response.insert(db)?; response.insert(db)?;
ctx.reply(t!("commands.custom_response.marked_undeleted", response_id=id)).await?; ctx.reply(t!("commands.custom_response.marked_undeleted", response_id=id)).await?;
} else { } else {
ctx.reply(t!("commands.custom_response.undelete_error_not_deleted", response_id=id)).await?; ctx.reply(t!("commands.custom_response.undelete_error_not_deleted", response_id=id)).await?;
} }
Ok(()) Ok(())
} }
#[poise::command(slash_command, prefix_command, required_permissions = "MODERATE_MEMBERS")] #[poise::command(slash_command, prefix_command, required_permissions = "MODERATE_MEMBERS")]
async fn list_custom_responses_for_user(ctx: ManifoldContext<'_>, target: serenity::User) -> ManifoldResult<()> { async fn list_custom_responses_for_user(ctx: ManifoldContext<'_>, target: serenity::User) -> ManifoldResult<()> {
let db = &ctx.data().database; let db = &ctx.data().database;
let userinfo = &ctx.data().user_info.lock().await; let userinfo = &ctx.data().user_info.lock().await;
let reply_handle = ctx.reply("Retrieving custom responses, please stand by...".to_string()).await?; let reply_handle = ctx.reply("Retrieving custom responses, please stand by...".to_string()).await?;
let mut pages = Vec::<CreateEmbed>::new(); let mut pages = Vec::<CreateEmbed>::new();
let responses = CustomResponse::find_by_user(db, &target)?; let responses = CustomResponse::find_by_user(db, &target)?;
let total = responses.len(); let total = responses.len();
responses.iter().enumerate().for_each(|(i, f)| { responses.iter().enumerate().for_each(|(i, f)| {
pages.push(CreateEmbed::default() pages.push(CreateEmbed::default()
.title(format!("Custom Response {item} of {total} for user {target}", item=(i + 1), total=&total, target=target.name)) .title(format!("Custom Response {item} of {total} for user {target}", item=(i + 1), total=&total, target=target.name))
.description(format!("Added by {added_by} on <t:{added_on}:F> (<t:{added_on}:R>)", added_by=userinfo.get(&(f.added_by as u64)).unwrap().username, added_on=f.added_on)) .description(format!("Added by {added_by} on <t:{added_on}:F> (<t:{added_on}:R>)", added_by=userinfo.get(&(f.added_by as u64)).unwrap().username, added_on=f.added_on))
.field("ID", format!("{id}", id=f.id), true) .field("ID", format!("{id}", id=f.id), true)
.field("Deleted", format!("{deleted}", deleted=(if f.deleted.unwrap_or(false) {"yes"} else {"no"})), true) .field("Deleted", format!("{deleted}", deleted=(if f.deleted.unwrap_or(false) {"yes"} else {"no"})), true)
.field("Trigger", format!("{trigger}", trigger=f.trigger), true) .field("Trigger", format!("{trigger}", trigger=f.trigger), true)
.field("Response", format!("{response}", response=f.response), false) .field("Response", format!("{response}", response=f.response), false)
.image(format!("{response}", response=Url::parse(&*f.response).unwrap_or("https://example.com".parse().unwrap()))) .image(format!("{response}", response=Url::parse(&*f.response).unwrap_or("https://example.com".parse().unwrap())))
.to_owned() .to_owned()
) )
}); });
if pages.len() == 0 { if pages.len() == 0 {
ctx.reply(format!("No custom responses found for {target}", target=target.mention())).await?; ctx.reply(format!("No custom responses found for {target}", target=target.mention())).await?;
return Ok(()) return Ok(())
} }
manifold::helpers::paginate(ctx, reply_handle, pages, 0).await?; drop(db);
drop(userinfo);
Ok(())
} manifold::helpers::paginate(ctx, reply_handle, pages, 0).await?;
pub fn commands() -> [poise::Command<ManifoldData, ManifoldError>; 4] { Ok(())
[add_custom_response(), remove_custom_response(), undelete_custom_response(), list_custom_responses_for_user()] }
}
pub fn commands() -> [poise::Command<ManifoldData, ManifoldError>; 4] {
[add_custom_response(), remove_custom_response(), undelete_custom_response(), list_custom_responses_for_user()]
}