HWM_AH_Helper

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

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name           HWM_AH_Helper
// @namespace      Рианти
// @description    Торговый помощник (удобное выставление лотов и автозаполнение цены)
// @version        1.1
// @include        http://www.heroeswm.ru/auction_new_lot.php
// ==/UserScript==

//====Init Vars====//
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"}
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' };

if(GM_getValue("AH_Helper_Setting_1") == null) GM_setValue("AH_Helper_Setting_1", 2);
if(GM_getValue("AH_Helper_Setting_2") == null) GM_setValue("AH_Helper_Setting_2", 2);
if(GM_getValue("AH_Helper_Setting_3") == null) GM_setValue("AH_Helper_Setting_3", 1);
if(GM_getValue("AH_Helper_Setting_4") == null) GM_setValue("AH_Helper_Setting_4", 1);

var artsToShow = 3;
//=================//

//====AJAX functions====//
function getPageContent(url)
{
    var xmlhttp = get_xmlHttp();
    xmlhttp.open("GET", url, false);
    xmlhttp.overrideMimeType('text/plain; charset=windows-1251');
    xmlhttp.send(null);
    if(xmlhttp.status == 200)
        return xmlhttp.responseText;
    return '';
}
function get_xmlHttp()
{
    var xmlhttp;
    try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
    catch(e){
        try{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
        catch(e){ xmlhttp = false; }
    }
    if(!xmlhttp && typeof XMLHttpRequest != 'undefined')
    { xmlhttp = new XMLHttpRequest(); }
    return xmlhttp;
}
//======================//
//====Script Logic====//
function selectionChanged(){
    var artName = select.options[select.selectedIndex].value;
    var artData = select.options[select.selectedIndex].text;
    artSelected(artName, artData);
}
function artSelected(artName, artData){
    if(elementsTable[artName] != null){
        var temp = artData.split(' ');
        var quantity = (temp[temp.length-1].split('(')[1]).split(')')[0];
        elementSelected(elementsTable[artName], quantity);
    }
    else {
        artName = artName.split('@')[0];
        if(artsArray[artName] == null) return;
        var itemParseRegexp = /.* (\d+)\/(\d+)( \((\d+)\)|)/;
        var data = artData.match(itemParseRegexp);
        var dur1 = data[1]; var dur2 = data[2];
        var quantity = 1; if (data[4] != null) quantity = data[4];
        ammunitionSelected(artName, dur1, dur2, quantity);
    }
}
function elementSelected(element, quantity){
    var countField = document.getElementsByName("count")[0];
    if(quantity > 10) countField.value = 10;
    else countField.value = quantity;
    var arts = findOffersForElement(element);
    if(arts.length == 0) {
        showNoArtsFound();
        return;
    }
    arts.sort(comparePrice);
    msgBox1.innerHTML = "<b>Лоты конкурентов:</b>";
    var numerator = artsToShow, htmlOutput = "", bestPrice;
    for (var id in arts){
        if(numerator == artsToShow){
            bestPrice = arts[id].price;
        }
        if(numerator-- == 0) break;
        htmlOutput += presentElementsOffer(arts[id]);
        if (numerator > 0) htmlOutput += "<br>";
    }
    msgBox2.innerHTML = htmlOutput;

    var priceField = document.getElementsByName("price")[0];
    priceField.value = bestPrice - GM_getValue("AH_Helper_Setting_3");
}
function ammunitionSelected(artName, artDur1, artDur2, quantity){
    var countField = document.getElementsByName("count")[0];
    if(quantity > 3) countField.value = 3;
    else countField.value = quantity;
    var marketOffers = findOffersForArt(artName);
    var arts = [];
    for (var offer in marketOffers){
        if(GM_getValue("AH_Helper_Setting_2") == 2){
            if(marketOffers[offer].dur1 != artDur1 || marketOffers[offer].dur2 != artDur2) continue;
        }
        arts[offer] = marketOffers[offer];
    }
    if(arts.length == 0) {
        showNoArtsFound();
        return;
    }
    arts.sort(comparePPB);
    msgBox1.innerHTML = "<b>Лоты конкурентов:</b>";
    var numerator = artsToShow, htmlOutput = "", bestPPB, bestPrice;
    for (var id in arts){
        if(numerator == artsToShow){
            bestPPB = arts[id].ppb;
            bestPrice = arts[id].price;
        }
        if(numerator-- == 0) break;
        htmlOutput += presentAmmunitionOffer(arts[id]);
        if (numerator > 0) htmlOutput += "<br>";
    }
    msgBox2.innerHTML = htmlOutput;

    var priceField = document.getElementsByName("price")[0];
    if(GM_getValue("AH_Helper_Setting_1") == 2){
        if(GM_getValue("AH_Helper_Setting_2") == 1) {
            priceField.value = Math.floor(artDur1 * bestPPB) - GM_getValue("AH_Helper_Setting_3");
        } else {
            priceField.value = bestPrice - GM_getValue("AH_Helper_Setting_3");
        }
    } else{
        priceField.value = artDur1 * Math.floor((bestPPB - GM_getValue("AH_Helper_Setting_3")));
    }
}
function findOffersForArt(artName){
    var artCategory = artsArray[artName];
    var artAHurl = 'http://www.heroeswm.ru/auction.php?cat=' + artCategory + '&sort=4&type=0&art_type=' + artName + '&sbn=1&sau=0';
    var page = getPageContent(artAHurl);
    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;
    var match, offers = [], quantity, price;
    while (match = lotRegexp.exec(page))
    {
        quantity = 1;
        if(match[4] != null) quantity = match[4];
        price = parseInt(deleteAll(match[5], ','));
        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});
    }
    return offers;
}
function findOffersForElement(elementName){
    var artAHurl = 'http://www.heroeswm.ru/auction.php?cat=elements&sort=4&type=0&art_type=' + elementName + '&sbn=1&sau=0';
    var page = getPageContent(artAHurl);
    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
    var match, offers = [];
    while (match = lotRegexp.exec(page))
    {
        offers.push({'quantity' : match[1], 'price' : parseInt(deleteAll(match[2], ',')), 'priceString' : match[2], 'length' : match[3], 'owner' : match[4]});
    }
    return offers;
}
function presentAmmunitionOffer(offer){
    return 'Цена за бой: ' + offer.ppb + ' Цена: ' + offer.priceString + ' Прочность: ' + offer.dur1 + '/' + offer.dur2 + ' Кол-во: ' + offer.quantity + ' Длительность: ' + offer.length + ' Владелец: ' + offer.owner;
}
function presentElementsOffer(offer){
    return 'Цена: ' + offer.priceString + ' Кол-во: ' + offer.quantity + ' Длительность: ' + offer.length + ' Владелец: ' + offer.owner;
}
function comparePPB(a, b) {
    if (a.ppb < b.ppb)
        return -1;
    if (a.ppb > b.ppb)
        return 1;
    return 0;
}
function comparePrice(a, b) {
    if (a.price < b.price)
        return -1;
    if (a.price > b.price)
        return 1;
    return 0;
}
function deleteAll(string, valToDel){
    return string.split(valToDel).join('');
}
function showNoArtsFound(){
    alert("Подобных артефактов на рынке не найдено.");
}
//====================//

