Принять и надеть все подвешенные артефакты
// ==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//----------------------------------------------------------------------------//