ClanEventHelper

try to take over the world!

目前为 2020-08-28 提交的版本。查看 最新版本

// ==UserScript==
// @name         ClanEventHelper
// @namespace    https://gf.qytechs.cn/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);

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址