diff options
| author | salmonik <salmonik@tuta.io> | 2026-11-04 01:12:42 +0100 |
|---|---|---|
| committer | salmonik <salmonik@tuta.io> | 2026-11-04 01:12:42 +0100 |
| commit | 234937fea6452a037d8cf2d2e20af5ff535ebe26 (patch) | |
| tree | 7a4a3ca0f30b85be4f26c87db37af2f07d3d6908 | |
| parent | tts: run piper loading and synthesis on blocking threads (diff) | |
| download | senator-sperma-234937fea6452a037d8cf2d2e20af5ff535ebe26.tar.gz senator-sperma-234937fea6452a037d8cf2d2e20af5ff535ebe26.zip | |
cron/triggers: keep pre-scoping rows manageable
| -rw-r--r-- | src/database/mod.rs | 18 | ||||
| -rw-r--r-- | src/events/mod.rs | 5 |
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)] |
| 337 | pub async fn list_cron_jobs(pool: &DbPool, guild_id: i64) -> Result<Vec<CronJob>> { | 337 | pub 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 | ||
| 391 | pub async fn delete_cron_job(pool: &DbPool, id: i64, guild_id: i64) -> Result<bool> { | 393 | pub 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 | ||
| 460 | pub async fn delete_trigger(pool: &DbPool, id: i64, guild_id: i64) -> Result<bool> { | 462 | pub 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 | ||
| 483 | pub async fn list_triggers(pool: &DbPool, guild_id: i64) -> Result<Vec<Trigger>> { | 487 | pub 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)) { |
