Подсчёт племенных оффов

  • Автор темы Deleted member 46490
  • Дата начала

DeletedUser

Гость
На днях заглянул на польский форум и решил нагло спи позаимствовать полезный скрипт; на всякий случай перевёл на русский.

В обзоре племени проходится по всем игрокам у которых открыт обзор войск и составляет таблицу (можно для форума таблицу, можно для экселя) с фуллоффами, 3/4 оффами, 1/2 оффами и 1/4 оффами.

Запускается на странице обзора участников племени, в разделе "войска".

Из особенностей подсчёта:
расчёт идёт исходя из населения которое занимают офф-юниты. Если у вас до фуллофа не хватает 10 юнитов, то скрипт посчитает это как 3/4 фуллоффа.

javascript: $.getScript("https://pastebin.com/raw/N8xT1Vmj"); void(0);

В зависимости от настроек браузера скрипт с пастебина может не работать. Тогда пробуйте код отсюда.
Код:
javascript:function _instanceof(e,t){return null!=t&&"undefined"!=typeof Symbol&&t[Symbol.hasInstance]?!!t[Symbol.hasInstance](e):e instanceof t}function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function _objectSpread(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(n),!0).forEach(function(t){_defineProperty(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function _classCallCheck(e,t){if(!_instanceof(e,t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}var PREFIX="kichowaty_",CSV="csv",tribalwars="tribalwars",UNITS=["spear","axe","sword","archer","light","spy","marcher","heavy","catapult","ram","snob"],DEF_UNITS=["spear","sword","archer","marcher","heavy"],OFF_UNITS=["axe","light","marcher","catapult","ram"],withPrefix=function(e){return PREFIX+e},CountOffVillages=function(){function e(){_classCallCheck(this,e),this.containerSelector="#ally_content",this.extensionRadioInputNameAndID=withPrefix("extension"),this.placesInFarmInputID=withPrefix("places"),this.placesInFarmInputSelector="#"+this.placesInFarmInputID,this.formID=withPrefix("form"),this.formSelector="#"+this.formID,this.playerIDsSelector="#ally_content .input-nicer option:not([disabled])",this.fullOff=2e4,this.dialogID=withPrefix("dialog"),this.resultID=withPrefix("result"),this.resultSelector="#"+this.resultID,this.render()}return _createClass(e,[{key:"getURL",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=new URLSearchParams(window.location.search);return t.set("player_id",e),"".concat(window.location.origin).concat(window.location.pathname,"?").concat(t.toString())}},{key:"calculatePlacesInFarmForUnit",value:function(e,t){return["axe","spear","sword","archer"].includes(e)?t:"light"===e?4*t:"spy"===e?2*t:["ram","marcher"].includes(e)?5*t:"heavy"===e?6*t:"catapult"===e?8*t:"knight"===e?10:"snob"===e?100*t:0}},{key:"isOffensiveVillage",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=0;DEF_UNITS.forEach(function(r){n+=e.calculatePlacesInFarmForUnit(r,e.sanitizeTroops(t[r]))});var r=0;OFF_UNITS.forEach(function(n){r+=e.calculatePlacesInFarmForUnit(n,e.sanitizeTroops(t[n]))});var a=this.calculatePlacesInFarmForUnit("spy",this.sanitizeTroops(t.spy));return r>a&&r>n}},{key:"parseHTML",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=(new DOMParser).parseFromString(e,"text/html"),n=t.querySelectorAll(".table-responsive .vis tr"),r={fullOff:{value:0},threeFourthOff:{value:0},halfOff:{value:0},oneFourthOff:{value:0}};if(void 0!==n[0]){var a=n[0].querySelectorAll("img");a.forEach(function(e){if(e.getAttribute("src").includes("graphic/unit/unit")){var t=e.src.split("graphic/unit/unit_")[1].replace(".png","");UNITS.includes(t.toLowerCase())&&(r[t]={index:e.parentNode.cellIndex,value:0})}})}for(var i=1;i<n.length;i++){var o=n[i].querySelectorAll("td"),l={},c=0;for(var s in r)if(r[s].index){var u=parseInt(o[r[s].index].innerText.trim().replace(".",""));isNaN(u)||(r[s].value+=u,l[s]={value:u},c+=this.calculatePlacesInFarmForUnit(s,u))}this.isOffensiveVillage(l)&&(c>this.fullOffPlacesInFarm?r.fullOff.value++:c>Math.floor(.75*this.fullOffPlacesInFarm)?r.threeFourthOff.value++:c>Math.floor(this.fullOffPlacesInFarm/2)?r.halfOff.value++:c>Math.floor(this.fullOffPlacesInFarm/4)&&r.oneFourthOff.value++)}return r}},{key:"getPlayerTroops",value:async function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=await fetch(this.getURL(e)),n=await t.text(),r=this.parseHTML(n);return r}},{key:"updateLoadingMarkup",value:function(e,t){document.querySelector(this.resultSelector).innerHTML="Загружено ".concat(e," из ").concat(t," игроков")}},{key:"sanitizeTroops",value:function(e){return e&&e.value?e.value:0}},{key:"toCSV",value:function(e){var t=this,n="Имя игрока,Фуллоффы,3/4 оффа,1/2 оффа,1/4 оффа";return e.forEach(function(e){n+="\n".concat(e.nick,",").concat(t.sanitizeTroops(e.troops.fullOff),",").concat(t.sanitizeTroops(e.troops.threeFourthOff),",").concat(t.sanitizeTroops(e.troops.halfOff),",").concat(t.sanitizeTroops(e.troops.oneFourthOff))}),n}},{key:"toTribalwarsTable",value:function(e){var t=this,n="[table][**]Имя игрока[||]Фуллоффы[||]3/4 оффа[||]1/2 оффа[||]1/4 оффа[/**]";return e.forEach(function(e){n+="\n[*][player]".concat(e.nick,"[/player][|]").concat(t.sanitizeTroops(e.troops.fullOff),"[|]").concat(t.sanitizeTroops(e.troops.threeFourthOff),"[|]").concat(t.sanitizeTroops(e.troops.halfOff),"[|]").concat(t.sanitizeTroops(e.troops.oneFourthOff))}),n+="[/table]",n}},{key:"getResultMarkup",value:function(e){return'\n        <div>\n            <h1>Эй, вот результаты!</h1>\n            <textarea rows="50" cols="50" readonly>'.concat(e,"</textarea>\n        </div>\n    ")}},{key:"handleFormSubmit",value:async function(e){e.preventDefault();var t=this.players;window.Dialog.show(this.dialogID,this.loadingMarkup);for(var n=0;n<t.length;n++){if(window.Dialog.active_id!==this.dialogID)return;var r=t[n];await new Promise(function(e){return setTimeout(e,400)});var a=await this.getPlayerTroops(r.id);t[n]=_objectSpread({},t[n],{troops:a}),this.updateLoadingMarkup(n+1,t.length)}window.Dialog.close(),window.Dialog.show(this.dialogID,this.getResultMarkup(e.target[1].checked?this.toTribalwarsTable(t):this.toCSV(t)))}},{key:"bindListeners",value:function(){document.querySelector(this.formSelector).addEventListener("submit",this.handleFormSubmit.bind(this))}},{key:"render",value:function(){var e=document.querySelector(this.containerSelector);if(!e)throw new Error("Invalid container selector");var t=document.createElement("div");t.innerHTML=this.UIMarkup,e.prepend(t),this.bindListeners()}},{key:"UIMarkup",get:function(){return'\n            <form id="'.concat(this.formID,'">\n                <div>\n                    <label for="').concat(this.placesInFarmInputID,'">Сколько фуллофф занимает населения: </label>\n                    <input type="number" min="1" max="25000" value="20000" id ="').concat(this.placesInFarmInputID,'" >\n                </div>\n                <p>Выберите формат: </p>\n                <div>\n                    <input type="radio" name="').concat(this.extensionRadioInputNameAndID,'" id="').concat(this.extensionRadioInputNameAndID+"_1",'" value="').concat(tribalwars,'" checked>\n                    <label for="').concat(this.extensionRadioInputNameAndID+"_1",'">Таблица для форума</label>\n                </div>\n                <div>\n                    <input type="radio" name="').concat(this.extensionRadioInputNameAndID,'" id="').concat(this.extensionRadioInputNameAndID+"_2",'" value="').concat(CSV,'">\n                    <label for="').concat(this.extensionRadioInputNameAndID+"_2",'">CSV</label>\n                </div>\n                <button>Подсчёт оффов</button>\n            </form>\n        ')}},{key:"fullOffPlacesInFarm",get:function(){return parseInt(document.querySelector(this.placesInFarmInputSelector).value)}},{key:"loadingMarkup",get:function(){return'\n      <div>\n          Идёт загрузка данных...\n          <p id="'.concat(this.resultID,'"></p>\n      </div>\n    ')}},{key:"players",get:function(){var e=document.querySelectorAll(this.playerIDsSelector),t=[];return e.forEach(function(e){"Wybierz czЕ‚onka"!=e.value&&t.push({id:e.value,nick:e.innerHTML.trim()})}),t}}]),e}();new CountOffVillages;void( 0 );

На форуме таблица выглядит так:
2020-07-09_15-12-53.png




При запуске:
2020-07-09_14-51-59.png

p.s Я в нём особо не разбирался, проверил на работоспособность и заботливо перевёл.
 
Последнее редактирование модератором:

Akkela

Кавалерист
Член команды
Модератор
Оценка реакций
74
Скрипт одобрен.
Лично у меня на стандартных настройках Chromium не хочет подгружать его с пастебина.
Если у вас тоже ничего не происходит - скопируйте скрипт из второго спойлера.

С ув., Евгений
 

DeletedUser

Гость
В правилах не нашёл, ограничений гетзапросы нет? те можно подгрузить инфу с 20 страниц и дальше работать с ней. Верно?
 
Последнее редактирование модератором:

Akkela

Кавалерист
Член команды
Модератор
Оценка реакций
74
В правилах не нашёл, ограничений гетзапросы нет? те можно подгрузить инфу с 20 страниц и дальше работать с ней. Верно?
Как раз они и запрещены. У нас с ними как с канабиойдами в Голландии - в общем и целом не легально, но в определенных местах при соблюдении свода правил можем отдельным решением терпеть.
 

SoulArhiMaster

Паладин
Оценка реакций
1.015
Как раз они и запрещены. У нас с ними как с канабиойдами в Голландии - в общем и целом не легально, но в определенных местах при соблюдении свода правил можем отдельным решением терпеть.
терпят они
на продвинутых серверах все разрешено, главное не слать более 5 запросов в секунду и особо не трогать биржу, все боитесь как бы люди чего-то хорошего не понаписали
 

DeletedUser

Гость
Как раз они и запрещены. У нас с ними как с канабиойдами в Голландии - в общем и целом не легально, но в определенных местах при соблюдении свода правил можем отдельным решением терпеть.
Я так понимаю, главный критерий одобрения — это то, что скрипт должен работать на повышение юзабилити, а не на преимущество; те условно, если я хочу отрисовать таблицу в которой будут несколько обратных отсчётов: на постройку, на вывод войск из под атак, на окончание поисков, на конец очереди в казарме (во всех дерах сразу), то можно и дофига запросов сделать, но если я хочу запустить скрипт записывающий в буфер или в локалсторедж время когда кинули в меня атаку, (причём без гет запросов вообще,) то тк это преимущество, такой использовать не можно. Да?
 
Верх