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