HWM_WH_Helper

Сохранение последних введенных данных по артам, работа без перезагрузки при сохранении новых параметров или взятии артов со склада, сохраненение всего одной кнопкой, и другое.

  1. // ==UserScript==
  2. // @name HWM_WH_Helper
  3. // @namespace Рианти
  4. // @description Сохранение последних введенных данных по артам, работа без перезагрузки при сохранении новых параметров или взятии артов со склада, сохраненение всего одной кнопкой, и другое.
  5. // @include http://www.heroeswm.ru/sklad_info.php?id=*&cat=*
  6. // @version 1.3
  7. // @grant GM_getValue
  8. // @grant GM_setValue
  9. // @grant GM_xmlhttpRequest
  10. // ==/UserScript==
  11.  
  12. // Когда цена оранжевая - значит, что сохраненная в скрипте цифра отличается от текущей на складе. Оранжевая - та что сохранена у тебя. Чтоб узнать текущую нужно навести мышку на поле с ценой, она будет в подсказке
  13.  
  14. ///settings
  15. var elementColorOnDifference = '#E97300';
  16. var defaultAccessLevel = 0;
  17. var checkerTimeout = 50; //ms
  18. //\settings
  19.  
  20. var saveStack = [], removeStack = [], stackBusy = 0, dissasembly = 0, transferNick, transferPrice, battlesCount, leaseTime;
  21.  
  22. var constants = {
  23. disabledAccessLevel: '1000',
  24. inventorySign: ''
  25. };
  26.  
  27. getSign(function (sign){ constants.inventorySign = sign });
  28.  
  29. function serialize (form) {
  30. if (!form || form.nodeName !== "FORM") {
  31. return;
  32. }
  33. var i, j, q = [];
  34. for (i = form.elements.length - 1; i >= 0; i = i - 1) {
  35. if (form.elements[i].name === "") {
  36. continue;
  37. }
  38. switch (form.elements[i].nodeName) {
  39. case 'INPUT':
  40. switch (form.elements[i].type) {
  41. case 'text':
  42. case 'hidden':
  43. case 'password':
  44. case 'button':
  45. case 'reset':
  46. case 'submit':
  47. q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
  48. break;
  49. case 'checkbox':
  50. case 'radio':
  51. if (form.elements[i].checked) {
  52. q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
  53. }
  54. break;
  55. }
  56. break;
  57. case 'file':
  58. break;
  59. case 'TEXTAREA':
  60. q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
  61. break;
  62. case 'SELECT':
  63. switch (form.elements[i].type) {
  64. case 'select-one':
  65. q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
  66. break;
  67. case 'select-multiple':
  68. for (j = form.elements[i].options.length - 1; j >= 0; j = j - 1) {
  69. if (form.elements[i].options[j].selected) {
  70. q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].options[j].value));
  71. }
  72. }
  73. break;
  74. }
  75. break;
  76. case 'BUTTON':
  77. switch (form.elements[i].type) {
  78. case 'reset':
  79. case 'submit':
  80. case 'button':
  81. q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
  82. break;
  83. }
  84. break;
  85. }
  86. }
  87. return q.join("&");
  88. }
  89.  
  90. var buttons = document.querySelectorAll('input[type="submit"][value="Сохранить"]');
  91. for(var i = 0; i < buttons.length; i++){
  92. buttons[i].onclick = function(e){
  93. e.preventDefault();
  94. e.target.value = 'Сохраняем..';
  95. e.target.disabled = true;
  96. stackBusy = 1;
  97. GM_xmlhttpRequest({
  98. overrideMimeType: 'text/plain; charset=windows-1251',
  99. synchronous: false,
  100. url: 'http://www.heroeswm.ru/sklad_info.php?' + serialize(e.target.form),
  101. method: "GET",
  102. onload: function(response){
  103. e.target.value = 'Сохранено';
  104. stackBusy = 0;
  105. }
  106. });
  107. };
  108. saveStack.push(buttons[i]);
  109. }
  110.  
  111. buttons = document.querySelectorAll('input[type="submit"][value="Разобрать"]');
  112. for(i = 0; i < buttons.length; i++){
  113. var t = buttons[i].parentElement.parentElement.parentElement.innerHTML.split('uid=');
  114. var st = [], uid;
  115. for (var j = 1; j < t.length; j++){
  116. uid = t[j].substr(0, t[j].indexOf('&'));
  117. if(st.indexOf(uid) == -1) st.push(uid);
  118. }
  119. buttons[i].id = '-1|' + st.join('|');
  120. buttons[i].onclick = function(e){
  121. if (!e.ctrlKey && !dissasembly){
  122. e.traget.form.submit(); // traget?
  123. return;
  124. }
  125. if(e.ctrlKey && e.shiftKey) {
  126. transferNick = prompt('Введите ник получателя:');
  127. if(!transferNick) return;
  128. transferPrice = prompt('Введите ЦЗБ каждого из артов:', 1);
  129. if(!transferPrice) return;
  130. battlesCount = prompt('Введите кол-во боёв:', 1);
  131. if(!battlesCount) return;
  132. leaseTime = prompt('Введите период аренды:', 0.1);
  133. if(!leaseTime) return;
  134. }
  135. e.preventDefault();
  136. stackBusy = 1;
  137. if(!e.shiftKey) e.target.value = 'Забираем..';
  138. else e.target.value = 'Вешаем..';
  139. e.target.disabled = true;
  140. disassemble(e);
  141. };
  142. removeStack.push(buttons[i]);
  143. }
  144.  
  145. function disassemble(e) {
  146. if (e.target.id == '') {
  147. if (!e.shiftKey) e.target.value = 'Забрано';
  148. else e.target.value = 'Подвешено';
  149. stackBusy = 0;
  150. return;
  151. }
  152.  
  153. var ids = e.target.id.split('|');
  154. var curId = ids.shift();
  155. e.target.id = ids.join('|');
  156.  
  157. if (curId == '-1') {
  158. GM_xmlhttpRequest({
  159. overrideMimeType: 'text/plain; charset=windows-1251',
  160. synchronous: false,
  161. url: 'http://www.heroeswm.ru/sklad_info.php?' + serialize(e.target.form),
  162. method: "GET",
  163. onload: function (response) {
  164. disassemble(e);
  165. }
  166. });
  167. } else {
  168. var se = 'set_id=0&inv_id=' + curId + '&action=get_art&cat=0&sign=' + serialize(e.target.form).split('sign=')[1];
  169. GM_xmlhttpRequest({
  170. overrideMimeType: 'text/plain; charset=windows-1251',
  171. synchronous: false,
  172. url: 'http://www.heroeswm.ru/sklad_info.php?' + se,
  173. method: "GET",
  174. onload: function (response) {
  175. if (e.shiftKey){
  176. var artId = curId,
  177. recieverNick = transferNick,
  178. price = transferPrice * battlesCount,
  179. dayTime = leaseTime,
  180. battles = battlesCount;
  181. transferArt(artId, recieverNick, price, dayTime, battles, constants.inventorySign, function(){
  182. disassemble(e);
  183. });
  184. } else disassemble(e);
  185. }
  186. });
  187. }
  188. }
  189.  
  190. buttons = document.querySelectorAll('input[type="submit"][value="Забрать"]');
  191. for(i = 0; i < buttons.length; i++){
  192. buttons[i].onclick = function(e){
  193. e.preventDefault();
  194. if(e.shiftKey && e.ctrlKey){
  195. transferNick = prompt('Введите ник получателя:');
  196. if(!transferNick) return;
  197. transferPrice = prompt('Введите ЦЗБ каждого из артов:', 1);
  198. if(!transferPrice) return;
  199. battlesCount = prompt('Введите кол-во боёв:', 1);
  200. if(!battlesCount) return;
  201. leaseTime = prompt('Введите период аренды:', 0.1);
  202. if(!leaseTime) return;
  203. e.target.value = 'Вешаем..';
  204. }
  205. else e.target.value = 'Забираем..';
  206. e.target.disabled = true;
  207. stackBusy = 1;
  208. GM_xmlhttpRequest({
  209. overrideMimeType: 'text/plain; charset=windows-1251',
  210. synchronous: false,
  211. url: 'http://www.heroeswm.ru/sklad_info.php?' + serialize(e.target.form),
  212. method: "GET",
  213. onload: function(response){
  214. if(e.shiftKey && e.ctrlKey){
  215. var artId = e.target.form.querySelector('input[name="inv_id"]').value,
  216. recieverNick = transferNick,
  217. price = transferPrice * battlesCount,
  218. dayTime = leaseTime,
  219. battles = battlesCount;
  220. transferArt(artId, recieverNick, price, dayTime, battles, constants.inventorySign, function(){
  221. e.target.value = 'Подвешено';
  222. stackBusy = 0;
  223. });
  224. }
  225. else {
  226. e.target.value = 'Забрано';
  227. stackBusy = 0;
  228. }
  229. }
  230. });
  231. };
  232. removeStack.push(buttons[i]);
  233. }
  234.  
  235. var forms = document.querySelectorAll('input[type="submit"][value="Сохранить"]');
  236. for(i = 0; i < forms.length - 1; i++){
  237. var form = forms[i].parentElement.parentElement;
  238. var artId = form.querySelector('input[name="inv_id"]').value;
  239. var blimit = form.querySelector('select[name="blimit"]');
  240. var bcost = form.querySelector('input[name="bcost"]');
  241. var al = form.querySelector('select[name="al"]');
  242.  
  243. var saved = JSON.parse(GM_getValue('saved' + artId, 'null'));
  244. if (saved){
  245. if(saved.blimit != null && blimit.selectedIndex != saved.blimit){
  246. blimit.title = 'Сейчас выставлено за: ' + blimit[blimit.selectedIndex].innerHTML;
  247. blimit.value = saved.blimit;
  248. blimit.style.color = elementColorOnDifference;
  249. }
  250. if(saved.bcost != null && bcost.value != saved.bcost){
  251. bcost.title = 'Текущее: ' + bcost.value;
  252. bcost.value = saved.bcost;
  253. bcost.style.color = elementColorOnDifference;
  254. }
  255. if(saved.al == constants.disabledAccessLevel) saved.al = 0;
  256. if(al.value == constants.disabledAccessLevel || (saved.al != null && al.value != saved.al)){
  257. al.title = 'Текущее: ' + al[al.selectedIndex].innerHTML;
  258. al.value = (saved.al != null ? saved.al : defaultAccessLevel);
  259. al.style.color = elementColorOnDifference;
  260. }
  261. }
  262.  
  263. blimit.onchange = bcost.onchange = al.onchange = function(e){
  264. var form = e.target.form;
  265. var artId = form.parentNode.querySelector('input[name="inv_id"]').value;
  266. var saved = JSON.parse(GM_getValue('saved' + artId, '{}'));
  267. saved[e.target.name] = e.target.value;
  268. GM_setValue('saved' + artId, JSON.stringify(saved));
  269. }
  270. }
  271. if(document.location.href.indexOf('cat=4') == -1){
  272. var cell = document.querySelector('td[align="left"][colspan="3"]');
  273. var cellParent = cell.parentElement;
  274. cellParent.removeChild(cell);
  275.  
  276. var td = document.createElement('td');
  277. cellParent.appendChild(td);
  278. td.align = 'center';
  279. td.innerHTML = '<input type="button" value="Сохр. всё" id="scr_save_all">';
  280.  
  281. td = document.createElement('td');
  282. cellParent.appendChild(td);
  283.  
  284. td = document.createElement('td');
  285. cellParent.appendChild(td);
  286. td.align = 'center';
  287. td.innerHTML = '<input type="button" value="Забр. всё" id="scr_remove_all">';
  288.  
  289. document.getElementById('scr_save_all').onclick = saveAll;
  290.  
  291. document.getElementById('scr_remove_all').onclick = removeAll;
  292. } else {
  293. 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)');
  294. cell.innerHTML = '<input type="button" value="Сохр. всё" id="scr_save_all">';
  295. cell.align = 'center';
  296. document.getElementById('scr_save_all').onclick = saveAll;
  297. }
  298. function saveAll(){
  299. if (!saveStack.length){
  300. document.location.reload();
  301. return;
  302. }
  303. if(stackBusy){
  304. setTimeout(saveAll, checkerTimeout);
  305. return;
  306. }
  307.  
  308. var but = saveStack.shift();
  309. but.click();
  310. setTimeout(saveAll, checkerTimeout);
  311. }
  312.  
  313. function removeAll(){
  314. if (!removeStack.length){
  315. document.location.reload();
  316. return;
  317. }
  318. if(stackBusy){
  319. setTimeout(removeAll, checkerTimeout);
  320. return;
  321. }
  322. dissasembly = 1;
  323. var but = removeStack.shift();
  324. but.click();
  325. setTimeout(removeAll, checkerTimeout);
  326. }
  327.  
  328. var buttons = document.querySelectorAll('input[type="submit"][value="Разобрать"]');
  329. for (var i = 0; i < buttons.length; i++){
  330. buttons[i].className = 'dissassembly';
  331. }
  332. buttons = document.querySelectorAll('input[type="submit"][value="Забрать"]');
  333. for (var i = 0; i < buttons.length; i++){
  334. buttons[i].className = 'takeItem';
  335. }
  336.  
  337. document.onkeydown = function(e){
  338. if (e.ctrlKey && !e.shiftKey) {
  339. var buttons = document.querySelectorAll('input[type="submit"][class="dissassembly"]');
  340. for (var i = 0; i < buttons.length; i++){
  341. buttons[i].value = 'Забрать';
  342. }
  343. }
  344. if (e.ctrlKey && e.shiftKey) {
  345. var buttons = document.querySelectorAll('input[type="submit"][class="dissassembly"]');
  346. for (var i = 0; i < buttons.length; i++){
  347. buttons[i].value = 'Подвесить';
  348. }
  349. buttons = document.querySelectorAll('input[type="submit"][class="takeItem"]');
  350. for (var i = 0; i < buttons.length; i++){
  351. buttons[i].value = 'Подвесить';
  352. }
  353. }
  354. };
  355.  
  356. document.onkeyup=function(e){
  357. if (!e.ctrlKey && !e.shiftKey) {
  358. var buttons = document.querySelectorAll('input[type="submit"][class="dissassembly"]');
  359. for (var i = 0; i < buttons.length; i++){
  360. buttons[i].value = 'Разобрать';
  361. }
  362. buttons = document.querySelectorAll('input[type="submit"][class="takeItem"]');
  363. for (var i = 0; i < buttons.length; i++){
  364. buttons[i].value = 'Забрать';
  365. }
  366. }
  367. };
  368.  
  369. function getSign(callbackFunc){
  370. requestPage ('http://www.heroeswm.ru/inventory.php', function(dom){
  371. try {
  372. var scripts = dom.querySelectorAll("script");
  373. var sign;
  374. for ( var i=scripts.length; i--; ) {
  375. sign = /sign=([a-z0-9]+)/.exec( scripts[i].innerHTML );
  376. if ( sign ) {
  377. sign = sign[1];
  378. break;
  379. }
  380. }
  381. console.log(sign);
  382. callbackFunc(sign);
  383. } catch ( e) { console.log (e)}
  384. });
  385. }
  386.  
  387. function transferArt(artId, recieverNick, price, dayTime, battles, sign, callbackFunc){
  388. GM_xmlhttpRequest
  389. ({
  390. method:"POST",
  391. url: "http://www.heroeswm.ru/art_transfer.php" ,
  392. headers:
  393. {
  394. 'Content-Type' : 'application/x-www-form-urlencoded' ,
  395. 'Referer' : 'http://www.heroeswm.ru/art_transfer.php?id='+artId ,
  396. },
  397. 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 ,
  398. onload:function(res)
  399. {
  400. if (callbackFunc && typeof callbackFunc == 'function') callbackFunc(res);
  401. }
  402. });
  403. }
  404.  
  405. function urlencode (str) {
  406. var trans=[],snart=[],ret=[];
  407. for(var i=0x410;i<=0x44F;i++){trans[i]=i-0x350;snart[i-0x350] = i;}
  408. trans[0x401]= 0xA8;trans[0x451]= 0xB8;snart[0xA8] = 0x401;snart[0xB8] = 0x451;
  409. for(var i=0;i<str.length;i++){
  410. var n=str.charCodeAt(i);
  411. if(typeof trans[n]!='undefined') n = trans[n];
  412. if (n <= 0xFF) ret.push(n);
  413. }
  414. return escape(String.fromCharCode.apply(null,ret));
  415. }
  416.  
  417. function requestPage (url, onloadHandler){
  418. console.log('loading: ', url);
  419. try{
  420. GM_xmlhttpRequest({
  421. overrideMimeType: 'text/plain; charset=windows-1251',
  422. synchronous: false,
  423. url: url,
  424. method: "GET",
  425. onload: function(response){
  426. onloadHandler(new DOMParser().parseFromString(response.responseText, 'text/html').documentElement);
  427. },
  428. onerror: function(){ setTimeout( function() { requestPage (url, onloadHandler) }, 500 ) },
  429. ontimeout: function(){ requestPage (url, onloadHandler) },
  430. timeout: 5000
  431. });
  432. } catch (e) {
  433. console.log(e);
  434. }
  435. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址