// ==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 = `
0
Total Players
0
Active Rooms
0
Avatar Users
0
Custom Profile Users
Made By Akira
`; 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 = `
Room: ${roomCode}
${players.length} Players
${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.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(); }