Greasy Fork is available in English.

HWM_TransferSearch

Поиск по протоколу передач

// ==UserScript==
// @name           HWM_TransferSearch
// @namespace      achepta
// @version        2.1
// @homepage       https://greasyfork.org/en/scripts/374608-hwm-transfersearch
// @author         Alex_2oo8, Рианти, CheckT, achepta
// @description    Поиск по протоколу передач
// @include        https://www.heroeswm.ru/pl_transfers.php*
// @include        /^https{0,1}:\/\/((www|qrator)\.heroeswm\.ru|178\.248\.235\.15)\/(pl_transfers|sklad_log|clan_log).+/
// @include        http://178.248.235.15/pl_transfers.php*
// ==/UserScript==


//    https://www.lordswm.com/pl_transfers.php*

(function(){

    var debug = false;

    var url = location.protocol+'//'+location.hostname+'/';
    var id = getId();
    window.protocol_regexp = /Протокол игрока <a.* href="pl_info\.php\?id=[0-9]*"><b>.*<\/b><\/a>/;
    let where_we;
    if (location.href.indexOf("pl_transfers") > 0 ) {
        where_we = "pl_transfers.php"
    } else if (location.href.indexOf("sklad_log") > 0) {
        where_we = "sklad_log.php"
    } else if (location.href.indexOf("clan_log") > 0) {
        where_we = "clan_log.php"
    }
    init_style();
    let selector = "";
    let elem;
    if (document.querySelectorAll("body > center > table").length>1){
        selector = "body > center > table:nth-child(2) > tbody > tr > td"  //корневой элемент
    } else {
        selector = "body > center > table > tbody > tr > td"  //корневой элемент
    }
    elem = document.querySelector(selector);
    create_header(elem);
    create_listeners(elem);
    var iDiv = create_div();

    function request(url_req, callback, type, first_page){
        console.log("request")
        var objXMLHttpReq = createXMLHttpReq();
        try{
            objXMLHttpReq.open('GET', url_req, true);
            setXMLHttpReqHeaders(objXMLHttpReq);
            objXMLHttpReq.onreadystatechange = function() { callback(objXMLHttpReq, type, first_page); };
            objXMLHttpReq.send(null);
        }catch(e){console.log(e);alert("HWM_TransferSearch: "+e);}
    }

    function search( id, elem, type ) {
        console.log("search");

        var stop = document.createElement( 'input' );
        stop.type = 'hidden';
        stop.value = '0';
        stop.id = 'stop';
        document.getElementsByTagName('body')[0].appendChild( stop );
        var first_page = Math.max(1, Math.floor(getNumberField('TSearch_inp_page', 1)));
        $('transferSearchDiv').style.display = 'none';
        $('TSearch').style.display = 'none';

        request(url+where_we + '?page=9999&id=' + id, search_1_last_page, type, first_page);

    }

    function search_1_last_page(objXMLHttpReq, type, first_page){
        console.log("search_1_last_page")

        if (objXMLHttpReq.readyState == 4 && objXMLHttpReq.status == 200) {
            var element = new DOMParser().parseFromString(objXMLHttpReq.responseText, "text/html").querySelector(selector);
            if(!element)
                return;

            var lastPg = 1;
            if ( element.getElementsByTagName('center').length > 1 )
                lastPg = element.getElementsByTagName('center')[1].getElementsByTagName('b')[0].getElementsByTagName('font')[0].innerHTML;
            first_page = Math.min(lastPg, first_page);
            search2( id, type, elem, lastPg, first_page);
        }
    }

    function search2( id, type, elem, pgCount, first_page){
        console.log("search2")

        var reg, search_str;
        switch(type){
            case 'Nick':
                search_str = $('TSearchNick').value;
                reg = new RegExp( '[0-9]{2}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}: .*<b>' + rep( search_str ) + '<\/b><\/a>' );
                break;
            case 'Fine':
                search_str = $('HWM_transfer_search_checkbox_label').className.indexOf('checked') != -1;
                reg = new RegExp( '[0-9]{2}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}: <b>Игрок' + ( search_str ? '' : ' оштрафован') );
                break;
            case 'Art':
                search_str = $('TSearchArt').value;
                /*!*/	  reg = new RegExp( '[0-9]{2}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}: .* ["\'].*' + rep( search_str ) + '.*["\']' );
                break;
            case 'Any':
                search_str = $('TSearchAll').value;
                reg = new RegExp( '[0-9]{2}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}: .*' + rep( search_str ) + '.*' );
                break;
            case 'Regexp':
                search_str = $('TSearch_inp_regexp').value;
                reg = new RegExp( '[0-9]{2}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:' + search_str.replace(/\\/g, '\\'));
                break;
            case 'ID':
                search_str = $('TSearch_inp_id').value;
                reg = new RegExp( `[0-9]{2}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}: .*(id=|!--)${search_str}`);
                break;
        }
        var nick = elem.getElementsByTagName('center')[0].getElementsByTagName('a')[0].innerHTML;
        while( elem.lastChild ) {
            elem.removeChild( elem.lastChild );
        }
        elem.appendChild( document.createElement( 'br' ) );
        var center = document.createElement( 'center' );
        center.innerHTML = 'Поиск по протоколу передач игрока ';
        var a = document.createElement( 'a' );
        a.href = 'pl_info.php?id=' + id;
        a.style.textDecoration = 'none';
        a.innerHTML = nick;
        center.appendChild( a );
        elem.appendChild( center );
        elem.appendChild( document.createElement( 'br' ) );
        var center = document.createElement( 'center' );
        center.id = 'TSearch';
        center.innerHTML = 'Идёт поиск '
            + type.replace( 'Nick', 'по нику <a href="pl_info.php?nick=' + search_str + '" style="text-decoration: none;"><b>' + search_str + '</b></a>' )
                .replace( 'Fine', 'штрафов' + ( search_str ? ' и блокировок/разблокировок' : '' ) )
                .replace( 'Art', 'по артефакту "' + search_str + '"' )
                .replace( 'Any', 'по подстроке "' + search_str + '"' )
                .replace( 'Regexp', 'по рег. выражению "' + search_str + '"' )
                .replace( 'ID', 'по ID "' + search_str + '"' )
            + '... (<a href="javascript: void(0);" id="cancel" onclick="document.getElementById(\'stop\').value = \'1\';">стоп</a>)'
            + '<br />'
            + 'Просмотрено <text id="viewed">0</text> страничек из ' + (pgCount-first_page+1) + ' (с '+first_page+' по '+pgCount+'): <text id="percent">0</text>%'
            + '<br />'
            + 'Дата последней операции на текущей странице: <text id="curr_date"></text>'
            + '<br />'
            + 'Найдено <text id="matches">0</text> записей:'
        ;
        elem.appendChild( center );
        elem.appendChild( document.createElement( 'br' ) );

        startSearch( first_page, id, reg, pgCount, elem, type, search_str, first_page, null );
    }

    function startSearch( pg, id, reg, lastPg, elem, type, search_str, first_page, curr_page_date ) {
        console.log("startSearch")

        if ( $('stop').value != '1' && pg <= lastPg ) {
            var args = {pg:pg, id:id, reg:reg, lastPg:lastPg, elem:elem, type:type, search_str:search_str, first_page:first_page};

            request(url+where_we + '?id=' + id + '&page=' + (pg-1), search_2_pages, args);

        } else {
            var matches = $('matches').innerHTML;
            $('TSearch').innerHTML = 'Поиск '
                + type.replace( 'Nick', 'по нику <a href="pl_info.php?nick=' + search_str + '" style="text-decoration: none;"><b>' + search_str + '</b></a>' )
                    .replace( 'Fine', 'штрафов' + ( search_str ? ' и блокировок/разблокировок' : '' ) )
                    .replace( 'Art', 'по артефакту "' + search_str + '"' )
                    .replace( 'Any', 'по подстроке "' + search_str + '"' )
                    .replace( 'Regexp', 'по рег. выражению "' + search_str + '"' )
                    .replace( 'ID', 'по ID "' + search_str + '"' )
                + ' закончен!<br>Найдено ' + matches + ' записей на страницах '+first_page+'-'+(pg-1)+':'
                + (curr_page_date ? ('<br/>Дата последней операции на странице '+(pg-1)+': '+curr_page_date) : '')
            ;
        }
    }

    function search_2_pages(objXMLHttpReq, args){
        console.log("search_2_pages")

        if (objXMLHttpReq.readyState == 4 && objXMLHttpReq.status == 200) {
            let element = new DOMParser().parseFromString(objXMLHttpReq.responseText, "text/html").querySelector(selector);
            if(!element)
                return;

            var text = element.innerHTML //.substring( element.innerHTML.indexOf('&nbsp;&nbsp;') );
            var transfers = text.split('<br>');
            var first_time = null;
            var time_regexp = /&nbsp;&nbsp;(\d\d-\d\d-\d\d \d\d:\d\d):/;
            for ( var i = 0; i < transfers.length; i++ ) {
                if(!first_time){
                    var time_match = time_regexp.exec( transfers[i] );
                    if(time_match)
                        first_time = time_match[1];
                }
                if ( args.reg.test( transfers[i] ) ) {
                    $('matches').innerHTML = ( Number( $('matches').innerHTML ) + 1 );
                    args.elem.innerHTML += transfers[i];
                    args.elem.appendChild( document.createElement('br') );
                }
            }
            if(first_time)
                $('curr_date').innerHTML = first_time;
            $('viewed').innerHTML = ( Number( $('viewed').innerHTML ) + 1 );
            $('percent').innerHTML = ( Math.round( $('viewed').innerHTML * 100 / (args.lastPg-args.first_page+1) ) );

            startSearch( args.pg+1, args.id, args.reg, args.lastPg, args.elem, args.type, args.search_str, args.first_page, first_time );
        }
    }

    function create_listeners(elem){
        addClickEvent('HWM_transfer_search_checkbox_label', check_search_box);
        addClickEvent('TSearchByNick', function() { search( id, elem, 'Nick' ); });
        addClickEvent('TSearchByFine', function() { search( id, elem, 'Fine' ); });
        addClickEvent('TSearchByArt', function() { search( id, elem, 'Art' ); });
        addClickEvent('TSearchAny', function() { search( id, elem, 'Any' ); });
        addClickEvent('TSearch_but_regexp', function() { search( id, elem, 'Regexp' ); });
        addClickEvent('TSearch_but_id', function() { search( id, elem, 'ID' ); });
    }

    function rep( str ) {
        str = str.replace( /\\/g, '\\\\' ).replace( /\[/g, '\\[' ).replace( /\]/g, '\\]' ).replace( /\(/g, '\\(' )
            .replace( /\)/g, '\\)' ).replace( /\./g, '\\.' ).replace( /\+/g, '\\+' ).replace( /\*/g, '\\*' )
            .replace( /\?/g, '\\?' ).replace( /\$/g, '\\$' ).replace( /\|/g, '\\|' );
        return str;
    }

    function check_search_box() {
        this.className = (this.className.indexOf('checked') != -1 ? '' : 'checked');
    }

    function create_div(){
        var iDiv = document.createElement('div');
        iDiv.style.display = debug ? 'block' : 'none';
        iDiv.id = 'hwm_trasfer_search';
        document.body.appendChild(iDiv);
        return iDiv;
    }

    function create_header(elem){
        var text = document.createElement( 'text' );
        text.id = 'TSearch';
        text.innerHTML = '&nbsp;(<a id="show_transfer_block" href="javascript: void(0);">Поиск по протоколу</a>)';
        elem.getElementsByTagName('center')[0].appendChild( text );
        addClickEvent('show_transfer_block', show_transfer_block);

        var div = document.createElement( 'div' );
        div.id = 'transferSearchDiv';
        div.style.display = 'none';

        div.innerHTML =
            '<table>'+
            '<tr><td>Поиск по нику:</td><td><input type="text" id="TSearchNick" form="form_nick" /></td>'+
            '<td><form action="" style="padding:0;margin:0;border:0;" id="form_nick" onSubmit="return false;">'+
            '<input type="submit" id="TSearchByNick" value="Поиск" />'+
            '</form></td></tr>'+

            '<tr><td>Поиск штрафов:</td><td title="В том числе искать блокировки/разблокировки"><div id="HWM_transfer_search_checkbox_label">Блоки / Разблоки</div></td>'+
            '<td><input type="submit" id="TSearchByFine" value="Поиск" /></td></tr>'+

            '<tr><td>Поиск по артефакту:</td><td><input type="text" id="TSearchArt" form="form_art" /></td>'+
            '<td><form action="" style="padding:0;margin:0;border:0;" id="form_art" onSubmit="return false;">'+
            '<input type="submit" id="TSearchByArt" value="Поиск" />'+
            '</form></td></tr>'+

            '<tr><td>Общий Поиск:</td><td><input type="text" id="TSearchAll" form="form_any" /></td>'+
            '<td><form action="" style="padding:0;margin:0;border:0;" id="form_any" onSubmit="return false;">'+
            '<input type="submit" id="TSearchAny" value="Поиск" />'+
            '</form></td></tr>'+

            '<tr><td>По рег. выражению:</td><td><input type="text" id="TSearch_inp_regexp" form="form_regexp" /></td>'+
            '<td><form action="" style="padding:0;margin:0;border:0;" id="form_regexp" onSubmit="return false;">'+
            '<input type="submit" id="TSearch_but_regexp" value="Поиск" />'+
            '</form></td></tr>'+

            '<tr><td>По ID:</td><td><input type="text" id="TSearch_inp_id" form="form_id" /></td>'+
            '<td><form action="" style="padding:0;margin:0;border:0;" id="form_id" onSubmit="return false;">'+
            '<input type="submit" id="TSearch_but_id" value="Поиск" />'+
            '</form></td></tr>'+

            '<tr><td>со страницы</td><td title="Начать поиск с указанной страницы"><input type="text" id="TSearch_inp_page" value="1"/></td>'+
            '<td>&nbsp;</td></tr>'+
            '</table>';

        elem.getElementsByTagName('center')[0].appendChild( div );
    }

    function show_transfer_block() {
        $('transferSearchDiv').style.display = ( $('transferSearchDiv').style.display == 'none' ? 'block' : 'none' );
    }

    function GM_addStyle(css){
        var head = document.getElementsByTagName('head')[0];
        if (!head)
            return;
        var style = document.createElement('style');
        style.type = 'text/css';
        style.innerHTML = css;
        head.appendChild(style);
    }

    function init_style(){
        GM_addStyle( '#HWM_transfer_search_checkbox_label {background-image:url(\'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJIAAAAsCAYAAACOu+GLAAABrElEQVR42u3bsWrCQByA8RhdXBzEJY8gcXZz9Ek6BkIhSxBck1foG3QogpPg5uguklG6iIPU4qCT+ZcLGDiibY03ZPiGD4yaLPcTyV3O+nh/E6JnStNULPXi1X8xlunrUbX7/vrUIakDE5m+HlU7IBGQCEgEJCARkAhIBCQCEpAISAQkAhKQgAQkAhIBiYAEJAISAYmqC0kdmMr09aj6ZZD4VZGJLHZBELtIiF0kxF0bkMg8pOVyKd1uF0hAem7gfd8Xy7KABKTyA+95XoYISEAqDSkIghwRkIBUgLRarf48OQxDDVGz2QQSkPSB7/f7st1u7544Go00RI1GQxaLBZCApA98rVYTx3HkeDxqJ1wuFxmPxxoi9d0kSbj9B9JtSApJu92W/X6fvx9FUf7Ztc1mwzwSkG5DqtfrOZRer5f9zcVxrAFSzedzJiTpPqThcKiB6XQ6BUSTyYSZbfod0m63E9d1C3iuzWYzlkjof/NI5/NZWq1WAdF6vWatjR6bkDydTtkamgJk23a2psaiLZWa2T4cDjIYDGQ6nbL6TzxGQkAidpEQu0iIHuwH8Zq0OtRsnH4AAAAASUVORK5CYII%3D\');background-position:top;display:block;width:120px;height:18px;padding:2px;padding-left:24px;line-height:18px;-moz-user-select:none;cursor:default;}' +
            '#HWM_transfer_search_checkbox_label.checked {background-position:bottom;}' +
            '.HWM_transfer_search_checkbox_checkbox {display:none;}' );
    }

    function addClickEvent(id, func){
        var elem = $(id);
        if(elem && func)
            addEvent(elem, "click", func);
    }

    function addEvent(elem, evType, fn) {
        if(elem){
            if (elem.addEventListener)
                elem.addEventListener(evType, fn, false);
            else if (elem.attachEvent)
                elem.attachEvent("on" + evType, fn);
            else
                elem["on" + evType] = fn;
        }
    }

    function getId() {
        var id = location.href.match( /\?(?:.*=.*&)*id=([0-9]*)(?:&.*=.*)*/ );
        return id[1];
    }

    function $(id) { return document.getElementById(id); }

    function getNumberField(key, def){
        var val = $(key);
        return val ? getNum(val.value) : (def ? def : 0);
    }
    function getNum(src){
        var val=Number(src);
        val = isNaN(val) ? 0 : val;
        return val < 0 ? 0 : val;
    }

    function createXMLHttpReq(){
        var objXMLHttpReq;

        if (window.XMLHttpRequest){
            objXMLHttpReq = new XMLHttpRequest();
        } else if (window.ActiveXObject) {
            // IE
            objXMLHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
        } else {
            alert('Can\'t create XMLHttpRequest!');
        }
        return objXMLHttpReq;
    }

    function setXMLHttpReqHeaders(objXMLHttpReq){
        //objXMLHttpReq.setRequestHeader('Referer', 'http://www.heroeswm.ru/inventory.php');
        objXMLHttpReq.setRequestHeader('Content-type', 'text/html; charset=windows-1251');
        if(objXMLHttpReq.overrideMimeType)
            objXMLHttpReq.overrideMimeType('text/html; charset=windows-1251');
    }
}());