HWH Price per battle in transfers

В протоколе передач добавляет цену за бой, общую сумму дивидендов за акции предприятий. В протоколе кузнецов в шапке показывает время завершения текущего ремонта

// ==UserScript==
// @name        HWH Price per battle in transfers
// @namespace   Zeleax
// @description В протоколе передач добавляет цену за бой, общую сумму дивидендов за акции предприятий. В протоколе кузнецов в шапке показывает время завершения текущего ремонта
// @include /https?:\/\/(www.heroeswm.ru|178.248.235.15|www.lordswm.com|my.lordswm.com)\/(pl_transfers.php\?id=.*)/
// @version     1.6
// @grant       none
// @license MIT
// ==/UserScript==

var body = document.body.innerHTML;
var regx = /\d{2}-\d{2}-\d{2} \d{2}:\d{2}:/g; // время
var pos=[]; // начало каждой строки
var res, s, sfind, ttime;
var finishRepairTime;
var foundFirstRepair=false;
var curHWMdate=GetHWMDate();
var dividend_flag=0;
var dividendLastRowId=-1;

while(res = regx.exec(body)) pos.push(res.index);

var arrbody=[]; // строки
var dividend_sum=0;
for(var i=0; i<pos.length; i++){
    s =(i<pos.length) ? body.substring(pos[i], pos[i+1]) : body.substring(pos[i]);

    res = /на (\d+) боев .+ за (\d+) Золото/.exec(s);
    if(res && res[1]>1) {
       sfind='за '+res[2]+' Золото';
       s=s.replace(sfind, sfind+' ('+Math.round(res[2] / res[1] *10)/10+'/бой)');
    }

    if (!foundFirstRepair)
    {
        res = /Получено за ремонт: (\d+) \((\d+)%\)/.exec(s.toString()); // личный ремонт
        if(res) {
            var startDate= ParseHWMLogDate(s);
            var repairTimeMinutes=parseInt(res[1],10)*1.5/(parseInt(res[2],10));
            finishRepairTime=AddMinutes(startDate, repairTimeMinutes);
            foundFirstRepair=true;
        }
        else
        {
            res = /до (.+)\. Заработано/.exec(s.toString()); // клановый ремонт
            if(res) {
                finishRepairTime=ParseHWMLogDate2(res[1]);
                foundFirstRepair=true;
            }
        }

        if(foundFirstRepair)
        {
            s=s.replace('<a ', '<a id="foundFirstRepair" ');
        }
    }

    arrbody.push(s);

    var res_dividend = /Получено (\d+) золота .+Империя.+дивиденды/.exec(s);
    if(res_dividend && res_dividend[1]>1) {
        dividend_flag=1;
        dividend_sum+=parseInt(res_dividend[1]);

        if(i==pos.length-1) {
            dividendLastRowId=i;
        }
    }
    else if(dividend_flag==1){
        dividend_flag=0;
        dividendLastRowId= i-1;
    }

    if(dividendLastRowId>=0){
        var brPos = arrbody[dividendLastRowId].indexOf('<br>');
        if(brPos>0) arrbody[dividendLastRowId]=arrbody[dividendLastRowId].slice(0, brPos) +'. ИТОГО дивидендов: '+dividend_sum+arrbody[dividendLastRowId].slice(brPos);
        dividend_sum=0;
        dividendLastRowId=-1;
    }
}

document.body.innerHTML=body.substring(0,pos[0]) + arrbody.join('');

if(foundFirstRepair && curHWMdate<finishRepairTime) // идет ремонт
{
    var el=getE('//div[contains(text(),"Протокол передач")]');
    if(el)
    {
        var sp=document.createElement('span');
        sp.id='finishRepairTimeStr';
        sp.style="color:red;";
        sp.textContent=' '+DateToHWMString(finishRepairTime);
        sp.title="Время окончания текущего ремонта";
        el.appendChild(sp);
    }

    el = document.getElementById('foundFirstRepair');
    el.style="color: red;";
}

// "23-01-22 19:44 Текст" -> Date
function ParseHWMLogDate(s){return new Date(parseInt(s.substring(6,8),10)+2000, parseInt(s.substring(3,5),10)-1, parseInt(s.substring(0,2),10), parseInt(s.substring(9,11),10), parseInt(s.substring(12,14),10));}
// "2022.01.23 05:14 Текст" -> Date
function ParseHWMLogDate2(s){return new Date(parseInt(s.substring(0,4),10), parseInt(s.substring(5,7),10)-1, parseInt(s.substring(8,10),10), parseInt(s.substring(11,13),10), parseInt(s.substring(14,16),10));}
// Date + Minutes
function AddMinutes(dt, minutes) {return new Date(dt.getTime() + minutes*60000);}
// Date -> для текущей даты "05:14", для другой даты "23.01 05:14", для другого года "2022.01.23 05:14"
function DateToHWMString(d){
    var dt=GetHWMDate();
    var res;
    if(dt.getYear()!=d.getYear()) res=DateToHWMString2(d);
    else {
        res=('0'+(d.getHours())).slice(-2)+':'+('0'+(d.getMinutes())).slice(-2); // HH:MM
        if(dt.getDate()!=d.getDate()) res = ('0'+d.getDate()).slice(-2)+'.'+('0'+(d.getMonth()+1)).slice(-2)+' '+ res; // dd.mm HH:MM
    }

    return res;
}
// Date -> "2022.01.23 05:14"
function DateToHWMString2(d){return d.getFullYear()+'.'+('0'+(d.getMonth()+1)).slice(-2)+'.'+('0'+d.getDate()).slice(-2)+' '+('0'+(d.getHours())).slice(-2)+':'+('0'+(d.getMinutes())).slice(-2);}
// возвращает Date для HWM (берет из часов возле значка радио)
function GetHWMDate(){
    var result;
    var el=getE('//td[a[contains(@href,"player.html")]]');
    if (el){
        var res = /(\d{1,2}):(\d{1,2})/.exec(el.innerText); // 22:54, 5043 online
        if(res) {
            var hours = parseInt(res[1],10);
            var timestamp=(new Date()).setHours(hours);
            result = new Date(timestamp);

            var localHour=(new Date()).getHours(); // корректируем с учетом разницы часовых поясов
            var diffHours=localHour-hours;
            if(Math.abs(diffHours)>15){
                if(diffHours>0) result++;
                else result--;
            }
        }
    }
    return result;
}

function getE(xpath,el,docObj){return (docObj?docObj:document).evaluate(xpath,(el?el:(docObj?docObj.body:document.body)),null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;}