Compare commits

...

2 Commits

Author SHA1 Message Date
Xyon 8ab3d67542 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
2025-06-13 02:26:20 +00:00
Xyon 1b31ca39b4 drop locks before holding pagination timeouts 2025-06-13 02:26:01 +00:00
1 changed files with 91 additions and 88 deletions

View File

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