to those looking for a mass retirement script. this should work. I had copiolot help me and had it tested and worked.
// ==UserScript==
// @name GLB – Bulk Player Retirement (matches real form)
// @namespace goallineblitz.com
// @version 2026.05.01
// @description Retire multiple players from home.pl using the real retire form
// @match
https://glb.warriorgeneral.com/game/home.pl*// @grant none
// ==/UserScript==
(function () {
'use strict';
// 1) Find the player table on home page
const table = document.querySelector("table.player_list, #playerTable, table.players");
if (!table) return;
const rows = table.querySelectorAll("tr");
if (rows.length < 2) return;
// 2) Add header columns + Select All
const header = rows[0];
header.insertAdjacentHTML(
"beforeend",
`<th>Retire?</th><th>Delete Name?</th><th><a id="bulk_select_all" style="cursor

ointer;">Select ALL</a></th>`
);
document.getElementById("bulk_select_all").addEventListener("click", () => {
const boxes = document.querySelectorAll(".bulk_retire, .bulk_keepname");
const allChecked = [...boxes].every(b => b.checked);
boxes.forEach(b => (b.checked = !allChecked));
});
// 3) Add per-player checkboxes
rows.forEach((row, idx) => {
if (idx === 0) return;
const link = row.querySelector("a[href*='player_id=']");
if (!link) return;
const playerId = new URL(link.href).searchParams.get("player_id");
row.insertAdjacentHTML(
"beforeend",
`<td><input type="checkbox" class="bulk_retire" data-id="${playerId}"></td>
<td><input type="checkbox" class="bulk_keepname" title="Checked = keep name; unchecked = delete name"></td>`
);
});
// 4) Add main button
const btn = document.createElement("button");
btn.textContent = "Retire Selected Players";
btn.style.margin = "10px";
btn.style.padding = "6px 12px";
btn.style.cursor = "pointer";
table.before(btn);
// Helper: retire a single player by mimicking the form
async function retireOne(playerId, keepName, password) {
// Load retire page first (to mimic navigation; also ensures session is valid)
await fetch(`/game/retire_player.pl?player_id=${playerId}`, { credentials: "same-origin" });
// Now submit the same fields the form uses
const body = new URLSearchParams();
body.set("player_id", playerId);
body.set("keep_name", keepName ? "1" : "0"); // 1 = keep, 0 = rename to "Retired Player"
body.set("password", password);
body.set("action", "Retire");
const res = await fetch(`/game/retire_player.pl?player_id=${playerId}`, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: body.toString(),
credentials: "same-origin"
});
return res.text();
}
// 5) Click handler
btn.addEventListener("click", async () => {
const selected = [...document.querySelectorAll(".bulk_retire:checked")];
if (selected.length === 0) {
alert("No players selected.");
return;
}
const password = prompt(`Enter your password to retire ${selected.length} players:`);
if (!password) return;
btn.disabled = true;
let done = 0;
btn.textContent = `Retiring... (0/${selected.length})`;
for (const cb of selected) {
const playerId = cb.dataset.id;
const keepNameBox = cb.parentElement.nextElementSibling.querySelector(".bulk_keepname");
const keepName = keepNameBox && keepNameBox.checked;
try {
const html = await retireOne(playerId, keepName, password);
// crude success check: look for "Retire Player" form disappearing or some confirmation text
if (html.includes("Retire Player") && html.includes("THIS PROCESS IS PERMANENT")) {
// probably failed (still on retire page)
console.log(`Possible failure retiring player ${playerId}`);
} else {
cb.closest("tr").style.opacity = "0.4";
}
} catch (e) {
console.log(`Error retiring player ${playerId}`, e);
}
done++;
btn.textContent = `Retiring... (${done}/${selected.length})`;
}
btn.textContent = "Done!";
setTimeout(() => location.reload(), 1500);
});
})();