From 0aec13daf4ea68764c727cda60cb367733dde485 Mon Sep 17 00:00:00 2001 From: Myron Blair Date: Thu, 4 Jun 2026 17:39:48 +0000 Subject: [PATCH] Add agent fields to game management - DB: renamed console_url to agent_link, added agent_login, agent_password, games_link, agent_guide to platforms table - api/platforms.php: create/update now handles all 5 agent fields (admin-only) - admin/index.php: game form has new Agent Info section (purple, admin-only styling); game list cards show all agent fields inline; JS saveGame/editGame/resetGameForm updated Co-Authored-By: Claude Sonnet 4.6 --- admin/index.php | 84 +++++++++++++++++++++++++++++++++++++---------- api/platforms.php | 46 +++++++++++++++----------- 2 files changed, 93 insertions(+), 37 deletions(-) diff --git a/admin/index.php b/admin/index.php index f651b0e..e2076d7 100644 --- a/admin/index.php +++ b/admin/index.php @@ -793,9 +793,31 @@ tr:hover td{background:rgba(255,255,255,.015)} -
- - + +
+
🔐 Agent Info — Admin Only
+
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+ + +
@@ -2701,11 +2723,25 @@ async function loadGames() { ${escHtmlA(g.player_url)}
- ${g.console_url ? `
- CONSOLE - ${escHtmlA(g.console_url)} - + ${g.agent_link ? `
+ AGENT LINK + ${escHtmlA(g.agent_link)} +
` : ''} + ${g.games_link ? `
+ GAMES LINK + ${escHtmlA(g.games_link)} + +
` : ''} + ${g.agent_login ? `
+ LOGIN + ${escHtmlA(g.agent_login)} +
` : ''} + ${g.agent_password ? `
+ PASSWORD + ${escHtmlA(g.agent_password)} +
` : ''} + ${g.agent_guide ? `
AGENT GUIDE ${escHtmlA(g.agent_guide)}
` : ''}
@@ -2727,9 +2763,13 @@ function editGame(id) { document.getElementById('gf-name').value = g.name; document.getElementById('gf-slug').value = g.slug; document.getElementById('gf-slug').disabled = true; // slug can't change (used as FK in purchases) - document.getElementById('gf-player-url').value = g.player_url; - document.getElementById('gf-console-url').value= g.console_url || ''; - document.getElementById('gf-color').value = g.color || '#f0c040'; + document.getElementById('gf-player-url').value = g.player_url; + document.getElementById('gf-agent-link').value = g.agent_link || ''; + document.getElementById('gf-agent-login').value = g.agent_login || ''; + document.getElementById('gf-agent-password').value= g.agent_password || ''; + document.getElementById('gf-games-link').value = g.games_link || ''; + document.getElementById('gf-agent-guide').value = g.agent_guide || ''; + document.getElementById('gf-color').value = g.color || '#f0c040'; document.getElementById('gf-color-hex').value = g.color || '#f0c040'; document.getElementById('gf-sort').value = g.sort_order; document.getElementById('gf-active').value = g.is_active; @@ -2742,9 +2782,13 @@ function resetGameForm() { document.getElementById('gf-name').value = ''; document.getElementById('gf-slug').value = ''; document.getElementById('gf-slug').disabled = false; - document.getElementById('gf-player-url').value = ''; - document.getElementById('gf-console-url').value = ''; - document.getElementById('gf-color').value = '#f0c040'; + document.getElementById('gf-player-url').value = ''; + document.getElementById('gf-agent-link').value = ''; + document.getElementById('gf-agent-login').value = ''; + document.getElementById('gf-agent-password').value= ''; + document.getElementById('gf-games-link').value = ''; + document.getElementById('gf-agent-guide').value = ''; + document.getElementById('gf-color').value = '#f0c040'; document.getElementById('gf-color-hex').value = '#f0c040'; document.getElementById('gf-sort').value = '99'; document.getElementById('gf-active').value = '1'; @@ -2761,11 +2805,15 @@ async function saveGame() { const id = document.getElementById('gf-id').value; const data = { id: id ? parseInt(id) : undefined, - name: document.getElementById('gf-name').value.trim(), - slug: document.getElementById('gf-slug').value.trim(), - player_url: document.getElementById('gf-player-url').value.trim(), - console_url: document.getElementById('gf-console-url').value.trim(), - color: document.getElementById('gf-color-hex').value.trim() || document.getElementById('gf-color').value, + name: document.getElementById('gf-name').value.trim(), + slug: document.getElementById('gf-slug').value.trim(), + player_url: document.getElementById('gf-player-url').value.trim(), + agent_link: document.getElementById('gf-agent-link').value.trim(), + agent_login: document.getElementById('gf-agent-login').value.trim(), + agent_password: document.getElementById('gf-agent-password').value.trim(), + games_link: document.getElementById('gf-games-link').value.trim(), + agent_guide: document.getElementById('gf-agent-guide').value.trim(), + color: document.getElementById('gf-color-hex').value.trim() || document.getElementById('gf-color').value, sort_order: parseInt(document.getElementById('gf-sort').value) || 99, is_active: parseInt(document.getElementById('gf-active').value), }; diff --git a/api/platforms.php b/api/platforms.php index 76a8a5d..552f8f2 100644 --- a/api/platforms.php +++ b/api/platforms.php @@ -23,7 +23,7 @@ switch ($action) { echo json_encode(['success'=>true, 'platforms'=>$out]); break; - // ── Admin: full list including console_url and inactive ─ + // ── Admin: full list including agent fields and inactive ─ case 'admin_list': if (!$isAdmin) { echo json_encode(['success'=>false,'error'=>'Forbidden']); exit; } $rows = db()->query("SELECT * FROM platforms ORDER BY sort_order ASC, id ASC")->fetchAll(); @@ -34,17 +34,21 @@ switch ($action) { case 'create': if (!$isAdmin || $_SERVER['REQUEST_METHOD'] !== 'POST') { echo json_encode(['success'=>false,'error'=>'Forbidden']); exit; } $d = json_decode(file_get_contents('php://input'), true); - $slug = preg_replace('/[^a-z0-9_]/', '', strtolower(trim($d['slug'] ?? ''))); - $name = substr(trim($d['name'] ?? ''), 0, 100); - $player_url = substr(trim($d['player_url'] ?? ''), 0, 500); - $console_url = substr(trim($d['console_url'] ?? ''), 0, 500); - $color = preg_match('/^#[0-9a-fA-F]{3,8}$/', $d['color'] ?? '') ? $d['color'] : '#f0c040'; - $sort_order = (int)($d['sort_order'] ?? 99); - $is_active = isset($d['is_active']) ? (int)(bool)$d['is_active'] : 1; + $slug = preg_replace('/[^a-z0-9_]/', '', strtolower(trim($d['slug'] ?? ''))); + $name = substr(trim($d['name'] ?? ''), 0, 100); + $player_url = substr(trim($d['player_url'] ?? ''), 0, 500); + $agent_link = substr(trim($d['agent_link'] ?? ''), 0, 500); + $agent_login = substr(trim($d['agent_login'] ?? ''), 0, 200); + $agent_password = substr(trim($d['agent_password'] ?? ''), 0, 200); + $games_link = substr(trim($d['games_link'] ?? ''), 0, 500); + $agent_guide = trim($d['agent_guide'] ?? ''); + $color = preg_match('/^#[0-9a-fA-F]{3,8}$/', $d['color'] ?? '') ? $d['color'] : '#f0c040'; + $sort_order = (int)($d['sort_order'] ?? 99); + $is_active = isset($d['is_active']) ? (int)(bool)$d['is_active'] : 1; if (!$slug || !$name || !$player_url) { echo json_encode(['success'=>false,'error'=>'Slug, name, and player URL are required']); exit; } try { - $stmt = db()->prepare("INSERT INTO platforms (slug,name,player_url,console_url,color,sort_order,is_active) VALUES (?,?,?,?,?,?,?)"); - $stmt->execute([$slug,$name,$player_url,$console_url,$color,$sort_order,$is_active]); + $stmt = db()->prepare("INSERT INTO platforms (slug,name,player_url,agent_link,agent_login,agent_password,games_link,agent_guide,color,sort_order,is_active) VALUES (?,?,?,?,?,?,?,?,?,?,?)"); + $stmt->execute([$slug,$name,$player_url,$agent_link,$agent_login,$agent_password,$games_link,$agent_guide,$color,$sort_order,$is_active]); echo json_encode(['success'=>true,'id'=>db()->lastInsertId()]); } catch (Exception $e) { echo json_encode(['success'=>false,'error'=>'Slug already exists or DB error']); @@ -55,16 +59,20 @@ switch ($action) { case 'update': if (!$isAdmin || $_SERVER['REQUEST_METHOD'] !== 'POST') { echo json_encode(['success'=>false,'error'=>'Forbidden']); exit; } $d = json_decode(file_get_contents('php://input'), true); - $id = (int)($d['id'] ?? 0); - $name = substr(trim($d['name'] ?? ''), 0, 100); - $player_url = substr(trim($d['player_url'] ?? ''), 0, 500); - $console_url = substr(trim($d['console_url'] ?? ''), 0, 500); - $color = preg_match('/^#[0-9a-fA-F]{3,8}$/', $d['color'] ?? '') ? $d['color'] : '#f0c040'; - $sort_order = (int)($d['sort_order'] ?? 99); - $is_active = (int)(bool)($d['is_active'] ?? 1); + $id = (int)($d['id'] ?? 0); + $name = substr(trim($d['name'] ?? ''), 0, 100); + $player_url = substr(trim($d['player_url'] ?? ''), 0, 500); + $agent_link = substr(trim($d['agent_link'] ?? ''), 0, 500); + $agent_login = substr(trim($d['agent_login'] ?? ''), 0, 200); + $agent_password = substr(trim($d['agent_password'] ?? ''), 0, 200); + $games_link = substr(trim($d['games_link'] ?? ''), 0, 500); + $agent_guide = trim($d['agent_guide'] ?? ''); + $color = preg_match('/^#[0-9a-fA-F]{3,8}$/', $d['color'] ?? '') ? $d['color'] : '#f0c040'; + $sort_order = (int)($d['sort_order'] ?? 99); + $is_active = (int)(bool)($d['is_active'] ?? 1); if (!$id || !$name || !$player_url) { echo json_encode(['success'=>false,'error'=>'ID, name, and player URL required']); exit; } - db()->prepare("UPDATE platforms SET name=?,player_url=?,console_url=?,color=?,sort_order=?,is_active=? WHERE id=?") - ->execute([$name,$player_url,$console_url,$color,$sort_order,$is_active,$id]); + db()->prepare("UPDATE platforms SET name=?,player_url=?,agent_link=?,agent_login=?,agent_password=?,games_link=?,agent_guide=?,color=?,sort_order=?,is_active=? WHERE id=?") + ->execute([$name,$player_url,$agent_link,$agent_login,$agent_password,$games_link,$agent_guide,$color,$sort_order,$is_active,$id]); echo json_encode(['success'=>true]); break;