Repair autofill

Автозаполнение ремонта, запоминание ника, процента. `Передать` на кнопку энтер. Выставить дефолтный процент ремонта и клавишу для отправления в коде

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

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

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name         Repair autofill
// @namespace    http://tampermonkey.net/
// @version      0.3.1
// @description  Автозаполнение ремонта, запоминание ника, процента. `Передать` на кнопку энтер. Выставить дефолтный процент ремонта и клавишу для отправления в коде
// @author       Something begins
// @license     none
// @match       https://www.heroeswm.ru/art_transfer*
// @match       https://my.lordswm.com/art_transfer*
// @match       https://www.lordswm.com/art_transfer*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=heroeswm.ru
// @grant        none
// ==/UserScript==
const sendKey = "Enter";
const defaultPercent = 101;
const defaultNickname = "";
const cost = 700;
const days = 0.05;
const battles = 1;
const allowRepair = true;
const nameInput = document.querySelector('input[placeholder="Введите имя героя"]');
const transferInput = document.querySelector("body > center > table:nth-child(2) > tbody > tr > td > table:nth-child(2) > tbody > tr:nth-child(6) > td:nth-child(2) > input[type=radio]:nth-child(3)")
const costInput = document.querySelector("#gold");
const rentInput = document.querySelector("body > center > table > tbody > tr > td > table:nth-child(2) > tbody > tr:nth-child(6) > td:nth-child(2) > input[type=radio]:nth-child(5)");
const repairInput = document.querySelector('input[onclick="show_arenda(5)"]');

const inputEvent = new Event('input', {
    bubbles: true,
    cancelable: true,
});
const clickEvent = new Event('click', {
    bubbles: true,
    cancelable: true,
});
let nick = localStorage.getItem("rent_autofill_nick");
if (!nick) {
    nick = defaultNickname;
    localStorage.setItem("rent_autofill_nick", nick);
}
nick = nick.replace("@", "").replace(",", "");
let percent = localStorage.getItem("rent_autofill_percent");
if (!percent) {
    percent = defaultPercent;
    localStorage.setItem("rent_autofill_percent", percent);
}
function sameNickOption(select, nick){
    for (const option of select){
        const optionNick = option.textContent.split("[")[0].trim();
        if (optionNick.toLowerCase() === nick.toLowerCase()) return option.value;
    }
    return nick;
}
function autoFillNick() {
    return new Promise((resolve) => {
        const select = document.getElementById("nick_select");
        setTimeout(() => {
            const instance = $(select).data("select2");
            if (instance) {
                instance.open();

                const nameInput2 = document.querySelector('input[placeholder="Введите имя героя"]');
                nameInput2.value = nick;

                const inputEvent = new Event("input", { bubbles: true });
                nameInput2.dispatchEvent(inputEvent);

                setTimeout(() => {
                    // если вписываемый ник и один из ников в дропдауне совпадают, получается ошибка и выбора не происходит
                    const selectValue = sameNickOption(document.querySelector("#nick_select"), nick);
                    select.value = nick;
                    $(select).trigger("change");
                    instance.close();
                    resolve();
                }, 300);
            } else {
                resolve();
            }
        }, 100);
    });
}


autoFillNick().then(() => {
    console.log("Now run next step...");
    percent = parseInt(percent);
    costInput.value = cost;
    repairInput.checked = true;
    repairInput.dispatchEvent(inputEvent);
    repairInput.dispatchEvent(clickEvent);
    setTimeout(fillRent, 100);

});

// селект не хочет меняться на копипасте
/* document.addEventListener("keyup", event =>{
    if (event.target.className !== "select2-search__field") return;
    const nameInput = document.querySelector('input[placeholder="Введите имя героя"]');
    const oldNick = nameInput.value;
    console.log(oldNick, "old");
    nameInput.value = oldNick.replace("@", "").replace(",", "");
    console.log(nameInput.value, "new")
    if (nameInput.value === oldNick) return;
    setTimeout(()=>{
        for (const option of document.querySelector("#nick_select").children){
            if (option.value !== oldNick) continue;
            option.value = nameInput.value;
            option.innerText = nameInput.value;
        }
    }, 1000)
    //nick_select
}) */
function fillRent(){
    document.querySelector("#ar > table > tbody > tr > td:nth-child(1) > input[type=text]").value = days;
    document.querySelector("#ar > table > tbody > tr > td:nth-child(3) > input[type=text]").value = battles;
    const allowRepairInput = document.querySelector("#ar > table > tbody > tr > td:nth-child(5) > input[type=checkbox]");
    if (allowRepair){
        const fullPrice = parseInt(document.querySelector("#rep > table.wb > tbody > tr:nth-child(6) > td:nth-child(4)").textContent.replace(/,/g, ""));
        const userPercent = localStorage.getItem("rent_autofill_checked") === "checked" ? percent : defaultPercent;
        const repairPrice = Math.round(fullPrice / 100 * userPercent);
        const percentInput = document.querySelector("#rep_price");
        percentInput.value = repairPrice;
        percentInput.dispatchEvent(inputEvent);
        percentInput.insertAdjacentHTML("afterend", `<input type="checkbox" id="remember_percent" ${localStorage.getItem("rent_autofill_checked")}>
<label for="remember_percent">Запомнить процент</label>`);
        monitorPercent();
    }
}
document.addEventListener("input", event => {
    if (event.target.placeholder && event.target.placeholder==="Введите имя героя"){
        localStorage.setItem("rent_autofill_nick", document.querySelector('input[placeholder="Введите имя героя"]').value)
    }
    if (event.target.id === "remember_percent"){
        console.log("checked");
        const checked = document.querySelector("#remember_percent").checked ? "checked" : "";
        localStorage.setItem("rent_autofill_checked", checked);
        const userPercent = document.getElementById('comiss2').textContent.split("%")[0].trim();
        localStorage.setItem("rent_autofill_percent", userPercent);
    }
})
document.addEventListener("keyup", event => {
    if (event.key === sendKey) document.querySelector("input[value='Передать']").click();
})
function monitorPercent() {
    const target = document.getElementById('comiss2');
    const observer = new MutationObserver((mutationsList) => {
        for (let mutation of mutationsList) {
            if (mutation.type === 'childList' || mutation.type === 'characterData') {
                if (!document.querySelector("#remember_percent").checked) return;
                const userPercent = target.textContent.split("%")[0].trim();
                localStorage.setItem("rent_autofill_percent", userPercent);
            }
        }
    });

    const config = {
        childList: true,
        characterData: true,
        subtree: true
    };

    observer.observe(target, config);
}