// ==UserScript== // @name OWOP Chat Utils // @namespace https://greasyfork.org/en/users/1502179/ // @version 1.7 // @description Adds several useful features to the chat // @author NothingHere7759 // @match https://ourworldofpixels.com/* // @exclude https://ourworldofpixels.com/api* // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgCAYAAACLz2ctAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsEAAA7BAbiRa+0AAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCA1LjEuOWxu2j4AAAC2ZVhJZklJKgAIAAAABQAaAQUAAQAAAEoAAAAbAQUAAQAAAFIAAAAoAQMAAQAAAAIAAAAxAQIAEAAAAFoAAABphwQAAQAAAGoAAAAAAAAA2XYBAOgDAADZdgEA6AMAAFBhaW50Lk5FVCA1LjEuOQADAACQBwAEAAAAMDIzMAGgAwABAAAAAQAAAAWgBAABAAAAlAAAAAAAAAACAAEAAgAEAAAAUjk4AAIABwAEAAAAMDEwMAAAAAACMojeFEB6NgAAArJJREFUeF7t28uNE1EQQFGbCFgzgZDGiEARaRAIrCeDYd8CqawpfP05Z9kLd7d99RZV8vn0IH79+Px+vPbIXl7fzsdr9+jT8QJckwBJCZCUAEkJkJQASQmQlABJCZBUNk2vNhdfvn47Xropv39+P166imqz4gQkJUBSAiQlQFICJCVAUgIkJUBSAiS1Pv3e3nA82+Zi+323n297Y+IEJCVAUgIkJUBSAiQlQFICJCVAUgIkNZ5qVxuO7Un+9L5Tt/58U9vvMd2YOAFJCZCUAEkJkJQASQmQlABJCZCUAEmNptWnCzYh00n+9uR92/Q9KtPvb/s9pve1CeEuCJCUAEkJkJQASQmQlABJCZCUAEmdpxuOqenkfTpRr0zf49ls/25OQFICJCVAUgIkJUBSAiQlQFICJCVAUuNNSLUZ2J68b7/H9vNt237fqen34gQkJUBSAiQlQFICJCVAUgIkJUBSAiR185uQynSS/yi2f9/p9+cEJCVAUgIkJUBSAiQlQFICJCVAUgIktb4JmU7Ap6b3ndp+vmcz/T2m37MTkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkJQASQmQlABJCZCUAEkJkNT4PyFT0/8MVKb/VeA6nICkBEhKgKQESEqApARISoCkBEhKgKTOxwv/Mt2YbG9CppuL6X2nn8fHvLy+jdpyApISICkBkhIgKQGSEiApAZISICkBkhpNq08XbEKmppuLio3Jx9iEcBcESEqApARISoCkBEhKgKQESEqApEbT6kvYmDy26YZjyglISoCkBEhKgKQESEqApARISoCkBEhqdap9ie2NyZTNyt9tbzimnICkBEhKgKQESEqApARISoCkBEhKgKSS6ff/UG1WKtXmYpsTkJQASQmQlABJCZCUAEkJkJQASQmQ1B8g1YFmQv53bQAAAABJRU5ErkJggg== // @grant none // @license MIT // @downloadURL none // ==/UserScript== // CREDITS: Advice about the code - NekoNoka // Beta testers - Rainbow, SyntexPr /* CHANGELOG Quick Tell 1.0 - Added /q and /qid Group Chat 1.0 - Added /g 1.0 - Combined Quick Tell and Group Chat into Chat Utils 1.1 - Minor bugfixes for /g tell, /qid, /q and /help Added /qgname and /qg 1.2 - Added /r 1.3 - Added /l, /lset and /clear Improved command messages Added aliases and changed some of the default commands 1.3.1 - Changed some command messages Colorful Chat 0.0 - Added red, orange, gold, yellow, lime, green, cyan, blue, purple, violet, pink, magenta, brown, gray, grey, tree, grass, Mr. Smiles, Forest Land and Riverland Colorful Chat 0.1 - Added white, black, rgb, Rainbow, Monochrome, Romaniaball, NothingHere, Diermania, SyntexPr, Trion, Coalition, Nortia, Vinland and [Server] Fixed Mr. Smiles not having chat mentions 1.3.2 - Changed /clear to actually clear the chat Colorful Chat 0.1.1 - Added RSSR, R55R, Moth, Potassium, Atlan, ATLaDOS, :D Anon, St. and Orang Colorful Chat 1.0 - Rewrote the script with RegEx Added crimson, indigo, fuchsia, mauve, South Nortia, Norisia and Evermore Added support for hex color codes Fixed :D Anon, St. and Моль not being colored Colorful Chat 1.0.1 - Added water, :D-Anon, USRNSNN and URNNSN Fixed some color names not working 1.4 - Incorporated Colorful Chat into Chat Utils Added /color Added chat mentions for colorful chat 1.4.1 - Fixed a bug with the /help message 1.4.2 - Added lava, fire, HungaryBall, Rainbowball, Hungary, MagyarLabda, Magyar, Romania, Europe RP and Cyan (nickname) to colorful chat Changed crimson, orange, lime, indigo and Trion for colorful chat 1.5 - Added an icon to the script Added /yell Removed the ability for players to execute their own html Fixed the "unknown command" message when using /help for commands added by the script Fixed /group ids showing a stray comma when the group it's being used on has only one player Changed /help messages to be more similar to the vanilla ones Added Coali, EU, Slyntex, Syntaxis, Gabriel, CLN, CoalCRCition and Unbidden to colorful chat Changed Rainbow for colorful chat Fixed NothingHere7759 not being colored properly 1.5.1 - Cleaned up some of the code Added /mute and /unmute Added SAR, Shadow Taile, West Vlandia, East Vlandia, Sangsa, Kwapt, Siremia, Magyarország, România, Mothership, MothMethMyth, Mothylamine and СинтексПр to colorful chat Changed CoalCRCition, Hungary, Hungaryball, Magyarlabda and Magyar for colorful chat Made some names get colored when used as nickname too Removed the /gq alias of /qg 1.5.2 - Added colorful chat for discord messages Added taumotons, Sisyphus Prime, Minos Prime, Russia, Germany, Potassium_l, Enderment, Xahh, LLG, NoNameZ, 16777216, NekoNoka, Toaster, C3phei, Taha Südenland, Martan, ReloopGD, Blake, Capa, Leg, Vvictor, Lapis, Stevesta, JPDLD, Amogusland, Doitshlænd, Lemon, Lemonwires, Tess, Helper, Cygnus, Shay, Neomoth, Eldit, Jigg, C-Yard, VGS, JJB, Norddex, 999, Nurutomo, Memelord, Randoof and Frick Verizon to colorful chat Added /nearby Changed Romaniaball for colorful chat Fixed some names not being colored if next to punctuation marks Fixed Rainbow, Rainbowball and Gabriel having two (M)'s, St. being colored when part of a word, and the space between "Shadow" and "Taile" getting removed 1.6 - Added /show Changed /mute and /unmute to /block and /unblock, respectively Added Markdown support Added earth, air, void, admin, moderator, Limbo, Oblivion, Arcadia, Purgatory, Damnation, Paradise, Nirvana, Ragnarok, Olympus, Eden, Utopia, Laniakea, Eka-Laniakea, Elysium, Camelot, Lemuria, Midas, Armageddon, Valhalla, Atlantis, Avalon, Heaven, Shangri-La, El Dorado, Solaris, Aether, Hyperion, Anteproxima, Proxima, Syberlong, Sudenland, 4est, Phorrhest Landt, Northia, Greenyland, Phyrexia, Purperism, RodimusPrime, Duck12, Boötes Imperium, Raliovi, Regenbogen and Ofo Gang to colorful chat Unnamed players now have their id colored in the chat Changed Norisia and Diermania for colorful chat Fixed Слюнтекс not being colored Fixed the JP discord emoji not working properly Fixed words inside of some links getting colored, therefore breaking them 1.7 - Added group chat gui Removed /qg and /qgset, as they were rendered useless Removed the /groups alias of /group Added /left Added an update notice Made chat messages show the ids of mods and admins Unnamed mods and admins now have their id colored in chat messages too Added markdown disabling Added France, Coca Pola, Eric, Norst, Unaligned, Expunged, Empire Français, Filana, Pinkistan, Liliac Republic, Tizenami, Union of Unknown, Breztec, River l'Ant, Riverduck, Thisisks, Solania, Soutia and Stable Land to colorful chat Changed Diermania, Minos Prime and Sisyphus Prime for colorful chat Fixed Greenyland not being colored Fixed Shangri-La not being displayed Fixed strings like **a** **a** being parsed as a** a** */ 'use strict'; (() => { //Pre-installation const waitUntil = (probe, cb, t = 200) => { const id = setInterval(() => { try { if (probe()) { clearInterval(id); cb(); } } catch { } }, t); }; waitUntil( () => window.OWOP && OWOP.misc?.chatRecvModifier && OWOP.misc.world?.players && OWOP.misc.chatSendModifier && document.getElementById('chat'), install ); function install() { //Utilities const say = OWOP.chat.send; function tell(id, msg) { say('/tell ' + id + ' ' + msg) }; const locSend = OWOP.chat.local; function locErr(msg) { OWOP.chat.receiveMessage(`{ "sender":"server", "type":"error", "data":{ "message":"${msg}" } }`); } const playerList = OWOP.misc.world.players; function mdParse(str) { return str .replace(/(? `${match.slice(2).slice(0, -2)}`) // ** --> Bold .replace(/(? `${match.slice(1).slice(0, -1)}`) // * ---> Italic .replace(/(? `${match.slice(2).slice(0, -2)}`) // __ --> Underline .replace(/(? `${match.slice(1).slice(0, -1)}`) // _ ---> Italic .replace(/(? `${match.slice(2).slice(0, -2)}`) // ~~ --> Strikethrough .replace(/(? `${match.slice(1).slice(0, -1)}`) // ~ ---> Subscript .replace(/(? `${match.slice(1).slice(0, -1)}`) // ^ ---> Superscript .replace(/(? `${match.slice(1).slice(0, -1)}`) // ` ---> Code .replace(/(? `${match.slice(2).slice(0, -2)}`) // == --> Highlight .replace(/^##\s.+$/gm, match => `${match.slice(3).replace(/#+\s*$/, '')}`) // ## --> Heading 2 .replace(/^#\s.+$/gm, match => `${match.slice(2).replace(/#+\s*$/, '')}`) // # ---> Heading 1 .replace(/^-#\s.+$/gm, match => `${match.slice(3)}`) // -# --> Subtext .replace(/(? ``) // {c --> Color .replace(/(?`) // {rb -> Rainbow .replace(/(?') // Close the color spans .replace(/^\[ \]/gm, '') // [ ] -> Unchecked item .replace(/^\[X\]/gim, '') // [X] -> Checked item .replace(/(? m); OWOP.misc.chatRecvModifier = (msg) => { msg = prevR(msg); const msgParsed = JSON.parse(msg); //Response if (msgParsed.type == "whisperSent") { responseID = msgParsed.data.targetID; }; if (msgParsed.type == "whisperReceived") { responseID = msgParsed.data.senderID; }; //Fix "Unknown command:" messages from /help if (msgParsed.type == "error" && msgParsed.data.message.startsWith("Unknown command: ")) { if (!['group', 'g', 'qset', 'qid', 'q', 'respond', 'r', 'local', 'l', 'lset', 'c', 'clear', 'color', 'yell', 'block', 'unblock', 'nearby', 'show', 'left'].every(cmd => cmd != msgParsed.data.message.slice(17, -1))) { return ''; }; }; // Muting system because either idk how to use the vanilla one or it just isn't working if (OWOP.muted.includes(msgParsed.data.senderID)) return; //Colorful Chat if (localStorage.colorChat === undefined) localStorage.colorChat = true; if (localStorage.colorChat == "true") { /*** FIRST TECHNICAL AREA ***/ if (msgParsed.sender == "server" && msgParsed.data.message.startsWith('[D] ')) { //Discord compatibility msgParsed.sender = 'player'; msgParsed.type = 'message'; msgParsed.data.nick = msgParsed.data.message.match(/^\[D\]\s.+?(?=:)/)[0]; msgParsed.data.message = msgParsed.data.message.replace(/^\[D\]\s.+?:\s/, ``); msgParsed.data.rank = 4; }; if (msgParsed.sender == "server" || msgParsed.type == "whisperReceived") return msg; //console.log("Message before: " + msg); // Debug msgParsed.data.allowHTML = true; const rank = msgParsed.data.rank; function sName(rx, replace) { msgParsed.data.message = msgParsed.data.message.replace(rx, replace); }; // Prevent people from executing their own code but leave dc emojis alone if (rank < 3) { //msgParsed.data.message = OWOP.util.escapeHTML(msgParsed.data.message); sName(/<(?!a?:(.+?):(\d{8,32}))/g, `<`); sName(/(?/g, `>`); }; // Add ids to mods and admins if (rank > 1 && rank < 4 && msgParsed.data.nick.slice(4) != msgParsed.data.senderID) { msgParsed.data.nick = msgParsed.data.nick.slice(0, 4) + `[${msgParsed.data.senderID}]` + msgParsed.data.nick.slice(3); }; if (!msgParsed.data.message.match(/^\$/) && !anchorme(msgParsed.data.message).includes(" `${match}`); sName(/\bRED\b/gi, match => `${match}`); sName(/\bCRIMSON\b/gi, match => `${match}`); sName(/\bORANGE\b/gi, match => `${match}`); sName(/\bGOLD\b/gi, match => `${match}`); sName(/\bYELLOW\b/gi, match => `${match}`); sName(/\bGREEN\b/gi, match => `${match}`); sName(/\bLIME\b/gi, match => `${match}`); sName(/\bBLUE\b/gi, match => `${match}`); sName(/\bINDIGO\b/gi, match => `${match}`); sName(/\bCYAN\b/gi, match => `${match}`); sName(/\b(MAGENTA|PINK|FUCHSIA)\b/gi, match => `${match}`); sName(/\b(VIOLET|PURPLE|MAUVE)\b/gi, match => `${match}`); sName(/\bBROWN\b/gi, match => `${match}`); sName(/\bGR(A|E)Y\b/gi, match => `${match}`); sName(/\bWHITE\b/gi, match => `${match}`); sName(/\bBLACK\b/gi, match => `${match}`); sName(/\bRGB\b/gi, match => { match = match.split(""); return `${match[0]}${match[1]}${match[2]}` }); // Other words sName(/\bTREE\b/gi, match => `${match}`); sName(/\bGRASS\b/gi, match => `${match}`); sName(/\bWATER\b/gi, match => `${match}`); sName(/\bLAVA\b/gi, match => `${match}`); sName(/\bFIRE\b/gi, match => `${match}`); sName(/\bEARTH\b/gi, match => `${match}`); sName(/\bAIR\b/gi, match => `${match}`); // Countries sName(/\bROM(A|Â)NIA\b/gi, match => `${match[0] + match[1]}${match[2] + match[3] + match[4]}${match[5] + match[6]}`); sName(/\bHUNGARY\b/gi, match => `${match[0] + match[1]}${match[2] + match[3] + match[4]}${match[5] + match[6]}`); sName(/\bMAGYAR\b/gi, match => `${match[0] + match[1]}${match[2] + match[3]}${match[4] + match[5]}`); sName(/\bMAGYARORSZ(Á|A)G\b/gi, match => `${match.slice(0, 4)}${match.slice(4, 8)}${match.slice(8)}`); sName(/(?<=\s|^|"|'|\.|,|:|;|\?|!|\*|\/|\\|\||\(|\)|\[|\]|{|}|=|\+|-|_|\b)(RUSSIA|РОССИЯ|POCCNR)(?=\s|$|"|'|\.|,|:|;|\?|!|\*|\/|\\|\||\(|\)|\[|\]|{|}|=|\+|-|_|\b)/gi, match => `${match.slice(0, 2)}${match.slice(2, 4)}${match.slice(-2)}`); sName(/\bGERMANY\b/gi, match => `${match.slice(0, 2)}${match.slice(2, 5)}${match.slice(-2)}`); sName(/\bDEUTSCHLAND\b/gi, match => `${match.slice(0, 4)}${match.slice(4, 7)}${match.slice(-4)}`); sName(/\bFR(A|\*)NCE\b/gi, match => `${match.slice(0, 2)}${match.slice(2, 4)}${match.slice(-2)}`); // Border names sName(/\bLIMBO\b/gi, ``); sName(/\bOBLIVION\b/gi, ``); sName(/\bARCADIA\b/gi, ``); sName(/\bPURGATORY\b/gi, ``); sName(/\bDAMNATION\b/gi, ``); sName(/\bPARADISE\b/gi, ``); sName(/\bNIRVANA\b/gi, ``); sName(/\bRAGNAROK\b/gi, ``); // sName(/\bHELL\b/gi, ``); sName(/\bOLYMPUS\b/gi, ``); sName(/\bEDEN\b/gi, ``); sName(/\bUTOPIA\b/gi, ``); sName(/\bEKA(-|\s)LANIAKEA\b/gi, ``); sName(/\bLANIAKEA\b/gi, ``); sName(/\bELYSIUM\b/gi, ``); sName(/\bCAMELOT\b/gi, ``); sName(/\bLEMURIA\b/gi, ``); sName(/\bMIDAS\b/gi, ``); sName(/\bARMAGEDDON\b/gi, ``); sName(/\bVALHALLA\b/gi, ``); sName(/\bATLANTIS\b/gi, ``); sName(/\bAVALON\b/gi, ``); sName(/\bHEAVEN\b/gi, ``); sName(/\bSHANGRI(-|\s)LA\b/gi, ``); sName(/\bEL\s?DORADO\b/gi, ``); sName(/\bSOLARIS\b/gi, ``); sName(/\bAETHER\b/gi, ``); sName(/\bHYPERION\b/gi, ``); sName(/\bANTEPROXIMA\b/gi, ``); sName(/\bPROXIMA\b/gi, ``); // sName(/\bERROR\b/gi, ``); // Rank names sName(/\bADMINS?\b/gi, match => `${match}`); sName(/\bMODERATORS?\b/gi, match => `${match}`); /*** PLAYER NAMES ***/ sName(/\b((F|L)OR|4|PHOR(RH?)?)EST(\s?(L|F)ANDT?)?\b/gi, match => `${match}`); sName(/\b(MR\.?\s)?SMILES\b/gi, match => `${match}`); sName(/\bRIVER(\s?(LAND|L'ANT|DUCK))?\b/gi, match => `${match}`); sName(/\b(RAINBOW(BALL)?|REGENBOGEN)\b/gi, match => `${match}${match}`); sName(/\bMONOCHROME\b/gi, match => { match = match.split(""); return `${match[0]}${match[1]}${match[2]}${match[3]}${match[4]}${match[5]}${match[6]}${match[7]}${match[8]}${match[9]}` }); sName(/\bROMANIABALL\b/gi, match => ` ${match[0] + match[1] + match[2] + match[3]}${match[4] + match[5] + match[6]}${match[7] + match[8] + match[9] + match[10]}`); sName(/\bNOTHINGHERE(7759)?\b/gi, match => { match = match.split(""); return `${match[0] + match[1] + match[2] + match[3] + match[4] + match[5] + match[6]}${match[7] + match[8] + match[9] + match[10]}${match[11] ? "7759" : ""}` }); sName(/\bDIERMANIA\b/gi, match => `${match[0] + match[1] + match[2]}${match[3]}${match[4]}${match[5]}${match[6] + match[7] + match[8]}`); sName(/\b(SL?YNT(EX(PR)?|AXIS))\b/gi, match => `${match}`); sName(/\bTRION(\sNEX(\b\.|US(ORIATE)?)?)?(?=\s|$|"|'|\b)/gi, match => { match = match.split(""); return `${match[0]}${match[1]}${match[2]}${match[3]}${match.slice(4).join("")}`; }); sName(/(?<=\s|^|"|'|\.|,|:|;|\?|!|\*|\/|\\|\||\(|\)|\[|\]|{|}|=|\+|-|_|\b)(СИНТ((Е|Э)КС(ПР)?|АКСИС)|СЛЮНТ(Е|Э)КС)(?=\s|$|"|'|\.|,|:|;|\?|!|\*|\/|\\|\||\(|\)|\[|\]|{|}|=|\+|-|_|\b)/gi, match => `${match}`); sName(/\b(COALI(TION)?|CLN)\b/gi, match => `${match}`); sName(/\b(CRC|UNBIDDEN)\b/gi, match => `${match}`); sName(/\bCOALCRCITION\b/gi, match => `${match}`); sName(/\b((SOUTH\s)?NORTH?IA|USRNSNN|URNNSN)\b/gi, match => `${match}`); sName(/\bNORISIA\b/gi, match => `${match}`); sName(/\bVINLAND\b/gi, match => `${match}`); sName(/\bR(SS|55)R\b/gi, match => `${match}`); sName(/(?<=\s|^|"|'|\.|,|:|;|\?|!|\*|\/|\\|\||\(|\)|\[|\]|{|}|=|\+|-|_|\b)(MOTH(ERSHIP|METHMYTH|YLAMINE)?|МОЛЬ)(?=\s|$|"|'|\.|,|:|;|\?|!|\*|\/|\\|\||\(|\)|\[|\]|{|}|=|\+|-|_|\b)/gi, match => `${match}`); sName(/\bSAR\b/gi, match => `${match}`); sName(/\b(POTASS(IUM)?|EVERMORE)\b/gi, match => `${match}`); sName(/\bATLAN\b/gi, match => { match = match.split(""); return `${match[0]}${match[1]}${match[2]}${match[3]}${match[4]}` }); sName(/\bATLAN?DOS\b/gi, match => { match = match.split(""); return `${match[0]}${match[1]}${match[2]}${match[3] + (match.length == 7 ? "" : match[4])}${match[match.length - 3]}${match[match.length - 2]}${match[match.length - 1]}` }); sName(/(?<=\s|^|"|'|\.|,|:|;|\?|!|\*|\/|\\|\||\(|\)|\[|\]|{|}|=|\+|-|_|\b):\bD(\s|-)ANON\b/gi, match => `${match}`); sName(/(?<=\s|^|"|'|\.|,|:|;|\?|!|\*|\/|\\|\||\(|\)|\[|\]|{|}|=|\+|-|_)ST\.?(?=\s|$|"|'|\b)/gi, match => `${match}`); sName(/\bSHADOW\sTAI?LE\b/gi, match => `${match.slice(0, 6)}${match[6] == ' ' ? ' ' : ''}${match.slice(7)}`); sName(/\bORANG\b/gi, match => `${match}`); sName(/\bHUNGARYBALL\b/gi, match => { match = match.split(""); return `${match[0] + match[1] + match[2] + match[3]}${match[4] + match[5] + match[6]}${match[7] + match[8] + match[9] + match[10]}` }); sName(/\bMAGYARLABDA\b/gi, match => { match = match.split(""); return `${match[0] + match[1] + match[2] + match[3]}${match[4] + match[5] + match[6]}${match[7] + match[8] + match[9] + match[10]}` }); sName(/\bGABRIEL\b/gi, match => `${match[0]}${match[1]}${match[2]}${match[3]}${match[4]}${match[5]}${match[6]}`); sName(/\bWEST\sVLANDIA\b/gi, match => `${match}`); sName(/\bEAST\sVLANDIA\b/gi, match => `${match}`); sName(/\b(? `${match}`); sName(/\bSANGSA\b/gi, match => `${match.slice(0, 1)}${match.slice(1, 5)}${match.slice(-1)}`); sName(/\b(KWAPT|62143)\b/gi, match => `${match}`); sName(/\bSIREMIA\b/gi, match => `${match}`); sName(/\bXAHH\b/gi, match => `${match}`); sName(/\bLLG\b/gi, match => `${match}`); sName(/\bNONA(EM|MEZ_?)\b/gi, match => `${match}`); sName(/\b16777216\b/gi, `16777216`); sName(/\bNEKONOKA\b/gi, match => `${match}`); sName(/\bTOASTER\b/gi, match => `${match.slice(0, 2)}${match.slice(2, 5)}${match.slice(-2)}`); sName(/\bTAUM(OTON(S)?)?\b/gi, match => `${match}`); sName(/\bC3PHEI\b/gi, match => `${match}`); sName(/\bENDERMENT\b/gi, match => `${match}`); sName(/\b(TAHA(\sÖZDEMIR)?|SYBERLONG)\b/gi, match => `${match}`); sName(/\bS(Ü|U)DENLAND\b/gi, match => `${match[0]}${match[1]}${match[2]}${match[3]}${match.slice(-5)}`); sName(/\bRELOOPGD\b/gi, match => `${match}`); sName(/\bBLAKE\b/gi, match => `${match}`); sName(/\bCAPA\b/gi, match => `${match}`); sName(/\bLEG(3ND)?\b/gi, match => `${match}`); sName(/\b5UP\b/gi, match => `${match}`); sName(/\b(VVICTOR|OFO\sGANG)\b/gi, match => `${match}`); sName(/\bM(OUNTAI|T)N\sDEW\b/gi, match => `${match.slice(0, -4)} ${match.slice(-3)}`); sName(/\b(MART|ARTM)AN\b/gi, match => `${match}`); sName(/\bSTEVESTA\b/gi, match => `${match}`); sName(/\bLAPIS\b/gi, match => `${match}`); sName(/(? `<:J:409708038589775872> ${match}`); sName(/\bAMON?GUSLAND\b/gi, match => `${match}`); sName(/\bDOITSHL(Æ|A)ND\b/gi, match => `${match.slice(0, 3)}${match.slice(3, 7)}${match.slice(-3)}`); sName(/\bDOITSHLAEND\b/gi, match => `${match.slice(0, 4)}${match.slice(4, 7)}${match.slice(-4)}`); sName(/\bDEUCHLAND\b/gi, match => `${match.slice(0, 3)}${match.slice(3, 6)}${match.slice(-3)}`); sName(/\bLEMONWIRES\b/gi, match => `${match[0]}${match[1]}${match[2]}${match[3]}${match[4]}${match[5]}${match[6]}${match[7]}${match[8]}${match[9]}`); sName(/\bLEMON\b/gi, match => `🍋 ${match}`); sName(/\bTESS\b/gi, match => `${match}`); sName(/\bHELPER\b/gi, match => `${match}`); sName(/\b(CYGNUS|CEUTHYN)\b/gi, match => `${match}`); sName(/\bSHAY\b/gi, match => `${match}`); sName(/\bNEOMOTH\b/gi, match => `<:1:1388314585781637200> ${match}`); sName(/\bELDIT\b/gi, match => `${match}`); sName(/\bJI+GG\b/gi, match => `${match}`); sName(/\bC(-|\s)?YARD\b/gi, match => `${match}`); sName(/\bVGS\b/gi, match => `${match}`); sName(/\b(JJB|JAR\s?JAR(\s?BOINKS)?)\b/gi, match => `<:j:411450961949753345> ${match}`); sName(/\bNORDDEX\b/gi, match => `${match}`); sName(/\b(999|AZSRIEL)\b/gi, match => `${match}${match}`); sName(/\bNURUTOMO\b/gi, match => `${match}`); sName(/\bMEMELORD\b/gi, match => ` ${match.slice(0, 4)}${match.slice(4)}`); sName(/\bF(RI|U)CK\sVERIZON\b/gi, match => ` ${match}`); sName(/\bRANDOOF\b/gi, match => ` ${match}`) sName(/\bSISYPHUS(\sPRIME)?\b/gi, match => `{FF2B00 ${match[0]}{FF6100 ${match[1]}{FFA500 ${match[2]}{FFB200 ${match[3]}}{FFCD00 ${match[4]}{FFFF00 ${match[5]}}{FFFFBA ${match[6]}{FFFFFF ${match[7]}}${(match[8] ?? '') + (match[9] ?? '')}}${(match[10] ?? '')}}${(match[11] ?? '')}}${(match[12] ?? '')}}${(match[13] ?? '')}}`); sName(/\bMINOS(\sPRIME)?\b/gi, match => `{D3D5FF ${match[0]}{9395D7 ${match[1]}{6E70AB ${match[2]}{77526D ${match[3]}{934463 ${match[4] + (match[5] ?? '') + (match[6] ?? '')}}${(match[7] ?? '')}}${(match[8] ?? '')}}${(match[9] ?? '')}}${(match[10] ?? '')}}`); sName(/\b(GREENY(\s?LAND)?|UGS|UNITED\sGREEN<\/span>\sSTATES)\b/gi, match => `${match}`); sName(/(?<=\s|^|"|'|\.|,|:|;|\?|!|\*|\/|\\|\||\(|\)|\[|\]|{|}|=|\+|-|_|\b)((NEW\s)?PHY(REXIA)?|ɸ)(?=\s|$|"|'|\.|,|:|;|\?|!|\*|\/|\\|\||\(|\)|\[|\]|{|}|=|\+|-|_|\b)/gi, match => `${match}`); sName(/\bPURPERISM\b/gi, match => `${match}`); sName(/\b(RODIMUS(\s?PRIME)?|PACI(CIDAL)?|UNALIGNED)\b/gi, match => `${match}`); sName(/\bDUCK12\b/gi, match => `${match}`); sName(/\b((BO(Ö|O)TES|VOID)\s(IMPERIUM|EMPIRE)|VOID)\b/gi, match => `${match}`); sName(/\bRALIOVI\b/gi, match => `${match}`); sName(/\b(ERIC|HOLY\sELVEN\sHORDE|E(_|\s)LXIV)\b/gi, match => `${match}`); sName(/\bNORST\b/gi, match => `{39cd79 ${match[0]}}{1e8f73 ${match[1]}}{2b5758 ${match[2]}}{fb922b ${match[3]}}{aefe5d ${match[4]}}`); sName(/\bEXPUNGED\b/gi, match => `${match}`); sName(/\bNOUR\b/gi, match => `${match}`); sName(/\bEMPIRE\sFRAN(C|Ç)AIS\b/gi, match => `${match.slice(0, 10)}${match.slice(10, 12)}${match.slice(-3)}`); sName(/\bFILANA\b/gi, match => `${match}`); sName(/\bPINKISTAN\b/gi, match => `${match}`); sName(/\bLILI?AC(\sREP(UBLIC)?)?\b/gi, match => `${match}`); sName(/\bTIZENAMI\b/gi, match => `${match}`); sName(/\b(UNION|ONION)\sOF\sUNKNOWN\b/gi, match => `${match}`); sName(/\bBREZTEC\b/gi, match => `${match}`); sName(/\bTHISISKS\b/gi, match => `${match}`); sName(/\bCOCA\sPOLA\b/gi, match => `${match}`); sName(/\bSOLANIAN\sTRIBE\b/gi, match => `{B34400 ${match[0]}{C45C00 ${match[1]}{FB8B03 ${match[2]}{FEC625 ${match[3] + match[4]}{FEAE10 ${match[5]}{E6E631 ${match[6]}}${match[7]}} ${match[9] + match[10]}}${match[11]}}${match[12]}}${match[13]}}`); sName(/\bSOLANIA\b/gi, match => `{B34400 ${match[0]}{C45C00 ${match[1]}{FB8B03 ${match[2]}{FEC625 ${match[3]}}${match[4]}}${match[5]}}${match[6]}}`); sName(/\bSOUTH?IA(N\sEMPIRE)?\b/gi, match => `${match}`); sName(/\b(STABLE\sLAND|STABI?LIA)\b/gi, match => `${match}`); sName(/\bMAURICE\b/gi, match => `{79665F ${match[0]}{9D897A ${match[1]}{BAA490 ${match[2]}{D3B8A1 ${match[3]}}${match[4]}}${match[5]}}${match[6]}}`); sName(/\bECIRUAM\b/gi, match => `{8699A0 ${match[0]}{627685 ${match[1]}{455B6F ${match[2]}{2C475E ${match[3]}}${match[4]}}${match[5]}}${match[6]}}`); } sName(/^\$\s?/g, ''); /*** NICKNAMES ***/ if (msgParsed.data.nick.match(/\b((F|L)OR|4|PHOR(RH?)?)EST(\s?(L|F)ANDT?)?\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + "" }; if (msgParsed.data.nick.match(/\bMR\.?\sSMILES\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + "" }; if (msgParsed.data.nick.match(/\bRIVER(\s?(LAND|L'ANT|DUCK))?\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + "" }; if (msgParsed.data.nick.includes("Rainbowball")) { msgParsed.data.nick = msgParsed.data.nick.replace(/\bRAINBOWBALL\b/gi, `RainbowballRainbowball`); if (rank < 2) { msgParsed.data.nick = msgParsed.data.nick.replace(/\[\d+?\]\s/, ``); msgParsed.data.nick = `[${msgParsed.data.senderID}] ${msgParsed.data.nick}` }; if (rank == 2) { msgParsed.data.nick = msgParsed.data.nick.replace('(M) ', ``); msgParsed.data.nick = `(M) ${msgParsed.data.nick}` }; if (rank == 3) { msgParsed.data.nick = msgParsed.data.nick.replace('(A) ', ``); msgParsed.data.nick = `(A) ${msgParsed.data.nick}` }; } else if (msgParsed.data.nick.includes("Rainbow")) { msgParsed.data.nick = msgParsed.data.nick.replace(/\bRAINBOW\b/gi, `RainbowRainbow`); if (rank < 2) { msgParsed.data.nick = msgParsed.data.nick.replace(/\[\d+?\]\s/, ``); msgParsed.data.nick = `[${msgParsed.data.senderID}] ${msgParsed.data.nick}` }; if (rank == 2) { msgParsed.data.nick = msgParsed.data.nick.replace('(M) ', ``); msgParsed.data.nick = `(M) ${msgParsed.data.nick}` }; if (rank == 3) { msgParsed.data.nick = msgParsed.data.nick.replace('(A) ', ``); msgParsed.data.nick = `(A) ${msgParsed.data.nick}` }; }; if (msgParsed.data.nick.includes("Monochrome")) { msgParsed.data.nick = "" + msgParsed.data.nick.replaceAll("Monochrome", "Monochrome") + ""; }; if (msgParsed.data.nick.includes("Romaniaball")) { msgParsed.data.nick = "" + msgParsed.data.nick.replaceAll("Romaniaball", " Romaniaball") + ""; }; if (msgParsed.data.nick.match(/\bNOTHINGHERE(7759)?\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick.replace(/\bNOTHINGHERE(7759)?\b/gi, match => { match = match.split(""); return `${match[0] + match[1] + match[2] + match[3] + match[4] + match[5] + match[6]}${match[7] + match[8] + match[9] + match[10]}${match[11] ? "7759" : ""}` }) + ""; }; if (msgParsed.data.nick.includes("Diermania")) { msgParsed.data.nick = "" + msgParsed.data.nick.replaceAll("Diermania", "Diermania") + ""; }; if (msgParsed.data.nick.match(/\b(SL?YNT(EX(PR)?|AXIS))\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/(?<=\s|^|"|'|\b)(СИНТ((Е|Э)КС(ПР)?|АКСИС)|СЛЮНТ(Е|Э)КС)(?=\s|$|"|'|\b)/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bCOALITION\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\b(CRC|UNBIDDEN)\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bCOALCRCITION\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\b((SOUTH\s)?NORTH?IA|USRNSNN|URNNSN)\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bVINLAND\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\[SERVER\]/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick; + "" }; if (msgParsed.data.nick.match(/\bR(SS|55)R\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/(?<=\s|^|"|'|\b)(MOTH(ERSHIP|METHMYTH|YLAMINE)?|МОЛЬ)(?=\s|$|"|'|\b)/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bPOTASSIUM(_L)?\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.includes("Atlan")) { msgParsed.data.nick = "" + msgParsed.data.nick.replaceAll("Atlan", "Atlan") + ""; }; if (msgParsed.data.nick.includes("ATLaDOS")) { msgParsed.data.nick = "" + msgParsed.data.nick.replaceAll("ATLaDOS", "ATLaDOS") + ""; }; if (msgParsed.data.nick.includes("St.")) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bORANG\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.includes("HungaryBall")) { msgParsed.data.nick = "" + msgParsed.data.nick.replaceAll("HungaryBall", "HungaryBall") + ""; }; if (msgParsed.data.nick.includes("Hungaryball")) { msgParsed.data.nick = "" + msgParsed.data.nick.replaceAll("Hungaryball", "Hungaryball") + ""; }; if (msgParsed.data.nick.includes("MagyarLabda")) { msgParsed.data.nick = "" + msgParsed.data.nick.replaceAll("MagyarLabda", "MagyarLabda") + ""; }; if (msgParsed.data.nick.includes("Magyarlabda")) { msgParsed.data.nick = "" + msgParsed.data.nick.replaceAll("Magyarlabda", "Magyarlabda") + ""; }; if (msgParsed.data.nick.includes("Europe RP")) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bCYAN\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bGABRIEL\b/gi)) { msgParsed.data.nick = msgParsed.data.nick.replace(/\bGABRIEL\b/gi, match => `${match[0]}${match[1]}${match[2]}${match[3]}${match[4]}${match[5]}${match[6]}`); if (rank < 2) { msgParsed.data.nick = msgParsed.data.nick.replace(/\[\d+?\]\s/, ``); msgParsed.data.nick = `[${msgParsed.data.senderID}] ${msgParsed.data.nick}` }; if (rank == 2) { msgParsed.data.nick = msgParsed.data.nick.replace('(M) ', ``); msgParsed.data.nick = `(M) ${msgParsed.data.nick}` }; if (rank == 3) { msgParsed.data.nick = msgParsed.data.nick.replace('(A) ', ``); msgParsed.data.nick = `(A) ${msgParsed.data.nick}` }; }; if (msgParsed.data.nick.match(/\bXAHH\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bLLG\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bNONA(EM|MEZ_?)\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bNEKONOKA\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bTOASTER\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick.replace(/\bTOASTER\b/gi, match => `${match.slice(0, 2)}${match.slice(2, 5)}${match.slice(-2)}`) + ""; }; if (msgParsed.data.nick.match(/\bC3PHEI\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bENDERMENT\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bTAHA\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bS(Ü|U)DENLAND\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick.replace(/\bSÜDENLAND\b/gi, match => `${match[0]}${match[1]}${match[2]}${match[3]}${match.slice(-5)}`) + ""; }; if (msgParsed.data.nick.match(/\bRELOOPGD\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/(\bBLAKE\b|._BLAKE_.)/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bCAPA\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bLEG\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bVVICTOR(__)?\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\b(MART|ARTM)AN\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bSTEVESTA\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bLAPIS\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bAMON?GUSLAND\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bDOITSHL(Æ|AE?)ND\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick.replace(/\bDOITSHL(Æ|A)ND\b/gi, match => `${match.slice(0, 3)}${match.slice(3, 7)}${match.slice(-3)}`).replace(/\bDOITSHLAEND\b/gi, match => `${match.slice(0, 4)}${match.slice(4, 7)}${match.slice(-4)}`) + ""; }; if (msgParsed.data.nick.match(/\bLEMON\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick.replace(/\bLEMON\b/gi, match => `🍋 ${match}`) + ""; }; if (msgParsed.data.nick.match(/\bTESS\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\b(CYGNUS|CEUTHYN)\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bELDIT\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\b(GREENY(LAND)?|GREEN\sREP|UGS)\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/(?<=\s|^|"|'|\b)(PHYREXIA|ɸ)(?=\s|$|"|'|\b)/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bPURPERISM\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\b(RODIMUSPRIME|PACICIDAL|UNALIGNED)\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bDUCK12\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bBOÖTES\sIMPERIUM\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bRALIOVI\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\b(ERIC|LMAO\.ERICC_6464)\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bEXPUNGED\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bNOUR\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bEMPIRE\sFRAN(Ç|C)AIS\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick.replace(/\bEMPIRE\sFRAN(Ç|C)AIS\b/gi, match => `${match.slice(0, 10)}${match.slice(10, 12)}${match.slice(-3)}`) + ""; }; if (msgParsed.data.nick.match(/\b(UNION|ONION)\sOF\sUNKNOWN\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bBREZTEC\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bTHISISKS\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\bSOLANIA\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick.replace(/\bSOLANIA\b/gi, match => `${match[0]}${match[1]}${match[2]}${match[3]}${match[4]}${match[5]}${match[6]}`) + ""; }; if (msgParsed.data.nick.match(/\bSOUTH?IAN?\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; if (msgParsed.data.nick.match(/\b(STABLE\sLAND|STABI?LIA)\b/gi)) { msgParsed.data.nick = "" + msgParsed.data.nick + ""; }; /*** SECOND TECHNICAL AREA ***/ if (!anchorme(msgParsed.data.message).includes("` + msgParsed.data.nick + ""; }; // Chat mention let findPlayer = new RegExp(`(?<=\\s|^|"|'|\\b)${playerID}(?=\\s|$|"|'|\\b)`, "g"); sName(findPlayer, match => `${match}`); // Restore normal message color if (rank == 4) msgParsed.data.nick = "" + msgParsed.data.nick + ""; // Discord messages //console.log("Message after: " + JSON.stringify(msgParsed)); // Debug return JSON.stringify(msgParsed); }; return msg; }; //Command processing const prevS = OWOP.misc.chatSendModifier || (m => m); OWOP.misc.chatSendModifier = msg => { msg = prevS(msg); if (!msg.startsWith('/')) return msg; const [cmd, ...args] = msg.slice(1).trim().split(/\s+/); switch (cmd.toLowerCase()) { case "local": case "l": { if (args.length < 1) { locErr('Usage: /local '); return ''; }; let px = OWOP.mouse.tileX let py = OWOP.mouse.tileY let nearbyPlayers = [] for (let x in playerList) { if (Math.abs(playerList[x].x / 16 - px) <= nearbyThresh && Math.abs(playerList[x].y / 16 - py) <= nearbyThresh) { nearbyPlayers.push(x); }; }; if (nearbyPlayers.length == 0) { locErr('No players nearby'); return ''; }; let localMsg = args.join(' ') + "\nLocal chat: " + playerID + ", " + nearbyPlayers.join(', '); for (let i = 0; i < nearbyPlayers.length; i++) { tell(nearbyPlayers[i], localMsg); }; return ''; } case "lset": if (args.length != 1 || isNaN(args[0]) || args[0] < 0) { locErr("Usage: /lset "); return ''; }; nearbyThresh = args; return ''; case "clear": case "c": if (args.length != 0) { locErr("Usage: /clear"); return ''; }; OWOP.chat.clear(); return ''; case "respond": case "r": if (!responseID) { locErr('Nobody messaged you yet'); return ''; } if (!playerList[responseID]) { locErr(`ID ${responseID} disconnected`); responseID = undefined; return ''; }; tell(responseID, args.join(" ")); return ''; case "qid": case "qset": if (args.length != 1) { locErr('Usage: /qset '); return ''; }; if (!isNaN(args)) { if (!playerList[args]) { locErr("ID " + args + " doesn't exist.") return ''; }; quickID = args; return ''; }; locErr('Usage: /qset '); return ''; case "q": if (quickID === undefined) { locErr('Use "/qset " to set a quick id first'); return ''; }; if (args.length == 0) { locErr('Usage: /q '); return ''; }; if (!playerList[quickID]) { locErr("ID " + quickID + " disconnected"); quickID = undefined; return ''; }; tell(quickID, args.join(' ')); return ''; case "color": if (args.length != 1 || (args != "true" && args != "false")) { locErr("Usage: /color "); return ''; }; localStorage.colorChat = args; return ''; case "left": if (args.length != 1 || (args != "true" && args != "false")) { locErr("Usage: /left "); return ''; }; localStorage.chatOnLeft = args; if (args == 'false') { helpBtn.style.left = '0'; helpBtn.style.right = 'initial'; chat.style.right = '55px'; chat.style.left = 'initial'; } else { helpBtn.style.left = 'initial'; helpBtn.style.right = '55px'; chat.style.right = 'initial'; chat.style.left = '0'; }; return ''; case "block": if (args.length != 1) { locErr('Usage: /block '); return ''; }; if (!playerList[args]) { locErr(`ID ${args} does not exist`); return ''; }; if (OWOP.muted.includes(Number(args))) { locErr(`ID ${args} is already blocked`); return ''; }; OWOP.muted.push(Number(args)); return ''; case "unblock": if (args.length != 1) { locErr('Usage: /unblock '); return ''; }; if (!playerList[args]) { locErr(`ID ${args} does not exist`); return ''; }; if (!OWOP.muted.includes(Number(args))) { locErr(`ID ${args} is not blocked`); return ''; }; OWOP.muted.splice(OWOP.muted.indexOf(Number(args)), 1); return ''; case "nearby": { if (args.length > 1 || (args.length == 1 && isNaN(args[0]))) { locErr('Usage: /nearby (* = optional)'); return ''; }; let px = OWOP.mouse.tileX; let py = OWOP.mouse.tileY; let thresh = (args.length == 1 ? args[0] : nearbyThresh); let nearbyPlayers = []; for (let x in playerList) { if (Math.abs(playerList[x].x / 16 - px) <= thresh && Math.abs(playerList[x].y / 16 - py) <= thresh) { nearbyPlayers.push(x); }; }; if (nearbyPlayers.length == 0) { locErr('No players nearby'); return ''; } else { locSend(`Nearby player ids: ${nearbyPlayers.join(', ')}`); return ''; } }; case "show": if (args.length != 0) { locErr('Usage: /show'); return ''; }; document.getElementById('chat-messages').style.display = (document.getElementById('chat-messages').style.display == 'none' ? '' : 'none'); return ''; case "g": case "group": if (args.length != 0) { locErr('Usage: /group'); return ''; }; OWOP.windowSys.addWindow(new OWOP.windowSys.class.window('Group Chat', { closeable: true }, (gcWin) => { if (!document.getElementById('gcStyle')) { let gcStyle = document.createElement('style'); gcStyle.id = 'gcStyle'; gcStyle.innerHTML = `.gcIn { background-color: rgba(0, 0, 0, 0.3); color: white; } .gcIn::placeholder { color: #BFBFBF; }`; document.head.appendChild(gcStyle); } let memLabel = document.createElement('label'); memLabel.for = "gcMembers"; memLabel.innerHTML = "Members: "; gcWin.addObj(memLabel); let memIn = document.createElement('input'); memIn.type = 'text'; memIn.name = 'gcMembers'; memIn.className = 'gcIn'; memIn.placeholder = "IDs must be comma separated"; memIn.addEventListener("blur", (e) => { let members = memIn.value.split(',').map((elem) => { return elem.trim() }); for (let x = 0; x < members.length; x++) { if (!playerList[members[x]] || members.indexOf(members[x]) != x) { members.splice(x, 1); x -= 1; }; }; memIn.value = members.join(', '); }); gcWin.addObj(memIn); gcWin.addObj(document.createElement('br')); let msgLabel = document.createElement('label'); msgLabel.for = "gcMessage"; msgLabel.innerHTML = "Message: "; gcWin.addObj(msgLabel); let msgIn = document.createElement('input'); msgIn.type = 'text'; msgIn.name = 'gcMessage'; let maxMsgLength = OWOP.definedProtos.old.maxMessageLength[OWOP.player.rank]; msgIn.maxLength = maxMsgLength; msgIn.className = "gcIn"; msgIn.placeholder = "Press [Enter] to send"; function sendMsg() { let members = memIn.value.split(',').map((elem) => { return elem.trim() }); for (let x = 0; x < members.length; x++) { if (!playerList[members[x]] || members.indexOf(members[x]) != x) { members.splice(x, 1); x -= 1; }; }; memIn.value = members.join(', '); if (members.length == 0) return; let msg = msgIn.value; for (let x = 0; x < members.length; x++) { let extra = members.join().length + 11 + `${members[x]}`.length; tell(members[x], `${msg.length + extra > maxMsgLength ? msg.slice(0, maxMsgLength - extra) : msg}\nGC:${members.join()}`); }; msgIn.value = ''; } msgIn.addEventListener("keydown", ((e) => { if (e.key == "Enter") { sendMsg(); }; })); gcWin.addObj(msgIn); gcWin.addObj(document.createElement('br')); let sendBtn = document.createElement('button'); sendBtn.addEventListener("click", (e) => { sendMsg(); }); sendBtn.innerHTML = 'Send'; gcWin.addObj(sendBtn); }).move(innerWidth - 343, 60)); return ''; case "yell": if (args.length == 0) { locErr('Usage: /yell (* = optional)'); return ''; }; if (!isNaN(args[0])) { tell(args[0], args.slice(1).join(' ').toUpperCase()); return ''; }; say(args.join(' ').toUpperCase()); return ''; case "help": case "h": case "?": helpHandle(args); }; return msg; }; // Update Notice if (localStorage.chatUtilsUpdateNotice != '1.7') { locSend(`Chat Utils update 1.7: - Added group chat gui (accessible by using /group) - Added /left <true/false> for toggling the position of the chat between left and right - Made chat messages show the ids of mods and admins - Added an update notice - Added markdown disabling (place $$ at the start of your message to use it) - Added new words to colorful chat - Fixed some bugs affecting colored words and markdown `) } console.log('Chat Utils installed'); }; })();