Import from Clipboard

A simple script for the game synergism that allows you to import ambrosia loadouts via clipboard.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         Import from Clipboard
// @namespace    https://github.com/Ikerstreamer/synergism-plugins
// @version      0.1.1
// @description  A simple script for the game synergism that allows you to import ambrosia loadouts via clipboard.
// @author       IkerStream
// @match        https://synergism.cc/
// @icon         https://www.google.com/s2/favicons?sz=64&domain=synergism.cc
// @grant        none
// ==/UserScript==

(() => {
    const callback = (elem) => () => {
        const allBlueberries = Object.fromEntries(Array(...document.getElementsByClassName("blueberryUpgrade")).map(
            (elem) => [elem.id, elem]
        ));
        const alertBox = document.getElementById("alertWrapper");
        const confirmationBox = document.getElementById("confirmationBox");
        const okButton = document.getElementById("ok_alert");
        function doAlertClose() {
            confirmationBox.style.display = "none";
            alertBox.style.display = "none";
            okButton.removeEventListener("click", doAlertClose);
        }
        const tooltipModal = document.getElementById("modal");

        const newButton = document.createElement("button");

        newButton.textContent = "Load from 📋";
        newButton.classList.add("ambrosiaLoadoutBtn");
        newButton.style.border = "2px solid orange";
        document.getElementById("importBlueberriesButton").insertAdjacentElement("afterend", newButton);

        newButton.addEventListener("click", async () => {
            try {
                /**
                 * @type {Object.<string, number>}
                 */
                const jsonObj = await navigator.clipboard.readText().then((resp) => JSON.parse(resp.trim()));

                document.getElementById("refundBlueberries").click();
                alertBox.querySelector("p.scrollbar").textContent = "Your loadout has been imported from clipboard.";

                for (const [key, amnt] of Object.entries(jsonObj)) {
                    const button = allBlueberries[key];
                    if (button) {
                        for (let i = 0; i < amnt; i++) {
                            button.click();
                        }
                    }
                }
                tooltipModal.style.display = "none";
            } catch (e) {
                if (e instanceof SyntaxError) {
                    confirmationBox.style.display = "block";
                    alertBox.style.display = "block";
                    alertBox.querySelector("p.scrollbar").textContent = "Could not parse a loadout from your clipboard.";

                    okButton.addEventListener("click", doAlertClose);
                }
                return;
            }
        });
        // Ensure the listener gets detached
        elem.removeEventListener("click", callback);
    };

    function setup() {
        const elem = document.getElementById("exitOffline");
        if (!elem) {
            setTimeout(setup, 250);
            return;
        }
        elem.addEventListener("click", callback(elem));
    }
    setup();
})();