Die Herausforderung der Telefondaten in FiveM
Der Aufbau eines Telefonsystems für FiveM umfasst weit mehr als das Rendern einer hübschen Benutzeroberfläche auf dem Bildschirm des Players. Die eigentliche technische Herausforderung besteht darin, persistente Daten über Sitzungen hinweg zu verwalten: Kontakte, Nachrichtenthreads, Anrufprotokolle, Fotos und App-Einstellungen müssen Serverneustarts, Zeichenwechsel und Umgebungen mit mehreren Zeichen überstehen. Agency Phone wurde von Grund auf mit Datenintegrität als Kernprinzip entwickelt. Alle Daten fließen durch eine serverautorisierende Pipeline, in der der Client Aktionen anfordert und der Server sie validiert, verarbeitet und beibehält, bevor er sie dem Client bestätigt. In diesem Artikel wird erläutert, wie Agency Phone die Kontaktsynchronisierung, Nachrichtenspeicherung, Fotofreigabe, Anrufprotokollierung und Datenschutz durch Design handhabt, damit Entwickler und Serverbesitzer die Architektur hinter dem Produkt verstehen.
Kontaktiere Storage Architecture
Kontakte in Agency Phone werden pro Charakter und nicht pro Spieler gespeichert. Diese Unterscheidung ist wichtig, da ein Spieler möglicherweise drei Charaktere auf demselben Server hat, jeder mit völlig unterschiedlichen sozialen Kreisen. Die Kontakttabelle verwendet einen zusammengesetzten Schlüssel aus der Telefonnummer des Eigentümers und der Telefonnummer des Kontakts sowie zusätzliche Felder für den Anzeigenamen, die Avatar-URL und eine Favoritenmarkierung. Wenn ein Spieler seine Kontakt-App öffnet, sendet der Client eine einzelne Anfrage an den Server, der die Datenbank abfragt und die vollständige Kontaktliste in einem Stapel zurückgibt. Dadurch wird das Wasserfallmuster vermieden, bei dem jeder Kontakt eine eigene Datenbankabfrage auslöst, was auf einem Server mit Spielern mit Hunderten von Kontakten verheerende Folgen hätte.
Kontaktsynchronisierung in Echtzeit
Wenn ein Spieler einen Kontakt hinzufügt, bearbeitet oder löscht, muss die Änderung sofort auf seinem Gerät wirksam werden und in der Datenbank gespeichert werden. Agency Phone verwendet ein optimistisches Aktualisierungsmuster: Der Client aktualisiert sofort seinen lokalen Status, um sofortiges Feedback zu geben, während er gleichzeitig die Mutation an den Server sendet. Wenn der Server die Änderung aufgrund eines Validierungsfehlers ablehnt, kehrt der Client zum vorherigen Status zurück und zeigt einen Fehler an. Dadurch entsteht eine reaktionsschnelle Benutzererfahrung, die sich nativ anfühlt und gleichzeitig die Serverautorität über die Daten behält. Der Server sendet bei Bedarf auch relevante Änderungen an andere verbundene Clients, beispielsweise wenn ein Spieler seinen eigenen Profilnamen aktualisiert, der in den Kontaktlisten anderer Spieler erscheint.
Nachrichtenspeicherung und Threading
Nachrichten sind die datenintensivste Funktion jedes Telefonsystems. Agency Phone organisiert Nachrichten in Konversationsthreads, die durch ein sortiertes Telefonnummernpaar identifiziert werden. Das bedeutet, dass die Konversation zwischen Nummer A und Nummer B immer demselben Thread zugeordnet ist, unabhängig davon, wer sie initiiert hat. Nachrichten innerhalb eines Threads werden chronologisch mit Absenderidentifikation, Lesestatus und optionalen Anhängen gespeichert. Das Threading-Modell unterstützt auch Gruppennachrichten, bei denen drei oder mehr Nummern an einer gemeinsamen Konversation teilnehmen. Gruppenthreads verwenden einen separaten Bezeichner, der beim Erstellen der Gruppe generiert wird, und jedes Mitglied verwaltet seinen eigenen Lesezeiger, sodass die Anzahl der ungelesenen Nachrichten für jeden Teilnehmer korrekt ist.
Fotofreigabe und Medienhandhabung
Das Teilen von Fotos auf einem FiveM-Telefon erfordert einen anderen Ansatz als bei herkömmlichen Webanwendungen, da du nicht direkt auf das Dateisystem des Players zugreifen können. Agency Phone verarbeitet Fotos über zwei Mechanismen: Screenshots im Spiel, die mit der GTA-Screenshot-Funktion aufgenommen wurden, und URL-basierte Bilder, die Spieler von externen Bild-Hosting-Diensten einfügen. Screenshots im Spiel werden mit der nativen Screenshot-API erstellt, in eine Daten-URL konvertiert und in ein konfigurierbares Speicher-Backend hochgeladen. Der Server validiert die Dateigrößenbeschränkungen und den Inhaltstyp, bevor er die URL beibehält. Wenn Fotos in Nachrichten geteilt werden, wird nur die URL-Referenz im Nachrichtendatensatz gespeichert, wodurch die Nachrichtentabelle übersichtlich bleibt. Die eigentlichen Bilddaten befinden sich im Medienspeicher-Backend, das je nach Infrastruktur des Serverbesitzers für die Verwendung einer lokalen Festplatte, eines S3-kompatiblen Speichers oder eines externen Image-CDN konfiguriert werden kann.
Anrufprotokolle und Verlauf
Anrufprotokolle zeichnen jeden eingehenden, ausgehenden und verpassten Anruf mit Zeitstempel und Dauer auf. Wenn ein Spieler einen Anruf initiiert, wird ein Anrufdatensatz mit dem Status „Wählen“ erstellt. Wenn der Empfänger antwortet, wird der Status auf „aktiv“ aktualisiert und ein Startzeitstempel aufgezeichnet. Wenn der Anruf endet, wird die Dauer berechnet und der Datensatz abgeschlossen. Entgangene Anrufe treten auf, wenn der Empfänger nicht innerhalb des Timeout-Zeitraums antwortet oder ausdrücklich ablehnt. Das Anrufprotokoll wird auf der Registerkarte „Letzte Anrufe“ des Telefons mit visuellen Indikatoren für Anrufrichtung und -status angezeigt. Spieler können auf einen verpassten Anrufeintrag tippen, um sofort zurückzurufen, oder lange drücken, um die Nummer zu den Kontakten hinzuzufügen. Der Server bereinigt Anrufprotokolle, die älter als ein konfigurierbarer Aufbewahrungszeitraum sind (standardmäßig 30 Tage), um zu verhindern, dass die Tabelle auf Servern mit langer Laufzeit unbegrenzt wächst.
Datenschutz durch Design
Agency Phone folgt in seiner gesamten Architektur den Privacy-by-Design-Prinzipien. Telefonnummern werden zufällig generiert und sind nicht an eine reale Kennung gebunden. Der Nachrichteninhalt wird in der Datenbank gespeichert, ist für den Absender und Empfänger jedoch nur über validierte Serverrückrufe zugänglich. Es gibt keine globale Nachrichtensuche, mit der ein Administrator private Konversationen ohne expliziten Datenbankzugriff lesen könnte. Kontaktlisten sind ausschließlich zeichenbezogen und es gibt keinen zeichenübergreifenden Datenverlust. Wenn ein Charakter gelöscht wird, werden alle zugehörigen Telefondaten, einschließlich Kontakte, Nachrichten, Anrufprotokolle und Fotos, nacheinander aus der Datenbank gelöscht, um sicherzustellen, dass keine verwaisten persönlichen Daten zurückbleiben. Das Foto-Upload-System entfernt EXIF-Metadaten vor der Speicherung, um ein unbeabsichtigtes Durchsickern von Standort- oder Geräteinformationen zu verhindern. Dies ist jedoch eher eine Best Practice als ein praktisches Problem in einer Spielumgebung.
Leistung im Maßstab
Agency Phone wurde für Server mit 200 oder mehr gleichzeitigen Spielern getestet und optimiert. Zu den wichtigsten Leistungsstrategien gehört das verzögerte Laden von Nachrichtenthreads, sodass beim Öffnen des Telefons nur die neuesten Konversationen abgerufen werden und ältere Threads beim Scrollen geladen werden. Kontaktlisten werden nach dem ersten Abruf clientseitig zwischengespeichert und nur aktualisiert, wenn eine Mutation auftritt. Datenbankabfragen verwenden geeignete Indizes für Telefonnummern und Zeitstempel, um Suchvorgänge in weniger als einer Millisekunde sicherzustellen, selbst bei Tabellen mit Millionen von Zeilen. Der Server verwaltet eine speicherinterne Karte der Telefonnummern von Online-Spielern für eine sofortige Empfängersuche ohne Datenbankzugriffe. Die gesamte NUI-Kommunikation erfolgt nach Möglichkeit gebündelt, sodass das Öffnen der Nachrichten-App eine Serveranforderung auslöst, die Threads mit ihrer neuesten Nachrichtenvorschau zurückgibt, anstatt für jeden Thread separate Anforderungen zu stellen. Diese Optimierungen stellen sicher, dass das Telefon auch während der Spitzenzeiten der Server reaktionsfähig bleibt, wenn Dutzende Spieler gleichzeitig Nachrichten senden und Anrufe tätigen.
