Сортировка кланового склада
// ==UserScript== // @name GN_SortClanStorage // @namespace Gradient // @description Сортировка кланового склада // @include /^https{0,1}:\/\/(www\.heroeswm\.ru|178\.248\.235\.15)\/sklad_info\.php\?id=\d+&cat=[0-36]$/ // @version 1.2.15 // ==/UserScript== "use strict"; //----------------------------------------------------------------------------// var script_name = 'GN_SortClanStorage'; // 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'); //----------------------------------------------------------------------------// this.compare = function(a, b){ return (a == b) ? 0 : (a > b ? 1 : -1); }; //----------------------------------------------------------------------------// this.save_value = function(desc, value){ var div = document.getElementById('GN_GM_Handler'); div.setAttribute('desc', desc); div.setAttribute('value', value); div.setAttribute('operation', 'save'); div.click(); if(div.getAttribute('state') != 'complete') this.show_error('Ошибка при сохранении значения'); }; //----------------------------------------------------------------------------// this.load_value = function(value, def){ var div = document.getElementById('GN_GM_Handler'); div.setAttribute('desc', value); div.setAttribute('operation', 'load'); div.click(); if(div.getAttribute('state') != 'complete') this.show_error('Ошибка при загрузке значения'); return (div.getAttribute('is_null') == 'true' ? def : div.getAttribute('value')); }; //----------------------------------------------------------------------------// this.remove_value = function(value){ var div = document.getElementById('GN_GM_Handler'); div.setAttribute('desc', value); div.setAttribute('operation', 'remove'); div.click(); if(div.getAttribute('state') != 'complete') this.show_error('Ошибка при удалении значения'); }; //----------------------------------------------------------------------------// var current_id = null; this.current_id = function(){ return current_id; }; //----------------------------------------------------------------------------// 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.show_el = function(el, visible){ el.style.display = visible ? '' : 'none'; }; //----------------------------------------------------------------------------// this.reload_page = function(){ document.location.href = document.location.href; }; //----------------------------------------------------------------------------// function get_char(e){ if(e.which && e.charCode){ if(e.which < 32) return null; return String.fromCharCode(+e.which) } return null; } this.number_input = function(e){ if(e.ctrlKey || e.altKey || e.metaKey) return false; var chr = get_char(e); return chr == null || (chr >= '0' && chr <= '9'); }; //----------------------------------------------------------------------------// this.check_login(); //----------------------------------------------------------------------------// } // wrapper end //----------------------------------------------------------------------------// // CommonValues //----------------------------------------------------------------------------// var GN_CommonValues = new CommonValues(); //----------------------------------------------------------------------------// function CommonValues(){ // wrapper start //----------------------------------------------------------------------------// // Artefacts //----------------------------------------------------------------------------// this.enum_as = { // sync? right_arm: 0, left_arm: 1, foots: 2, ring: 3, head: 4, neck: 5, rear: 6, body: 7, backpack: 8 }; this.artefacts = JSON.parse(SU.load_value('GN_CommonValues_Artefacts', '[]')); //----------------------------------------------------------------------------// this.get_artefact = function(id){ for(var i = 0; i < this.artefacts.length; ++i) if(this.artefacts[i].id == id) return this.artefacts[i]; return null; }; //----------------------------------------------------------------------------// } // wrapper end //----------------------------------------------------------------------------// // UnifiedLibrary end //----------------------------------------------------------------------------// var show_error = SU.show_error; var load_value = SU.load_value; var save_value = SU.save_value; var remove_value = SU.remove_value; var compare = SU.compare; var show_el = SU.show_el; var reload_page = SU.reload_page; var number_input = SU.number_input; var current_user_id = SU.current_id(); var CV = GN_CommonValues; var slot_type = CV.enum_as; slot_type.unknown = -1; slot_type.complect = -2; var options = [ { label: 'Показ только выбранных:', id: 'OnlyChoosedChb', title: 'Показывать только указанные внутри скрипта артефакты' }, { label: 'Сортировка по крафту/цене:', id: 'SortByPriceChb', title: 'Сортировать артефакты по цене, если цены одинаковы - по крафту' }, //{ label: 'Сортировать по КПД:', id: 'SortByOptimumChb', title: 'Сортировка по КПД, где КПД - статы и крафт артефакта' }, //NB maybe later { label: 'Одевать при аренде:', id: 'DressChb', title: 'Артефакты будут сразу одеваться на персонажа' }, { label: 'Перезагружать страницу:', id: 'ReloadChb', title: 'После каждой аренды страница будет перезагружаться' }, { label: 'Показ цен:', id: 'ShowPriceChb', title: 'Показ цен на кнопках' }, { label: 'Переаренда:', id: 'ReRentChb', title: 'Показ кнопки переаренды артефакта' } ]; //----------------------------------------------------------------------------// var settings = load_settings(); var unknown_arts = [], right_arm_arts = [], left_arm_arts = [], head_arts = [], body_arts = [], foots_arts = [], neck_arts = [], rear_arts = [], ring_arts = [], backpack_arts = [], complect_arts = []; var choosed = [ 'cold_sword2014' ]; start_work(); //----------------------------------------------------------------------------// function start_work(){ var content = get_content_element(); var childs = content.querySelectorAll('tr[bgcolor]'); var elements = []; for(var i = 0; i < childs.length; ++i) elements.push(childs[i]); elements.forEach(function(current){ insert_converted(convert_element(current)); }); while(content.firstChild) content.removeChild(content.firstChild); add_new_content(content); draw_header(content); draw_undress_button(content); if(settings.ReRentChb) add_rerent_links(); } //----------------------------------------------------------------------------// function get_content_element(){ var matches = /.*\?id=(\d+).*/.exec(document.location); var header_sign = document.querySelector('table > tbody > tr > td > a[href="sklad_info.php?id=' + matches[1] + '&cat=0"]'); if(!header_sign) show_error('Не найден элемент для поиска заголовка таблицы'); var prev_table = header_sign.parentNode.parentNode.parentNode.parentNode; if(!prev_table) show_error('Не найден заголовок таблицы'); var parent_table = prev_table.nextSibling; if(!parent_table) show_error('Не найдена таблица с содержимым(1)'); var content = parent_table.firstChild.querySelector('table > tbody'); if(!content) show_error('Не найдена таблица с содержимым(2)'); return content; } //----------------------------------------------------------------------------// function convert_element(element){ //length = 20 - complects or 21 (artefact); var art_count = 21, complect_count = 20; var childs = element.childNodes; if(childs.length != art_count && childs.length != complect_count) return null; var is_c = childs.length == complect_count; var converted = { id: '', uids: [], name: '', craft: 0, price: 0, b_count: 0, lvl: 0, slot: slot_type.unknown, is_c: is_c, node: null, form: { depository: 0, sign: '', category: 0, inv_id: 0, set_id: 0 } }; var re = /uid=(\d+?)&/gmi; var matches = []; while(matches = re.exec(childs[0].innerHTML)){ var uid = matches[1]; if(converted.uids.indexOf(uid) == -1) converted.uids.push(uid); } if(!is_c) { matches = /.+?art_info\.php\?id=([^&"]*)/.exec(childs[0].innerHTML); converted.id = matches[1]; matches = /.+>'(.+)'.+/.exec(childs[1].innerHTML); converted.name = matches[1]; matches = /.+\[(.+)]/.exec(converted.name); if(matches) converted.craft = craft_to_int(matches[1]); } matches = />(\d+)</.exec(childs[is_c ? 16 : 17].innerHTML); converted.price = +matches[1]; matches = /.*(<option\svalue="(\d+)">).*/.exec(childs[is_c ? 17 : 18].innerHTML); converted.b_count = +matches[2]; if(!is_c) { var abstract = CV.get_artefact(converted.id); if(abstract) { converted.lvl = abstract.lvl; converted.slot = abstract.slot; } } else converted.slot = slot_type.complect; converted.form.depository = childs[is_c ? 4 : 5].value; converted.form.sign = childs[is_c ? 6 : 7].value; converted.form.category = childs[is_c ? 8 : 9].value; converted.form.inv_id = childs[is_c ? 12 : 13].value; converted.form.set_id = childs[is_c ? 14 : 15].value; if(!converted.uids.length) converted.uids.push(converted.form.inv_id); convert_node(element, converted); return converted; } //----------------------------------------------------------------------------// function craft_to_int(mod){ var count = 0; ['A', 'D', 'E', 'F', 'I', 'N', 'W'].forEach(function(current){ var r###lt = new RegExp(current + '(\\d+)').exec(mod); count += r###lt ? +r###lt[1] : 0; }); return count; } //----------------------------------------------------------------------------// function convert_node(element, converted){ //appendChild - live operation var tr = document.createElement('tr'); tr.appendChild(element.firstChild); //img if(!converted.is_c) tr.appendChild(element.firstChild); //name tr.appendChild(element.childNodes[15]); //price var b_count = converted.b_count; tr.appendChild(b_count >= 1 ? create_button(1, converted) : create_empty_td()); tr.appendChild(b_count >= 2 ? create_button(2, converted) : create_empty_td()); tr.appendChild(b_count >= 3 ? create_button(3, converted) : create_empty_td()); var select = create_select(b_count, converted.form.inv_id, converted.slot); tr.appendChild(select ? select : create_empty_td()); tr.appendChild(select ? create_button(4, converted) : create_empty_td()); converted.node = tr; } //----------------------------------------------------------------------------// function create_button(b_count, converted){ var td = document.createElement('td'); td.align = 'center'; var button = document.createElement('button'); button.textContent = 'На ' + b_count + (settings.ShowPriceChb ? '[' + Math.floor(+converted.price*1.01)*b_count + ']' : ''); button.addEventListener('click', function(e){ e.preventDefault(); var form = converted.form; var url = 'sklad_info.php?id=' + form.depository + '&sign=' + form.sign + '&cat=' + form.category + '&action=rent&inv_id=' + form.inv_id + '&set_id=' + form.set_id + '&bcnt' + form.inv_id + '=' + b_count; settings.DressChb ? dress_artefact(url, converted) : send_async_get(url); }); td.appendChild(button); return td; } //----------------------------------------------------------------------------// function create_empty_td(){ var td = document.createElement('td'); td.align = 'center'; td.textContent = ''; return td; } //----------------------------------------------------------------------------// function create_select(b_count, inv_id, slot){ if(b_count < 4) return null; var td = document.createElement('td'); td.align = 'center'; var select = document.createElement('select'); select.setAttribute('inv_id', inv_id); select.setAttribute('slot', slot); for(var i = 4, e = b_count; i <= e; ++i) { var option = document.createElement('option'); option.value = i; option.textContent = i; select.appendChild(option); } select.addEventListener('change', function(e){ e.preventDefault(); var select = e.target; var array_ = find_array_by_type(+select.getAttribute('slot')); if(!array_){ alert('Внутренняя ошибка, обратитесь к разработчику [select handler1]'); return; } var converted = find_converted(array_, +select.getAttribute('inv_id')); if(!converted){ alert('Внутренняя ошибка, обратитесь к разработчику [select handler2]'); return; } var btn = select.parentNode.nextSibling.firstChild; var new_btn = create_button(select.options[select.selectedIndex].value, converted); btn.parentNode.replaceChild(new_btn, btn); }); td.appendChild(select); return td; } //----------------------------------------------------------------------------// function insert_converted(object_){ if(!object_) return; if(object_.is_c) complect_arts.push(object_); else find_array_by_type(object_.slot).push(object_); } //----------------------------------------------------------------------------// function find_array_by_type(slot){ switch(slot) { case slot_type.unknown: return unknown_arts; case slot_type.complect: return complect_arts; case slot_type.right_arm: return right_arm_arts; case slot_type.ring: return ring_arts; case slot_type.head: return head_arts; case slot_type.body: return body_arts; case slot_type.foots: return foots_arts; case slot_type.neck: return neck_arts; case slot_type.rear: return rear_arts; case slot_type.left_arm: return left_arm_arts; case slot_type.backpack: return backpack_arts; } return null; } //----------------------------------------------------------------------------// function sort_all(){ sort_artefacts(right_arm_arts); sort_artefacts(ring_arts); sort_artefacts(head_arts); sort_artefacts(body_arts); sort_artefacts(foots_arts); sort_artefacts(neck_arts); sort_artefacts(rear_arts); sort_artefacts(left_arm_arts); sort_artefacts(backpack_arts); sort_artefacts(unknown_arts); sort_artefacts(complect_arts); } //----------------------------------------------------------------------------// function sort_artefacts(array_){ array_.sort(function(a, b){ if(a.price == b.price){ if(a.craft == b.craft){ if(a.lvl == b.lvl) return compare(b.b_count, a.b_count); return compare(b.lvl, a.lvl); } return compare(b.craft, a.craft); } return compare(a.price, b.price); }); } //----------------------------------------------------------------------------// function add_new_content(content){ if(settings.SortByPriceChb) sort_all(); var counter = { val: 0 }; add_array_content(content, unknown_arts, slot_type.unknown, 'Неизвестные артефакты', counter); add_array_content(content, right_arm_arts, slot_type.right_arm, 'В правую руку', counter); add_array_content(content, ring_arts, slot_type.ring, 'Кольца', counter); add_array_content(content, head_arts, slot_type.head, 'Головные уборы', counter); add_array_content(content, body_arts, slot_type.body, 'Броня/одежда', counter); add_array_content(content, foots_arts, slot_type.foots, 'Обувь', counter); add_array_content(content, neck_arts, slot_type.neck, 'Ожерелья/амулеты', counter); add_array_content(content, rear_arts, slot_type.rear, 'Оружие на спину/плащи', counter); add_array_content(content, left_arm_arts, slot_type.left_arm, 'В левую руку', counter); add_array_content(content, backpack_arts, slot_type.backpack, 'В рюкзак', counter); add_array_content(content, complect_arts, slot_type.complect, 'Комплекты', counter); } //----------------------------------------------------------------------------// function add_array_content(content, array_, type, caption, counter){ if(settings.OnlyChoosedChb){ array_ = array_.filter(function(current){ if(!current.id) return true; return choosed.indexOf(current.id) != -1; }); } if(!array_.length) return; var e_color = '#eeeeee'; var f_color = '#ffffff'; //caption var tr = document.createElement('tr'); var td = document.createElement('td'); td.class = 'wblight'; td.align = 'center'; var is_expanded = load_value(script_name + 'SlotExpand' + type, 'false') == 'true'; var b = document.createElement('b'); var a = document.createElement('a'); a.textContent = caption + '[' + array_.length + ']'; a.href = "#"; a.style.textDecoration = 'none'; a.setAttribute('expand', is_expanded ? 'true' : 'false'); a.addEventListener('click', function(e){ e.preventDefault(); var expand = e.target.getAttribute('expand') == 'true'; show_content_table(e.target, !expand); e.target.setAttribute('expand', expand ? 'false' : 'true'); save_value(script_name + 'SlotExpand' + type, expand ? 'false' : 'true'); }); tr.appendChild(td); td.appendChild(b); b.appendChild(a); content.appendChild(tr); //end caption //content tr = document.createElement('tr'); td = document.createElement('td'); var table = document.createElement('table'); table.width="100%"; for(var i = 0; i < array_.length; ++i){ array_[i].node.bgColor = (counter.val % 2 === 0) ? e_color : f_color; table.appendChild(array_[i].node); ++counter.val; } td.appendChild(table); tr.appendChild(td); content.appendChild(tr); //end content show_content_table(a, is_expanded); } //----------------------------------------------------------------------------// function show_content_table(element, visible){ var tr = element.parentNode.parentNode.parentNode; var next = tr.nextSibling; show_el(next, visible); } //----------------------------------------------------------------------------// function find_converted(array_, inv_id){ for(var i = 0, size = array_.length; i < size; ++i) if(inv_id == array_[i].form.inv_id) return array_[i]; return null; } //----------------------------------------------------------------------------// function send_async_get(url){ document.body.style.cursor = 'wait'; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.overrideMimeType('text/plain; charset=windows-1251'); xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ document.body.style.cursor = 'default'; if(settings.ReloadChb) reload_page(); } }; xhr.send(null); } //----------------------------------------------------------------------------// function dress_artefact(url, object_){ document.body.style.cursor = 'wait'; var counter = { counter: object_.uids.length }; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.overrideMimeType('text/plain; charset=windows-1251'); xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200) send_dress_async_get('/inventory.php?dress=' + object_.uids[counter.counter - 1] + '&js=1&rand=' + Math.random()*1000000, object_, counter); }; xhr.send(null); } //----------------------------------------------------------------------------// function send_dress_async_get(url, object_, counter){ var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.overrideMimeType('text/plain; charset=windows-1251'); xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ --counter.counter; if(counter.counter) send_dress_async_get('/inventory.php?dress=' + object_.uids[counter.counter - 1] + '&js=1&rand=' + Math.random()*1000000, object_, counter); else{ document.body.style.cursor = 'default'; if(settings.ReloadChb) reload_page(); } } }; xhr.send(null); } //----------------------------------------------------------------------------// function draw_header(parent){ var header = document.createElement('tr'); parent.insertBefore(header, parent.firstChild); var td = document.createElement('td'); td.setAttribute('colspan', '6'); header.appendChild(td); var table = document.createElement('table'); table.style.width = '100%'; td.appendChild(table); var tr = document.createElement('tr'); table.appendChild(tr); var expander = document.createElement('td'); expander.setAttribute('align', 'center'); var is_expanded = load_value(script_name + 'SettingsExpand', 'false') == 'true'; expander.setAttribute('expand', is_expanded ? 'true' : 'false'); expander.textContent = is_expanded ? 'Скрыть настройки' : 'Показать настройки'; expander.addEventListener('click', function(e){ e.preventDefault(); var expanded = expander.getAttribute('expand') == 'false'; show_el(settings_table, expanded); save_value(script_name + 'SettingsExpand', expanded ? 'true' : 'false'); expander.setAttribute('expand', expanded ? 'true' : 'false'); expander.textContent = expanded ? 'Скрыть настройки' : 'Показать настройки'; }); tr.appendChild(expander); tr = document.createElement('tr'); table.appendChild(tr); td = document.createElement('td'); tr.appendChild(td); var settings_table = document.createElement('table'); td.appendChild(settings_table); tr = document.createElement('tr'); settings_table.appendChild(tr); td = document.createElement('td'); tr.appendChild(td); table = document.createElement('table'); td.appendChild(table); for(var i = 0; i < options.length; i += 4){ tr = document.createElement('tr'); table.appendChild(tr); for(var j = i; j < i + 4 && j < options.length; ++j){ td = document.createElement('td'); tr.appendChild(td); var text = document.createTextNode(options[j].label); td.appendChild(text); td = document.createElement('td'); tr.appendChild(td); var chb = document.createElement('input'); chb.type = 'checkbox'; chb.title = options[j].title; chb.id = script_name + options[j].id; chb.checked = settings[options[j].id]; td.appendChild(chb); } } tr = document.createElement('tr'); settings_table.appendChild(tr); td = document.createElement('td'); tr.appendChild(td); var text = document.createTextNode('UIN игрока: '); td.appendChild(text); var sign = document.createElement('input'); sign.id = script_name + 'SignInput'; sign.type = 'text'; sign.style.width = 250; sign.value = settings.CurrentSignInput; sign.title = 'UIN игрока - уникальный номер вашего персонажа, состоит из 32 символов.\n' + 'Необходим для формирования ссылки на переаренду артефакта.\n' + 'Узнать его можно в магазине из ссылки "Купить" для любого артефакта.\n' + 'Например: http://www.heroeswm.ru/shop.php?b=wood_sword&cat=weapon&sign=<...>, где оставшиеся символы - это нужный UIN'; td.appendChild(sign); text = document.createTextNode(' Кол-во боев для переаренды: '); td.appendChild(text); var bcount = document.createElement('input'); bcount.id = script_name + 'ReRentBattleCountInput'; bcount.type = 'text'; bcount.style.width = 30; bcount.value = settings.ReRentBattleCount; bcount.onkeypress = number_input; td.appendChild(bcount); tr = document.createElement('tr'); settings_table.appendChild(tr); td = document.createElement('td'); td.setAttribute('align', 'right'); tr.appendChild(td); var saver = document.createElement('input'); saver.type = 'button'; saver.value = 'Применить'; saver.addEventListener('click', function(e){ e.preventDefault(); save_settings(); }); td.appendChild(saver); show_el(settings_table, is_expanded); } //----------------------------------------------------------------------------// function draw_undress_button(content){ var table = content.parentNode.parentNode.parentNode.parentNode.parentNode.previousSibling.previousSibling; if(table.firstChild.childNodes.length < 4) return; var your_rent = table.firstChild.childNodes[2]; var a = document.createElement('a'); a.href = ''; a.textContent = '(вернуть все)'; your_rent.firstChild.appendChild(a); a.addEventListener('click', function(e){ e.preventDefault(); document.body.style.cursor = 'wait'; var xhr = new XMLHttpRequest(); xhr.open('GET', '/inventory.php?all_off=100', true); xhr.overrideMimeType('text/plain; charset=windows-1251'); xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200) send_storage_async_get(document.location); }; xhr.send(null); }); } //----------------------------------------------------------------------------// function send_storage_async_get(url){ var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.overrideMimeType('text/plain; charset=windows-1251'); xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ var response = xhr.response; var re = /<a href="(inventory\.php\?art_return=.+?)">/gmi; var matches = [], links = []; while(matches = re.exec(response)) links.push(matches[1]); var counter = { counter: links.length }; if(counter.counter) send_return_async_get(links[counter.counter - 1], links, counter); } }; xhr.send(null); } //----------------------------------------------------------------------------// function send_return_async_get(url, array_, counter){ var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.overrideMimeType('text/plain; charset=windows-1251'); xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ --counter.counter; if(counter.counter) send_return_async_get(array_[counter.counter - 1], array_, counter); else{ document.body.style.cursor = 'default'; if(settings.ReloadChb) reload_page(); } } }; xhr.send(null); } //----------------------------------------------------------------------------// function add_rerent_links(){ if(!settings.CurrentSignInput){ alert('Невозможно сформировать ссылки для переаренды, укажите UIN игрока'); return; } var return_links = document.querySelectorAll('a[href*="inventory.php?art_return"]'); var bcount = settings.ReRentBattleCount; var cases = [ 2, 0, 1, 1, 1, 2 ]; var words = [ 'бой', 'боя', 'боев']; var bstr = words[ (bcount % 100 > 4 && bcount % 100 < 20) ? 2 : cases[ (bcount % 10 < 5) ? bcount % 10 : 5] ]; for(var i = 0; i < return_links.length; ++i) { var return_link = return_links[i].href; var rerent_obj = convert_into_rerent(return_link); var parent = return_links[i].parentNode; parent.appendChild(document.createElement('br')); var a = document.createElement('a'); a.onclick = function(scope_return_link, scope_rerent_obj){ return function() { rerent_artefact(scope_return_link, scope_rerent_obj); } }(return_link, rerent_obj); parent.appendChild(a); var font = document.createElement('font'); font.style.fontSize = '9px'; font.textContent = 'Переаренда на ' + bcount + ' ' + bstr; a.appendChild(font); } } //----------------------------------------------------------------------------// function convert_into_rerent(return_link){ var re = /.+inventory\.php\?art_return=(\d+)&art=.+?&to=.+?&from_sklad=(\d+)&sklad_cat=([^&+])?&sklad_set=(\d+)/; var matches = re.exec(return_link); return { link: 'sklad_info.php?id=' + matches[2] + '&sign=' + settings.CurrentSignInput + '&cat=' + matches[3] + '&action=rent&inv_id=' + matches[1] + '&set_id=' + matches[4] + '&bcnt' + matches[1] + '=' + settings.ReRentBattleCount, uid: matches[1] }; } //----------------------------------------------------------------------------// function rerent_artefact(return_link, rerent_obj){ document.body.style.cursor = 'wait'; var xhr = new XMLHttpRequest(); xhr.open('GET', return_link, true); xhr.overrideMimeType('text/plain; charset=windows-1251'); xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ var obj = { uids: [rerent_obj.uid] }; settings.DressChb ? dress_artefact(rerent_obj.link, obj) : send_async_get(rerent_obj.link); } }; xhr.send(null); } //----------------------------------------------------------------------------// function load_settings(){ var settings_ = load_value(script_name + 'Settings'); if(settings_ == 'undefined'){ // error at 1.2.4 - 1.2.8 remove_value(script_name + 'Settings'); settings_ = null; } if(settings_){ settings_ = JSON.parse(settings_); if(!settings_.CurrentUser){ settings_.CurrentUser = current_user_id; settings_.CurrentSignInput = ''; settings_.UINPairs = [ { id: current_user_id, uin: ''} ]; settings_.ReRentBattleCount = 1; alert('В скрипте сортировки склада появился параметр "UIN игрока".\n' + 'Если вы хотите использовать переаренду артефактов, необходимо указать его в настройках.\n' + 'Подробнее во всплывающей подсказке поля ввода'); save_value(script_name + 'Settings', JSON.stringify(settings_)); } if(settings_.CurrentUser != current_user_id){ var uin = get_uin(settings_, current_user_id); settings_.CurrentSignInput = uin; if(!uin) alert('В прошлый раз вы заходили другим персонажем, параметр "UIN игрока" для этого персонажа требуется ввести заново'); } return settings_; } settings_ = { CurrentSignInput: '', CurrentUser: current_user_id, UINPairs: [ { id: current_user_id, uin: ''} ], ReRentBattleCount: 1 }; options.forEach(function(current){ settings_[current.id] = false; }); return settings_; } //----------------------------------------------------------------------------// function save_settings(){ var errors = []; var sign = document.getElementById(script_name + 'SignInput').value; if(!sign.trim().length) errors.push('Не указан UIN игрока'); var bcount = +document.getElementById(script_name + 'ReRentBattleCountInput').value; if(isNaN(bcount) || bcount < 1 || bcount > 20) errors.push('Количество боев для переаренды артефакта должно лежать между 1 и 20'); if(errors.length){ alert('Ошибки при сохранении:\n\n' + errors.join('\n')); return; } settings.CurrentSignInput = sign; settings.CurrentUser = current_user_id; settings.ReRentBattleCount = bcount; var uin = get_uin(settings, settings.CurrentUser); if(!uin) settings.UINPairs.push( { id: settings.CurrentUser, uin: settings.CurrentSignInput } ); options.forEach(function(current){ var chb = document.getElementById(script_name + current.id); settings[current.id] = chb.checked; }); save_value(script_name + 'Settings', JSON.stringify(settings)); reload_page(); } //----------------------------------------------------------------------------// function get_uin(array_, id){ var uin = ''; array_.UINPairs.forEach(function(current){ if(current.id == id) uin = current.uin; }); return uin; } //----------------------------------------------------------------------------// } catch(e){ alert('Ошибка в скрипте ' + script_name + ', обратитесь к разработчику:\n' + e); throw e; }}()); // wrapper end //----------------------------------------------------------------------------//