Files
PQS/registration.php
T
CydandClaude Opus 4.8 c82978776d Route all remaining fill paths through the shared atomic queue
Completes the overfill-race fix (item #1). New queue.php functions, all under
the same GET_LOCK + transaction and self-healing numplayers:
- pqs_add_player_to_mission     (staff 'new' -> registration.php)
- pqs_add_player_to_missions    (staff 'add to N missions' -> registration.php)
- pqs_enqueue_group             (kiosk group leader -> callsign.php)
- pqs_claim_group_slot          (kiosk group member -> callsign.php)
callsign.php and registration.php now call these instead of their own
non-atomic read-check-insert blocks.

Verified on the local stack: scenario test (leader/member/staff paths) and
120 mixed concurrent solo+group writers x3 -> zero overfill, zero drift;
HTTP smoke of leader/member/new paths all seat correctly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 13:49:10 -05:00

402 lines
18 KiB
PHP

<html>
<head>
<title>PQS - Registration Console</title>
<link href="css/main.css" rel="stylesheet" type="text/css">
<link href="css/tooltip.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/jquery.qtip.js"></script>
<script type="text/javascript">
var auto_refreshqueue = setInterval(function() {
$.ajaxSetup({ cache: false });
$('#queuediv').load('includes/getreg.php<?php if (isset($_GET['missionid'])) {$missionid = $_GET['missionid'];echo"?mid=$missionid";} ?>');
}, 1000);
</script>
</head>
<body style='background: #000;'>
<?php
//var_dump($_GET);
//var_dump($_POST);
//var_dump($_SESSION);
include_once("includes/config.php");
date_default_timezone_set('America/Chicago');
$tdate = date('Ymd');
$ttime = date('Hi');
$missionsize = $_SESSION['mechpods'];
$action = "";
$playerid = 0;
$missionid = 0;
$merc = 0;
$callsign = "";
$nummissions = 0;
$mech = "";
$server = $_SERVER['SERVER_ADDR'];
if (isset($_GET['build'])) {
$buildmissions = $_GET['buildmissions'];
while ($buildmissions > 0){
$link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link));
mysqli_select_db($link, 'pqs') or die('Could not select database');
$sql = "INSERT INTO pqs_mission (MissionDate, MissionSize, numplayers, MissionTime) VALUES ($tdate, $missionsize, 0, $ttime)";
mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link));
$buildmissions--;
}
}
if (isset($_GET['clearcurrent'])) {
$link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link));
mysqli_select_db($link, 'pqs') or die('Could not select database');
$sql = "TRUNCATE TABLE pqs_currentmission";
mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link));
mysqli_close($link);
}
if (isset($_GET['lock'])) {
$link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link));
mysqli_select_db($link, 'pqs') or die('Could not select database');
if (isset($_GET['missionid'])) {
$missionid = $_GET['missionid'];
}else{
$sql = "SELECT MIN(MissionID) FROM pqs_queue";
$getid = mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link));
$rs = mysqli_fetch_array($getid);
$missionid = $rs[0];
}
$sql = "UPDATE pqs_mission SET locked=1 WHERE MissionID=$missionid";
mysqli_query($link, $sql) or die('Query failed: ' . mysqli_error($link));
mysqli_close($link);
}
if (isset($_POST['edit'])) {
if (isset($_POST['playerid'])) $playerid = $_POST['playerid'];
if (isset($_POST['callsign'])) $callsign = str_replace("'", "''", $_POST['callsign']);
if (isset($_POST['mech'])) $mech = $_POST['mech'];
$link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link));
mysqli_select_db($link, 'pqs') or die('Could not select database');
$sql = "UPDATE pqs_queue SET Callsign='$callsign', mech='$mech', Updated=1 WHERE id=$playerid";
mysqli_query($link, $sql) or die('Update player in Queue failed: ' . mysqli_error($link));
mysqli_close($link);
}
if (isset($_POST['add'])) {
// Add one player to the next N missions after $missionid (atomic).
require_once("includes/queue.php");
$callsign = isset($_POST['callsign']) ? $_POST['callsign'] : '';
$mech = isset($_POST['mech']) ? $_POST['mech'] : '';
$merc = isset($_POST['merc']) ? (int)$_POST['merc'] : 0;
$startmission = isset($_POST['missionid']) ? (int)$_POST['missionid'] : 0;
$nummissions = isset($_POST['nummissions']) ? (int)$_POST['nummissions'] : 0;
pqs_add_player_to_missions($startmission, $nummissions, $callsign, $mech, $merc);
}
if (isset($_POST['new'])) {
// Add one player to a specific mission (atomic).
require_once("includes/queue.php");
$callsign = isset($_POST['callsign']) ? $_POST['callsign'] : '';
if ($callsign === '') { $callsign = 'empty'; }
$mech = isset($_POST['mech']) ? $_POST['mech'] : '';
$missionid = isset($_POST['missionid']) ? (int)$_POST['missionid'] : 0;
pqs_add_player_to_mission($missionid, $callsign, $mech);
}
if (isset($_POST['editgame'])) {
$newtype = $_POST['newtype'];
$newmap = $_POST['newmap'];
$missionid = $_GET['missionid'];
$link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link));
mysqli_select_db($link, 'pqs') or die('Could not select database');
$sql = "UPDATE pqs_mission SET GameType='$newtype', map='$newmap' WHERE MissionID=$missionid";
mysqli_query($link, $sql) or die('Update player in Queue failed: ' . mysqli_error($link));
mysqli_close($link);
}
if (isset($_GET['action'])) {
$action = $_GET['action'];
if (isset($_GET['playerid'])) $playerid = $_GET['playerid'];
if (isset($_GET['missionid'])) $missionid = $_GET['missionid'];
if (isset($_GET['callsign'])) $callsign = $_GET['callsign'];
if (isset($_GET['mech'])) $mech = $_GET['mech'];
if (isset($_GET['oldmap'])) $oldmap = $_GET['oldmap'];
if (isset($_GET['oldtype'])) $oldtype = $_GET['oldtype'];
$callsign=str_replace("'", "&apos;", $line[0]);
$nextmission = $missionid + 1;
switch ($action) {
case "edit":
$link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link));
mysqli_select_db($link, 'pqs') or die('Could not select database');
$sql = "SELECT * FROM pqs_queue WHERE ID = $playerid";
$result = mysqli_query($link, $sql) or die('Select player from Queue failed: ' . mysqli_error($link));
$rs = mysqli_fetch_array($result);
$callsign = $rs[0];
$mech = $rs[1];
echo "<form action='registration.php";if (isset($_GET['missionid'])) {$missionid = $_GET['missionid'];echo"?missionid=$missionid";};echo"' method='post'>";
echo "<table align='center'><tr><td align='center'>";
echo "<div id='editqueue' class='queuedivreg'>";
echo "<table border='0' align='center'><tr>";
echo "<td colspan='3' class='queuedisplayhead' align='center'>Edit Player $callsign</td></tr>";
echo "<tr><td width='40%' align='center' class='consoledisplayhead'>Callsign</td><td width='40%' align='center' class='consoledisplayhead'>Mech</td><td width='20%' align='center' class='consoledisplayhead'</td></tr>";
echo "<tr><td width='40%' align='center'><input class='editqueue' type='text' name='callsign' value='$callsign' size='18' maxlength='16' /></td>";
echo "<td width='40%' align='center'>";
echo "<select class='editqueue' name='mech'>";
$query = 'SELECT * FROM pqs_mechinfo ORDER BY mechname';
$result = mysqli_query($link, $query) or die('Query failed: ' . mysqli_error($link));
while ($line = mysqli_fetch_array($result)) {
if ($line[1] == $mech) {
echo "<option value='$line[1]' selected>$line[1]</option>";
} else {
echo "<option value='$line[1]'>$line[1]</option>";
}
}
echo "</td>";
echo "<td width='20%' align='center'><input type='submit' name='submit' class='button' id='submit_btnlock' value='Edit Player' />";
echo "<input type='hidden' name='playerid' value='$playerid'>";
echo "<input type='hidden' name='edit' value='commit'>";
echo "</table></div>";
echo "</td></tr></table></form>";
mysqli_close($link);
break;
case "delete":
$link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link));
mysqli_select_db($link, 'pqs') or die('Could not select database');
$sql = "SELECT COUNT(CallSign) FROM pqs_queue";
$result = mysqli_query($link, $sql) or die('Delete player from Queue failed: ' . mysqli_error($link));
$line = mysqli_fetch_array($result);
$queuecount = $line[0];
$sql = "DELETE FROM pqs_queue WHERE id = $playerid";
$result = mysqli_query($link, $sql) or die('Delete player from Queue failed: ' . mysqli_error($link));
$sql = "UPDATE pqs_mission SET numplayers = numplayers - 1 WHERE missionid = $missionid";
$result = mysqli_query($link, $sql) or die('Update mission after delete player failed: ' . mysqli_error($link));
mysqli_close($link);
break;
case "add":
$link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link));
mysqli_select_db($link, 'pqs') or die('Could not select database');
$sql = "SELECT * FROM pqs_queue WHERE ID = $playerid";
$result = mysqli_query($link, $sql) or die('Delete player from Queue failed: ' . mysqli_error($link));
$rs = mysqli_fetch_array($result);
$callsign = str_replace("'", "&apos;", $rs[0]);
$mech = $rs[1];
$merc = $rs[4];
$missionid = $rs[3];
echo "<form action='registration.php";if (isset($_GET['missionid'])) {$missionid = $_GET['missionid'];echo"?missionid=$missionid";};echo"' method='post'>";
echo "<table width='650' align='center'>";
echo "<tr><td align='center'>";
echo "<div id='editqueue' class='queuedivreg'>";
echo "<table border='0' align='center'><tr>";
echo "<td colspan='1' width='100%' class='queuedisplayhead' align='center'>Add $callsign to multiple missions</td></tr>";
echo "<tr><td class='queuedisplayhead' ><font size='4'># Missions: </font><input class='editqueue' type='text' name='nummissions' size='3' /></td></tr>";
echo "<tr><td align='center'><input type='submit' name='submit' class='button' id='submit_btnlock' value='Add missions' /></tr>";
echo "<input type='hidden' name='playerid' value='$playerid'>";
echo "<input type='hidden' name='callsign' value='$callsign'>";
echo "<input type='hidden' name='mech' value='$mech'>";
echo "<input type='hidden' name='merc' value='$merc'>";
echo "<input type='hidden' name='missionid' value='$missionid'>";
echo "<input type='hidden' name='add' value='commit'>";
echo "</table></div>";
echo "</td></tr></table></form>";
mysqli_close($link);
break;
case "editgame":
$link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link));
mysqli_select_db($link, 'pqs') or die('Could not select database');
echo "<form name='editgame' action='registration.php";if (isset($_GET['missionid'])) {$missionid = $_GET['missionid'];echo"?missionid=$missionid";};echo"' method='post'>";
echo "<input type='hidden' name='editgame' value='editgame'>";
echo "<table align='center'><tr><td align='center'>";
echo "<div id='edittype' class='queuedivreg'>";
echo "<table border='0' align='center'>";
echo "<tr><td width='15' class='consoledisplayhead'>Edit : $missionid </td>";
echo "<td width='40%' align='center'>";
echo "<select class='edittype' name='newtype' onchange='changeIt(this.options[this.selectedIndex].value)'>";
$sql = "SELECT * FROM pqs_gametype";
$result = mysqli_query($link, $sql) or die('Select player from Queue failed: ' . mysqli_error($link));
while ($line = mysqli_fetch_array($result)) {
if ($line[0] == $oldtype) {
echo "<option value='$line[0]' selected>$line[1]</option>
";
} else {
echo "<option value='$line[0]'>$line[1]</option>
";
}
}
echo "</td>";
echo "<td width='30%' align='center'>";
echo "<select class='editmap' name='newmap'>";
$sql = "SELECT * FROM pqs_mapinfo";
$result = mysqli_query($link, $sql) or die('Select player from Queue failed: ' . mysqli_error($link));
while ($line = mysqli_fetch_array($result)) {
if ($line[0] == $oldmap) {
echo "<option value='$line[0]' selected>$line[1]</option>";
} else {
echo "<option value='$line[0]'>$line[1]</option>";
}
}
echo "</td>";
echo "<td width='15%' align='center'><input type='submit' name='submit' class='button' id='submit_btnlock' value='Edit' />";
echo "<input type='hidden' name='missionid' value='$missionid'>";
echo "</table></div>";
echo "</td></tr></table></form>";
mysqli_close($link);
break;
}
}
echo "<table width='650' align='center'>";
echo "<tr><td align='center'><a class='queuedisplayhead' href='registration.php?clearcurrent=1'><font size='3'>Clear Current Queue</font></a>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;";
echo "<a class='queuedisplayhead' href='history.php' target='_blank'><font size='3'>Open History Window</font></a>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;";
echo "<a class='queuedisplayhead' href='registration.php?lock=yes";if (isset($_GET['missionid'])) {$missionid = $_GET['missionid'];echo "&missionid=$missionid";} echo "'><font size='3'>Lock Mission</font></a>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;";
echo "<a class='queuedisplayhead' href='registration.php'><font size='3'>Back to Current Queue</font></a>";
echo "</td></tr>";
echo "<tr><td align='center'>";
echo "<div id='queuediv' class='queuedivreg'></div>";
echo "</td></tr>";
// add player form
if($missionid==0){
$link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link));
mysqli_select_db($link, 'pqs') or die('Could not select database');
$query = 'SELECT min(MissionID) FROM pqs_queue';
$result = mysqli_query($link, $query) or die('Query failed: ' . mysqli_error($link));
$line = mysqli_fetch_array($result);
$missionid = $line[0];
}
echo "<form action='registration.php";if (isset($_GET['missionid'])) {$missionid = $_GET['missionid'];echo"?missionid=$missionid";};echo"' method='post'>";
echo "<table align='center'><tr><td align='center'>";
echo "<div id='addqueue' class='queuedivreg'>";
echo "<table border='0' align='center'>";
echo "<tr><td width='10%' align='center'><a class='queuedisplayhead' href='registration.php'><font size='2'>Back to Current</font></a></td><td width='10%' class='consoledisplayhead' align='left'>M: $missionid</td><td width='40%' class='consoledisplayhead' align='center'>CS: <input class='editqueue' type='text' name='callsign' size='16' maxlength='16' /><input type='hidden' name='missionid' value='$missionid'></td>";
echo "<td width='30%' align='center'>";
echo "<select class='addqueue' name='mech'>";
$link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link));
mysqli_select_db($link, 'pqs') or die('Could not select database');
$query = 'SELECT * FROM pqs_mechinfo ORDER BY mechname';
$result = mysqli_query($link, $query) or die('Query failed: ' . mysqli_error($link));
while ($line = mysqli_fetch_array($result)) {
echo "<option value='$line[1]'>$line[1]</option>
";
}
echo "</td><td align='center' width='10'><input type='submit' name='new' class='button' id='action' value='new' /></td></tr></table>";
echo "</tr></table></form>";
// search form
echo "<table align='center'><tr><td align='center'>";
echo "<form action='registration.php' method='get'>";
echo "<div id='searchqueue' class='queuedivreg'>";
echo "<table border='0' align='center'>";
echo "<tr><td width='40%' align='center' class='consoledisplayhead'>Search in Mission(s)</td>";
echo "<td width='40%' align='center'><input class='editqueue' type='text' name='callsign' size='18' maxlength='16' />";
echo "</td><td align='center' width='20%'><input type='submit' name='search' class='button' id='action' value='search' /></td></tr></table>";
echo "</form>";
echo "</table>";
// create missions
echo "<table align='center'><tr><td align='center'>";
echo "<form action='registration.php' method='get'>";
echo "<div id='searchqueue' class='queuedivreg'>";
echo "<table border='0' align='center'>";
echo "<tr><td width='40%' align='center' class='consoledisplayhead'>Build Missions </td>";
echo "<td width='40%' align='center'><input class='editqueue' type='text' name='buildmissions' size='8' maxlength='3' />";
echo "</td><td align='center' width='20%'><input type='submit' name='build' class='button' id='action' value='build' /></td></tr></table>";
echo "</form>";
echo "</table>";
// search results //
if(isset($_GET['search'])){
if (isset($_GET['callsign'])){
$cs = str_replace("'", "&;", $_GET['callsign']);
if($cs == ''){$cs = 'unknown';}
}
echo "<center><div class='queuedivreg'><table align='center'>";
echo "<tr><td colspan='5' class='queuedisplayhead'><font size='6'>Mission(s) : $cs</font></td></tr>";
echo "<tr><td class='queuedisplayhead' width='20%'>CallSign</td><td class='queuedisplayhead' width='20%'>Mission</td><td class='queuedisplayhead' width='20%'>ETD</td><td class='queuedisplayhead' width='20%'>Mech</td><td class='queuedisplayhead' width='20%'>Edit/Delete</td></tr>";
// fetch data //
$link = mysqli_connect('localhost', 'pqs', 'pqs') or die('Could not connect: ' . mysqli_error($link));
mysqli_select_db($link, 'pqs') or die('Could not select database');
// get last commit time and mission id
$query = "SELECT max(MissionID), max(UNIX_TIMESTAMP(ctime)) FROM pqs_pastmissions";
$getlct = mysqli_query($link, $query) or die('Query failed: ' . mysqli_error($link));
$rs2 = mysqli_fetch_array($getlct);
$lastmission = $rs2[0];
if(is_null($lastmission)){$lastmission = 0;}
$lastCommitTime = $rs2[1];// utc -H*mm*sc
if(is_null($lastCommitTime)){$lastCommitTime = time();}//-(6*60*60);}
// get time per game //
$query = "SELECT timepergame, timetoreset FROM pqs_gameconfig";
$gettpg = mysqli_query($link, $query) or die('Query failed: ' . mysqli_error($link));
$rs1 = mysqli_fetch_array($gettpg);
$tpg = $rs1[0]+$rs1[1];
$query = "SELECT * FROM pqs_queue WHERE CallSign LIKE '$cs' ORDER BY MissionID";
$result = mysqli_query($link, $query) or die('Query failed: ' . mysqli_error($link));
while ($line = mysqli_fetch_array($result)) {
$mtd = ($line[3] - $lastmission) * $tpg;
$d=strtotime("+$mtd Minutes",$lastCommitTime);
$etd = date("h:i", $d);
echo "<tr><td class='queuedisplay'>$line[0]</td><td class='queuedisplay'>$line[3]</td><td class='queuedisplay'>$etd</td><td class='queuedisplay'>$line[1]</td><td class='queuedisplay'>";
echo "<a href='registration.php?action=edit&playerid=$line[2]&missionid=$line[3]' title='Edit $line[0]&apos;s information'><img src='images/edit.png' border='0' height='22'></a>&nbsp;&nbsp;";
echo "<a href='registration.php?action=delete&playerid=$line[2]&missionid=$line[3]' title='Delete $line[0] from queue'><img src='images/delete.png' border='0' height='22'></a>&nbsp;&nbsp;";
echo "</td></tr>";
}
echo "<tr><td align='center' colspan='4' class='queuedisplay'>&nbsp;</td>";
echo "</table></div>";
}
echo "</body></html>";
?>
<script type="text/javascript">
function changeIt(objval) {
oForm = document.forms["editgame"];
fAction = oForm.elements["editgame"].value;
fOldmap = oForm.elements["newmap"].value;
fOldtype = oForm.elements["newtype"].value;
fMissionid = oForm.elements["missionid"].value;
window.location.replace('http://<?php echo "$server"; ?>/pqs/registration.php?action=' + fAction + '&oldmap=' + fOldmap + '&oldtype=' + fOldtype + '&missionid=' + fMissionid)
}
</script>