diff --git a/website/.htaccess b/website/.htaccess
index 55fccecdd..4895135f8 100644
--- a/website/.htaccess
+++ b/website/.htaccess
@@ -70,8 +70,9 @@ RewriteRule ^pages/([a-z0-9-]+)/?$ /.pages-cached/$1.html [L,QSA]
RewriteRule ^autodownload\/?([A-Za-z0-9-]+)?$ autodownload.php?os=$1 [L,QSA]
-RewriteRule ^servers\/?([A-Za-z0-9-]+)?$ servers.php?id=$1 [L,QSA]
-RewriteRule ^servers\/([A-Za-z0-9-]+)\.json$ servers.php?id=$1&json [L,QSA]
+RewriteRule ^servers\/?$ servers/index.php [L,QSA]
+RewriteRule ^servers\/?([A-Za-z0-9-]+)?$ servers/server.php?id=$1 [L,QSA]
+RewriteRule ^servers\/([A-Za-z0-9-]+)\.json$ servers/server.php?id=$1&json [L,QSA]
# RewriteRule ^replay\/?search/?$ replay/search.php [L,QSA]
# RewriteRule ^replay\/?([A-Za-z0-9-]+)$ replay/battle.php?name=$1 [L,QSA]
diff --git a/website/servers.php b/website/servers.php
deleted file mode 100644
index d11c68e6a..000000000
--- a/website/servers.php
+++ /dev/null
@@ -1,439 +0,0 @@
-userid(@$_GET['id']);
- $entry = @$PokemonServers[$id];
- if (!$entry) {
- header('HTTP/1.1 404 Not Found');
- die(isset($_REQUEST['json']) ? 'null' : '404 Not Found');
- }
-}
-
-$timenow = time();
-
-$page = 'servers';
-$pageTitle = "Servers";
-
-function saveservers() {
- file_put_contents(__DIR__ . '/../config/servers.inc.php', ' '',
- 'id' => $id,
- ];
- if ($entry['banned'] ?? false) {
- $out['banned'] = true;
- } else {
- $out['banned'] = false;
- $out['host'] = $entry['server'];
- $out['port'] = $entry['port'];
- if (isset($entry['altport'])) $out['altport'] = $entry['altport'];
- }
- die(json_encode($out));
- }
- $is_owner = $is_manager;
- if (!@$entry['banned'] && strpos(','.@$entry['owner'].',', ','.$curuser['userid'].',') !== false) $is_owner = true;
-
- if (@$_POST['act'] === 'editserver') {
- if (!$is_owner) die('access denied');
- if (!$users->csrfCheck()) die('invalid data, please retry');
-
- $id = $entry['id'];
- $loc = trim(@$_POST['loc']);
- if ($loc) {
-
- if (substr($loc, 0, 7) === 'http://') $loc = substr($loc, 7);
- if (substr($loc, 0, 8) === 'https://') $loc = substr($loc, 8);
- $slashpos = strpos($loc, '/');
- if ($slashpos !== false) $loc = substr($loc, 0, $slashpos);
- if (substr($loc, -8) === '.psim.us') $loc = substr($loc, 0, -8);
- $parts = explode(':', $loc);
- $server = $loc;
- $port = 8000;
- if (@$parts[1]) {
- $port = intval($parts[1]);
- $server = $parts[0];
- } else {
- $dashpos = strrpos($loc, '-');
- if ($dashpos !== false && ctype_digit(substr($loc, $dashpos+1))) {
- $port = intval(substr($loc, $dashpos+1));
- $server = substr($loc, 0, $dashpos);
- }
- }
-
- if (strpos($server, '.') === false) {
- die("invalid server location");
- }
-
- $PokemonServers[$id]['server'] = $server;
- $PokemonServers[$id]['port'] = $port;
- }
-
- $owners = explode(',', $_POST['owner']);
- foreach ($owners as $i=>$owner) $owners[$i] = $users->userid($owner);
- $PokemonServers[$id]['owner'] = implode(',',$owners);
-
- saveservers();
- $success = 'editserver';
- $entry = $PokemonServers[$id];
- }
- if (@$_POST['act'] === 'deleteserver') {
- if (!$is_owner) die('access denied');
- if (!$users->csrfCheck()) die('invalid data, please retry');
- $id = $entry['id'];
-
- unset($PokemonServers[$id]);
- saveservers();
- $success = 'deleteserver';
- $entry = false;
- }
- if (@$_POST['act'] === 'banserver') {
- if (!$is_owner) die('access denied');
- if (!$users->csrfCheck()) die('invalid data, please retry');
- $id = $entry['id'];
-
- $message = @$_POST['message'];
- if (!$message) $message = 'banned';
- $PokemonServers[$id]['banned'] = $_POST['message'];
- saveservers();
- $success = 'banserver';
- $entry = $PokemonServers[$id];
- }
- if (@$_POST['act'] === 'maketoken') {
- if (!$is_owner) die('access denied');
- if (!$users->csrfCheck()) die('invalid data, please retry');
- $id = $entry['id'];
-
- $token = base64_encode(openssl_random_pseudo_bytes(9));
- $PokemonServers[$id]['token'] = md5($token);
- saveservers();
- $success = 'maketoken';
- $entry = $PokemonServers[$id];
- }
- if (@$_POST['act'] === 'deltoken') {
- if (!$is_owner) die('access denied');
- if (!$users->csrfCheck()) die('invalid data, please retry');
- $id = $entry['id'];
-
- unset($PokemonServers[$id]['token']);
- saveservers();
- $success = 'deltoken';
- $entry = $PokemonServers[$id];
- }
- includeHeader();
- // if (!$is_owner) {
- // die('access denied');
- // }
-?>
-
-
- You're logged in as: = htmlspecialchars($curuser['username']) ?>
-
-
- Back to server list
-
-
Successfully updated.'; if (!$entry) die(); ?>
-
-
Add this to your config.js, replacing all other "exports.serverid" and "exports.servertoken" lines if you have them:
-
-
= htmlspecialchars($entry['name']); ?>
-
-
- [Hidden]
-
-
-
-
- Banned
Reason: = $entry['banned'] ?>
-
-
-
-
- = $psconfig['routes']['client'] ?>
-
- = $entry['id'] ?>.psim.us
-
-
-
Owner: = htmlspecialchars($entry['owner']); ?>
-
-
-
-
-
-
-
-
-csrfCheck()) die('invalid data, please retry');
- $name = trim(@$_POST['name']);
- $owners = explode(',', @$_POST['owner']);
- foreach ($owners as $i=>$owner) $owners[$i] = $users->userid($owner);
- $owner = implode(',',$owners);
- $id = $users->userid(@$_POST['id']);
- $loc = trim(@$_POST['loc']);
- if (!$name || !$id || !$loc) die('missing information');
- if (isset($PokemonServers[$id])) die('server already exists');
- if (substr($loc, 0, 7) === 'http://') $loc = substr($loc, 7);
- if (substr($loc, 0, 8) === 'https://') $loc = substr($loc, 8);
- $slashpos = strpos($loc, '/');
- if ($slashpos !== false) $loc = substr($loc, 0, $slashpos);
- if (substr($loc, -8) === '.psim.us') $loc = substr($loc, 0, -8);
- $parts = explode(':', $loc);
- $server = $loc;
- $port = 8000;
- if (@$parts[1]) {
- $port = intval($parts[1]);
- $server = $parts[0];
- } else {
- $dashpos = strrpos($loc, '-');
- if ($dashpos !== false && ctype_digit(substr($loc, $dashpos+1))) {
- $port = intval(substr($loc, $dashpos+1));
- $server = substr($loc, 0, $dashpos);
- }
- }
- if (strpos($server, '.') === false) {
- die("invalid server location");
- }
- $PokemonServers[$id] = [
- 'name' => $name,
- 'id' => $id,
- 'server' => $server,
- 'port' => $port
- ];
- if ($owner) $PokemonServers[$id]['owner'] = $owner;
- saveservers();
-}
-
-// Server list
-//=================================================================================
-
-includeHeader();
-
-if (@$_POST['act'] === 'addserver') {
- echo 'Added: '.htmlspecialchars(var_export($PokemonServers[$id],true)).'
';
-}
-
-$activeservers = [];
-$inactiveservers = [];
-
-$res = $psdb->query("SELECT `serverid`, `date`, `usercount` FROM `ntbb_userstats`");
-while ($row = $psdb->fetch_assoc($res)) {
- $serverid = $row['serverid'];
- if (!isset($PokemonServers[$serverid])) continue;
- if (@$PokemonServers[$serverid]['hidden']) continue;
-
- if ($timenow - $row['date'] / 1000 > 60 * 30) {
- $inactiveservers[$serverid] = $row;
- $inactiveservers[$serverid]['serverentry'] = $PokemonServers[$serverid];
- } else {
- $activeservers[$serverid] = $row;
- $activeservers[$serverid]['serverentry'] = $PokemonServers[$serverid];
- }
-}
-
-function cmpByDate($b, $a) {
- return $a['date'] - $b['date'];
-}
-function cmpByUsercount($b, $a) {
- return $a['usercount'] - $b['usercount'];
-}
-$uninitializedservers = array_diff_key($PokemonServers, $activeservers, $inactiveservers);
-uasort($activeservers, 'cmpByUsercount');
-uasort($inactiveservers, 'cmpByDate');
-
-?>
-
-
-
Add server
-
-
-
-
-
-
- Server registration form
-
-
Active servers
-
-
Inactive servers
-
-
-
Untracked servers
-
- (Registered servers that have never been online ever, or whose online state can't be tracked without a token)
-
-
-
-
-csrfCheck()) die('invalid data, please retry');
+ $name = trim(@$_POST['name']);
+ $owners = explode(',', @$_POST['owner']);
+ foreach ($owners as $i=>$owner) $owners[$i] = $users->userid($owner);
+ $owner = implode(',',$owners);
+ $id = $users->userid(@$_POST['id']);
+ $loc = trim(@$_POST['loc']);
+ if (!$name || !$id || !$loc) die('missing information');
+ if (isset($PokemonServers[$id])) die('server already exists');
+ if (substr($loc, 0, 7) === 'http://') $loc = substr($loc, 7);
+ if (substr($loc, 0, 8) === 'https://') $loc = substr($loc, 8);
+ $slashpos = strpos($loc, '/');
+ if ($slashpos !== false) $loc = substr($loc, 0, $slashpos);
+ if (substr($loc, -8) === '.psim.us') $loc = substr($loc, 0, -8);
+ $parts = explode(':', $loc);
+ $server = $loc;
+ $port = 8000;
+ if (@$parts[1]) {
+ $port = intval($parts[1]);
+ $server = $parts[0];
+ } else {
+ $dashpos = strrpos($loc, '-');
+ if ($dashpos !== false && ctype_digit(substr($loc, $dashpos+1))) {
+ $port = intval(substr($loc, $dashpos+1));
+ $server = substr($loc, 0, $dashpos);
+ }
+ }
+ if (strpos($server, '.') === false) {
+ die("invalid server location");
+ }
+ $PokemonServers[$id] = [
+ 'name' => $name,
+ 'id' => $id,
+ 'server' => $server,
+ 'port' => $port
+ ];
+ if ($owner) $PokemonServers[$id]['owner'] = $owner;
+ saveservers();
+}
+
+// Server list
+//=================================================================================
+
+includeHeader();
+
+if (@$_POST['act'] === 'addserver') {
+ echo 'Added: '.htmlspecialchars(var_export($PokemonServers[$id],true)).'
';
+}
+
+$activeservers = [];
+$inactiveservers = [];
+
+$res = $psdb->query("SELECT `serverid`, `date`, `usercount` FROM `ntbb_userstats`");
+while ($row = $psdb->fetch_assoc($res)) {
+ $serverid = $row['serverid'];
+ if (!isset($PokemonServers[$serverid])) continue;
+ if (@$PokemonServers[$serverid]['hidden']) continue;
+
+ if ($timenow - $row['date'] / 1000 > 60 * 30) {
+ $inactiveservers[$serverid] = $row;
+ $inactiveservers[$serverid]['serverentry'] = $PokemonServers[$serverid];
+ } else {
+ $activeservers[$serverid] = $row;
+ $activeservers[$serverid]['serverentry'] = $PokemonServers[$serverid];
+ }
+}
+
+function cmpByDate($b, $a) {
+ return $a['date'] - $b['date'];
+}
+function cmpByUsercount($b, $a) {
+ return $a['usercount'] - $b['usercount'];
+}
+$uninitializedservers = array_diff_key($PokemonServers, $activeservers, $inactiveservers);
+uasort($activeservers, 'cmpByUsercount');
+uasort($inactiveservers, 'cmpByDate');
+
+?>
+
+
+
Add server
+
+
+
+
+
+
+ Server registration form
+
+
Active servers
+
+
Inactive servers
+
+
+
Untracked servers
+
+ (Registered servers that have never been online ever, or whose online state can't be tracked without a token)
+
+
+
+
+userid($_GET['id']);
+ $entry = $PokemonServers[$id] ?? null;
+ if (!$entry) {
+ header('HTTP/1.1 404 Not Found');
+ die(isset($_REQUEST['json']) ? 'null' : '404 Not Found');
+ }
+}
+
+$page = 'servers';
+$pageTitle = "Servers";
+
+$success = false;
+
+$is_manager = (@$curuser['group'] == 2 || @$curuser['group'] == 6);
+
+// Single server view
+//=================================================================================
+
+if (isset($_REQUEST['json'])) {
+ header('Content-type: application/json');
+ header('Access-Control-Allow-Origin: *');
+ if (!$entry) die('null');
+ $out = [
+ 'host' => '',
+ 'id' => $id,
+ ];
+ if ($entry['banned'] ?? false) {
+ $out['banned'] = true;
+ } else {
+ $out['banned'] = false;
+ $out['host'] = $entry['server'];
+ $out['port'] = $entry['port'];
+ if (isset($entry['altport'])) $out['altport'] = $entry['altport'];
+ }
+ die(json_encode($out));
+}
+
+if (!$entry) {
+ die("server not found");
+}
+
+$is_owner = $is_manager;
+if (!@$entry['banned'] && strpos(','.@$entry['owner'].',', ','.$curuser['userid'].',') !== false) $is_owner = true;
+
+if (@$_POST['act'] === 'editserver') {
+ if (!$is_owner) die('access denied');
+ if (!$users->csrfCheck()) die('invalid data, please retry');
+
+ $id = $entry['id'];
+ $loc = trim($_POST['loc'] ?? '');
+ if ($loc) {
+
+ if (substr($loc, 0, 7) === 'http://') $loc = substr($loc, 7);
+ if (substr($loc, 0, 8) === 'https://') $loc = substr($loc, 8);
+ $slashpos = strpos($loc, '/');
+ if ($slashpos !== false) $loc = substr($loc, 0, $slashpos);
+ if (substr($loc, -8) === '.psim.us') $loc = substr($loc, 0, -8);
+ $parts = explode(':', $loc);
+ $server = $loc;
+ $port = 8000;
+ if (@$parts[1]) {
+ $port = intval($parts[1]);
+ $server = $parts[0];
+ } else {
+ $dashpos = strrpos($loc, '-');
+ if ($dashpos !== false && ctype_digit(substr($loc, $dashpos+1))) {
+ $port = intval(substr($loc, $dashpos+1));
+ $server = substr($loc, 0, $dashpos);
+ }
+ }
+
+ if (strpos($server, '.') === false) {
+ die("invalid server location");
+ }
+
+ $PokemonServers[$id]['server'] = $server;
+ $PokemonServers[$id]['port'] = $port;
+ }
+
+ $owners = explode(',', $_POST['owner']);
+ foreach ($owners as $i=>$owner) $owners[$i] = $users->userid($owner);
+ $PokemonServers[$id]['owner'] = implode(',',$owners);
+
+ saveservers();
+ $success = 'editserver';
+ $entry = $PokemonServers[$id];
+}
+if (@$_POST['act'] === 'deleteserver') {
+ if (!$is_owner) die('access denied');
+ if (!$users->csrfCheck()) die('invalid data, please retry');
+ $id = $entry['id'];
+
+ unset($PokemonServers[$id]);
+ saveservers();
+ $success = 'deleteserver';
+ $entry = false;
+}
+if (@$_POST['act'] === 'banserver') {
+ if (!$is_owner) die('access denied');
+ if (!$users->csrfCheck()) die('invalid data, please retry');
+ $id = $entry['id'];
+
+ $message = @$_POST['message'];
+ if (!$message) $message = 'banned';
+ $PokemonServers[$id]['banned'] = $_POST['message'];
+ saveservers();
+ $success = 'banserver';
+ $entry = $PokemonServers[$id];
+}
+if (@$_POST['act'] === 'maketoken') {
+ if (!$is_owner) die('access denied');
+ if (!$users->csrfCheck()) die('invalid data, please retry');
+ $id = $entry['id'];
+
+ $token = base64_encode(openssl_random_pseudo_bytes(9));
+ $PokemonServers[$id]['token'] = md5($token);
+ saveservers();
+ $success = 'maketoken';
+ $entry = $PokemonServers[$id];
+}
+if (@$_POST['act'] === 'deltoken') {
+ if (!$is_owner) die('access denied');
+ if (!$users->csrfCheck()) die('invalid data, please retry');
+ $id = $entry['id'];
+
+ unset($PokemonServers[$id]['token']);
+ saveservers();
+ $success = 'deltoken';
+ $entry = $PokemonServers[$id];
+}
+includeHeader();
+// if (!$is_owner) {
+// die('access denied');
+// }
+?>
+
+
+ You're logged in as: = htmlspecialchars($curuser['username']) ?>
+
+
+ « Back to server list
+
+
Successfully updated.'; if (!$entry) die(); ?>
+
+
Add this to your config.js, replacing all other "exports.serverid" and "exports.servertoken" lines if you have them:
+
+
= htmlspecialchars($entry['name']); ?>
+
+
+ [Hidden]
+
+
+
+
+ Banned
Reason: = $entry['banned'] ?>
+
+
+
+
+ = $psconfig['routes']['client'] ?>
+
+ = $entry['id'] ?>.psim.us
+
+
+
Owner: = htmlspecialchars($entry['owner']); ?>
+
+
+
+
+
+
+
+
+