- // ==UserScript==
- // @name Lobbychat
- // @namespace http://tampermonkey.net/
- // @version 2024-03-09
- // @description lobbychat use commands and talk
- // @author You
- // @match https://*.blooket.com/*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=blooket.com
- // @grant none
- // @license MIT
- // ==/UserScript==
-
- function reactHandler() {
- return Object.values(document.querySelector('body div[class*="_body"]'))[1].children[0]._owner
- }
- var j = 0;
- var rx = false;
- var hi = false;
- document.addEventListener("keydown", function(e) {
- if (e.key === "`") {
- hi = !hi;
- c.style.display = hi ? "block" : "none";
- }
- });
-
- function parseCmd(t) {
- if (t.charAt(0) === "/") {
- var c = t.split(" ");
- var cm = c[0].replace("/", "");
- c.splice(0, 1);
- return {
- cmd: cm,
- args: c
- };
- } else {
- return false;
- }
- }
-
- function setstate(args) {
- var t = {};
- args.forEach(e => {
- var p = e.split(":");
- if (!Number.isNaN(parseInt(p[1]))) {
- if (parseInt(p[1]).toString() === p[1]) {
- p[1] = parseInt(p[1]);
- }
- }
- t[p[0]] = p[1];
- });
- reactHandler().stateNode.setState(t);
- a("Set Successful!");
- }
-
- function setv(args) {
- reactHandler().stateNode.props.liveGameController.setVal({
- path: "c/" + reactHandler().stateNode.props.client.name + "/" + args[0],
- val: args.slice(1, args.length).join(" ")
- });
- }
-
- function tsvlog() {
- window.logsv = !window.logsv;
- a("SetVal log set to " + (window.logsv ? "Enabled" : "Disabled"));
- }
-
- function dumpstate() {
- Object.keys(reactHandler().stateNode.state).map(e => {
- var obj = reactHandler().stateNode.state[e];
- if (obj != null) {
- if (Array.from(obj) && typeof obj === "object") {
- obj = "[Array]";
- }
- a(e + ":" + obj);
- } else {
- return "N/A";
- }
- }).join(";");
- }
-
- function setBlook(b) {
- var blooks = webpackJsonp.push([
- [], {
- ['1234']: (_, a, b) => {
- a.webpack = b
- }
- },
- [
- ['1234']
- ]
- ]).webpack("MDrD").a;
- b = Object.keys(blooks).find(e => b.toLocaleLowerCase() === e.toLocaleLowerCase());
- if (blooks[b]) {
- a("Setting blook to " + b + "!");
- reactHandler().stateNode.props.liveGameController.setVal({
- id: reactHandler().stateNode.props.client.hostId,
- path: "c/" + reactHandler().stateNode.props.client.name,
- val: {
- b: b
- }
- });
- reactHandler().stateNode.props.client.blook = b;
- } else {
- a("No blook with that name was found!");
- }
- }
-
- function unlockBlook(b) {
- var blooks = webpackJsonp.push([
- [], {
- ['1234']: (_, a, b) => {
- a.webpack = b
- }
- },
- [
- ['1234']
- ]
- ]).webpack("MDrD").a;
- b = Object.keys(blooks).find(e => b.toLocaleLowerCase() === e.toLocaleLowerCase());
- if (blooks[b]) {
- reactHandler().stateNode.state.unlocks.push(b);
- reactHandler().stateNode.forceUpdate();
- } else {
- a("No blook with that name was found!");
- }
- }
-
- function list() {
- reactHandler().stateNode.props.liveGameController.getDatabaseVal("c").then(e => {
- a("Current Players(" + Object.keys(e).length + "): " + Object.keys(e).join(","));
- });
- }
-
- function flist(p) {
- reactHandler().stateNode.props.liveGameController.getDatabaseVal("c/" + p).then(e => {
- if (e != null) {
- a("Dump: " + JSON.stringify(e));
- } else {
- a("Player not found!");
- }
- });
- }
-
- function sendMessage(e) {
- var t = parseCmd(e);
- if (t) {
- switch (t.cmd) {
- case "cb":
- setBlook(t.args.join(" "));
- break;
- case "clear":
- b.innerHTML = "";
- break;
- case "dumpstate":
- dumpstate();
- break;
- case "list":
- list();
- break;
- case "tlog":
- tsvlog();
- break;
- case "setval":
- setv(t.args);
- break;
- case "setstate":
- setstate(t.args);
- break;
- case "ahelp":
- a("Advanced Commands: setval(sets val logged by tlog ex /setval b Chicken), tlog(toggles setval log), dumpstate(dumps react state),setstate(sets react state /setstate crypto:5 crypto2:5 etc)");
- break;
- case "help":
- a("Available Commands: help(gives help),ahelp(advanced commands help), cb(changes blook /cb cow), list(lists players connected), dump(dumps all available info about a player, passwords, etc(/dump player)), clear(clears chat), code(gives game code), unlock(unlocks blook on lobby screen)");
- break;
- case "dump":
- flist(t.args.join(" "));
- break;
- case "unlock":
- unlockBlook(t.args.join(" "));
- break;
- case "code":
- a("Game Code: " + reactHandler().stateNode.props.client.hostId);
- break;
- default:
- a("Unrecognized chat command!");
- break;
- }
- } else {
- reactHandler().stateNode.props.liveGameController.setVal({
- id: reactHandler().stateNode.props.client.hostId,
- path: "c/" + reactHandler().stateNode.props.client.name,
- val: {
- b: reactHandler().stateNode.props.client.blook,
- i: j,
- msg: e
- }
- }), j++;
- }
- }
- const c = document.createElement("div");
- c.className = "chat-box", document.body.appendChild(c);
- const h = document.createElement("div");
- h.className = "chat-header", h.textContent = "Chat", c.appendChild(h);
- const b = document.createElement("div");
- b.className = "chat-body", c.appendChild(b);
- const i = document.createElement("input");
-
- function a(e) {
- const t = document.createElement("div");
- t.textContent = e, b.appendChild(t)
- }
- i.type = "text", i.className = "chat-input", i.placeholder = "Type a message...", c.appendChild(i), c.style.position = "fixed", c.style.bottom = "20px", c.style.right = "20px", c.style.width = "300px", c.style.backgroundColor = "#fff", c.style.border = "1px solid #ccc", c.style.boxShadow = "0px 0px 10px rgba(0, 0, 0, 0.2)", h.addEventListener("click", (() => {
- b.classList.toggle("open")
- })), i.addEventListener("keydown", (function(e) {
- 13 === e.keyCode && (sendMessage(e.srcElement.value), e.srcElement.value = "")
- }));
- var da = reactHandler().stateNode.props.liveGameController._liveApp.database()._delegate._repoInternal.server_.onDataUpdate_;
-
- function handleChat(e, t) {
- if (e.includes("/stg") && !rx) {
- rx = true;
- a("Game has progressed! The Chat will not work, but commands will.");
- }
- if (t != null) {
- t.msg && (console.log(t.msg), a(e.split("/")[2] + ": " + t.msg))
- }
- }
- reactHandler().stateNode.props.liveGameController._liveApp.database()._delegate._repoInternal.server_.onDataUpdate_ = function(e, t, a, n) {
- console.log(e, t, a, n), handleChat(e, t), da(e, t, a, n)
- };
- window.logsv = false;
-
- function onsv(e) {
- if (window.logsv) {
- a("Path: " + e.path.split("/").splice(2, 2).join("/") + " Val: " + ((typeof e.val === 'object') ? JSON.stringify(e.val) : e.val));
- }
- }
- var orgsv = reactHandler().stateNode.props.liveGameController.setVal;
- reactHandler().stateNode.props.liveGameController.setVal = function() {
- onsv.apply(this, arguments);
- orgsv.apply(this, arguments);
- };
- a("Lobbychat successfully loaded!");
-
- function app() {
- c.style.wordWrap = "break-word";
- }
- app();