feat(falukant): enhance notification handling and parameter extraction in MessagesDialog
All checks were successful
Deploy to production / deploy (push) Successful in 2m51s

- Introduced a new method `mergeNotificationPayload` to consolidate top-level fields with embedded JSON from notifications, improving data handling.
- Updated `formatBody` and `extractParams` methods to utilize the merged payload, ensuring accurate extraction of parameters from notifications.
- Enhanced parameter extraction logic to handle various notification structures, improving clarity and consistency in displayed information.
This commit is contained in:
Torsten Schulz (local)
2026-04-10 08:41:53 +02:00
parent 1dfa49191f
commit 3450bac99c

View File

@@ -133,18 +133,40 @@ export default {
return new Date(dt).toLocaleString(); return new Date(dt).toLocaleString();
} catch { return dt; } } catch { return dt; }
}, },
/** Vereinigt Top-Level-Felder mit in `tr` eingebettetem JSON (Daemon liefert effects oft nur dort). */
mergeNotificationPayload(n) {
if (!n || typeof n !== 'object') return n || {};
let merged = { ...n };
const raw = n.tr;
if (typeof raw === 'string') {
const trimmed = raw.trim();
if (trimmed.startsWith('{') && trimmed.endsWith('}')) {
try {
const parsed = JSON.parse(trimmed);
if (parsed && typeof parsed === 'object') {
merged = { ...merged, ...parsed };
}
} catch {
/* Rohstring bleibt in merged.tr */
}
}
}
return merged;
},
formatBody(n) { formatBody(n) {
const payload = this.mergeNotificationPayload(n);
// Wenn die Notification bereits title und description hat (z.B. von WebSocket Events) // Wenn die Notification bereits title und description hat (z.B. von WebSocket Events)
if (n.title && n.description) { if (payload.title && payload.description) {
// Parameter aus effects oder anderen Feldern extrahieren // Parameter aus effects oder anderen Feldern extrahieren
const params = this.extractParams(n); const params = this.extractParams(payload);
return { return {
title: this.interpolateString(n.title, params), title: this.interpolateString(payload.title, params),
description: this.interpolateString(n.description, params) description: this.interpolateString(payload.description, params)
}; };
} }
let raw = n.tr || ''; let raw = payload.tr || '';
let key = raw; let key = raw;
let params = {}; let params = {};
@@ -162,7 +184,7 @@ export default {
delete params.tr; delete params.tr;
// Merge in params extracted from nested structures (effects, character ids) // Merge in params extracted from nested structures (effects, character ids)
try { try {
const extracted = this.extractParams({ ...n, ...parsed, characterName: parsed.characterName || parsed.character_name || n.characterName || n.character_name }); const extracted = this.extractParams({ ...payload, ...parsed, characterName: parsed.characterName || parsed.character_name || payload.characterName || payload.character_name });
for (const [k, v] of Object.entries(extracted || {})) { for (const [k, v] of Object.entries(extracted || {})) {
if (!params.hasOwnProperty(k) || params[k] === undefined || params[k] === null || params[k] === '') { if (!params.hasOwnProperty(k) || params[k] === undefined || params[k] === null || params[k] === '') {
params[k] = v; params[k] = v;
@@ -199,8 +221,8 @@ export default {
const titleKey = `${eventKey}.title`; const titleKey = `${eventKey}.title`;
const descKey = `${eventKey}.description`; const descKey = `${eventKey}.description`;
// If no params were parsed from JSON, try to extract them from the notification (effects, character_id, etc.) // If no params were parsed from JSON, try to extract them from the notification (effects, character_id, etc.)
if ((!params || Object.keys(params).length === 0) && n) { if ((!params || Object.keys(params).length === 0) && payload) {
params = this.extractParams(n) || {}; params = this.extractParams(payload) || {};
} }
if (this.$te(titleKey) && this.$te(descKey)) { if (this.$te(titleKey) && this.$te(descKey)) {
@@ -280,14 +302,19 @@ export default {
}, },
extractParams(n) { extractParams(n) {
const base = this.mergeNotificationPayload(n);
const params = {}; const params = {};
// Parameter aus effects extrahieren // Parameter aus effects extrahieren (Daemon: effects oft nur im JSON in tr)
if (n.effects && Array.isArray(n.effects)) { if (base.effects && Array.isArray(base.effects)) {
for (const effect of n.effects) { for (const effect of base.effects) {
if (effect.type === 'money_change') { if (effect.type === 'money_change') {
if (effect.absolute !== undefined) { if (effect.absolute !== undefined && effect.absolute !== null) {
params.amount = effect.absolute; const absNum = Number(effect.absolute);
if (Number.isFinite(absNum)) {
// Gebuchter Betrag ist bei Verlust negativ; Anzeige „Verlust: …“ erwartet positive Zahl
params.amount = Math.abs(absNum);
}
} else if (effect.percent !== undefined) { } else if (effect.percent !== undefined) {
params.percent = effect.percent; params.percent = effect.percent;
} }
@@ -295,7 +322,7 @@ export default {
if (effect.character_id) { if (effect.character_id) {
// Prefer explicit characterName from notification, otherwise fall back to provided name or use id placeholder // Prefer explicit characterName from notification, otherwise fall back to provided name or use id placeholder
params.character_id = effect.character_id; params.character_id = effect.character_id;
params.characterName = params.characterName || n.characterName || `#${effect.character_id}`; params.characterName = params.characterName || base.characterName || `#${effect.character_id}`;
} }
if (effect.change !== undefined) { if (effect.change !== undefined) {
params.change = effect.change; params.change = effect.change;
@@ -303,7 +330,7 @@ export default {
} else if (effect.type === 'character_death') { } else if (effect.type === 'character_death') {
if (effect.character_id) { if (effect.character_id) {
params.character_id = effect.character_id; params.character_id = effect.character_id;
params.characterName = params.characterName || n.characterName || `#${effect.character_id}`; params.characterName = params.characterName || base.characterName || `#${effect.character_id}`;
} }
} else if (effect.type === 'storage_damage') { } else if (effect.type === 'storage_damage') {
if (effect.inventory_damage_percent !== undefined) { if (effect.inventory_damage_percent !== undefined) {
@@ -317,37 +344,37 @@ export default {
} }
// Weitere Parameter aus der Notification selbst // Weitere Parameter aus der Notification selbst
if (n.region_id && n.regionName) { if (base.region_id && base.regionName) {
params.regionName = n.regionName; params.regionName = base.regionName;
} }
if (n.character_id && n.characterName) { if (base.character_id && base.characterName) {
params.characterName = n.characterName; params.characterName = base.characterName;
} }
if (n.amount !== undefined) { if (base.amount !== undefined) {
params.amount = n.amount; params.amount = base.amount;
} }
if (n.deceased && typeof n.deceased === 'object') { if (base.deceased && typeof base.deceased === 'object') {
if (n.deceased.display_name) { if (base.deceased.display_name) {
params.characterName = n.deceased.display_name; params.characterName = base.deceased.display_name;
} }
if (n.deceased.region_label) { if (base.deceased.region_label) {
params.regionLabel = n.deceased.region_label; params.regionLabel = base.deceased.region_label;
} }
if (n.deceased.age_years !== undefined && n.deceased.age_years !== null) { if (base.deceased.age_years !== undefined && base.deceased.age_years !== null) {
params.ageYears = n.deceased.age_years; params.ageYears = base.deceased.age_years;
} }
} }
if (n.linked && typeof n.linked === 'object') { if (base.linked && typeof base.linked === 'object') {
if (Array.isArray(n.linked.spouses) && n.linked.spouses.length > 0) { if (Array.isArray(base.linked.spouses) && base.linked.spouses.length > 0) {
params.spouses = n.linked.spouses.join(', '); params.spouses = base.linked.spouses.join(', ');
} }
if (Array.isArray(n.linked.children) && n.linked.children.length > 0) { if (Array.isArray(base.linked.children) && base.linked.children.length > 0) {
params.children = n.linked.children.join(', '); params.children = base.linked.children.join(', ');
} }
if (Array.isArray(n.linked.lovers) && n.linked.lovers.length > 0) { if (Array.isArray(base.linked.lovers) && base.linked.lovers.length > 0) {
params.lovers = n.linked.lovers.join(', '); params.lovers = base.linked.lovers.join(', ');
} }
} }