192 lines
9.1 KiB
HTML
192 lines
9.1 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Q3A RCON Dashboard</title>
|
|
<link rel="stylesheet" href="styles/terminal.css" id="theme-stylesheet">
|
|
</head>
|
|
<body>
|
|
<div class="app">
|
|
<header class="toolbar">
|
|
<div class="toolbar-left">
|
|
<button id="btn-add-server" class="toolbar-btn">+ Add Server</button>
|
|
<button id="btn-servers" class="toolbar-btn">Servers</button>
|
|
</div>
|
|
<div class="toolbar-center">
|
|
<button class="theme-btn" data-theme="terminal">Terminal</button>
|
|
<button class="theme-btn" data-theme="dark">Dark</button>
|
|
<button class="theme-btn" data-theme="light">Light</button>
|
|
</div>
|
|
<div class="toolbar-right">
|
|
<button class="toolbar-btn" id="btn-reference">Reference</button>
|
|
<button class="toolbar-btn" id="btn-about">About</button>
|
|
</div>
|
|
</header>
|
|
|
|
<main class="main-content">
|
|
<div class="tabs-bar" id="tabs-bar">
|
|
<span class="tabs-placeholder" id="tabs-placeholder">No servers configured. Click "+ Add Server" to begin.</span>
|
|
</div>
|
|
|
|
<div class="server-content" id="server-content">
|
|
<div class="welcome-message">
|
|
<h1>Q3A RCON Dashboard</h1>
|
|
<p>Select or add a server to begin.</p>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
|
|
<footer class="status-bar" id="status-bar">
|
|
<span>Ready</span>
|
|
</footer>
|
|
</div>
|
|
|
|
<div class="modal" id="modal-add-server">
|
|
<div class="modal-content">
|
|
<h2>Add / Edit Server</h2>
|
|
<form id="form-server">
|
|
<input type="hidden" id="server-id">
|
|
<div class="form-group">
|
|
<label for="server-name">Name</label>
|
|
<input type="text" id="server-name" placeholder="My Server" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="server-address">Address</label>
|
|
<input type="text" id="server-address" placeholder="192.168.1.100" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="server-port">Port</label>
|
|
<input type="number" id="server-port" value="27960" min="1" max="65535" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="server-password">RCON Password</label>
|
|
<input type="password" id="server-password" placeholder="********" required>
|
|
</div>
|
|
<div class="form-actions">
|
|
<button type="button" class="btn-cancel" id="btn-cancel-server">Cancel</button>
|
|
<button type="submit" class="btn-save">Save</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="modal" id="modal-servers">
|
|
<div class="modal-content modal-large">
|
|
<h2>Manage Servers</h2>
|
|
<div id="server-list" class="server-list"></div>
|
|
<div class="form-actions">
|
|
<button type="button" class="btn-cancel" id="btn-close-servers">Close</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="modal" id="modal-about">
|
|
<div class="modal-content">
|
|
<h2>About Q3A RCON Dashboard</h2>
|
|
<p>Version 1.0.0</p>
|
|
<p>A minimalist administration tool for Quake 3 Arena servers.</p>
|
|
<p>Supports: ioquake3, Q3ALight, and compatible engines.</p>
|
|
<div class="form-actions">
|
|
<button type="button" class="btn-cancel" id="btn-close-about">Close</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="modal" id="modal-reference">
|
|
<div class="modal-content" style="max-width:600px;max-height:80vh;overflow-y:auto;">
|
|
<h2>Q3A RCON Command Reference</h2>
|
|
<h3>Server Management</h3>
|
|
<table class="ref-table">
|
|
<tr><td><code>map <mapname></code></td><td>Change map (e.g., q3dm1)</td></tr>
|
|
<tr><td><code>devmap <mapname></code></td><td>Change map with cheats enabled</td></tr>
|
|
<tr><td><code>spmap <mapname></code></td><td>Single player map</td></tr>
|
|
<tr><td><code>spdevmap <mapname></code></td><td>Single player with cheats</td></tr>
|
|
<tr><td><code>map_restart [<sec>]</code></td><td>Restart map (default 5 sec)</td></tr>
|
|
<tr><td><code>nextmap</code></td><td>Go to next map in cycle</td></tr>
|
|
<tr><td><code>killserver</code></td><td>Shutdown the server</td></tr>
|
|
<tr><td><code>heartbeat</code></td><td>Send heartbeat to masters</td></tr>
|
|
</table>
|
|
<h3>Player Management</h3>
|
|
<table class="ref-table">
|
|
<tr><td><code>kick <name></code></td><td>Kick player by name</td></tr>
|
|
<tr><td><code>kick <all></code></td><td>Kick all players</td></tr>
|
|
<tr><td><code>kick <allbots></code></td><td>Kick all bots</td></tr>
|
|
<tr><td><code>kicknum <num></code></td><td>Kick by client number</td></tr>
|
|
<tr><td><code>clientkick <num></code></td><td>Alias for kicknum</td></tr>
|
|
<tr><td><code>kickall</code></td><td>Kick all players</td></tr>
|
|
<tr><td><code>kickbots</code></td><td>Kick all bots</td></tr>
|
|
<tr><td><code>addbot <name> <skill> [team] [delay]</code></td><td>Add bot to server</td></tr>
|
|
</table>
|
|
<h3>Banning</h3>
|
|
<table class="ref-table">
|
|
<tr><td><code>banaddr <ip[/subnet] [num]</code></td><td>Ban IP or CIDR range</td></tr>
|
|
<tr><td><code>exceptaddr <ip[/subnet] [num]</code></td><td>Add ban exception</td></tr>
|
|
<tr><td><code>bandel <range|num></code></td><td>Delete ban by range or number</td></tr>
|
|
<tr><td><code>exceptdel <range|num></code></td><td>Delete exception</td></tr>
|
|
<tr><td><code>listbans</code></td><td>List all bans</td></tr>
|
|
<tr><td><code>rehashbans</code></td><td>Reload bans from file</td></tr>
|
|
<tr><td><code>flushbans</code></td><td>Delete all bans</td></tr>
|
|
</table>
|
|
<h3>Information</h3>
|
|
<table class="ref-table">
|
|
<tr><td><code>status</code></td><td>Player list with scores and pings</td></tr>
|
|
<tr><td><code>serverinfo</code></td><td>Server settings (gametype, fraglimit, etc.)</td></tr>
|
|
<tr><td><code>systeminfo</code></td><td>System info (OS, CPU, etc.)</td></tr>
|
|
<tr><td><code>meminfo</code></td><td>Server memory usage</td></tr>
|
|
<tr><td><code>dumpuser <name|num></code></td><td>Player userinfo</td></tr>
|
|
<tr><td><code>players</code></td><td>Detailed player list (OSP)</td></tr>
|
|
</table>
|
|
<h3>Messaging</h3>
|
|
<table class="ref-table">
|
|
<tr><td><code>say <message></code></td><td>Broadcast to all players</td></tr>
|
|
<tr><td><code>tell <num> <msg></code></td><td>Message single player</td></tr>
|
|
<tr><td><code>sayto <name> <text></code></td><td>Message player by name</td></tr>
|
|
</table>
|
|
<h3>Config & Variables</h3>
|
|
<table class="ref-table">
|
|
<tr><td><code>set <cvar> <value></code></td><td>Set cvar value</td></tr>
|
|
<tr><td><code>seta <cvar> <value></code></td><td>Set cvar and save to config</td></tr>
|
|
<tr><td><code>sets <cvar> <value></code></td><td>Set and transmit to clients</td></tr>
|
|
<tr><td><code>setu <cvar> <value></code></td><td>Set userinfo cvar</td></tr>
|
|
<tr><td><code>reset <cvar></code></td><td>Reset cvar to default</td></tr>
|
|
<tr><td><code>cvarlist [filter]</code></td><td>List all cvars (optional filter)</td></tr>
|
|
<tr><td><code>cmdlist [letter]</code></td><td>List all commands</td></tr>
|
|
<tr><td><code>exec <config></code></td><td>Execute config file</td></tr>
|
|
<tr><td><code>writeconfig <file></code></td><td>Save current config to file</td></tr>
|
|
<tr><td><code>condump <file></code></td><td>Dump console to file</td></tr>
|
|
</table>
|
|
<h3>Game Settings (set via set/seta)</h3>
|
|
<table class="ref-table">
|
|
<tr><td><code>g_gametype</code></td><td>0=dm, 1=duel, 2=sp, 3=tdm, 4=ctf</td></tr>
|
|
<tr><td><code>fraglimit</code></td><td>Frag limit for map</td></tr>
|
|
<tr><td><code>timelimit</code></td><td>Time limit for map</td></tr>
|
|
<tr><td><code>sv_maxclients</code></td><td>Max players</td></tr>
|
|
<tr><td><code>sv_pure</code></td><td>0=allow non-pure clients</td></tr>
|
|
<tr><td><code>sv_allowDownload</code></td><td>0=disabled, 1=enabled</td></tr>
|
|
<tr><td><code>g_allowvote</code></td><td>0=disabled, 1=enabled</td></tr>
|
|
<tr><td><code>bot_enable</code></td><td>0=disabled, 1=enabled</td></tr>
|
|
<tr><td><code>bot_minplayers</code></td><td>Min bots to maintain</td></tr>
|
|
</table>
|
|
<div class="form-actions">
|
|
<button type="button" class="btn-cancel" id="btn-close-reference">Close</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="modal" id="modal-input">
|
|
<div class="modal-content">
|
|
<h2 id="modal-input-title">Enter Value</h2>
|
|
<div class="form-group">
|
|
<input type="text" id="modal-input-field" placeholder="">
|
|
</div>
|
|
<div class="form-actions">
|
|
<button type="button" class="btn-cancel" id="btn-cancel-input">Cancel</button>
|
|
<button type="button" class="btn-save" id="btn-submit-input">OK</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script src="js/renderer.js"></script>
|
|
</body>
|
|
</html> |