// ==UserScript==
// @name Gartic Enhanced UI Pro
// @namespace http://tampermonkey.net/
// @version 2024.1.2
// @description Enhanced UI for Gartic.io with Advanced Features
// @author Akira
// @match https://gartic.io/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=gartic.io
// @grant none
// @downloadURL https://update.greasyfork.icu/scripts/523931/Gartic%20Enhanced%20UI%20Pro.user.js
// @updateURL https://update.greasyfork.icu/scripts/523931/Gartic%20Enhanced%20UI%20Pro.meta.js
// ==/UserScript==
if(window.location.href.includes("?ww")) {
document.head.innerHTML = `
`;
document.body.innerHTML = `
`;
let roomData = new Map();
let updateTimers = new Map();
function updateUI() {
const container = document.querySelector('.rooms-container');
container.innerHTML = '';
roomData.forEach((players, roomCode) => {
const roomBlock = document.createElement('div');
roomBlock.className = 'room-block';
roomBlock.innerHTML = `
${players.map(user => createPlayerCard(user)).join('')}
`;
container.appendChild(roomBlock);
});
updateStats();
}
function createPlayerCard(user) {
const avatarSrc = user.foto || `https://gartic.io/static/images/avatar/svg/${user.avatar}.svg`;
return `
${user.nick}
${user.points}p
`;
}
window.filterPlayers = function(searchTerm) {
searchTerm = searchTerm.toLowerCase();
document.querySelectorAll('.player-card').forEach(card => {
const playerName = card.dataset.playerName;
card.style.display = playerName.includes(searchTerm) ? 'block' : 'none';
});
};
window.applyFilters = function() {
const avatarOnly = document.getElementById('avatarOnly').checked;
const customProfileOnly = document.getElementById('customProfileOnly').checked;
document.querySelectorAll('.player-card').forEach(card => {
const avatarSrc = card.querySelector('.player-avatar').src;
const isAvatarUser = avatarSrc.includes('/static/images/avatar/svg/');
let show = true;
if (avatarOnly && !isAvatarUser) show = false;
if (customProfileOnly && isAvatarUser) show = false;
card.style.display = show ? 'block' : 'none';
});
updateStats();
};
window.sortPlayers = function(criteria) {
roomData.forEach((players, roomCode) => {
const sortedPlayers = [...players].sort((a, b) => {
switch(criteria) {
case 'points':
return b.points - a.points;
case 'name':
return a.nick.localeCompare(b.nick);
case 'room':
return a.room.localeCompare(b.room);
default:
return 0;
}
});
roomData.set(roomCode, sortedPlayers);
});
updateUI();
};
window.refreshRoom = function(roomCode) {
getData(roomCode);
};
function updateStats() {
const totalPlayers = Array.from(roomData.values()).reduce((acc, curr) => acc + curr.length, 0);
const totalRooms = roomData.size;
let avatarUsers = 0;
let customProfileUsers = 0;
roomData.forEach(players => {
players.forEach(player => {
if (player.foto) {
customProfileUsers++;
} else {
avatarUsers++;
}
});
});
document.getElementById('totalPlayers').textContent = totalPlayers;
document.getElementById('totalRooms').textContent = totalRooms;
document.getElementById('avatarUsers').textContent = avatarUsers;
document.getElementById('customProfileUsers').textContent = customProfileUsers;
}
function getData(roomCode) {
if (updateTimers.has(roomCode)) {
clearTimeout(updateTimers.get(roomCode));
}
const players = [];
['01', '02', '03', '04', '05', '06'].forEach(server => {
const ws = new WebSocket(`wss://server${server}.gartic.io/socket.io/?EIO=3&transport=websocket`);
ws.onopen = () => {
ws.send(`42[12,{"v":20000,"platform":0,"sala":"${roomCode.slice(-4)}"}]`);
};
ws.onmessage = (msg) => {
if(msg.data[4] == "5") {
const data = JSON.parse(msg.data.slice(2));
if(data[0] == 5) {
data[5].forEach(user => {
players.push({
points: user.pontos,
victory: user.vitorias,
id: user.id,
avatar: user.avatar,
room: `https://gartic.io/${roomCode}`,
nick: user.nick,
foto: user.foto
});
});
roomData.set(roomCode, players);
updateUI();
ws.close();
}
}
};
});
updateTimers.set(roomCode, setTimeout(() => getData(roomCode), 5000));
}
function fetchRooms() {
fetch("https://gartic.io/req/list?search=&language[]=8")
.then(x => x.json())
.then(x => {
x.forEach(room => {
if(room.quant > 0) {
getData(room.code);
}
});
});
setTimeout(fetchRooms, 5000);
}
fetchRooms();
}