// ==UserScript==
// @name Gartic.io Anonim Menu
// @namespace https://gf.qytechs.cn/
// @version 2024-01-11
// @description Press F2 to open and close the menu
// @author anonimbiri
// @match https://gartic.io/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=gartic.io
// @require https://update.gf.qytechs.cn/scripts/482771/1303809/Malayala%20Kit.js
// @grant none
// ==/UserScript==
const AnonimbiriAPI = {
ws: null,
isGame: false,
playerId: null,
unlimitedKick: false,
autoSkip: false,
antiAfk: false,
noCooldown: false,
autoGuessing: false,
hint: null,
wordList: [],
debug: false,
};
const kit = new MalayalaKit.CreateMenu({
title: "Anonim Menu",
icon: "",
size: { width: 500, height: 400 },
position: { top: 50, left: 50 },
hotkey: { keyCode: 113, ctrlKey: false, altKey: false, shiftKey: false },
});
const general = new MalayalaKit.Tab("General");
general.addSwitch({
label: "Unlimited Kick",
value: false,
onchange: (value) => {
AnonimbiriAPI.unlimitedKick = value;
},
});
general.addSwitch({
label: "Auto Skip",
value: false,
onchange: (value) => {
AnonimbiriAPI.autoSkip = value;
},
});
general.addSwitch({
label: "Anti Afk",
value: false,
onchange: (value) => {
AnonimbiriAPI.antiAfk = value;
},
});
general.addSwitch({
label: "No Cooldown For Room Change",
value: false,
onchange: (value) => {
AnonimbiriAPI.noCooldown = value;
},
});
kit.addTab(general);
const guess = new MalayalaKit.Tab("Guess");
guess.addInput({
label: "Word List",
placeholder: "wordList.txt",
type: "text",
onchange: (value) => {
fetch(value)
.then(response => response.text())
.then(data => {
AnonimbiriAPI.wordList = data.split('\n').map(word => word.trim().toLowerCase());
}).catch(error => console.error('Error:', error));
},
});
guess.addSwitch({
label: "Auto Guessing",
value: false,
onchange: (value) => {
AnonimbiriAPI.autoGuessing = value;
},
});
kit.addTab(guess);
const fakeWinText = "anonimbiri";
const local = new MalayalaKit.Tab("Local");
local.addInput({
label: "Fake Win text",
placeholder: "Enter Fake Win text",
type: "text",
value: fakeWinText,
onchange: (value) => {
fakeWinText = value;
},
});
local.addButton({
label: "Send Fake Win",
buttonLabel: "Send Fake Win",
onclick: () => {
const event = new MessageEvent("message", {
data: `42["26","${fakeWinText}",10,11,10000]`,
});
AnonimbiriAPI.ws.dispatchEvent(event);
},
});
kit.addTab(local);
let intervalId = null;
let spamText = "anonimbiri";
const spam = new MalayalaKit.Tab("Spam");
spam.addSwitch({
label: "Spam",
value: false,
onchange: (value) => {
if (value) {
intervalId = setInterval(() => {
const randomIndex = Math.floor(Math.random() * (spamText.length + 1));
const newText = spamText.replace(/({${randomIndex}})/, '$1.');
AnonimbiriAPI.ws.send(`42[11,${AnonimbiriAPI.playerId},"${newText}"]`);
}, 800);
} else {
clearInterval(intervalId);
}
},
});
spam.addInput({
label: "Spam text",
placeholder: "Enter Spam text",
type: "text",
value: spamText,
onchange: (value) => {
spamText = value;
},
});
kit.addTab(spam);
let intervalHint = null;
window.WebSocket = class extends WebSocket {
constructor(...args) {
super(...args);
AnonimbiriAPI.ws = this;
this.addEventListener("message", (e) => {
AnonimbiriAPI.debug && console.log("%c<--- Received data:", "color: pink", e.data);
const messageData = JSON.parse(e.data.slice(2));
if (messageData[0] === "45" && AnonimbiriAPI.unlimitedKick) {
const OriginalDate = window.Date;
window.Date = class extends Date {
static now() {
return super.now() * 2123;
}
};
setTimeout(() => {
window.Date = OriginalDate;
}, 2000);
return;
} else if (messageData[0] === "5") {
AnonimbiriAPI.isGame = true;
AnonimbiriAPI.playerId = messageData[2];
} else if (messageData[0] === "16" && AnonimbiriAPI.autoSkip) {
AnonimbiriAPI.ws.send(`42[25,${AnonimbiriAPI.playerId}]`);
} else if (messageData[0] === "34") {
AnonimbiriAPI.ws.send(`42[30,${AnonimbiriAPI.playerId}]`);
AnonimbiriAPI.ws.send(`42[30,${AnonimbiriAPI.playerId}]`);
AnonimbiriAPI.ws.send(`42[30,${AnonimbiriAPI.playerId}]`);
} else if (messageData[0] === "19" && AnonimbiriAPI.antiAfk) {
window.Date = class extends Date {
static now() {
return super.now() / 2123;
}
};
} else if (messageData[0] === "23") {
!AnonimbiriAPI.debug && console.clear();
const nickElements = document.querySelectorAll('.nick');
nickElements.forEach((nickElement) => {
const nickName = nickElement.innerText;
if (
nickName.startsWith('') &&
!nickElement.parentElement.querySelector('.cheater') &&
!nickElement.parentElement.parentElement.classList.contains('you')
) {
const newElement = document.createElement('span');
newElement.classList.add('cheater');
newElement.style = 'color:pink; font-weight: bold; font-family: "Lucida Console", "Courier New", monospace;';
newElement.innerText = `🎮 Cheater`;
nickElement.parentElement.appendChild(newElement);
}
});
} else if (messageData[0] ==="30" && AnonimbiriAPI.autoGuessing && AnonimbiriAPI.hint && !intervalHint) {
AnonimbiriAPI.hint = messageData[1].join('');
intervalHint = setInterval(() => {
AnonimbiriAPI.ws.send(`42[13,${AnonimbiriAPI.playerId},"${guessWord(AnonimbiriAPI.hint)}"]`);
}, 1000);
} else if (messageData[0] ==="19" && intervalHint) {
clearInterval(intervalHint);
} else if (messageData[0] ==="13" && AnonimbiriAPI.wordList.length !== 0) {
const index = AnonimbiriAPI.wordList.indexOf(messageData[1].toLowerCase());
index !== -1 && AnonimbiriAPI.wordList.splice(index, 1)
}
});
}
send(data) {
AnonimbiriAPI.debug && console.log("%c---> Sent data:", "color: pink", data);
const newData = JSON.parse(data.slice(2));
if (newData[1] && newData[1].nick) {
newData[1].nick = `${newData[1].nick}`;
data = data.slice(0, 2) + JSON.stringify(newData);
super.send(data);
} else if (newData[0] === "46") {
} else {
super.send(data);
}
}
};
function guessWord(guessedPattern) {
const wordList = AnonimbiriAPI.wordList.map(word => word.toLowerCase());
const length = wordList[0].length;
const result = [];
for (let i = 0; i < length; i++) {
const charSet = new Set();
for (let j = 0; j < wordList.length; j++) {
if (!guessedPattern[j] || guessedPattern[j][i] === '_') {
charSet.add(wordList[j][i]);
}
}
if (charSet.size === 1) {
result.push(charSet.values().next().value);
} else {
result.push('_');
}
}
return result.join('');
}
const observer = new MutationObserver(() => {
document.querySelector('input[name="chat"]')?.replaceWith(
Object.assign(document.createElement('input'), {
type: 'text',
name: 'chat',
className: 'mousetrap',
placeholder: '🔓 Chat Unlocked',
autocomplete: 'off',
autocorrect: 'off',
autocapitalize: 'off',
maxLength: 100,
value: '',
})
);
if (document.querySelector('#popUp') && AnonimbiriAPI.noCooldown) {
const OriginalDate = window.Date;
window.Date = class extends Date {
static now() {
return super.now() * 2123;
}
};
setTimeout(() => {
window.Date = class extends Date {
static now() {
return super.now() / 2123;
}
};
}, 500);
document.querySelector('.ic-playHome').click();
}
});
observer.observe(document.body, { childList: true, subtree: false });
const keyupEvent = (e) => {
if (e.keyCode === 13) {
const chatInput = document.querySelector('input[name="chat"]');
AnonimbiriAPI.ws.send(`42[11,${AnonimbiriAPI.playerId},"${chatInput.value}"]`);
chatInput.value = '';
}
};
window.addEventListener('keyup', keyupEvent);
window.AnonimbiriAPI = AnonimbiriAPI;
kit.render();