您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
try to take over the world!
当前为
// ==UserScript== // @name ClanEventHelper // @namespace https://greasyfork.org/ru/scripts/396872-claneventhelper // @version 3.0 // @description try to take over the world! // @author You // @include /^https{0,1}:\/\/((www|qrator)\.heroeswm\.ru|178\.248\.235\.15)\/clan_info.+/ // @grant unsafeWindow // ==/UserScript== (function (window, undefined) { let w; if (typeof unsafeWindow !== undefined) { w = unsafeWindow; } else { w = window; } if (w.self !== w.top) { return; } if(!unsafeWindow.updateTable) { unsafeWindow.updateTable = updateTable; } let isInCW = document.querySelector("body > center > table > tbody > tr > td > table > tbody > tr > td > table:nth-child(2) > tbody > tr:nth-child(1) > td:nth-child(2) > img") == null; let tds = document.querySelector("body > center > table > tbody > tr > td > table > tbody > tr > td > table:nth-child(2) > tbody > tr:nth-child(1)").querySelectorAll("td").length; class ClanMember { constructor(id, nick, cl, eventPoints) { this.id = id; this.nick = nick; this.cl = cl; this.eventPoints = eventPoints; } } let clanMembers = []; let clanMembersByCL = new Map(); fillClanMembers(); fillClanMembersByCl(); let eventMaxWave = setEventMaxWave(); let tempEventMaxWave = JSON.parse(JSON.stringify(eventMaxWave)); addContainerToDOM(); addTableToDOM(); if (isInCW && tds === 5 || tds === 6){ setPolzynok(); setStyle(); } function updateTable() { let rng = document.getElementById('bestInput'); //rng - это Input let p = document.getElementById('one'); // p - абзац tempEventMaxWave = rng.value; p.innerHTML = "До волны: " + rng.value; removeElement("members-table"); addTableToDOM(); } function addContainerToDOM() { let s = `<center><div id="members-container" style="width:100%; background: white; border: 1px black solid"></div></center>`; document.querySelector("body > center > table > tbody > tr > td > table > tbody > tr > td > table:nth-child(1)").insertAdjacentHTML('afterend', s) } function addTableToDOM() { let s = `<table id="members-table" cellpadding="5" class="ololo">`; s += `<thead class="bestP"> <td style="width:7%"><div style="">БУ</div></td> <td colspan="2" style="width:20%"><div style="">Топ рез у</div></td> <td style="width:80%"><div style="">Тянущие клан на дно</div></td> </thead>`; for (let [key, value] of clanMembersByCL.entries()) { let membersWithMaxWave = getAllWithMaxWaveCount(value); let membersWithNoMaxWave = getAllWithNoMaxWave(value); let percetageWithMaxWave = (membersWithMaxWave / value.length) * 100; s += `<tr> <td>` + key + `</td> <td>` + membersWithMaxWave + ` из ` + value.length + `</td> <td>` + percetageWithMaxWave.toFixed(2) + `%</td> <td>` + arrayToString(membersWithNoMaxWave) + ` </td> </tr>` } let membersWithMaxWave = getAllWithMaxWaveCount(clanMembers); let lost = getAllWithNoMaxWaveLost(clanMembers); let percetageWithMaxWave = (membersWithMaxWave / clanMembers.length) * 100; let lastTd; if (lost === 0) { lastTd = "<td>В клане все красавчики</td>" } if (lost === 0 && clanMembers.length < 200){ lastTd = `<td>Из-за недостачи игроков клан потерял <b style='color: red'>` + (lost +(200 - clanMembers.length)*eventMaxWave) + `</b> очков</td>` } if (lost > 0) { lastTd = `<td>Из-за <b>?#A*&%!</b> клан потерял <b style='color: red'>` + (lost +(200 - clanMembers.length)*eventMaxWave) + `</b> очков</td>` } if (lost > 0 && clanMembers.length < 200) { lastTd = `<td>Из-за <b>?#A*&%!</b> и недостачи игроков клан потерял <b style='color: red'>` + (lost +(200 - clanMembers.length)*eventMaxWave) + `</b> очков</td>` } s += `<tr> <td>Всего:</td> <td colspan="2">` + membersWithMaxWave + " из " + clanMembers.length + ` [` + percetageWithMaxWave.toFixed(2) + `%] <br> avg. wave: ` + getAvgWave() +`</td> ` + lastTd + ` </tr>`; s += `<tr> <td>Красавчики:</td> <td colspan="3">` + arrayToString(getAllWithMaxWave(clanMembers)) +`</td> </tr>`; s += `</table>`; document.getElementById("members-container").insertAdjacentHTML('beforeend', s) } function fillClanMembers() { let trs = document.querySelector("body > center > table > tbody > tr > td > table > tbody > tr > td > table:nth-child(2) > tbody").querySelectorAll("tr"); for (let i = 0; i < trs.length; i++) { clanMembers.push(createClanMember(trs[i])) } } function setEventMaxWave() { let max = clanMembers[0].eventPoints; for (let i = 1; i < clanMembers.length; i++) { if (max < clanMembers[i].eventPoints) { max = clanMembers[i].eventPoints } } return max; } function getAvgWave() { let sum = 0; for (let i = 0; i < clanMembers.length; i++) { sum+=clanMembers[i].eventPoints; } return (sum/clanMembers.length).toFixed(2) } function fillClanMembersByCl() { for (let i = 5; i < 24; i++) { let tempClanMembersByCL = getClanMembersByCL(i); if (tempClanMembersByCL.length !== 0) { clanMembersByCL.set(i, tempClanMembersByCL); } } } function createClanMember(tr) { let clanMember = new ClanMember(); let isInCW = document.querySelector("body > center > table > tbody > tr > td > table > tbody > tr > td > table:nth-child(2) > tbody > tr:nth-child(1) > td:nth-child(2) > img") == null; let startTd = 3; if (isInCW) { startTd = 2 } clanMember.id = tr.querySelector("td:nth-child("+ startTd +") > a").getAttribute("href"); clanMember.nick = tr.querySelector("a.pi").innerText; clanMember.cl = parseInt(tr.querySelector("td:nth-child("+ (startTd+1)+")").innerText); clanMember.eventPoints = parseInt(tr.querySelector("td:nth-child("+(startTd+3) +")").innerText.trim().replace(",", "")); clanMember.eventPoints = isNaN(clanMember.eventPoints) ? 0 : clanMember.eventPoints; return clanMember; } function getClanMembersByCL(cl) { let members = []; for (let i = 0; i < clanMembers.length; i++) { if (clanMembers[i].cl === cl) { members.push(clanMembers[i]) } } return members; } function getAllWithMaxWaveCount(members) { let count = 0; for (let i = 0; i < members.length; i++) { if (members[i].eventPoints >= tempEventMaxWave) { count++ } } return count; } function getAllWithMaxWave(members) { members.sort((a, b) => (a.eventPoints > b.eventPoints) ? 1 : ((b.eventPoints > a.eventPoints) ? -1 : 0)); let membersTemp = []; for (let i = 0; i < members.length; i++) { console.log(members[i].eventPoints, tempEventMaxWave); if (members[i].eventPoints-0 >= tempEventMaxWave-0) { membersTemp.push("<a style='text-decoration: none;' href=\""+members[i].id + "\"><b>"+members[i].nick + "</b></a> : <b style='color: red'>" + members[i].eventPoints + "</b>") } } return membersTemp; } function getAllWithNoMaxWave(members) { members.sort((a, b) => (a.eventPoints > b.eventPoints) ? 1 : ((b.eventPoints > a.eventPoints) ? -1 : 0)); let membersTemp = []; for (let i = 0; i < members.length; i++) { if (members[i].eventPoints < tempEventMaxWave) { membersTemp.push("<a style='text-decoration: none;' href=\""+members[i].id + "\"><b>"+members[i].nick + "</b></a> : <b style='color: red'>" + members[i].eventPoints + "</b>") } } return membersTemp; } function getAllWithNoMaxWaveLost(members) { members.sort((a, b) => (a.eventPoints > b.eventPoints) ? 1 : ((b.eventPoints > a.eventPoints) ? -1 : 0)); let lost = 0; for (let i = 0; i < members.length; i++) { if (members[i].eventPoints < tempEventMaxWave) { lost += eventMaxWave - members[i].eventPoints; } } return lost; } function arrayToString(array) { if (array.length === 0) { return "Таких нет, все красавчики." } let str = ""; for (let i = 0; i < array.length; i++) { str += array[i]; if (i < array.length - 1) { str += "; " } } return str; } function removeElement(id) { let elem = document.getElementById(id); return elem.parentNode.removeChild(elem); } function setPolzynok() { console.log("eventMaxWave",tempEventMaxWave); let myDiv = ` <input id="bestInput" class ="myPolzynok" type="range" min="1" max="${eventMaxWave}" step="1" value="${eventMaxWave}" oninput="updateTable()"> </br> <p class="bestP" id="one">До волны: ${tempEventMaxWave}</p> `; document.getElementById("members-container").insertAdjacentHTML("afterbegin", myDiv); } function setStyle() { let style = document.createElement('style'); style.type = 'text/css'; style.innerHTML = ` .myPolzynok { -webkit-appearance: none; margin: 18px 0; width: 40%; } table.ololo td { text-align: center; } table.ololo { border-collapse: collapse; } table.ololo td { border: 2px solid #c0deff; } table.ololo tr:first-child td { border-top: 0; } table.ololo tr td:first-child { border-left: 0; } table.ololo tr:last-child td { border-bottom: 0; } table.ololo tr td:last-child { border-right: 0; } .myPolzynok:focus { outline: none; } .myPolzynok:focus { outline: none; } .myPolzynok::-webkit-slider-runnable-track { width: 100%; height: 8.4px; cursor: pointer; animate: 0.2s; box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; background: #3071a9; border-radius: 1.3px; border: 0.2px solid #010101; } .myPolzynok::-webkit-slider-thumb { box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; border: 1px solid #000000; height: 36px; width: 16px; border-radius: 3px; background: #ffffff; cursor: pointer; -webkit-appearance: none; margin-top: -14px; } .myPolzynok:focus::-webkit-slider-runnable-track { background: #367ebd; } .myPolzynok::-moz-range-track { width: 100%; height: 8.4px; cursor: pointer; animate: 0.2s; box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; background: #3071a9; border-radius: 1.3px; border: 0.2px solid #010101; } .myPolzynok::-moz-range-thumb { box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; border: 1px solid #000000; height: 36px; width: 16px; border-radius: 3px; background: #ffffff; cursor: pointer; } .myPolzynok::-ms-track { width: 100%; height: 8.4px; cursor: pointer; animate: 0.2s; background: transparent; border-color: transparent; border-width: 16px 0; color: transparent; } .myPolzynok::-ms-fill-lower { background: #2a6495; border: 0.2px solid #010101; border-radius: 2.6px; box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; } .myPolzynok::-ms-fill-upper { background: #3071a9; border: 0.2px solid #010101; border-radius: 2.6px; box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; } .myPolzynok::-ms-thumb { box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; border: 1px solid #000000; height: 36px; width: 16px; border-radius: 3px; background: #ffffff; cursor: pointer; } .myPolzynok:focus::-ms-fill-lower { background: #3071a9; } .myPolzynok:focus::-ms-fill-upper { background: #367ebd; } .bestP { color: red; font-size: 20px !important; text-shadow: 1px 0 0 #000, 0 -1px 0 #000, 0 1px 0 #000, -1px 0 0 #000; } thead.bestP td { color: red; border-bottom:1px solid black !important; border-top:1px solid black !important; font-size: 20px !important; text-shadow: 1px 0 0 #000, 0 -1px 0 #000, 0 1px 0 #000, -1px 0 0 #000; } `; document.getElementsByTagName('head')[0].appendChild(style); } })(window);