| Server IP : 202.61.199.114 / Your IP : 216.73.217.139 Web Server : nginx/1.22.1 System : Linux de.arni-solutions.de 6.1.0-49-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64 User : web20 ( 1018) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/clients/client2/web31/web/slots/includes/ |
Upload File : |
<?php
/**
* Terminal-Anbindung für Reel Royale.
* Erlaubt das Spielen OHNE Login, wenn der Aufruf über ein ArNi-Terminal erfolgt.
* Authentifizierung per HMAC-Token (gemeinsames Secret der Terminal-App).
* Je (Terminal, Ansicht) existiert ein eigener „Gast"-Spieler, dessen Guthaben
* im Terminal manuell gesetzt wird. Verfügbare Spiele je Terminal wählbar.
*/
/** Gemeinsames Terminal-Secret (aus web/terminal/includes/secret.php). */
function rr_term_secret(): string
{
$f = __DIR__ . '/../../terminal/includes/secret.php';
return is_file($f) ? (string) require $f : '';
}
/** Erwarteter Token für (Terminal-Hash, View-Token). */
function rr_term_token(string $hash, string $view): string
{
return hash_hmac('sha256', 'slots:' . $hash . ':' . $view, rr_term_secret());
}
function rr_term_verify(string $hash, string $view, ?string $tok): bool
{
$s = rr_term_secret();
return $s !== '' && is_string($tok) && hash_equals(rr_term_token($hash, $view), $tok);
}
/** Konfig-Tabelle (in derselben DB) idempotent anlegen. */
function rr_term_table(): void
{
db()->exec('CREATE TABLE IF NOT EXISTS term_slots (
terminal_hash CHAR(32) NOT NULL,
view_token CHAR(32) NOT NULL,
slots_user_id INT UNSIGNED NOT NULL,
games_json TEXT NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NULL,
PRIMARY KEY (terminal_hash, view_token),
KEY idx_ts_user (slots_user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci');
}
/** Zeile + Gast-Spieler sicherstellen; @return array term_slots-Zeile. */
function rr_term_ensure(string $hash, string $view): array
{
rr_term_table();
$sel = db()->prepare('SELECT * FROM term_slots WHERE terminal_hash = ? AND view_token = ?');
$sel->execute([$hash, $view]);
$row = $sel->fetch();
if ($row) return $row;
// Gast-Spieler anlegen (eigenes Guthaben je Terminal/Ansicht)
$uname = 'term_' . substr($hash, 0, 10) . '_' . substr($view, 0, 4);
$uname = substr($uname, 0, 24);
$pw = password_hash(bin2hex(random_bytes(12)), PASSWORD_DEFAULT);
db()->prepare('INSERT INTO users
(username, password_hash, balance, free_spins, total_wagered, total_won, total_play_seconds, biggest_single_win, best_win_ratio, created_at, last_seen_at)
VALUES (?, ?, 0, 0, 0, 0, 0, 0, 0, NOW(), NOW())')->execute([$uname, $pw]);
$uid = (int) db()->lastInsertId();
db()->prepare('INSERT INTO term_slots (terminal_hash, view_token, slots_user_id, games_json, created_at)
VALUES (?, ?, ?, NULL, NOW())')->execute([$hash, $view, $uid]);
$sel->execute([$hash, $view]);
return $sel->fetch();
}
/** Alle verfügbaren Slot-Spiele (id, title) für die Auswahl. */
function rr_term_games_all(): array
{
$out = [];
foreach (games_client_list() as $g) {
$out[] = ['id' => $g['id'], 'title' => $g['title']];
}
return $out;
}
/** Ausgewählte Spiel-IDs einer Terminal-Ansicht (leer = alle). */
function rr_term_selected_games(array $row): array
{
$g = $row['games_json'] ? json_decode($row['games_json'], true) : [];
return is_array($g) ? array_values(array_filter(array_map('strval', $g))) : [];
}