OcheClub
Hey, Spieler 👋
Noch keine gespeicherten Spiele
X01 Match
Team 1 = Spieler 1 + 3 · Team 2 = Spieler 2 + 4
CHECKOUT
 
Statistiken
Duell-Bilanz
Neues Spiel
Training
121 Checkout · Double Out
Ziel: 121
121
9 Darts übrig
CHECKOUT
 
Around the Clock
Nächstes Ziel
1
Score Training
3-Dart-Average
0.0
 
Cricket / Tactics
0
Punkte
0
Punkte
Cloud & Konto
Einmalige Einrichtung (kostenlos, ~15 Min)
  1. console.firebase.google.com öffnen → „Projekt hinzufügen" (Name z.B. ocheclub, Google Analytics ausschalten)
  2. Links Authentication → „Jetzt starten" → E-Mail/Passwort aktivieren
  3. Links Firestore Database → „Datenbank erstellen" → Produktionsmodus, Region europe-west3
  4. Dort Tab Regeln → Inhalt durch die Regeln unten ersetzen → „Veröffentlichen"
  5. Zahnrad → Projekteinstellungen → unter „Meine Apps" die Web-App (</>) hinzufügen → den angezeigten firebaseConfig-Block komplett kopieren
Firestore-Regeln zum Kopieren
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    function isAdmin() { return request.auth != null && request.auth.token.email == 'julianschroeter1702@gmail.com'; }
    match /users/{uid} {
      allow read, write: if request.auth != null && request.auth.uid == uid;
    }
    match /profiles/{uid} {
      allow read: if request.auth != null;
      allow write: if request.auth != null && request.auth.uid == uid;
    }
    match /chats/{chatId} {
      allow read, update: if request.auth != null && request.auth.uid in resource.data.members;
      allow create: if request.auth != null && request.auth.uid in request.resource.data.members;
      match /messages/{mid} {
        allow read: if request.auth != null && request.auth.uid in get(/databases/$(database)/documents/chats/$(chatId)).data.members;
        allow create: if request.auth != null && request.auth.uid in get(/databases/$(database)/documents/chats/$(chatId)).data.members && request.resource.data.from == request.auth.uid;
      }
    }
    match /groups/{gid} {
      allow read: if request.auth != null;
      allow create: if request.auth != null && request.resource.data.admin == request.auth.uid && request.auth.uid in request.resource.data.members;
      allow delete: if request.auth != null && (resource.data.admin == request.auth.uid || isAdmin());
      allow update: if request.auth != null && (
        resource.data.admin == request.auth.uid || isAdmin()
        || (
          request.resource.data.admin == resource.data.admin && (
            (request.resource.data.members.hasAll(resource.data.members) && request.auth.uid in request.resource.data.members)
            || (resource.data.members.hasAll(request.resource.data.members) && !(request.auth.uid in request.resource.data.members))
          )
        )
      );
      match /messages/{mid} {
        allow read: if request.auth != null && request.auth.uid in get(/databases/$(database)/documents/groups/$(gid)).data.members;
        allow create: if request.auth != null && request.auth.uid in get(/databases/$(database)/documents/groups/$(gid)).data.members && request.resource.data.from == request.auth.uid;
      }
    }
    match /matches/{mid} {
      allow read: if request.auth != null && request.auth.uid in resource.data.players;
      allow create: if request.auth != null && request.auth.uid in request.resource.data.players;
      allow update: if request.auth != null && request.auth.uid in resource.data.players
        && request.resource.data.players == resource.data.players
        && (resource.data.turnUid == request.auth.uid || request.resource.data.status == 'finished');
    }
    match /market/{lid} {
      allow read: if request.auth != null;
      allow create: if request.auth != null && request.resource.data.seller == request.auth.uid;
      allow update, delete: if request.auth != null && (resource.data.seller == request.auth.uid || isAdmin());
    }
    match /tournaments/{tid} {
      allow read: if request.auth != null;
      allow create: if request.auth != null && request.resource.data.host == request.auth.uid && request.auth.uid in request.resource.data.players;
      allow update: if request.auth != null && (request.auth.uid in resource.data.players || request.auth.uid in request.resource.data.players || isAdmin());
      allow delete: if request.auth != null && (resource.data.host == request.auth.uid || isAdmin());
    }
    match /reports/{rid} {
      allow create: if request.auth != null && request.resource.data.reporter == request.auth.uid;
      allow read, update, delete: if isAdmin();
    }
  }
}
Anmelden oder Konto erstellen
Google-Login ist verfügbar, sobald die App online läuft (nicht bei lokaler Datei).
☁️ Verbunden
Einstellungen
Darstellung & Sprache
Light ModeHelles Design
Start-AnimationLogo-Intro beim Öffnen
Sprache / Language
Spieloptionen
Caller (Sprachausgabe)
Jeden Score ansagenSonst nur 180, Game Shot & Bust
Checkout-VorschlägeFinish-Wege ab 170 anzeigen
Doppel-AbfrageNach Aufnahmen im Finish-Bereich (für die Doppelquote)
Standard: Einzeldart-EingabeStatt Rundensumme bei Spielstart
Bot-TempoWurfgeschwindigkeit der Bots
Hilfe
🛡 Admin
Admin-AnsichtAus = App wie ein normaler Nutzer sehen
🚫 Blockierte Nutzer
Profil & Daten
OcheClub 🎯
Version 1.0 (Beta)
Made with ❤️ for darts
Chat
Meine Chats
Gruppen
News
Online
Neues Match
Meine Matches
Turniere
Turnier
CHECKOUT
 
Hilfe & Begriffe
Dart-Markt
🔎

🛒 Willkommen im Dart-Markt

Neue Anzeige
Turnier
Spieler auswählen (3–16)
Anzeige

Wer beginnt? 🎯

180!

Willkommen im OcheClub 🎯

Leg dein Spielerprofil an — deine Statistiken laufen unter diesem Namen.
🎯

Spieler hinzufügen

Für Freunde, die lokal mitspielen — ihre Statistiken werden unter diesem Namen gespeichert.

Checkout! 🎯

Mit wie vielen Darts beendet?