- // ==UserScript==
- // @name Frozen Bot V1
- // @namespace tampermonkey.net
- // @version 1.0
- // @description Frozen bot script for gartic
- // @match *://*/*?__cpo=aHR0cHM6Ly9nYXJ0aWMuaW8
- // @match *://gartic.io/?bot*
- // @grant GM_setValue
- // @grant GM_getValue
- // @grant GM_addValueChangeListener
- // @grant GM_addStyle
- // @grant none
- // ==/UserScript==
-
- (function() {
- 'use strict';
-
- const config = {
- Rooms: [],
- userAgents: ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36"],
- proxies: ["https://www.blockaway.net/"],
- playerName: "",
- roomCode: "",
- delayBetweenEntries: 1000,
- reexecutionDelay: 1900,
- randomAvatar: false,
- selectedAvatar: 0,
- settings: {
- nickName: "",
- roomCode: "",
- avatarId: 0
- }
- };
-
- let wsList = [];
- let isRunning = false;
- let messageInterval;
- let mainInterval;
- let afkIntervals = [];
- let isAfkPaused = false;
- let roomusers = [];
- let kickedUsers = new Set();
- let userListUpdateInterval;
-
- const drawCommands = [
- '[6,"11"]',
- '[5,"x000000"]',
- '[3,0,0,767,448]',
- '[5,"x26C9FF"]',
- '[2,245,64,249,67,257,75,260,81,262,89,264,96,263,105,260,114,255,121,249,127,242,132,242,132]',
- '[2,231,69,237,67,247,67,259,66,270,67,274,67]',
- '[2,311,89,311,90,309,98,308,107,307,112,306,120]',
- '[2,312,71,320,68,328,67,332,67]',
- '[2,337,119,337,119,341,114,348,106,353,99,361,88,368,80,372,74,373,73,374,72,374,73,372,77,371,85,369,97,368,107,369,115]',
- '[2,369,115,371,120,374,120,380,116,387,109,396,101,408,87,422,75,443,55,452,49]',
- '[2,217,192,217,192,218,194,221,200,224,205,226,211,227,217,229,224,230,229,231,234,231,237,232,240,232,242,233,244,233,244,233,244]',
- '[2,233,244,235,241,241,233,248,222,257,210,267,197,275,187,279,182,280,180,280,181,280,181]',
- '[2,282,190,282,190,282,192,284,198,285,206,285,214,287,221,287,228,288,236,288,242,289,246,290,249,290,250,291,250,293,248,296,241]',
- '[2,355,203,355,203,349,211,344,220,344,229,344,236,347,241,352,242,360,240,369,236,378,230,385,223,390,215,391,210,392,204,389,198]',
- '[2,296,241,304,230,312,217,321,205,328,195,332,188,334,185,337,182]',
- '[2,418,196,418,196,417,198,414,208,413,218,414,228,421,234,429,237,440,236,450,231,458,224,465,216,468,207,470,198,465,194,458,192]',
- '[2,458,192,449,192,441,194,438,196,438,196]',
- '[2,389,198,384,194,378,192,373,191,367,194,360,198]'
- ];
-
- window.toggleBot = toggleBot;
- window.sendMessage = sendMessage;
- window.exitFromRooms = exitFromRooms;
- window.autoDraw = autoDraw;
- window.toggleRandomAvatar = toggleRandomAvatar;
- window.updateAvatarPreview = updateAvatarPreview;
- window.applySettings = applySettings;
- window.sendReport = sendReport;
-
-
- function loadSettings() {
- const savedSettings = localStorage.getItem('frozenBotSettings');
- if(savedSettings) {
- config.settings = JSON.parse(savedSettings);
- document.querySelector('.bot-nick').value = config.settings.nickName;
- document.querySelector('.room-input').value = config.settings.roomCode;
- document.querySelector('.avatar-input').value = config.settings.avatarId;
- updateAvatarPreview(config.settings.avatarId);
- updateRoomCode();
- }
- }
-
- function updateUserList() {
- const userListElement = document.querySelector('.user-list');
- const botNick = document.querySelector('.bot-nick').value.trim();
- userListElement.innerHTML = '';
- const addedUsers = new Set();
-
- wsList.forEach(ws => {
- if (ws.readyState === WebSocket.OPEN) {
- ws.send('42[32]');
- }
- });
-
- roomusers.forEach(user => {
- if (user.nick &&
- user.nick !== "Jinwoo" &&
- !addedUsers.has(user.id) &&
- !user.nick.replace(/\s+/g, '').includes(botNick.replace(/\s+/g, ''))) {
- const button = document.createElement('button');
- button.className = 'user-button';
- button.textContent = user.nick;
- button.onclick = () => kickUser(user.id, user.nick);
- userListElement.appendChild(button);
- addedUsers.add(user.id);
- }
- });
- }
-
- function kickUser(userId, userNick) {
- if (!kickedUsers.has(userId)) {
- wsList.forEach(ws => {
- if (ws.readyState === WebSocket.OPEN) {
- ws.send(`42[11,${ws.id},"siktirgit ${userNick}"]`);
- setTimeout(() => {
- ws.send(`42[45,${ws.id},["${userId}",true]]`);
- ws.send(`42[45,${ws.id},["${userId}",false]]`);
- }, 100);
- }
- });
- kickedUsers.add(userId);
- updateUserList();
- }
- }
-
- function applySettings() {
- config.settings.nickName = document.querySelector('.bot-nick').value;
- config.settings.roomCode = document.querySelector('.room-input').value;
- config.settings.avatarId = parseInt(document.querySelector('.avatar-input').value) || 0;
- localStorage.setItem('frozenBotSettings', JSON.stringify(config.settings));
- updateRoomCode();
- }
-
- function generateInvisibleChar() {
- const invisibleChars = ['\u200B', '\u200C', '\u200D', '\u2061', '\u2062', '\u2063', '\u2064', '\u2066', '\u17b4', '\u17b5', '\u2068', '\u2069'];
- return invisibleChars[Math.floor(Math.random() * invisibleChars.length)];
- }
-
- function addInvisibleCharsToMessage(message) {
- let result = '';
- for (let i = 0; i < message.length; i++) {
- result += message[i] + generateInvisibleChar();
- }
- return result;
- }
-
- function getRandomName() {
- let name = document.querySelector('.bot-nick').value.trim();
- let result = '';
- for (let i = 0; i < name.length; i++) {
- result += name[i] + generateInvisibleChar();
- }
- result += generateInvisibleChar();
- return result.trim();
- }
-
- function setRandomPlayerName() {
- config.playerName = getRandomName();
- }
-
- function updateRoomCode() {
- const roomInput = document.querySelector('.room-input');
- const roomCode = roomInput.value.trim();
- if(roomCode) {
- config.Rooms = [roomCode];
- config.settings.roomCode = roomCode;
- }
- }
-
- function autoDraw() {
- isAfkPaused = true;
- setTimeout(() => { isAfkPaused = false; }, 7000);
-
- wsList.forEach(ws => {
- if(ws.readyState === WebSocket.OPEN) {
- ws.send(`42[34,${ws.id}]`);
- let index = 0;
- const drawInterval = setInterval(() => {
- if(index < drawCommands.length) {
- ws.send(`42[10,${ws.id},${drawCommands[index]}]`);
- index++;
- } else {
- clearInterval(drawInterval);
- }
- }, 50);
- }
- });
- }
-
- function exitFromRooms() {
- wsList.forEach(ws => {
- if (ws.readyState === WebSocket.OPEN) {
- ws.send(`42[11,${ws.id},"bb"]`);
- setTimeout(() => {
- ws.send(`42[24,${ws.id}]`);
- }, 100);
- }
- });
- wsList = [];
- roomusers = [];
- updateUserList();
- kickedUsers.clear();
- document.querySelector('.bot-counter').textContent = 'Bots: 0';
- }
-
- function sendReport() {
- wsList.forEach(ws => {
- if (ws.readyState === WebSocket.OPEN) {
- ws.send(`42[35,${ws.id}]`);
- }
- });
- }
-
- async function enterRoom(roomCode) {
- setRandomPlayerName();
- try {
- const logoutResponse = await fetch("/logout");
- if (!logoutResponse.ok) throw new Error('Logout failed');
-
- const roomResponse = await fetch("https://gartic.io/server?check=1&v3=1&room=" + roomCode);
- if (!roomResponse.ok) throw new Error('Room check failed');
-
- const roomText = await roomResponse.text();
- const server = roomText.split("//")[1].split(".")[0];
- const ccode = roomText.split("c=")[1];
-
- const ws = new WebSocket('wss://' + server + '.gartic.io/socket.io/?c=' + ccode + '&EIO=3&transport=websocket');
- wsList.push(ws);
-
- ws.onopen = () => {
- let botData = {
- v: 20000,
- nick: getRandomName(),
- avatar: config.randomAvatar ? Math.floor(Math.random() * 36) : config.selectedAvatar,
- platform: 0,
- sala: roomCode.slice(-4)
- };
- ws.send(`42[3,${JSON.stringify(botData)}]`);
- };
-
- ws.onmessage = (msg) => {
- if (msg.data.indexOf('42["5"') !== -1) {
- let objlist = JSON.parse('["5"' + msg.data.split('42["5"')[1]);
- ws.id = objlist[2];
- roomusers = objlist[5];
- updateUserList();
- updateBotCounter();
- startAntiAfk(ws.id);
- setTimeout(() => {
- ws.send(`42[11,${ws.id},"sa"]`);
- }, 10);
- }
- if (msg.data.indexOf('42["23"') !== -1) {
- let user = JSON.parse("{" + msg.data.split("{")[1].split("}")[0] + "}");
- if (!roomusers.some(existingUser => existingUser.id === user.id)) {
- roomusers.push(user);
- updateUserList();
- }
- }
- if (msg.data.indexOf('42["24"') !== -1) {
- let userId = msg.data.split(",")[1].split('"')[1];
- roomusers = roomusers.filter(u => u.id !== userId);
- updateUserList();
- }
- if (msg.data.indexOf('42["33"') !== -1) {
- try {
- let userList = JSON.parse(msg.data.split('42["33",')[1]);
- roomusers = userList;
- updateUserList();
- } catch(e) {
- console.error(e);
- }
- }
- };
- } catch (error) {
- console.error(error);
- }
- }
-
- function startAntiAfk(botId) {
- const interval = setInterval(() => {
- if (!isAfkPaused) {
- wsList.forEach(ws => {
- if (ws.readyState === WebSocket.OPEN && ws.id === botId) {
- ws.send(`42[25,${botId}]`);
- }
- });
- }
- }, 5000);
- afkIntervals.push(interval);
- }
-
- function updateBotCounter() {
- let botCounter = document.querySelector('.bot-counter');
- let currentBots = parseInt(botCounter.textContent.split(': ')[1]);
- botCounter.textContent = `Bots: ${currentBots + 1}`;
- }
-
- function toggleRandomAvatar() {
- const switch_elem = document.querySelector('.avatar-switch input');
- const avatar_input = document.querySelector('.avatar-input');
- config.randomAvatar = switch_elem.checked;
- avatar_input.disabled = config.randomAvatar;
- if(config.randomAvatar) {
- avatar_input.value = '';
- updateAvatarPreview('');
- }
- }
-
- function updateAvatarPreview(value) {
- const preview = document.querySelector('.avatar-preview');
- const numValue = parseInt(value);
- if(numValue >= 0 && numValue <= 36) {
- preview.src = `https://gartic.io/static/images/avatar/svg/${numValue}.svg`;
- preview.style.display = 'inline';
- config.selectedAvatar = numValue;
- config.settings.avatarId = numValue;
- } else {
- preview.style.display = 'none';
- }
- }
-
- function sendMessage() {
- const messageInput = document.querySelector('.message-input');
- const message = messageInput.value;
- if (message && wsList.length > 0) {
- const firstBot = wsList[0];
- if (firstBot && firstBot.readyState === WebSocket.OPEN) {
- firstBot.send(`42[11,${firstBot.id},"${addInvisibleCharsToMessage(message)}"]`);
- }
- }
- }
-
- function toggleBot() {
- const toggleButton = document.querySelector('.toggle-button');
- isRunning = !isRunning;
- toggleButton.textContent = isRunning ? 'Stop Bots' : 'Start Bots';
- toggleButton.style.backgroundColor = isRunning ? '#ff4444' : '#4CAF50';
-
- if (isRunning) {
- enterAllRooms();
- mainInterval = setInterval(enterAllRooms, config.reexecutionDelay);
- } else {
- clearInterval(mainInterval);
- }
- }
-
- async function enterAllRooms() {
- if (!isRunning) return;
- for (const roomCode of config.Rooms) {
- await enterRoom(roomCode);
- await new Promise(resolve => setTimeout(resolve, config.delayBetweenEntries));
- }
- }
-
- function createGUI() {
- const css = `
- .frozen-bot {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: linear-gradient(135deg, #0c1d3b 0%, #1a3b7c 100%);
- padding: 20px;
- color: #fff;
- font-family: 'Arial', sans-serif;
- z-index: 9999;
- overflow-y: auto;
- }
-
- .bot-container {
- max-width: 1200px;
- margin: 0 auto;
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 20px;
- padding: 20px;
- }
-
- .control-panel, .user-panel {
- background: rgba(255, 255, 255, 0.1);
- padding: 20px;
- border-radius: 15px;
- backdrop-filter: blur(10px);
- }
-
- .frozen-bot input {
- width: 100%;
- padding: 12px;
- margin: 8px 0;
- border: none;
- border-radius: 8px;
- background: rgba(255, 255, 255, 0.15);
- color: #fff;
- font-size: 16px;
- }
-
- .frozen-bot button {
- width: 100%;
- padding: 12px;
- margin: 8px 0;
- border: none;
- border-radius: 8px;
- cursor: pointer;
- font-weight: bold;
- font-size: 16px;
- transition: all 0.3s ease;
- }
-
- .user-list {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
- gap: 10px;
- max-height: 600px;
- overflow-y: auto;
- padding: 15px;
- background: rgba(255, 255, 255, 0.05);
- border-radius: 10px;
- }
-
- .user-button {
- background: linear-gradient(135deg, #1a3b7c 0%, #0c1d3b 100%);
- color: #89CFF0;
- padding: 10px;
- border-radius: 8px;
- font-size: 14px;
- text-align: center;
- margin: 0;
- }
-
- h2 {
- color: #89CFF0;
- text-align: center;
- margin-bottom: 15px;
- text-shadow: 0 0 10px rgba(137, 207, 240, 0.5);
- }
-
- .toggle-button { background: #4CAF50; color: white; }
- .send-button { background: #2196F3; color: white; }
- .exit-button { background: #f44336; color: white; }
- .report-button { background: #E91E63; color: white; }
- .draw-button { background: #9C27B0; color: white; }
- .apply-button { background: #FF9800; color: white; }
-
- .bot-counter {
- text-align: center;
- margin: 10px 0;
- font-size: 1.2em;
- color: #89CFF0;
- }
-
- .avatar-container {
- display: flex;
- align-items: center;
- margin: 10px 0;
- gap: 10px;
- }
-
- .avatar-input { width: 60px !important; }
-
- .avatar-switch {
- position: relative;
- display: inline-block;
- width: 60px;
- height: 34px;
- }
-
- .avatar-preview {
- width: 30px;
- height: 30px;
- display: none;
- }
-
- .avatar-switch input {
- opacity: 0;
- width: 0;
- height: 0;
- }
-
- .slider {
- position: absolute;
- cursor: pointer;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: #ccc;
- transition: .4s;
- border-radius: 34px;
- }
-
- .slider:before {
- position: absolute;
- content: "";
- height: 26px;
- width: 26px;
- left: 4px;
- bottom: 4px;
- background-color: white;
- transition: .4s;
- border-radius: 50%;
- }
-
- input:checked + .slider { background-color: #2196F3; }
- input:checked + .slider:before { transform: translateX(26px); }
- `;
-
- const html = `
- <div class="frozen-bot">
- <div class="bot-container">
- <div class="control-panel">
- <h2>❄️ Frozen Bot Control Panel ❄️</h2>
- <div class="bot-counter">Bots: 0</div>
- <input type="text" class="room-input" placeholder="Enter Room Code..." oninput="updateRoomCode()">
- <input type="text" class="message-input" placeholder="Enter message...">
- <button class="send-button" onclick="window.sendMessage()">Send Message</button>
- <input type="text" class="bot-nick" placeholder="Bot Nick...">
- <div class="avatar-container">
- <input type="number" class="avatar-input" placeholder="Avatar" min="0" max="36" oninput="window.updateAvatarPreview(this.value)">
- <label class="avatar-switch">
- <input type="checkbox" onchange="window.toggleRandomAvatar()">
- <span class="slider"></span>
- </label>
- <span style="color: #89CFF0;">Random Avatar</span>
- <img class="avatar-preview">
- </div>
- <button class="apply-button" onclick="window.applySettings()">Apply Settings</button>
- <button class="toggle-button" onclick="window.toggleBot()">Start Bots</button>
- <button class="exit-button" onclick="window.exitFromRooms()">Exit Room</button>
- <button class="report-button" onclick="window.sendReport()">Report</button>
- <button class="draw-button" onclick="window.autoDraw()">AUTO DRAW</button>
- </div>
- <div class="user-panel">
- <h2>👥 User List</h2>
- <div class="user-list"></div>
- </div>
- </div>
- </div>
- `;
-
- const style = document.createElement('style');
- style.textContent = css;
- document.head.appendChild(style);
-
- const div = document.createElement('div');
- div.innerHTML = html;
- document.body.appendChild(div);
- }
-
- function init() {
- createGUI();
- loadSettings();
- userListUpdateInterval = setInterval(updateUserList, 100);
- }
-
- init();
- })();