Reihenfolge
🚧 Offen — kommt noch:
- ○ 5. 💸 Kostenbeteiligung
- ○ 7. 🔕 Push-Prefs granular
- ○ 8. 📅 LAN-Termin-Abstimmung
- ○ 9. 🎮 Game-Wishlist + Voting
- ○ 10. 🤝 Steam-Library-Match
- ○ 11. 😂 Reactions auf Kommentare
- ○ 12. ⏱️ LAN-Countdown auf der Home
- ○ 13. 💬 @-Mentions in Kommentaren
✅ Erledigt:
- ✓ 1. 🎮 Steam „Wer spielt gerade?"
- ✓ 2. 📸 Galerie pro Event
- ✓ 3. 💬 Kommentare / Pinnwand pro Event
- ✓ 4. 📋 Packliste personalisierbar
- ✓ 6. 🔔 Push-Notifications (PWA)
🗄️ Legacy / Archiv:
To-Do
5. 💸 Kostenbeteiligung
Übersicht wer was für ein LAN bezahlt hat + automatisches Settlement.
Technisch
- Tabelle
event_costs(id, event_id, user_id, description, amount, created) - Gesamtkosten / Teilnehmeranzahl = Anteil pro Person
- Schulden-Settlement: wer zahlt wem wie viel (Min-Cash-Flow-Algorithmus)
- Nur Teilnehmer des Events können Kosten eintragen
CakePHP
EventCostsController:index(),add(),delete()- Settlement-Logik im Model
7. 🔕 Benachrichtigungen individuell + granular steuerbar S–M
User können feingranular wählen, welche Push-Notifications sie erhalten — nicht nur nach Typ, sondern auch gefiltert nach Game (bei Verabredungen) und nach User (Mute).
Technisch
- Tabelle
push_preferences(user_id, type ENUM('event_new','event_comment','verabredung_new','verabredung_comment','foto_upload'), enabled BOOL) - Tabelle
push_game_filters(user_id, game_label VARCHAR, mode ENUM('include','exclude'))
- include-Mode: nur Verabredungen für gelistete Spiele → push
- exclude-Mode: alle Spiele außer den gelisteten → push
- Default exclude mit leerer Liste = alles erlauben (Opt-out-Logik)
- Tabelle
push_user_mutes(user_id, muted_user_id) — keine Push wenn die andere Person der Trigger ist - Beim Senden:
1. Type-Toggle prüfen
2. Wenn Verabredung → Game-Filter prüfen (case-insensitive Match auf meetups.game)
3. Wenn Trigger-User in push_user_mutes → skip
UI
- Einstellungsseite
/push/settings(oder im Profil eingebettet) - Toggle-Switches je Typ
- Game-Filter-Sektion: Liste mit Chips, "+ Spiel hinzufügen", Include/Exclude-Switch
- Mute-Sektion: Autocomplete für User, Liste der gemuteten User mit Entfernen-Button
- Quick-Mute auf den Karten: Drei-Punkte-Menü pro Verabredung mit "Benachrichtigungen für [Spiel] aus" und "Von [Nickname] nicht mehr benachrichtigen"
CakePHP
PushController::settings()GET/POSTPushController::muteUser(),unmuteUser()(AJAX)PushController::addGameFilter(),removeGameFilter()(AJAX)- Policy: nur eigene Prefs änderbar
- Filter-Logik gebündelt in
NotificationsTable::shouldNotify(int $userId, string $type, ?array $context)
8. 📅 LAN-Termin-Abstimmung (Doodle-Style) M
Vor einem konkreten Event: Admin schlägt 3-5 Termine vor, jeder klickt seine Verfügbarkeit an.
Killer-Feature für die Planungsphase, bevor ein konkretes Event existiert.
Technisch
- Tabelle
poll_dates(id, title, description, created_by, locked BOOL, created) - Tabelle
poll_date_options(id, poll_id, date_from DATETIME, date_to DATETIME, sort_order) - Tabelle
poll_date_votes(poll_id, option_id, user_id, vote ENUM('yes','maybe','no'), created/modified) - Auto-Highlight: Termin mit meisten
yes-Stimmen (bei Gleichstand:yes + maybe) - Admin kann Poll abschließen und daraus direkt ein Event erstellen (Daten vorausgefüllt)
UI
- Tabelle: Zeilen = Termine, Spalten = User, Zellen = ✅/❓/❌
- Eigene Zeile editierbar per Klick
- Footer mit Summe je Termin, bester Termin highlighted
CakePHP
PollDatesController:index,view,add,vote,lock,convertToEvent- Push: bei neuem Poll → alle subscribed User; bei Vote → Ersteller
9. 🎮 Game-Wishlist + Voting S
Pro Event: "Was wollen wir spielen?". Jeder fügt Vorschläge hinzu, andere upvoten.
Hilft bei der Diskussion am Abend ("Was zocken wir jetzt?").
Technisch
- Tabelle
event_game_suggestions(id, event_id, user_id, game_label, created) - Tabelle
event_game_votes(suggestion_id, user_id, created) — eine Stimme pro User pro Vorschlag - Anzeige sortiert nach Vote-Count
- Optional: Verknüpfung mit Steam-API (Logo / Header-Image automatisch holen via App-ID-Lookup)
CakePHP
EventGameSuggestionsController:add,delete,vote,unvote- Eingebettet in
Events/view.phpunter „Pinnwand" - Policy: jeder Teilnehmer darf Vorschläge & Votes
10. 🤝 Steam-Library-Match M
Vergleicht die Steam-Bibliotheken aller Event-Teilnehmer. Zeigt welche Spiele alle haben, welche die meisten haben, welche niemand hat.
Technisch
- Steam Web API:
IPlayerService/GetOwnedGamesfür jeden User mitsteam_id - TTL-Cache 24h pro User (Library ändert sich selten)
- Set-Operations:
- Schnittmenge aller → "Können sofort starten"
- >=80% haben es → "Fast alle"
- 1-2 fehlen → "Fast alle, [X] und [Y] fehlen"
- Filter: Multiplayer-Tag aus Steam-API (Co-op / PvP / LAN)
UI
- Tab/Akkordeon auf Event-Detail-Seite
- Liste mit App-Header-Image, Titel, "X/Y Spieler haben das"
CakePHP
EventsController::libraryMatch(int $eventId)(JSON)SteamLibraryComponentmit Cache-Wrapper- Verarbeitung asynchron via lightweight Queue (oder spinner-on-demand)
11. 😂 Reactions auf Kommentare S
👍 ❤️ 😂 🔥 unter Pinnwand-/Meetup-Kommentaren. Macht die Pinnwand lebendiger, weniger "Reply-Spam".
Technisch
- Tabelle
comment_reactions(id, comment_id, comment_type ENUM('event','meetup'), user_id, emoji, created)
- Polymorpher Ansatz mit comment_type damit beide Comment-Typen abgedeckt sind
- UNIQUE-Index auf (comment_id, comment_type, user_id, emoji) — kein Doppel-React
- Anzeige: kompakte Chip-Reihe unterhalb des Comments mit Emoji + Count
- Toggle: Klick auf Chip mit deinem Emoji entfernt deine Reaction
UI
- Hover/Long-Press auf Kommentar → kleines Emoji-Popover (👍 ❤️ 😂 🔥 + "more")
- Mobile: Long-Press-Geste
- Live-Update via AJAX
CakePHP
CommentReactionsController::toggle()(POST → JSON, eigener Endpoint)
12. ⏱️ LAN-Countdown auf der Home XS
Großer Timer: "Noch 12 Tage 4 Std. bis Operation: Cyberstorm". Pure Hype-Build-up.
Technisch
- Nächstes Event mit
eventdate > NOW()auseventsziehen - Reines Frontend-Update via
setIntervalfür die Sekunden/Minuten - Bei <24h: anders darstellen ("Heute Abend!" / Stunden-Counter)
- Wenn kein zukünftiges Event: dezent ausblenden oder "Noch kein Termin – Doodle starten?" (Brücke zu #8)
UI
- Hero-Section oben auf der Home (zwischen Greeting und Quicklinks)
- Große Fluid-Type-Variante mit
clamp()
CakePHP
- Bereits im
Events-Cell oder neuerEventCountdown-Cell
13. 💬 @-Mentions in Kommentaren S
@papsbear mit Autocomplete im Kommentar-Input. Erwähnter User bekommt Push.
Technisch
- Bei
submit: Regex/@([\w-]+)/über den Body → User-Lookup nachnickname - Pro Match: Push-Notification an den User (sofern nicht schon Comment-Empfänger)
- Anzeige im Comment:
@nicknamewird zu Link/Chip mit Accent-Farbe - Autocomplete-Dropdown beim Tippen von
@(Liste alle Nicknames, fuzzy match)
UI
- Eingabe-Feld bekommt einen kleinen JS-Listener (kein Framework nötig)
- Dropdown positioniert unter dem Cursor
CakePHP
EventCommentsController::add()undMeetupCommentsController::add()parsen den Body- Auch in Reaktion auf #11 sinnvoll erweiterbar
Keys (Legacy)
Altes interner Brain-Dump aus der frühen Planung — bleibt als Archiv stehen.
- Functions:
- List all Keys for Game without User assigned (-> count() is enough)
Erledigt
1. 🎮 Steam „Wer spielt gerade?"
Live-Widget auf der Startseite: welche User aktuell online / in einem Spiel sind.
Technisch
- Steam Web API:
ISteamUser/GetPlayerSummariesmit den gespeichertensteam_ids aller User - Beim Seitenaufruf serverseitig gerendert, TTL-Cache ~60s
- Anzeige: Avatar, Name, Spielname, Status (online / ingame / offline)
- Nur User mit verknüpftem Steam-Account anzeigen
CakePHP
- Neuer Endpoint
/steam-status(JSON) oder direkt im Home-Template serverseitig - Cache via CakePHP Cache-Layer (File/Apcu)
2. 📸 Galerie pro Event
User können Bilder zu einem Event hochladen, alle sehen die Galerie.
Technisch
- Neue Tabelle
event_photos(id, event_id, user_id, filename, caption, created) - Upload in
webroot/uploads/events/{event_id}/, Thumbnail via GD - Lightbox-Ansicht im Frontend (GLightbox o.ä., vanilla JS)
- Moderation: nur eigene Bilder löschen, Admins alles
CakePHP
EventPhotosController:upload(),delete()- Policy: jeder eingeloggte User kann hochladen, nur Eigentümer/Admin löschen
3. 💬 Kommentare / Pinnwand pro Event
User können Kommentare zu einem Event hinterlassen.
Technisch
- Neue Tabelle
event_comments(id, event_id, user_id, body, created) - Flat, chronologisch, Plain Text
- Admins können jeden Kommentar löschen
CakePHP
EventCommentsController:add(),delete()- Eingebettet in
Events/view.php
4. 📋 Packliste personalisierbar
Globale Packliste (Admin pflegt Items) + User markiert Punkte als „eingepackt" je Event.
Technisch
- Tabelle
pack_items(id, label, category, sort_order) - Tabelle
user_pack_checks(user_id, event_id, pack_item_id) - Checkbox-State per AJAX gespeichert (kein Reload)
- Gruppiert nach Kategorie (Hardware, Kabel, Persönliches, …)
CakePHP
PackItemsController(Admin CRUD)UserPackChecksController:toggle()(POST → JSON)- Anzeige unter
/events/{id}/packlisteoder direkt in Event-View
6. 🔔 Push-Notifications (PWA)
User werden benachrichtigt bei neuen Events oder Anmeldungen.
Technisch
- Web Push API (VAPID-Keys,
minishlink/web-pushPHP-Library) - Service Worker
webroot/sw.js - Tabelle
push_subscriptions(user_id, endpoint, keys JSON) - Trigger: nach
Events::add()→ alle subscribed User - PWA Manifest (
manifest.json) für „Zum Homescreen hinzufügen"
CakePHP
PushSubscriptionsController:subscribe(),unsubscribe()- Benachrichtigung direkt nach dem Save inline
Users (Legacy)
Brain-Dump aus der ersten Planungsphase.
- Functions:
- Login
- Register
- Logout
- get all Active Users
- Attributes:
- ID
- Username
- Password
- Status (active/inactive)
- IP-Address (maybe automatic?)
Games (Legacy)
- Functions:
- Add new Game
- List all Games
- Get Game ID by Name
- Attributes:
- ID
- GameName
- PageID (?)
- titleImage (?)
Keys — alte Notes (Legacy)
- Functions:
- add new Key (-> depending on Game ID)
- add User to Key
- get Key with Game ID for User (assign new one if User doesn´t have one)
- Attributes:
- ID
- Key
- GameID
- UserID
Pages (Legacy)
- Menüleiste:
- Home, Games
- Login/Logout button
- Home:
- Übersicht aktive User
- Admins sehen alle User und könenn Status ändern
- Übersicht aktive User
- Games-Übersicht:
- Liste aller Games
- Admins können Games hinzufügen
- Alle User können Keys hinzufügen (Link auf Keys->add() Funktion)
- titleImage plus Verlinkung auf Game Seite
- Liste aller Games
- Game Add Seite:
- Spiel hinzufügen mit Name, titleImage
- automatisches Anlegen von GamePage (?)
- Spiel hinzufügen mit Name, titleImage
Funktionen (Legacy)
- Games
- Wenn keine Game Seite, dann wird einfach der Key des Users angezeigt, wenn er keinen hat, kann er sich einen anfordern (?)