//====UI====//
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();};
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();};
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();};
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();};
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();};

var ssLabel0 = document.createElement("b"); ssLabel0.style="font-size:12px;"; ssLabel0.innerHTML = "Настройки скрипта<br><br>";
var ssLabel1 = document.createElement("i"); ssLabel1.style="font-size:12px;"; ssLabel1.innerHTML = "Выставление цены со скидкой: снижение цены за бой<br>";
var ssLabel2 = document.createElement("i"); ssLabel2.style="font-size:12px;"; ssLabel2.innerHTML = "Выставление цены со скидкой: снижение конечной цены артефакта<br><br>";
var ssLabel3 = document.createElement("i"); ssLabel3.style="font-size:12px;"; ssLabel3.innerHTML = "Учёт конкурентов: учитывать все лоты<br>";
var ssLabel4 = document.createElement("i"); ssLabel4.style="font-size:12px;"; ssLabel4.innerHTML = "Учёт конкурентов: учитывать только лоты с идентичной прочностью артефактов<br><br>";
var ssLabel5 = document.createElement("i"); ssLabel5.style="font-size:12px;"; ssLabel5.innerHTML = "Скидка: ";

var workTable = document.querySelector(".wbwhite");
workTable.appendChild(ssLabel0); workTable.appendChild(ss1); workTable.appendChild(ssLabel1);
workTable.appendChild(ss2); workTable.appendChild(ssLabel2); workTable.appendChild(ss3); workTable.appendChild(ssLabel3);
workTable.appendChild(ss4); workTable.appendChild(ssLabel4); workTable.appendChild(ssLabel5); workTable.appendChild(ss5);

var outputBox = document.createElement("div"); outputBox.style = "font-size:12px;"; outputBox.innerHTML = ""; workTable.insertBefore(outputBox, workTable.firstChild);
var msgBox1 = document.createElement("p"); msgBox1.style = "font-size:12px;"; outputBox.appendChild(msgBox1);
var msgBox2 = document.createElement("p"); msgBox2.style = "font-size:12px;"; outputBox.appendChild(msgBox2);
//==========//

var duration = document.getElementsByName("duration")[0];
duration.value = GM_getValue("AH_Helper_Setting_4");
duration.onchange = function(){ GM_setValue("AH_Helper_Setting_4", duration.value); };

var select = document.getElementsByName("item")[0];
select.onchange = selectionChanged;