Apps Home
|
Create an App
Custom Room App :D
Author:
lagunadistortion
Description
Source Code
Launch App
Current Users
Created by:
Lagunadistortion
// / <reference path="~/Scripts/Chaturbate.js" /> // colours var Colours = { AliceBlue: "#F0F8FF", AntiqueWhite: "#FAEBD7", Aqua: "#00FFFF", Aquamarine: "#7FFFD4", Azure: "#F0FFFF", Beige: "#F5F5DC", Bisque: "#FFE4C4", Black: "#000000", BlanchedAlmond: "#FFEBCD", Blue: "#0000FF", BlueViolet: "#8A2BE2", Brown: "#A52A2A", BurlyWood: "#DEB887", CadetBlue: "#5F9EA0", Chartreuse: "#7FFF00", Chocolate: "#D2691E", Coral: "#FF7F50", CornflowerBlue: "#6495ED", Cornsilk: "#FFF8DC", Crimson: "#DC143C", Cyan: "#00FFFF", DarkBlue: "#00008B", DarkCyan: "#008B8B", DarkGoldenRod: "#B8860B", DarkGrey: "#A9A9A9", DarkGreen: "#006400", DarkKhaki: "#BDB76B", DarkMagenta: "#8B008B", DarkOliveGreen: "#556B2F", DarkOrange: "#FF8C00", DarkOrchid: "#9932CC", DarkRed: "#8B0000", DarkSalmon: "#E9967A", DarkSeaGreen: "#8FBC8F", DarkSlateBlue: "#483D8B", DarkSlateGrey: "#2F4F4F", DarkTurquoise: "#00CED1", DarkViolet: "#9400D3", DeepPink: "#FF1493", DeepSkyBlue: "#00BFFF", DimGrey: "#696969", DodgerBlue: "#1E90FF", FireBrick: "#B22222", FloralWhite: "#FFFAF0", ForestGreen: "#228B22", Fuschia: "#FF00FF", Gainsboro: "#DCDCDC", GhostWhite: "#F8F8FF", Gold: "#FFD700", GoldenRod: "#DAA520", Grey: "#808080", Green: "#008000", GreenYellow: "#ADFF2F", HoneyDew: "#F0FFF0", HotPink: "#FF69B4", IndianRed: "#CD5C5C", Indigo: "#4B0082", Ivory: "#FFFFF0", Khaki: "#F0E68C", Lavender: "#E6E6FA", LavenderBlush: "#FFF0F5", LawnGreen: "#7CFC00", LemonChiffon: "#FFFACD", LightBlue: "#ADD8E6", LightCoral: "#F08080", LightCyan: "#E0FFFF", LightGoldenRodYellow: "#FAFAD2", LightGrey: "#D3D3D3", LightGreen: "#90EE90", LightPink: "#FFB6C1", LightSalmon: "#FFA07A", LightSeaGreen: "#20B2AA", LightSkyBlue: "#87CEFA", LightSlateGrey: "#778899", LightSteelBlue: "#B0C4DE", LightYellow: "#FFFFE0", Lime: "#00FF00", LimeGreen: "#32CD32", Linen: "#FAF0E6", Magenta: "#FF00FF", Maroon: "#800000", MediumAquaMarine: "#66CDAA", MediumBlue: "#0000CD", MediumOrchid: "#BA55D3", MediumPurple: "#9370DB", MediumSeaGreen: "#3CB371", MediumSlateBlue: "#7B68EE", MediumSpringGreen: "#00FA9A", MediumTurquoise: "#48D1CC", MediumVioletRed: "#C71585", MidnightBlue: "#191970", MintCream: "#F5FFFA", MistyRose: "#FFE4E1", Moccasin: "#FFE4B5", NavajoWhite: "#FFDEAD", Navy: "#000080", OldLace: "#FDF5E6", Olive: "#808000", OliveDrab: "#6B8E23", Orange: "#FFA500", OrangeRed: "#FF4500", Orchid: "#DA70D6", PaleGoldenRod: "#EEE8AA", PaleGreen: "#98FB98", PaleTurquoise: "#AFEEEE", PaleVioletRed: "#DB7093", PapayaWhip: "#FFEFD5", PeachPuff: "#FFDAB9", Peru: "#CD853F", Pink: "#FFC0CB", Plum: "#DDA0DD", PowderBlue: "#B0E0E6", Purple: "#800080", Red: "#FF0000", RosyBrown: "#BC8F8F", RoyalBlue: "#4169E1", SaddleBrown: "#8B4513", Salmon: "#FA8072", SandyBrown: "#F4A460", SeaGreen: "#2E8B57", SeaShell: "#FFF5EE", Sienna: "#A0522D", Silver: "#C0C0C0", SkyBlue: "#87CEEB", SlateBlue: "#6A5ACD", SlateGrey: "#708090", Snow: "#FFFAFA", SpringGreen: "#00FF7F", SteelBlue: "#4682B4", Tan: "#D2B48C", Teal: "#008080", Thistle: "#D8BFD8", Tomato: "#FF6347", Turquoise: "#40E0D0", Violet: "#EE82EE", Wheat: "#F5DEB3", White: "#FFFFFF", WhiteSmoke: "#F5F5F5", Yellow: "#FFFF00", YellowGreen: "#9ACD32" }; // Tip Jar // Globals // Constants const DevTeam = { Name: "Laguna Studios", CEO: "LagunaDistortion", HeadDev: "Martin aka Smokersexual" }; const SupportMessage = "Visit me, " + DevTeam.CEO + ", here on chaturbate in my room. If I'm not on, leave a 1tk tip with your name and \"LTJ SUPPORT\", or contact " + DevTeam.HeadDev + " in various long haired guys chat. Thanks for using our app!"; const AppName = "Laguna's Tip Jar 2.3"; const FMIModule = 0; // module numbers const MultiGoalModule = 1; const AuthorModule = 2; const StealthModule = 3; const MagicModule = 4; const NagModule = 5; const AutoModeratorModule = 6; //the 3 talking areas (not implemented yet) const Bedroom = 0; const Dungeon = 1; const Conferenceroom = 2; const FrogMessages = [ // magic messages "\"Ribbit!\"", "\"Croak!\"", "hops around, chasing flies and other insects around the room."]; const DuctTapeMessages = [ "\"mumble grumble mumble mumble\"", "fidgets around trying to escape the tape.", "tries to speak, but the duct tape prevents it!"]; const FrogTapeMessages = [ "makes muffled frog noises.", "hops around trying to escape the tape.", "tries to croak, but the duct tape prevents it!"]; const CatMessages = [ "\"Meow!\"", "\"Purrrrrrrr!\"", "is playing wiht a ball of yarn."]; const CatTapeMessages = [ "makes muffled cat noises.", "claws innefectively at the tape.", "tries to meow, but the duct tape prevents it!"]; const Row1_Default = "Nobody Loves " + SlugName + " :/"; // default row values when running in app mode const Row2_Default = "Last Tipper: " + LastTip; const Row3_Default = (cb.settings.RequestPrice > 0) ? "Tip " + cb.settings.RequestPrice + " if you want a request!" : cb.settings.RoomMessage; const HashTagString_Default = "#couple #bareback #married #fuck #pussy #ass #tits #dildo"; // Variables var AppMode = true; var HashTagString = ""; var TotalTips = 0; var LastTip = "-- (0)"; var SlugName = "Laguna"; var EmptyTipMsg = "Nobody Loves " + SlugName + " :/"; var Row1 = "Nobody Loves " + SlugName + " :/"; var Row2 = "Last Tipper: " + LastTip; var Row3 = (cb.settings.RequestPrice > 0) ? "Tip " + cb.settings.RequestPrice + " if you want a request!" : cb.settings.RoomMessage; var Row3_Message = Row3; // var nicknames = cb.settings.NickNames.replace(/\s/g, "").split("@"); var BlueCount = 0; // the next 4 variables kept global as they are used in more than the magic module var GreyCount = 0; var WizardCount = 0; var NecromancerCount = 0; var MuteLevel = 0; var TwoWay = ""; //in chat 2 way private comms var FirstSpeaker = ""; //in chat 2 way private comms var StartRequest = cb.settings.RequestPrice; var StartTitle = cb.settings.RoomTitle; var ShowTipInTitle = false; var Tippers = { Highest: { name: "", totalTips: 0 }, List: [] }; var DungeonList = [{ name: "" }]; var ConferenceroomList = [{ name: "" }]; var UserList = [{ name: "" }, { userID: 0 }, { weighting: 0 }, { frog: false }, { silence: false }, // silence a user, they wont know they are silenced { ducttape: false }, { cat : false }, { necromancer: false }, { wizard: false }, { automoderated: false }, { moderator: false }, { has_tokens: false }, { has_tipped: 0 }, { boring_blue: false }, { awesome_person: false }, { VIP: false }, { SP: false }, { they_left: false }, { is_a_fan: false }]; // kept global as it is used by more than one module var show = { highestTotal: false, messageInput: false, tipInput: false }; var doWeNag = true; // boring blue nagger var delayToNag = 5; var delayBetweenNag = 2; var NagMessage = "Are you enjoying the show? Interract with me more often, to stop these messages."; var nextUID = 0; // User List database index var PowerUser = false; // if room owner, mod or VIP var DEBUG = false; var out = ""; var Help = { set: function (intA) { switch (intA) { case 1: return "set"; case 2: return "/set-1, /set-2, /set-3 (3 rows of text below camera), /set-request, /set-title, /set-update, /set-spam, /set-rules, /set-talk, /set-hastags"; case 3: return "/set-<row>-<string> (<row> 1 to 3, <string> may contain spaces) to set rows 1 to 3 to a string value. \n/set-request-<amount> (<amount> is a number) sets the request price in tokens (set to 0 to disable), \n/set-title-<string> (<string> may contain spaces) sets the room title to a new value, retains existing hashtags, \n/set-hashtag-#tag1,#tag2,#tag3,... (no spaces), replace existing hashtags, retain existing title."; case 4: return "/set-update-<on/off> allows the title to update on receipt of a tip, \n/set-nag-<on/off/delay/interval/message>-<n>/<message> turns on, or off, the inactive blue nagger, sets the delay before declaring a blue inactive, inactive message interval, and inactive message text.\n/set-talk-<name> (<name> is any user in chat) allows a private two way chat with <name> to be held in main chat (using the /talk-<message> command), \n/set-spam-<on/off> when automoderator is active, stops the room owner seeing the spam, set to on so you can monitor what is going on (see also /show-spam).\n/set-rules-<all/blue/grey>-<on/off> and /set-rules-<blue/grey>-<number>-<on/off> when automoderator is active, turns the text filtering rules on or off.\n/set-stealth-<item>-<on/off> switched various aspects of the app output on or off, where <item> can be error (warning/error messages), chat (all notices),row (the 3 lines under the camera), text (all of those previous 3 items), author, magic (authors and magic user colour highlights), or all (everything)"; } }, reset: function (intA) { switch (intA) { case 1: return "reset"; case 2: return "tips, 1, 2, 3, all, request, title, talk... returns these to their default state."; case 3: return "/reset-<row> (<row> 1 to 3 or all) sets the row back to its default value, sets all rows back to their default value \n/reset-tips sets the total tips back to 0, has no effect on multi goal tips (see /goal command to do that), \n/reset-request reset tip request amount to that specified at app start"; case 4: return "/reset-title sets room title back to the one chosen on app start, \n/reset-update restores the initial update title on tip setting at app start, \n/reset-talk allows either participant in a private two way chat to end the chat.\n/reset-stealth sets app output back to the default."; } }, say: function (intA) { switch (intA) { case 1: return "say"; case 2: return "In chat messaging - /say-<message> (<message> may contain spaces), /say-goal, /talk-<message>"; case 3: return "/say sends the string message as a notice to the room. Use /talk to communicate between the two users (see /set-talk and /reset-talk). /say-goal works if multi goal is active, the current goal is broadcast to the room. If module fmi is active, the goal is broadcast to the room every 5 minutes, so this is of use if fmi is deactivated."; } }, nice: function (intA) { switch (intA) { case 1: return "nice"; case 2: return "In chat muting - /nice-<user>, /unnice-<user> add or remove user from the VIP list. VIP's are exempt from /silence, may access all app commands."; case 3: return "/slience-<user>, /unsilence-<user>, prevents future messages from this user, and allows them to message again, they will not know they are silenced.\n /silence-all silences all chat except tippers, mods, VIPs and the room owner, /silence-grey mutes grey chat, /silence-cheap mutes all non tippers, and /silence-none removes restrictions."; } }, mm: function (intA) { switch (intA) { case 1: return "mm"; case 2: return "/mm-<command>-<module>, /mm-list"; case 3: return "<command> can be activate, deactivate and list"; case 4: return "Activates or deactivates modules, e.g. /mm-activate-fmi to turn on module fmi. Use /mm-list to show available modules and their activation state and what they do. \nPlease note the VIP module, this module allows the app authors, and other VIPs, to demonstrate the commands, and magic spells, to any room owner (and their moderators) using this app, without having to make the app author a moderator. This access level is enabled by default, as I feel that I can trust myself to not make an ass of myself in your chat."; } }, // Power Users version of goal help goal: function (intA) { switch (intA) { case 1: return "goal"; case 2: return "/goal-list, /goal-list-all list all goals (with the all option to broadcast to all users) and shows the current goal, \n/goal-reset, /goal-reset-tips reset goals to default values, or just the amount default tip values, \n/goal-max-<n> (<n> can be from 1 to 10) set the maximum number of goals, \n /goal-<n>-<text> (<text> may contain spaces, <n> can be from 1 to 10) sets the text for a specific goal, \n/goal-tip-<n>-<amount> (<amount> is the number of tokens, <n> can be from 1 to 10) sets the tip amount for specific goal, \n/goal-notify-<true/false> Every 5 minutes the current goal can be broadcast to the room, toggle this on and off."; case 3: return "e.g. /goal-tip-1-50 (sets goal 1 to 50 tokens) e.g. /goal-max-3 (set a 3 goal maximum to multigoal) e.g. /goal-7-Dildo show. (set goal 7 to 'Dildo show.'."; } }, // Normal user version of goal help goal2: function (intA) { switch (intA) { case 1: return "goal"; case 2: return "/goal-list"; case 3: return "List goals to yourself. "; } }, show: function (intA) { switch (intA) { case 1: return "show"; case 2: return "/show-highest-<true/false/toggle> switch highest tipper true false or toggle (enables it on FMI module too), \n/show-tippers show who has tipped since the app was started (/show-tippers-all to send to all in the room), \n/show-wizard, /show-necromancer, /show-frog, /show-tape, /show-silence, /show-nice shows all wizards, necromancers, frogs, duct taped, silenced and nice users"; case 3: return "/show-user, /show-user-<boring/bore>, /show-user-left (optional show users between two user IDs e.g. /show-user-bore-100-150) shows the users who have been in the room recently, those who have left, and those who are beign boring, the app maintains a list of users (blue and grey), those who leave are eventuially removed from this list of users, so there will be gaps in th euser list. This list is used as part of the nag module.\n/show-last-<n> shows the last <n> users to interract with the room (tip or talk), also part of the nag module.\n/show-nag shows nag settings (encourage boring blues to interract) \n/show-totals shows the users types (not working yet). \n/show-talk Shows who is talking to who if a private two way chat is established. \n/show-spam shows the 10 most recent automoderated messages (if any), \n/show-rules shows the current automodertator rules, who they apply to and their enabled state. \n/show-stealth shows how much output the app can generate (e.g. are error messages switched off)"; } }, show2: function (intA) { switch (intA) { case 1: return "show"; case 2: return "/show-tippers show who has tipped since the app was started, \n/show-wizard, /show-necromancer shows all wizards, necromancers. \n/show-rules shows the automoderator rules."; } }, magic: function (intA) { switch (intA) { case 1: return "magic"; case 2: return "There are three levels of users, normal, Wizard and Necromancer. If you are a Wizard or Necromancer, you may use magic, the magic module of /mm has to be activated, it is by default."; case 3: return "The room owner is always a Necromancer. Necromancers may /wizard and /necromancer any user, and /unwizard or /unnecromancer any user e.g. /wizard-fred. Please ask the room owner for the list of spells."; } } }; var Groups = { TokenHolders: "cyan", Tippers: "blue", Fans: "green", Moderators: "red" }; var Messenger = { sendModeratorNotice: function (str) { /* Undocumented note: "Moderators" actually includes the broadcaster */ this.sendGenericMessage(str, Colours.Blue, "", "", Groups.Moderators); }, sendErrorMessage: function (str, recipient, group) { if (Modules[StealthModule].vars.ErrorVisible) { this.sendGenericMessage(str, Colours.Red, "", recipient, group); } }, sendWarningMessage: function (str, recipient, group) { if (Modules[StealthModule].vars.ErrorVisible) { this.sendGenericMessage(str, Colours.Orange, "", recipient, group); } }, sendSuccessMessage: function (str, recipient, group) { this.sendGenericMessage(str, Colours.DarkGreen, "", recipient, group); }, sendInfoMessage: function (str, recipient, group) { this.sendGenericMessage(str, Colours.Black, "", recipient, group); }, sendGenericMessage: function (str, colour, background, recipient, group) { if (Modules[StealthModule].vars.ChatOutputVisible) { cb.sendNotice(str, recipient, background, colour, "bold", group); } }, sendMagicMessage: function (str, colour, background, recipient, group) { if (Modules[StealthModule].vars.MagicUserVisible) { cb.sendNotice(str, recipient, background, colour, "bold", group); } }, sendUnblockedMessage: function (str, colour, background, recipient, group) { // for those rare messages that must get through (in chat PM), spam/automoderator stats cb.sendNotice(str, recipient, background, colour, "bold", group); } }; var Modules = [{ name: "fmi", title: "For My Information (FMI)", isEnabled: false, hasOnDisable: true, desc: "For My Info module, outputs useful messages under the video such as the current goal, or the highest tipper. If multi goal is enabled, it also outputs the current goal to the room every 5 minutes", affectsRow1: false, affectsRow2: false, affectsRow3: true, vars: { timedFrequency: 5000, // 5 seconds timedMessageNumber: 0, //which message is displayed timedMessages: [ "Welcome [ Last Tip: " + LastTip + " ]", "Love Shown: " + TotalTips + " Tokens.", (show.highestTotal) ? "Highest Total Tipper: " + Tippers.Highest.name + " - (" + Tippers.Highest.totalTips + " tks). " : Row3_Message, Row3_Message, "Ask for my Amazon wish list. ", "No goal set. "] // message texts }, timedActivities: function () { if (!Modules[FMIModule].isEnabled) { return; } //only run if module is activated cb.log("Activity number " + Modules[0].vars.timedMessageNumber); // update timesMessages to latest contents before attempting to display them. Modules[FMIModule].vars.timedMessages[0] = "Welcome [ Last Tip: " + LastTip + " ]"; Modules[FMIModule].vars.timedMessages[1] = "Love Shown: " + TotalTips + " Tokens."; Modules[FMIModule].vars.timedMessages[2] = (show.highestTotal) ? "Highest Total Tipper: " + Tippers.Highest.name + " - (" + Tippers.Highest.totalTips + " tks). " : Row3_Message; Modules[FMIModule].vars.timedMessages[3] = Row3_Message; if (Modules[MultiGoalModule].isEnabled) { Modules[FMIModule].vars.timedMessages[5] = "Next goal: " + Modules[MultiGoalModule].vars.currentGoalText + (Modules[MultiGoalModule].vars.currentGoalTip - Modules[MultiGoalModule].vars.GoalTips) + " Tokens to go. "; } else { Modules[FMIModule].vars.timedMessages[5] = "No goal set. "; Modules[MultiGoalModule].vars.GoalNotify = 0; } out = Modules[FMIModule].vars.timedMessages[Modules[FMIModule].vars.timedMessageNumber]; SetRow(Row3, out, 100); cb.log("Row 3 set to " + out); Modules[FMIModule].vars.timedMessageNumber++; if (Modules[FMIModule].vars.timedMessageNumber == 6) { Modules[FMIModule].vars.timedMessageNumber = 0; Modules[MultiGoalModule].vars.GoalNotify++; if (Modules[MultiGoalModule].vars.GoalNotify == 10 && Modules[MultiGoalModule].isEnabled) { Messenger.sendGenericMessage("Next goal: " + Modules[MultiGoalModule].vars.currentGoalText + (Modules[MultiGoalModule].vars.currentGoalTip - Modules[MultiGoalModule].vars.GoalTips) + " Tokens to go. ", Colours.Green, Colours.White); Modules[MultiGoalModule].vars.GoalNotify = 0; } } if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } if (Modules[FMIModule].isEnabled) { cb.setTimeout(Modules[0].timedActivities, Modules[FMIModule].vars.timedFrequency); } }, onEnable: function () { if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } this.timedActivities(); }, onDisable: function () { // timedActivities updates row 3 constantly, restore to default row 3 value upon deactivation if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } SetRow(Row3, Row3_Message, 100); } }, { name: "goal", title: "Multi Goal", isEnabled: false, hasOnDisable: true, desc: "Goal module, from 1 to 10 goals", affectsRow1: false, affectsRow2: false, affectsRow3: true, vars: { /* Is this better at all? currentGoal: { max: 5, maxDefault: 5, number: 0, content: [ { name: "Shirt off. ", tips: 50 }, { name: "Pants off. ", tips: 100 }, { name: "Finger ass. ", tips: 200 }, ], }, */ currentGoalText: "No goal set.", currentGoalTip: 0, GoalNotify: 0, GoalTips: 0, currentMaxGoals: 5, currentMaxGoalsDefault: 5, currentGoalNumber: 0, currentGoal: [ "Tops off. ", "Bottoms off. ", "Kiss and cuddle. ", "Make out passionately. ", "Wahoooooo!!! ", " ", " ", " ", " ", " "], currentGoalTips: [ 50, 100, 200, 300, 500, 0, 0, 0, 0, 0], currentGoalDefault: [ "Tops off. ", "Bottoms off. ", "Kiss and cuddle. ", "Make out passionately. ", "Wahoooooo!!! ", " ", " ", " ", " ", " "], currentGoalTipsDefault: [ 50, 100, 200, 300, 500, 0, 0, 0, 0, 0], currentGoalMet: false //Just use the one instead of an array, }, // figure out what the current goal is and set the currentGoal* variables accordingly setCurrentGoal: function () { Modules[MultiGoalModule].vars.currentGoalText = "No goal set. "; if (!Modules[MultiGoalModule].isEnabled) { return; } cb.log("Starting currentGoals. Total Tips = " + Modules[MultiGoalModule].vars.GoalTips); for (var z = Modules[MultiGoalModule].vars.currentMaxGoals - 1; z > -1; z--) { cb.log("Checking " + Modules[MultiGoalModule].vars.currentGoalTips[z - 1] + " greater than GoalTips. " + Modules[MultiGoalModule].vars.GoalTips + " Loop " + z); if (Modules[MultiGoalModule].vars.currentGoalTips[z - 1] > Modules[MultiGoalModule].vars.GoalTips) { Modules[MultiGoalModule].vars.currentGoalText = Modules[MultiGoalModule].vars.currentGoal[(z - 1)]; Modules[MultiGoalModule].vars.currentGoalTip = Modules[MultiGoalModule].vars.currentGoalTips[z - 1]; cb.log("Selecting goal " + Modules[MultiGoalModule].vars.currentGoal[z - 1]); } } cb.log("Goal selected, Exiting setCurrentGoal."); }, // send goal list to myself, no parameter = send message to all listGoals: function (myself) { cb.log("Starting listGoals. "); Messenger.sendGenericMessage("Multi Goal:", Colours.Blue, Colours.White, myself); for (var z = 0; z < Modules[MultiGoalModule].vars.currentMaxGoals; z++) { Messenger.sendGenericMessage(z + 1 + " " + Modules[MultiGoalModule].vars.currentGoal[z] + " " + Modules[MultiGoalModule].vars.currentGoalTips[z] + " Tokens.", Colours.Black, Colours.White, myself); cb.log(Modules[MultiGoalModule].vars.currentGoal[z] + "-" + Modules[MultiGoalModule].vars.currentGoalTips[z]); if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } } Messenger.sendGenericMessage("Next goal: " + Modules[MultiGoalModule].vars.currentGoalText + (Modules[MultiGoalModule].vars.currentGoalTip - Modules[MultiGoalModule].vars.GoalTips) + " Tokens to go. ", Colours.Green, Colours.White, myself); cb.log("Current goal " + Modules[MultiGoalModule].vars.currentGoalText + " currently on " + Modules[MultiGoalModule].vars.GoalTips); if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } }, onEnable: function () { this.setCurrentGoal(); Modules[MultiGoalModule].vars.GoalNotify = 0; Messenger.sendGenericMessage("Next goal: " + Modules[MultiGoalModule].vars.currentGoalText + (Modules[MultiGoalModule].vars.currentGoalTip - Modules[MultiGoalModule].vars.GoalTips) + " Tokens to go. ", Colours.Green, Colours.White); }, onDisable: function () { this.setCurrentGoal(); Modules[MultiGoalModule].vars.GoalNotify = 0; } }, { name: "vip", title: "Allow VIPs to issue commands", isEnabled: true, hasOnDisable: true, desc: "Grants VIPs the right to run its commands", affectsRow1: false, affectsRow2: false, affectsRow3: false, vars: { AllowAuthorToBeAdmin: false }, onEnable: function () { Modules[AuthorModule].vars.AllowAuthorToBeAdmin = true; //room owner is already a necromancer, add in the other room authors if magic is enabled if (Modules[MagicModule].vars.MagicEnabled) { Modules[MagicModule].SetNecromancer("smokersexual", true); Modules[MagicModule].SetNecromancer("lagunadistortion", true); } }, onDisable: function () { Modules[AuthorModule].vars.AllowAuthorToBeAdmin = false; // if magic enabled, put room owner back to a necromancer and remove from all other authors if (Modules[MagicModule].vars.MagicEnabled) { Modules[MagicModule].SetNecromancer("smokersexual", false); Modules[MagicModule].SetNecromancer("lagunadistortion", false); Modules[MagicModule].SetNecromancer(cb.room_slug, true); } } }, { name: "stealth", title: "Controls how much this app outputs", isEnabled: true, hasOnDisable: true, desc: "If you want to disable parts of the output of this app, use this module.", affectsRow1: false, // technically it does, but only by muting or unmuting FMI affectsRow2: false, affectsRow3: false, vars: { AuthorModeVisible: false, RowUpdateVisible: true, ChatOutputVisible: true, MagicUserVisible: true, ErrorVisible: true, DefaultAuthorModeVisible: false, DefaultRowUpdateVisible: true, DefaultChatOutputVisible: true, DefaultMagicUserVisible: true, DefaultErrorVisible: true }, onEnable: function () { Modules[StealthModule].vars.AuthorModeVisible = Modules[StealthModule].vars.DefaultAuthorModeVisible; Modules[StealthModule].vars.RowUpdateVisible = Modules[StealthModule].vars.DefaultRowUpdateVisible; Modules[StealthModule].vars.ChatOutputVisible = Modules[StealthModule].vars.DefaultChatOutputVisible; Modules[StealthModule].vars.MagicUserVisible = Modules[StealthModule].vars.DefaultMagicUserVisible; Modules[StealthModule].vars.ErrorVisible = Modules[StealthModule].vars.DefaultErrorVisible; }, onDisable: function () { Modules[StealthModule].vars.AuthorModeVisible = false; Modules[StealthModule].vars.RowUpdateVisible = false; Modules[StealthModule].vars.ChatOutputVisible = false; Modules[StealthModule].vars.MagicUserVisible = false; Modules[StealthModule].vars.ErrorVisible = false; } }, { name: "magic", title: "Allow users to cast spells", isEnabled: true, hasOnDisable: true, desc: "Welcome to the Department of High Energy Magic", affectsRow1: false, affectsRow2: false, affectsRow3: false, vars: { MagicEnabled: true, SpellData: { // unused at this time, for futre expansion if we want to nake magic data driven Frog: [" mutters an obscure incantation, ", //frog success message " turns in to a frog.", true, //spell failure allowed " mutters an obscure incantation, but nothing happens.", //frog failure message " mutters an obscure incantation, ", //unfrog message " returns to normal.", " mutters an obscure incantation, but nothing happens.", //when a non magic user tries to frog "", Colours.GreenYellow, //background colour " (the frog)", //global prefix when frogged " Ribbit!", //four things frogs can do " Croaks!", " Eats a fly.", " Hops about for a bit."], Tape: [" wraps ", //tape success message " in duct tape.", false, //spell failure not allowed "", //no tape failure message " rips the duct tape off ", //untape message ".", " tries to wrap ", //when a non magic user tries to tape " in duct tape, but the reel is mysteriously empty.", Colours.White, //background colour "", //no global prefix for this spell " mutters something, but the duct tape means they cannot be heard!", //four things duct taped users can do " seems to be having difficulty breathing through the duct tape.", " appears to be wrapped in some duct tape.", " looks like a duct taped present waiting to be unwrapped."] } }, // magic users isWizard: function (username) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username && UserList[t].wizard) { return true; } } return false; }, isNecromancer: function (username) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username && UserList[t].necromancer) { return true; } } return false; }, SetWizard: function (username, setwizard) { if (setwizard && !Modules[MagicModule].isWizard(username) && Modules[MagicModule].isNecromancer(username)) {} else if (setwizard && !Modules[MagicModule].isWizard(username)) { WizardCount++; } else if (!setwizard && Modules[MagicModule].isWizard(username)) { WizardCount--; } for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username) { UserList[t].wizard = setwizard; return; } } UserList.push({ name: username, userID: nextUID, weighting: 0, frog: false, cat: false, silence: false, ducttape: false, wizard: setwizard, necromancer: false, automoderated: false, moderator: false, has_tokens: false, has_tipped: 0, boring_blue: false, awesome_person: true, VIP: false, they_left: false, is_a_fan: false }); nextUID++; }, SetNecromancer: function (username, setnecromancer) { if (setnecromancer && !Modules[MagicModule].isNecromancer(username) && Modules[MagicModule].isWizard(username)) { NecromancerCount++; WizardCount--; } else if (setnecromancer && !Modules[MagicModule].isNecromancer(username)) { NecromancerCount++; } else if (!setnecromancer && Modules[MagicModule].isNecromancer(username)) { NecromancerCount--; } for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username) { UserList[t].necromancer = setnecromancer; return; } } UserList.push({ name: username, userID: nextUID, weighting: 0, frog: false, cat: false, silence: false, ducttape: false, wizard: false, necromancer: setnecromancer, automoderated: false, moderator: false, has_tokens: false, has_tipped: 0, boring_blue: false, awesome_person: true, VIP: false, they_left: false, is_a_fan: false }); nextUID++; }, onEnable: function () { Messenger.sendGenericMessage("Welcome to the Department of High Energy Magic.", Colours.Blue, Colours.White); Modules[MagicModule].vars.MagicEnabled = true; }, onDisable: function () { Messenger.sendGenericMessage("Magic dampening field generator activated.", Colours.Blue, Colours.White); Modules[MagicModule].vars.MagicEnabled = false; } }, { name: "nag", title: "Message system", isEnabled: false, hasOnDisable: true, desc: "Allows nagging of inactive blues, and messaging to all moderators or other groups", affectsRow1: false, affectsRow2: false, affectsRow3: false, vars: { doWeNag: true }, NotifyModeratorsWarning: function (aMessage) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].moderator) { if (UserList[t].name != cb.room_slug) { Messenger.sendWarningMessage(aMessage, UserList[t].name); } } } if (Modules[AuthorModule].vars.AllowAuthorToBeAdmin) { Messenger.sendWarningMessage(aMessage, "smokersexual"); Messenger.sendWarningMessage(aMessage, "lagunadistortion"); } }, NotifyModerators: function (aMessage, aFgCol, aBgCol) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].moderator) { if (UserList[t].name != cb.room_slug) { Messenger.sendGenericMessage(aMessage, aFgCol, aBgCol, UserList[t].name); } } } if (Modules[AuthorModule].vars.AllowAuthorToBeAdmin) { Messenger.sendGenericMessage(aMessage, aFgCol, aBgCol, "smokersexual"); Messenger.sendGenericMessage(aMessage, aFgCol, aBgCol, "lagunadistortion"); } }, ForceNotifyModerators: function (aMessage, aFgCol, aBgCol) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].moderator) { if (UserList[t].name != cb.room_slug) { Messenger.sendUnblockedMessage(aMessage, aFgCol, aBgCol, UserList[t].name); } } } if (Modules[AuthorModule].vars.AllowAuthorToBeAdmin) { Messenger.sendUnblockedMessage(aMessage, aFgCol, aBgCol, "smokersexual"); Messenger.sendUnblockedMessage(aMessage, aFgCol, aBgCol, "lagunadistortion"); } }, onEnable: function () { Modules[NagModule].vars.doWeNag = true; }, onDisable: function () { Modules[NagModule].vars.doWeNag = false; } }, { name: "automoderator", title: "Get rid of unwanted messages", isEnabled: false, hasOnDisable: true, desc: "Auto moderator for greys and blues", affectsRow1: false, affectsRow2: false, affectsRow3: false, vars: { filtereMe: "", muteMe: false, frogMe: false, exceptionMe: false, muteReason: "", tellRoomOwner: true, lastFucktard: ["", "", "", "", "", "", "", "", "", ""], muteGrey: ["on", "on", "on", "off", "on", "on", "on"], muteBlue: ["on", "on", "off", "off"], unwantedCount: 0, mutereasonsgrey: [{ regexp: /^.*?\b(fuck|finger|show|zoom|see|touch|spread|lick)\b.\b(body|ass|pussy|boobs?|bobs?|tits?|vagina|breasts?|asshole|cock|penis|vagina)\b.*?$/m, // /(?=.*\b(f?ck|finger|suck|show|zoom|open|see|touch|spread|lick)\b)(?=.*\b(body|ass|pussy|boobs?|bobs?|tits?|vagina|nipples?|breasts?|asshole|cock|penis|vagina|face|cam)\b)/i, notice: 'No demands without a tip first, so please purchase some tokens.' }, { regexp: /((?=.*pm)|(?=.*c2c))/i, notice: 'A PM or C2C will cost you tokens, and you dont have any.' }, { regexp: /((?=.*18f cam)|(?=.*streamingnaked)|(?=.*18female)|(?=.*erotimo)|(?=.*amecam)|(?=.*18 f)|(?=.*19 f)|(?=.*bestwork)|(?=.*freecam)|(?=.*swipegirls)|(?=.*premium.?.?cheat)|(?=.*free.?.?tokens?)|(?=.*tokens?.?.?free)|(?=.*tokens?.?.?gen)|(?=.*tokens.4.?)|(?=.*free.?.?token?)|(?=.*unlimited.?.?token?)|(?=.*unlimited.?.?tokens?)|(?=.*token?.?.?free)|(?=.*token?.?.?gen)|(?=.*token.4.?)|(?=.*ellagocam)|(?=.*visit this))/i, notice: 'If you want to advertise your room, send me a $250 Amazon gift card, and I will promote you myself.' }, { regexp: /((?=.*slut)|(?=.*whore)|(?=.*ugly)|(?=.*fat)|(?=.*pee)|(?=.*poo)|(?=.*peeing)|(?=.*piss))/i, notice: 'Buy some tokens, then I might let you be ruder.' }, { regexp: /^[A-Z\s]+/, notice: 'You have your Caps Lock pressed, deselect it and try again.' }, { regexp: /^.*?\b(plz|pls|pleas|please)\b.\b(fuck|finger|show|zoom|touch|spread|lick)\b.*?$/m, notice: 'It looks like you are begging, get some tokens and try again please.' }, { regexp: /((?=.*watch my cam.?.?)|(?=.*open cam.?.?)|(?=.*im on cam.?.?)|(?=.*open my cam.?.?)|(?=.*watch me.?.?)|(?=.*view my cam.?.?)|(?=.*view me.?.?))/i, notice: 'Not interested.' }], mutereasonsothers: [{ regexp: /((?=.*pm)|(?=.*c2c))/i, notice: 'There may be a token fee for a PM or C2C, the broadcaster will see your request.' }, { regexp: /((?=.*18f cam)|(?=.*streamingnaked)|(?=.*18female)|(?=.*erotimo)|(?=.*amecam)|(?=.*18 f)|(?=.*19 f)|(?=.*bestwork)|(?=.*freecam)|(?=.*swipegirls)|(?=.*premium.?.?cheat)|(?=.*free.?.?tokens?)|(?=.*tokens?.?.?free)|(?=.*tokens?.?.?gen)|(?=.*tokens.4.?)|(?=.*free.?.?token?)|(?=.*unlimited.?.?token?)|(?=.*unlimited.?.?tokens?)|(?=.*token?.?.?free)|(?=.*token?.?.?gen)|(?=.*token.4.?)|(?=.*ellagocam)|(?=.*visit this))/i, notice: 'If you want to advertise your room, tip me 5000 tokens, and I will promote you myself.' }, { regexp: /((?=.*slut)|(?=.*whore)|(?=.*ugly)|(?=.*fat))/i, notice: 'Some rudeness is still not allowed, no matter how much you might be able to tip.' }, { regexp: /^[A-Z\s]+/, notice: 'You have your Caps Lock pressed, deselect it and try again.' }] }, AutoModerator: function (msg) { //ignore commands if ((msg.m.substring(0, 1) === "/") || (msg.m.substring(0, 1) === "~") || (msg.m.substring(0, 1) === "#") || (msg.m.substring(0, 1) === "!")) { return; } //Messenger.sendGenericMessage("Auto Answer and Moderator called.", Colours.Blue, Colours.White,msg.user); Modules[AutoModeratorModule].vars.filterMe = msg['m']; Modules[AutoModeratorModule].vars.muteMe = false; Modules[AutoModeratorModule].vars.frogMe = false; Modules[AutoModeratorModule].vars.exceptionMe = false; // look for bad greys, if ((!msg['has_tokens']) && (!msg['is_mod']) && (!msg['in_fanclub']) && (!msg['msg.tipped_recently']) && (!msg['tipped_alot_recently']) && (!msg['tipped_tons_recently']) && (!isBroadcaster(msg.user))) { // grey message filtering for (var i = 0; i <= 6; i++) { if ((msg.m.search(Modules[AutoModeratorModule].vars.mutereasonsgrey[i].regexp) != -1) && (Modules[AutoModeratorModule].vars.muteGrey[i] == "on")) { Modules[AutoModeratorModule].vars.muteMe = true; Modules[AutoModeratorModule].vars.frogMe = true; if ((i == 1) || (i == 4) || (i == 5)) { // dont frog some things Modules[AutoModeratorModule].vars.frogMe = false; } if ((i == 4) && (msg.m.toUpperCase() != msg.m)) { // second check for all uppercase Modules[AutoModeratorModule].vars.frogMe = false; Modules[AutoModeratorModule].vars.muteMe = false; } if ((i == 4) && ((msg.m === "LOL") || (msg.m === "LMFAO") || (msg.m === "LMAO") || (msg.m === "BRB"))) { // second check for all uppercase Modules[AutoModeratorModule].vars.frogMe = false; Modules[AutoModeratorModule].vars.muteMe = false; } if (((msg.m.search(/\b(2[0-3]|[01]?[0-9]):([0-5]?[0-9]) *(a|p|A|P)(m|M)\b/m) != -1) || (msg.m.search(/\b(2[0-3]|[01]?[0-9]) *(a|p|A|P)(m|M)\b/m) != -1)) && (i ==1)) { // dont want to bounce times that have a PM in then Modules[AutoModeratorModule].vars.muteMe = false; Modules[AutoModeratorModule].vars.frogMe = false; } Modules[AutoModeratorModule].vars.muteReason = Modules[AutoModeratorModule].vars.mutereasonsgrey[i].notice; //Messenger.sendGenericMessage("Ban." + i, Colours.Blue, Colours.White,msg.user); return; } } } // look for bad blues (exlude broadcaster) if ((msg['has_tokens'] || msg['in_fanclub']) || msg['msg.tipped_recently'] || msg['tipped_alot_recently'] || msg['tipped_tons_recently'] && (!isBroadcaster(msg.user))) { // blue message filtering for (var i = 0; i <= 3; i++) { if ((msg.m.search(Modules[AutoModeratorModule].vars.mutereasonsothers[i].regexp) != -1) && (Modules[AutoModeratorModule].vars.muteBlue[i] == "on")) { Modules[AutoModeratorModule].vars.muteMe = true; Modules[AutoModeratorModule].vars.frogMe = false; if ((i == 1) || (i == 2) || (i == 3)) { //frog CAPS, spammers or rude Modules[AutoModeratorModule].vars.frogMe = true; } if ((i == 3) && (msg.m.toUpperCase() != msg.m)) { // second check for all uppercase Modules[AutoModeratorModule].vars.frogMe = false; Modules[AutoModeratorModule].vars.muteMe = false; } if ((i == 3) && ((msg.m === "LOL") || (msg.m === "LMFAO") || (msg.m === "LMAO") || (msg.m === "BRB"))) { // second check for all uppercase Modules[AutoModeratorModule].vars.frogMe = false; Modules[AutoModeratorModule].vars.muteMe = false; } Modules[AutoModeratorModule].vars.exceptionMe = false; if (i === 0) { //let through PM requests messages Modules[AutoModeratorModule].vars.exceptionMe = true; } if (((msg.m.search(/\b(2[0-3]|[01]?[0-9]):([0-5]?[0-9]) *(a|p|A|P)(m|M)\b/m) != -1) || (msg.m.search(/\b(2[0-3]|[01]?[0-9]) *(a|p|A|P)(m|M)\b/m) != -1)) && (i ==0)) { // dont want to bounce times that have a PM in then Modules[AutoModeratorModule].vars.muteMe = false; Modules[AutoModeratorModule].vars.frogMe = false; Modules[AutoModeratorModule].vars.exceptionMe = false; } Modules[AutoModeratorModule].vars.muteReason = Modules[AutoModeratorModule].vars.mutereasonsothers[i].notice; //Messenger.sendGenericMessage("Ban." + i, Colours.Blue, Colours.White,msg.user); return; } } } }, AutoModeratorShow: function (msg) { for (var i = 0; i <= 6; i++) { Messenger.sendUnblockedMessage("Grey " + i + " : " + Modules[AutoModeratorModule].vars.mutereasonsgrey[i].regexp + " : " + Modules[AutoModeratorModule].vars.mutereasonsgrey[i].notice + " : " + Modules[AutoModeratorModule].vars.muteGrey[i], Colours.Black, Colours.White,msg.user); } for (var i = 0; i <= 3; i++) { Messenger.sendUnblockedMessage("Blue " + i + " : " + Modules[AutoModeratorModule].vars.mutereasonsothers[i].regexp + " : " + Modules[AutoModeratorModule].vars.mutereasonsothers[i].notice + " : " + Modules[AutoModeratorModule].vars.muteBlue[i], Colours.Black, Colours.White,msg.user); } }, onEnable: function () { Messenger.sendGenericMessage("Auto Moderator activated.", Colours.Blue, Colours.White); }, onDisable: function () { Messenger.sendGenericMessage("Auto Moderator not active.", Colours.Blue, Colours.White); } }, { //a laguna speciality timedActivities: function () { cb.log("Suck my balls, you cant use \"this.something\" in your code!"); } } ]; cb.settings_choices = [{ name: "AppOrBot", type: "choice", choice1: "App", choice2: "Bot", defaultValue: "App", label: "Run this as an App or Bot." },{ name: "FMIEnabled", type: "choice", choice1: "Yes", choice2: "No", defaultValue: "No", label: "Activate For My Information (FMI) on startup (App Mode)?" }, { name: "MagicFlag", type: "choice", choice1: "Yes Visible", choice2: "Yes Invisible", choice3: "No", defaultValue: "Yes", label: "Enable magic use (highlight magic users, show magic use)?" }, { name: "NecromancerList", type: "str", minLength: 1, maxLength: 255, defaultValue: "smokersexual,lagunadistortion,champd", label: "List of Necromancer users (comma separated list)", required: false }, { name: "WizardList", type: "str", minLength: 1, maxLength: 255, defaultValue: "", label: "List of Wizard users (comma separated list)", required: false }, { name: "FrogList", type: "str", minLength: 1, maxLength: 255, defaultValue: "", label: "List of Frogged users(comma separated list)", required: false }, { name: "TapeList", type: "str", minLength: 1, maxLength: 255, defaultValue: "", label: "List of Duct Taped users (comma separated list)", required: false }, { name: "SilenceList", type: "str", minLength: 1, maxLength: 2500, defaultValue: "", label: "List of Silenced users (comma separated list)", required: false }, { name: "NiceList", type: "str", minLength: 1, maxLength: 2500, defaultValue: "smokersexual,lagunadistortion,champd", label: "List of Nice users (comma separated list)", required: false }, { name: "AutomoderatorFlag", type: "choice", choice1: "Yes", choice2: "No", defaultValue: "No", label: "Enable Automoderator?" }, { name: "ErrorFlag", type: "choice", choice1: "Yes", choice2: "No", defaultValue: "Yes", label: "Show Error/Warning Messages?" }, { name: "AuthorFlag", type: "choice", choice1: "Yes Invisible", choice2: "Yes Visible", choice3: "No", defaultValue: "Yes Invisible", label: "Enable VIPs to demonstrate the app (and highlight them)?" }, { name: "BlueWelcome", type: "str", minLength: 1, maxLength: 2500, defaultValue: "Feel free to join the chat. No promoting of other rooms is allowed. Thankyou.", label: "This is what blues see when entering chat (blank for no message).", required: false }, { name: "NagBlues", type: "choice", choice1: "Yes with nag message", choice2: "No", defaultValue: "Yes with nag message", label: "Tell boring blues to tip or type (message to send set below)?" }, { name: "BoringBlueMessage", type: "str", minLength: 1, maxLength: 120, label: "Nag message to show blues who refuse to type or tip.", defaultValue: "Are you enjoying the show? Interract more often with me to stop these messages.", required: false }, { name: "BoringBlueStart", type: "int", label: "Interval (minutes) that the app wait before it decides a blue is boring and nag them.", defaultValue : 20, minValue: 1, required: false }, { name: "BoringBlueInterval", type: "int", label: "Interval (minutes) that the app wait between nagging boring blues.", defaultValue : 5, minValue: 1, required: false }, { name: "GreyWelcome", type: "str", minLength: 1, maxLength: 2500, defaultValue: "Feel free to join the chat. No promoting of other rooms, please purchase tokens before making a request or asking for a PM. No all CAPS messages, it is rude to shout. Thankyou.", label: "This is what greys see when entering chat (blank for no message).", required: false }, { name: "UpdateSubject", type: "choice", choice1: "Yes", choice2: "No", defaultValue: "Yes", label: "Update Subject on Tip (App Mode)?" }, { name: "HighestTipper", type: "choice", choice1: "Yes", choice2: "No", defaultValue: ((show.highestTotal) ? "Yes" : "No"), label: "Show the highest tipper (App Mode)?" }, { name: "RoomTitle", type: "str", minLength: 1, maxLength: 255, label: "Room Title (App Mode)", defaultValue: "Welcome to " + cb.room_slug + "'s Room", required: false }, { name: "RoomMessage", type: "str", minLength: 1, maxLength: 255, label: "Room Message (App Mode)", defaultValue: "Thanks To All Tippers", required: false }, { name: "HashTags", type: "str", minLength: 1, maxLength: 255, label: "Hash tags (App Mode, comma separated list)", defaultValue: "#couple,#bareback,#married,#fuck,#pussy,#ass,#tits,#dildo", required: false }, { name: "RequestPrice", type: "int", label: "Request Price", minValue: 0, required: false }, { name: "GoalEnabled", type: "choice", choice1: "Yes", choice2: "No", defaultValue: "No", label: "Activate Multi Goal on startup?" }, { name: "TypeOfGoals", type: "choice", choice1: "Multi Goal with no micro goals", label: "Type of goals for multi goal module", defaultValue: "Multi Goal with no micro goals", required: false } ]; //Thank you Mx2k6!! var goalSettings = []; goalSettings.push({ name: 'NumberOfGoals', label: 'Number of goals for Multi Goal module', type: 'int', minValue: 1, defaultValue: (Modules[MultiGoalModule].vars.currentMaxGoalsDefault), required: false }); for (var gSetting = 0; gSetting <= 9; gSetting++) { goalSettings.push({ name: 'goal_' + (gSetting+1) + '_tokens', label: 'Goal ' + (gSetting+1) + ' Token Amount', type: 'int', minValue: 0, defaultValue: (Modules[MultiGoalModule].vars.currentGoalTipsDefault[gSetting]), required: false }); goalSettings.push({ name: 'goal_' + (gSetting+1) + '_description', label: 'Goal ' + (gSetting+1) + ' Description', type: 'str', minLength: 0, maxLength: 255, defaultValue: (Modules[MultiGoalModule].vars.currentGoalDefault[gSetting]), required: false }); } cb.settings_choices = cb.settings_choices.concat(goalSettings); var ModuleManager = { activate: function (module) { module.isEnabled = true; module.onEnable(); }, deactivate: function (module) { module.isEnabled = false; } }; // Returns a random number between 0 (inclusive) and 1 (exclusive) function getRandom() { return Math.random(); } function SetRow(Row, New, charLimit) { // app mode, update rows underneath camera if (AppMode) { if (New.length <= 0 | New === null) { Messenger.sendErrorMessage("Missing string.", msg.user); } else if (New.length <= charLimit) { if (Row === Row1) { Row1 = New; if (Modules[StealthModule].vars.RowUpdateVisible) { cb.drawPanel(); } } else if (Row === Row2) { Row2 = New; if (Modules[StealthModule].vars.RowUpdateVisible) { cb.drawPanel(); } } else if (Row === Row3) { Row3 = New; if (Modules[StealthModule].vars.RowUpdateVisible) { cb.drawPanel(); } } } else if (New.length > charLimit) { Messenger.sendErrorMessage("String is too long!.", msg.user); } } } // check the user is the host of the show function isBroadcaster(username) { return (username == cb.room_slug); } // check if the user is a script author if the author module is active function isScriptAuthor(username) { return ((username == "smokersexual" || username == "lagunadistortion") && Modules[AuthorModule].vars.AllowAuthorToBeAdmin); } // two show highest tipper functions function setShowHighestTotal(bool) { show.highestTotal = bool; Row2 = (show.highestTotal) ? "Highest Total Tipper: " + Tippers.Highest.name + " - (" + Tippers.Highest.totalTips + " tks)" : "Last Tipper: " + LastTip; if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } } function toggleShowHighestTotal() { if (show.highestTotal) { show.highestTotal = false; } else { show.highestTotal = true; } Row2 = (show.highestTotal) ? "Highest Total Tipper: " + Tippers.Highest.name + " - (" + Tippers.Highest.totalTips + " tks)" : "Last Tipper: " + LastTip; if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } } function GetUser(userID) { if (!isNaN(userID)) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].userID == userID) { return UserList[t].name; } } return "-1"; } else { return ""; } } function GetUserID(username) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username) { return UserList[t].userID; } } return 0; } function AddUser(username,is_a_mod,can_tip,is_fan) { if (GetUserID(username) == 0) { // totally new user, set them up UserList.push({ name: username, userID: nextUID, weighting: 0, frog: false, cat: false, silence: false, ducttape: false, wizard: false, necromancer: false, automoderated: false, moderator: is_a_mod, has_tokens: can_tip, has_tipped: 0, boring_blue: false, awesome_person: false, VIP: false, they_left: false, is_a_fan: is_fan }); nextUID++; } else { // update an existing user (maybe you made them a mod or they purchased tokens or they left chat) for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username) { UserList[t].moderator = is_a_mod; UserList[t].can_tip = can_tip; UserList[t].is_fan = is_fan; } } } } function AddUserTip(username,is_a_mod,can_tip,is_fan,kerching) { if (GetUserID(username) == 0) { // totally new user, set them up UserList.push({ name: username, userID: nextUID, weighting: 0, frog: false, cat: false, silence: false, ducttape: false, wizard: false, necromancer: false, automoderated: false, moderator: is_a_mod, has_tokens: can_tip, has_tipped: kerching, boring_blue: false, awesome_person: false, VIP: false, they_left: false, is_a_fan: is_fan }); nextUID++; } else { // update an existing user (maybe you made them a mod or they purchased tokens or they left chat) for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username) { UserList[t].moderator = is_a_mod; UserList[t].can_tip = can_tip; UserList[t].is_fan = is_fan; UserList[t].has_tipped += kerching; } } } } function hasUserTipped(username) { for (var t = 0; t < UserList.length; t++) { if ((UserList[t].name == username) && (UserList[t].has_tipped > 0)) { return true; } } return false; } // frog or unfrog a user (if they aren't on the list of users, // add them as well) function FrogUser(username, setfrog) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username) { UserList[t].frog = setfrog; return; } } UserList.push({ name: username, userID: nextUID, weighting: 0, frog: setfrog, cat: false, silence: false, ducttape: false, wizard: false, necromancer: false, automoderated: false, moderator: false, has_tokens: false, has_tipped: 0, boring_blue: false, awesome_person: !setfrog, they_left: false, is_a_fan: false }); nextUID++; } // find out is a user is a frog function isFrog(username) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username && UserList[t].frog) { return true; } } return false; } // cat or uncat a user (if they aren't on the list of users, // add them as well) function CatUser(username, setcat) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username) { UserList[t].cat = setcat; return; } } UserList.push({ name: username, userID: nextUID, weighting: 0, frog: false, cat: setcat, silence: false, ducttape: false, wizard: false, necromancer: false, automoderated: false, moderator: false, has_tokens: false, has_tipped: 0, boring_blue: false, awesome_person: !setcat, they_left: false, is_a_fan: false }); nextUID++; } // find out is a user is a frog function isCat(username) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username && UserList[t].cat) { return true; } } return false; } // automoderator users (if they aren't on the list of users, // add them as well) function AutomoderateUser(username, setauto) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username) { UserList[t].automoderated = setauto; return; } } UserList.push({ name: username, userID: nextUID, weighting: 0, frog: false, cat: false, silence: false, ducttape: false, wizard: false, necromancer: false, automoderated: setauto, moderator: false, has_tokens: false, has_tipped: 0, boring_blue: false, awesome_person: !setauto, they_left: false, is_a_fan: false }); nextUID++; } // find out is a user is automoderated function isModerated(username) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username && UserList[t].automoderated) { return true; } } return false; } // silence and unsilence a user (if they aren't on the list of users, // add them as well) // They are not informed they are silenced, they cannot tell, only powerusers // can list silenced users. // 1) Use this on a bully or rude person. They can continue ranting thinking // the room is seeing their garbage, whereas the room is not. There is no way // they can tell their messages are not getting through, so you get the benefit // of one more viewer which might rank your page higher. None of the messages // before the silence are removed. // 2) Use this on a spammer, again, none of the messages before the silence are // removed, so as far as they can tell, they are advertising their unwanted // rubbish to the room, but no one else is getting their stuff function SilenceUser(username, setsilence) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username) { UserList[t].silence = setsilence; return; } } UserList.push({ name: username, userID: nextUID, weighting: 0, frog: false, cat: false, silence: setsilence, ducttape: false, wizard: false, necromancer: false, automoderated: false, moderator: false, has_tokens: false, has_tipped: 0, boring_blue: false, awesome_person: !setsilence, they_left: false, is_a_fan: false }); nextUID++; } // find out if a user is silenced function isSilence(username) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username && UserList[t].silence) { return true; } } return false; } // duct tape or unduct tape a user (if they aren't on the list of users, // add them as well) function TapeUser(username, setducttape) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username) { UserList[t].ducttape = setducttape; return; } } UserList.push({ name: username, userID: nextUID, weighting: 0, frog: false, cat: false, silence: false, ducttape: setducttape, wizard: false, necromancer: false, automoderated: false, moderator: false, has_tokens: false, has_tipped: 0, boring_blue: false, awesome_person: !settape, they_left: false, is_a_fan: false }); nextUID++; } // find out if a user is duct taped function isTape(username) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username && UserList[t].ducttape) { return true; } } return false; } function RankUser(username, newweighting) { // assumes user exisrts and does nothing if it doesnt for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username) { UserList[t].weighting = UserList[t].weighting + newweighting; UserList[t].boring_blue = false; return; } } } function ResetUser(username,resetToThis,theyLeft,boringBlue) { // assumes user exisrts and does nothing if it doesnt for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username) { UserList[t].weighting = resetToThis; UserList[t].boring_blue = boringBlue; UserList[t].they_left = theyLeft; return; } } } function NiceUser(username,naughtyOrNice) { // assumes user exisrts and does nothing if it doesnt for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username) { UserList[t].awesome_person = naughtyOrNice; return; } } } function isNice(username) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username) { return UserList[t].awesome_person; } } return false; } function VIPUser(username,naughtyOrNice) { // assumes user exisrts and does nothing if it doesnt for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username) { UserList[t].VIP = naughtyOrNice; return; } } } function isVIP(username) { for (var t = 0; t < UserList.length; t++) { if (UserList[t].name == username) { return UserList[t].VIP; } } return false; } function OnTip(tip) { var amount = parseInt(tip["amount"]); var user = tip["from_user"]; var alreadyExists = false; if (show.tipInput) { } AddUserTip(tip.from_user, tip.from_user_is_mod, tip.from_user_has_tokens || tip.from_user_tipped_recently || tip.from_user_tipped_alot_recently || tip.from_user_tipped_tons_recently, tip.from_user_in_fanclub,amount); RankUser(tip.from_user, amount); // Checks to see if the user is already in Tippers.List for (var t = 0; t < Tippers.List.length; t++) { if (Tippers.List[t].name == user) { alreadyExists = true; } } // If they are it adds their tip to their total, but if not it adds them to Tippers.List if (alreadyExists) { for (var lan = 0; lan < Tippers.List.length; lan++) { if (Tippers.List[lan].name == user) { Tippers.List[lan].totalTips += amount; } } } else { Tippers.List.push({ name: user, totalTips: amount }); } // Sets the Highest Tipper for (var u = 0; u < Tippers.List.length; u++) { if (Tippers.List[u].totalTips > Tippers.Highest.totalTips) { Tippers.Highest.totalTips = Tippers.List[u].totalTips; Tippers.Highest.name = Tippers.List[u].name; } } // Adds tip amount to TotalTips TotalTips += amount; if (Modules[MultiGoalModule].isEnabled) { Modules[MultiGoalModule].vars.GoalTips += amount; } LastTip = user + " (" + amount + ")"; // If they tip the amount required to make a request, send them a notice asking them what they want if (amount == StartRequest) { cb.chatNotice("What's your request? Make it a good one! ^_~", user); } // If the broadcaster set the app to update the subject, do so if (ShowTipInTitle && AppMode) { cb.changeRoomSubject(cb.settings.RoomTitle + " [ Last Tip: " + LastTip + " ] " + HashTagString); } // update Row 1 (total tips received) Row1 = "Love Shown: " + TotalTips + ((TotalTips == 1) ? " Token" : " Tokens"); // update Row 2, can be latest tipper or highest tipper Row2 = (show.highestTotal) ? "Highest Total Tipper: " + Tippers.Highest.name + " - (" + Tippers.Highest.totalTips + " tks)" : "Last Tipper: " + LastTip; // ensure current goal gets updated due to the tip Modules[MultiGoalModule].setCurrentGoal(); // and then tell the room if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } } var magicMessagePreviousCount = 0; function OnMessage(msg) { var msgL = msg.m.length; var spellCast = false; // The command handler. /* for (t = 0; t < nicknames.length; t++) { var sets = nicknames[t].split("@"); if (sets[0] == msg.user) { msg.m = "[" + sets[1] + "] " + msg.m; } } */ if (show.messageInput) { out = "Sender: " + msg.user + " Font: " + msg.f + "\nColor: " + msg.c + " Fan: " + msg.in_fanclub + "\nMod: " + msg.is_mod + " Gender: " + msg.gender + "\nHas Tokens: " + msg.has_tokens; Messenger.sendErrorMessage(out, msg.user); out = ""; } AddUser(msg.user,msg.is_mod,msg.has_tokens || msg.tipped_recently || msg.tipped_alot_recently || msg.tipped_tons_recently,msg.in_fanclub); RankUser(msg.user, delayBetweenNag); if (MuteLevel == 1) { if (!msg.is_mod && !msg.has_tokens && !msg.tipped_recently && !msg.tipped_alot_recently && !msg.tipped_tons_recently && !msg.in_fanclub && !isScriptAuthor(msg.user) && !isNice(msg.user) && !isBroadcaster(msg.user)) { msg["X-Spam"] = true; Messenger.sendWarningMessage("Most grey messages are currently muted, and this includes yours.", msg.user); } } else if (MuteLevel == 2) { if (!hasUserTipped(msg.user) && !msg.is_mod && !msg.in_fanclub && !isScriptAuthor(msg.user) && !isNice(msg.user) && !isBroadcaster(msg.user)) { if (msg.has_tokens || msg.tipped_recently || msg.tipped_alot_recently || msg.tipped_tons_recently) { Messenger.sendWarningMessage("Most non tippers are muted at the moment, however the room owner and moderators have seen your message, and can add you to chat if they want to.", msg.user); Messenger.sendWarningMessage("Muted Blue " + msg.user + ": " + msg.m, cb.room_slug); Modules[NagModule].NotifyModeratorsWarning("Muted Blue " + msg.user + ": " + msg.m); } else { Messenger.sendWarningMessage("Most messages are currently muted. Please tip at least 1 token to have your messages visible in chat.", msg.user); } msg["X-Spam"] = true; } } else if (MuteLevel == 3) { if (!msg.is_mod && !isScriptAuthor(msg.user) && !isNice(msg.user) && !isBroadcaster(msg.user)) { msg["X-Spam"] = true; Messenger.sendWarningMessage("Most messages are currently muted, and this includes yours.", msg.user); } } // Splits the string at the - and stores it in an array var cmd = msg.m.toLowerCase().split("-"); // unwanted message check, greys filtered aggressively, blues less so, mods, VIP's, nice users, and broadcaster never if (Modules[AutoModeratorModule].isEnabled && (!msg.is_mod && !isScriptAuthor(msg.user) && !isNice(msg.user) && !isBroadcaster(msg.user))) { Modules[AutoModeratorModule].AutoModerator(msg); if (Modules[AutoModeratorModule].vars.muteMe) { Messenger.sendWarningMessage(Modules[AutoModeratorModule].vars.muteReason, msg.user); if (Modules[AutoModeratorModule].vars.tellRoomOwner) { Messenger.sendWarningMessage(msg.user + " : " + Modules[AutoModeratorModule].vars.muteReason + " : " + msg.m, cb.room_slug); } Modules[NagModule].NotifyModeratorsWarning(msg.user + " : " + Modules[AutoModeratorModule].vars.muteReason + " : " + msg.m); if (!Modules[AutoModeratorModule].vars.exceptionMe) { Modules[AutoModeratorModule].vars.lastFucktard[Modules[AutoModeratorModule].vars.unwantedCount] = msg.user + " : " + Modules[AutoModeratorModule].vars.muteReason + " : " + msg.m; Modules[AutoModeratorModule].vars.unwantedCount++; } if (Modules[AutoModeratorModule].vars.unwantedCount > 9) { Modules[AutoModeratorModule].vars.unwantedCount = 0; } //store last 10 rejected messages if (Modules[AutoModeratorModule].vars.frogMe) { if (!isModerated(msg.user)) { //dont repeat the spell message if already cast on them Messenger.sendMagicMessage("Automoderator dislikes a message, " + msg.user + " briefly turns in to a frog.", Colours.Blue, Colours.White); FrogUser(msg.user, true); AutomoderateUser(msg.user, true); ResetUser(msg.user,delayBetweenNag,false,false); } } else { if (!Modules[AutoModeratorModule].vars.exceptionMe) { ResetUser(msg.user,delayBetweenNag,false,false); msg["X-Spam"] = true; } } } else { // if an offender puts in a good message though, let them back in, might have neen an innocent mistake if (isModerated(msg.user)) { FrogUser(msg.user, false); AutomoderateUser(msg.user, false); RankUser(msg.user, 5); } } } // check for user being a frog (frogs can still issue commands) spellCast = false; if (Modules[MagicModule].vars.MagicEnabled) { var zeroToTwo = Math.floor(getRandom() * 3); if (magicMessagePreviousCount === null || magicMessagePreviousCount === 'undefined') { cb.log("magicMessagePreviousCount is undefined."); } else { cb.log("magicMessagePreviousCount: " + magicMessagePreviousCount); } while (zeroToTwo == magicMessagePreviousCount) { zeroToTwo = Math.floor(getRandom() * 3); } var currentCount = zeroToTwo; if (msg.m.substring(0, 1) != "/" && msg.m.substring(0, 1) != "!" && msg.m.substring(0, 1) != "~" && msg.m.substring(0, 1) != "#") { if (isCat(msg.user)) { spellCast = true; msg.m = "[The Cat]: " + CatMessages[currentCount]; msg['background'] = Colours.Tan; } if (isFrog(msg.user)) { spellCast = true; msg.m = "[The Frog]: " + FrogMessages[currentCount]; msg['background'] = Colours.GreenYellow; } // check for duct tape, they can also issue commands if (isTape(msg.user)) { spellCast = true; if (isFrog(msg.user)) { // a duct taped frog msg.m = "[Duct Taped Frog]: " + FrogTapeMessages[currentCount]; } else if (isCat(msg.user)) { msg.m = "[Duct Taped Cat]: " + CatTapeMessages[currentCount]; } else { msg.m = "[Duct Taped]: " + DuctTapeMessages[currentCount]; } } // silence is golden, and best of all, they dont know they are silenced // however they can still issue commands if (isSilence(msg.user)) { msg["X-Spam"] = true; } magicMessagePreviousCount = zeroToTwo; } } // go go pleasurable power user if (msg.is_mod || isBroadcaster(msg.user) || isScriptAuthor(msg.user) || isVIP(msg.user)) { PowerUser = true; } else { PowerUser = false; } // let the room know a demi-god is present aka a script author, or a wizard or a necromancer (but let the broadcaster retain their standard colour) if (Modules[MagicModule].isWizard(msg.user) && Modules[StealthModule].vars.MagicUserVisible && !spellCast) { msg['background'] = Colours.LightYellow; } if (Modules[MagicModule].isNecromancer(msg.user) && (!isBroadcaster(msg.user)) && Modules[StealthModule].vars.MagicUserVisible && !spellCast) { msg['background'] = Colours.WhiteSmoke; } if (isScriptAuthor(msg.user) && !isBroadcaster(msg.user) && Modules[StealthModule].vars.AuthorModeVisible && !spellCast) { msg['background'] = Colours.PeachPuff; } // highest tipper gets a colour no matter if wizard, necro or scripts author (broadcaster cant tip themselves so no effect on them) if ((show.highestTotal && msg.user === Tippers.Highest.name) && !spellCast) { msg['background'] = Colours.Lavender; } /* if (DEBUG) { } */ // auto moderator and answerer goes here // if (!PowerUser && Modules[4].isEnabled) \{ // Modules[NagModule].AutoModerator(msg.user,msg.m); //\} // This detects a /, marks it as spam, and treats it as a command if ((msg.m.substring(0, 1) === "/") || (msg.m.substring(0, 1) === "~") || (msg.m.substring(0, 1) === "#") || (msg.m.substring(0, 1) === "!")) { msg["X-Spam"] = true; /* Building Debug Commands if (cmd[0] === "commandHere") { debugLog("Debug message here " + msg.user); functionHere(); } */ cmd[0] = cmd[0].replace("#","/"); cmd[0] = cmd[0].replace("!","/"); cmd[0] = cmd[0].replace("~","/"); //t // Checks the array for commands and arguments, // sending back an error message when something // doesn't match up // // help command // if (["/help", "/hel", "/he", "/h", "/?"].indexOf(cmd[0]) > -1) { var commandString = "Command: "; var par = "Params: "; var use = "Usage: "; var e = "\n"; var s = " - "; var outhelp = " "; if (!cmd[1] || cmd[1] === null || cmd[1] === "1") { var header = "~~~~~Help~~~~~"; var tempBody = " "; if (PowerUser) { tempBody = Help.reset(1) + s + "Resets 1 or all rows" + e + Help.say(1) + s + "Sends a notice to the room" + e + Help.set(1) + s + "Sets app values" + e + Help.show(1) + s + "Show app values" + e + Help.nice(1) + s + "nice/silence/mute chat control" + e + Help.mm(1) + s + "Module Manager" + e + Help.goal(1) + s + "Multi Goal commands"; } else { tempBody = Help.goal(1) + s + "/goal-show" + e + Help.show(1) + s + "/show-necromancers /show-wizards /show-rules /show-tippers"; } if ((Modules[MagicModule].isWizard(msg.user) || Modules[MagicModule].isNecromancer(msg.user)) && Modules[MagicModule].vars.MagicEnabled) { tempBody = tempBody + e + Help.magic(1) + s + "You may also cast spells"; } Messenger.sendGenericMessage(header, Colours.Blue, Colours.White, msg.user); Messenger.sendGenericMessage(tempBody, Colours.Black, Colours.White, msg.user); Messenger.sendGenericMessage("Type /help- followed by a command to show more details e.g. /help-set.", Colours.Blue, Colours.White, msg.user); Messenger.sendGenericMessage("All commands use the format /command-parameter1-parameter2-parameter3.", Colours.Blue, Colours.White, msg.user); Messenger.sendGenericMessage("You may replace / with #,! or ~ if this app clashes with a bot, abbreviations are allowed, e.g. !he will display this help.", Colours.Blue, Colours.White, msg.user); Messenger.sendWarningMessage(SupportMessage, msg.user); } else if (cmd[1] == Help.set(1) && PowerUser) { outhelp = commandString + Help.set(1) + e + par + Help.set(2) + e + Help.set(3) + e + use + Help.set(4); Messenger.sendGenericMessage(outhelp, Colours.Black, Colours.White, msg.user); } else if (cmd[1] == Help.reset(1) && PowerUser) { outhelp = commandString + Help.reset(1) + e + par + Help.reset(2) + e + use + Help.reset(3) + e + Help.reset(4); Messenger.sendGenericMessage(outhelp, Colours.Black, Colours.White, msg.user); } else if (cmd[1] == Help.say(1) && PowerUser) { outhelp = commandString + Help.say(1) + e + use + Help.say(2) + e + Help.say(3); Messenger.sendGenericMessage(outhelp, Colours.Black, Colours.White, msg.user); } else if (cmd[1] == Help.nice(1) && PowerUser) { outhelp = commandString + Help.nice(1) + e + use + Help.nice(2) + e + Help.nice(3); Messenger.sendGenericMessage(outhelp, Colours.Black, Colours.White, msg.user); } else if (cmd[1] == Help.show(1) && PowerUser) { outhelp = commandString + Help.show(1) + e + use + Help.show(2) + e + Help.show(3); Messenger.sendGenericMessage(outhelp, Colours.Black, Colours.White, msg.user); } else if (cmd[1] == Help.mm(1) && PowerUser) { outhelp = commandString + Help.mm(1) + e + use + Help.mm(2) + e + Help.mm(3) + e + Help.mm(4); Messenger.sendGenericMessage(outhelp, Colours.Black, Colours.White, msg.user); } else if (cmd[1] == Help.magic(1) && ((Modules[MagicModule].isWizard(msg.user) || Modules[MagicModule].isNecromancer(msg.user)) && Modules[MagicModule].vars.MagicEnabled)) { outhelp = commandString + Help.magic(1) + e + use + Help.magic(2) + e + Help.magic(3); Messenger.sendGenericMessage(outhelp, Colours.Black, Colours.White, msg.user); } else if (cmd[1] == Help.goal(1)) { outhelp = commandString + Help.goal(1) + e + use + Help.goal(2) + e + Help.goal(3); Messenger.sendGenericMessage(outhelp, Colours.Black, Colours.White, msg.user); } else { Messenger.sendErrorMessage("Help command doesn't exist!", msg.user); } // // reset command // } else if ((["/reset", "/rese", "/res", "/re", "/r"].indexOf(cmd[0]) > -1) && PowerUser) { if (cmd[1] === "tips") { // set total tips back to 0. Does not effect any multi goal tips, use /goal command to clear that TotalTips = 0; LastTip = "-- (0)"; } else if (["request", "reque", "requ", "req", "re", "r"].indexOf(cmd[1]) > -1) { // reset request price to default. StartRequest = cb.settings.RequestPrice; Row3 = Row3_Default; Row3_Message = Row3; if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } } else if ((["title", "titl", "tit", "ti"].indexOf(cmd[1]) > -1) && AppMode) { // reset room title to default. if (cb.settings.UpdateSubject == "Yes") { cb.changeRoomSubject(StartTitle + " [ Last Tip: " + LastTip + " ] " + HashTagString); } else { cb.changeRoomSubject(StartTitle + " " + HashTagString); } if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } } else if (["talk", "tal", "ta"].indexOf(cmd[1]) > -1) { if (TwoWay === "") { Messenger.sendErrorMessage("No talk established.", msg.user); } else { Messenger.sendUnblockedMessage(FirstSpeaker + " <-> " + TwoWay + " closed.", Colours.Black, Colours.White, TwoWay); Messenger.sendUnblockedMessage(FirstSpeaker + " <-> " + TwoWay + " closed. ", Colours.Black, Colours.White, FirstSpeaker); TwoWay = ""; FirstSpeaker = ""; } } else if ((["update", "updat", "upda", "upd", "up", "u"].indexOf(cmd[1]) > -1) && AppMode) { // reset room title on tip to default. if (cb.settings.UpdateSubject == "Yes") { cb.changeRoomSubject(cb.settings.RoomTitle + " [ Last Tip: " + LastTip + " ] " + HashTagString); ShowTipInTitle = true; } else { cb.changeRoomSubject(cb.settings.RoomTitle + " " + HashTagString); ShowTipInTitle = true; } if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } } else if (["steath", "stealt", "steal", "stea", "ste", "st"].indexOf(cmd[1]) > -1) { Modules[StealthModule].onEnable(); Messenger.sendGenericMessage("Author Mode Visible : " + Modules[StealthModule].vars.AuthorModeVisible, Colours.Black, Colours.White, msg.user); Messenger.sendGenericMessage("Row Update Visible : " + Modules[StealthModule].vars.RowUpdateVisible, Colours.Black, Colours.White, msg.user); Messenger.sendGenericMessage("Chat Output Visible : " + Modules[StealthModule].vars.ChatOutputVisible, Colours.Black, Colours.White, msg.user); Messenger.sendGenericMessage("Magic User Visible : " + Modules[StealthModule].vars.MagicUserVisible, Colours.Black, Colours.White, msg.user); Messenger.sendGenericMessage("Error Messages Visible : " + Modules[StealthModule].vars.ErrorVisible, Colours.Black, Colours.White, msg.user); if (AppMode) { cb.drawPanel(); } } else if (cmd[1] === "1") { //otherwise this command clears row 1, 2 or 3 Row1 = Row1_Default; if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } } else if (cmd[1] === "2") { Row2 = Row2_Default; if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } } else if (cmd[1] === "3") { Row3 = (StartRequest > 0) ? "Tip " + StartRequest + " if you want a request!" : cb.settings.RoomMessage; Row3_Message = Row3; if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } } else if (["all", "al", "a"].indexOf(cmd[1]) > -1) { Row1 = Row1_Default; Row2 = Row2_Default; Row3 = (StartRequest > 0) ? "Tip " + StartRequest + " if you want a request!" : cb.settings.RoomMessage; Row3_Message = Row3; if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } } else { Messenger.sendErrorMessage("Improper params. Params: 1, 2, 3 or all for rows, tips to reset tips to 0. See /help-reset for further options.", msg.user); } } else if ((["/reset", "/rese", "/res", "/re", "/r"].indexOf(cmd[0]) > -1) && (["talk", "tal", "ta"].indexOf(cmd[1]) > -1) && msg.user === TwoWay) { Messenger.sendUnblockedMessage(FirstSpeaker + " <-> " + TwoWay + " closed.", Colours.Black, Colours.White, FirstSpeaker); Messenger.sendUnblockedMessage(FirstSpeaker + " <-> " + TwoWay + " closed.", Colours.Black, Colours.White, TwoWay); // // set command // } else if ((["/set", "/se"].indexOf(cmd[0]) > -1) && PowerUser) { if (msg.m.substring(cmd[0].length + 1, msgL).length > 0) { if (cmd[1] === "1") { SetRow(Row1, msg.m.substring(cmd[0].length + cmd[1].length + 2, msgL), 55); } else if (cmd[1] === "2") { SetRow(Row2, msg.m.substring(cmd[0].length + cmd[1].length + 2, msgL), 55); } else if (cmd[1] === "3") { SetRow(Row3, msg.m.substring(cmd[0].length + cmd[1].length + 2, msgL), 55); Row3_Message = msg.m.substring(cmd[0].length + cmd[1].length + 2, msgL); } else if (["request", "reques", "reque", "requ", "req", "re", "r"].indexOf(cmd[1]) > -1) { StartRequest = parseInt(cmd[2]); Row3 = (StartRequest > 0) ? "Tip " + StartRequest + " if you want a request!" : cb.settings.RoomMessage; Row3_Message = Row3; if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } } else if (["talk", "tal", "ta"].indexOf(cmd[1]) > -1) { TwoWay = GetUser(cmd[2]); if (TwoWay === "") { TwoWay = cmd[2]; } FirstSpeaker = msg.user; Messenger.sendUnblockedMessage(msg.user + " <-> " + TwoWay + " started. Use /talk-Message to talk and /reset-talk to cancel.", Colours.Black, Colours.White, TwoWay); Messenger.sendUnblockedMessage(msg.user + " <-> " + TwoWay + " started. Use /talk-Message to talk and /reset-talk to cancel.", Colours.Black, Colours.White, FirstSpeaker); } else if ((["title", "titl", "tit", "ti"].indexOf(cmd[1]) > -1) && AppMode) { if (typeof cmd[2] !== 'undefined') { if (cb.settings.UpdateSubject == "Yes") { cb.changeRoomSubject(msg.m.substring(cmd[0].length + cmd[1].length + 2, msgL) + " [ Last Tip: " + LastTip + " ] " + HashTagString); } else { cb.changeRoomSubject(msg.m.substring(cmd[0].length + cmd[1].length + 2, msgL) + " " + HashTagString); } } else { cb.changeRoomSubject(" "); } } else if ((["update", "updat", "upda", "upd", "up", "u"].indexOf(cmd[1]) > -1) && AppMode) { if (cmd[2] === "on") { cb.changeRoomSubject(cb.settings.RoomTitle + " [ Last Tip: " + LastTip + " ] " + HashTagString); ShowTipInTitle = true; } else if (cmd[2] === "off" || cmd[2] === "of") { cb.changeRoomSubject(cb.settings.RoomTitle + " " + HashTagString); ShowTipInTitle = false; } else { Messenger.sendErrorMessage("Use either on or off with this command", msg.user); } } else if (["nag", "na"].indexOf(cmd[1]) > -1) { if (cmd[2] === "on") { Messenger.sendGenericMessage("Inactive Blue Nagging System enabled.", Colours.Black, Colours.White, msg.user); Modules[NagModule].NotifyModerators("Inactive Blue Nagging System enabled.", Colours.Black, Colours.White); Modules[NagModule].onEnable(); } else if (cmd[2] === "off" || cmd[2] === "of") { Messenger.sendGenericMessage("Inactive Blue Nagging System disabled.", Colours.Black, Colours.White, msg.user); Modules[NagModule].NotifyModerators("Inactive Blue Nagging System disabled.", Colours.Black, Colours.White); Modules[NagModule].onDisable(); } else if (["delay", "dela", "del", "de", "d"].indexOf(cmd[2]) > -1) { var nagStart = parseInt(cmd[3]); if (nagStart > 0) { delayToNag = nagStart; Messenger.sendGenericMessage("Inactive Blue Nagging Delay is now: " + delayToNag, Colours.Black, Colours.White, msg.user); } } else if (["interval", "interva", "interv", "inter", "inte", "int", "in", "i"].indexOf(cmd[2]) > -1) { var nagDelay = parseInt(cmd[3]); if (nagDelay > 0) { delayBetweenNag = nagDelay; Messenger.sendGenericMessage("Inactive Blue Nagging Interval is now: " + delayBetweenNag, Colours.Black, Colours.White, msg.user); } } else if (["message", "messag", "messa", "mess", "mess", "mes", "me", "m"].indexOf(cmd[2]) > -1) { NagMessage = msg.m.substring(cmd[0].length + cmd[1].length + cmd[2].length + 3, msgL); Messenger.sendGenericMessage("Inactive Blue Nagging Message is now: " + NagMessage, Colours.Black, Colours.White, msg.user); } else { Messenger.sendErrorMessage("Use either on, off, delay, interval or message, with this command", msg.user); } } else if (["spam", "spa", "sp", "s"].indexOf(cmd[1]) > -1) { // show spam in chat on off if (cmd[2] === "on") { Modules[AutoModeratorModule].vars.tellRoomOwner = true; Modules[NagModule].NotifyModerators("Room owner can see spam", Colours.Black, Colours.White); Messenger.sendGenericMessage("Room owner can see spam", Colours.Black, Colours.White, cb.room_slug); } else if (cmd[2] === "off" || cmd[2] === "of") { Modules[AutoModeratorModule].vars.tellRoomOwner = false; Modules[NagModule].NotifyModerators("Room owner can not see spam", Colours.Black, Colours.White); Messenger.sendGenericMessage("Room owner can not see spam", Colours.Black, Colours.White, cb.room_slug); } else { Messenger.sendErrorMessage("Use either on or off with this command", msg.user); } } else if (["rules", "rule", "rul", "ru", "r"].indexOf(cmd[1]) > -1) { // modify automod rules if (["all", "al", "a"].indexOf(cmd[2]) > -1) { if (cmd[3] === "on") { for (var i = 0; i <= 6; i++) { Modules[AutoModeratorModule].vars.muteGrey[i] = "on"; } for (var i = 0; i <= 3; i++) { Modules[AutoModeratorModule].vars.muteBlue[i] = "on"; } Messenger.sendGenericMessage("All Spam Filters On", Colours.Black, Colours.White, msg.user); } else if (cmd[3] === "off" || cmd[3] === "of") { for (var i = 0; i <= 6; i++) { Modules[AutoModeratorModule].vars.muteGrey[i] = "off"; } for (var i = 0; i <= 3; i++) { Modules[AutoModeratorModule].vars.muteBlue[i] = "off"; } Messenger.sendGenericMessage("All Spam Filters Off", Colours.Black, Colours.White, msg.user); } else { Messenger.sendErrorMessage("Use either all-on or all-off with this command", msg.user); } } else if (["blue", "blu", "bl", "b"].indexOf(cmd[2]) > -1) { if (cmd[3] === "on") { for (var i = 0; i <= 3; i++) { Modules[AutoModeratorModule].vars.muteBlue[i] = "on"; } Messenger.sendGenericMessage("All Blue Spam Filters On", Colours.Black, Colours.White, msg.user); } else if (cmd[3] === "off" || cmd[3] === "of") { for (var i = 0; i <= 3; i++) { Modules[AutoModeratorModule].vars.muteBlue[i] = "off"; } Messenger.sendGenericMessage("All Blue Spam Filters Off", Colours.Black, Colours.White, msg.user); } else if (["0", "1", "2", "3"].indexOf(cmd[3]) > -1) { if (cmd[4] === "on") { Modules[AutoModeratorModule].vars.muteBlue[parseInt(cmd[3])] = "on"; Messenger.sendGenericMessage("Blue Spam Filter " + cmd[3] + " On", Colours.Black, Colours.White, msg.user); } else if (cmd[4] === "off" || cmd[4] === "of") { Modules[AutoModeratorModule].vars.muteBlue[parseInt(cmd[3])] = "off"; Messenger.sendGenericMessage("Blue Spam Filter " + cmd[3] + " Off", Colours.Black, Colours.White, msg.user); } else { Messenger.sendErrorMessage("Use either blue-<0 to 6>-on or blue-<0 to 3>-off with this command", msg.user); } } else { Messenger.sendErrorMessage("Use either blue-on or blue-off with this command", msg.user); } } else if (["grey", "gre", "gr", "g"].indexOf(cmd[2]) > -1) { if (cmd[3] === "on") { for (var i = 0; i <= 6; i++) { Modules[AutoModeratorModule].vars.muteGrey[i] = "on"; } Messenger.sendGenericMessage("All Grey Spam Filters On", Colours.Black, Colours.White, msg.user); } else if (cmd[3] === "off" || cmd[3] === "of") { for (var i = 0; i <= 6; i++) { Modules[AutoModeratorModule].vars.muteGrey[i] = "off"; } Messenger.sendGenericMessage("All Grey Spam Filters Off", Colours.Black, Colours.White, msg.user); } else if (["0", "1", "2", "3", "4", "5", "6"].indexOf(cmd[3]) > -1) { if (cmd[4] === "on") { Modules[AutoModeratorModule].vars.muteGrey[parseInt(cmd[3])] = "on"; Messenger.sendGenericMessage("Grey Spam Filter " + cmd[3] + " On", Colours.Black, Colours.White, msg.user); } else if (cmd[4] === "off" || cmd[4] === "of") { Modules[AutoModeratorModule].vars.muteGrey[parseInt(cmd[3])] = "off"; Messenger.sendGenericMessage("Grey Spam Filter " + cmd[3] + " Off", Colours.Black, Colours.White, msg.user); } else { Messenger.sendErrorMessage("Use either grey-<0 to 3>-on or grey-<0 to 6>-off with this command", msg.user); } } else { Messenger.sendErrorMessage("Use either grey-on or grey-off with this command", msg.user); } } else { Messenger.sendErrorMessage("Syntax set-rules-<options>-<on/off>, <options> is: all, blue or grey (with an optional rule number)", msg.user); } } else if (["stealth", "stealt", "steal", "stea", "ste", "st"].indexOf(cmd[1]) > -1) { if (["author", "autho", "auth", "aut", "au", "a"].indexOf(cmd[2]) > -1) { if (cmd[3] === "on") { Modules[StealthModule].vars.AuthorModeVisible = true; Messenger.sendGenericMessage("Viewing Author colour set to on." + cmd[3] , Colours.Black, Colours.White, msg.user); } else if (cmd[3] === "off" || cmd[3] === "of") { Modules[StealthModule].vars.AuthorModeVisible = false; Messenger.sendGenericMessage("Viewing Author colour set to off." , Colours.Black, Colours.White, msg.user); } else { Messenger.sendErrorMessage("Use either -on -off with this command", msg.user); } } else if (["magic", "magi", "mag", "ma", "m"].indexOf(cmd[2]) > -1) { if (cmd[3] === "on") { Modules[StealthModule].vars.MagicUserVisible = true; Messenger.sendGenericMessage("Viewing Magic user colour state, and text, set to on." + cmd[3] , Colours.Black, Colours.White, msg.user); } else if (cmd[3] === "off" || cmd[3] === "of") { Modules[StealthModule].vars.MagicUserVisible = false; Messenger.sendGenericMessage("Viewing Magic user colour state, and text, set to off." , Colours.Black, Colours.White, msg.user); } else { Messenger.sendErrorMessage("Use either -on -off with this command", msg.user); } } else if (["error", "erro", "err", "er", "e"].indexOf(cmd[2]) > -1) { if (cmd[3] === "on") { Modules[StealthModule].vars.ErrorVisible = true; Messenger.sendGenericMessage("Viewing Error, Automoderator, and Warning messages set to on." , Colours.Black, Colours.White, msg.user); } else if (cmd[3] === "off" || cmd[3] === "of") { Modules[StealthModule].vars.ErrorVisible = false; Messenger.sendGenericMessage("Viewing Error, Automoderator, and Warning messages set to off.", Colours.Black, Colours.White, msg.user); } else { Messenger.sendErrorMessage("Use either -on -off with this command", msg.user); } } else if (["row", "ro", "r"].indexOf(cmd[2]) > -1) { if (cmd[3] === "on") { Modules[StealthModule].vars.RowUpdateVisible = true; Messenger.sendGenericMessage("Row Updates set to on." , Colours.Black, Colours.White, msg.user); if (AppMode) { cb.drawPanel(); } } else if (cmd[3] === "off" || cmd[3] === "of") { Modules[StealthModule].vars.RowUpdateVisible = false; Messenger.sendGenericMessage("Row Updates set to off (items in the rows will still update, you just cant see it).", Colours.Black, Colours.White, msg.user); } else { Messenger.sendErrorMessage("Use either -on -off with this command", msg.user); } } else if (["chat", "cha", "ch", "c"].indexOf(cmd[2]) > -1) { if (cmd[3] === "on") { Modules[StealthModule].vars.ChatOutputVisible = true; Messenger.sendGenericMessage("Chat Notices set to on." , Colours.Black, Colours.White, msg.user); if (AppMode) { cb.drawPanel(); } } else if (cmd[3] === "off" || cmd[3] === "of") { Messenger.sendGenericMessage("Chat Notices set to off (you will no longer see feedback from commands).", Colours.Black, Colours.White, msg.user); Modules[StealthModule].vars.ChatOutputVisible = false; } else { Messenger.sendErrorMessage("Use either -on -off with this command", msg.user); } } else if (["text", "tex", "te", "t"].indexOf(cmd[2]) > -1) { if (cmd[3] === "on") { Modules[StealthModule].vars.ChatOutputVisible = true; Modules[StealthModule].vars.RowUpdateVisible = true; Modules[StealthModule].vars.ErrorVisible = true; Messenger.sendGenericMessage("Chat Notices, Error/Warning Messages and Row Updates set to on." , Colours.Black, Colours.White, msg.user); if (AppMode) { cb.drawPanel(); } } else if (cmd[3] === "off" || cmd[3] === "of") { Messenger.sendGenericMessage("Chat Notices, Error/Warning Messages and Row Updates set to off (you will no longer see feedback from commands) (in-chat PM and /say still work).", Colours.Black, Colours.White, msg.user); Modules[StealthModule].vars.ChatOutputVisible = false; Modules[StealthModule].vars.RowUpdateVisible = false; Modules[StealthModule].vars.ErrorVisible = false; } else { Messenger.sendErrorMessage("Use either -on -off with this command", msg.user); } } else if (["all", "al", "a"].indexOf(cmd[2]) > -1) { if (cmd[3] === "on") { Modules[StealthModule].vars.ChatOutputVisible = true; Modules[StealthModule].vars.RowUpdateVisible = true; Modules[StealthModule].vars.ErrorVisible = true; Modules[StealthModule].vars.AuthorModeVisible = true; Modules[StealthModule].vars.MagicUserVisible = true; Messenger.sendGenericMessage("Chat Notices, Error/Warning Messages, Row Updates, Magic and Author Colours set to on." , Colours.Black, Colours.White, msg.user); if (AppMode) { cb.drawPanel(); } } else if (cmd[3] === "off" || cmd[3] === "of") { Messenger.sendGenericMessage("Chat Notices, Error/Warning Messages, Row Updates, Magic and Author Colours set to off (you will no longer see feedback from commands) (in-chat PM and /say still work).", Colours.Black, Colours.White, msg.user); Modules[StealthModule].vars.ChatOutputVisible = false; Modules[StealthModule].vars.RowUpdateVisible = false; Modules[StealthModule].vars.ErrorVisible = false; Modules[StealthModule].vars.AuthorModeVisible = false; Modules[StealthModule].vars.MagicUserVisible = false; } else { Messenger.sendErrorMessage("Use either -on -off with this command", msg.user); } } else { Messenger.sendErrorMessage("Syntax set-stealth-<option>-<on/off>, <options> is: author, magic, error", msg.user); } } else if ((["hashtags", "hashtag", "hashta", "hasht", "hash", "has", "ha", "h"].indexOf(cmd[1]) > -1) && AppMode) { if (cmd[2].substring(0,1) === "#") { HashTagString = cmd[2]; if (ShowTipInTitle) { cb.changeRoomSubject(cb.settings.RoomTitle + " [ Last Tip: " + LastTip + " ] " + HashTagString); } else { cb.changeRoomSubject(cb.settings.RoomTitle + " " + HashTagString); } } else { Messenger.sendErrorMessage("No hashtags found, try using # to start the hashtag string.", msg.user); } } } else { Messenger.sendErrorMessage("Set option doesn't exist, see /help-set", msg.user); } // // say command // } else if ((["/say", "/sa"].indexOf(cmd[0]) > -1) && PowerUser) { if ((["goal", "goa", "go", "g"].indexOf(cmd[1]) > -1) && Modules[MultiGoalModule].isEnabled) { Messenger.sendGenericMessage("Next goal: " + Modules[MultiGoalModule].vars.currentGoalText + (Modules[MultiGoalModule].vars.currentGoalTip - Modules[MultiGoalModule].vars.GoalTips) + " Tokens to go. ", Colours.Green, Colours.White); return; } if (msg.m.length <= 0) { Messenger.sendErrorMessage("Missing message!", msg.user); } else if (msg.m.length <= 200) { Messenger.sendUnblockedMessage(msg.m.substring(cmd[0].length + 1, msgL), Colours.Black, Colours.White); } else { Messenger.sendErrorMessage("String is too long!", msg.user); } } else if ((["/talk", "/tal"].indexOf(cmd[0]) > -1) && msg.user === TwoWay) { Messenger.sendUnblockedMessage(TwoWay + " -> " + msg.m.substring(cmd[0].length + 1, msgL), Colours.Black, Colours.White, FirstSpeaker); Messenger.sendUnblockedMessage(TwoWay + " -> " + msg.m.substring(cmd[0].length + 1, msgL), Colours.Black, Colours.White, TwoWay); // // fed up with laguna forgetting to call me when starting a show // constant reminders until he remembers. // } else if ((["/talk", "/tal"].indexOf(cmd[0]) > -1) && PowerUser && TwoWay != "") { Messenger.sendUnblockedMessage(FirstSpeaker + " -> " + msg.m.substring(cmd[0].length + 1, msgL), Colours.Black, Colours.White, TwoWay); Messenger.sendUnblockedMessage(FirstSpeaker + " -> " + msg.m.substring(cmd[0].length + 1, msgL), Colours.Black, Colours.White, FirstSpeaker); } else if (cmd[0] === "/done" && PowerUser) { Modules[NagModule].vars.SlugNag = false; Modules[NagModule].onDisable(); Modules[NagModule].isEnabled = false; Messenger.sendUnblockedMessage(cb.room_slug + " sighs in resignation, and summons the moderators.", Colours.Black, Colours.White, cb.room_slug); // // wizard command // } else if ((["/wizard", "/wizar", "/wiza", "/wiz", "/wi", "/w"].indexOf(cmd[0]) > -1) && Modules[MagicModule].isNecromancer(msg.user)) { if (typeof cmd[1] !== 'undefined') { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } Modules[MagicModule].SetWizard(targetUser, true); Messenger.sendMagicMessage(msg.user + " waves their magic wand, " + targetUser + " is now a Wizard.", Colours.Purple, Colours.White); } else { Messenger.sendErrorMessage("Please supply a Wizard name.", msg.user); } // // unwizard command // } else if ((["/unwizard", "/unwizar", "/unwiza", "/unwiz", "/unwi", "/unw"].indexOf(cmd[0]) > -1) && Modules[MagicModule].isNecromancer(msg.user)) { if (typeof cmd[1] !== 'undefined') { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } Modules[MagicModule].SetWizard(targetUser, false); Messenger.sendMagicMessage(msg.user + " waves their magic wand, " + targetuser + " is no longer a Wizard.", Colours.Purple, Colours.White); } else { Messenger.sendErrorMessage("Please supply a Wizard name.", msg.user); } // // nice command // } else if ((["/nice", "/nic", "/ni"].indexOf(cmd[0]) > -1) && PowerUser) { if (typeof cmd[1] !== 'undefined') { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } NiceUser(targetUser, true); Messenger.sendGenericMessage(targetUser + " is now on the nice list, they are exempt from automoderating.", Colours.Black, Colours.White, cb.room_slug); Messenger.sendGenericMessage(targetUser + " is now on the nice list, they are exempt from automoderating.", Colours.Black, Colours.White, targetUser); Modules[NagModule].NotifyModerators(targetUser + " is now on the nice list, they are exempt from automoderating.", Colours.Black, Colours.White); } else { Messenger.sendErrorMessage("Please supply a name.", msg.user); } // // unnice command // } else if ((["/unnice", "/unnic", "/unni"].indexOf(cmd[0]) > -1) && PowerUser) { if (typeof cmd[1] !== 'undefined') { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } NiceUser(targetUser, false); Messenger.sendGenericMessage(targetUser + " is removed from the nice list.", Colours.Black, Colours.White, cb.room_slug); Messenger.sendGenericMessage(targetUser + " is removed from the nice list.", Colours.Black, Colours.White, targetUser); Modules[NagModule].NotifyModerators(targetUser + " is removed from the nice list.", Colours.Black, Colours.White); } else { Messenger.sendErrorMessage("Please supply a name.", msg.user); } // // vip command // } else if ((["/vip", "/vi", "/v"].indexOf(cmd[0]) > -1) && PowerUser) { if (typeof cmd[1] !== 'undefined') { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } VIPUser(targetUser, true); NiceUser(targetUser, true); Messenger.sendGenericMessage(targetUser + " is now on the VIP and nice list, they can issue commands to this app, and are exempt from automoderating.", Colours.Black, Colours.White, cb.room_slug); Messenger.sendGenericMessage(targetUser + " is now on the VIP and nice list, they can issue commands to this app, and are exempt from automoderating.", Colours.Black, Colours.White, targetUser); Modules[NagModule].NotifyModerators(targetUser + " is now on the VIP and nice list, they can issue commands to this app, and are exempt from automoderating.", Colours.Black, Colours.White); } else { Messenger.sendErrorMessage("Please supply a name.", msg.user); } // // unvip command // } else if ((["/unvip", "/unvi", "/unv"].indexOf(cmd[0]) > -1) && PowerUser) { if (typeof cmd[1] !== 'undefined') { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } VIPUser(targetUser, false); Messenger.sendGenericMessage(targetUser + " is removed from the VIP list, they are still on the nice list.", Colours.Black, Colours.White, cb.room_slug); Messenger.sendGenericMessage(targetUser + " is removed from the VIP list, they are still on the nice list.", Colours.Black, Colours.White, targetUser); Modules[NagModule].NotifyModerators(targetUser + " is removed from the VIP list, they are still on the nice list.", Colours.Black, Colours.White); } else { Messenger.sendErrorMessage("Please supply a name.", msg.user); } // // necromancer command // } else if ((["/necromancer", "/necromance", "/necromanc", "/necroman", "/necroma", "/necrom", "/necro", "/necr", "/nec", "/ne", "/n"].indexOf(cmd[0]) > -1) && Modules[MagicModule].isNecromancer(msg.user)) { if (typeof cmd[1] !== 'undefined') { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } Modules[MagicModule].SetNecromancer(targetUser, true); Messenger.sendMagicMessage(msg.user + " waves their magic wand, " + targetUser + " is now a Necromancer.", Colours.Purple, Colours.White); } else { Messenger.sendErrorMessage("Please supply a Necromancer name.", msg.user); } // // unnecromancer command // } else if ((["/unnecromancer", "/unnecromance", "/unnecromanc", "/unnecroman", "/unnecroma", "/unnecrom", "/unnecro", "/unnecr", "/unnec", "/unne", "/unn"].indexOf(cmd[0]) > -1) && Modules[MagicModule].isNecromancer(msg.user)) { if (typeof cmd[1] !== 'undefined') { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } if (targetUser == cb.room_slug) { Messenger.sendMagicMessage(msg.user + " waves their magic wand, but " + targetUser + " dodges the spell and remains a Necromancer.", Colours.Purple, Colours.White); } else { Modules[MagicModule].SetNecromancer(targetUser, false); Messenger.sendMagicMessage(msg.user + " waves their magic wand, " + targetUser + " is no longer a Necromancer.", Colours.Purple, Colours.White); } } else { Messenger.sendErrorMessage("Please supply a Necromancer name.", msg.user); } // // show command // } else if ((["/show", "/sho", "/sh"].indexOf(cmd[0]) > -1)) { if ((["highest", "highes", "highe", "high", "hig", "hi", "h"].indexOf(cmd[1]) > -1) && PowerUser) { if (["true", "tru", "tr", "t"].indexOf(cmd[2]) > -1) { setShowHighestTotal(true); } else if (["false", "fals", "fal", "fa", "f"].indexOf(cmd[2]) > -1) { setShowHighestTotal(false); } else if ((["toggle", "toggl", "togg", "tog", "to"].indexOf(cmd[2]) > -1)) { toggleShowHighestTotal(); } else { Messenger.sendErrorMessage("Improper params! Params: true, false, toggle.", msg.user); } } else if (["tippers", "tipper", "tippe", "tipp", "tip", "ti", "tips"].indexOf(cmd[1]) > -1) { var WeGotOne = false; for (var u = 0; u < Tippers.List.length; u++) { if ((["all", "al", "a"].indexOf(cmd[2]) > -1 ) && PowerUser) { Messenger.sendGenericMessage(Tippers.List[u].name + " tipped " + Tippers.List[u].totalTips, Colours.Black, Colours.White); } else { Messenger.sendGenericMessage(Tippers.List[u].name + " tipped " + Tippers.List[u].totalTips, Colours.Black, Colours.White, msg.user); } WeGotOne = true; } if (!WeGotOne) { Messenger.sendGenericMessage("No tippers.", Colours.Red, Colours.White, msg.user); } } else if ((["last", "las", "la", "l"].indexOf(cmd[1]) > -1) && (PowerUser || Modules[MagicModule].isNecromancer(msg.user) || Modules[MagicModule].isWizard(msg.user))) { var weGotX = 5; if (parseInt(cmd[2]) > 0) { weGotX = parseInt(cmd[2]) } var aUID = nextUID - 1; var weGotXCount = 0; while ((weGotXCount < weGotX) && (aUID > 0)) { if (GetUser(aUID) != "-1") { Messenger.sendGenericMessage(GetUser(aUID) + "(" + (aUID) + ")", Colours.Black, Colours.White, msg.user); weGotXCount++; } aUID--; } } else if ((["frog", "fro", "fr", "f"].indexOf(cmd[1]) > -1) && (PowerUser || Modules[MagicModule].isNecromancer(msg.user) || Modules[MagicModule].isWizard(msg.user))) { var WeGotOne = false; var WeGotOne = false; var Sepr = ""; var OutList = ""; for (var u = 0; u < UserList.length; u++) { if (UserList[u].frog) { OutList += Sepr + UserList[u].name; Sepr = ","; WeGotOne = true; } } if (!WeGotOne) { Messenger.sendGenericMessage("No froged users on list.", Colours.Red, Colours.White, msg.user); } else { Messenger.sendGenericMessage(OutList, Colours.Black, Colours.White, msg.user); } } else if ((["cat", "ca"].indexOf(cmd[1]) > -1) && (PowerUser || Modules[MagicModule].isNecromancer(msg.user) || Modules[MagicModule].isWizard(msg.user))) { var WeGotOne = false; var WeGotOne = false; var Sepr = ""; var OutList = ""; for (var u = 0; u < UserList.length; u++) { if (UserList[u].cat) { OutList += Sepr + UserList[u].name; Sepr = ","; WeGotOne = true; } } if (!WeGotOne) { Messenger.sendGenericMessage("No feline users on list.", Colours.Red, Colours.White, msg.user); } else { Messenger.sendGenericMessage(OutList, Colours.Black, Colours.White, msg.user); } } else if ((["silence", "silenc", "silen", "sile", "sil", "si", "s"].indexOf(cmd[1]) > -1) && PowerUser) { var WeGotOne = false; var Sepr = ""; var OutList = ""; for (var u = 0; u < UserList.length; u++) { if (UserList[u].silence) { OutList += Sepr + UserList[u].name; Sepr = ","; WeGotOne = true; } } if (!WeGotOne) { Messenger.sendGenericMessage("No silenced users on list.", Colours.Red, Colours.White, msg.user); } else { Messenger.sendGenericMessage(OutList, Colours.Black, Colours.White, msg.user); } } else if ((["tape", "tap", "ta", "t"].indexOf(cmd[1]) > -1) && (PowerUser || Modules[MagicModule].isNecromancer(msg.user) || Modules[MagicModule].isWizard(msg.user))) { var WeGotOne = false; var Sepr = ""; var OutList = ""; for (var u = 0; u < UserList.length; u++) { if (UserList[u].ducttape) { OutList += Sepr + UserList[u].name; Sepr = ","; WeGotOne = true; } } if (!WeGotOne) { Messenger.sendGenericMessage("No taped users on list.", Colours.Red, Colours.White, msg.user); } else { Messenger.sendGenericMessage(OutList, Colours.Black, Colours.White, msg.user); } } else if ((["users", "user", "use", "us", "u"].indexOf(cmd[1]) > -1) && PowerUser) { var showBoring = true; var showLeft = true; var StartFrom = 0; var GoToHere = nextUID - 1; if (["boring", "borin", "bori", "bor", "bo", "b", "bore"].indexOf(cmd[2]) > -1) { showBoring = true; showLeft= false; } if (["left", "lef", "le", "l"].indexOf(cmd[2]) > -1) { showBoring = false; showLeft= true; } if (showLeft && showBoring && typeof cmd[2] !== 'undefined') { // no boring or left option, check for a number if (parseInt(cmd[2]) > -1) { StartFrom = parseInt(cmd[2]); if (typeof cmd[3] !== 'undefined') { if (parseInt(cmd[3]) > 0) { GoToHere = parseInt(cmd[3]); } else { GoToHere = nextUID - 1; } } } else { StartFrom = 0; GoToHere = nextUID - 1; } } else if (typeof cmd[3] !== 'undefined') { if (parseInt(cmd[3]) > -1) { StartFrom = parseInt(cmd[3]); if (typeof cmd[4] !== 'undefined') { if (parseInt(cmd[4]) > 0) { GoToHere = parseInt(cmd[4]); } else { GoToHere = nextUID - 1; } } } else { StartFrom = 0; GoToHere = nextUID - 1; } } Messenger.sendGenericMessage("Users from " + StartFrom + " to " + GoToHere, Colours.Black, Colours.White, msg.user); var WeGotOne = false; for (var u = 0; u < UserList.length; u++) { if (showBoring && showLeft) { if (UserList[u].userID >= StartFrom && UserList[u].userID <= GoToHere) { Messenger.sendGenericMessage(UserList[u].name + "(" + UserList[u].userID + ") - Boring " + UserList[u].boring_blue + ", Left " + UserList[u].they_left + ", Rank " + UserList[u].weighting, Colours.Black, Colours.White, msg.user); WeGotOne = true; } } else if (showBoring) { if (UserList[u].boring_blue) { if (UserList[u].userID >= StartFrom && UserList[u].userID <= GoToHere) { Messenger.sendGenericMessage(UserList[u].name + "(" + UserList[u].userID + ") - Boring " + UserList[u].boring_blue + ", Left " + UserList[u].they_left + ", Rank " + UserList[u].weighting, Colours.Black, Colours.White, msg.user); WeGotOne = true; } } } else if (showLeft) { if (UserList[u].they_left) { if (UserList[u].userID >= StartFrom && UserList[u].userID <= GoToHere) { Messenger.sendGenericMessage(UserList[u].name + "(" + UserList[u].userID + ") - Boring " + UserList[u].boring_blue + ", Left " + UserList[u].they_left + ", Rank " + UserList[u].weighting, Colours.Black, Colours.White, msg.user); WeGotOne = true; } } } } if (!WeGotOne) { Messenger.sendGenericMessage("No users on list.", Colours.Red, Colours.White, msg.user); } } else if ((["wizard", "wizar", "wiza", "wiz", "wi", "w"].indexOf(cmd[1]) > -1) && (PowerUser || Modules[MagicModule].isNecromancer(msg.user) || Modules[MagicModule].isWizard(msg.user))) { var WeGotOne = false; var Sepr = ""; var OutList = ""; for (var u = 0; u < UserList.length; u++) { if (UserList[u].wizard) { OutList += Sepr + UserList[u].name; Sepr = ","; WeGotOne = true; } } if (!WeGotOne) { Messenger.sendGenericMessage("No wizards on list.", Colours.Red, Colours.White, msg.user); } else { Messenger.sendGenericMessage(OutList, Colours.Black, Colours.White, msg.user); } } else if ((["nice", "nic", "ni"].indexOf(cmd[1]) > -1) && PowerUser) { var WeGotOne = false; var Sepr = ""; var OutList = ""; for (var u = 0; u < UserList.length; u++) { if (UserList[u].awesome_person) { OutList += Sepr + UserList[u].name; Sepr = ","; WeGotOne = true; } } if (!WeGotOne) { Messenger.sendGenericMessage("No nice people on list.", Colours.Red, Colours.White, msg.user); } else { Messenger.sendGenericMessage(OutList, Colours.Black, Colours.White, msg.user); } } else if (["stealth", "stealt", "steal", "stea", "ste", "st"].indexOf(cmd[1]) > -1) { Messenger.sendGenericMessage("Author Mode Visible : " + Modules[StealthModule].vars.AuthorModeVisible, Colours.Black, Colours.White, msg.user); Messenger.sendGenericMessage("Row Update Visible : " + Modules[StealthModule].vars.RowUpdateVisible, Colours.Black, Colours.White, msg.user); Messenger.sendGenericMessage("Chat Output Visible : " + Modules[StealthModule].vars.ChatOutputVisible, Colours.Black, Colours.White, msg.user); Messenger.sendGenericMessage("Magic User Visible : " + Modules[StealthModule].vars.MagicUserVisible, Colours.Black, Colours.White, msg.user); Messenger.sendGenericMessage("Error/Automoderator Messages Visible : " + Modules[StealthModule].vars.ErrorVisible, Colours.Black, Colours.White, msg.user); } else if (["nag", "na"].indexOf(cmd[1]) > -1) { Messenger.sendGenericMessage("Message Inactive Blues : " + Modules[NagModule].vars.doWeNag, Colours.Black, Colours.White, msg.user); Messenger.sendGenericMessage("Minutes Until a Blue is Considered Inactive : " + delayToNag, Colours.Black, Colours.White, msg.user); Messenger.sendGenericMessage("Minutes Between Messages to Inactive Blues : " + delayBetweenNag, Colours.Black, Colours.White, msg.user); Messenger.sendGenericMessage("Message Sent to Inactive Blues : " + NagMessage, Colours.Black, Colours.White, msg.user); } else if ((["necromancer", "necromance", "necromanc", "necroman", "necroma", "necrom", "necro", "necr", "nec", "ne", "n"].indexOf(cmd[1]) > -1) && (PowerUser || Modules[MagicModule].isNecromancer(msg.user) || Modules[MagicModule].isWizard(msg.user))) { var WeGotOne = false; var Sepr = ""; var OutList = ""; for (var u = 0; u < UserList.length; u++) { if (UserList[u].necromancer) { OutList += Sepr + UserList[u].name; Sepr = ","; WeGotOne = true; } } if (!WeGotOne) { Messenger.sendGenericMessage("No necromancers on list.", Colours.Red, Colours.White, msg.user); } else { Messenger.sendGenericMessage(OutList, Colours.Black, Colours.White, msg.user); } } else if ((["spam", "spa", "sp"].indexOf(cmd[1]) > -1) && PowerUser) { if (!Modules[AutoModeratorModule].isEnabled) { Messenger.sendGenericMessage("Automoderator disabled", Colours.Red, Colours.White, msg.user); } if (Modules[AutoModeratorModule].vars.tellRoomOwner) { Messenger.sendGenericMessage("Room owner is notified of unwanted messages when automoderator is activated.", Colours.Black, Colours.White, msg.user); } else { Messenger.sendGenericMessage("Room owner is NOT notified of unwanted messages when automoderator is activated.", Colours.Black, Colours.White, msg.user); } var WeGotOne = false; for (var spamMsg = 9; spamMsg > -1; spamMsg--) { if (Modules[AutoModeratorModule].vars.lastFucktard[spamMsg] != "") { Messenger.sendGenericMessage(spamMsg + " : " + Modules[AutoModeratorModule].vars.lastFucktard[spamMsg], Colours.Black, Colours.White, msg.user); WeGotOne = true; } } if (!WeGotOne) { Messenger.sendGenericMessage("No unwanted messages yet.", Colours.Red, Colours.White, msg.user); } else { if (Modules[AutoModeratorModule].vars.unwantedCount === 0) { Messenger.sendGenericMessage("Last message received at position 9", Colours.Black, Colours.White, msg.user); } else { Messenger.sendGenericMessage("Last message received at position " + (Modules[AutoModeratorModule].vars.unwantedCount - 1), Colours.Black, Colours.White, msg.user); } } } else if (["rules", "rule", "rul", "ru", "r"].indexOf(cmd[1]) > -1 && PowerUser) { if (!Modules[AutoModeratorModule].isEnabled) { Messenger.sendGenericMessage("Automoderator deactivated", Colours.Red, Colours.White, msg.user); } else { Messenger.sendGenericMessage("Automoderator activated", Colours.Green, Colours.White, msg.user); } Modules[AutoModeratorModule].AutoModeratorShow(msg); } else if ((["talk", "tal"].indexOf(cmd[1]) > -1) && PowerUser) { if (TwoWay === "") { Messenger.sendErrorMessage("No talk established.", msg.user); } else { Messenger.sendUnblockedMessage(FirstSpeaker + " <-> " + TwoWay + " in progress.", Colours.Black, Colours.White, msg.user); } } else if ((["totals", "tota", "tot", "to"].indexOf(cmd[1]) > -1) && PowerUser) { Messenger.sendGenericMessage("Blues " + BlueCount, Colours.Blue, Colours.White, msg.user); Messenger.sendGenericMessage("Greys " + GreyCount, Colours.Grey, Colours.White, msg.user); Messenger.sendGenericMessage("Necromancers " + NecromancerCount, Colours.Purple, Colours.White, msg.user); Messenger.sendGenericMessage("Wizards " + WizardCount, Colours.Orange, Colours.White, msg.user); Messenger.sendGenericMessage("And " + cb.room_slug, Colours.Red, Colours.White, msg.user); } else { Messenger.sendErrorMessage("Invalid parameter for show.", msg.user); } } else if ((["/show", "/sho", "/sh"].indexOf(cmd[0]) > -1) && (["talk", "tal"].indexOf(cmd[1]) > -1) && msg.user === TwoWay) { Messenger.sendUnblockedMessage(FirstSpeaker + " <-> " + TwoWay + " in progress.", Colours.Black, Colours.White, msg.user); // // module manager command // } else if (cmd[0] === "/mm" && PowerUser) { if (["activate", "activat", "activa", "activ", "acti", "act", "ac", "a"].indexOf(cmd[1]) > -1) { for (var z1 = 0; z1 < Modules.length; z1++) { if (cmd[2] === Modules[z1].name) { Modules[z1].isEnabled = true; Modules[z1].onEnable(); Messenger.sendGenericMessage(Modules[z1].title + " Activated", Colours.Black, Colours.White, cb.room_slug); Modules[NagModule].NotifyModerators(Modules[z1].title + " Activated", Colours.Black, Colours.White); } } } else if (["deactivate", "deactivat", "deactiva", "deactiv", "deacti", "deact", "deac", "dea", "de", "d"].indexOf(cmd[1]) > -1) { for (var z2 = 0; z2 < Modules.length; z2++) { if (cmd[2] === Modules[z2].name) { Modules[z2].isEnabled = false; if (Modules[z2].hasOnDisable) { Modules[z2].onDisable(); } Messenger.sendGenericMessage(Modules[z2].title + " Deactivated", Colours.Black, Colours.White, cb.room_slug); Modules[NagModule].NotifyModerators(Modules[z2].title + " Deactivated", Colours.Black, Colours.White); } } } else if (["list", "lis", "li", "l"].indexOf(cmd[1]) > -1) { Messenger.sendGenericMessage("Module List", Colours.Blue, Colours.White, msg.user); for (var z3 = 0; z3 < Modules.length; z3++) { Messenger.sendGenericMessage(Modules[z3].name + " - " + Modules[z3].desc + ", enabled = " + Modules[z3].isEnabled, Colours.Black, Colours.White, msg.user); } } else { Messenger.sendErrorMessage("Invalid parameter for mm.", msg.user); } // // frog command // } else if ((["/frog", "/fro", "/fr", "/f"].indexOf(cmd[0]) > -1) && Modules[MagicModule].vars.MagicEnabled) { if (Modules[MagicModule].isWizard(msg.user) || Modules[MagicModule].isNecromancer(msg.user)) { if (Modules[MagicModule].isNecromancer(msg.user)) { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } CatUser(targetUser, false); FrogUser(targetUser, true); Messenger.sendMagicMessage(msg.user + " mutters an obscure incantation, " + targetUser + " turns in to a frog.", Colours.Blue, Colours.White); } else if (getRandom() <= 0.33) { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } CatUser(targetUser, false); FrogUser(targetUser, true); Messenger.sendMagicMessage(msg.user + " mutters an obscure incantation, " + targetUser + " turns in to a frog.", Colours.Blue, Colours.White); } else { Messenger.sendMagicMessage(msg.user + " mutters an obscure incantation, but nothing happens.", Colours.Blue, Colours.White); } } else { Messenger.sendMagicMessage(msg.user + " mutters an obscure incantation, but nothing happens.", Colours.Blue, Colours.White); } // // unfrog command // } else if ((["/unfrog", "/unfro", "/unfr", "/unf"].indexOf(cmd[0]) > -1) && Modules[MagicModule].vars.MagicEnabled) { if (Modules[MagicModule].isWizard(msg.user) || Modules[MagicModule].isNecromancer(msg.user)) { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } FrogUser(targetUser, false); Messenger.sendMagicMessage(msg.user + " mutters an obscure incantation, " + targetUser + " returns to normal.", Colours.Blue, Colours.White); } else { Messenger.sendMagicMessage(msg.user + " mutters an obscure incantation, but nothing happens.", Colours.Blue, Colours.White); } // // tape command // } else if ((["/tape", "/tap"].indexOf(cmd[0]) > -1) && Modules[MagicModule].vars.MagicEnabled) { if (Modules[MagicModule].isWizard(msg.user) || Modules[MagicModule].isNecromancer(msg.user)) { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } TapeUser(targetUser, true); Messenger.sendMagicMessage(msg.user + " wraps " + targetUser + " in duct tape.", Colours.Blue, Colours.White); } else { Messenger.sendMagicMessage(msg.user + " tries to wrap " + targetUser + " in duct tape, but the reel is mysteriously empty.", Colours.Blue, Colours.White); } // // untape command // } else if ((["/untape", "/untap"].indexOf(cmd[0]) > -1) && Modules[MagicModule].vars.MagicEnabled) { if (Modules[MagicModule].isWizard(msg.user) || Modules[MagicModule].isNecromancer(msg.user)) { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } TapeUser(targetUser, false); Messenger.sendMagicMessage(msg.user + " rips the duct tape off " + targetUser + ".", Colours.Blue, Colours.White); } else { Messenger.sendMagicMessage(msg.user + " fails to get a hold of " + targetUser + ".", Colours.Blue, Colours.White); } // // cat command // } else if ((["/cat", "/ca"].indexOf(cmd[0]) > -1) && Modules[MagicModule].vars.MagicEnabled) { if (Modules[MagicModule].isWizard(msg.user) || Modules[MagicModule].isNecromancer(msg.user)) { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } FrogUser(targetUser, false); CatUser(targetUser, true); Messenger.sendMagicMessage(msg.user + " throws a ball of yarn at " + targetUser + " and they turn in to a cat.", Colours.Blue, Colours.White); } else { Messenger.sendMagicMessage(msg.user + " throws a ball of yarn at " + targetUser + " and misses.", Colours.Blue, Colours.White); } // // uncat command // } else if ((["/uncat", "/unca"].indexOf(cmd[0]) > -1) && Modules[MagicModule].vars.MagicEnabled) { if (Modules[MagicModule].isWizard(msg.user) || Modules[MagicModule].isNecromancer(msg.user)) { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } CatUser(targetUser, false); Messenger.sendMagicMessage(msg.user + " takes the ball of yarn from " + targetUser + " who then reverts to normal.", Colours.Blue, Colours.White); } else { Messenger.sendMagicMessage(msg.user + " cant catch " + targetUser + " to get the ball of yarn back.", Colours.Blue, Colours.White); } // // silence command // } else if (["/silence", "/silenc", "/silen", "/sile", "/sil", "/si"].indexOf(cmd[0]) > -1) { if (PowerUser) { if (["grey", "gre", "gr", "g"].indexOf(cmd[1]) > -1) { MuteLevel = 1; Messenger.sendUnblockedMessage("Greys silenced, their old messages are left in chat.", Colours.Blue, Colours.White); } else if (["cheap", "chea", "che", "ch", "c"].indexOf(cmd[1]) > -1) { MuteLevel = 2; Messenger.sendUnblockedMessage("Only tippers and VIPs may chat.", Colours.Blue, Colours.White); } else if (["all", "al", "a"].indexOf(cmd[1]) > -1) { MuteLevel = 3; Messenger.sendUnblockedMessage("Almost everyone is now silenced.", Colours.Blue, Colours.White); } else if (["none", "non", "no", "n"].indexOf(cmd[1]) > -1) { MuteLevel = 0; Messenger.sendUnblockedMessage("Chat is open to all.", Colours.Blue, Colours.White); } else { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } SilenceUser(targetUser, true); Messenger.sendGenericMessage(targetUser + " silenced, their old messages are left in chat, so they wont know they are muted.", Colours.Blue, Colours.White, cb.room_slug); Modules[NagModule].NotifyModerators(targetUser + " silenced, their old messages are left in chat, so they wont know they are muted.", Colours.Blue, Colours.White); } } // // unsilence command // } else if (["/unsilence", "/unsilenc", "/unsilen", "/unsile", "/unsil", "/unsi"].indexOf(cmd[0]) > -1) { if (PowerUser) { var targetUser = GetUser(cmd[1]); if (targetUser === "") { targetUser = msg.m.substring(cmd[0].length + 1, msgL, msgL); } SilenceUser(targetUser, false); Messenger.sendGenericMessage(targetUser + " unsilenced, their muted messages cannot be seen.", Colours.Blue, Colours.White, cb.room_slug); Modules[NagModule].NotifyModerators(targetUser + " unsilenced, their muted messages cannot be seen.", Colours.Blue, Colours.White); } // // goal command // } else if (["/goal", "/goa", "/go", "/g"].indexOf(cmd[0]) > -1) { if (["list", "lis", "li", "l"].indexOf(cmd[1]) > -1) { if ((["all", "al", "a"].indexOf(cmd[2]) > -1) && PowerUser) { Modules[MultiGoalModule].listGoals(); } else { Modules[MultiGoalModule].listGoals(msg.user); } } else if ((["reset", "rese", "res", "re", "r"].indexOf(cmd[1]) > -1) && PowerUser) { if (["tips", "tip", "ti", "t"].indexOf(cmd[2]) > -1) { Modules[MultiGoalModule].vars.GoalTips = 0; Modules[MultiGoalModule].setCurrentGoal(); Messenger.sendGenericMessage("Goal tip total reset, type /goal list to view current goals.", Colours.Blue, Colours.White); } else { for (var z4 = 0; z4 < 10; z4++) { Modules[MultiGoalModule].vars.currentGoal[z4] = Modules[MultiGoalModule].vars.currentGoalDefault[z4]; Modules[MultiGoalModule].vars.currentGoalTips[z4] = Modules[MultiGoalModule].vars.currentGoalTipsDefault[z4]; } Modules[MultiGoalModule].vars.currentMaxGoals = Modules[1].vars.currentMaxGoalsDefault; Modules[MultiGoalModule].vars.currentGoalMet = false; Modules[MultiGoalModule].vars.GoalTips = 0; Modules[MultiGoalModule].setCurrentGoal(); Messenger.sendGenericMessage("Goal reset, type /goal list to view current goals.", Colours.Blue, Colours.White); } } else if ((["max", "ma", "m"].indexOf(cmd[1]) > -1) && typeof parseInt(cmd[2]) === "number" && PowerUser) { if (cmd[2] < 11) { if (cmd[2] > 0) { Modules[MultiGoalModule].vars.currentMaxGoals = cmd[2]; Modules[MultiGoalModule].setCurrentGoal(); Modules[MultiGoalModule].listGoals(msg.user); } else { Messenger.sendErrorMessage("Improper goal maximum, from 1 to 10.", msg.user); } } else { Messenger.sendErrorMessage("Improper goal maximum, from 1 to 10.", msg.user); } } else if ((["text", "tex", "te"].indexOf(cmd[1]) > -1) && typeof parseInt(cmd[2]) === "number" && PowerUser) { if (parseInt(cmd[2]) > 0 && parseInt(cmd[2]) < 11) { if (parseInt(cmd[2]) <= Modules[MultiGoalModule].vars.currentMaxGoals) { var temp = (parseInt(cmd[2]) <= 9) ? 0 : 1; Modules[MultiGoalModule].vars.currentGoal[parseInt(cmd[2]) - 1] = msg.m.substring(cmd[0].length + cmd[1].length + cmd[2].length+ 3 + temp, msgL); Modules[MultiGoalModule].setCurrentGoal(); Modules[MultiGoalModule].listGoals(msg.user); } else { Messenger.sendErrorMessage("Improper goal number" + cmd[2] + ", current maximum is " + Modules[MultiGoalModule].vars.currentMaxGoals + ".", msg.user); } } else { Messenger.sendErrorMessage("Improper goal, range is from 1 to 10.", msg.user); } } else if ((cmd[1] === "tip" || cmd[1] === "ti") && typeof parseInt(cmd[2]) === "number" && typeof parseInt(cmd[3]) === "number" && PowerUser) { if (parseInt(cmd[2]) > 0 && parseInt(cmd[2]) < 11) { if (parseInt(cmd[3]) > 0) { if (parseInt(cmd[2]) <= Modules[MultiGoalModule].vars.currentMaxGoals) { Modules[MultiGoalModule].vars.currentGoalTips[parseInt(cmd[2]) - 1] = cmd[3]; Modules[MultiGoalModule].setCurrentGoal(); Modules[MultiGoalModule].listGoals(msg.user); } else { Messenger.sendErrorMessage("Improper goal number " + cmd[2] + ", range is from 1 to 10, current maximum is " + Modules[MultiGoalModule].vars.currentMaxGoals + ".", msg.user); } } else { Messenger.sendErrorMessage("Improper tip " + cmd[3] + ", must be above 0.", msg.user); } } else { Messenger.sendErrorMessage("Improper goal number" + cmd[2] + ", range is from 1 to 10.", msg.user); } } else { Messenger.sendErrorMessage("Improper params! Params: list, reset, tip <n> <amount> or <n> <tip text>, <n> can be from 1 to " + Modules[MultiGoalModule].vars.currentMaxGoals + ".", msg.user); } } else { Messenger.sendErrorMessage("You never made this command!", msg.user); } } } function OnDraw() { return { "template": "3_rows_11_21_31", "row1_value": Row1, "row2_value": Row2, "row3_value": Row3 }; /* if (TotalTips === 0) { return { "template": "3_rows_11_21_31", "row1_value": Row1, "row2_value": Row2, "row3_value": Row3 }; } else { return { "template": "3_rows_11_21_31", "row1_value": "Love Shown: " + TotalTips + ((TotalTips == 1) ? " Token" : " Tokens"), "row2_value": Row2, "row3_value": Row3 }; } */ } function ClearUserList() { // Messenger.sendGenericMessage("Clear user List called.", Colours.Black); for (var i = 0; i < UserList.length; i++) { // Messenger.sendGenericMessage("Start Blue " + i + " " + UserList[i].name + ", boring " + UserList[i].boring_blue + ", Left " + UserList[i].they_left + ", Rank " + UserList[i].weighting + ", Tkn " + UserList[i].has_tokens,Colours.Blue, Colours.White, cb.room_slug); UserList[i].weighting--; if (!UserList[i].frog && !UserList[i].ducttape && !UserList[i].silence && !UserList[i].cat && !UserList[i].wizard && !UserList[i].necromancer && !UserList[i].automoderated && !UserList[i].is_a_fan && !UserList[i].moderator) { // only get rid of greys and blues, tips keep blues weighting high, talk keeps blues and greys weighting high so they dont get removed if (UserList[i].weighting <= 0) { // only those users who arent interracting if (UserList[i].has_tokens && !UserList[i].boring_blue) { // alert rom owner we have a freeloading boring blue // Messenger.sendGenericMessage("Tell Blue " + i + " " + UserList[i].name + ", boring " + UserList[i].boring_blue + ", Left " + UserList[i].they_left + ", Rank " + UserList[i].weighting,Colours.DarkGreen, Colours.White, cb.room_slug); if (!UserList[i].they_left) { if (Modules[NagModule].vars.doWeNag) { Messenger.sendGenericMessage("Blue " + UserList[i].name + " has not talked or tipped for " + delayToNag + " minutes.",Colours.Black, Colours.Red, cb.room_slug); Modules[NagModule].NotifyModerators("Blue " + UserList[i].name + " has not talked or tipped for " + delayToNag + " minutes.",Colours.Black, Colours.Red); } UserList[i].boring_blue = true; } } if (UserList[i].has_tokens && UserList[i].boring_blue) { // nag the dead blue to type or tip (if UI allows for it in the future, turn off their video) with this message if (Modules[NagModule].vars.doWeNag) { Messenger.sendGenericMessage(UserList[i].name + ": " + NagMessage,Colours.Black, Colours.Red, UserList[i].name); } UserList[i].weighting = delayBetweenNag; // give them a fair pause before repeating the nag // Messenger.sendGenericMessage("Nag Blue " + i + " " + UserList[i].name + ", boring " + UserList[i].boring_blue + ", Left " + UserList[i].they_left + ", Rank " + UserList[i].weighting,Colours.Purple, Colours.White, cb.room_slug); } else if ((UserList[i].has_tokens && UserList[i].they_left) || (!UserList[i].has_tokens)) { // dead greys or blues who have left // Messenger.sendGenericMessage("Del Blue " + i + " " + UserList[i].name + ", boring " + UserList[i].boring_blue + ", Left " + UserList[i].they_left + ", Rank " + UserList[i].weighting,Colours.Cyan, Colours.White, cb.room_slug); UserList = cbjs.arrayRemove(UserList, UserList[i]); i--; } } } // Messenger.sendGenericMessage("End Blue " + i + " " + UserList[i].name + ", boring " + UserList[i].boring_blue + ", Left " + UserList[i].they_left + ", Rank " + UserList[i].weighting,Colours.Black, Colours.White, cb.room_slug); // } } cb.setTimeout(ClearUserList, 60000); // every minute } function onEnter(user) { if (user.is_mod || user.has_tokens || user.tipped_recently || user.tipped_alot_recently || user.tipped_tons_recently || user.in_fanclub) { // this user is a mod or has tokens, keep track of them AddUser(user.user,user.is_mod,user.has_tokens || user.tipped_recently || user.tipped_alot_recently || user.tipped_tons_recently,user.in_fanclub); ResetUser(user.user, delayToNag, false, false); } if (isBroadcaster(user['user'])) { // broadcasters are necromancers // Messenger.sendGenericMessage("There is a loud explosion, " + user['user'] + " (Necromancer) appears out of thin air.", Colours.DarkViolet, Colours.White); Modules[MagicModule].SetNecromancer(user['user'], true); } if (Modules[MagicModule].isNecromancer(user['user'])) { // returning or new necromancer if ((user['user'] === "smokersexual") || (user['user'] === "lagunadistortion")) { Messenger.sendMagicMessage(user['user'] + " (Necromancer) comes back from the shops with a carton of ciggys.", Colours.DarkViolet, Colours.White); } else if (user['user'] === "champd") { Messenger.sendMagicMessage(user['user'] + " (Necromancer) comes back from the kitchen with a gallon of coffee.", Colours.DarkViolet, Colours.White); } else{ Messenger.sendMagicMessage("There is a loud explosion, " + user['user'] + " (Necromancer) arrives.", Colours.Purple, Colours.White); } } else if (Modules[MagicModule].isWizard(user['user'])) { // returning or new wizard Messenger.sendMagicMessage("As if by magic, " + user['user'] + " (Wizard) appears.", Colours.Orange, Colours.White); } else { // muggle (blue or grey) var muteLevelText = ""; if (MuteLevel == 1) { muteLevelText = ": Most grey chat currently muted"; } else if (MuteLevel == 2) { muteLevelText = ": Please tip to chat, most other chatters muted"; } else if (MuteLevel == 3) { muteLevelText = ": Room owner, Moderators, and VIPs chat only"; } Messenger.sendMagicMessage("Welcome " + user['user'] + muteLevelText + "!", Colours.Black, Colours.White, user['user']); if ((user.is_mod || isBroadcaster(user['user']) || isScriptAuthor(user['user'])) && Modules[NagModule].vars.doWeNag) { Messenger.sendGenericMessage("Inactive Blue monitoring messages in this colour may appear.", Colours.Black, Colours.Red, user['user']); } if (user.has_tokens || user.tipped_recently || user.tipped_alot_recently || user.tipped_tons_recently || user.in_fanclub) { if (cb.settings.BlueWelcome) { Messenger.sendGenericMessage(cb.settings.BlueWelcome, Colours.Black, Colours.White, user['user']); } BlueCount++; } else { if (cb.settings.GreyWelcome) { Messenger.sendGenericMessage(cb.settings.GreyWelcome, Colours.Black, Colours.White, user['user']); } GreyCount++; } } } function onLeave(user) { if (Modules[MagicModule].isNecromancer(user['user'])) { // exit room for necromancer if ((user['user'] === "smokersexual") || (user['user'] === "lagunadistortion")) { Messenger.sendMagicMessage("The last cigarette is smoked, " + user['user'] + " (Necromancer) goes to the shop to buy more.", Colours.DarkViolet, Colours.White); } else if (user['user'] === "champd") { Messenger.sendMagicMessage("The coffee cup is empty, " + user['user'] + " (Necromancer) goes to the kitchen to make more.", Colours.DarkViolet, Colours.White); } else { Messenger.sendMagicMessage("There is a loud explosion, " + user['user'] + " (Necromancer) vanishes.", Colours.Purple, Colours.White); } } else if (Modules[MagicModule].isWizard(user['user'])) { // exit room for wizard Messenger.sendMagicMessage("There is a loud pop, " + user['user'] + " (Wizard) disappears.", Colours.Orange, Colours.White); } else { // muggle (blue or grey) if (user.has_tokens || user.tipped_recently || user.tipped_alot_recently || user.tipped_tons_recently || user.in_fanclub) { BlueCount--; ResetUser(user['user'], delayToNag, true, false); // put them on a countdown } else { GreyCount--; } } } function Init() { // unknown why UserList is populated with 12 lines of garbage instead of initialised blank, but it is, so clear it. UserList = cbjs.arrayRemove(UserList, UserList[17]); UserList = cbjs.arrayRemove(UserList, UserList[16]); UserList = cbjs.arrayRemove(UserList, UserList[15]); UserList = cbjs.arrayRemove(UserList, UserList[14]); UserList = cbjs.arrayRemove(UserList, UserList[13]); UserList = cbjs.arrayRemove(UserList, UserList[12]); UserList = cbjs.arrayRemove(UserList, UserList[11]); UserList = cbjs.arrayRemove(UserList, UserList[10]); UserList = cbjs.arrayRemove(UserList, UserList[9]); UserList = cbjs.arrayRemove(UserList, UserList[7]); UserList = cbjs.arrayRemove(UserList, UserList[7]); UserList = cbjs.arrayRemove(UserList, UserList[6]); UserList = cbjs.arrayRemove(UserList, UserList[5]); UserList = cbjs.arrayRemove(UserList, UserList[4]); UserList = cbjs.arrayRemove(UserList, UserList[3]); UserList = cbjs.arrayRemove(UserList, UserList[2]); UserList = cbjs.arrayRemove(UserList, UserList[1]); UserList = cbjs.arrayRemove(UserList, UserList[0]); nextUID = 1; AddUser(cb.room_slug,true,false,false); Modules[StealthModule].onEnable(); if (cb.settings.AppOrBot === "App") { AppMode = true; } else { AppMode = false; Modules[StealthModule].vars.RowUpdateVisible = false; } HashTagString = cb.settings.HashTags; if (cb.room_slug != "lagunadistortion") { SlugName = cb.room_slug; EmptyTipMsg = "Nobody Loves " + SlugName + " :/"; Row1 = "Nobody Loves " + SlugName + " :/"; Row1_Default = "Nobody Loves " + SlugName + " :/"; } if (cb.room_slug === "smokersexual") { SlugName = "Smoker"; EmptyTipMsg = "Nobody Loves " + SlugName + " :/"; Row1 = "Nobody Loves " + SlugName + " :/"; Row1_Default = "Nobody Loves " + SlugName + " :/"; } if (cb.settings.FMIEnabled === "Yes") { Modules[FMIModule].isEnabled = true; Modules[FMIModule].onEnable(); } else { Modules[FMIModule].isEnabled = false; } if (cb.settings.MagicFlag === "Yes Visible") { Modules[StealthModule].vars.MagicUserVisible = true; Modules[MagicModule].isEnabled = true; Modules[MagicModule].onEnable(); } else if (cb.settings.MagicFlag === "Yes Invisible") { Modules[StealthModule].vars.MagicUserVisible = false; Modules[MagicModule].isEnabled = true; Modules[MagicModule].onEnable(); } else { Modules[MagicModule].isEnabled = false; } if (cb.settings.WizardList) { var WizardList = cb.settings.WizardList.replace(/\s+/, ",").split(','); for (var wizcount = 0; wizcount <= WizardList.length - 1; wizcount++) { AddUser(WizardList[wizcount],false,false,false); Modules[MagicModule].SetWizard(WizardList[wizcount], true); } } if (cb.settings.NecromancerList) { var NecroList = cb.settings.NecromancerList.replace(/\s+/, ",").split(','); for (var neccount = 0; neccount <= NecroList.length - 1; neccount++) { AddUser(NecroList[neccount],false,false,false); Modules[MagicModule].SetNecromancer(NecroList[neccount], true); } } if (cb.settings.FrogList) { var FrogList = cb.settings.FrogList.replace(/\s+/, ",").split(','); for (var frogcount = 0; frogcount <= FrogList.length - 1; frogcount++) { AddUser(FrogList[frogcount],false,false,false); FrogUser(FrogList[frogcount], true); } } if (cb.settings.TapeList) { var TapeList = cb.settings.TapeList.replace(/\s+/, ",").split(','); for (var tapecount = 0; tapecount <= TapeList.length - 1; tapecount++) { AddUser(TapeList[tapecount],false,false,false); TapeUser(TapeList[tapecount], true); } } if (cb.settings.SilenceList) { var SilenceList = cb.settings.SilenceList.replace(/\s+/, ",").split(','); for (var silencecount = 0; silencecount <= SilenceList.length - 1; silencecount++) { AddUser(SilenceList[silencecount],false,false,false); SilenceUser(SilenceList[silencecount], true); NiceUser(SilenceList[silencecount], false); // assume a silenced user is not a nice person, can be made a nice person by adding to the nice list too } } if (cb.settings.NiceList) { var NiceList = cb.settings.NiceList.replace(/\s+/, ",").split(','); for (var nicecount = 0; nicecount <= NiceList.length - 1; nicecount++) { AddUser(NiceList[nicecount],false,false,false); NiceUser(NiceList[nicecount], true); } } if (cb.settings.AutomoderatorFlag === "Yes") { Modules[AutoModeratorModule].isEnabled = true; Modules[AutoModeratorModule].onEnable(); } else { Modules[AutoModeratorModule].isEnabled = false; } if (cb.settings.ErrorFlag === "Yes") { Modules[StealthModule].vars.ErrorVisible = true; } else { Modules[StealthModule].vars.ErrorVisible = false; } if (cb.settings.AuthorFlag === "Yes Visible") { Modules[AuthorModule].isEnabled = true; Modules[StealthModule].vars.AuthorModeVisible = true; Modules[AuthorModule].onEnable(); } else if (cb.settings.AuthorFlag === "Yes Invisible") { Modules[AuthorModule].isEnabled = true; Modules[StealthModule].vars.AuthorModeVisible = false; Modules[AuthorModule].onEnable(); } else { Modules[AuthorModule].isEnabled = false; } if (cb.settings.UpdateSubject === "Yes") { ShowTipInTitle = true; } else { ShowTipInTitle = false; } if (cb.settings.HighestTipper === "Yes") { show.highestTotal = true; } else { show.highestTotal = false; } Modules[MultiGoalModule].vars.currentMaxGoals = cb.settings.NumberOfGoals; for (var goalcount = 1; goalcount <= cb.settings.NumberOfGoals; goalcount++) { Modules[MultiGoalModule].vars.currentGoalTips[goalcount - 1] = eval('cb.settings.goal_' + goalcount + '_tokens'); Modules[MultiGoalModule].vars.currentGoal[goalcount - 1] = eval('cb.settings.goal_' + goalcount + '_description'); } if (cb.settings.GoalEnabled === "Yes") { Modules[MultiGoalModule].isEnabled = true; Modules[MultiGoalModule].onEnable(); Modules[MultiGoalModule].setCurrentGoal(); } // this to replace the nag module one day if (cb.settings.NagBlues == "Yes with nag message") { Modules[NagModule].vars.doWeNag = true; delayToNag = cb.settings.BoringBlueStart; delayBetweenNag = cb.settings.BoringBlueInterval; NagMessage = cb.settings.BoringBlueMessage; } else { Modules[NagModule].vars.doWeNag = false; } // now it should be empty, number of lines of garbage = number of fields in the object UserList so.. a way to define arrays of objects without putting garbage in is required // likewise DugeonList and ConferenceroomList DungeonList = cbjs.arrayRemove(DungeonList, DungeonList[0]); ConferenceroomList = cbjs.arrayRemove(ConferenceroomList, ConferenceroomList[0]); Modules[MagicModule].SetNecromancer(cb.room_slug, true); StartRequest = cb.settings.RequestPrice; cb.onEnter(onEnter); cb.onLeave(onLeave); cb.onTip(OnTip); cb.onMessage(OnMessage); if (AppMode) { cb.onDrawPanel(OnDraw); } if (Modules[StealthModule].vars.RowUpdateVisible && AppMode) { cb.drawPanel(); } for (i = 1; i <= 5; i++) { switch (i) { case 1: Messenger.sendInfoMessage("App/Bot: " + AppName); break; case 2: Messenger.sendInfoMessage("Dev Team: " + DevTeam.Name); break; case 3: Messenger.sendInfoMessage("CEO: " + DevTeam.CEO); break; case 4: Messenger.sendInfoMessage("First Lady: " + DevTeam.FirstLady); break; case 5: Messenger.sendInfoMessage("Head Dev: " + DevTeam.HeadDev); } } if (AppMode) { cb.changeRoomSubject(cb.settings.RoomTitle + " " + HashTagString); } cb.setTimeout(ClearUserList, 60000); // every minute } Init();
© Copyright Chaturbate 2011- 2026. All Rights Reserved.