Case Clicker 2 Importing & Exporting save Tool (By Lapide)

A CS:GO/Case Clicker 2 tool focused on save exporting and importing.

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         Case Clicker 2 Importing & Exporting save Tool (By Lapide)
// @namespace    https://github.com/nonumbershere/
// @version      1.00.3
// @license      MIT
// @description  A CS:GO/Case Clicker 2 tool focused on save exporting and importing.
// @author       Lapide
// @homepage     https://discord.gg/6eaDrx5J9s
// @match        *://csgo.mtsl.dk/*
// @grant        GM_setClipboard
// @grant        GM_setValue
// @grant        GM_download
// @grant        GM_getValue
// @grant        GM_openInTab
// @grant        unsafeWindow
// @run-at       document-start
// ==/UserScript==
(function() {
    if (location.pathname == '/') {
        try {
            // Settings
            var config = {
                hotkeys: {
                    togglemenu: "j"
                }
            };
            var info = {
                version: GM_info.script.version,
                description: GM_info.script.description,
                name: GM_info.script.name,
                runAt: GM_info.script.runAt,
            };
            // Saving System
            function m(e) {
                return encodeURIComponent(e).replace(/%([0-9A-F]{2})/g, (function e(t, o) {
                    return String.fromCharCode("0x" + o)
                }))
            }

            function f(e) {
                return decodeURIComponent(e.split("").map((function(e) {
                    return "%" + ("00" + e.charCodeAt(0).toString(16)).slice(-2)
                })).join(""))
            }

            function h(e) {
                e = m(e);
                let t = {};
                let o = (e + "").split("");
                let a = [];
                let r;
                let l = o[0];
                let n = 256;
                for (let e = 1; e < o.length; e++) {
                    r = o[e];
                    if (t[l + r] != null)
                        l += r;
                    else {
                        a.push(l.length > 1 ? t[l] : l.charCodeAt(0));
                        t[l + r] = n;
                        n++;
                        l = r
                    }
                }
                a.push(l.length > 1 ? t[l] : l.charCodeAt(0));
                return a.map((e => {
                    let t = e.toString(36);
                    return t.substring(0, t.length - 1) + (t[t.length - 1].match(/[0-9]/) ? v[t[t.length - 1]] : t[t.length - 1].toUpperCase())
                })).join("")
            }
            window.lzw_encode = h;
            let v = {
                0: "=",
                1: "!",
                2: "?",
                3: "$",
                4: "%",
                5: "&",
                6: "/",
                7: "\\",
                8: "-",
                9: "+"
            };
            let S = {
                "=": "0",
                "!": "1",
                "?": "2",
                $: "3",
                "%": "4",
                "&": "5",
                "/": "6",
                "\\": "7",
                "-": "8",
                "+": "9"
            };
            let w = Object.keys(S).join("");

            function b(e) {
                let t = {};
                let o = (e + "").split("");
                let a = o[0];
                let r = a;
                let l = [a];
                let n = 256;
                let i;
                for (let e = 1; e < o.length; e++) {
                    let s = o[e].charCodeAt(0);
                    if (s < 256)
                        i = o[e];
                    else
                        i = t[s] ? t[s] : r + a;
                    l.push(i);
                    a = i.charAt(0);
                    t[n] = r + a;
                    n++;
                    r = i
                }
                return l.join("")
            }

            function j(e) {
                try {
                    if (e === "1") {
                        localStorage.v1SaveSnapshot = localStorage.localsave;
                        let e = b(localStorage.localsave).split("").map((e => e.charCodeAt(0) - 1));
                        let t = new TextDecoder;
                        return JSON.parse(t.decode(new Uint8Array(e)))
                    } else if (e === "2") {
                        return JSON.parse(y(localStorage.localsave))
                    }
                } catch (e) {
                    console.error(e);
                    delete localStorage._cbid;
                    return user
                }
            }

            function save(m) {
                localStorage.localsave_trading = m;
                localStorage.backup = localStorage.localsave_trading;
                localStorage.localsave = localStorage.localsave_trading;
                localStorage.do_trading = true;
                location.reload();
            }
            // Detections
            if (localStorage.joineddis != 'true') {
                var dis = confirm("[Trading]: Do you wanna join our Discord?");
                if (dis) {
                    GM_openInTab("https://discord.gg/6eaDrx5J9s", {
                        active: true,
                        insert: true,
                        setParent: true,
                        incognito: false
                    })
                    localStorage.joineddis = true;
                } else {
                    alert("[Trading]: We'll ask you next time!");
                }
            }

            // UI
            var StylePanel = document.createElement('style');
            StylePanel.innerHTML = `
        .tradingshow button {
    background: none;
    border: solid 1px #a7a7ff;
    color: #a7a7ff;
    padding: 7px;
    transition: 0.5s;
    cursor: pointer;
    border-radius: 20px;
    padding-left: 18px;
    padding-right: 18px;

        }
        .tradingshow button:hover {
    border: solid 1px #7d7dff;
    transition: 0.5s;
    color: #8080ff;
        }
        .tradingshow input::placeholder {
           color: #8272bf;
           opacity:0.8;
           transition:1s;
        }
        .tradingshow input:focus::placeholder {
    color: #86c7ff;
           transition:1s;
        }
        .tradingshow input:focus {
    border-color: #86c7ff;
    transition: 1s;
}
        .tradingshow input {
          padding: 7px;
    transition: 1s;
          border-radius: 20px;
       border: solid 1px #a7a7ff;
       color: #a7a7ff;
    background: transparent;
    }
        .tradingtab {
    font-weight: 700;
    height: -webkit-fill-available;
    width: 100px;
    font-family: system-ui;
    background: transparent;
    font-size: 15px;
    cursor: pointer;
    border: none;
    border-left: solid 1px #9191ff;
    border-right: solid 1px #9191ff;
    color: #855dff;
}
.tradingpage {
    z-index: -1;
    display: none;
}
.tradingshow {
    z-index: 1;
    padding: 10px;
    font-weight: 400;
    display: block;
}
.tradinginputset {
   display: inline;
}
.tradinginputset button {
    border-top-right-radius: 0px;
    border-bottom-right-radius: 0px;
}
#tradingborder {
    background: linear-gradient(45deg, #a9b8ff, #4b10ff);
    height: 2px;
   animation: an 30s ease infinite;
   background-size: 1000% 1000%;
}


.tradinginputset input {
    border-top-left-radius: 0px;
    border-bottom-left-radius: 0px;
}
.tradingactive {
 filter: brightness(1.2);
 font-weight: 400;
}`;

            var Panel = document.createElement('div');
            Panel.innerHTML = `<div style="top: 98px; position: absolute; left: 309px; z-index: 2147483647;" id="tradingmenu">
  <div style="
    height: 353px;
    font-weight: bolder;
    width: 599px;
    background: #1a1a1a;
">
    <div style="">
      <div style="
    font-size: 20px;
    font-family: revert;
    padding-top: 6px;
    padding-left: 6px;
    padding-bottom: 4px;
" id="tradingmenuheader">Trading - <i style="
    font-size: 16px;
">${info.version} [By Lapide]</i><a href="https://discord.gg/6eaDrx5J9s" style="
    font-size: 17px;
    color: lightblue;
    float: right;
    margin-right: 11px;
">Discord</a><a href="https://github.com/Case-Clicker-2-Utilities/Trading-Save-Editor/" style="
    font-size: 17px;
    color: lightblue;
    float: right;
    margin-right: 10px;
">Github</a><a href="https://www.youtube.com/channel/UCRA3KXViuDmsmfuP0RF45_w?sub_confirmation=1" style="
    font-size: 17px;
    color: lightblue;
    float: right;
    margin-right: 10px;
">YouTube</a>
      </div>
      <div id="tradingborder" style="
"></div>
      <div id="trading_contents" style="">
        <div style="
    height: 44px;
    background: #222222;
">
          <button tab="main" class="tradingtab tradingactive">Main</button>
          <button tab="settings" class="tradingtab">Settings</button>
        </div>
        <div style="
    background: #161616;
    height: 265px;
    overflow-y: auto;
" id="tradingtabs">

          <div class="tradingshow" id="tradingpagemain" style="">
<button id="getsave" title="Get/export your current save, you can import it.">Get current Save</button> <div class="tradinginputset"><button id="setsave" title="Import/sets your current save. It will override it so be careful!">Import Save</button><input id="savetext" placeholder="Enter Save Here..."></div>
 <button id="wipesave" title="Erase's your current save, unreversable unless you already made a backup.">Wipe Save</button>
          </div>

          <div class="tradingpage" id="tradingpagesettings" style="">
          <p>Coming Soon</p><br><a href="https://github.com/Case-Clicker-2-Utilities/Trading-Save-Editor/issues/new">Report an issue</a>
          </div>

        </div>
      </div>
    </div>
  </div>
  <div style="
    height: 359px;
    width: 603px;
    top: -3px;
    left: -2px;
    z-index: -1;
    position: inherit;
    background: linear-gradient(45deg, #a9b8ff, #4b10ff);
"></div>
</div>`;
            document.body.prepend(Panel);
            document.body.prepend(StylePanel);

            function dragElement(elmnt) {
                var pos1 = 0,
                    pos2 = 0,
                    pos3 = 0,
                    pos4 = 0;
                if (document.getElementById(elmnt.id + "header")) {
                    document.getElementById(elmnt.id + "header").onmousedown = dragMouseDown;
                } else {
                    elmnt.onmousedown = dragMouseDown;
                }

                function dragMouseDown(e) {
                    e = e || window.event;
                    e.preventDefault();
                    pos3 = e.clientX;
                    pos4 = e.clientY;
                    document.onmouseup = closeDragElement;
                    document.onmousemove = elementDrag;
                }

                function elementDrag(e) {
                    e = e || window.event;
                    e.preventDefault();
                    pos1 = pos3 - e.clientX;
                    pos2 = pos4 - e.clientY;
                    pos3 = e.clientX;
                    pos4 = e.clientY;
                    elmnt.style.top = (elmnt.offsetTop - pos2) + "px";
                    elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";
                }

                function closeDragElement() {
                    document.onmouseup = null;
                    document.onmousemove = null;
                }
            }
            for (var i = 0; i < document.getElementsByClassName('tradingtab').length; ++i) {
                document.getElementsByClassName('tradingtab')[i].addEventListener('click', function() {
                    for (var gg = 0; gg < document.getElementsByClassName('tradingshow').length; ++gg) {
                        document.getElementsByClassName('tradingshow')[gg].className = ('tradingpage');
                    }
                    for (var bb = 0; bb < document.getElementsByClassName('tradingactive').length; ++bb) {
                        document.getElementsByClassName('tradingactive')[bb].className = ('tradingtab');
                    }
                    // console.log(this);
                    this.classList.add('tradingactive')
                    document.getElementById('tradingpage' + this.getAttribute('tab')).className = ('tradingshow');
                })
            }
            dragElement(Panel.children[0]);
            var show = false;
            document.addEventListener('keydown', function(e) {
                if (e.key == config.hotkeys.togglemenu) {
                    show = !show;
                    Panel.style.display = show ? 'block' : 'none';
                }
            })

            // Options
            document.getElementById('setsave').addEventListener('click', function() {
                var savetxt = document.getElementById('savetext').value;
                if (savetxt.length > 999) {
                        try {
                            save(savetxt);
                            alert("Sucessfully exported save, now reloading.");
                        } catch (e) {
                            if (e instanceof Error) {
                                alert("Failed to export save due to an unexpected error [SEND THIS TO THE DEVELOPER]: " + e.message);
                            }
                        } finally {}
                } else {
                    alert("The save is too low or possibly blank.");
                }
            });
            document.getElementById('getsave').addEventListener('click', function() {
                alert("Copied save!");
                GM_setClipboard(localStorage.localsave);
            });
            document.getElementById('wipesave').addEventListener('click', function() {
                var confirmation = confirm('Are you sure you wan\'t to erase your save? (WILL ALSO COPY YOUR SAVE TO YOUR CLIPBOARD JUST INCASE)');
                if (confirmation) {
                    GM_setClipboard(localStorage.localsave);
                    delete localStorage._cbid;
                    delete localStorage.localsave;
                    delete localStorage.shop;
                    delete localStorage.flags;
                    delete localStorage.backup;
                    delete localStorage.backupid;
                    window.location.reload()
                    alert("Wipe save. Also copied the save to your clipboard.");
                } else {
                    alert("Okay!");
                }
            });

            // Loading
            if (localStorage.do_trading == 'true') {
                localStorage.backup = localStorage.localsave_trading;
                localStorage.localsave = localStorage.localsave_trading;
                localStorage.do_trading = false;
            }
        } catch (err) {
            if (err) location.reload();
        }
    }
})();