└── redirector ├── .gitignore ├── README.md ├── global.d.ts ├── index.js ├── index.ts ├── package-lock.json ├── package.json ├── revival.ts ├── test.js └── tsconfig.json /redirector/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /redirector/README.md: -------------------------------------------------------------------------------- 1 | # Redirector Hack 2 | 3 | ## Reasoning 4 | 5 | The Redirector hack was made by [Will](https://github.com/TNThacker2015). 6 | 7 | In an effort to make hacking easier, and harder to patch, Will made the redirector hack. 8 | To put it simply, it modifies the game files to make it easier to hack. A little bit of voodoo cheat menus are included, and it's done! 9 | There are some occasional patches/fixes that require you to re-import the redirector json, but it's much better than the old `{Boot}` and `{sprintf}` methods. 10 | 11 | ## Locally hosting Redirector (Advanced) 12 | 13 | If for some reason redirector is down, instead of relying on our hosting for modified game files, you can host it locally! 14 | 15 | 1. Install Node.js, Git is optional. 16 | 17 | 2. Install the needed packages and dependencies. 18 | 19 | ```bash 20 | npm run setup 21 | ``` 22 | 23 | 3. Run the start script. 24 | 25 | ```bash 26 | npm start 27 | ``` 28 | 29 | 4. Profit! Redirector should now be pulling files from `localhost:1337`. 30 | -------------------------------------------------------------------------------- /redirector/global.d.ts: -------------------------------------------------------------------------------- 1 | import { PIXI } from "../typings/pixi"; 2 | import { BackpackData } from "../typings/backpack"; 3 | import { Player } from "../typings/player"; 4 | import { Prodigy } from "../typings/prodigy"; 5 | import { Game } from "../typings/game" 6 | export declare interface HackFunctions { 7 | completeTutorial(): void; 8 | getAllPets(): void; 9 | getAllItemsInCategory(category: keyof BackpackData): void; 10 | escapeBattle(): void; 11 | } 12 | export declare interface HackVariables { 13 | loc: { [index: string]: number; [index: number]: string }; 14 | menuTxt: { [index: string]: number; [index: number]: string }; 15 | menuObj: { [index: string]: { INTRO: { menu: number; ID: number } } }; 16 | } 17 | export declare interface Chat { 18 | _localizer: unknown; 19 | J: string[]; 20 | } 21 | export declare interface Hack { 22 | instance: { prodigy: Prodigy; game: Game }; 23 | constants: unknown; 24 | modules: unknown; 25 | functions: HackFunctions; 26 | variables: HackVariables; 27 | gameData: GameData; 28 | localizer: TODO; 29 | dialogue: TODO; 30 | network: TODO; 31 | hack: Hack; 32 | player: Player; 33 | chat: Chat 34 | hackMainframe(): void; 35 | } -------------------------------------------------------------------------------- /redirector/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 4 | return new (P || (P = Promise))(function (resolve, reject) { 5 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 6 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 7 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 8 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 9 | }); 10 | }; 11 | var __generator = (this && this.__generator) || function (thisArg, body) { 12 | var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; 13 | return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; 14 | function verb(n) { return function (v) { return step([n, v]); }; } 15 | function step(op) { 16 | if (f) throw new TypeError("Generator is already executing."); 17 | while (_) try { 18 | if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; 19 | if (y = 0, t) op = [op[0] & 2, t.value]; 20 | switch (op[0]) { 21 | case 0: case 1: t = op; break; 22 | case 4: _.label++; return { value: op[1], done: false }; 23 | case 5: _.label++; y = op[1]; op = [0]; continue; 24 | case 7: op = _.ops.pop(); _.trys.pop(); continue; 25 | default: 26 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } 27 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } 28 | if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } 29 | if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } 30 | if (t[2]) _.ops.pop(); 31 | _.trys.pop(); continue; 32 | } 33 | op = body.call(thisArg, _); 34 | } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } 35 | if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; 36 | } 37 | }; 38 | var __importDefault = (this && this.__importDefault) || function (mod) { 39 | return (mod && mod.__esModule) ? mod : { "default": mod }; 40 | }; 41 | var _a; 42 | Object.defineProperty(exports, "__esModule", { value: true }); 43 | var express_1 = __importDefault(require("express")); 44 | var node_fetch_1 = __importDefault(require("node-fetch")); 45 | var fs_1 = __importDefault(require("fs")); 46 | var path_1 = __importDefault(require("path")); 47 | var typescript_1 = require("typescript"); 48 | var cors_1 = __importDefault(require("cors")); 49 | var ms_1 = __importDefault(require("ms")); 50 | var app = express_1.default(); 51 | // should match https://github.com/Prodigy-Hacking/PHEx/blob/master/src/manifest.json 52 | var SupportPHEXVersion = "2.0.2"; 53 | var lastVersion = "None"; 54 | var startDate = Date.now(); 55 | /*setInterval(async () => { 56 | try { 57 | const status: GameStatus = await (await fetch("https://api.prodigygame.com/game-api/status")).json(); 58 | console.log(status); 59 | const version = status?.data?.gameClientVersion; 60 | if (lastVersion === "None") return (lastVersion = version!); 61 | 62 | // write modified gamefile to disk, in case there's a crash 63 | } catch (e) {} 64 | }, 10 * 60 * 1000);*/ 65 | app.use(cors_1.default()); 66 | app.get("/game.min.js", function (req, res) { return __awaiter(void 0, void 0, void 0, function () { 67 | var status, version, gameMinJS, replacements, _a, _b, _c, _d, _e, _f; 68 | var _g; 69 | return __generator(this, async function (_h) { 70 | switch (_h.label) { 71 | case 0: return [4 /*yield*/, node_fetch_1.default("https://api.prodigygame.com/game-api/status")]; 72 | case 1: return [4 /*yield*/, (_h.sent()).json()]; 73 | case 2: 74 | status = _h.sent(); 75 | const version = JSON.parse((await (await fetch('https://play.prodigygame.com/play')).text()) 76 | .match(/(?<=gameStatusDataStr = ').+(?=')/)[0]) 77 | if (status.status !== "success" || !version) 78 | return [2 /*return*/, res.sendStatus(503)]; 79 | return [4 /*yield*/, node_fetch_1.default("https://code.prodigygame.com/code/" + version + "/game.min.js?v=" + version)]; 80 | case 3: return [4 /*yield*/, (_h.sent()).text()]; 81 | case 4: 82 | gameMinJS = _h.sent(); 83 | res.type(".js"); 84 | replacements = [ 85 | ["s),this._game=i}", "s),this._game=i};jQuery.temp22=_;let nahhh=setInterval(()=>{if (jQuery.temp22 !== _) {_ = jQuery.temp22; delete jQuery.temp22;clearInterval(nahhh)}});Object.defineProperty(_, \"instance\", { get: () => t.instance });"], 86 | ["t.constants=Object", "_.constants=t,t.constants=Object"], 87 | ["window,function(t){var i={};", "window,function(t){var i={};_.modules=i;"], 88 | ["this._player=t", "this._player=_.player=t"], 89 | ["i.prototype.hasMembership=", "i.prototype.hasMembership=_=>true,i.prototype.originalHasMembership="] // membership override 90 | // ["this._localizer=null,this.et=[]", "_.chat=this;this._localizer=null,this.et=[]"], 91 | // ["return t.BAM=", ";_.variables.loc=Ar;_.variables.menuTxt=Kr;_.variables.menuObj=t;return t.BAM="], 92 | ]; 93 | _b = (_a = res).send; 94 | _d = (_c = replacements).reduce; 95 | _e = [function (code, replacement) { return code.split(replacement[0]).join(replacement[1]); }]; 96 | _f = "nootmeat = func => {\n\t\t\t\tlet elephant = 2\n\t\t\t}\n\t\t\texports = {};\n\t\t\t_.variables=Object.create(null);\n\n\t\t\tconsole.trace = _ => {};\n\t\n\t\t\t" + gameMinJS + "\n\n\t\t\t" + typescript_1.transpile(fs_1.default.readFileSync(path_1.default.join(__dirname, "./revival.ts"), { encoding: "utf8" })) + "\n\n\t\t\tconsole.log(\"%cWill's Redirect Hack\", \"font-size:40px;color:#540052;font-weight:900;font-family:sans-serif;\");\n\t\t\tconsole.log(\"%cVersion " + SupportPHEXVersion + "\", \"font-size:20px;color:#000025;font-weight:700;font-family:sans-serif;\");\n\t\t\tconsole.log('The variable \"_\" contains the hacked variables.');\n\t\t\tSW.Load.onGameLoad();\n\t\t\tsetTimeout(() => {\n\t\t\t\t"; 97 | return [4 /*yield*/, node_fetch_1.default("https://raw.githubusercontent.com/Prodigy-Hacking/ProdigyMathGameHacking/master/willsCheatMenu/loader.js")]; 98 | case 5: return [4 /*yield*/, (_h.sent()).text()]; 99 | case 6: return [2 /*return*/, _b.apply(_a, [_d.apply(_c, _e.concat([_f + (_h.sent()) + "\n\t\t\t}, 15000);\n\t\t"]))])]; 100 | } 101 | }); 102 | }); }); 103 | app.get("/", function (req, res) { return res.redirect("/game.min.js"); }); 104 | app.get("/public-game.min.js", function (req, res) { return __awaiter(void 0, void 0, void 0, function () { 105 | var publicGame; 106 | return __generator(this, function (_a) { 107 | switch (_a.label) { 108 | case 0: 109 | if (!req.query.hash) 110 | return [2 /*return*/, res.send("alert('OUTDATED REDIRECTOR CONFIG')")]; 111 | return [4 /*yield*/, node_fetch_1.default("https://code.prodigygame.com/js/public-game-" + req.query.hash + ".min.js")]; 112 | case 1: return [4 /*yield*/, (_a.sent()).text()]; 113 | case 2: 114 | publicGame = _a.sent(); 115 | res.type(".js"); 116 | return [2 /*return*/, res.send("\n\t\t" + publicGame.replace(/console\..+?\(.*?\)/g, "(()=>{})()") + "\n\n\t\t// overwrite Array.some to patch Prodigy's anti-cheat.\n\t\t// The Anti-Anti-Cheat\n\t\tl=Array.prototype.some;\n\t\tsetInterval(()=>{Array.prototype.some = function some(...args) {\n\t\t\tif (this[0] === \"hack\") this.splice(0, 100);\n\t\t\treturn l.call(this, ...args);\n\t\t}});\n\t\t\n\t\t// Prodigy's new hack var anti-cheat overwrote setInterval, to patch this, we get a fresh new setInterval from an iFrame,\n\t\t// then patch their patch.\n\t\tlet fffffff = document.createElement(\"iframe\");\n\t\tdocument.head.append(fffffff);\n\t\tfffffff.contentWindow.setInterval(() => {\n\t\t\tlet l = fffffff.contentWindow.setInterval;\n\t\t\twindow.setInterval = function(func, ...args) {\n\t\t\t\tif (func.toString().includes('[\"hack\"]')) return;\n\t\t\t\treturn l.call(window, func, ...args);\n\t\t\t}\n\t\t});\n\t")]; 117 | } 118 | }); 119 | }); }); 120 | app.get("/download", function (req, res) { return __awaiter(void 0, void 0, void 0, function () { 121 | return __generator(this, function (_a) { 122 | return [2 /*return*/, res.redirect("https://github.com/Prodigy-Hacking/PHEx/raw/master/build/extension.zip")]; 123 | }); 124 | }); }); 125 | app.get("/version", function (req, res) { return __awaiter(void 0, void 0, void 0, function () { 126 | return __generator(this, function (_a) { 127 | return [2 /*return*/, res.send(SupportPHEXVersion)]; 128 | }); 129 | }); }); 130 | app.get("/status", function (req, res) { return __awaiter(void 0, void 0, void 0, function () { 131 | return __generator(this, function (_a) { 132 | return [2 /*return*/, res.send("Redirector has been online for [" + ms_1.default(Date.now() - startDate) + "]")]; 133 | }); 134 | }); }); 135 | var port = (_a = process.env.PORT) !== null && _a !== void 0 ? _a : 1337; 136 | app.listen(port, function () { return console.log("The old machine hums along on port :" + port); }); 137 | -------------------------------------------------------------------------------- /redirector/index.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | import express from "express"; 3 | import fetch from "node-fetch"; 4 | import fs from "fs"; 5 | import path from "path"; 6 | import { transpile } from "typescript"; 7 | import Discord from "discord.js"; 8 | import cors from "cors"; 9 | import ms from "ms"; 10 | 11 | const app = express(); 12 | // should match https://github.com/Prodigy-Hacking/PHEx/blob/master/src/manifest.json 13 | const SupportPHEXVersion = "2.0.2"; 14 | let lastVersion = "None"; 15 | interface GameStatus { 16 | status: string; 17 | data?: { gameClientVersion?: string; prodigyGameFlags: { gameDataVersion: number } }; 18 | } 19 | const startDate = Date.now(); 20 | 21 | /*setInterval(async () => { 22 | try { 23 | const status: GameStatus = await (await fetch("https://api.prodigygame.com/game-api/status")).json(); 24 | console.log(status); 25 | const version = status?.data?.gameClientVersion; 26 | if (lastVersion === "None") return (lastVersion = version!); 27 | 28 | // write modified gamefile to disk, in case there's a crash 29 | } catch (e) {} 30 | }, 10 * 60 * 1000);*/ 31 | 32 | app.use(cors()); 33 | 34 | app.get("/game.min.js", async (req, res) => { 35 | const version = JSON.parse((await (await fetch('https://play.prodigygame.com/play')).text()) 36 | .match(/(?<=gameStatusDataStr = ').+(?=')/)[0]) 37 | const status = await (await fetch('https://api.prodigygame.com/game-api/status')).json() 38 | if (status.status !== "success" || !version) return res.sendStatus(503); 39 | const gameMinJS = await ( 40 | await fetch(`https://code.prodigygame.com/code/${version}/game.min.js?v=${version}`) 41 | ).text(); 42 | res.type(".js"); 43 | const replacements = [ 44 | ["s),this._game=i}", `s),this._game=i};jQuery.temp22=_;let nahhh=setInterval(()=>{if (jQuery.temp22 !== _) {_ = jQuery.temp22; delete jQuery.temp22;clearInterval(nahhh)}});Object.defineProperty(_, "instance", { get: () => t.instance });`], 45 | ["t.constants=Object", "_.constants=t,t.constants=Object"], 46 | ["window,function(t){var i={};", "window,function(t){var i={};_.modules=i;"], 47 | ["this._player=t", "this._player=_.player=t"], 48 | ["i.prototype.hasMembership=", "i.prototype.hasMembership=_=>true,i.prototype.originalHasMembership="] // membership override 49 | // ["this._localizer=null,this.et=[]", "_.chat=this;this._localizer=null,this.et=[]"], 50 | // ["return t.BAM=", ";_.variables.loc=Ar;_.variables.menuTxt=Kr;_.variables.menuObj=t;return t.BAM="], 51 | ]; 52 | return res.send( 53 | replacements.reduce( 54 | (code, replacement) => code.split(replacement[0]).join(replacement[1]), 55 | `nootmeat = func => { 56 | let elephant = 2 57 | } 58 | exports = {}; 59 | _.variables=Object.create(null); 60 | 61 | console.trace = _ => {}; 62 | 63 | ${gameMinJS} 64 | 65 | ${transpile(fs.readFileSync(path.join(__dirname, "./revival.ts"), { encoding: "utf8" }))} 66 | 67 | console.log("%cWill's Redirect Hack", "font-size:40px;color:#540052;font-weight:900;font-family:sans-serif;"); 68 | console.log("%cVersion ${SupportPHEXVersion}", "font-size:20px;color:#000025;font-weight:700;font-family:sans-serif;"); 69 | console.log('The variable "_" contains the hacked variables.'); 70 | SW.Load.onGameLoad(); 71 | setTimeout(() => { 72 | ${await (await fetch("https://raw.githubusercontent.com/Prodigy-Hacking/ProdigyMathGameHacking/master/willsCheatMenu/loader.js")).text()} 73 | }, 15000); 74 | `) 75 | ); 76 | }); 77 | app.get("/", (req, res) => res.redirect("/game.min.js")); 78 | app.get("/public-game.min.js", async (req, res) => { 79 | if (!req.query.hash) return res.send("alert('OUTDATED REDIRECTOR CONFIG')") 80 | const publicGame = await (await fetch(`https://code.prodigygame.com/js/public-game-${req.query.hash}.min.js`)).text(); 81 | res.type(".js"); 82 | return res.send(` 83 | ${publicGame.replace(/console\..+?\(.*?\)/g, "(()=>{})()")} 84 | 85 | // overwrite Array.some to patch Prodigy's anti-cheat. 86 | // The Anti-Anti-Cheat 87 | l=Array.prototype.some; 88 | setInterval(()=>{Array.prototype.some = function some(...args) { 89 | if (this[0] === "hack") this.splice(0, 100); 90 | return l.call(this, ...args); 91 | }}); 92 | 93 | // Prodigy's new hack var anti-cheat overwrote setInterval, to patch this, we get a fresh new setInterval from an iFrame, 94 | // then patch their patch. 95 | let fffffff = document.createElement("iframe"); 96 | document.head.append(fffffff); 97 | fffffff.contentWindow.setInterval(() => { 98 | let l = fffffff.contentWindow.setInterval; 99 | window.setInterval = function(func, ...args) { 100 | if (func.toString().includes('["hack"]')) return; 101 | return l.call(window, func, ...args); 102 | } 103 | }); 104 | `); 105 | }); 106 | app.get("/download", async (req, res) => { 107 | return res.redirect("https://github.com/Prodigy-Hacking/PHEx/raw/master/build/extension.zip"); 108 | }); 109 | app.get("/version", async (req, res) => { 110 | return res.send(SupportPHEXVersion); 111 | }); 112 | app.get("/status", async (req, res) => { 113 | return res.send(`Redirector has been online for [${ms(Date.now() - startDate)}]`) 114 | }); 115 | 116 | const port = process.env.PORT ?? 1337; 117 | app.listen(port, () => console.log(`The old machine hums along on port :${port}`)); 118 | -------------------------------------------------------------------------------- /redirector/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "redirect", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@discordjs/collection": { 8 | "version": "0.1.6", 9 | "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", 10 | "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" 11 | }, 12 | "@discordjs/form-data": { 13 | "version": "3.0.1", 14 | "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", 15 | "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", 16 | "requires": { 17 | "asynckit": "^0.4.0", 18 | "combined-stream": "^1.0.8", 19 | "mime-types": "^2.1.12" 20 | } 21 | }, 22 | "@types/body-parser": { 23 | "version": "1.19.0", 24 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", 25 | "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", 26 | "dev": true, 27 | "requires": { 28 | "@types/connect": "*", 29 | "@types/node": "*" 30 | } 31 | }, 32 | "@types/connect": { 33 | "version": "3.4.33", 34 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", 35 | "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", 36 | "dev": true, 37 | "requires": { 38 | "@types/node": "*" 39 | } 40 | }, 41 | "@types/cors": { 42 | "version": "2.8.8", 43 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.8.tgz", 44 | "integrity": "sha512-fO3gf3DxU2Trcbr75O7obVndW/X5k8rJNZkLXlQWStTHhP71PkRqjwPIEI0yMnJdg9R9OasjU+Bsr+Hr1xy/0w==", 45 | "dev": true, 46 | "requires": { 47 | "@types/express": "*" 48 | } 49 | }, 50 | "@types/express": { 51 | "version": "4.17.7", 52 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.7.tgz", 53 | "integrity": "sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ==", 54 | "dev": true, 55 | "requires": { 56 | "@types/body-parser": "*", 57 | "@types/express-serve-static-core": "*", 58 | "@types/qs": "*", 59 | "@types/serve-static": "*" 60 | } 61 | }, 62 | "@types/express-serve-static-core": { 63 | "version": "4.17.9", 64 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.9.tgz", 65 | "integrity": "sha512-DG0BYg6yO+ePW+XoDENYz8zhNGC3jDDEpComMYn7WJc4mY1Us8Rw9ax2YhJXxpyk2SF47PQAoQ0YyVT1a0bEkA==", 66 | "dev": true, 67 | "requires": { 68 | "@types/node": "*", 69 | "@types/qs": "*", 70 | "@types/range-parser": "*" 71 | } 72 | }, 73 | "@types/mime": { 74 | "version": "2.0.3", 75 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", 76 | "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==", 77 | "dev": true 78 | }, 79 | "@types/ms": { 80 | "version": "0.7.31", 81 | "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", 82 | "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", 83 | "dev": true 84 | }, 85 | "@types/node": { 86 | "version": "14.6.2", 87 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.2.tgz", 88 | "integrity": "sha512-onlIwbaeqvZyniGPfdw/TEhKIh79pz66L1q06WUQqJLnAb6wbjvOtepLYTGHTqzdXgBYIE3ZdmqHDGsRsbBz7A==", 89 | "dev": true 90 | }, 91 | "@types/node-fetch": { 92 | "version": "2.5.7", 93 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", 94 | "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", 95 | "dev": true, 96 | "requires": { 97 | "@types/node": "*", 98 | "form-data": "^3.0.0" 99 | } 100 | }, 101 | "@types/qs": { 102 | "version": "6.9.4", 103 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.4.tgz", 104 | "integrity": "sha512-+wYo+L6ZF6BMoEjtf8zB2esQsqdV6WsjRK/GP9WOgLPrq87PbNWgIxS76dS5uvl/QXtHGakZmwTznIfcPXcKlQ==", 105 | "dev": true 106 | }, 107 | "@types/range-parser": { 108 | "version": "1.2.3", 109 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 110 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", 111 | "dev": true 112 | }, 113 | "@types/serve-static": { 114 | "version": "1.13.5", 115 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.5.tgz", 116 | "integrity": "sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ==", 117 | "dev": true, 118 | "requires": { 119 | "@types/express-serve-static-core": "*", 120 | "@types/mime": "*" 121 | } 122 | }, 123 | "abort-controller": { 124 | "version": "3.0.0", 125 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 126 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 127 | "requires": { 128 | "event-target-shim": "^5.0.0" 129 | } 130 | }, 131 | "accepts": { 132 | "version": "1.3.7", 133 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 134 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 135 | "requires": { 136 | "mime-types": "~2.1.24", 137 | "negotiator": "0.6.2" 138 | } 139 | }, 140 | "array-flatten": { 141 | "version": "1.1.1", 142 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 143 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 144 | }, 145 | "asynckit": { 146 | "version": "0.4.0", 147 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 148 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 149 | }, 150 | "body-parser": { 151 | "version": "1.19.0", 152 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 153 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 154 | "requires": { 155 | "bytes": "3.1.0", 156 | "content-type": "~1.0.4", 157 | "debug": "2.6.9", 158 | "depd": "~1.1.2", 159 | "http-errors": "1.7.2", 160 | "iconv-lite": "0.4.24", 161 | "on-finished": "~2.3.0", 162 | "qs": "6.7.0", 163 | "raw-body": "2.4.0", 164 | "type-is": "~1.6.17" 165 | } 166 | }, 167 | "bytes": { 168 | "version": "3.1.0", 169 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 170 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 171 | }, 172 | "combined-stream": { 173 | "version": "1.0.8", 174 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 175 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 176 | "requires": { 177 | "delayed-stream": "~1.0.0" 178 | } 179 | }, 180 | "content-disposition": { 181 | "version": "0.5.3", 182 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 183 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 184 | "requires": { 185 | "safe-buffer": "5.1.2" 186 | } 187 | }, 188 | "content-type": { 189 | "version": "1.0.4", 190 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 191 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 192 | }, 193 | "cookie": { 194 | "version": "0.4.0", 195 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 196 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 197 | }, 198 | "cookie-signature": { 199 | "version": "1.0.6", 200 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 201 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 202 | }, 203 | "cors": { 204 | "version": "2.8.5", 205 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 206 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 207 | "requires": { 208 | "object-assign": "^4", 209 | "vary": "^1" 210 | } 211 | }, 212 | "debug": { 213 | "version": "2.6.9", 214 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 215 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 216 | "requires": { 217 | "ms": "2.0.0" 218 | }, 219 | "dependencies": { 220 | "ms": { 221 | "version": "2.0.0", 222 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 223 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 224 | } 225 | } 226 | }, 227 | "delayed-stream": { 228 | "version": "1.0.0", 229 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 230 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 231 | }, 232 | "depd": { 233 | "version": "1.1.2", 234 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 235 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 236 | }, 237 | "destroy": { 238 | "version": "1.0.4", 239 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 240 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 241 | }, 242 | "discord.js": { 243 | "version": "12.3.1", 244 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.3.1.tgz", 245 | "integrity": "sha512-mSFyV/mbvzH12UXdS4zadmeUf8IMQOo/YdunubG1wWt1xjWvtaJz/s9CGsFD2B5pTw1W/LXxxUbrQjIZ/xlUdw==", 246 | "requires": { 247 | "@discordjs/collection": "^0.1.6", 248 | "@discordjs/form-data": "^3.0.1", 249 | "abort-controller": "^3.0.0", 250 | "node-fetch": "^2.6.0", 251 | "prism-media": "^1.2.2", 252 | "setimmediate": "^1.0.5", 253 | "tweetnacl": "^1.0.3", 254 | "ws": "^7.3.1" 255 | } 256 | }, 257 | "ee-first": { 258 | "version": "1.1.1", 259 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 260 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 261 | }, 262 | "encodeurl": { 263 | "version": "1.0.2", 264 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 265 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 266 | }, 267 | "escape-html": { 268 | "version": "1.0.3", 269 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 270 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 271 | }, 272 | "etag": { 273 | "version": "1.8.1", 274 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 275 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 276 | }, 277 | "event-target-shim": { 278 | "version": "5.0.1", 279 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 280 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 281 | }, 282 | "express": { 283 | "version": "4.17.1", 284 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 285 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 286 | "requires": { 287 | "accepts": "~1.3.7", 288 | "array-flatten": "1.1.1", 289 | "body-parser": "1.19.0", 290 | "content-disposition": "0.5.3", 291 | "content-type": "~1.0.4", 292 | "cookie": "0.4.0", 293 | "cookie-signature": "1.0.6", 294 | "debug": "2.6.9", 295 | "depd": "~1.1.2", 296 | "encodeurl": "~1.0.2", 297 | "escape-html": "~1.0.3", 298 | "etag": "~1.8.1", 299 | "finalhandler": "~1.1.2", 300 | "fresh": "0.5.2", 301 | "merge-descriptors": "1.0.1", 302 | "methods": "~1.1.2", 303 | "on-finished": "~2.3.0", 304 | "parseurl": "~1.3.3", 305 | "path-to-regexp": "0.1.7", 306 | "proxy-addr": "~2.0.5", 307 | "qs": "6.7.0", 308 | "range-parser": "~1.2.1", 309 | "safe-buffer": "5.1.2", 310 | "send": "0.17.1", 311 | "serve-static": "1.14.1", 312 | "setprototypeof": "1.1.1", 313 | "statuses": "~1.5.0", 314 | "type-is": "~1.6.18", 315 | "utils-merge": "1.0.1", 316 | "vary": "~1.1.2" 317 | } 318 | }, 319 | "finalhandler": { 320 | "version": "1.1.2", 321 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 322 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 323 | "requires": { 324 | "debug": "2.6.9", 325 | "encodeurl": "~1.0.2", 326 | "escape-html": "~1.0.3", 327 | "on-finished": "~2.3.0", 328 | "parseurl": "~1.3.3", 329 | "statuses": "~1.5.0", 330 | "unpipe": "~1.0.0" 331 | } 332 | }, 333 | "form-data": { 334 | "version": "3.0.0", 335 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", 336 | "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", 337 | "dev": true, 338 | "requires": { 339 | "asynckit": "^0.4.0", 340 | "combined-stream": "^1.0.8", 341 | "mime-types": "^2.1.12" 342 | } 343 | }, 344 | "forwarded": { 345 | "version": "0.1.2", 346 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 347 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 348 | }, 349 | "fresh": { 350 | "version": "0.5.2", 351 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 352 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 353 | }, 354 | "http-errors": { 355 | "version": "1.7.2", 356 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 357 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 358 | "requires": { 359 | "depd": "~1.1.2", 360 | "inherits": "2.0.3", 361 | "setprototypeof": "1.1.1", 362 | "statuses": ">= 1.5.0 < 2", 363 | "toidentifier": "1.0.0" 364 | } 365 | }, 366 | "iconv-lite": { 367 | "version": "0.4.24", 368 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 369 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 370 | "requires": { 371 | "safer-buffer": ">= 2.1.2 < 3" 372 | } 373 | }, 374 | "inherits": { 375 | "version": "2.0.3", 376 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 377 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 378 | }, 379 | "ipaddr.js": { 380 | "version": "1.9.1", 381 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 382 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 383 | }, 384 | "media-typer": { 385 | "version": "0.3.0", 386 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 387 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 388 | }, 389 | "merge-descriptors": { 390 | "version": "1.0.1", 391 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 392 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 393 | }, 394 | "methods": { 395 | "version": "1.1.2", 396 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 397 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 398 | }, 399 | "mime": { 400 | "version": "1.6.0", 401 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 402 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 403 | }, 404 | "mime-db": { 405 | "version": "1.44.0", 406 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 407 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 408 | }, 409 | "mime-types": { 410 | "version": "2.1.27", 411 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 412 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 413 | "requires": { 414 | "mime-db": "1.44.0" 415 | } 416 | }, 417 | "ms": { 418 | "version": "2.1.3", 419 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 420 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 421 | }, 422 | "negotiator": { 423 | "version": "0.6.2", 424 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 425 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 426 | }, 427 | "node-fetch": { 428 | "version": "2.6.1", 429 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 430 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 431 | }, 432 | "object-assign": { 433 | "version": "4.1.1", 434 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 435 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 436 | }, 437 | "on-finished": { 438 | "version": "2.3.0", 439 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 440 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 441 | "requires": { 442 | "ee-first": "1.1.1" 443 | } 444 | }, 445 | "parseurl": { 446 | "version": "1.3.3", 447 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 448 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 449 | }, 450 | "path-to-regexp": { 451 | "version": "0.1.7", 452 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 453 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 454 | }, 455 | "prism-media": { 456 | "version": "1.2.2", 457 | "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.2.tgz", 458 | "integrity": "sha512-I+nkWY212lJ500jLe4tN9tWO7nRiBAVdMv76P9kffZjYhw20raMlW1HSSvS+MLXC9MmbNZCazMrAr+5jEEgTuw==" 459 | }, 460 | "proxy-addr": { 461 | "version": "2.0.6", 462 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 463 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 464 | "requires": { 465 | "forwarded": "~0.1.2", 466 | "ipaddr.js": "1.9.1" 467 | } 468 | }, 469 | "qs": { 470 | "version": "6.7.0", 471 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 472 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 473 | }, 474 | "range-parser": { 475 | "version": "1.2.1", 476 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 477 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 478 | }, 479 | "raw-body": { 480 | "version": "2.4.0", 481 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 482 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 483 | "requires": { 484 | "bytes": "3.1.0", 485 | "http-errors": "1.7.2", 486 | "iconv-lite": "0.4.24", 487 | "unpipe": "1.0.0" 488 | } 489 | }, 490 | "safe-buffer": { 491 | "version": "5.1.2", 492 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 493 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 494 | }, 495 | "safer-buffer": { 496 | "version": "2.1.2", 497 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 498 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 499 | }, 500 | "send": { 501 | "version": "0.17.1", 502 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 503 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 504 | "requires": { 505 | "debug": "2.6.9", 506 | "depd": "~1.1.2", 507 | "destroy": "~1.0.4", 508 | "encodeurl": "~1.0.2", 509 | "escape-html": "~1.0.3", 510 | "etag": "~1.8.1", 511 | "fresh": "0.5.2", 512 | "http-errors": "~1.7.2", 513 | "mime": "1.6.0", 514 | "ms": "2.1.1", 515 | "on-finished": "~2.3.0", 516 | "range-parser": "~1.2.1", 517 | "statuses": "~1.5.0" 518 | }, 519 | "dependencies": { 520 | "ms": { 521 | "version": "2.1.1", 522 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 523 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 524 | } 525 | } 526 | }, 527 | "serve-static": { 528 | "version": "1.14.1", 529 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 530 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 531 | "requires": { 532 | "encodeurl": "~1.0.2", 533 | "escape-html": "~1.0.3", 534 | "parseurl": "~1.3.3", 535 | "send": "0.17.1" 536 | } 537 | }, 538 | "setimmediate": { 539 | "version": "1.0.5", 540 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 541 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 542 | }, 543 | "setprototypeof": { 544 | "version": "1.1.1", 545 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 546 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 547 | }, 548 | "statuses": { 549 | "version": "1.5.0", 550 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 551 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 552 | }, 553 | "toidentifier": { 554 | "version": "1.0.0", 555 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 556 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 557 | }, 558 | "tweetnacl": { 559 | "version": "1.0.3", 560 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 561 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" 562 | }, 563 | "type-is": { 564 | "version": "1.6.18", 565 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 566 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 567 | "requires": { 568 | "media-typer": "0.3.0", 569 | "mime-types": "~2.1.24" 570 | } 571 | }, 572 | "typescript": { 573 | "version": "3.9.7", 574 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", 575 | "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==" 576 | }, 577 | "unpipe": { 578 | "version": "1.0.0", 579 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 580 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 581 | }, 582 | "utils-merge": { 583 | "version": "1.0.1", 584 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 585 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 586 | }, 587 | "vary": { 588 | "version": "1.1.2", 589 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 590 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 591 | }, 592 | "ws": { 593 | "version": "7.3.1", 594 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", 595 | "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" 596 | } 597 | } 598 | } 599 | -------------------------------------------------------------------------------- /redirector/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "redirect", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MPL-2.0", 6 | "dependencies": { 7 | "cors": "^2.8.5", 8 | "discord.js": "^12.2.0", 9 | "express": "^4.17.1", 10 | "ms": "^2.1.3", 11 | "node-fetch": "^2.6.1", 12 | "typescript": "^3.8.3" 13 | }, 14 | "scripts": { 15 | "start": "node .", 16 | "build": "tsc && npm start", 17 | "setup": "npm install" 18 | }, 19 | "devDependencies": { 20 | "@types/ms": "^0.7.31", 21 | "@types/cors": "^2.8.8", 22 | "@types/express": "^4.17.7", 23 | "@types/node-fetch": "^2.5.7" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /redirector/revival.ts: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | require = (() => {}) as any; 3 | import "../typings/pixi"; 4 | 5 | _.functions = Object.create(null); 6 | 7 | _.functions.escapeBattle = () => { 8 | const currentState = _.instance.game.state.current; 9 | if (currentState === "PVP") Object.fromEntries(_.instance.game.state.states).PVP.endPVP(); 10 | else if (currentState === "CoOp") _.instance.prodigy.world.$(_.player.data.zone); 11 | else _.instance.game.state.callbackContext.runAwayCallback(); 12 | }; 13 | _.hackMainframe = () => { 14 | const parent = document.querySelector("canvas")?.parentElement; 15 | document.querySelector("canvas")?.remove(); 16 | const canvas = document.createElement("canvas"); 17 | parent.prepend(canvas) 18 | const ctx = canvas.getContext("2d"); 19 | const letters = "0123456789ABCDEF".split(""); 20 | canvas.width = innerWidth 21 | canvas.height = innerHeight 22 | 23 | const fontSize = 10; 24 | const columns = canvas.width / fontSize; 25 | const drops = []; 26 | for (let i = 0; i < columns; i++) drops[i] = 1; 27 | setInterval(() => { 28 | ctx.fillStyle = "rgba(0, 0, 0, .1)"; 29 | ctx.fillRect(0, 0, canvas.width, canvas.height); 30 | for (let i = 0; i < drops.length; i++) { 31 | const text = letters[Math.floor(Math.random() * letters.length)]; 32 | ctx.fillStyle = "#0f0"; 33 | ctx.fillText(text, i * fontSize, drops[i] * fontSize); 34 | drops[i]++; 35 | if (drops[i] * fontSize > canvas.height && Math.random() > 0.95) { 36 | drops[i] = 0; 37 | } 38 | } 39 | }, 33) 40 | }; 41 | /* 42 | _.functions.customChat = (text: string) => { 43 | const dialogue = _.instance.prodigy.dialogue.create(); 44 | dialogue.setText(10); 45 | const key = "noot"; 46 | dialogue.eventQueue[0].dialogueData = dialogue.dataProvider.getLegacy( 47 | key, 48 | dialogue.eventQueue[0].legacyData.index 49 | ); 50 | dialogue.eventQueue[0] = Object.assign( 51 | { 52 | type: undefined, 53 | windowPosition: undefined, 54 | blockInput: !undefined, 55 | }, 56 | dialogue.eventQueue[0] 57 | ); 58 | dialogue.eventQueue[0] = (window as any)._.pickBy(dialogue.eventQueue[0], x => x !== undefined); 59 | dialogue.closeDialogue(false); 60 | dialogue.onClose = () => {}; 61 | _.instance.prodigy.notifications.setPaused(true); 62 | const next = () => { 63 | dialogue.current = dialogue.eventQueue.splice(0, dialogue.skipCounter + 1)[dialogue.skipCounter]; 64 | dialogue.skipCounter = 0; 65 | if (Object.keys(dialogue.current ?? {}).length > 0) { 66 | const item = [dialogue.current.dialogueData.avatar.atlas]; 67 | if (dialogue.currentDialogue?.game) { 68 | dialogue.currentDialogue.updateSchema(dialogue.current, item); 69 | } else { 70 | dialogue.currentDialogue = _.instance.prodigy.open.characterDialogue( 71 | dialogue.current, 72 | next.bind(dialogue), 73 | item 74 | ); 75 | } 76 | } 77 | }; 78 | next(); 79 | }; 80 | */ 81 | Object.defineProperty(_, "gameData", { get: () => _.instance.game.state.states.get('Boot')._gameData }); 82 | Object.defineProperty(_, "localizer", { 83 | get: () => _.instance.prodigy.gameContainer.get("LocalizationService"), 84 | }); 85 | Object.defineProperty(_, "network", { 86 | get: () => _.player.game.input.onDown._bindings[0].context, 87 | }); 88 | Object.defineProperty(_, "hack", { 89 | get: () => _, 90 | }); -------------------------------------------------------------------------------- /redirector/test.js: -------------------------------------------------------------------------------- 1 | const fetch = require("node-fetch"); 2 | 3 | (async () => { 4 | const status = await (await fetch("https://api.prodigygame.com/game-api/status")).json(); 5 | const gameMin = await (await fetch(`${status.data.gameCodePath}game.min.js`)).text(); 6 | console.log(gameMin.length); 7 | })(); -------------------------------------------------------------------------------- /redirector/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "exclude": [ 3 | "revival.ts" 4 | ], 5 | "compilerOptions": { 6 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 7 | 8 | /* Basic Options */ 9 | // "incremental": true, /* Enable incremental compilation */ 10 | "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, 11 | "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, 12 | // "lib": [], /* Specify library files to be included in the compilation. */ 13 | // "allowJs": true, /* Allow javascript files to be compiled. */ 14 | // "checkJs": true, /* Report errors in .js files. */ 15 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 16 | // "declaration": true, /* Generates corresponding '.d.ts' file. */ 17 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 18 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 19 | // "outFile": "./", /* Concatenate and emit output to single file. */ 20 | // "outDir": "./", /* Redirect output structure to the directory. */ 21 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 22 | // "composite": true, /* Enable project compilation */ 23 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 24 | // "removeComments": true, /* Do not emit comments to output. */ 25 | // "noEmit": true, /* Do not emit outputs. */ 26 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 27 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 28 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 29 | 30 | /* Strict Type-Checking Options */ 31 | "strict": true /* Enable all strict type-checking options. */, 32 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 33 | // "strictNullChecks": true, /* Enable strict null checks. */ 34 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 35 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 36 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 37 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 38 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 39 | 40 | /* Additional Checks */ 41 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 42 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 43 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 44 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 45 | 46 | /* Module Resolution Options */ 47 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 48 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 49 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 50 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 51 | // "typeRoots": [], /* List of folders to include type definitions from. */ 52 | // "types": [], /* Type declaration files to be included in compilation. */ 53 | "allowSyntheticDefaultImports": true /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */, 54 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, 55 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 56 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 57 | 58 | /* Source Map Options */ 59 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 60 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 61 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 62 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 63 | 64 | /* Experimental Options */ 65 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 66 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 67 | 68 | /* Advanced Options */ 69 | "skipLibCheck": true /* Skip type checking of declaration files. */, 70 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 71 | } 72 | } 73 | --------------------------------------------------------------------------------