// ==UserScript==
// @name Skin Manager (gota.io)
// @namespace http://tampermonkey.net/
// @version 0.63
// @description Just a simple script that helps you manage your skins.
// @author Amy
// @match https://skins.gota.io/skins
// @downloadUrl
// @icon https://skin-data.gota.io/e6e200b3-5e6d-406f-8ab6-0338f4ba09cf.png
// @resource IMPORTED_CSS https://raw.githubusercontent.com/Aymayy/css-files/main/style.css
// @grant GM_getResourceText
// @grant GM_addStyle
// @downloadURL https://update.greasyfork.cloud/scripts/430853/Skin%20Manager%20%28gotaio%29.user.js
// @updateURL https://update.greasyfork.cloud/scripts/430853/Skin%20Manager%20%28gotaio%29.meta.js
// ==/UserScript==
(function() {
'use strict';
const my_css = GM_getResourceText("IMPORTED_CSS");
GM_addStyle(my_css);
const local__storage = window.localStorage;
const default__skin__size = 250;
const default__cols = 5;
const container__of__container = document.querySelector('.px-8.py-3.border-t.border-gray-700');
const submit__button = document.querySelector('.button.is-primary');
let gallery__skins__data = {};
let gallery__skins = {};
let searched__gallery__skins = {};
let skin__data = {};
let skin__elements = {};
let searched__skins = {};
let gallery__state = false;
let skin__code = '';
let bottom__scrolls = 1;
let skins__each__scroll = 50;
let is__sorted = false;
let randomized__skins = {};
let randomized__gallery__skins = {};
//Create and Add and Remove DOM elements
const container__header = document.querySelector('.flex.justify-between')
const navbar = document.querySelector('nav');
const remove__element = container__header.querySelector('.flex.items-center');
remove__element.remove();
const submit__button__parent = submit__button.parentElement;
submit__button__parent.classList.add('submit__button__parent');
const myskins__container = document.querySelector('.grid.grid-cols-4.gap-4');
myskins__container.classList.add('myskins__container');
const skinSliderString = `
${default__skin__size}
`;
const columsSliderString = `${default__cols}
`;
const searchInputString = ``;
const sortButtonString = ``;
const galleryString = `My Skins
`;
const empty__gallery__container__string = ``;
const empty__myskins__container__string = ``;
const gallery__navbar__string = ``;
const add__skin__button__string = ``;
const dice__string = ``;
const star__string = ``;
const spacer_string = ``;
const skinSlider = document.createRange().createContextualFragment(skinSliderString);
const columnSlider = document.createRange().createContextualFragment(columsSliderString);
const searchInput = document.createRange().createContextualFragment(searchInputString);
const sortButton = document.createRange().createContextualFragment(sortButtonString);
const gallery = document.createRange().createContextualFragment(galleryString);
const dice = document.createRange().createContextualFragment(dice__string);
const star = document.createRange().createContextualFragment(star__string);
const spacer = document.createRange().createContextualFragment(spacer_string);
const slidersContainer = document.createElement('div');
slidersContainer.classList.add('sliders-container');
slidersContainer.style = 'display: flex; justify-content: space-around; align-items: center; width: 40%';
slidersContainer.appendChild(skinSlider);
slidersContainer.appendChild(spacer.cloneNode(true));
slidersContainer.appendChild(columnSlider);
slidersContainer.appendChild(spacer.cloneNode(true));
container__header.insertBefore(slidersContainer, container__header.children[0]);
container__header.insertBefore(searchInput, container__header.children[0]);
container__header.insertBefore(sortButton, container__header.children[0]);
container__header.insertBefore(gallery, container__header.children[0]);
container__header.insertBefore(dice, container__header.children[2]);
container__header.insertBefore(star, container__header.children[1]);
container__header.insertBefore(spacer.cloneNode(true), container__header.children[1]);
container__header.insertBefore(spacer.cloneNode(true), container__header.children[3]);
//Initialize defaults
(function() {
const container = document.querySelector('.myskins__container');
const skins = container.querySelectorAll('.flex.flex-col');
const slider1 = document.querySelector('.skinSlider');
const slider2 = document.querySelector('.colSlider');
const searchInput = document.querySelector('.search__input');
get__myskins();
fetch__skins();
update__skins();
slider1.value = default__skin__size;
slider2.value = default__cols;
const grid = document.querySelector('.grid.grid-cols-4.gap-4');
grid.style.gridTemplateColumns = `repeat(${default__cols},minmax(0,1fr))`;
//Fix/custom some styling
skins.forEach(skin => {
const img = skin.querySelector('img');
img.style.maxWidth = 'none';
img.style.width = `${default__skin__size}px`;
skin.style.justifyContent = 'center'
skin.style.alignItems = 'center';
});
})();
//Event Listeners
document.querySelector('.gallery__icon__container').addEventListener('click', function (e) {
gallery__state = !gallery__state;
searched__skins = {};
searched__gallery__skins = {};
if(gallery__state) {
const container = document.querySelector('.myskins__container');
const empty__container = document.createRange().createContextualFragment(empty__gallery__container__string);
const add__skin__button = document.createRange().createContextualFragment(add__skin__button__string);
const gallery__text = document.querySelector('.gallery__label');
const search__bar = document.querySelector('.search__input');
search__bar.value = '';
gallery__text.innerText = 'Gallery';
container.remove();
container__of__container.appendChild(empty__container);
submit__button__parent.remove();
container__header.appendChild(add__skin__button);
randomized__gallery__skins = {};
randomized__skins = {};
sort__handler(undefined, false);
//Add skins here
update__skins();
document.querySelector('.add__skin__button').addEventListener('click', handle__click);
}else {
const gallery__text = document.querySelector('.gallery__label');
const container = document.createRange().createContextualFragment(empty__myskins__container__string);
const search__bar = document.querySelector('.search__input');
search__bar.value = '';
gallery__text.innerText = 'My Skins';
document.querySelector('.add__skin__button').removeEventListener("click", handle__click, false);
document.querySelector('.add__skin__button__container').remove();
container__header.appendChild(submit__button__parent);
document.querySelector('.gallery__container').remove();
container__of__container.appendChild(container);
randomized__gallery__skins = {};
randomized__skins = {};
sort__handler(undefined, false);
//Add skins here
update__skins();
}
});
document.querySelector('.corner-button').addEventListener('click', sort__handler);
document.querySelector('#Layer_9').addEventListener('click', randomize__skins);
document.querySelector('.star').addEventListener('click', get__favorite__skins);
document.querySelector('.search__input').addEventListener('input', input__search, false);
document.querySelector('.skinSlider').addEventListener('input', update__skin__size, false);
document.querySelector('.colSlider').addEventListener('input', update__skin__col, false);
document.querySelector('.skinSlider').addEventListener('change', scroll__event__onchange, false);
document.querySelector('.colSlider').addEventListener('change', scroll__event__onchange, false);
window.onscroll = scroll__event;
//Remove the annoying logo
const containerSize = document.querySelector('.container.flex.flex-col.items-center.justify-center.mx-auto');
containerSize.firstElementChild.remove();
containerSize.firstElementChild.style.width = '100%';
// ⬇------⬇ Functions ⬇------⬇
//Remove skins from DOM
function remove__skins() {
const container = document.querySelector('.myskins__container');
if(gallery__state) {
const gal__container = document.querySelector('.gallery__container');
gal__container.innerHTML = '';
}else {
container.innerHTML = '';
}
};
function update__skin__size() {
const span = document.querySelector('.skinSpan');
const e = document.querySelector('.skinSlider');
span.innerText = e.value;
if(gallery__state) {
const container = document.querySelector('.gallery__container');
const gallery__skins = container.querySelectorAll('.flex.flex-col');
gallery__skins.forEach(skin => {
const img = skin.querySelector('img');
img.style.width = `${e.value}px`;
});
}else {
const container = document.querySelector('.myskins__container');
const skins = container.querySelectorAll('.flex.flex-col');
skins.forEach(skin => {
const img = skin.querySelector('img');
img.style.width = `${e.value}px`;
});
}
}
function update__skin__col() {
const span = document.querySelector('.colSpan');
const e = document.querySelector('.colSlider');
span.innerText = e.value;
const grid = document.querySelector('.grid.grid-cols-4.gap-4');
grid.style.gridTemplateColumns = `repeat(${e.value},minmax(0,1fr))`;
}
function sort__object(o) {
var sorted = {},
key, a = [];
for (key in o) {
if (o.hasOwnProperty(key)) {
a.push(key);
}
}
var collator = new Intl.Collator(undefined, {numeric: true, sensitivity: 'base'});
a.sort(collator.compare);
for (key = 0; key < a.length; key++) {
sorted[a[key]] = o[a[key]];
}
return sorted;
}
function is__empty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop)) {
return false;
}
}
return true;
}
async function handle__click(e) {
skin__code = prompt("Enter skin code:\nHere you find how to get code for a skin:\nhttps://github.com/Aymayy/css-files", "");
if(skin__code === null || skin__code === '') {
console.log("Cancelled");
return 0;
}else {
await submit__skin__code(skin__code);
fetch__skins();
}
}
function httpGetAsync(theUrl, callback) {
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
callback(xmlHttp.responseText);
}
}
xmlHttp.open("GET", theUrl, true); // true for asynchronous
xmlHttp.send(null);
}
async function submit__skin__code(code) {
const url = `https://skins-data.com/skins/${code}`;
let username = document.querySelector('.mx-2.text-base.text-semibold.text-gray-300');
username.style.fontFamily = 'Arial, Helvetica, sans-serif';
username = username.innerText.toString();
console.log(username);
const headers = {
'Content-Type': 'application/json'
}
const body = {
username
}
var fetch__data;
await fetch(url, {
method: 'POST',
headers,
body: JSON.stringify(body)
})
.then((response) => {
return response.text();
})
.then((data) => {
fetch__data = JSON.parse(data);
if(fetch__data.message) {
alert(fetch__data.message);
update__local__storage();
update__skins();
}else if(fetch__data.error) {
alert(fetch__data.error);
}
});
}
function update__skins() {
if(gallery__state) {
if(local__storage.getItem('__skins')) {
gallery__skins = JSON.parse(local__storage.getItem('__skins'));
}
if(is__empty(searched__gallery__skins) && document.querySelector('.search__input').value !== ''){
gallery__skins = {};
}else if(!is__empty(searched__gallery__skins)) {
gallery__skins = searched__gallery__skins;
}
if(is__sorted) {
gallery__skins = sort__object(gallery__skins);
randomized__gallery__skins = {};
}
if(!is__empty(randomized__gallery__skins)) {
gallery__skins = randomized__gallery__skins;
}
const gal__container = document.querySelector('.gallery__container');
gal__container.innerHTML = '';
let i = 0;
remove__skins();
for(const skin in gallery__skins) {
if(i === bottom__scrolls * skins__each__scroll) break;
const skin__template__string = `
${skin}
`;
const skin__template = document.createRange().createContextualFragment(skin__template__string);
skin__template.querySelector('img').setAttribute('loading', 'lazy');
document.querySelector('.gallery__container').appendChild(skin__template);
i++;
}
}else {
const container = document.querySelector('.myskins__container');
skin__elements = skin__data;
if(is__empty(searched__skins) && document.querySelector('.search__input').value !== ''){
skin__elements = {};
}else if(!is__empty(searched__skins)) {
skin__elements = searched__skins;
}
if(is__sorted) {
skin__elements = sort__object(skin__elements);
randomized__skins = {};
}else if(!is__empty(randomized__skins)) {
skin__elements = randomized__skins;
}
remove__skins();
for(const element in skin__elements) {
//const add_favorite__button__string = ``;
const skin__template__string = `
${element}
`;
const skin__template = document.createRange().createContextualFragment(skin__template__string);
//const add__favorite__button = document.createRange().createContextualFragment(add_favorite__button__string);
//skin__template.querySelector('.gallery__skin').append(add__favorite__button);
skin__template.querySelector('img').setAttribute('loading', 'lazy');
container.appendChild(skin__template);
}
}
update__skin__size();
update__skin__col();
}
function update__local__storage() {
local__storage.setItem('__skins', JSON.stringify(gallery__skins));
}
function merge__objects(obj1, obj2) {
return Object.assign(obj1, obj2);
}
async function fetch__skins() {
const url = `https://skins-data.com/skins`;
var fetch__data;
await fetch(url, {
method: 'GET'
})
.then((response) => {
return response.text();
})
.then((data) => {
fetch__data = data;
});
gallery__skins__data = JSON.parse(fetch__data);
local__storage.setItem('__skins', fetch__data);
update__skins();
}
function scroll__event() {
if(Object.keys(gallery__skins).length >= bottom__scrolls * skins__each__scroll) {
if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
bottom__scrolls++;
update__skins();
}
}
}
function scroll__event__onchange() {
if(Object.keys(gallery__skins).length >= bottom__scrolls * skins__each__scroll) {
if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
bottom__scrolls += Math.floor(window.innerHeight / 15);
update__skins();
}
}
}
function sort__handler(ev, value) {
const e = document.querySelector('.corner-button');
if(value !== null && value !== undefined) {
is__sorted = value;
} else {
is__sorted = !is__sorted;
}
if(is__sorted) {
e.innerText = 'Unsort';
}else {
e.innerText = 'Sort';
}
update__skins();
}
function get__myskins() {
const container = document.querySelector('.myskins__container');
const skins = container.querySelectorAll('.flex.flex-col');
const names = container.querySelectorAll('.text-lg.font-bold');
skins.forEach(skin => {
const img = skin.querySelector('img');
const name = skin.querySelector('span').innerText;
let code__url = img.src;
code__url = code__url.replace('https://skin-data.gota.io/', '');
code__url = code__url.replace('.png', '');
skin__data[name] = code__url;
});
return skin__data;
}
function input__search(e) {
if(gallery__state) {
searched__gallery__skins = {};
for(const element in gallery__skins__data) {
if(element.includes(e.srcElement.value)) {
searched__gallery__skins[element] = gallery__skins__data[element];
}
}
}else {
update__skins();
searched__skins = {};
for(const element in skin__data) {
if(element.includes(e.srcElement.value)) {
searched__skins[element] = skin__data[element];
}
}
}
if(e.srcElement.value === null || e.srcElement.value === '' || e.srcElement.value === undefined) {
searched__skins = {};
searched__gallery__skins = {};
}
randomized__gallery__skins = {};
randomized__skins = {};
update__skins();
}
function randomize__object(obj) {
const randomized__object = {};
var keys = Object.keys(obj);
keys.sort(function(a,b) {return Math.random() - 0.5;});
keys.forEach(function(key) {
randomized__object[key] = obj[key];
});
return randomized__object;
}
function randomize__skins(e) {
sort__handler(undefined, false);
if(gallery__state) {
if(!is__empty(searched__gallery__skins)) {
randomized__gallery__skins = randomize__object(searched__gallery__skins);
} else {
randomized__gallery__skins = randomize__object(gallery__skins__data);
}
} else {
if(!is__empty(searched__skins)) {
randomized__skins = randomize__object(searched__skins);
} else {
randomized__skins = randomize__object(skin__data);
}
}
update__skins();
}
function get__favorite__skins() {
alert('Coming soon...')
}
})();