// ==UserScript==
// @name HWM_CommitMultipleTransfers
// @namespace Небылица
// @version 1.21
// @description Отправить несколько переводов золота за раз
// @author Небылица
// @include /^https{0,1}:\/\/((www|qrator)\.heroeswm\.ru|178\.248\.235\.15)\/transfer\.php.*/
// ==/UserScript==
(function() {
'use strict';
// Настройки – указание уникального значения sign и времени задержки
var sign = ""; // вписать свой sign
var delay = 1000; // время ожидания между запросами в мс
//============<Вспомогательные функции>============//
function sendPOSTRequest(url, params){ // Универсалка для отправки POST-запроса
var xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send(params);
return true;
}
function encodeCP1251(text){ // Спасибо Граде за функцию, взял как есть:) Перекодирует русский текст так, чтобы при отправке запроса не выходили кракозябры
var cp1251_to_utf8 =
{
'А': '%C0',
'Б': '%C1',
'В': '%C2',
'Г': '%C3',
'Д': '%C4',
'Е': '%C5',
'Ж': '%C6',
'З': '%C7',
'И': '%C8',
'Й': '%C9',
'К': '%CA',
'Л': '%CB',
'М': '%CC',
'Н': '%CD',
'О': '%CE',
'П': '%CF',
'Р': '%D0',
'С': '%D1',
'Т': '%D2',
'У': '%D3',
'Ф': '%D4',
'Х': '%D5',
'Ц': '%D6',
'Ч': '%D7',
'Ш': '%D8',
'Щ': '%D9',
'Ъ': '%DA',
'Ы': '%DB',
'Ь': '%DC',
'Э': '%DD',
'Ю': '%DE',
'Я': '%DF',
'а': '%E0',
'б': '%E1',
'в': '%E2',
'г': '%E3',
'д': '%E4',
'е': '%E5',
'ж': '%E6',
'з': '%E7',
'и': '%E8',
'й': '%E9',
'к': '%EA',
'л': '%EB',
'м': '%EC',
'н': '%ED',
'о': '%EE',
'п': '%EF',
'р': '%F0',
'с': '%F1',
'т': '%F2',
'у': '%F3',
'ф': '%F4',
'х': '%F5',
'ц': '%F6',
'ч': '%F7',
'ш': '%F8',
'щ': '%F9',
'ъ': '%FA',
'ы': '%FB',
'ь': '%FC',
'э': '%FD',
'ю': '%FE',
'я': '%FF',
'Ё': '%A8',
'ё': '%B8',
' ': '%20',
'!': '%21',
'(': '%28',
')': '%29',
'*': '%2A',
'+': '%2B',
',': '%2C',
'-': '%2D',
'.': '%2E',
'/': '%2F'
};
var result = '';
for(var i = 0; i < text.length; ++i)
{
var is_in_array = cp1251_to_utf8[text[i]] != undefined;
if(is_in_array)
result += cp1251_to_utf8[text[i]];
else
result += text[i];
}
return result;
}
function isNaturalNumber(n) { // Проверка натуральности числа
n = n.toString();
var n1 = Math.abs(n),
n2 = parseInt(n, 10);
return !isNaN(n1) && n2 === n1 && n1.toString() === n && n1 !== 0;
}
function queryWrapper(nicknames, amounts, descriptions, i, sign, delay, urlAfter, e){ // Обёртка для цикличного отправщика запросов
i++;
if (i<nicknames.length){
sendPOSTRequest("transfer.php",
"nick=" + encodeCP1251(nicknames[i]) + "&gold=" + amounts[i] + "&wood=0&ore=0&mercury=0&sulphur=0&crystal=0&gem=0&desc=" + encodeCP1251(descriptions[i]) + "&sign=" + sign);
e.target.innerHTML = "Отправляем... " + (i+1).toString() + "/" + nicknames.length.toString();
window.setTimeout(function(){queryWrapper(nicknames, amounts, descriptions, i, sign, delay, urlAfter, e);}, delay);
} else { // закончили отправку, открываем страницу urlAfter
window.setTimeout(function(){var newWindow = window.open(urlAfter, "_self");}, delay);
}
}
//============</Вспомогательные функции>============//
//============<Вывод формы>============//
var form = document.getElementsByName("f")[0].parentNode;
form.innerHTML = "<br><textarea id=nicknames cols=20 rows=10 placeholder=Ники></textarea><textarea id=amounts cols=8 rows=10 placeholder=Суммы></textarea><textarea id=descriptions cols=50 rows=10 placeholder=Подписи></textarea><br><form id=mode><input type=radio name=mode value=fromtop checked>Сверху вниз</input><br><input type=radio name=mode value=frombottom>Снизу вверх</input></form><button type=button id=submit>Отправить</button>";
form.style = "text-align:center;";
//============</Вывод формы>============//
//============<Обработка данных формы>============//
var button = document.getElementById("submit");
button.onclick = function(e){
try{
console.log(e);
e.preventDefault();
e.target.innerHTML = "Отправляем...";
e.target.disabled = true;
// Вытаскиваем из страницы заполненные поля формы
var nicknames = document.getElementById("nicknames").value.split(/\r?\n/);
var amounts = document.getElementById("amounts").value.split(/\r?\n/);
var descriptions = document.getElementById("descriptions").value.split(/\r?\n/);
var mode = document.querySelector('input[name = "mode"]:checked').value;
var idHref = document.querySelector("a[href^=\"pl_hunter_stat.php\"]").getAttribute("href");
var urlAfter = "http://" + location.hostname + "/pl_transfers.php?id=" + idHref.split("=")[1];
//============<Обёртка с проверкой корректности введённых данных>============//
// Проверка одинаковости количества строк в полях
if (nicknames.length == amounts.length && amounts.length == descriptions.length){
// Проверка того, что все указанные суммы золота – натуральные числа
var amountsCorrect = 1;
for (var i=0; i<amounts.length; i++){
if (!isNaturalNumber(parseInt(amounts[i],10))){
alert("Суммы золота для переводов должны быть натуральными числами!");
e.target.innerHTML = "Отправить";
e.target.disabled = false;
amountsCorrect = 0;
break;
}
}
// Если всё норм, идём дальше
if (amountsCorrect){
// Переворачиваем массивы, если выбран вариант "снизу вверх"
if (mode === "frombottom") {
nicknames.reverse();
amounts.reverse();
descriptions.reverse();
}
// Делаем POST-запросы по количеству строк в полях и переходим на заданную страницу после
queryWrapper(nicknames, amounts, descriptions, -1, sign, delay, urlAfter, e);
}
} else {
alert("Не совпадает количество строк в полях!");
e.target.innerHTML = "Отправить";
e.target.disabled = false;
}
//============</Обёртка с проверкой корректности введённых данных>============//
} catch (e){
console.log(e);
}
};
//============</Обработка данных формы>============//
})();