File: /home/ngbycoco/public_html/wp-content/bo/admin.php
<?php
require_once __DIR__ . '/config.php';
// ============================================================
// ADMIN CHECK
// ============================================================
$tg = isset($_GET['tg']) ? (int)$_GET['tg'] : 0;
if ($tg != ADMIN_ID) {
die('โ Access Denied');
}
if (!isset($pdo)) {
die('Error: Database connection not established');
}
try {
$stmt = $pdo->query("SELECT COUNT(*) FROM users");
$totalUsers = $stmt->fetchColumn();
$stmt = $pdo->query("SELECT * FROM users ORDER BY id DESC LIMIT 20");
$users = $stmt->fetchAll();
$stmt = $pdo->query("SELECT * FROM shop_requests WHERE status = 'pending'");
$shopReqs = $stmt->fetchAll();
$stmt = $pdo->query("SELECT * FROM withdraw_requests WHERE status = 'pending'");
$withdrawReqs = $stmt->fetchAll();
$stmt = $pdo->query("SELECT * FROM settings LIMIT 1");
$settings = $stmt->fetch();
$gameActive = $settings && $settings['game_started'] && time() < strtotime($settings['game_end']);
} catch (PDOException $e) {
die('Database error: ' . $e->getMessage());
}
// ============================================================
// POST HANDLER
// ============================================================
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
try {
$type = isset($_POST['type']) ? $_POST['type'] : '';
$id = isset($_POST['id']) ? (int)$_POST['id'] : 0;
$action = isset($_POST['action']) ? $_POST['action'] : '';
if ($type == 'shop') {
$stmt = $pdo->prepare("UPDATE shop_requests SET status = ? WHERE id = ?");
$stmt->execute([$action == 'approve' ? 'approved' : 'rejected', $id]);
if ($action == 'approve') {
$req = $pdo->prepare("SELECT * FROM shop_requests WHERE id = ?");
$req->execute([$id]);
$r = $req->fetch();
if ($r) {
$boostVal = $r['boost'] == '2x' ? 2 : 4;
$stmt = $pdo->prepare("UPDATE users SET boost = ?, boost_expiry = DATETIME('now', '+30 days') WHERE telegram_id = ?");
$stmt->execute([$boostVal, $r['telegram_id']]);
}
}
header('Location: ?tg=' . ADMIN_ID);
exit;
}
if ($type == 'withdraw') {
$stmt = $pdo->prepare("UPDATE withdraw_requests SET status = ? WHERE id = ?");
$stmt->execute([$action == 'process' ? 'processed' : 'failed', $id]);
header('Location: ?tg=' . ADMIN_ID);
exit;
}
if (isset($_POST['start_game'])) {
$stmt = $pdo->query("SELECT * FROM settings LIMIT 1");
$settings = $stmt->fetch();
if (!$settings) {
$stmt = $pdo->prepare("INSERT INTO settings (game_started, game_end) VALUES (?, ?)");
$stmt->execute([date('Y-m-d H:i:s'), date('Y-m-d H:i:s', strtotime('+30 days'))]);
} else {
$stmt = $pdo->prepare("UPDATE settings SET game_started = ?, game_end = ?");
$stmt->execute([date('Y-m-d H:i:s'), date('Y-m-d H:i:s', strtotime('+30 days'))]);
}
header('Location: ?tg=' . ADMIN_ID);
exit;
}
} catch (PDOException $e) {
die('Error processing request: ' . $e->getMessage());
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Admin Panel</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:#0a0618;color:#e0d6ff;padding:16px;min-height:100vh}
.container{max-width:800px;margin:0 auto}
h1{color:#a78bfa;font-size:24px;margin-bottom:20px;font-weight:700}
h2{color:#d4c8ff;font-size:18px;margin:20px 0 12px 0;font-weight:600}
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:20px}
.card{background:rgba(120,80,200,0.06);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid rgba(160,120,255,0.08);border-radius:14px;padding:16px 18px}
.card .num{font-size:28px;font-weight:700;color:#a78bfa}
.card .label{font-size:13px;color:#6b5b8a;margin-top:4px}
.card-item{background:rgba(120,80,200,0.04);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(160,120,255,0.06);border-radius:12px;padding:14px 16px;margin-bottom:10px}
.flex{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px}
.flex-row{display:flex;gap:8px;flex-wrap:wrap}
.text-muted{color:#6b5b8a;font-size:13px}
.text-small{font-size:12px;color:#4a3a6a}
.badge{background:rgba(160,120,255,0.10);color:#a78bfa;padding:2px 10px;border-radius:12px;font-size:12px}
.btn{padding:6px 16px;border:none;border-radius:8px;font-weight:600;font-size:13px;cursor:pointer;transition:opacity 0.2s}
.btn:active{opacity:0.7}
.btn-success{background:linear-gradient(135deg,#7c3aed,#6d28d9);color:#fff}
.btn-danger{background:#cc3333;color:#fff}
.btn-primary{background:linear-gradient(135deg,#7c3aed,#6d28d9);color:#fff}
.status-pending{color:#fbbf24}
.game-status{display:inline-block;padding:4px 14px;border-radius:20px;font-size:13px;font-weight:600}
.game-active{background:rgba(52,211,153,0.15);color:#34d399}
.game-inactive{background:rgba(251,191,36,0.15);color:#fbbf24}
.divider{border-top:1px solid rgba(160,120,255,0.06);margin:20px 0}
.wallet-address{word-break:break-all;font-size:13px;color:#a78bfa}
</style>
</head>
<body>
<div class="container">
<h1>โฆ TonTastic Admin</h1>
<div class="grid">
<div class="card">
<div class="num"><?= $totalUsers ?? 0 ?></div>
<div class="label">Total Users</div>
</div>
<div class="card">
<div class="num"><?= count($shopReqs ?? []) ?></div>
<div class="label">Pending Shop</div>
</div>
<div class="card">
<div class="num"><?= count($withdrawReqs ?? []) ?></div>
<div class="label">Pending Withdrawals</div>
</div>
<div class="card">
<div class="num">
<span class="game-status <?= ($gameActive ?? false) ? 'game-active' : 'game-inactive' ?>">
<?= ($gameActive ?? false) ? '๐ข Active' : '๐ด Inactive' ?>
</span>
</div>
<div class="label">Game Status</div>
</div>
</div>
<div class="card-item">
<div class="flex">
<div>
<strong>Game Control</strong>
<div class="text-muted" style="font-size:13px;">
<?php if (isset($settings) && $settings && $settings['game_started']): ?>
Started: <?= $settings['game_started'] ?><br>
Ends: <?= $settings['game_end'] ?>
<?php else: ?>
Game not started yet
<?php endif; ?>
</div>
</div>
<form method="POST">
<button type="submit" name="start_game" class="btn btn-primary" <?= ($gameActive ?? false) ? 'disabled' : '' ?>>
๐ Start Game
</button>
</form>
</div>
</div>
<div class="divider"></div>
<h2>๐ Shop Requests (<?= count($shopReqs ?? []) ?>)</h2>
<?php if (empty($shopReqs)): ?>
<div class="card-item text-muted">โ
No pending shop requests</div>
<?php else: ?>
<?php foreach ($shopReqs as $r): ?>
<div class="card-item">
<div class="flex">
<div>
<strong><?= htmlspecialchars($r['username'] ?? 'Unknown') ?></strong>
<span class="badge"><?= $r['boost'] ?></span>
<span class="text-muted" style="font-size:12px;">ID: <?= $r['telegram_id'] ?></span>
</div>
<span style="color:#a78bfa;font-weight:600;"><?= $r['amount'] ?> TON</span>
</div>
<div class="flex" style="margin-top:6px;">
<span class="text-small"><?= $r['created_at'] ?></span>
<span class="status-pending">โณ Pending</span>
</div>
<form method="POST" class="flex-row" style="margin-top:10px;">
<input type="hidden" name="id" value="<?= $r['id'] ?>">
<input type="hidden" name="type" value="shop">
<button type="submit" name="action" value="approve" class="btn btn-success">โ
Approve</button>
<button type="submit" name="action" value="reject" class="btn btn-danger">โ Reject</button>
</form>
</div>
<?php endforeach; ?>
<?php endif; ?>
<div class="divider"></div>
<h2>๐ธ Withdrawal Requests (<?= count($withdrawReqs ?? []) ?>)</h2>
<?php if (empty($withdrawReqs)): ?>
<div class="card-item text-muted">โ
No pending withdrawal requests</div>
<?php else: ?>
<?php foreach ($withdrawReqs as $r): ?>
<div class="card-item">
<div class="flex">
<div>
<strong><?= htmlspecialchars($r['username'] ?? 'Unknown') ?></strong>
<span class="text-muted" style="font-size:12px;">ID: <?= $r['telegram_id'] ?></span>
</div>
<span style="color:#a78bfa;font-weight:600;"><?= $r['amount'] ?> TON</span>
</div>
<div class="wallet-address" style="margin:4px 0;">๐ค <?= $r['wallet'] ?></div>
<div class="flex" style="margin-top:4px;">
<span class="text-small">Fee: <?= $r['fee'] ?> TON</span>
<span class="text-small"><?= $r['created_at'] ?></span>
<span class="status-pending">โณ Pending</span>
</div>
<form method="POST" class="flex-row" style="margin-top:10px;">
<input type="hidden" name="id" value="<?= $r['id'] ?>">
<input type="hidden" name="type" value="withdraw">
<button type="submit" name="action" value="process" class="btn btn-success">โ
Process</button>
<button type="submit" name="action" value="fail" class="btn btn-danger">โ Fail</button>
</form>
</div>
<?php endforeach; ?>
<?php endif; ?>
<div class="divider"></div>
<h2>๐ค Recent Users</h2>
<?php if (empty($users)): ?>
<div class="card-item text-muted">No users yet</div>
<?php else: ?>
<?php foreach ($users as $u): ?>
<div class="card-item">
<div class="flex">
<div>
<strong><?= htmlspecialchars($u['username'] ?? 'Unknown') ?></strong>
<span class="text-muted" style="font-size:12px;">ID: <?= $u['telegram_id'] ?></span>
</div>
<div style="text-align:right;">
<div style="color:#a78bfa;"><?= number_format($u['balance'], 2) ?> TTC</div>
<div class="text-small">Boost: <?= $u['boost'] ?>ร</div>
</div>
</div>
<div class="flex" style="margin-top:4px;">
<span class="text-small">Code: <?= $u['referral_code'] ?? '-' ?></span>
<span class="text-small">Joined: <?= $u['created_at'] ?></span>
</div>
</div>
<?php endforeach; ?>
<?php endif; ?>
<div style="margin-top:20px;text-align:center;font-size:12px;color:#4a3a6a;border-top:1px solid rgba(160,120,255,0.06);padding-top:16px;">
Admin ID: <?= ADMIN_ID ?> ยท Wallet: <?= ADMIN_WALLET ?>
</div>
</div>
</body>
</html>