You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
480 lines
22 KiB
480 lines
22 KiB
/*
|
|
<div class="col-xs-8">
|
|
<div class="row row-cols-5">
|
|
<div class="col-xs-3 col-xl-3" >
|
|
<img style="width: 17em;" src="https://media.discordapp.net/attachments/976544929566318613/1035250528554319982/pootisd.png">
|
|
</div>
|
|
<div class="col-xs-2 col-xl-2">
|
|
<img style="width: 17em;" src="https://media.discordapp.net/attachments/976544929566318613/1035250528973754428/pyro.png" >
|
|
</div>
|
|
<div class="col-xs-2 col-xl-2">
|
|
<img style="width: 17em;" src="https://media.discordapp.net/attachments/976544929566318613/1035253201563303967/toilet.png" >
|
|
</div>
|
|
<div class="col-xs-2 col-xl-2">
|
|
<img style="width: 17em;" src="https://media.discordapp.net/attachments/976544929566318613/1035250529389002862/engi_n.png" >
|
|
</div>
|
|
<div class="col-xs-3 col-xl-3">
|
|
<img style="width: 17em;" src="https://media.discordapp.net/attachments/976544929566318613/1035250529883918448/mgesold.png" >
|
|
</div>
|
|
</div>
|
|
</div>
|
|
*/
|
|
//https://icon-icons.com
|
|
const Keys = { Enter: 13 };
|
|
var api_response;
|
|
var api_prices;
|
|
|
|
function Steam3to64(steam3) {
|
|
var SID64_1 = "7656"
|
|
var SID64_S = Number(1197960265728);
|
|
var PatternSteam3ID = /^\[([Ug]):([0-9]):([0-9]+)\]$/;
|
|
var Steam3ID = PatternSteam3ID.exec(steam3);
|
|
var S3ID_3 = Number(Steam3ID[3]);
|
|
var SID64_2 = S3ID_3 + SID64_S;
|
|
return SID64_1+SID64_2;
|
|
}
|
|
|
|
function check_cookie_name(name) {
|
|
var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
|
|
if (match && match[2] != "None") { return true; }
|
|
else { return false; }
|
|
}
|
|
|
|
$(async function() {
|
|
$(document).on("keypress", "input", function (e) {
|
|
var code = e.keyCode || e.which;
|
|
if (code === Keys.Enter) {
|
|
e.preventDefault();
|
|
return false;
|
|
}
|
|
});
|
|
|
|
FillCharacters();
|
|
FillRules();
|
|
await RequestAPI();
|
|
|
|
if(window.location.href.endsWith("#RulesSection")){
|
|
$("#Rules_Button").trigger("click");
|
|
}else if(window.location.href.endsWith("#VIPSection")){
|
|
$("#Tab_VIP_Button").trigger("click");
|
|
}
|
|
});
|
|
|
|
let servers_active = `
|
|
<div class="row text-center">
|
|
<div class="col">
|
|
<hr>
|
|
<h6>Где сейчас играют карлики</h6>
|
|
</div>
|
|
</div>
|
|
`
|
|
|
|
let servers_inactive = `
|
|
<div class="row text-center">
|
|
<div class="col">
|
|
<hr>
|
|
<h6>Пустую без дела</h6>
|
|
</div>
|
|
</div>
|
|
`
|
|
|
|
let servers_dead = `
|
|
<div class="row text-center">
|
|
<div class="col">
|
|
<hr>
|
|
<h6>Временно отключены</h6>
|
|
</div>
|
|
</div>
|
|
`
|
|
|
|
let invalid_captcha = `
|
|
<div class="col" id="InvalidCaptcha">
|
|
<br>
|
|
<h1 style="color: red">ДЯДЯ ТЫ ДУРАЧЕК, КАПЧА НЕПРАВИЛЬНАЯ, ЖМИ СНОВА НА КНОПКУ</h1>
|
|
</div>
|
|
`
|
|
// use templates
|
|
function generate_server_card_div(data){
|
|
//////////////////////////////////////////
|
|
return `
|
|
<div class="col-auto justify-content-center align-self-center" style="padding: 1rem;">
|
|
<div class="card text-right" style="width: 15rem; height: 15rem;">
|
|
<img class="card-img" src="${data.preview}" alt="${data.name}" style="filter: blur(1px); height: 100%;">
|
|
<div class="card-img-overlay" style="background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.02), rgba(0, 0, 0, 0.7))"><!--background-color: rgba(0, 0, 0, 0.205);-->
|
|
<a href="#" class="stretched-link" ${data.status ? "" : "disabled"} id="ChoiceServerButton_${data.selfname.replaceAll(".","_")}" data-id="${data.selfname.replaceAll(".","_")}"></a>
|
|
<h4 class="card-title" style="color: whitesmoke;">${data.name}</h4>
|
|
<p class="card-text" style="color: whitesmoke; font-family: tf2build; font-size: 3rem; text-align: center;">${data.player_count}/${data.max_players}</p>
|
|
<h4 class="card-title" style="color: whitesmoke; text-align: right;">${human_name_impl(data)}</h4>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
`
|
|
}
|
|
|
|
function human_name_impl(data){
|
|
let number = Math.abs(data.player_count) % 100;
|
|
let number_post = number % 10;
|
|
if (number > 10 && number < 20) { return data.naming[2]; }
|
|
if (number_post > 1 && number_post < 5) { return data.naming[1]; }
|
|
if (number_post == 1) { return data.naming[0] }
|
|
return data.naming[2];
|
|
}
|
|
|
|
function bind_ServerAboutClose(){
|
|
$('#Modal_ServerAbout_Close').click(async function (ev) {
|
|
ev.preventDefault();
|
|
$('#Modal_ServerAbout').modal('hide');
|
|
});
|
|
}
|
|
|
|
function bind_ServerAboutReportPlayer_Close(){
|
|
$('#Modal_ServerAboutReportPlayer_Close').click(async function (ev) {
|
|
ev.preventDefault();
|
|
$('#Modal_ServerAboutReportPlayer').modal('hide');
|
|
$('#Modal_ServerAbout').modal('show');
|
|
});
|
|
|
|
$("#Modal_ServerAboutReportPlayer_send").click(async function (ev) {
|
|
ev.preventDefault();
|
|
$("#Modal_ServerAboutReportPlayer_error").html("");
|
|
if($('#Modal_ServerAboutReportPlayer_reason').val().length < 32){
|
|
$("#Modal_ServerAboutReportPlayer_error").html("У тебя причина говно, сделай ее более красочной. Опиши подробнее где тебя трогали.");
|
|
} else {
|
|
fetch(`https://tf2.pblr-nyk.pro/api/profile/current/report?steam64=${$('#Modal_ServerAboutReportPlayer_id').text()}&text=${$('#Modal_ServerAboutReportPlayer_reason').val()}`, {headers: {'Cache-Control':'no-cache'}, method:"POST"})
|
|
.then(res => res.json())
|
|
.then(res => {
|
|
if (res > 0) $("#Modal_ServerAboutReportPlayer_error").html("Донос отправлен!");
|
|
else $("#Modal_ServerAboutReportPlayer_error").html(`Подожди еще ${res*-1} секунд!`);
|
|
})
|
|
.catch(err => {$("#Modal_ServerAboutReportPlayer_error").html("Ошибка получения");});
|
|
}
|
|
//$("#Modal_ServerAboutReportPlayer_error").html("ЛОХ");
|
|
});
|
|
}
|
|
|
|
function bind_ServerAboutReportPlayerButton(id){
|
|
$(id).click(async function (ev) {
|
|
ev.preventDefault();
|
|
$('#Modal_ServerAbout').modal('hide');
|
|
let data = ev.currentTarget.dataset.id//.replaceAll("_",".").split("|", 2);
|
|
Modal_Fill_Report(data);
|
|
$('#Modal_ServerAboutReportPlayer').modal('show');
|
|
});
|
|
}
|
|
|
|
function Modal_Fill_Report(player_id){
|
|
//$(`#Modal_ServerAboutReportPlayer_name`).html(api_response.servers[srv].players[player_id].name);
|
|
//$(`#Modal_ServerAboutReportPlayer_srv`).html(srv);
|
|
//$(`#Modal_ServerAboutReportPlayer_id`).html(api_response.servers[srv].players[player_id].id);
|
|
$(`#Modal_ServerAboutReportPlayer_id`).html(player_id);
|
|
}
|
|
|
|
function bind_ServerAboutButton(srv_name){
|
|
$(`#ChoiceServerButton_${srv_name.replaceAll(".","_")}`).click(async function (ev) {
|
|
ev.preventDefault();
|
|
let srv = ev.currentTarget.dataset.id.replaceAll("_",".");
|
|
Modal_Fill_Choiced(srv);
|
|
$('#Modal_ServerAbout').modal('show');
|
|
});
|
|
}
|
|
|
|
function Modal_Fill_Choiced(srv){
|
|
$("#Modal_ServerAboutBody").empty();
|
|
$("#Modal_ServerAbout_Label").html(api_response.servers[srv].name);
|
|
let modal_body = `
|
|
<div class="row justify-content-center">
|
|
<div class="col text-center">
|
|
<!--<img class="w-100 h-50 rounded-5" src="${api_response.servers[srv].preview}" alt="server preview">-->
|
|
<h6>${api_response.servers[srv].description}</h6>
|
|
</div>
|
|
</div>
|
|
<hr>
|
|
<div class="row justify-content-center" id="Modal_ServerAbout_SelectButtons">`;
|
|
|
|
if (api_response.servers[srv].status) {
|
|
modal_body += `
|
|
<div class="col">
|
|
<div class="card">
|
|
<img class="card-img" src="site_content/images/logo/terminal.svg" alt="connect">
|
|
<div class="card-img-overlay d-flex flex-column">
|
|
<a href="steam://connect/${api_response.servers[srv].address}" class="stretched-link"></a>
|
|
</div>
|
|
</div>
|
|
<h5 style="text-align:center">Подключиться</h5>
|
|
</div>
|
|
`;
|
|
if (api_response.servers[srv].workshop.length != 0) {
|
|
modal_body += `
|
|
<div class="col">
|
|
<div class="card">
|
|
<img class="card-img" src="site_content/images/logo/steam.svg" alt="workshop">
|
|
<div class="card-img-overlay d-flex flex-column">
|
|
<a href="${api_response.servers[srv].workshop}" class="stretched-link"></a>
|
|
</div>
|
|
</div>
|
|
<h5 style="text-align:center">Workshop</h5>
|
|
</div>
|
|
`;} else {
|
|
modal_body += `
|
|
<div class="col">
|
|
<div class="card">
|
|
<img class="card-img" src="site_content/images/logo/steam.svg" alt="workshop">
|
|
<div class="card-img-overlay d-flex flex-column">
|
|
<a href="https://tf2.pblr-nyk.pro/tf/maps/${api_response.servers[srv].map}.bsp.bz2" class="stretched-link"></a>
|
|
</div>
|
|
</div>
|
|
<h5 style="text-align:center">Скачать карту</h5>
|
|
</div>`
|
|
}
|
|
} else {
|
|
modal_body += `<div class="col"><h5 style="text-align:center">Сервер в отключке...</h5></div>`
|
|
}
|
|
modal_body += "</div><hr>";
|
|
|
|
let allow_report = check_cookie_name("steam64");
|
|
if (api_response.servers[srv].status) {
|
|
if(api_response.servers[srv].player_count > 0) {
|
|
modal_body += `
|
|
<div class="row justify-content-center" id="Modal_ServerAbout_Players_Current">
|
|
<div class="col">
|
|
<h3 style="text-align:center">Сейчас играет ${api_response.servers[srv].player_count}/${api_response.servers[srv].max_players}</h3>
|
|
</div>
|
|
</div>`;
|
|
modal_body += `
|
|
<div class="row justify-content-center" id="Modal_ServerAbout_Players_list">
|
|
<div class="col">
|
|
<table class="table">
|
|
<thead>
|
|
<tr>
|
|
<th scope="col">Имя игрока</th>
|
|
<th scope="col">Очки</th>
|
|
<th scope="col">Время игры</th>
|
|
${allow_report?'<th scope="col">Репорт</th>':''}
|
|
</tr>
|
|
</thead>
|
|
<tbody>`;
|
|
///////////////////////////////////////////////////////////
|
|
let sorted_players = Object.keys(api_response.servers[srv].players).sort((a, b) => {
|
|
return api_response.servers[srv].players[b].score - api_response.servers[srv].players[a].score;
|
|
});
|
|
for (const player_id in sorted_players) {
|
|
if (api_response.servers[srv].players[sorted_players[player_id]].id == 0) continue;
|
|
let player = api_response.servers[srv].players[sorted_players[player_id]];
|
|
modal_body += `
|
|
<tr>
|
|
<th scope="row"><a href="${player.steam.community_url}" target="_blank" class="player-in-list">${player.name}</a></th>
|
|
<td>${player.score ? player.score : 0}</td>
|
|
<td>${player.duration}</td>
|
|
${allow_report?`<td><a href="#" id="Modal_ReportButton_${player.steam.steam64}" data-id="${player.steam.steam64}"><img style="height:1rem" src="site_content/images/logo/report.svg" alt="report"></td>`:''}
|
|
</tr>
|
|
`;
|
|
}
|
|
///////////////////////////////////////////////////////////
|
|
modal_body += `</tbody>
|
|
</table>
|
|
</div>
|
|
</div>`
|
|
} else {
|
|
modal_body += `
|
|
<div class="row justify-content-center" id="Modal_ServerAbout_Players_Current">
|
|
<div class="col">
|
|
<h3 style="text-align:center">Сейчас никто не играет</h3>
|
|
</div>
|
|
</div>`;
|
|
}
|
|
}
|
|
|
|
$(modal_body).appendTo("#Modal_ServerAboutBody");
|
|
|
|
if(allow_report && api_response.servers[srv].status && api_response.servers[srv].player_count > 0) {
|
|
for (const player_id in api_response.servers[srv].players) {
|
|
player = api_response.servers[srv].players[player_id];
|
|
bind_ServerAboutReportPlayerButton(`#Modal_ReportButton_${player.steam.steam64}`);
|
|
}
|
|
}
|
|
}
|
|
|
|
async function RequestAPI() {
|
|
//let api_request_time = (new Date).getTime();
|
|
//, {headers: {'Cache-Control':'no-cache'}}
|
|
let api_request_time = (new Date).getTime();
|
|
await fetch("https://tf2.pblr-nyk.pro/api/stats", {headers: {'Cache-Control':'no-cache'}})
|
|
.then(res => res.json())
|
|
.then(res => {
|
|
api_request_time = (new Date).getTime() - api_request_time
|
|
FillFooter("", api_request_time, "disabled");
|
|
api_response = res;
|
|
FillServices(res);
|
|
// $('#current_players').text(res.statistic.player_now)
|
|
$("#current_players").html(res.statistic.player_now);
|
|
$("#max_per_day").html(res.statistic.player_max);
|
|
$("#servers_works").html(`${res.statistic.working_servers}/${res.statistic.total_servers}`);
|
|
$("#uniq_day_players").html(res.uniq.day);
|
|
$("#uniq_month_players").html(res.uniq.month);
|
|
$("#uniq_year_players").html(res.uniq.year);
|
|
$("#ServersSectionLastUpdate").html(`Информация обновлена: ${UNIX2TIMESTAMP(res.updates.servers)}`);
|
|
$("#AboutSection_discord").html(`${res.discord_users} ГЕЙмеров `);
|
|
$("#AboutSection_vk").html(`${res.vk_users} Участников `);
|
|
$("#AboutSection_BuildDate").html(`${UNIX2TIMESTAMP(parseInt(res.builddate))}`);
|
|
$("#Section_VIP_users").html(`${res.vip_players} карликов уже имеют випку!`);
|
|
|
|
let active = false;
|
|
let inactive = false;
|
|
let dead = false;
|
|
|
|
//active servers
|
|
let sorted_servers = Object.keys(res.servers).sort((a, b) => {
|
|
return res.servers[b].player_count - res.servers[a].player_count;
|
|
});
|
|
//console.log(sorted_servers);
|
|
for (let sort_id in sorted_servers) {
|
|
let server = sorted_servers[sort_id];
|
|
if (server == `statistic`) {continue;}
|
|
res.servers[server].selfname = server;
|
|
if(res.servers[server].status == true && res.servers[server].player_count > 0) {
|
|
if(!active) {
|
|
$(servers_active).appendTo("#servers_list_v2");
|
|
active = true;
|
|
}
|
|
}
|
|
else if (res.servers[server].status == true && res.servers[server].player_count == 0) {
|
|
if(!inactive) {
|
|
$(servers_inactive).appendTo("#servers_list_v2");
|
|
inactive = true;
|
|
}
|
|
}
|
|
$(generate_server_card_div(res.servers[server])).appendTo("#servers_list_v2");
|
|
bind_ServerAboutButton(server);
|
|
}
|
|
|
|
for (let sort_id in sorted_servers) {
|
|
let server = sorted_servers[sort_id];
|
|
if (res.servers[server].status == false) {
|
|
if(!dead) {
|
|
$(servers_dead).appendTo("#servers_list_v2");
|
|
dead = true;
|
|
}
|
|
$(generate_server_card_div(res.servers[server])).appendTo("#servers_list_v2");
|
|
bind_ServerAboutButton(server);
|
|
}
|
|
}
|
|
////////////////
|
|
bind_ServerAboutClose();
|
|
bind_ServerAboutReportPlayer_Close();
|
|
}).catch((err) => {
|
|
console.log(err);
|
|
//FillFooter("", 0, 0);
|
|
});
|
|
|
|
await fetch("https://tf2.pblr-nyk.pro/api/external/vip", {headers: {'Cache-Control':'no-cache'}})
|
|
.then(res => res.json())
|
|
.then(res => {
|
|
api_prices = res;
|
|
})
|
|
|
|
//FillFooter("", api_request_time, "");
|
|
}
|
|
|
|
function FillFooter(data, api_time, player_api_time){
|
|
const text = `<p class="current-profile-text">{text}</p>`;
|
|
const text_bad = `<p class="current-profile-text current-profile-text-color-alarm">{text}</p>`;
|
|
const text_good = `<p class="current-profile-text current-profile-text-color-normal">{text}</p>`;
|
|
|
|
$("#Footer_Text").empty();
|
|
$(text.replace("{text}", `2018-${(new Date()).getFullYear()} | Факты 13 | JS: `)).appendTo("#Footer_Text");
|
|
$(text_good.replace("{text}", `on`)).appendTo("#Footer_Text");
|
|
|
|
document.getElementById("Footer_Text").insertAdjacentHTML("beforeend", text.replace("{text}", ` | API: `));//${api_time} ms
|
|
if(api_time == 0) {
|
|
document.getElementById("Footer_Text").insertAdjacentHTML("beforeend", text_bad.replace("{text}", `not work`));
|
|
} else {
|
|
document.getElementById("Footer_Text").insertAdjacentHTML("beforeend", text_good.replace("{text}", `${api_time} ms`));
|
|
}
|
|
/*
|
|
document.getElementById("Footer_Text").insertAdjacentHTML("beforeend", text.replace("{text}", ` | Player API: `));
|
|
if(player_api_time == 0) {
|
|
document.getElementById("Footer_Text").insertAdjacentHTML("beforeend", text_bad.replace("{text}", `not work`));
|
|
} else {
|
|
document.getElementById("Footer_Text").insertAdjacentHTML("beforeend", text_good.replace("{text}", `${player_api_time} ms`));
|
|
}*/
|
|
}
|
|
|
|
function FillServices(data) {
|
|
const ping_time = 90;
|
|
const text = `<p class="current-profile-text" id="{service_id}"></p>`;
|
|
|
|
//console.log(`${((new Date()).getTime() / 1000) - data.updates.qiwi_bot}`);
|
|
//console.log(`${((new Date()).getTime() / 1000) - data.updates.steam_bot}`);
|
|
|
|
if(data.updates.qiwi_bot && ((new Date()).getTime() / 1000) - data.updates.qiwi_bot < ping_time) {
|
|
document.getElementById("Footer_Text").insertAdjacentHTML("beforeend", text.replace("{service_id}","Footer_Services_QIWI"));
|
|
}
|
|
|
|
if(data.updates.steam_bot && ((new Date()).getTime() / 1000) - data.updates.steam_bot < ping_time) {
|
|
document.getElementById("Footer_Text").insertAdjacentHTML("beforeend", text.replace("{service_id}","Footer_Services_STEAM"));
|
|
}
|
|
}
|
|
|
|
function UNIX2TIMESTAMP(unix) {
|
|
return (new Date((unix + 3600 * 3) * 1000)).toGMTString().replace("GMT", "MSK");
|
|
}
|
|
|
|
function FillCharacters() {
|
|
let CharactersArray = new Array(
|
|
["site_content/images/characters/pootisd.png","site_content/sounds/pootis.mp3", ""],
|
|
["site_content/images/characters/pyro.png","site_content/sounds/alertmgs.mp3", ""],
|
|
["site_content/images/characters/toilet.png","site_content/sounds/puk.mp3", ""],
|
|
["site_content/images/characters/engi_n.png","site_content/sounds/nigger.mp3", ""],
|
|
["site_content/images/characters/mgesold.png","site_content/sounds/soldier_laughevil03.mp3", ""]
|
|
);
|
|
|
|
let InjectCharacter = ``;
|
|
|
|
$(`<div class="col-3"></div>`).appendTo("#Main_FunnyСharacters");
|
|
for (const element in CharactersArray) {
|
|
InjectCharacter = `<div class="col"><img class="img-fluid" src="${CharactersArray[element][0]}" onclick="(new Audio('${CharactersArray[element][1]}')).play();"></div>`;
|
|
if(CharactersArray[element][2]){
|
|
$(`<div class="col-5"></div>`).appendTo(`#${CharactersArray[element][2]}`);
|
|
//querySelec
|
|
//document.getElementById(CharactersArray[element][2]).insertAdjacentHTML("beforeend", `<div class="col-5"></div>`);
|
|
document.getElementById(CharactersArray[element][2]).insertAdjacentHTML("beforeend", InjectCharacter);
|
|
document.getElementById(CharactersArray[element][2]).insertAdjacentHTML("beforeend", `<div class="col-5"></div>`);
|
|
}
|
|
document.getElementById("Main_FunnyСharacters").insertAdjacentHTML("beforeend", InjectCharacter);
|
|
}
|
|
document.getElementById("Main_FunnyСharacters").insertAdjacentHTML("beforeend", `<div class="col-3"></div>`);
|
|
|
|
}
|
|
|
|
function FillRules() {
|
|
const rules = new Array(
|
|
{"name":"Читы", "about":"Бан навсегда сука", "image":"site_content/images/rules/cheats.jpg"},
|
|
{"name":"Реклама серверов", "about":"Кроме мге, бан навсегда сука", "image":"site_content/images/rules/ads.jpg"},
|
|
{"name":"Багоюз", "about":"Пиздец тебе, бан навсегда", "image":"site_content/images/rules/bug_use.jpg"},
|
|
{"name":"Абуз команды !mir", "about":"Блокировка дверей, открытие спавна и т.д", "image":"site_content/images/rules/abuse.jpg"},
|
|
{"name":"Абуз випки на сервере", "about":"Модеры сам решат как и за что", "image":"site_content/images/rules/abuse_vip.jpg"},
|
|
{"name":"Делай короче чё хочешь", "about":":troll_face:", "image":"site_content/images/rules/make_everyone.jpg"}
|
|
)
|
|
|
|
let card = ``;
|
|
|
|
for(const rule in rules) {
|
|
card = `
|
|
<div class="col-4 pb-4">
|
|
<div class="card" style="height: 18rem; background-image: url('${rules[rule].image}'); background-size: cover;">
|
|
<!--<img class="card-img" src="${rules[rule].image}" alt="читы">-->
|
|
<div class="card-img-overlay d-flex flex-column" style="background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.02), rgba(0, 0, 0, 0.7));">
|
|
<div class="mt-auto" style="text-align: right;">
|
|
<h5 style="color: white;" >${rules[rule].name}</h5>
|
|
<hr style="color: white;">
|
|
<p style="font-family: tf2secondary; color: white;">${rules[rule].about}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>`
|
|
$(card).appendTo("#Rules_List");
|
|
}
|
|
}
|
|
|
|
|
|
|