Greasy Fork is available in English.

GN_DressAllArts

Принять и надеть все подвешенные артефакты

// ==UserScript==
// @name        GN_DressAllArts
// @namespace   Gradient
// @description Принять и надеть все подвешенные артефакты
// @include     /^https{0,1}:\/\/(www\.heroeswm\.ru|178\.248\.235\.15)\/inventory\.php/
// @version     1.0.5
// ==/UserScript==

"use strict";

//----------------------------------------------------------------------------//

var script_name = 'GN_DressAllArts'; // Enter your script name here

//----------------------------------------------------------------------------//

(function(){ try{ // wrapper start

//----------------------------------------------------------------------------//
// UnifiedLibrary 1.7.0 start
//----------------------------------------------------------------------------//

//----------------------------------------------------------------------------//
// SysUtils
//----------------------------------------------------------------------------//

var GN_SysUtils = new SysUtils(script_name);
var SU = GN_SysUtils;

//----------------------------------------------------------------------------//

function SysUtils(name){  // wrapper start

//----------------------------------------------------------------------------//

this.show_error = function(error_string, use_alert){
  if(use_alert)
    alert(error_string);

  throw new Error(error_string);
};

if(arguments.length != 1)
  this.show_error('Wrong SysUtils arguments');

if(!arguments[0])
  this.show_error('Empty SysUtils argument');

//----------------------------------------------------------------------------//

var current_id = null;

//----------------------------------------------------------------------------//

function check_mandatory_scripts(alerter){
  var persistent_storage_sign = document.getElementById('GN_GM_Handler');
  var common_values_sign      = document.getElementById('GN_CommonValuesSign');
  var alert_sign              = document.getElementById('GN_AlertSign');

  if(!alert_sign){
    alert_sign = document.createElement('div');
    alert_sign.id = 'GN_AlertSign';
    alert_sign.setAttribute('alerted', 'false');
    document.body.appendChild(alert_sign);
  }

  var alerted = alert_sign.getAttribute('alerted') != 'false';

  if(!persistent_storage_sign){
    alert_sign.setAttribute('alerted', 'true');
    alerter('Скрипт ' + name + ' требует для своей работы скрипт управления данными (GN_PersistentStorage), который должен стоять первым в порядке выполнения скриптов.\n'
          + 'Подробнее здесь: "https://greasyfork.org/ru/scripts/14049-Как-устанавливать-скрипты-читать-здесь"', !alerted);
  }

  if(!common_values_sign){
    alert_sign.setAttribute('alerted', 'true');
    alerter('Скрипт ' + name + ' требует для своей работы скрипт, хранящий данные (GN_CommonValuesFiller), который должен стоять вторым в порядке выполнения скриптов.\n'
          + 'Подробнее здесь: "https://greasyfork.org/ru/scripts/14049-Как-устанавливать-скрипты-читать-здесь"', !alerted);
  }
}

this.check_login = function(){
  var re = /.*?pl_id=(\d+)[^\d]*?/gmi;
  var matches = re.exec(document.cookie.toString());

  if(matches){
    current_id = +matches[1];

    check_mandatory_scripts(this.show_error);
  }
};

//----------------------------------------------------------------------------//

this.reload_page = function(){
  document.location.href = document.location.href;
};

//----------------------------------------------------------------------------//

this.check_login();

//----------------------------------------------------------------------------//

} // wrapper end

//----------------------------------------------------------------------------//
// UnifiedLibrary end
//----------------------------------------------------------------------------//

var show_error  = SU.show_error;
var reload_page = SU.reload_page;

var receivable_artefacts = [];
var known_uids           = [];
var is_work_started      = false;

start_work();

//----------------------------------------------------------------------------//

function start_work(){
  var parent = document.getElementById('set_det').parentNode.parentNode;

  if(!parent)
    show_error('Не найдена таблица с артефактами для передачи');

  get_receivable(parent);

  if(receivable_artefacts.length)
    draw_buttons(parent);
}

//----------------------------------------------------------------------------//

function draw_buttons(parent){
  var trades_tr = null;
  var tds = parent.querySelectorAll('tr > td');
  for(var i = 0; i < tds.length; ++i)
    if(tds[i].outerHTML.indexOf('Сделки:') != -1){
      trades_tr = tds[i].parentNode;
      break;
    }

  var tr = document.createElement('tr');
  var td = document.createElement('td');
  td.className = 'wb';
  td.textContent = 'Подвешенные артефакты:';
  tr.appendChild(td);

  td = document.createElement('td');
  td.className = 'wb';
  td.setAttribute('align', 'right');
  tr.appendChild(td);

  var accept = document.createElement('u');
  accept.id          = script_name + 'Accept';
  accept.textContent = 'Принять и надеть все';
  accept.onclick     = accept_all;

  var b = document.createElement('b');
  b.appendChild(accept);
  td.appendChild(b);

  td.appendChild(document.createTextNode('\xA0\xA0'));

  var decline = document.createElement('u');
  decline.id          = script_name + 'Decline';
  decline.textContent = 'Отклонить';
  decline.onclick     = decline_all;

  b = document.createElement('b');
  b.appendChild(decline);
  td.appendChild(b);

  trades_tr.parentNode.insertBefore(tr, trades_tr.nextSibling);
}

//----------------------------------------------------------------------------//

function get_receivable(parent){
  var trades = parent.querySelectorAll('a[href*="trade_accept.php?tid="]');

  for(var i = 0; i < trades.length; ++i){
    var trade_tr = trades[i].parentNode.parentNode;
    var desc_tr  = trade_tr.previousSibling;
    var art_tr   = desc_tr.previousSibling;

    var desc = desc_tr.innerHTML.replace('(\r|\n)', '');

    if(/Прочноcть: <b>0\/\d+<\/b>/gmi.test(desc)){
      console.error('Incorrect durability: ' + desc);
      continue;
    }

    var re = /<b>(\d+) боев<\/b>/gmi;
    var matches = re.exec(desc);

    if(!matches || !+matches[1]){
      console.error('Too few battles: ' + desc);
      continue;
    }

    var obj = {
      desc:      desc,
      trade_url: trades[i],
      bcount:    +matches[1],
      name:      art_tr.querySelector('td > b').textContent,
      owner:     art_tr.querySelector('a > b').textContent,
      url:       desc_tr.querySelector('a[href*="art_info.php?id="] > img[width="50"]').parentNode.href
    };

    re = /Прочноcть: <b>(\d+)\/(\d+)<\/b>/gmi;
    matches = re.exec(desc);

    obj.cur_dur = +matches[1];
    obj.max_dur = +matches[2];

    re = /(\d+)/;
    matches = re.exec(art_tr.querySelector('a').href);

    obj.owner_id = +matches[1];

    receivable_artefacts.push(obj);
  }
}

//----------------------------------------------------------------------------//

function accept_all(){
  if(is_work_started)
    return;

  document.body.style.cursor = 'wait';

  ['Accept', 'Decline'].forEach(function(current){
    var el = document.getElementById(script_name + current);
    el.setAttribute('disabled', '');
  });

  is_work_started = true;

  var counter = {
    current: receivable_artefacts.length - 1
  };

  accept_next(counter);
}

//----------------------------------------------------------------------------//

function accept_next(counter){
  var url = receivable_artefacts[counter.current].trade_url;

  var xhr = new XMLHttpRequest();
  xhr.open('GET', url, true);
  xhr.overrideMimeType('text/plain; charset=windows-1251');
  xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){
      if(xhr.status == 200){
        if(--counter.current >= 0)
          accept_next(counter);
        else{
          receivable_artefacts.forEach(function(current){
            var re      = /uid=(\d+)/;
            var matches = re.exec(current.url);

            if(matches)
              known_uids.push(+matches[1]);
          });

          var dcounter = {
            current: known_uids.length - 1
          };

          known_uids.length == receivable_artefacts.length ? dress_next(dcounter) : get_ids_from_inventory();
        }
      }
    }
  };

  xhr.send(null);
}

//----------------------------------------------------------------------------//

function get_ids_from_inventory(){
  var xhr = new XMLHttpRequest();
  xhr.open('GET', '/inventory.php', true);
  xhr.overrideMimeType('text/plain; charset=windows-1251');
  xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){
      if(xhr.status == 200){
        var response = xhr.response.replace('(\r|\n)', '');

        // TODO: art type (avoid, f.e, sword a/b and bow a/b from same owner)
        receivable_artefacts.forEach(function(current){
          if(!/uid=(\d+)/.test(current.url)){
            var re = new RegExp('.+Прочноcть: ' + current.cur_dur + '\/' + current.max_dur + '<br>Владелец: <a class=pi href=\'pl_info\\.php\\?id='
                              + current.owner_id + '\'><b>' + current.owner + '<\/b>.+?inventory\\.php\\?art_return=(\\d+).+', 'gmi');

            var matches = re.exec(response);
            known_uids.push(+matches[1]);
          }
        });

        if(known_uids.length != receivable_artefacts.length)
          show_error('Counts not matches');

        var dcounter = {
          current: known_uids.length - 1
        };

        dress_next(dcounter);
      }
    }
  };

  xhr.send(null);
}

