Zum Inhalt springen

Architektur ​

AgentTools ist ein Monorepo mit zwei Anwendungen, die sich eine API und ein Regelwerk teilen:

Ingress ──share──▶ Android app ──HTTPS + Google ID token──▶ Symfony web app ──▶ PostgreSQL
                     (app/)                                     (web/)
                       │                                          ▲
                       └──── Bannergress API (banner sync) ───────┘ (PATCH /api/me)
Browser ──Sign in with Google──▶ Symfony web app

Funktionen, die es auf beiden Plattformen gibt, verhalten sich gleich: Die Medaillenlisten, die Zeitleiste, das Diagramm und die Filter werden von der einen auf die andere portiert und synchron gehalten.

Android-App (app/) ​

Kotlin und Jetpack Compose, minSdk 26.

BereichWoWas
Anmeldungauth/GoogleAuth.ktCredential Manager „Sign in with Google“ mit der Web-Client-ID als serverClientId; stille Token-Erneuerung, bei 401 einmal wiederholt.
TeilenShareIntent.kt, data/IngressStats.ktDer aus Ingress geteilte Text (eine Tabelle mit Tabulatoren) wird zu einer agent_stat-Zeile.
API-Clientdata/StatsApi.ktKtor-Client für die JSON-LD-API; bildet HTTP-Antworten auf Ergebnisse mit den Meldungen des Servers ab.
Medaillendata/Medals.kt, data/CustomMedals.ktMedaillenstufen (von der 4e-website) und Sondermedaillen; Bilder in res/drawable-nodpi und assets/custom_medals.
Medaillen-Scanscan/Findet das Wabenraster in Screenshots und vergleicht jede Medaille nach Form und Farbe mit den Bildern, auf dem Gerät.
Zeitleistedata/Timeline.kt, data/TimelineChart.kt, ui/Timeline*.ktUploads + Ereignisse + datierte Banner, die Geometrie des Diagramms und die Filter.
Bannerauth/BannergressAuth.kt, data/Bannergress.kt, ui/BannerMap.ktKeycloak-PKCE-Anmeldung in einer WebView, die Synchronisierung, die osmdroid-Karte.
UI-Zustandui/MainViewModel.ktSitzung, Statistiken und Bildschirme.
Sprachenres/values{,-de,-es}, AppLanguage.ktEnglisch, Deutsch, Spanisch; Sprache pro App ab Android 13.

Build-Typen: debug (lokaler Server, Serverwechsel, optionale Fake-Anmeldung), dev (Live-Server, eigenes Paket com.elkuku.agenttools.dev, von der CI gebaut) und release.

Web-App (web/) ​

Symfony 8 mit API Platform, Doctrine ORM auf PostgreSQL, Twig mit Bootstrap und Stimulus (Asset Mapper, kein Node-Build).

BereichWoWas
Entitätensrc/Entity/User (Agentenname, sichtbare Teile, Sondermedaillen, Bannergress-Synchronisierung), AgentStat (die Spalten der 4e-website), TimelineEvent, DoneBanner.
Sicherheitsrc/Security/GoogleIdentityAuthenticator (Web-Schaltfläche, mit dem CSRF-Cookie von Google), GoogleApiTokenAuthenticator (Bearer-Token der API), beide über GoogleUserResolver; Voter für eigene Datensätze.
APIsrc/ApiResource/, src/State/Die Ressourcen unter /api, siehe API.
Seitensrc/Controller/Eine Klasse pro Aktion: Agentenstatistiken, Zeitleiste, Import, Banner, Agenten, Profil, Admin.
Medaillensrc/Medal/MedalChecker.phpDie Medaillenlisten der App, portiert; verwendet die Bilder der App über asset_mapper.yaml.
Zeitleistesrc/Timeline/TimelineBuilder und TimelineChart (SVG-Geometrie auf dem Server).
Importsrc/Import/CSV-Statistiken und JSON-Sondermedaillen von der 4e-website.
Sprachentranslations/Englisch, Deutsch, Spanisch; gewählt über ein Cookie oder Accept-Language.

Authentifizierung ​

Beide Seiten verwenden Google-ID-Tokens, die für den Web-OAuth-Client ausgestellt sind:

  1. Die App holt einen Token vom Credential Manager und sendet ihn bei jeder API-Anfrage als Authorization: Bearer …; die Webseite sendet den Token der Google-Schaltfläche an /connect/google/verify.
  2. Der Server prüft den Token gegen OAUTH_GOOGLE_ID, verlangt eine bestätigte E-Mail-Adresse und findet den Benutzer über die Google-ID, sonst über die E-Mail, sonst registriert er einen neuen Benutzer.

Die Clients einrichten: Google-Anmeldung einrichten.

Datenfluss eines Uploads ​

  1. Ingress teilt die All-Time-Statistiken als Text; die App parst sie (parseIngressStats).
  2. POST /api/agent-stats speichert sie. Der erste Upload legt den Agentennamen des Benutzers fest; Statistiken eines anderen Agenten werden abgelehnt (422), dasselbe Datum mit derselben Uhrzeit ein zweites Mal ergibt 409.
  3. Die App vergleicht die neuen Statistiken mit den vorherigen und zeigt, was sich geändert hat; derselbe Vergleich baut auf beiden Plattformen die Zeitleiste.

AgentTools steht in keiner Verbindung zu Niantic Spatial oder Ingress.