🏠 Home 

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
//----------------------------------------------------------------------------//