Feature: Login-Effekte pro Person (Akzentfarbe + Sound + Begruessung)

- UserEffekt: Baka = rot + Fanfare, Tinker = tuerkis + Chime, Standard-Ping
- MeloTheme: dynamische Akzentfarbe via ValueNotifier (Theme wechselt live)
- Ausloeser: App-Start (wenn Token vorhanden) + nach erfolgreichem Login
- Assets: 3 kurze WAV-Sounds (assets/sounds/)
- Web: /whoami-Endpoint (Caddy) + Willkommens-Banner auf baka-net.de
This commit is contained in:
Hermes (Server)
2026-07-31 15:34:04 +02:00
parent 9a880b0f21
commit 19e4aac62e
8 changed files with 113 additions and 14 deletions
+59
View File
@@ -0,0 +1,59 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:just_audio/just_audio.dart';
import 'farb_theme.dart';
/// Login-Effekte: Pro Person eigener Akzent, Willkommens-Sound und Begrüßung.
/// Wird nach erfolgreichem Login und beim App-Start (wenn Token vorhanden) ausgelöst.
class UserEffekt {
final Color akzent;
final String begruessung;
final String soundAsset;
const UserEffekt(this.akzent, this.begruessung, this.soundAsset);
/// Baka = königlich-rot + Fanfare 👑
static const baka = UserEffekt(
Color(0xFFCC0000),
'Willkommen zurück, Baka! 👑',
'assets/sounds/baka_fanfare.wav',
);
/// Tinker = türkis + heller Chime 🐱
static const tinker = UserEffekt(
Color(0xFF00B8A9),
'Tinker ist da! 🐱✨',
'assets/sounds/tinker_chime.wav',
);
static const standard = UserEffekt(
Color(0xFFCC0000),
'Willkommen! 🎵',
'assets/sounds/willkommen_ping.wav',
);
static UserEffekt fuer(String? user) {
final u = (user ?? '').toLowerCase().trim();
if (u == 'baka' || u == 'dustin') return baka;
if (u == 'tinker') return tinker;
return standard;
}
/// Setzt die Akzentfarbe (Thema wechselt live) und spielt den Sound ab.
static Future<void> anwenden(String? user) async {
final e = fuer(user);
MeloTheme.akzent = e.akzent;
try {
final p = AudioPlayer();
await p.setAsset(e.soundAsset);
unawaited(p.play());
// Player nach dem Abspielen sauber freigeben (kein Memory-Leak)
Future.delayed(const Duration(seconds: 4), () {
if (p.playing) p.stop();
p.dispose();
});
} catch (_) {
// Sound-Fehler ignorieren Akzent bleibt trotzdem aktiv
}
}
}