| User ID | Erstellt am | Premium-Status | Rolle | Aktionen | |
|---|---|---|---|---|---|
| Lade Benutzer... | |||||
| ID / User ID | Betreff | Letzte Nachricht | Status | Erstellt am | Aktion |
|---|---|---|---|---|---|
| Lade Tickets... | |||||
Diese Werte bestimmen die globalen Limits für alle Benutzer. Änderungen werden sofort wirksam.
read_only_key (das auth_key aus dem Sign-Log) eingeben — zeigt, zu welchem Account er gehört und ob dieser live gehen darf (Premium/Staff). So sieht man sofort, warum ein „Verbinden" 403 wirft.
Die 7-Tage-Testphase hängt am TikTok-Kanal, nicht am TikEasy-Konto. Geht ein Konto in der Testphase live,
wird sein Kanal beansprucht (trial_used:<kanal>). Versucht später ein anderes Konto in der Testphase
denselben Kanal, wird das Livegehen abgelehnt. Zahlende Kunden und Admin/Super/Agentur sind nie betroffen.
„Freigeben" löscht Sperre + Kanal-Einträge des Kontos → wieder eine Testphase. „Sperren" markiert Konto (und Kanal) manuell als verbraucht.
Gezählt wird jede Minute, in der ein Spiel offen ist und der Streamer live verbunden ist (seit dem Update 10/2026, nichts rückwirkend). Web-Spiele meldet die App (ab der Version mit Spiele-Statistik), Desktop-Spiele wie Creator Cards zählen über ihre eigene Verbindung. Eine Sitzung endet nach mehr als 5 Minuten Pause. Klick auf ein Spiel zeigt Verlauf und Top-Streamer.
Lade …
API neu laden tauscht die Gunicorn-Worker nacheinander aus (wie systemctl reload tikeasy nach einem api.py-Upload) —
laufende Anfragen enden sauber, Overlays verbinden sich von allein neu.
TikTok-Sign neu starten hilft, wenn niemand mehr live gehen kann („Verbinde …" bleibt hängen).
Während des Neustarts (wenige Sekunden) schlagen neue Verbindungen fehl.
Lade …
Jeder Live-Verbindungsaufbau läuft über die Kette unten: scheitert ein Dienst (5xx, Timeout, Kontingent), übernimmt der nächste — Nutzer verlieren erst dann Kontingent, wenn alle scheitern. Nach 3 Fehlschlägen in Folge wird ein Dienst 10 Minuten hintangestellt. Eigener Weg = ohne Fremddienst (nur ein ttwid-Cookie von TikTok, Verbindung direkt per WebSocket). Schatten-Modus probiert den eigenen Weg bei jeder Euler-Verbindung im Hintergrund mit und zählt nur Statistik. Chat senden, Moderation und Gift-Listen laufen weiterhin nur über Eulerstream.
Lade …
Die Datei wird auf dem Server erst geprüft (Syntax + Probe-Import mit demselben Python wie der Dienst, also
python -c "import api"). Nur wenn das klappt, wird die laufende api.py mit Zeitstempel gesichert und ersetzt.
Die letzten 30 Versionen bleiben unten zum Wiederherstellen.
Jeder Admin richtet beim ersten Besuch einen Code-Generator ein (QR-Code mit der Authenticator-App scannen) und bestätigt sich danach bei jedem Login mit dem 6-stelligen Code — gültig für 12 Stunden pro Browser. Neues Handy oder App weg? Ein anderer Admin setzt den Eintrag hier zurück, beim nächsten Login erscheint der QR-Code neu.
Diese Accounts haben einen Aktionscode (aktiv: …) eingelöst:
7 Tage gratis getestet, danach Monats-Abo mit Rabatt. Jeder Account bekommt insgesamt nur einen Trial, egal über welchen Code.
Eingetragen wird die Nutzung erst nach erfolgreich abgeschlossenem Stripe-Checkout.
Legt allen laufenden Abos einmalig +1 Tag Premium drauf, damit sie nicht vor der Stripe-Abbuchung ablaufen. Neue Abos und Verlängerungen bekommen den Puffer automatisch. Mehrfach klicken ist harmlos.
Jeder Kanal, mit dem ein Konto über TikEasy live war — mit erster und letzter Nutzung und den Live-Minuten. Gezählt wird nur echtes Livesein mit der App, nicht das bloße Anmelden. Die Historie reicht 180 Tage zurück.
| Kanal | Konto (E-Mail) | Live-Minuten | zuerst | zuletzt |
|---|---|---|---|---|
| Noch nicht geladen. | ||||
Alle Creator-Codes, sortiert nach Verkäufen (Erstkäufe, inkl. erster echter Zahlung nach einem Trial).
„Trials" zählt gestartete 7-Tage-Tests über den Code im Profil.
„Eingenommen" = Provisionen insgesamt (sinkt nie), „Guthaben" = davon aktuell noch nicht ausgezahlt/verrechnet.
Hinweis: Der „Eingenommen"-Zähler läuft ab jetzt mit — bei Creatorn von vor dieser Änderung zeigt er als Startwert das aktuelle Guthaben.
Spiele + Events kommen aus diesem Katalog – TikEasy lädt ihn beim Start.
Neue Spiele: HTML-Ordner unter stream_games_display/ auf den Server legen,
hier anlegen → kein Client-Update nötig. „Speichern" schreibt den GESAMTEN Katalog.
| Cover | Key | Titel | Sichtbarkeit | Release | Events | Aktionen |
|---|---|---|---|---|---|---|
| Lade Spiele… | ||||||
Lädt die Spieldateien hoch und setzt die „Spiel-URL" oben automatisch auf die erkannte HTML. So musst du die URL nicht selbst kennen. (Alternativ die URL oben von Hand eintragen.)
Die exportierten Dateien (z. B. „Creator Cards.exe" und „Creator Cards.pck") zusammen auswählen. Große Dateien werden in Stücken übertragen; der Server berechnet die Prüfsummen und schaltet die neue Version erst frei, wenn alles vollständig da ist. Geht über den Key oben – vorher speichern ist nicht nötig.
Ohne Haken zeigt die Karte den Fantasienamen. Haken = der Creator hat zugestimmt, sein echter Name erscheint.
Jeder Haken wird sofort gespeichert und gilt ab dem nächsten Spielstart, ohne Update.
Kommen mit einem neuen Export Karten dazu: „Kartenliste einlesen" und aus dem Spielordner data/
cards.json, creator_fantasienamen.json und creator_anzeigenamen.json auswählen. Freigaben bleiben erhalten.
| ✓ | Nr | Echter Name | @Kanal | Fantasiename | Im Spiel |
|---|
Der Key muss zur runAction() im Spiel-HTML passen. Zeilen mit „tr-Key" nutzen die eingebauten TikEasy-Übersetzungen – eigene Labels (DE/EN) überschreiben das.
| Key | Icon | Label DE | Label EN | 🌐 | 👤 | Win | Farbe | 🎁 Standard |
|---|
„Übernehmen" ändert nur die Liste – erst „Katalog speichern" schreibt auf den Server.
Ohne Schlüssel und Kosten: Schritt 1 kopieren und bei einer KI (ChatGPT, Claude, Gemini) einfügen, die Antwort in Schritt 2 einfügen. Deutsch bleibt die Quelle, Englisch, Französisch, Spanisch, Türkisch und Japanisch werden bei allen Spielen gesetzt, deren deutsches Label passt. Danach „Katalog speichern".
1080×1920 hochkant, three.js vom CDN ist ok). Sounds in einen sounds/-Unterordner daneben.runAction() + Win-Melder.stream_games_display/<SpielName>/ auf den Server._.count beachten: 5× dasselbe Gift = eine Nachricht mit count: 5 → Aktion entsprechend oft (mit Deckel!) ausführen.data.name/data.pfp_url sind dabei, wenn der Server sie kennt – nutzen, wenn das Spiel Namen anzeigen soll (wie Smash-Burger-Vordrängler).reportWin(+1/-1) aufrufen (Konsolen-Markierung, siehe Vorlage) – TikEasy fängt das ab./* ==== StreamUp-Anbindung (Gift → Spiel-Aktion) ==== */
const GAME_KEY = 'meinspiel'; // = Key aus dem Spiele-Katalog (Kleinbuchstaben!)
// Event-Key → Funktion. Die Keys MÜSSEN exakt den Katalog-Events entsprechen.
const GIFT_ACTIONS = {
boost: (name, pfp) => { /* ... Spiel-Logik ... */ },
bomb: (name, pfp) => { /* ... Spiel-Logik ... */ },
win_add: () => reportWin(+1),
win_remove: () => reportWin(-1),
};
function runAction(action, count, name, pfp) {
const fn = GIFT_ACTIONS[action];
if (!fn) return;
const n = Math.max(1, Math.min(20, count | 0 || 1)); // Spam-Deckel
for (let i = 0; i < n; i++) fn(name, pfp);
}
// Win-Tracker: ±1 an TikEasy melden (das Spielfenster liest die Konsole).
// full=true NUR für selbst erspielte Siege (füllt bis zum Ziel, ohne Bonus).
function reportWin(delta, full) {
try { console.log((full ? '__APSWINFULL__:' : '__APSWIN__:') + (delta > 0 ? 1 : -1)); } catch (e) {}
}
// WebSocket: empfängt { type: GAME_KEY+'_action', data: { action, count, name, pfp_url } }
(function setupGiftSocket() {
const readKey = new URLSearchParams(location.search).get('key');
if (!readKey) return; // ohne ?key= (lokaler Test) kein Server
const scheme = location.protocol === 'https:' ? 'wss' : 'ws';
const url = scheme + '://' + location.host + '/ws/updates/' + readKey;
let delay = 1000;
function connect() {
let ws; try { ws = new WebSocket(url); } catch (e) { retry(); return; }
ws.onopen = () => { delay = 1000; };
ws.onmessage = (ev) => {
let m; try { m = JSON.parse(ev.data); } catch (e) { return; }
if (m && m.data && m.type === GAME_KEY + '_action')
runAction(m.data.action, m.data.count, m.data.name, m.data.pfp_url);
};
ws.onclose = () => retry();
ws.onerror = () => { try { ws.close(); } catch (e) {} };
}
function retry() { setTimeout(() => { delay = Math.min(delay * 1.6, 15000); connect(); }, delay); }
connect();
})();
Ans Ende des <script>-Blocks im Spiel-HTML einfügen und die
TODO-Funktionen mit der Spiel-Logik füllen. Die Event-Keys sind exakt
die aus diesem Editor – nicht umbenennen!
ZIP mit dem kompletten Spiel-Inhalt (HTML + sounds/ …). Ein einzelner Top-Ordner im ZIP wird automatisch entfernt. Der aktuelle Stand wird vorher automatisch als Version gesichert.
| Version vom | Größe | Aktionen |
|---|---|---|
| – | ||
Aus dem Katalog gelöschte Spiele landen hier (die letzten 25) und können mit einem Klick wiederhergestellt werden – inklusive aller Events und Einstellungen. Die Spiel-Dateien auf dem Server werden beim Löschen ohnehin nie angefasst.
| Titel | Key | Gelöscht am | Aktion |
|---|---|---|---|
| – | |||
Lade...
Möchtest du den Benutzer wirklich unwiderruflich löschen?
Keine Rechnung zur Hand? Du kannst sie später über die Historie (📋) nachreichen.
Das Guthaben wird dadurch nicht verändert — nur die Gesamt-Anzeige. Gedacht für Korrekturen, z. B. wenn frühere Auszahlungen vor Einführung des Zählers fehlen.