您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
allows you to sell items from inventory and resources from anywhere
// ==UserScript== // @name sell_items_from_inventory // @namespace http://tampermonkey.net/ // @version 3.4.2 // @description allows you to sell items from inventory and resources from anywhere // @author Лосось // @include /^https{0,1}:\/\/((www|my)\.(heroeswm|lordswm)\.(ru|com)|178\.248\.235\.15)* // @include /(https://my.lordswm.com/*|https://www.heroeswm.ru/*)/ // @icon https://www.google.com/s2/favicons?sz=64&domain=lordswm.com // @grant none // @license MIT // ==/UserScript== (function () { "use strict"; const createEl = (el, style, innerText, placeholder, type) => { let element = document.createElement(el); if (style) element.style = style; if (innerText) element.innerText = innerText; if (placeholder) element.placeholder = placeholder; if (type) element.type = type; return element; }; let myCode = localStorage.getItem("myCode"); let links = ["https://my.lordswm.com", "https://www.heroeswm.ru"]; let link = location.href.slice(0, 22) === "https://my.lordswm.com" ? links[0] : links[1]; let linkToMarket = ""; let query = "&sort=204&type=0&snew="; let mockedCzb = JSON.parse(localStorage.getItem("mockedCzb")); let mockedPercent = JSON.parse(localStorage.getItem("mockedPercent")); if (mockedCzb === null) JSON.stringify(localStorage.setItem("mockedCzb", 0)); if (mockedPercent === null) JSON.stringify(localStorage.setItem("mockedPercent", 100)); const fetchXml = (link, callback) => { if (!link) return; const xhr = new XMLHttpRequest(); xhr.open("get", link); xhr.setRequestHeader("Content-type", "text/html; charset=windows-1251"); if (xhr.overrideMimeType) { xhr.overrideMimeType("text/html; charset=windows-1251"); } xhr.addEventListener("load", () => { let parser = new DOMParser(); let doc = parser.parseFromString(xhr.responseText, "text/html"); callback(doc); }); xhr.send(); }; const getPrices = (doc) => { let priceBlock = doc.getElementsByClassName("wbwhite")[0]; let price = Number( priceBlock .getElementsByTagName("table")[3] .getElementsByTagName("td")[1] .innerText.replace(",", "") ); let strength = Number( priceBlock .getElementsByTagName("table")[1] .getElementsByTagName("td")[1] .innerText.match(/Прочность: .+/gi)[0] .match(/\d+/gi)[0] ); let priceOneBattle = Math.round(price / strength); let artName = JSON.parse(localStorage.getItem("artNameLS")); let isIntact = artName.match(/\d+\/\d+/)[0].split("/"); isIntact = Number(isIntact[0]) === Number(isIntact[1]); let myStrength = artName.match(/\d+\/\d+/)[0].split("/"); myStrength = Number(myStrength[0]); let myPrice = Math.round(myStrength * priceOneBattle); let mockedPrice; if (mockedCzb !== 0 && mockedPercent !==0) { mockedPrice = Math.round(myStrength * (mockedCzb * (mockedPercent/100))); } else if (mockedCzb !== 0 && mockedPercent === 0) { mockedPrice = Math.round(mockedCzb * myStrength); } else if (mockedCzb === 0 && mockedPercent !== 0) { mockedPrice = Math.round((priceOneBattle * myStrength) * (mockedPercent/100)); } let isBothZero = (mockedCzb === 0 && mockedPercent === 0); let priceInput = document.getElementById("anl_price"); if (isIntact && price > myPrice) { priceInput.value = isBothZero ? Math.round(myPrice * 0.95) : mockedPrice; } else if (isIntact) { priceInput.value = isBothZero ? Math.round(price * 0.95) : mockedPrice; } else if (!isIntact) { priceInput.value = isBothZero ? Math.round(myPrice * 0.95) : mockedPrice; } priceInput.dispatchEvent(new Event('keyup')); let mobileBlock = document.getElementById('set_mobile_max_width'); let center = document.getElementsByTagName("center")[1]; let infoBlock = createEl("div", "width: 900px"); infoBlock.innerHTML = priceBlock.innerHTML; if (center === undefined) { mobileBlock.appendChild(infoBlock); } else { center.appendChild(infoBlock); } }; const getLinkToMarket = (doc) => { let block = doc.getElementsByClassName("art_info_left_block")[0]; block = [...block.getElementsByTagName("a")]; let link = block.filter((el) => el.href.includes("auction"))[0]; if (link) linkToMarket = link.href; let artName = JSON.parse(localStorage.getItem("artNameLS")); let isIntact = artName.match(/\d+\/\d+/)[0].split("/"); isIntact = Number(isIntact[0]) === Number(isIntact[1]); isIntact ? fetchXml(linkToMarket + query + 1, getPrices) : fetchXml(linkToMarket + query + 0, getPrices); }; if (location.href === `${link}/inventory.php`) { const refreshTabs = () => { let my_arts = [...document.getElementById("inventory_block").children]; my_arts = my_arts.filter( (el) => !el.classList.contains("inventory_item_div_empty") ); my_arts.map((el) => { let id = el.id.match(/\d{1,3}/) let artInfo = arts[parseInt(id)]; el.addEventListener("click", () => { let buttons = document.getElementById("inv_item_buttons"); const myWrapper = createEl('div', 'display: flex'); myWrapper.id = 'myWrapper'; const inputsWrapper = createEl('div', 'display: flex; flex-direction: column; width: 55px'); inputsWrapper.id = 'inputsWrapper'; const czbInput = createEl('input', '', '', 'цзб', 'number'); czbInput.value = mockedCzb; czbInput.addEventListener('change', () => { czbInput.value == "" ? czbInput.value = 0 : czbInput.value; JSON.stringify(localStorage.setItem("mockedCzb", Number(czbInput.value))); mockedCzb = JSON.parse(localStorage.getItem("mockedCzb")); czbInput.value = mockedCzb; }); const percentInput = createEl('input', '', '', '%', 'number'); percentInput.value = mockedPercent; percentInput.addEventListener('change', () => { percentInput.value == "" ? percentInput.value = 0 : percentInput.value; JSON.stringify(localStorage.setItem("mockedPercent", Number(percentInput.value))); mockedPercent = JSON.parse(localStorage.getItem("mockedPercent")); percentInput.value = mockedPercent; }); if (buttons.lastChild.id === "myWrapper") buttons.lastChild.remove(); let sellBtn = createEl( "button", "border-radius: 100%; border: 2px solid #dbb681; background-color: rgba(105, 62, 15, 0.651)", "" ); let sellBtnImg = createEl("img"); sellBtn.id = "sellBtn"; sellBtn.title = "sell on market"; sellBtnImg.classList.add("inv_item_select_img", "show_hint"); sellBtn.classList.add("inv_item_select", "inv_item_select_img"); sellBtnImg.src = "https://img.icons8.com/?size=80&id=cChy69pWtl7N&format=png"; sellBtn.appendChild(sellBtnImg); let artInfoLink = document.getElementById( "inv_item_select_info_a" ).href; localStorage.setItem("artInfoLink", JSON.stringify(artInfoLink)); let artName = `${artInfo.name} ${artInfo.durability1}/${artInfo.durability2}` sellBtn.addEventListener("click", () => { localStorage.setItem("artNameLS", JSON.stringify(artName)); window.open(`${link}/auction_new_lot.php`, "_blank"); }); inputsWrapper.appendChild(czbInput); inputsWrapper.appendChild(percentInput); myWrapper.appendChild(sellBtn); myWrapper.appendChild(inputsWrapper); buttons.appendChild(myWrapper); }); }); }; refreshTabs(); let artsTabs = [ ...document.getElementsByClassName("filter_tabs_block")[0].children, ]; artsTabs.map((el) => el.addEventListener("click", refreshTabs)); } if (location.href === `${link}/auction_new_lot.php`) { let select = document.getElementById("sel"); let options = [...select.options]; let artName = JSON.parse(localStorage.getItem("artNameLS")); select[ options.findIndex((el) => el.innerText.includes(artName)) ].selected = true; let amount = document.getElementById("anl_count"); amount.value = "1"; let time = document.getElementById("duration"); time.lastChild.selected = true; fetchXml(JSON.parse(localStorage.getItem("artInfoLink")), getLinkToMarket); } //Selling resources from anywhere; let resources = []; let wood; let ore; let mercury; let sulphur; let crystal; let gem; if (document.getElementsByClassName("panel_res_link panel_res_link_add").length !== 0) { resources = [...document.getElementsByClassName("panel_res_link panel_res_link_add")]; wood = resources[2]; ore = resources[3]; mercury = resources[4]; sulphur = resources[5]; crystal = resources[6]; gem = resources[7]; } else { resources = [...document.getElementsByClassName("sh_ResourcesItem")]; wood = resources[1]; ore = resources[2]; mercury = resources[3]; sulphur = resources[4]; crystal = resources[5]; gem = resources[6]; } const woodImg = wood.firstChild; const woodAmount = wood.lastChild.innerText; const oreImg = ore.firstChild; const oreAmount = ore.lastChild.innerText; const mercuryImg = mercury.firstChild; const mercuryAmount = mercury.lastChild.innerText; const sulphurImg = sulphur.firstChild; const sulphurAmount = sulphur.lastChild.innerText; const crystalImg = crystal.firstChild; const crystalAmount = crystal.lastChild.innerText; const gemImg = gem.firstChild; const gemAmount = gem.lastChild.innerText; const sellResource = (resource, price, count) => { let form = new FormData(); form.append("item", resource); form.append("count", count); form.append("atype", 1); form.append("price", price); form.append("duration", 8); form.append("sign", myCode); fetch(`${link}/auction_accept_new_lot.php`, { method: "POST", headers: { Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Cache-Control": "max-age=0", }, body: form, }).then((res) => { if (res.url.includes("msg_type=1")) { location.reload(); } else if (res.url.includes("msg_type=2")) { const dialog = createEl( "div", "position: absolute; width: 450px; padding: 10px; border: 1px solid grey; height: 150px; display:flex; align-items: center; text-content: center; border-radius: 10px; background: white; left: 40%; top: 20%;" ); const msg = createEl( "div", "font-size: 36px;", "Something went wrong!" ); dialog.appendChild(msg); document.body.appendChild(dialog); const timeout = setTimeout(() => { dialog.style.display = "none"; }, 2000); } }); }; const images = [woodImg, oreImg, mercuryImg, sulphurImg, crystalImg, gemImg]; images.forEach((img) => { img.style.cursor = "pointer"; }); woodImg.addEventListener("click", () => { let count = +woodAmount; count < 50 ? (count = count) : (count = 50); sellResource("wood", 182, count); }); oreImg.addEventListener("click", () => { let count = +oreAmount; count < 50 ? (count = count) : (count = 50); sellResource("ore", 182, count); }); mercuryImg.addEventListener("click", () => { let count = +mercuryAmount; count < 50 ? (count = count) : (count = 50); sellResource("mercury", 363, count); }); sulphurImg.addEventListener("click", () => { let count = +sulphurAmount; count < 50 ? (count = count) : (count = 50); sellResource("sulphur", 363, count); }); crystalImg.addEventListener("click", () => { let count = +crystalAmount; count < 50 ? (count = count) : (count = 50); sellResource("crystal", 363, count); }); gemImg.addEventListener("click", () => { let count = +gemAmount; count < 50 ? (count = count) : (count = 50); sellResource("gem", 363, count); }); })();