//----------------------------------------------------------------------------//

function dress_next(counter){
  var uid = known_uids[counter.current];
  var url = '/inventory.php?dress=' + uid + '&js=1&rand=' + Math.random()*1000000;

  var xhr = new XMLHttpRequest();
  xhr.open('GET', url, true);
  xhr.overrideMimeType('text/plain; charset=windows-1251');
  xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){
      if(xhr.status == 200){
        if(--counter.current >= 0)
          dress_next(counter);
        else
        {
          document.body.style.cursor = 'default';
          reload_page();
        }
      }
    }
  };

  xhr.send(null);
}

//----------------------------------------------------------------------------//

function decline_all(){
  if(is_work_started)
    return;

  if(!confirm('Вы уверены, что хотите отклонить все подвешенные для боя артефакты?'))
    return;

  document.body.style.cursor = 'wait';

  ['Accept', 'Decline'].forEach(function(current){
    var el = document.getElementById(script_name + current);
    el.setAttribute('disabled', '');
  });

  is_work_started = true;

  var counter = {
    current: receivable_artefacts.length - 1
  };

  decline_next(counter);
}

//----------------------------------------------------------------------------//

function decline_next(counter){
  var re      = /trade_accept\.php\?tid=(.+)/;
  var matches = re.exec(receivable_artefacts[counter.current].trade_url);
  var url     = '/trade_cancel.php?tid=' + matches[1];

  var xhr = new XMLHttpRequest();
  xhr.open('GET', url, true);
  xhr.overrideMimeType('text/plain; charset=windows-1251');
  xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){
      if(xhr.status == 200){
        if(--counter.current >= 0)
          decline_next(counter);
        else
        {
          document.body.style.cursor = 'default';
          reload_page();
        }
      }
    }
  };

  xhr.send(null);
}

//----------------------------------------------------------------------------//

} catch(e){
  alert('Ошибка в скрипте ' + script_name + ', обратитесь к разработчику:\n' + e);
  throw e;
}}()); // wrapper end

//----------------------------------------------------------------------------//