HWM_AH_Helper

Торговый помощник (удобное выставление лотов и автозаполнение цены)

  1. // ==UserScript==
  2. // @name HWM_AH_Helper
  3. // @namespace Рианти
  4. // @description Торговый помощник (удобное выставление лотов и автозаполнение цены)
  5. // @version 1.1
  6. // @include http://www.heroeswm.ru/auction_new_lot.php
  7. // ==/UserScript==
  8.  
  9. //====Init Vars====//
  10. var artsArray = {"leatherhat":"helm","leather_helm":"helm","wizard_cap":"helm","chain_coif":"helm","necrohelm2":"helm","xymhelmet15":"helm","mhelmetzh13":"helm","hunter_roga1":"helm","mif_lhelmet":"helm","tj_helmet3":"helm","zxhelmet13":"helm","shelm12":"helm","steel_helmet":"helm","mif_hhelmet":"helm","tj_helmet1":"helm","shelm16":"helm","gm_hat":"helm","tj_helmet2":"helm","sh_helmet":"helm","lizard_helm":"helm","mage_helm":"helm","hunter_helm":"helm","ogre_helm":"helm","orc_hat":"helm","shelm8":"helm","myhelmet15":"helm","helmet17":"helm","necrohelm3":"helm","necrohelm1":"helm","mhelmet17":"helm","knowledge_hat":"helm","hunter_hat1":"helm","wzzamulet16":"necklace","gm_amul":"necklace","mmzamulet16":"necklace","smamul17":"necklace","sh_amulet2":"necklace","hunter_amulet1":"necklace","bafamulet15":"necklace","amulet_of_luck":"necklace","samul14":"necklace","wzzamulet13":"necklace","sharik":"necklace","5years_star":"necklace","zub":"necklace","warrior_pendant":"necklace","mamulet19":"necklace","power_pendant":"necklace","hunter_pendant1":"necklace","amulet19":"necklace","magic_amulet":"necklace","bravery_medal":"necklace","mmzamulet13":"necklace","snowjinka":"necklace","sosulka":"necklace","samul17":"necklace","smamul14":"necklace","2year_amul_lords":"necklace","7ka":"necklace","3year_amul":"necklace","rog_demon":"necklace","samul8":"necklace","4year_klever":"necklace","tjam1":"necklace","hauberk":"cuirass","gm_arm":"cuirass","sh_armor":"cuirass","hunter_armor1":"cuirass","tjarmor2":"cuirass","armor15":"cuirass","marmor17":"cuirass","lizard_armor":"cuirass","sarmor16":"cuirass","armor17":"cuirass","leather_shiled":"cuirass","leatherplate":"cuirass","mif_light":"cuirass","tjarmor3":"cuirass","sarmor9":"cuirass","miff_plate":"cuirass","sarmor13":"cuirass","mage_armor":"cuirass","robewz15":"cuirass","wiz_robe":"cuirass","hunter_jacket1":"cuirass","ciras":"cuirass","full_plate":"cuirass","tjarmor1":"cuirass","cloack17":"cloack","cloackwz15":"cloack","scloack8":"cloack","gm_protect":"cloack","sh_cloak":"cloack","hunter_mask1":"cloack","soul_cape":"cloack","wiz_cape":"cloack","scloack16":"cloack","powercape":"cloack","scoutcloack":"cloack","antiair_cape":"cloack","antimagic_cape":"cloack","antifire_cape":"cloack","battlem_cape":"cloack","sunart2":"weapon","staff":"weapon","sword18":"weapon","wood_sword":"weapon","long_bow":"weapon","dubina":"weapon","ogre_bum":"weapon","gdubina":"weapon","gm_kastet":"weapon","hunterdagger":"weapon","tunnel_kirka":"weapon","bludgeon":"weapon","sunart1":"weapon","kopie":"weapon","sh_spear":"weapon","pika":"weapon","shortbow":"weapon","dem_kosa":"weapon","huntersword2":"weapon","gnome_hammer":"weapon","gm_abow":"weapon","goblin_bow":"weapon","sh_bow":"weapon","centaurbow":"weapon","hunter_bow2":"weapon","hunter_bow1":"weapon","bow14":"weapon","bow17":"weapon","scroll18":"weapon","gm_sword":"weapon","power_sword":"weapon","sunart3":"weapon","requital_sword":"weapon","firsword15":"weapon","ssword16":"weapon","ssword8":"weapon","sh_sword":"weapon","ssword10":"weapon","sunart4":"weapon","dem_dmech":"weapon","broad_sword":"weapon","def_sword":"weapon","blacksword":"weapon","blacksword1":"weapon","slayersword":"weapon","mif_sword":"weapon","mif_staff":"weapon","molot_tan":"weapon","ssword13":"weapon","mstaff13":"weapon","mstaff8":"weapon","smstaff16":"weapon","staff18":"weapon","sor_staff":"weapon","ffstaff15":"weapon","mstaff10":"weapon","mm_sword":"weapon","mm_staff":"weapon","hunterdsword":"weapon","energy_scroll":"weapon","composite_bow":"weapon","steel_blade":"weapon","hunter_sword1":"weapon","dem_dtopor":"weapon","orc_axe":"weapon","topor_skelet":"weapon","sea_trident":"weapon","large_shield":"shield","round_shiled":"shield","tj-shield3":"shield","shield13":"shield","s_shield":"shield","ru_statue":"shield","tj-shield1":"shield","gm_defence":"shield","tj-shield2":"shield","dragon_shield":"shield","sh_shield":"shield","huntershield2":"shield","hunter_shield1":"shield","shield16":"shield","shield19":"shield","sshield5":"shield","sshield11":"shield","defender_shield":"shield","sshield14":"shield","boots2":"boots","leatherboots":"boots","hunter_boots":"boots","mif_lboots":"boots","tj_vboots3":"boots","hunter_boots3":"boots","boots13":"boots","sboots12":"boots","sboots16":"boots","gm_spdb":"boots","tj_vboots2":"boots","sh_boots":"boots","lizard_boots":"boots","hunter_boots2":"boots","hunter_boots1":"boots","boots15":"boots","boots17":"boots","mboots17":"boots","mboots14":"boots","sboots9":"boots","steel_boots":"boots","shoe_of_initiative":"boots","wiz_boots":"boots","mif_hboots":"boots","tj_vboots1":"boots","warring13":"ring","gm_rring":"ring","ring19":"ring","wwwring16":"ring","warriorring":"ring","ring2013":"ring","mmmring16":"ring","i_ring":"ring","gm_sring":"ring","sh_ring1":"ring","hunter_ring2":"ring","smring10":"ring","mring19":"ring","circ_ring":"ring","hunter_ring1":"ring","powerring":"ring","bring14":"ring","sring4":"ring","sh_ring2":"ring","doubt_ring":"ring","rashness_ring":"ring","darkring":"ring","sring17":"ring","verve_ring":"ring","smring17":"ring","magring13":"ring","sring10":"ring","6ring":"ring","thief_paper":"other","hunter_gloves1":"other","gm_3arrows":"other","sh_4arrows":"other","hunter_arrows1":"other","thief_neckl":"thief","tm_amulet":"thief","thief_arb":"thief","tm_arb":"thief","thief_goodarmor":"thief","tm_armor":"thief","thief_ml_dagger":"thief","tm_knife":"thief","tm_mring":"thief","ring_of_thief":"thief","tm_wring":"thief","thief_msk":"thief","tm_msk":"thief","thief_cape":"thief","tm_cape":"thief","thief_fastboots":"thief","tm_boots":"thief","tact1w1_wamulet":"tactic","tactcv1_armor":"tactic","tactsm0_dagger":"tactic","tactspw_mring":"tactic","tactwww_wring":"tactic","tact765_bow":"tactic","tactms1_mamulet":"tactic","tactpow_cloack":"tactic","tactmag_staff":"tactic","tactzl4_boots":"tactic","tactaz_axe":"tactic","tacthapp_helmet":"tactic","tactdff_shield":"tactic","v_1armor":"verb","verb11_sword":"verb","verbboots":"verb","ve_helm":"verb","vrb_shild":"verb","piratehat3":"helm","dragon_crown":"helm","surv_mhelmetcv":"helm","surv_helmetpi":"helm","piratehat2":"helm","piratehat1":"helm","8amul_inf":"necklace","quest_pendant1":"necklace","neut_amulet":"necklace","surv_wamuletik":"necklace","trinitypendant":"necklace","tjam2":"necklace","surv_mamulka":"necklace","tjam3":"necklace","dudka":"necklace","magneticarmor":"cuirass","surv_armorsu":"cuirass","pir_armor1":"cuirass","student_armor":"cuirass","surv_marmoroz":"cuirass","pir_armor3":"cuirass","pir_armor2":"cuirass","vtjcloak1":"cloack","vtjcloak3":"cloack","surv_mcloacksv":"cloack","vtjcloak2":"cloack","surv_cloacksrv":"cloack","surv_halberdzg":"weapon","surv_crossbowsurv":"weapon","vbow1":"weapon","vtmsword1":"weapon","dagger":"weapon","surv_daggermd":"weapon","windsword":"weapon","p_sword3":"weapon","surv_sword2sd":"weapon","pegaskop":"weapon","vtmsword3":"weapon","vbow3":"weapon","vbow2":"weapon","lbow":"weapon","vtmsword2":"weapon","surv_sword_surv":"weapon","cold_sword2014":"weapon","surv_staffik":"weapon","p_sword2":"weapon","surv_scrollcd":"weapon","surv_axes":"weapon","p_sword1":"weapon","bshield3":"shield","bshield1":"shield","wshield":"shield","gargoshield":"shield","sshield17":"shield","bshield2":"shield","surv_shieldvv":"shield","polkboots3":"boots","surv_mbootsbb":"boots","polkboots2":"boots","surv_bootsurv":"boots","polkboots1":"boots","surv_wring2o":"ring","v-ring2":"ring","gring":"ring","surv_mring2fpg":"ring","ttring":"ring","surv_wring1my":"ring","blackring":"ring","surv_mring1fd":"ring","v-ring3":"ring","vbolt3":"ring","v-ring1":"ring","vbolt1":"ring","vbolt2":"ring","compass":"other","thief_premiumring2":"thief","thief_premiumring3":"thief","bwar1":"medals","bwar2":"medals","kwar2":"medals","bwar3":"medals","kwar3":"medals","bwar4":"medals","kwar4":"medals","bwar5":"medals","kwar5":"medals","bwar6":"medals","kwar6":"medals","gnomewar6":"medals","bwar_splo":"medals","kwar_splo":"medals","bwar_stoj":"medals","gnomewar_stoj":"medals","kwar_stoj":"medals","bwar_takt":"medals","warthief_medal3":"medals","magewar3":"medals","magewar4":"medals","demwar3":"medals","demwar4":"medals"}
  11. var elementsTable = { 'EL_42' : 'abrasive', 'EL_43' : 'snake_poison', 'EL_46' : 'tiger_tusk', 'EL_44' : 'ice_crystal', 'EL_45' : 'moon_stone', 'EL_40' : 'fire_crystal', 'EL_37' : 'meteorit', 'EL_41' : 'witch_flower', 'EL_39' : 'wind_flower', 'EL_78' : 'fern_flower', 'EL_38' : 'badgrib' };
  12.  
  13. if(GM_getValue("AH_Helper_Setting_1") == null) GM_setValue("AH_Helper_Setting_1", 2);
  14. if(GM_getValue("AH_Helper_Setting_2") == null) GM_setValue("AH_Helper_Setting_2", 2);
  15. if(GM_getValue("AH_Helper_Setting_3") == null) GM_setValue("AH_Helper_Setting_3", 1);
  16. if(GM_getValue("AH_Helper_Setting_4") == null) GM_setValue("AH_Helper_Setting_4", 1);
  17.  
  18. var artsToShow = 3;
  19. //=================//
  20.  
  21. //====AJAX functions====//
  22. function getPageContent(url)
  23. {
  24. var xmlhttp = get_xmlHttp();
  25. xmlhttp.open("GET", url, false);
  26. xmlhttp.overrideMimeType('text/plain; charset=windows-1251');
  27. xmlhttp.send(null);
  28. if(xmlhttp.status == 200)
  29. return xmlhttp.responseText;
  30. return '';
  31. }
  32. function get_xmlHttp()
  33. {
  34. var xmlhttp;
  35. try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
  36. catch(e){
  37. try{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
  38. catch(e){ xmlhttp = false; }
  39. }
  40. if(!xmlhttp && typeof XMLHttpRequest != 'undefined')
  41. { xmlhttp = new XMLHttpRequest(); }
  42. return xmlhttp;
  43. }
  44. //======================//
  45. //====Script Logic====//
  46. function selectionChanged(){
  47. var artName = select.options[select.selectedIndex].value;
  48. var artData = select.options[select.selectedIndex].text;
  49. artSelected(artName, artData);
  50. }
  51. function artSelected(artName, artData){
  52. if(elementsTable[artName] != null){
  53. var temp = artData.split(' ');
  54. var quantity = (temp[temp.length-1].split('(')[1]).split(')')[0];
  55. elementSelected(elementsTable[artName], quantity);
  56. }
  57. else {
  58. artName = artName.split('@')[0];
  59. if(artsArray[artName] == null) return;
  60. var itemParseRegexp = /.* (\d+)\/(\d+)( \((\d+)\)|)/;
  61. var data = artData.match(itemParseRegexp);
  62. var dur1 = data[1]; var dur2 = data[2];
  63. var quantity = 1; if (data[4] != null) quantity = data[4];
  64. ammunitionSelected(artName, dur1, dur2, quantity);
  65. }
  66. }
  67. function elementSelected(element, quantity){
  68. var countField = document.getElementsByName("count")[0];
  69. if(quantity > 10) countField.value = 10;
  70. else countField.value = quantity;
  71. var arts = findOffersForElement(element);
  72. if(arts.length == 0) {
  73. showNoArtsFound();
  74. return;
  75. }
  76. arts.sort(comparePrice);
  77. msgBox1.innerHTML = "<b>Лоты конкурентов:</b>";
  78. var numerator = artsToShow, htmlOutput = "", bestPrice;
  79. for (var id in arts){
  80. if(numerator == artsToShow){
  81. bestPrice = arts[id].price;
  82. }
  83. if(numerator-- == 0) break;
  84. htmlOutput += presentElementsOffer(arts[id]);
  85. if (numerator > 0) htmlOutput += "<br>";
  86. }
  87. msgBox2.innerHTML = htmlOutput;
  88.  
  89. var priceField = document.getElementsByName("price")[0];
  90. priceField.value = bestPrice - GM_getValue("AH_Helper_Setting_3");
  91. }
  92. function ammunitionSelected(artName, artDur1, artDur2, quantity){
  93. var countField = document.getElementsByName("count")[0];
  94. if(quantity > 3) countField.value = 3;
  95. else countField.value = quantity;
  96. var marketOffers = findOffersForArt(artName);
  97. var arts = [];
  98. for (var offer in marketOffers){
  99. if(GM_getValue("AH_Helper_Setting_2") == 2){
  100. if(marketOffers[offer].dur1 != artDur1 || marketOffers[offer].dur2 != artDur2) continue;
  101. }
  102. arts[offer] = marketOffers[offer];
  103. }
  104. if(arts.length == 0) {
  105. showNoArtsFound();
  106. return;
  107. }
  108. arts.sort(comparePPB);
  109. msgBox1.innerHTML = "<b>Лоты конкурентов:</b>";
  110. var numerator = artsToShow, htmlOutput = "", bestPPB, bestPrice;
  111. for (var id in arts){
  112. if(numerator == artsToShow){
  113. bestPPB = arts[id].ppb;
  114. bestPrice = arts[id].price;
  115. }
  116. if(numerator-- == 0) break;
  117. htmlOutput += presentAmmunitionOffer(arts[id]);
  118. if (numerator > 0) htmlOutput += "<br>";
  119. }
  120. msgBox2.innerHTML = htmlOutput;
  121.  
  122. var priceField = document.getElementsByName("price")[0];
  123. if(GM_getValue("AH_Helper_Setting_1") == 2){
  124. if(GM_getValue("AH_Helper_Setting_2") == 1) {
  125. priceField.value = Math.floor(artDur1 * bestPPB) - GM_getValue("AH_Helper_Setting_3");
  126. } else {
  127. priceField.value = bestPrice - GM_getValue("AH_Helper_Setting_3");
  128. }
  129. } else{
  130. priceField.value = artDur1 * Math.floor((bestPPB - GM_getValue("AH_Helper_Setting_3")));
  131. }
  132. }
  133. function findOffersForArt(artName){
  134. var artCategory = artsArray[artName];
  135. var artAHurl = 'http://www.heroeswm.ru/auction.php?cat=' + artCategory + '&sort=4&type=0&art_type=' + artName + '&sbn=1&sau=0';
  136. var page = getPageContent(artAHurl);
  137. var lotRegexp = /<a href="art_info\.php\?id=[\s\S]+?Прочность: (\d+?)\/(\d+?)".+?(|<b>(\d) шт\.<\/b>)<\/td><\/tr><\/table>.+?alt=""><\/td><td>([,\d]+?)<\/td><\/tr>.+?<\/table><\/td><td>(.*?) <\/td>.+?(<a class=pi href="pl_info\.php\?id=\d+?"><b>.+?<\/b><\/a>)<BR>/g;
  138. var match, offers = [], quantity, price;
  139. while (match = lotRegexp.exec(page))
  140. {
  141. quantity = 1;
  142. if(match[4] != null) quantity = match[4];
  143. price = parseInt(deleteAll(match[5], ','));
  144. offers.push({'dur1' : match[1], 'dur2' : match[2], 'quantity' : quantity, 'price' : price, 'priceString' : match[5], 'length' : match[6], 'owner' : match[7], 'ppb' : Math.round(10 * price / parseInt(match[1])) / 10});
  145. }
  146. return offers;
  147. }
  148. function findOffersForElement(elementName){
  149. var artAHurl = 'http://www.heroeswm.ru/auction.php?cat=elements&sort=4&type=0&art_type=' + elementName + '&sbn=1&sau=0';
  150. var page = getPageContent(artAHurl);
  151. var lotRegexp = /\[i\]<\/a><\/b><BR><b>(\d+?) шт\.<\/b><\/td>.*?"Золото" alt=""><\/td><td>([,\d]+?)<\/td><\/tr>.*?<\/tr><\/table><\/td><td>(.+?) <\/td><td valign=top.*?(<a class=pi href="pl_info\.php\?id=\d+?"><b>.*?<\/b><\/a>)<BR>/g
  152. var match, offers = [];
  153. while (match = lotRegexp.exec(page))
  154. {
  155. offers.push({'quantity' : match[1], 'price' : parseInt(deleteAll(match[2], ',')), 'priceString' : match[2], 'length' : match[3], 'owner' : match[4]});
  156. }
  157. return offers;
  158. }
  159. function presentAmmunitionOffer(offer){
  160. return 'Цена за бой: ' + offer.ppb + ' Цена: ' + offer.priceString + ' Прочность: ' + offer.dur1 + '/' + offer.dur2 + ' Кол-во: ' + offer.quantity + ' Длительность: ' + offer.length + ' Владелец: ' + offer.owner;
  161. }
  162. function presentElementsOffer(offer){
  163. return 'Цена: ' + offer.priceString + ' Кол-во: ' + offer.quantity + ' Длительность: ' + offer.length + ' Владелец: ' + offer.owner;
  164. }
  165. function comparePPB(a, b) {
  166. if (a.ppb < b.ppb)
  167. return -1;
  168. if (a.ppb > b.ppb)
  169. return 1;
  170. return 0;
  171. }
  172. function comparePrice(a, b) {
  173. if (a.price < b.price)
  174. return -1;
  175. if (a.price > b.price)
  176. return 1;
  177. return 0;
  178. }
  179. function deleteAll(string, valToDel){
  180. return string.split(valToDel).join('');
  181. }
  182. function showNoArtsFound(){
  183. alert("Подобных артефактов на рынке не найдено.");
  184. }
  185. //====================//
  186.  
  187. //====UI====//
  188. var ss1 = document.createElement("input"); ss1.type = "radio"; ss1.name = "DiscountType"; ss1.value = 1; if(GM_getValue("AH_Helper_Setting_1") == 1) ss1.checked = true; ss1.onchange = function(){GM_setValue("AH_Helper_Setting_1", 1); selectionChanged();};
  189. var ss2 = document.createElement("input"); ss2.type = "radio"; ss2.name = "DiscountType"; ss2.value = 2; if(GM_getValue("AH_Helper_Setting_1") == 2) ss2.checked = true; ss2.onchange = function(){GM_setValue("AH_Helper_Setting_1", 2); selectionChanged();};
  190. var ss3 = document.createElement("input"); ss3.type = "radio"; ss3.name = "CompetitorFilterType"; ss3.value = 1; if(GM_getValue("AH_Helper_Setting_2") == 1) ss3.checked = true; ss3.onchange = function(){GM_setValue("AH_Helper_Setting_2", 1); selectionChanged();};
  191. var ss4 = document.createElement("input"); ss4.type = "radio"; ss4.name = "CompetitorFilterType"; ss4.value = 2; if(GM_getValue("AH_Helper_Setting_2") == 2) ss4.checked = true; ss4.onchange = function(){GM_setValue("AH_Helper_Setting_2", 2); selectionChanged();};
  192. var ss5 = document.createElement("input"); ss5.type = "text"; ss5.name = "DiscountValue"; ss5.size = "2"; ss5.value = GM_getValue("AH_Helper_Setting_3"); ss5.onchange = function(){GM_setValue("AH_Helper_Setting_3", ss5.value); selectionChanged();};
  193.  
  194. var ssLabel0 = document.createElement("b"); ssLabel0.style="font-size:12px;"; ssLabel0.innerHTML = "Настройки скрипта<br><br>";
  195. var ssLabel1 = document.createElement("i"); ssLabel1.style="font-size:12px;"; ssLabel1.innerHTML = "Выставление цены со скидкой: снижение цены за бой<br>";
  196. var ssLabel2 = document.createElement("i"); ssLabel2.style="font-size:12px;"; ssLabel2.innerHTML = "Выставление цены со скидкой: снижение конечной цены артефакта<br><br>";
  197. var ssLabel3 = document.createElement("i"); ssLabel3.style="font-size:12px;"; ssLabel3.innerHTML = "Учёт конкурентов: учитывать все лоты<br>";
  198. var ssLabel4 = document.createElement("i"); ssLabel4.style="font-size:12px;"; ssLabel4.innerHTML = "Учёт конкурентов: учитывать только лоты с идентичной прочностью артефактов<br><br>";
  199. var ssLabel5 = document.createElement("i"); ssLabel5.style="font-size:12px;"; ssLabel5.innerHTML = "Скидка: ";
  200.  
  201. var workTable = document.querySelector(".wbwhite");
  202. workTable.appendChild(ssLabel0); workTable.appendChild(ss1); workTable.appendChild(ssLabel1);
  203. workTable.appendChild(ss2); workTable.appendChild(ssLabel2); workTable.appendChild(ss3); workTable.appendChild(ssLabel3);
  204. workTable.appendChild(ss4); workTable.appendChild(ssLabel4); workTable.appendChild(ssLabel5); workTable.appendChild(ss5);
  205.  
  206. var outputBox = document.createElement("div"); outputBox.style = "font-size:12px;"; outputBox.innerHTML = ""; workTable.insertBefore(outputBox, workTable.firstChild);
  207. var msgBox1 = document.createElement("p"); msgBox1.style = "font-size:12px;"; outputBox.appendChild(msgBox1);
  208. var msgBox2 = document.createElement("p"); msgBox2.style = "font-size:12px;"; outputBox.appendChild(msgBox2);
  209. //==========//
  210.  
  211. var duration = document.getElementsByName("duration")[0];
  212. duration.value = GM_getValue("AH_Helper_Setting_4");
  213. duration.onchange = function(){ GM_setValue("AH_Helper_Setting_4", duration.value); };
  214.  
  215. var select = document.getElementsByName("item")[0];
  216. select.onchange = selectionChanged;