aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-11-04 01:12:42 +0100
committersalmonik <salmonik@tuta.io>2026-11-04 01:12:42 +0100
commit234937fea6452a037d8cf2d2e20af5ff535ebe26 (patch)
tree7a4a3ca0f30b85be4f26c87db37af2f07d3d6908
parenttts: run piper loading and synthesis on blocking threads (diff)
downloadsenator-sperma-234937fea6452a037d8cf2d2e20af5ff535ebe26.tar.gz
senator-sperma-234937fea6452a037d8cf2d2e20af5ff535ebe26.zip
cron/triggers: keep pre-scoping rows manageable
-rw-r--r--src/database/mod.rs18
-rw-r--r--src/events/mod.rs5
2 files changed, 15 insertions, 8 deletions
diff --git a/src/database/mod.rs b/src/database/mod.rs
index e81e448..d15bb00 100644
--- a/src/database/mod.rs
+++ b/src/database/mod.rs
@@ -336,7 +336,9 @@ pub struct CronJob {
336#[allow(dead_code)] 336#[allow(dead_code)]
337pub async fn list_cron_jobs(pool: &DbPool, guild_id: i64) -> Result<Vec<CronJob>> { 337pub async fn list_cron_jobs(pool: &DbPool, guild_id: i64) -> Result<Vec<CronJob>> {
338 Ok( 338 Ok(
339 sqlx::query_as("SELECT * FROM cron_jobs WHERE guild_id = ? ORDER BY id") 339 // `guild_id = 0` covers rows created before guild scoping existed;
340 // they stay manageable until recreated in a guild.
341 sqlx::query_as("SELECT * FROM cron_jobs WHERE guild_id = ? OR guild_id = 0 ORDER BY id")
340 .bind(guild_id) 342 .bind(guild_id)
341 .fetch_all(pool) 343 .fetch_all(pool)
342 .await?, 344 .await?,
@@ -389,7 +391,7 @@ pub async fn add_cron_job(
389} 391}
390 392
391pub async fn delete_cron_job(pool: &DbPool, id: i64, guild_id: i64) -> Result<bool> { 393pub async fn delete_cron_job(pool: &DbPool, id: i64, guild_id: i64) -> Result<bool> {
392 let result = sqlx::query("DELETE FROM cron_jobs WHERE id = ? AND guild_id = ?") 394 let result = sqlx::query("DELETE FROM cron_jobs WHERE id = ? AND (guild_id = ? OR guild_id = 0)")
393 .bind(id) 395 .bind(id)
394 .bind(guild_id) 396 .bind(guild_id)
395 .execute(pool) 397 .execute(pool)
@@ -413,7 +415,7 @@ pub async fn set_cron_job_active(
413 active: bool, 415 active: bool,
414) -> Result<bool> { 416) -> Result<bool> {
415 let result = 417 let result =
416 sqlx::query("UPDATE cron_jobs SET active = ? WHERE id = ? AND guild_id = ?") 418 sqlx::query("UPDATE cron_jobs SET active = ? WHERE id = ? AND (guild_id = ? OR guild_id = 0)")
417 .bind(if active { 1 } else { 0 }) 419 .bind(if active { 1 } else { 0 })
418 .bind(id) 420 .bind(id)
419 .bind(guild_id) 421 .bind(guild_id)
@@ -458,7 +460,7 @@ pub async fn create_trigger(pool: &DbPool, guild_id: i64, name: &str) -> Result<
458} 460}
459 461
460pub async fn delete_trigger(pool: &DbPool, id: i64, guild_id: i64) -> Result<bool> { 462pub async fn delete_trigger(pool: &DbPool, id: i64, guild_id: i64) -> Result<bool> {
461 let result = sqlx::query("DELETE FROM triggers WHERE id = ? AND guild_id = ?") 463 let result = sqlx::query("DELETE FROM triggers WHERE id = ? AND (guild_id = ? OR guild_id = 0)")
462 .bind(id) 464 .bind(id)
463 .bind(guild_id) 465 .bind(guild_id)
464 .execute(pool) 466 .execute(pool)
@@ -472,7 +474,9 @@ pub async fn get_trigger_by_name(
472 name: &str, 474 name: &str,
473) -> Result<Option<Trigger>> { 475) -> Result<Option<Trigger>> {
474 Ok( 476 Ok(
475 sqlx::query_as("SELECT * FROM triggers WHERE guild_id = ? AND name = ?") 477 sqlx::query_as(
478 "SELECT * FROM triggers WHERE (guild_id = ? OR guild_id = 0) AND name = ?",
479 )
476 .bind(guild_id) 480 .bind(guild_id)
477 .bind(name) 481 .bind(name)
478 .fetch_optional(pool) 482 .fetch_optional(pool)
@@ -482,7 +486,9 @@ pub async fn get_trigger_by_name(
482 486
483pub async fn list_triggers(pool: &DbPool, guild_id: i64) -> Result<Vec<Trigger>> { 487pub async fn list_triggers(pool: &DbPool, guild_id: i64) -> Result<Vec<Trigger>> {
484 Ok( 488 Ok(
485 sqlx::query_as("SELECT * FROM triggers WHERE guild_id = ? ORDER BY name") 489 sqlx::query_as(
490 "SELECT * FROM triggers WHERE guild_id = ? OR guild_id = 0 ORDER BY name",
491 )
486 .bind(guild_id) 492 .bind(guild_id)
487 .fetch_all(pool) 493 .fetch_all(pool)
488 .await?, 494 .await?,
diff --git a/src/events/mod.rs b/src/events/mod.rs
index 406490a..79ebb0f 100644
--- a/src/events/mod.rs
+++ b/src/events/mod.rs
@@ -393,8 +393,9 @@ pub async fn handle_message(
393 let triggers = data.triggers.lock().await; 393 let triggers = data.triggers.lock().await;
394 let mut chosen = None; 394 let mut chosen = None;
395 for (trigger, keywords, responses) in triggers.iter() { 395 for (trigger, keywords, responses) in triggers.iter() {
396 // Triggers belong to one guild and never fire in DMs. 396 // Triggers belong to one guild and never fire in DMs. Rows with
397 if message_guild_id != Some(trigger.guild_id) { 397 // guild_id = 0 predate scoping and keep their old global behaviour.
398 if trigger.guild_id != 0 && message_guild_id != Some(trigger.guild_id) {
398 continue; 399 continue;
399 } 400 }
400 if keywords.iter().any(|k| content_lower.contains(k)) { 401 if keywords.iter().any(|k| content_lower.contains(k)) {