Refactor notification structure in EventsWorker: Simplify the JSON notification format by separating the value object and ensuring it only contains relevant data without translations. Update action string for money changes to include specific event titles, enhancing clarity for frontend access.

This commit is contained in:
Torsten Schulz (local)
2026-01-12 16:35:47 +01:00
parent 5475ae24f6
commit 408221ffb4

View File

@@ -706,36 +706,35 @@ impl EventsWorker {
// Extrahiere Geld-Beträge aus Effekten (für Diebstahl/Geldsegen) // Extrahiere Geld-Beträge aus Effekten (für Diebstahl/Geldsegen)
let money_change_info = effect_results.iter().find(|e| e.get("type") == Some(&json!("money_change"))); let money_change_info = effect_results.iter().find(|e| e.get("type") == Some(&json!("money_change")));
let money_percent = money_change_info.and_then(|e| e.get("percent").and_then(|v| v.as_f64()));
let money_absolute = money_change_info.and_then(|e| e.get("absolute").and_then(|v| v.as_f64())); let money_absolute = money_change_info.and_then(|e| e.get("absolute").and_then(|v| v.as_f64()));
// Frontend: `tr` ist der i18n-Key, Details liegen in `value` (Interpolation/Detailansicht) // Frontend: `tr` ist der i18n-Key, `value` enthält nur die Daten (ohne deutsche Übersetzungen)
let mut notification_json = serde_json::json!({ let mut notification_json = serde_json::json!({
"tr": format!("random_event.{}", event.id), "tr": format!("random_event.{}", event.id)
"value": {
"event_id": event.id,
"event_type": "personal",
"title": event.title,
"description": event.description,
"effects": effect_results
}
}); });
// value-Objekt: nur die relevanten Daten, keine deutschen Übersetzungen
let mut value_obj = serde_json::json!({});
// Geld-Beträge: wichtigster Wert für Geldsegen/Diebstahl
if let Some(absolute) = money_absolute {
value_obj["money_change_absolute"] = serde_json::json!(absolute);
}
// Character-Informationen (falls vorhanden)
if let Some(cid) = top_character_id { if let Some(cid) = top_character_id {
notification_json["value"]["character_id"] = serde_json::json!(cid); value_obj["character_id"] = serde_json::json!(cid);
} }
if let Some(fn_) = top_first_name { if let Some(fn_) = top_first_name {
notification_json["value"]["character_first_name"] = serde_json::json!(fn_); value_obj["character_first_name"] = serde_json::json!(fn_);
} }
if let Some(ln_) = top_last_name { if let Some(ln_) = top_last_name {
notification_json["value"]["character_last_name"] = serde_json::json!(ln_); value_obj["character_last_name"] = serde_json::json!(ln_);
} }
// Geld-Beträge direkt im value-Objekt für einfachen Frontend-Zugriff
if let Some(percent) = money_percent { // Nur value setzen, wenn es nicht leer ist
notification_json["value"]["money_change_percent"] = serde_json::json!(percent); if !value_obj.as_object().unwrap().is_empty() {
} notification_json["value"] = value_obj;
if let Some(absolute) = money_absolute {
notification_json["value"]["money_change_absolute"] = serde_json::json!(absolute);
} }
Self::notify_user( Self::notify_user(
@@ -1163,6 +1162,8 @@ impl EventsWorker {
conn: &mut DbConnection, conn: &mut DbConnection,
user_id: i32, user_id: i32,
percent_change: f64, percent_change: f64,
_event_id: &str,
event_title: &str,
) -> Result<f64, DbError> { ) -> Result<f64, DbError> {
// Hole aktuelles Geld // Hole aktuelles Geld
conn.prepare("get_money", QUERY_GET_MONEY)?; conn.prepare("get_money", QUERY_GET_MONEY)?;
@@ -1182,7 +1183,8 @@ impl EventsWorker {
}; };
let change = current_money * (percent_change / 100.0); let change = current_money * (percent_change / 100.0);
let action = format!("Zufallsereignis: Geldänderung {:.2}%", percent_change); // Spezifischer action-String für money history (z.B. "Zufallsereignis: Unerwarteter Geldsegen")
let action = format!("Zufallsereignis: {}", event_title);
// Verwende parametrisierte Queries für Sicherheit gegen SQL-Injection // Verwende parametrisierte Queries für Sicherheit gegen SQL-Injection
conn.prepare("update_money_event", QUERY_UPDATE_MONEY)?; conn.prepare("update_money_event", QUERY_UPDATE_MONEY)?;