// ==UserScript==
// @name HWM_WH_Helper
// @namespace Рианти
// @description Сохранение последних введенных данных по артам, работа без перезагрузки при сохранении новых параметров или взятии артов со склада, сохраненение всего одной кнопкой, и другое.
// @include http://www.heroeswm.ru/sklad_info.php?id=*&cat=*
// @version 1.3
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_xmlhttpRequest
// ==/UserScript==
// Когда цена оранжевая - значит, что сохраненная в скрипте цифра отличается от текущей на складе. Оранжевая - та что сохранена у тебя. Чтоб узнать текущую нужно навести мышку на поле с ценой, она будет в подсказке
///settings
var elementColorOnDifference = '#E97300';
var defaultAccessLevel = 0;
var checkerTimeout = 50; //ms
//\settings
var saveStack = [], removeStack = [], stackBusy = 0, dissasembly = 0, transferNick, transferPrice, battlesCount, leaseTime;
var constants = {
disabledAccessLevel: '1000',
inventorySign: ''
};
getSign(function (sign){ constants.inventorySign = sign });
function serialize (form) {
if (!form || form.nodeName !== "FORM") {
return;
}
var i, j, q = [];
for (i = form.elements.length - 1; i >= 0; i = i - 1) {
if (form.elements[i].name === "") {
continue;
}
switch (form.elements[i].nodeName) {
case 'INPUT':
switch (form.elements[i].type) {
case 'text':
case 'hidden':
case 'password':
case 'button':
case 'reset':
case 'submit':
q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
break;
case 'checkbox':
case 'radio':
if (form.elements[i].checked) {
q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
}
break;
}
break;
case 'file':
break;
case 'TEXTAREA':
q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
break;
case 'SELECT':
switch (form.elements[i].type) {
case 'select-one':
q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
break;
case 'select-multiple':
for (j = form.elements[i].options.length - 1; j >= 0; j = j - 1) {
if (form.elements[i].options[j].selected) {
q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].options[j].value));
}
}
break;
}
break;
case 'BUTTON':
switch (form.elements[i].type) {
case 'reset':
case 'submit':
case 'button':
q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
break;
}
break;
}
}
return q.join("&");
}
var buttons = document.querySelectorAll('input[type="submit"][value="Сохранить"]');
for(var i = 0; i < buttons.length; i++){
buttons[i].onclick = function(e){
e.preventDefault();
e.target.value = 'Сохраняем..';
e.target.disabled = true;
stackBusy = 1;
GM_xmlhttpRequest({
overrideMimeType: 'text/plain; charset=windows-1251',
synchronous: false,
url: 'http://www.heroeswm.ru/sklad_info.php?' + serialize(e.target.form),
method: "GET",
onload: function(response){
e.target.value = 'Сохранено';
stackBusy = 0;
}
});
};
saveStack.push(buttons[i]);
}
buttons = document.querySelectorAll('input[type="submit"][value="Разобрать"]');
for(i = 0; i < buttons.length; i++){
var t = buttons[i].parentElement.parentElement.parentElement.innerHTML.split('uid=');
var st = [], uid;
for (var j = 1; j < t.length; j++){
uid = t[j].substr(0, t[j].indexOf('&'));
if(st.indexOf(uid) == -1) st.push(uid);
}
buttons[i].id = '-1|' + st.join('|');
buttons[i].onclick = function(e){
if (!e.ctrlKey && !dissasembly){
e.traget.form.submit(); // traget?
return;
}
if(e.ctrlKey && e.shiftKey) {
transferNick = prompt('Введите ник получателя:');
if(!transferNick) return;
transferPrice = prompt('Введите ЦЗБ каждого из артов:', 1);
if(!transferPrice) return;
battlesCount = prompt('Введите кол-во боёв:', 1);
if(!battlesCount) return;
leaseTime = prompt('Введите период аренды:', 0.1);
if(!leaseTime) return;
}
e.preventDefault();
stackBusy = 1;
if(!e.shiftKey) e.target.value = 'Забираем..';
else e.target.value = 'Вешаем..';
e.target.disabled = true;
disassemble(e);
};
removeStack.push(buttons[i]);
}
function disassemble(e) {
if (e.target.id == '') {
if (!e.shiftKey) e.target.value = 'Забрано';
else e.target.value = 'Подвешено';
stackBusy = 0;
return;
}
var ids = e.target.id.split('|');
var curId = ids.shift();
e.target.id = ids.join('|');
if (curId == '-1') {
GM_xmlhttpRequest({
overrideMimeType: 'text/plain; charset=windows-1251',
synchronous: false,
url: 'http://www.heroeswm.ru/sklad_info.php?' + serialize(e.target.form),
method: "GET",
onload: function (response) {
disassemble(e);
}
});
} else {
var se = 'set_id=0&inv_id=' + curId + '&action=get_art&cat=0&sign=' + serialize(e.target.form).split('sign=')[1];
GM_xmlhttpRequest({
overrideMimeType: 'text/plain; charset=windows-1251',
synchronous: false,
url: 'http://www.heroeswm.ru/sklad_info.php?' + se,
method: "GET",
onload: function (response) {
if (e.shiftKey){
var artId = curId,
recieverNick = transferNick,
price = transferPrice * battlesCount,
dayTime = leaseTime,
battles = battlesCount;
transferArt(artId, recieverNick, price, dayTime, battles, constants.inventorySign, function(){
disassemble(e);
});
} else disassemble(e);
}
});
}
}
buttons = document.querySelectorAll('input[type="submit"][value="Забрать"]');
for(i = 0; i < buttons.length; i++){
buttons[i].onclick = function(e){
e.preventDefault();
if(e.shiftKey && e.ctrlKey){
transferNick = prompt('Введите ник получателя:');
if(!transferNick) return;
transferPrice = prompt('Введите ЦЗБ каждого из артов:', 1);
if(!transferPrice) return;
battlesCount = prompt('Введите кол-во боёв:', 1);
if(!battlesCount) return;
leaseTime = prompt('Введите период аренды:', 0.1);
if(!leaseTime) return;
e.target.value = 'Вешаем..';
}
else e.target.value = 'Забираем..';
e.target.disabled = true;
stackBusy = 1;
GM_xmlhttpRequest({
overrideMimeType: 'text/plain; charset=windows-1251',
synchronous: false,
url: 'http://www.heroeswm.ru/sklad_info.php?' + serialize(e.target.form),
method: "GET",
onload: function(response){
if(e.shiftKey && e.ctrlKey){
var artId = e.target.form.querySelector('input[name="inv_id"]').value,
recieverNick = transferNick,
price = transferPrice * battlesCount,
dayTime = leaseTime,
battles = battlesCount;
transferArt(artId, recieverNick, price, dayTime, battles, constants.inventorySign, function(){
e.target.value = 'Подвешено';
stackBusy = 0;
});
}
else {
e.target.value = 'Забрано';
stackBusy = 0;
}
}
});
};
removeStack.push(buttons[i]);
}
var forms = document.querySelectorAll('input[type="submit"][value="Сохранить"]');
for(i = 0; i < forms.length - 1; i++){
var form = forms[i].parentElement.parentElement;
var artId = form.querySelector('input[name="inv_id"]').value;
var blimit = form.querySelector('select[name="blimit"]');
var bcost = form.querySelector('input[name="bcost"]');
var al = form.querySelector('select[name="al"]');
var saved = JSON.parse(GM_getValue('saved' + artId, 'null'));
if (saved){
if(saved.blimit != null && blimit.selectedIndex != saved.blimit){
blimit.title = 'Сейчас выставлено за: ' + blimit[blimit.selectedIndex].innerHTML;
blimit.value = saved.blimit;
blimit.style.color = elementColorOnDifference;
}
if(saved.bcost != null && bcost.value != saved.bcost){
bcost.title = 'Текущее: ' + bcost.value;
bcost.value = saved.bcost;
bcost.style.color = elementColorOnDifference;
}
if(saved.al == constants.disabledAccessLevel) saved.al = 0;
if(al.value == constants.disabledAccessLevel || (saved.al != null && al.value != saved.al)){
al.title = 'Текущее: ' + al[al.selectedIndex].innerHTML;
al.value = (saved.al != null ? saved.al : defaultAccessLevel);
al.style.color = elementColorOnDifference;
}
}
blimit.onchange = bcost.onchange = al.onchange = function(e){
var form = e.target.form;
var artId = form.parentNode.querySelector('input[name="inv_id"]').value;
var saved = JSON.parse(GM_getValue('saved' + artId, '{}'));
saved[e.target.name] = e.target.value;
GM_setValue('saved' + artId, JSON.stringify(saved));
}
}
if(document.location.href.indexOf('cat=4') == -1){
var cell = document.querySelector('td[align="left"][colspan="3"]');
var cellParent = cell.parentElement;
cellParent.removeChild(cell);
var td = document.createElement('td');
cellParent.appendChild(td);
td.align = 'center';
td.innerHTML = '<input type="button" value="Сохр. всё" id="scr_save_all">';
td = document.createElement('td');
cellParent.appendChild(td);
td = document.createElement('td');
cellParent.appendChild(td);
td.align = 'center';
td.innerHTML = '<input type="button" value="Забр. всё" id="scr_remove_all">';
document.getElementById('scr_save_all').onclick = saveAll;
document.getElementById('scr_remove_all').onclick = removeAll;
} else {
var cell = document.querySelector('table.wb:nth-child(5) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(1) > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(5)');
cell.innerHTML = '<input type="button" value="Сохр. всё" id="scr_save_all">';
cell.align = 'center';
document.getElementById('scr_save_all').onclick = saveAll;
}
function saveAll(){
if (!saveStack.length){
document.location.reload();
return;
}
if(stackBusy){
setTimeout(saveAll, checkerTimeout);
return;
}
var but = saveStack.shift();
but.click();
setTimeout(saveAll, checkerTimeout);
}
function removeAll(){
if (!removeStack.length){
document.location.reload();
return;
}
if(stackBusy){
setTimeout(removeAll, checkerTimeout);
return;
}
dissasembly = 1;
var but = removeStack.shift();
but.click();
setTimeout(removeAll, checkerTimeout);
}
var buttons = document.querySelectorAll('input[type="submit"][value="Разобрать"]');
for (var i = 0; i < buttons.length; i++){
buttons[i].className = 'dissassembly';
}
buttons = document.querySelectorAll('input[type="submit"][value="Забрать"]');
for (var i = 0; i < buttons.length; i++){
buttons[i].className = 'takeItem';
}
document.onkeydown = function(e){
if (e.ctrlKey && !e.shiftKey) {
var buttons = document.querySelectorAll('input[type="submit"][class="dissassembly"]');
for (var i = 0; i < buttons.length; i++){
buttons[i].value = 'Забрать';
}
}
if (e.ctrlKey && e.shiftKey) {
var buttons = document.querySelectorAll('input[type="submit"][class="dissassembly"]');
for (var i = 0; i < buttons.length; i++){
buttons[i].value = 'Подвесить';
}
buttons = document.querySelectorAll('input[type="submit"][class="takeItem"]');
for (var i = 0; i < buttons.length; i++){
buttons[i].value = 'Подвесить';
}
}
};
document.onkeyup=function(e){
if (!e.ctrlKey && !e.shiftKey) {
var buttons = document.querySelectorAll('input[type="submit"][class="dissassembly"]');
for (var i = 0; i < buttons.length; i++){
buttons[i].value = 'Разобрать';
}
buttons = document.querySelectorAll('input[type="submit"][class="takeItem"]');
for (var i = 0; i < buttons.length; i++){
buttons[i].value = 'Забрать';
}
}
};
function getSign(callbackFunc){
requestPage ('http://www.heroeswm.ru/inventory.php', function(dom){
try {
var scripts = dom.querySelectorAll("script");
var sign;
for ( var i=scripts.length; i--; ) {
sign = /sign=([a-z0-9]+)/.exec( scripts[i].innerHTML );
if ( sign ) {
sign = sign[1];
break;
}
}
console.log(sign);
callbackFunc(sign);
} catch ( e) { console.log (e)}
});
}
function transferArt(artId, recieverNick, price, dayTime, battles, sign, callbackFunc){
GM_xmlhttpRequest
({
method:"POST",
url: "http://www.heroeswm.ru/art_transfer.php" ,
headers:
{
'Content-Type' : 'application/x-www-form-urlencoded' ,
'Referer' : 'http://www.heroeswm.ru/art_transfer.php?id='+artId ,
},
data: 'id='+artId+'&nick='+urlencode(recieverNick)+'&gold='+price+'&wood=0&ore=0&mercury=0&sulphur=0&crystal=0&gem=0&sendtype=2&dtime='+dayTime+'&bcount='+battles+'&art_id=&sign='+sign ,
onload:function(res)
{
if (callbackFunc && typeof callbackFunc == 'function') callbackFunc(res);
}
});
}
function urlencode (str) {
var trans=[],snart=[],ret=[];
for(var i=0x410;i<=0x44F;i++){trans[i]=i-0x350;snart[i-0x350] = i;}
trans[0x401]= 0xA8;trans[0x451]= 0xB8;snart[0xA8] = 0x401;snart[0xB8] = 0x451;
for(var i=0;i<str.length;i++){
var n=str.charCodeAt(i);
if(typeof trans[n]!='undefined') n = trans[n];
if (n <= 0xFF) ret.push(n);
}
return escape(String.fromCharCode.apply(null,ret));
}
function requestPage (url, onloadHandler){
console.log('loading: ', url);
try{
GM_xmlhttpRequest({
overrideMimeType: 'text/plain; charset=windows-1251',
synchronous: false,
url: url,
method: "GET",
onload: function(response){
onloadHandler(new DOMParser().parseFromString(response.responseText, 'text/html').documentElement);
},
onerror: function(){ setTimeout( function() { requestPage (url, onloadHandler) }, 500 ) },
ontimeout: function(){ requestPage (url, onloadHandler) },
timeout: 5000
});
} catch (e) {
console.log(e);
}
}