Files
cs2-rcon-panel/public/js/console.js
T
2026-06-22 19:33:34 +02:00

319 lines
11 KiB
JavaScript

$(document).ready(function () {
const current_path = window.location.pathname;
function fetch_servers() {
$.ajax({
url: "/api/servers",
type: "GET",
success: function (data) {
$("#serverList").empty();
data.servers.forEach(function (server) {
const card = `
<div class="card server-card">
<div class="card-header">
<h3 class="card-title">${server.hostname} (${server.serverIP}:${server.serverPort})</h3>
</div>
<div class="card-body">
RCON Password: <input type="password" id="rconPassword" class="rcon-password-${server.id}" value="${server.rconPassword}" class="password-mask" disabled>
<button class="btn btn-sm btn-secondary toggle-password" server-id="${server.id}" class="hide-unhide-rcon">
<i class="fa fa-eye" server-id="${server.id}" id="toggleEyeIcon-${server.id}"></i>
</button>
<p class="status connected-status ${server.connected ? "connected" : "disconnected"}">
RCON Connected: ${server.connected ? "Yes" : "No"}
</p>
<p class="status authenticated-status ${server.authenticated ? "authenticated" : "not-authenticated"}">
RCON Authenticated: ${server.authenticated ? "Yes" : "No"}
</p>
${!server.connected || !server.authenticated ? '<button class="btn btn-success" server-id="' + server.id + '" id="reconnect_server">Reconnect</button>' : ""}
<a href="/manage/${server.id}" class="btn btn-primary">Manage</a>
<button class="btn btn-danger" server-id='${server.id}' id="delete_server">Delete</button>
</div>
</div>
`;
$("#serverList").append(card);
});
$(".toggle-password").click((event) => {
let server_id = $(event.target).attr("server-id");
toggle_password_visibility(server_id);
});
$("#reconnect_server").click(async (element) => {
try {
const server_id = $(element.target).attr("server-id");
const response = await $.ajax({
url: "/api/reconnect-server",
type: "POST",
data: JSON.stringify({ server_id: server_id }),
headers: {
"Content-Type": "application/json",
},
});
if (response.status === 200) {
fetch_servers();
} else {
console.error(
"Server responded with a non-200 status code:",
response.status,
);
alert("An error occurred while reconnecting to the server.");
}
} catch (error) {
console.error(error);
alert("An error occurred while reconnecting to the server.");
}
});
$("#delete_server").click(async (element) => {
const confirmed = confirm(
"Are you sure you want to delete this server?",
);
if (confirmed) {
window.server_id = $(element.target).attr("server-id");
await send_post_request("/api/delete-server");
fetch_servers();
}
});
},
error: function (error) {
console.error(error);
alert("An error occurred while fetching servers.");
},
});
}
if (current_path == "/servers") {
fetch_servers();
}
function toggle_password_visibility(server_id) {
const password_field = document.getElementsByClassName(
"rcon-password-" + server_id,
)[0];
const eye_icon = document.getElementById(`toggleEyeIcon-${server_id}`);
if (password_field.type === "password") {
password_field.type = "text";
eye_icon.classList.remove("fa-eye");
eye_icon.classList.add("fa-eye-slash");
} else {
password_field.type = "password";
eye_icon.classList.remove("fa-eye-slash");
eye_icon.classList.add("fa-eye");
}
}
async function send_post_request(apiEndpoint, data = {}) {
try {
data.server_id = window.server_id;
const response = await fetch(apiEndpoint, {
method: "POST",
body: JSON.stringify(data),
headers: {
"Content-Type": "application/json",
},
});
if (response.ok) {
const data = await response.json();
console.log(data.message);
if (apiEndpoint == "/api/rcon") {
if (data.message.includes("Response received")) {
$("#rconResultBox").show();
$("#rconResultText").text(
data.message.split("Command sent! Response received:")[1],
);
} else {
$("#rconResultBox").hide();
alert(data.message);
}
} else {
alert(data.message);
}
} else if (response.status == 401) {
alert("Unauthorized, please reload and relogin.");
} else {
alert("Failed to perform the action");
}
} catch (error) {
console.error("Error:", error);
alert("An error occurred");
}
}
$("#pause_game").on("click", function () {
if (confirm("Are you sure you want to pause the game?")) {
send_post_request("/api/pause");
}
});
$("#unpause_game").on("click", function () {
if (confirm("Are you sure you want to unpause the game?")) {
send_post_request("/api/unpause");
}
});
$("#restart_game").on("click", function () {
if (confirm("Are you sure you want to restart the game?")) {
send_post_request("/api/restart");
}
});
$("#start_warmup").on("click", function () {
if (confirm("Are you sure you want to start the warm-up?")) {
send_post_request("/api/start-warmup");
}
});
$("#swap_team").on("click", function () {
if (confirm("Are you sure you want to swap teams?")) {
send_post_request("/api/swap-team");
}
});
$("#go_live").on("click", function () {
if (confirm("Are you sure you want to go live?")) {
send_post_request("/api/go-live");
}
});
$("#rconInputBtn").on("click", function () {
let data = {
command: $("#rconInput").val(),
};
send_post_request("/api/rcon", data);
$("#rconInput").val("");
});
$("#say_input_btn").on("click", function () {
let data = {
message: $("#say_input").val(),
};
send_post_request("/api/say-admin", data);
$("#say_input").val("");
});
$("#list_backups").on("click", function () {
send_post_request("/api/list-backups");
});
$("#restore_latest_backup").on("click", function () {
if (confirm("Are you sure you want to restore the latest round backup?")) {
send_post_request("/api/restore-latest-backup");
}
});
$("#restore_backup").on("click", function () {
const round_number = prompt("Enter round number to restore:");
if (round_number !== null && round_number.trim() !== "") {
const round_number_value = parseInt(round_number);
if (!isNaN(round_number_value)) {
send_post_request("/api/restore-round", {
round_number: round_number_value,
});
} else {
alert("Invalid round number. Please enter a valid number.");
}
} else {
alert("Round number cannot be empty. Please enter a valid number.");
}
});
$("#server_setup_form").on("submit", async function (event) {
event.preventDefault();
const data = {
team1: $("#team1").val(),
team2: $("#team2").val(),
map: $("#map").val(),
game: $("#game").val(),
server_id: window.server_id,
};
send_post_request("/api/setup-game", data);
});
$("#game").on("change", function () {
var map_list = [];
var e = document.getElementById("game");
if (e.value == "1" || e.value == "2" || e.value == "3" || e.value == "4") {
// CASUAL OR COMPETITIVE
// CS maps
//map_list.push("cs_agency");
map_list.push("cs_italy");
map_list.push("cs_office");
// DE maps (community)
//map_list.push("de_basalt");
map_list.push("de_edin"); // 3328169568
map_list.push("de_grail"); // 3246527710
//map_list.push("de_golden");
//map_list.push("de_jura");
//map_list.push("de_mills");
//map_list.push("de_palacio");
map_list.push("de_thera"); // 3121217565
map_list.push("de_warden");
// DE maps (valve)
map_list.push("de_ancient");
map_list.push("de_ancient_night");
map_list.push("de_anubis");
map_list.push("de_cache");
map_list.push("de_dust2");
map_list.push("de_inferno");
map_list.push("de_mirage");
map_list.push("de_nuke");
map_list.push("de_overpass");
map_list.push("de_train");
map_list.push("de_vertigo");
// WINGMAN maps
map_list.push("de_assembly"); // 3071005299
map_list.push("de_brewery"); // 2870304806
map_list.push("de_dogtown"); // 3414036782
//map_list.push("de_maginot"); // 3195399109
map_list.push("de_memento"); // 3165559377
map_list.push("de_mirage_bricks"); // 3464733042
map_list.push("de_palais"); // 3257582863
map_list.push("de_poseidon");
map_list.push("de_rainfall"); // 3265650949
map_list.push("de_rooftop"); // 3536622725
map_list.push("de_sanctum");
map_list.push("de_transit"); // 3542662073
map_list.push("de_whistle"); // 3308613773
} else if (e.value == "5") {
// WINGMAN
// DE maps (valve)
map_list.push("de_inferno");
map_list.push("de_nuke");
map_list.push("de_overpass");
map_list.push("de_vertigo");
// Community maps
map_list.push("de_assembly"); // 3071005299
map_list.push("de_brewery"); // 2870304806
map_list.push("de_dogtown"); // 3414036782
//map_list.push("de_maginot"); // 3195399109
map_list.push("de_memento"); // 3165559377
map_list.push("de_mirage_bricks"); // 3464733042
map_list.push("de_palais"); // 3257582863
map_list.push("de_poseidon");
map_list.push("de_rainfall"); // 3265650949
map_list.push("de_rooftop"); // 3536622725
map_list.push("de_sanctum");
map_list.push("de_transit"); // 3542662073
map_list.push("de_whistle"); // 3308613773
} else if (e.value == "6") {
// arms race
map_list.push("ar_baggage");
map_list.push("ar_pool_day");
map_list.push("ar_shoots");
map_list.push("ar_shoots_night");
} else if (e.value == "7") {
// other
// WORKSHOP
map_list.push("de_inferno_prophunt"); // 3608612434
map_list.push("cs_office_prophunt"); // 3644811896
map_list.push("de_mirage_prophunt"); // 3615968422
}
$("#map").empty();
for (var i = 0; i < map_list.length; i++) {
const opt =
'<option value="' + map_list[i] + '">' + map_list[i] + "</option>";
$("#map").append(opt);
}
});
});