From c209c41b52423f92b02b018bb9ec59e2862701af Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Sun, 22 Mar 2026 09:48:16 +0100 Subject: [PATCH] Implement notification system for character death events: Added a new method in UserCharacterWorker to notify users of character deaths, including directors, relationships, and children. Updated SQL queries to support the insertion of notifications with event types, enhancing user engagement and real-time updates. --- src/worker/character_creation.rs | 2 +- src/worker/user_character.rs | 60 ++++++++++++++++++++++++++++++-- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/src/worker/character_creation.rs b/src/worker/character_creation.rs index 7a1ff49..ba636bc 100644 --- a/src/worker/character_creation.rs +++ b/src/worker/character_creation.rs @@ -464,7 +464,7 @@ impl CharacterCreationWorker { .map_err(|e| DbError::new(format!("DB-Verbindung fehlgeschlagen: {e}")))?; conn.prepare("insert_notification", QUERY_INSERT_NOTIFICATION)?; - conn.execute("insert_notification", &[&user_id])?; + conn.execute("insert_notification", &[&user_id, &event_type])?; // falukantUpdateStatus let update_message = diff --git a/src/worker/user_character.rs b/src/worker/user_character.rs index df9a752..3ae2f16 100644 --- a/src/worker/user_character.rs +++ b/src/worker/user_character.rs @@ -36,6 +36,7 @@ use crate::worker::sql::{ QUERY_GET_PREGNANCY_CANDIDATES, QUERY_INSERT_CHILD, QUERY_INSERT_CHILD_RELATION, + QUERY_INSERT_NOTIFICATION, QUERY_DELETE_DIRECTOR, QUERY_DELETE_RELATIONSHIP, QUERY_DELETE_CHILD_RELATION, @@ -609,6 +610,26 @@ impl UserCharacterWorker { self.base.broker.publish(update_status); } + /// Wie `EventsWorker::notify_user`: Eintrag in `falukant_log.notification` (`tr` = event_type) + WS. + fn notify_user_death( + &self, + conn: &mut crate::db::DbConnection, + user_id: i32, + event_type: &str, + ) -> Result<(), DbError> { + if user_id <= 0 { + return Ok(()); + } + conn.execute("insert_notification", &[&user_id, &event_type])?; + let update_message = + format!(r#"{{"event":"falukantUpdateStatus","user_id":{}}}"#, user_id); + self.base.broker.publish(update_message); + let message = + format!(r#"{{"event":"{event_type}","user_id":{}}}"#, user_id); + self.base.broker.publish(message); + Ok(()) + } + // Todes- und Erb-Logik fn handle_character_death(&mut self, character_id: i32) -> Result<(), DbError> { self.set_heir(character_id)?; @@ -633,11 +654,44 @@ impl UserCharacterWorker { conn.prepare("delete_debtors_prism", QUERY_DELETE_DEBTORS_PRISM)?; conn.prepare("delete_political_office", QUERY_DELETE_POLITICAL_OFFICE)?; conn.prepare("delete_election_candidate", QUERY_DELETE_ELECTION_CANDIDATE)?; + conn.prepare("insert_notification", QUERY_INSERT_NOTIFICATION)?; + + let dir_result = conn.execute("delete_director", &[&character_id])?; + for row in dir_result { + if let Some(user_id) = row + .get("employer_user_id") + .and_then(|v| v.parse::().ok()) + { + self.notify_user_death(&mut conn, user_id, "director_death")?; + } + } + + let rel_result = conn.execute("delete_relationship", &[&character_id])?; + for row in rel_result { + if let Some(related_user_id) = row + .get("related_user_id") + .and_then(|v| v.parse::().ok()) + { + self.notify_user_death(&mut conn, related_user_id, "relationship_death")?; + } + } - conn.execute("delete_director", &[&character_id])?; - conn.execute("delete_relationship", &[&character_id])?; conn.execute("delete_child_relation_by_parent", &[&character_id])?; - conn.execute("delete_child_relation", &[&character_id])?; + let child_result = conn.execute("delete_child_relation", &[&character_id])?; + for row in child_result { + if let Some(father_user_id) = row + .get("father_user_id") + .and_then(|v| v.parse::().ok()) + { + self.notify_user_death(&mut conn, father_user_id, "child_death")?; + } + if let Some(mother_user_id) = row + .get("mother_user_id") + .and_then(|v| v.parse::().ok()) + { + self.notify_user_death(&mut conn, mother_user_id, "child_death")?; + } + } conn.execute("delete_knowledge", &[&character_id])?; conn.execute("delete_debtors_prism", &[&character_id])?; conn.execute("delete_political_office", &[&character_id])?;