Add character user clearing logic in EventsWorker: Implement a new SQL query to clear the user association from a deceased character before assigning a new heir. This ensures compliance with unique constraints and prevents errors during user reassignment. Enhance error handling and logging for better debugging.

This commit is contained in:
Torsten Schulz (local)
2026-01-05 15:46:54 +01:00
parent e2630eb32a
commit 604c8ba300
3 changed files with 44 additions and 4 deletions

View File

@@ -46,6 +46,7 @@ use crate::worker::sql::{
QUERY_DELETE_CHARACTER,
QUERY_GET_HEIR,
QUERY_SET_CHARACTER_USER,
QUERY_CLEAR_CHARACTER_USER,
QUERY_GET_CURRENT_MONEY,
QUERY_GET_HOUSE_VALUE,
QUERY_GET_SETTLEMENT_VALUE,
@@ -1600,11 +1601,29 @@ impl EventsWorker {
}
};
// 2) Setze den Erben als neuen Spieler-Charakter
conn.prepare("set_character_user", QUERY_SET_CHARACTER_USER)?;
conn.execute("set_character_user", &[&falukant_user_id, &heir_id])?;
// 2) Wichtig: erst die alte User-Zuordnung am verstorbenen Charakter lösen.
// Falls es einen Unique-Constraint auf `character.user_id` gibt, würde das
// direkte Setzen am Erben sonst fehlschlagen.
conn.prepare("clear_character_user", QUERY_CLEAR_CHARACTER_USER)?;
if let Err(err) = conn.execute("clear_character_user", &[&deceased_character_id]) {
eprintln!(
"[EventsWorker] Erben-Logik: Konnte user_id vom verstorbenen Charakter {} nicht lösen: {}",
deceased_character_id, err
);
}
// 3) Berechne das neue Vermögen basierend auf dem gesamten Vermögen
// 3) Setze den Erben als neuen Spieler-Charakter
conn.prepare("set_character_user", QUERY_SET_CHARACTER_USER)?;
if let Err(err) = conn.execute("set_character_user", &[&falukant_user_id, &heir_id]) {
eprintln!(
"[EventsWorker] Erben-Logik: Konnte user_id={} nicht auf Erben {} setzen (verstorbener Charakter {}): {}",
falukant_user_id, heir_id, deceased_character_id, err
);
// Abbrechen, damit wir nicht still ohne Character weiterlaufen.
return Err(err);
}
// 4) Berechne das neue Vermögen basierend auf dem gesamten Vermögen
// Hole alle Vermögenswerte (analog zu UserCharacterWorker::calculate_new_money)
conn.prepare("get_current_money", QUERY_GET_CURRENT_MONEY)?;
conn.prepare("get_house_value", QUERY_GET_HOUSE_VALUE)?;