Bots Home
|
Create an App
Sophys family
Author:
fmcute__sophy
Description
Source Code
Launch Bot
Current Users
Created by:
Fmcute__Sophy
/************************************************************* ** ** Title: Sophys Family ** Authors: friendlymatt@cb ** ** Version: See variables botVersion and botDate below ** First Version: Jun 25, 2018 ** Description: Chat bot for use by sophy_lovee - chaturbate.com/sophy_lovee ** ** Based on Mell's Loyal Family bot from noiett ** *************************************************************/ /* Features: Spam filter based on username patterns - adds user to filter list upon entering the room if in pattern list (^^ awesome for stopping spam "bots" that use naming patterns to create new accounts after being silenced) Tip menu Family members can use color and view level commands model and mods can paint users with colors allow mods/broadcaster to change foreground and background colors can use color names or hashcodes Keeps track of all tips Show tip scoreboard (all tips) Announce top X tippers (public) Send tippers lists to self (private) Manage users in groups: Friends, Family, Lovers, Fiances, Husbands Allow Mods to use commands Special user greetings Greetings for group members Gender Emotes (male, female, couple, trans) or custom icon for special users User timeouts (forever or specified time) Spam blocker, blocks advertisments from grey users Auto timeout for grey that demand, ask for pm, ask to view cam, etc Emote blocker for grey users Select background colors for group users Thank you note for tippers, custom message for certain tip amounts Automatically add user to group for specific tip amounts and send reminder to model to add them in config Flood control to stop timeout users from flooding the room with notices 2 custom notifications with selectable time delay Send public room notice Send notice to all mods Send private notice to broadcaster If used by another model sends exclusive notice to them at startup, also tells each user as they enter. */ /* * Setup vars */ var daystobday = daysUntilNext(5, 8); var botVersion = "1.3"; var botDate = "Mar 28, 2019"; var botName = "Sophys Family Bot"; var botTitle = "\n" + botName + " ver " + botVersion + " last updated " + botDate + "\nCreated by friendlymatt\n"; var lastMessgeTime = 0; var lastMessageName = ""; var timeoutMessages = new Array(); var timeoutReleaseArray = new Array(); var spamPatternArray = new Array(); var userObject = {}; var specialLines = new Array(); var specialNames = new Array(); var tempString = ""; var tempNum = 0; var tempArray = new Array(); var modelName = cb.room_slug; var isSophysRoom = (modelName == 'sophyy_lovee' || modelName == 'sophy_lovee' || modelName == 'cute__sophy' || modelName == 'puss_in_boots69'); var msgNotify = ""; var msgPublic = ""; var msgPrivate = ""; var msgModel = ""; var msgMod = ""; var groupColor = "#FFFFFF"; var autoNotice1Text = ""; var autoNotice2Text = ""; var botTrigger = "/sophybot"; var botTrigger2 = "/sb"; var timeoutReleaseInterval = 1; var modCommands = true; var fanCommands = false; var userGreets = true; var mvpTipped = 499; var mvpName = ""; /* Check later: userBalls */ var userBalls = true; var genderEmotes = true; var allowGreyEmotes = true; var noGreyChat = false; /* Check later: colors */ var botMsgBg = '#EE82EE'; /*'#BDDEDC';*/ var botAlertBg = '#D32B2B'; var botNoteBg = '#99FF66'; var botAlert2Bg = '#CCFF00'; var bdayNoticeText = "It's Sophys birthday \n Wish Sophy a happy birthday with a tip! \n"; /* Check later: tipmenu as array */ var tipMenu = "Join Sophys Family! Tip 555 to join the family, 1111 to be my lover, 1666 to be my fiance, or 2222 to be my husband!\n\n" + "25...... PM\n" + "35...... Flash Boobs\n" + "45...... Flash Ass\n" + "50...... Flash Pussy\n" + "55...... Lovense waves pattern\n" + "66...... Lovense random level\n" + "80...... Finger Ass\n" + "95...... Buttplug\n" + "101..... Lovense Pulse Pattern\n" + "102..... Lovense Earthquake Pattern\n" + "103..... Lovense Firework Pattern\n" + "500..... Custom Video\n" + "See Bio for more options!\n"; var tipMenuArray = new Array(); tipMenuArray[25] = "PM"; tipMenuArray[35] = "Flash Boobs"; tipMenuArray[45] = "Flash Ass" tipMenuArray[50] = "Flash Pussy" tipMenuArray[55] = "Lovense waves pattern" tipMenuArray[56] = "Finger Pussy" tipMenuArray[66] = "Lovense randomly choose a level" tipMenuArray[67] = "Change Pantyhose" tipMenuArray[77] = "Watch your Cam" tipMenuArray[80] = "Finger Ass" tipMenuArray[95] = "Buttplug" tipMenuArray[101] = "Lovense Pulse Pattern" tipMenuArray[102] = "Lovense Earthquake Pattern" tipMenuArray[103] = "Lovense Firework Pattern" tipMenuArray[500] = "Custom Video"; var helpMsg = " may use the following commands:\n" + botTrigger + " view [family] = list of level users\n" + botTrigger + " add [family] [username] = add username to level\n" + botTrigger + " del [family] [username] = delete username from level\n" + botTrigger + " check [username] = show what level a user is in\n" + botTrigger + " tipmenu [all] = show tipmenu private or to all\n" + botTrigger + " mods [on/off] = turns on/off mod commands\n" + botTrigger + " greyemotes [on/off] = turns on/off grey emotes\n" + botTrigger + " tag [tag text] = set your own tag\n" + botTrigger + " settag [username] [tag text] = set a user\'s tag\n" + botTrigger + " note [message] = send a public message to chat\n" + botTrigger + " sophynote [message] = send a private message to Sophy\n" + botTrigger + " modnote [message] = send a private message to mods\n" + botTrigger + " greets [on/off] = turns on/off level user greetings\n" + botTrigger + " tips = show all tippers (private)\n" + botTrigger + " tips # = show top # tippers (private)\n" + botTrigger + " paint [username] [text] [bg] = change a user\'s colors\n" + botTrigger + " colors [text] [bg] = change text and bg color\n" + botTrigger + " colors reset = reset colors to b/w\n" + botTrigger + " text [color] = change text color\n" + botTrigger + " bg [color] = change background color\n" + botTrigger + " spamhelp = show spam filter help\n" + botTrigger + " status = show bot status\n" + "*** NOTE: To make names stick add them in the bot config."; var spamMsg = " Spam Filter Help\n" + "You may add usernames, partial username, or patterns found in usersname to the filter.\n" + "When users enter their names are check against the filter. If a match is found they are automatically " + "added to the Spammer list and their messages will be blocked.\n" + botTrigger + " add pattern [pattern/name] = add a pattern/name to filter\n" + botTrigger + " del pattern [pattern/name] = delete a pattern/name from filter\n" + botTrigger + " add spammer [username] = add user to the Spammer list\n" + botTrigger + " del spammer [username] = delete user from the Spammer list\n"; specialLines = new Array(); specialNames = new Array(); timeoutMessages[1]= '[TIMEOUT] You\'re in timeout, other\'s can\'t see what you\'re typing.'; timeoutMessages[2]= '[TIMEOUT] Give it up no one can read what you\'re typing...'; timeoutMessages[3]= '[TIMEOUT] Keep typing no one can read it!'; timeoutMessages[4]= '[TIMEOUT] Why do you keeping typing? No one can see it!'; timeoutMessages[5]= '[TIMEOUT] Can\'t you read? You\'re in timeout, you can\'t type!'; timeoutMessages[6]= '[TIMEOUT] I can\'t type cuz I laba too much!'; timeoutMessages[7]= '[TIMEOUT] I\'m typing something really stupid right now too bad no one can read it!'; timeoutMessages[8]= '[TIMEOUT] I\'m such an idiot! Why do I keep typing?'; /* * Settings */ cb.settings_choices = [ { name: 'allowGreyEmotes', type: 'choice', label: 'Allow GREY Graphics?', choice1: 'Yes', choice2: 'No', defaultValue: 'Yes' }, { name: 'genderEmotes', type: 'choice', label: 'Show gender of users in chat?', choice1: 'Yes', choice2: 'No', defaultValue: 'Yes' }, { name: 'autoNotice1', label: 'Notification Message 1, use text and emotes', type: 'str', minLength: 0, maxLength: 512, required: false, defaultValue: '' }, { name: 'autoNotice1Interval', label: 'Show Notification 1 Every x Minutes', type: 'choice', choice1: 2, choice2: 4, choice3: 6, choice4: 8, choice5: 10, choice6: 12, choice7: 14, choice8: 16, choice9: 18, choice10: 20, choice11: 30, defaultValue: 4 }, { name: 'autoNotice2', label: 'Notification Message 2, use text and emotes', type: 'str', minLength: 0, maxLength: 512, required: false, defaultValue: '' }, { name: 'autoNotice2Interval', label: 'Show Notification 2 Every x Minutes', type: 'choice', choice1: 2, choice2: 4, choice3: 6, choice4: 8, choice5: 10, choice6: 12, choice7: 14, choice8: 16, choice9: 18, choice10: 20, choice11: 30, defaultValue: 6 }, { name: 'announceTippersInterval', label: 'Show Top 3 Tippers Every x Minutes (0=off)', type: 'choice', choice1: 0, choice2: 5, choice3: 10, choice4: 15, choice5: 20, choice6: 25, choice7: 30, defaultValue: 20 }, { name: 'modCommands', type: 'choice', label: 'Allow Moderators to use commands?', choice1: 'Yes', choice2: 'No', defaultValue: 'Yes' }, { name: 'userGreets', type: 'choice', label: 'Make special user announcements and emotes when they enter?', choice1: 'Yes', choice2: 'No', defaultValue: 'No' }, { name: 'userBalls', type: 'choice', label: 'Add balls to Sophys Family members\' messages?', choice1: 'Yes', choice2: 'No', defaultValue: 'No' }, { name: 'friendTag', label: '*** FRIENDS *** *** *** Tag for Friend (non-tippers) users', type: 'str', minLength: 0, maxLength: 25, required: true, defaultValue: '[Friend]' }, { name: 'friendList', label: 'List of Friend users, separated by space (their CB usernames exactly)', type: 'str', minLength: 0, maxLength: 10240, required: false, defaultValue: '' }, { name: 'friendColor', label: 'Highlight color to use for Friend users', type: 'choice', choice1: 'White FFFFFF', choice2: 'Aqua 7FFFD4', choice3: 'LtBrown F4A460', choice4: 'Cyan E0FFFF', choice5: 'Gold EEE8AA', choice6: 'Yellow FFF68F', choice7: 'Slate C6E2FF', choice8: 'Pink FFF0F5', choice9: 'Orange FFD39B', choice10: 'Mint BDFCC9', choice11: 'Grey F2F2F2', choice12: 'Plum CD96CD', defaultValue: 'White FFFFFF' }, { name: 'familyTag', label: '*** FAMILY *** *** *** Tag for Family users', type: 'str', minLength: 0, maxLength: 25, required: true, defaultValue: '[Family]' }, { name: 'familyList', label: 'List of Family users, separated by space (their CB usernames exactly)', type: 'str', minLength: 0, maxLength: 10240, required: false, defaultValue: '' }, { name: 'familyColor', label: 'Highlight color to use for Family users', type: 'choice', choice1: 'White FFFFFF', choice2: 'Aqua 7FFFD4', choice3: 'LtBrown F4A460', choice4: 'Cyan E0FFFF', choice5: 'Gold EEE8AA', choice6: 'Yellow FFF68F', choice7: 'Slate C6E2FF', choice8: 'Pink FFF0F5', choice9: 'Orange FFD39B', choice10: 'Mint BDFCC9', choice11: 'Grey F2F2F2', choice12: 'Plum CD96CD', defaultValue: 'White FFFFFF' }, { name: 'loverTag', label: '*** LOVERS *** *** *** Tag for Lovers users', type: 'str', minLength: 0, maxLength: 25, required: true, defaultValue: '[Lover]' }, { name: 'loverList', label: 'List of Lovers users, separated by space (their CB usernames exactly)', type: 'str', minLength: 0, maxLength: 10240, required: false, defaultValue: '' }, { name: 'loverColor', label: 'Highlight color to use for Lover users', type: 'choice', choice1: 'White FFFFFF', choice2: 'Aqua 7FFFD4', choice3: 'LtBrown F4A460', choice4: 'Cyan E0FFFF', choice5: 'Gold EEE8AA', choice6: 'Yellow FFF68F', choice7: 'Slate C6E2FF', choice8: 'Pink FFF0F5', choice9: 'Orange FFD39B', choice10: 'Mint BDFCC9', choice11: 'Grey F2F2F2', choice12: 'Plum CD96CD', defaultValue: 'White FFFFFF' }, { name: 'fianceTag', label: '*** FIANCES *** *** *** Tag for Fiance users', type: 'str', minLength: 0, maxLength: 25, required: true, defaultValue: '[Fiance]' }, { name: 'fianceList', label: 'List of Fiance users, separated by space (their CB usernames exactly)', type: 'str', minLength: 0, maxLength: 10240, required: false, defaultValue: '' }, { name: 'fianceColor', label: 'Highlight color to use for Fiance users', type: 'choice', choice1: 'White FFFFFF', choice2: 'Aqua 7FFFD4', choice3: 'LtBrown F4A460', choice4: 'Cyan E0FFFF', choice5: 'Gold EEE8AA', choice6: 'Yellow FFF68F', choice7: 'Slate C6E2FF', choice8: 'Pink FFF0F5', choice9: 'Orange FFD39B', choice10: 'Mint BDFCC9', choice11: 'Grey F2F2F2', choice12: 'Plum CD96CD', defaultValue: 'White FFFFFF' }, { name: 'husbandTag', label: '*** HUSBANDS *** *** *** Tag for Husband users', type: 'str', minLength: 0, maxLength: 25, required: true, defaultValue: '[Husband]' }, { name: 'husbandList', label: 'List of Husband users, separated by space (their CB usernames exactly)', type: 'str', minLength: 0, maxLength: 10240, required: false, defaultValue: '' }, { name: 'husbandColor', label: 'Highlight color to use for Husband users', type: 'choice', choice1: 'White FFFFFF', choice2: 'Aqua 7FFFD4', choice3: 'LtBrown F4A460', choice4: 'Cyan E0FFFF', choice5: 'Gold EEE8AA', choice6: 'Yellow FFF68F', choice7: 'Slate C6E2FF', choice8: 'Pink FFF0F5', choice9: 'Orange FFD39B', choice10: 'Mint BDFCC9', choice11: 'Grey F2F2F2', choice12: 'Plum CD96CD', defaultValue: 'White FFFFFF' }, { name: 'spamPatternList', label: 'List spam names to automatically block (fullname or partial)', type: 'str', minLength: 0, maxLength: 10240, required: false, defaultValue: '' }, { name: 'announceTipmenuInterval', label: 'Show Tipmenu Every x Minutes (0=off)', type: 'choice', choice1: 0, choice2: 5, choice3: 10, choice4: 15, choice5: 20, choice6: 25, choice7: 30, defaultValue: 10 } ]; function initUserObject(name) { if (!userObject[name]) { //nope add them userObject[name] = { username: name, tag: "", tips: 0 }; } } /* * handle tips from users */ cb.onTip(function (tip) { var divStr = ""; var msgText = ""; var msgNotify = ""; var tipAmount = parseInt(tip['amount']); var tipResult = ""; var name = tip['from_user']; var modelName = cb.room_slug; // is user in tipper array? initUserObject(name); msgPublic = ""; userObject[name].tips += tipAmount; if (userObject[name].tips > mvpTipped) { mvpTipped = userObject[name].tips; if (mvpName != name) { mvpName = name; msgPublic = 'All hail to new MVP ' + name + ' :king_crown_small !!\n\n'; } } switch(tipAmount) { case 2222: delUserFromAll(name); result = addUser("husband", name); msgPublic = name + ' is now ' + modelName + '\'s Husband!!! Thank you for your tip!'; msgModel = modelName + ', don\'t forget to add ' + name + ' to Husbands in the bot config!'; break; case 1666: if (!userInArray ("husband", name) ) { delUserFromAll(name); result = addUser("fiance", name); msgPublic = name + ' is now ' + modelName + '\'s Fiance!!! Thank you for your tip!'; msgModel = modelName + ', don\'t forget to add ' + name + ' to Fiances in the bot config!'; } else { msgPublic = name + ' already has a higher status than Fiance! Status not changed. Thank you for your tip!'; } break; case 1111: if (!userInArray ("husband", name) && !userInArray ("fiance", name)) { delUserFromAll(name); result = addUser("lover", name); msgPublic = name + ' is now ' + modelName + '\'s Lover!!! Thank you for your tip!'; msgModel = modelName + ', don\'t forget to add ' + name + ' to Lovers in the bot config!'; } else { msgPublic = name + ' already has a higher status than Lover! Status not changed. Thank you for your tip!'; } break; case 555: if (!userInArray ("husband", name) && !userInArray ("fiance", name) && !userInArray ("lover", name)) { delUserFromAll(name); result = addUser("family", name); msgPublic = name + ' is now in ' + modelName + '\'s Family!!! Thank you for your tip!'; msgModel = modelName + ', don\'t forget to add ' + name + ' to Family in the bot config!'; } else { msgPublic = name + ' already has a higher status than Family! Status not changed. Thank you for your tip!'; } break; default: tipResult = tipMenuArray[tipAmount]; if (typeof tipResult == 'undefined') { if ((tipAmount > 1000)&&(name=="thunderstruck58")) { msgPublic += ':thunderstorm2 \n\nThank you thunder you are amazing!!!\n\n'; } else { if (tipAmount > 4) { msgPublic += 'Thank you ' + name + ' for your tip of ' + tipAmount + ' tokens!'; } } if (tipAmount > 6075) { msgPublic += '\n\n RECORD BROKEN!! NEW HIGHEST TIP EVER!!!\n\n\n'; } } else { msgPublic += name + ' tipped for ' + tipResult + '! Thank you!'; } break; } // Output any notices or command results to user if (msgPrivate.length > 0) { cb.sendNotice(msgPrivate, name, botMsgBg,'','bold'); msgPrivate = ""; } // Output any public notices or command results if (msgPublic.length > 0) { cb.sendNotice(msgPublic, '', botMsgBg,'','bold'); msgPublic = ""; } // Output any messages to the model if (msgModel.length > 0) { cb.sendNotice(msgModel, modelName, botMsgBg,'','bold'); msgModel = ""; } }); /* * handle user entrance messages */ cb.onEnter(function(user) { var lenOfSpecialLines = 0; var lenOfSpecialNames = 0; var lenOfSpamPatterns = 0; var nameFound = false; var greeting = ''; var modelName = cb.room_slug; var name = user['user']; var isMod = user['is_mod']; var isFan = user['in_fanclub']; var isCreator = (name == 'friendlymatt'); var isModel = (name == cb.room_slug); var hasTokens = user['has_tokens']; var hasTipped = (user['tipped_recently'] || user['tipped_alot_recently'] || user['tipped_tons_recently']); var isGrey = !(hasTokens || isMod || isModel || isFan); lenOfSpecialLines = specialLines.length; lenOfSpecialNames = specialNames.length; lenOfSpamPatterns = spamPatternArray.length; for(i=0; i < lenOfSpecialLines; i++) { if (specialLines[i][0] == name) { greeting = specialLines[i][1]; nameFound = true; break; } } if (!nameFound) { for(i=0; i < lenOfSpecialNames; i++) { if (specialNames[i][0] == name) { greeting = specialNames[i][1]; nameFound = true; break; } } } if (userGreets && (name != 'sexy__blondie')) { if (nameFound) { cb.sendNotice(greeting,'','#FFFFFF','#0e3a77','bold'); } else if ( userInArray ("family", name)) { cb.sendNotice('Welcome Family Member ' + name + ' to the room!','',familyColor,'','bold'); } else { if ( userInArray ("friend", name)) { cb.sendNotice('Welcome Friend ' + name + ' to the room!','',friendColor,'','bold'); } else { if (userInArray("lover", name)) { cb.sendNotice('Welcome Lover ' + name + ' to the room!','',loverColor,'','bold'); } else { if (userInArray("fiance", name)) { cb.sendNotice('Welcome Fiance ' + name + ' to the room!','',fianceColor,'','bold'); } else { if (userInArray("husband", name)) { cb.sendNotice('Welcome Husband ' + name + ' to the room!','',husbandColor,'','bold'); } } } } } // show notice if user is in timeout if ( userInArray("timeout", name) ) { cb.sendNotice(name + ' is back, but still in timeout!','',botMsgBg,'','bold'); } } if (isMod) { cb.sendNotice(modWelcome(),name,botMsgBg,'','bold'); } else { cb.sendNotice('\nWelcome! ' + botName + ' is running - Tip 555 to join the Family, 1111 to be my Lover, 1666 to be my Fiance, or 2222 to be my Husband!\n\n',name,botMsgBg,'','bold'); /* if (genderEmotes) { cb.sendNotice('Gender Emotes are enabled: :avatar_gen_male = Male User :avatar_gen_female = Female User\n :avatar_gen_couple = Couple User :avatar_gen_trans = Transgender User\n :avatar_gen_unknown = Gender Unknown\n\n',name,'#ffffff','','bold'); } */ if (!isSophysRoom) { cb.sendNotice('This is NOT Sophy\'s room!\nThis bot was created for sophy_lovee chaturbate.com/sophy_lovee\nVisit her room on CB!\n\n',name,botAlertBg,'','bold'); } if (!allowGreyEmotes && isGrey) { cb.sendNotice('You don\'t have any tokens. Use of emoticons for users without tokens and not part of the loyal family is not allowed at this time.\n\n',name,botAlertBg,'','bold'); } cb.sendNotice('To see the tip menu type !tipmenu or /tipmenu in the chat!\n',name,botMsgBg,'','bold'); // Birthday Notice //bdaynotice(name); } if (daystobday < 50) { bdaynotice(name); } if (userInArray("spammer", name)) { // user is in spam user list, welcome them back! msgPublic = 'Spammer ' + name + ' is back!'; cb.sendNotice(msgPublic, '', botMsgBg,'','bold'); msgPublic =""; } else { if (!isCreator && !hasTipped && isGrey) { // check username to see if it matches a pattern in the spam filter for(i=0; i < lenOfSpamPatterns; i++) { if (isWordInString(spamPatternArray[i],name)) { result = addUser("spammer", name); msgPublic = 'Spammer ' + name + ' has entered and auto-muted by SophyBot!'; cb.sendNotice(msgPublic, '', botMsgBg,'','bold'); msgPublic = ""; break; } } } } }); /* * handle messages from users */ cb.onMessage(function(message) { var msg = message['m']; var groupTag = ''; var name = message['user']; var commandProcessed = false; var gender = message['gender']; var modelName = cb.room_slug; var isMod = message['is_mod']; var isFan = message['in_fanclub']; var isCreator = (name == 'friendlymatt'); var isModel = (name == cb.room_slug); var hasTokens = message['has_tokens']; var hasTipped = (message['tipped_recently'] || message['tipped_alot_recently'] || message['tipped_tons_recently']); var isGrey = !(hasTokens || isMod || isModel || isFan); var divStr = ""; var tempAllowMsg = "Only " + modelName; var userArray = new Array(); var userList = ""; var showOutput = true; var genderStr = ""; var iconStr = ""; var isInGroup = false; var lenOfSpamPatterns = 0; var regPattern = ''; var regPattern2 = ''; lenOfSpamPatterns = spamPatternArray.length; if (modCommands) { tempAllowMsg = modelName + " and mods"; } // if user is in a group, add the group tag to their message // and change the background color if ( userInArray ("family", name) ) { message['background'] = familyColor; groupTag = familyTag; groupColor = familyColor; if (userBalls) iconStr = ":melbotballs13 "; isInGroup = true; } else { if ( userInArray ("friend", name) ) { message['background'] = friendColor; groupTag = friendTag; groupColor = friendColor; isInGroup = true; } else { if (userInArray("lover", name)) { message['background'] = loverColor; groupTag = loverTag; groupColor = loverColor; if (userBalls) iconStr = ":melbotballs16 "; isInGroup = true; } else { if (userInArray("fiance", name)) { message['background'] = fianceColor; groupTag = fianceTag; groupColor = fianceColor; if (userBalls) iconStr = ":melbotballs19 "; isInGroup = true; } else { if (userInArray("husband", name)) { message['background'] = husbandColor; groupTag = husbandTag; groupColor = husbandColor; if (userBalls) iconStr = ":melbotballs22 "; isInGroup = true; } } } } } // handle commands // all user commands switch (msg) { case "!tipmenu": case "/tipmenu": message['X-Spam'] = true; divStr = makeDiv('_',50,50); /* Check later: Implement tipmenu as array */ msgPrivate = tipMenu + '\n' + divStr; break; } // Output any notices or command results to user if (msgPrivate.length > 0) { cb.sendNotice(msgPrivate, name, botMsgBg,'','bold'); msgPrivate = ""; } // family, mod, fan, model commands if ( isModel || (isFan && (fanCommands === true)) || (isMod && (modCommands === true)) || isCreator || isInGroup) { msg = msg.replace(/^\/timeout /i,"/sb add timeout "); var activeBotTrigger = botTrigger; if (msg.indexOf(botTrigger2) > -1) { activeBotTrigger = botTrigger2; } if ((msg.indexOf(botTrigger) > -1) || (msg.indexOf(botTrigger2) > -1)) { msgParam1 = getParam(msg,' ',1); msgParam2 = getParam(msg,' ',2); msgParam3 = getParam(msg,' ',3); msgParam4 = getParam(msg,' ',4); var regexCommandSplit = '^' + activeBotTrigger + ' (\\S+)(?:\\b\\s*)(.*)?'; var regexListSplit = /[,\s]+/; var reCmdSplit = new RegExp(regexCommandSplit); var cmdSplit = msg.match(reCmdSplit); var cmd; var cmdval; var cmdval2; switch(msgParam1) { case 'help': message['X-Spam'] = true; divStr = makeDiv('_',50,50); msgPrivate = divStr + botTitle + divStr + '\n'; msgPrivate += tempAllowMsg + helpMsg + '\n' + divStr; break; case 'helpspam': case 'spamhelp': message['X-Spam'] = true; divStr = makeDiv('_',50,50); msgPrivate += tempAllowMsg + spamMsg + '\n' + divStr; break; case 'menu': case 'tipmenu': message['X-Spam'] = true; divStr = makeDiv('_',50,50); /* check later: tipmenu array */ if (msgParam2 == "all") { msgPublic = tipMenu + '\n' + divStr; } else { msgPrivate = tipMenu + '\n' + divStr; } break; case 'clear': case 'clearchat': message['X-Spam'] = true; msgPublic =""; for (x = 0; x < 10; x++) { msgPublic += ':blank \n'; } msgPublic += ':blank CHAT CLEARED\n'; for (x = 0; x < 2; x++) { msgPublic += ':blank \n'; } msgPublic += '*** ' + name + ' Cleared The Chat! ***'; break; case 'tips': message['X-Spam'] = true; if (!msgParam2) { msgParam2 = 0; } msgPrivate = getTippers(msgParam2); break; case 'notice': case 'note': case 'modnote': case 'modnotice': case 'sophynote': case 'sophynotice': case 'n': case 'tag': case 'name': case 'rank': case 'settag': case 'setname': case 'setrank': message['X-Spam'] = true; if ( cmdSplit ) { cmdval = cmdSplit[2]; if ( cmdval != null ) { cmdval = cmdval.replace(/^\s+|\s+$/g,''); } // contains message. who do we send it to? switch(msgParam1) { case 'notice': case 'note': case 'n': msgPublic = '*** ' + name + ' says: ' + cmdval + ' ***'; break; case 'sophynote': case 'sophynotice': msgModel = '*** Private notice from ' + name + ': ' + cmdval + ' ***'; msgPrivate = 'Your message was sent to ' + modelName + '...'; break; case 'modnote': case 'modnotice': msgMod = '*** Moderator notice from ' + name + ': ' + cmdval + ' ***'; msgPrivate = 'Your message was sent to the moderators...'; break; case 'tag': case 'rank': case 'name': initUserObject(name); if (!userObject[name].tag) { userObject[name].tag = ''; } if (msgParam3 == 'reset' || msgParam3 == 'default') { userObject[name].tag = ''; } else { userObject[name].tag = cmdval; } msgPrivate = "Your tag has been changed!"; break; case 'settag': case 'setrank': case 'setname': if (isCreator || isModel || isMod || isFan) { message['X-Spam'] = true; cmdval = cmdSplit[2]; // remove username from string cmdval = cmdval.split(' ').slice(1).join(' '); if ( cmdval != null ) { cmdval = cmdval.replace(/^\s+|\s+$/g,''); } // is user color array initUserObject(msgParam2); if (!userObject[msgParam2].tag) { userObject[msgParam2].tag = ''; } if (msgParam3 == 'reset' || msgParam3 == 'default') { userObject[msgParam2] = ''; } else { userObject[msgParam2].tag = cmdval; } msgPrivate = "Changed tag for user " + msgParam2 + "!"; cb.sendNotice(name + ' changed your chat tag!',msgParam2,botAlertBg,'','bold'); } else { msgPrivate = 'Only broadcaster, mods, and creator can change user tags!'; } break; } } break; case 'checktimeouts': releaseTimeouts(); break; case 'paint': if (isCreator || isModel || isMod || isFan) { message['X-Spam'] = true; // is user color array initUserObject(msgParam2); if (!userObject[msgParam2].fgColor) { userObject[msgParam2].fgColor = '#333333'; } if (!userObject[msgParam2].bgColor) { userObject[msgParam2].bgColor = '#ffffff'; } if (msgParam3 == 'reset' || msgParam3 == 'default') { delete userObject[msgParam2].fgColor; delete userObject[msgParam2].bgColor; } else { userObject[msgParam2].fgColor = msgParam3; if (msgParam4) { userObject[msgParam2].bgColor = msgParam4; } } msgPrivate = "Changed color for user " + msgParam2 + "!"; cb.sendNotice(name + ' changed your colors!',msgParam2,botAlertBg,'','bold'); } else { msgPrivate = 'Only broadcaster, mods, and creator can paint other users!'; } break; case 'colors': message['X-Spam'] = true; // is user color array initUserObject(name); if (!userObject[name].fgColor) { userObject[name].fgColor = '#333333'; } if (!userObject[name].bgColor) { userObject[name].bgColor = '#ffffff'; } if (msgParam2 == 'reset' || msgParam2 == 'default') { delete userObject[name].fgColor; delete userObject[name].bgColor; } else { userObject[name].fgColor = msgParam2; if (msgParam3) { userObject[name].bgColor = msgParam3; } } msgPrivate = "Your Colors have been changed!"; break; case 'color': case 'text': case 'fgcolor': case 'fg': message['X-Spam'] = true; // is user color array initUserObject(name); if (!userObject[name].fgColor) { userObject[name].fgColor = '#333333'; } if (msgParam2 == 'reset' || msgParam2 == 'default') { delete userObject[name].fgColor; } else { userObject[name].fgColor = msgParam2; } msgPrivate = "Your text color has been changed!"; break; case 'background': case 'bg': case 'bgcolor': message['X-Spam'] = true; // is user color array initUserObject(name); if (!userObject[name].bgColor) { userObject[name].bgColor = '#ffffff'; } if (msgParam2 == 'reset' || msgParam2 == 'default') { delete userObject[name].bgColor; } else { userObject[name].bgColor = msgParam2; } msgPrivate = "Your background color has been changed!"; break; case 'view': case 'show': case 'list': // which user array do we need to display? var showOutput = true; message['X-Spam'] = true; switch(msgParam2) { case "timeout": userArray = "timeout"; break; case "family": userArray = "family"; break; case "friends": case "friend": userArray = "friend"; break; case "lovers": case "lover": userArray = "lover"; break; case "fiance": case "fiances": userArray = "fiance"; break; case "husband": case "husbands": userArray = "husband"; break; default: showOutput = false; msgPrivate = "You must provide a group name to list: family friends lovers fiances husbands"; break; } if (showOutput === true) { userList = getUsers(userArray); arrayProperName = userArray; if (userList.length > 1) { divStr = makeDiv('_',userList.length,50); msgPrivate = divStr + '\n' + arrayProperName + ' Users\n'; msgPrivate += userList; msgPrivate += '\n' + divStr; } else { msgPrivate = 'No ' + arrayProperName + ' users found!'; } if (!isModel && !isCreator) { msgModel = name + ' viewed the list ' + arrayProperName + ' Users.'; } } break; case 'useradd': case 'adduser': case 'add': case 'a': if (isCreator || isModel || isMod || isFan) { var validSyntax = true; // check that we got 3 parameters if (msgParam3) { // which user array are we updating? switch(msgParam2) { case "timeout": case "t": case "to": result = addUser("timeout", msgParam3); msgPublic = name + ' put ' + msgParam3 + ' in timeout!!! They will not be able to type until released!'; if (msgParam4 ) { // command has number of minutes result2 = addReleaseTime(timeoutReleaseArray, msgParam3, msgParam4); if (result2 instanceof Array) { timeoutReleaseArray = result2; minutes = 'minutes'; if (msgParam4 == '1') minutes = 'minute'; msgPublic = name + ' put ' + msgParam3 + ' in timeout for ' + msgParam4 + ' ' + minutes + '!!! They will not be able to type until released!'; } else { if (result == 'duplicate') { msgPrivate = 'Failed to put user ' + msgParam3 + ' in timeout they are already scheduled for release!'; } else { msgPrivate = 'Failed to add user ' + msgParam3 + ' to release schedule. Something went wrong!'; } } } break; case "family": result = addUser("family", msgParam3); msgPublic = name + ' added ' + msgParam3 + ' to the list of Family!'; // if model didn't issue command remind model to update the bot if (!isModel) { msgModel = modelName + ', don\'t forget to add ' + msgParam3 + ' to the Family list in the bot config!'; } break; case "friends": case "friend": result = addUser("friend", msgParam3); msgPublic = name + ' added ' + msgParam3 + ' to the list of Friends!'; // if model didn't issue command remind model to update the bot if (!isModel) { msgModel = modelName + ', don\'t forget to add ' + msgParam3 + ' to Friends in the bot config!'; } break; case "lovers": case "lover": result = addUser("lover", msgParam3); msgPublic = name + ' added ' + msgParam3 + ' to the list of Lovers!'; // if model didn't issue command remind model to update the bot if (!isModel) { msgModel = modelName + ', don\'t forget to add ' + msgParam3 + ' to Lovers in the bot config!'; } break; case "fiance": case "fiances": result = addUser("fiance", msgParam3); msgPublic = name + ' added ' + msgParam3 + ' to the list of Fiances!'; // if model didn't issue command remind model to update the bot if (!isModel) { msgModel = modelName + ', don\'t forget to add ' + msgParam3 + ' to Fiances in the bot config!'; } break; case "husband": case "husbands": result = addUser("husband", msgParam3); msgPublic = name + ' added ' + msgParam3 + ' to the list of Husbands!'; // if model didn't issue command remind model to update the bot if (!isModel) { msgModel = modelName + ', don\'t forget to add ' + msgParam3 + ' to Husbands in the bot config!'; } break; case "pattern": case "p": spamPatternArray[lenOfSpamPatterns] = msgParam3; break; case "spam": case "spammer": case "spammers": case "s": result = addUser("spammer", msgParam3); msgPublic = name + ' added ' + msgParam3 + ' to the Spammer list!'; break; default: validSyntax = false; msgPrivate = 'You didn\'t supply a valid group to add the user to. Valid groups are:\n'; msgPrivate += 'family friend lover fiance husband'; msgPrivate += ' ... choose only one.'; break; } } else { validSyntax = false; msgPrivate = 'You must provide the group and the username you wish to add. For example,\n' + botTrigger + ' adduser family someusername\n'; msgPrivate += 'or ' + botTrigger + ' adduser husband someuser'; } } else { msgPrivate = 'Only brodcaster, mods, and creator can add users to groups!'; } if (validSyntax === true) { message['X-Spam'] = true; } break; case 'userdel': case 'deluser': case 'delete': case 'remove': case 'd': case 'del': if (isCreator || isModel || isMod || isFan) { var validSyntax = true; // check that we got 3 parameters if (msgParam3) { // which user array are we updating? switch(msgParam2) { case "timeout": case "t": case "to": result = delUser("timeout", msgParam3); msgPublic = name + ' released ' + msgParam3 + ' from timeout!!'; // delete any release time result2 = delReleaseTime(timeoutReleaseArray, msgParam3); break; case "family": case "fam": result = delUser("family", msgParam3); msgPublic = name + ' removed ' + msgParam3 + ' from the Family list!'; // if model didn't issue command remind model to update the bot if (!isModel) { msgModel = modelName + ', don\'t forget to remove ' + msgParam3 + ' from the Family list in the bot config!'; } break; case "friends": case "friend": result = delUser("friend", msgParam3); msgPublic = name + ' removed ' + msgParam3 + ' from the list of Friends!'; // if model didn't issue command remind model to update the bot if (!isModel) { msgModel = modelName + ', don\'t forget to remove ' + msgParam3 + ' from Friends in the bot config!'; } break; case "lovers": case "lover": result = delUser("lover", msgParam3); msgPublic = name + ' removed ' + msgParam3 + ' from the list of Lovers!'; // if model didn't issue command remind model to update the bot if (!isModel) { msgModel = modelName + ', don\'t forget to remove ' + msgParam3 + ' from Lovers in the bot config!'; } break; case "fiance": case "fiances": result = delUser("fiance", msgParam3); msgPublic = name + ' removed ' + msgParam3 + ' from the list of Fiances!'; // if model didn't issue command remind model to update the bot if (!isModel) { msgModel = modelName + ', don\'t forget to remove ' + msgParam3 + ' from Fiances in the bot config!'; } break; case "husband": case "husbands": result = delUser("husband", msgParam3); msgPublic = name + ' removed ' + msgParam3 + ' from the list of Husbands!'; // if model didn't issue command remind model to update the bot if (!isModel) { msgModel = modelName + ', don\'t forget to remove ' + msgParam3 + ' from Husbands in the bot config!'; } break; /* check later */ case "pattern": case "p": result = getArrayElement(spamPatternArray, msgParam3); if (result >= 0) { removeArrayElement(spamPatternArray,result); } break; case "spam": case "spammers": case "spammer": case "s": result = delUser("spammer", msgParam3); msgPublic = name + ' removed ' + msgParam3 + ' from Spammer list!'; break; default: validSyntax = false; msgPrivate = 'You didn\'t supply a valid group to remove the user from. Valid groups are:\n'; msgPrivate += 'family friend lover fiance husband ... choose only one.'; break; } } else { validSyntax = false; msgPrivate = 'You must provide the group and the username you wish to remove. For example,\n' + botTrigger + ' deluser family someusername\n'; msgPrivate += 'or ' + botTrigger + ' deluser husband someuser'; } } else { msgPrivate = 'Only broadcaster, mods, and creator can remove users from groups!'; } if (validSyntax === true) { message['X-Spam'] = true; } break; case 'check': if (msgParam2) { message['X-Spam'] = true; groupList = checkUser(msgParam2); msgPrivate = 'User ' + msgParam2 + ' found in: ' + groupList; } break; case 'fancommands': case 'fans': if(isModel || isCreator) { if (msgParam2) { message['X-Spam'] = true; switch(msgParam2) { case "on": fanCommands = true; msgPublic = name + ' has granted mod commands to green users!'; break; case "off": fanCommands = false; msgPublic = name + ' has revoked mod commands for green users!'; break; default: // invalid option msgPrivate = 'Invalid option, you must use on or off. Example: ' + botTrigger + ' fancommands off'; break; } } else { // missing on/off value msgPrivate = 'Missing option, you must use on or off. Example: ' + botTrigger + ' fancommands on'; } } else { msgPrivate = 'Only broadcaster and creator can enable or disable mod commands for green users!'; } break; case 'modcommands': case 'mods': if(isModel || isCreator) { if (msgParam2) { message['X-Spam'] = true; switch(msgParam2) { case "on": modCommands = true; msgPublic = name + ' has enabled Moderator commands!'; break; case "off": modCommands = false; msgPublic = name + ' has disabled Moderator commands!'; break; default: // invalid option msgPrivate = 'Invalid option, you must use on or off. Example: ' + botTrigger + ' modcommands off'; break; } } else { // missing on/off value msgPrivate = 'Missing option, you must use on or off. Example: ' + botTrigger + ' modcommands on'; } } else { msgPrivate = 'Only broadcaster and creator can enable or disable mod commands!'; } break; case 'greyemote': case 'greyemotes': case 'grayemote': case 'grayemotes': case 'emotes': case 'emote': if (isCreator || isModel || isMod || isFan) { if (msgParam2) { message['X-Spam'] = true; switch(msgParam2) { case "on": allowGreyEmotes = true; msgPublic = name + ' has enabled grey emotes!'; break; case "off": allowGreyEmotes = false; msgPublic = name + ' has disabled grey emotes!'; break; default: // invalid option msgPrivate = 'Invalid option, you must use on or off. Example: ' + botTrigger + ' greyemotes off'; break; } } else { // missing on/off value msgPrivate = 'Missing option, you must use on or off. Example: ' + botTrigger + ' greyemotes on'; } } else { msgPrivate = 'Only broadcaster, mods and creator can disable or enable grey emotes!'; } break; case 'greets': case 'greetings': if(isModel || isCreator) { if (msgParam2) { message['X-Spam'] = true; switch(msgParam2) { case "on": userGreets = true; msgPublic = name + ' has enabled User Greetings!'; break; case "off": userGreets = false; msgPublic = name + ' has disabled User Greetings!'; break; default: // invalid option msgPrivate = 'Invalid option, you must use on or off. Example: ' + botTrigger + ' greets off'; break; } } else { // missing on/off value msgPrivate = 'Missing option, you must use on or off. Example: ' + botTrigger + ' greets on'; } } else { msgPrivate = 'Only broadcaster and creator can enable or disable user greetings!'; } break; case "status": case "announce": message['X-Spam'] = true; msgPrivate = announceBot(); break; default: message['X-Spam'] = true; msgPrivate = 'You must provide a command. Type ' + botTrigger + ' help\n ...to get a list of options.'; break; } // Output any notices or command results to user if (msgPrivate.length > 0) { cb.sendNotice(msgPrivate, name, botMsgBg,'','bold'); msgPrivate = ""; } // Output any public notices or command results if (msgPublic.length > 0) { cb.sendNotice(msgPublic, '', botMsgBg,'','bold'); msgPublic = ""; } // Output any messages to the mods if (msgMod.length > 0) { cb.sendNotice(msgMod,'', botMsgBg,'','bold','red'); msgMod = ""; } // Output any messages to the model if (msgModel.length > 0) { cb.sendNotice(msgModel, modelName, botMsgBg,'','bold'); msgModel = ""; } } } // see if user envoked emotes that should be removed (no grey emotes) if (!isInGroup && !isCreator && !isModel && !allowGreyEmotes && isGrey) { //user is grey, is not in a group, not TS, not model and grey emotes are not allowed if (msg.indexOf(':') > -1) { //colon found, replace all with _ msg = msg.replace(/:([^\s]+)/g,"[blocked emote]"); } } if (!isModel) { msg = msg.replace(/baby|[\s]bby[^a-zA-Z]|[\s]bby$|^bby|babe|[\s]bb[^a-zA-Z]|^bb|[\s]bb$/ig," coffee "); } // apply group tags if (userObject[name]) { if (groupTag) { if (userObject[name].tag != '') { msg = groupTag + userObject[name].tag + ' ' + msg; } else { msg = groupTag + ' ' + msg; } } } if (name == mvpName) { msg = ":king_crown_small " + msg; } genderStr = ''; // if gender emotes are enabled, prefix message with correct gender if (genderEmotes) { switch (gender) { case 'm': genderStr = ':avatar_gen_male'; break; case 'f': genderStr = ':avatar_gen_female'; break; case 's': genderStr = ':avatar_gen_trans'; break; case 'c': genderStr = ':avatar_gen_couple'; break; default: genderStr = ':avatar_gen_unknown'; break; } // special user icons if (isModel) { genderStr = ':crowngold'; } } // show notice if user is in timeout if ( userInArray("timeout", name) ) { thisMessageTime = (new Date).getTime(); // simple trottle timeout message output to keep users from flooding room if ( (lastMessageName == name && (thisMessageTime > (lastMessgeTime + 4000))) || lastMessageName != name ) { selectedTimeoutMessage = Math.floor(Math.random() * 8) + 1; msg = timeoutMessages[selectedTimeoutMessage]; lastMessgeTime = (new Date).getTime(); lastMessageName = name; } else { message['X-Spam'] = true; msg = ""; cb.sendNotice("Timeout Flood Protector Enabled! Message Blocked! Stop trying to flood the room! [only you are seeing this]", name, botMsgBg,'','bold'); } } else { if ( userInArray("spammer", name) ) { // user is in spammer list message['X-Spam'] = true; msg = ""; } else { if (!isCreator && !hasTipped && isGrey) { /* TODO move message pattern check to top add check for usernames ending in 4 digits and messages starting with 3 digits then check for messages that start and end with 3 digits if those fail then do the check for username pattern */ // check if username matches a pattern and add to spammer array if matched // a match should only be found if the spammer enters the room on a mobile device // that doesn't trigger the onEnter event. otherwise the onEnter event should // catch them when they enter for(i=0; i < lenOfSpamPatterns; i++) { if (isWordInString(spamPatternArray[i],name)) { result = addUser("spammer", name); msgPublic = 'Spammer ' + name + ' has been spotted and auto-muted by ' + botName + '!'; cb.sendNotice(msgPublic, '', botMsgBg,'','bold'); msgPublic = ""; message['X-Spam'] = true; msg = ""; break; } } // Do pattern match for known spammer messages regPattern = /^\d{3}.*?\d{3}$/; // ### [message] ### if (msg.match(regPattern)) { result = addUser("spammer", name); msgPublic = 'Spammer ' + name + ' has been spotted and auto-muted by ' + botName + '!'; cb.sendNotice(msgPublic, '', botMsgBg,'','bold'); msgPublic = ""; message['X-Spam'] = true; msg = ""; } else { regPattern = /^\d{2}.*?$/; regPattern2 = /^.*?\d{4}$/; regPattern3 = /^.*?\d{2}$/; if ((name.match(regPattern2) && msg.match(regPattern)) || (name.match(regPattern2) && msg.match(regPattern3))) { result = addUser("spammer", name); msgPublic = 'Spammer ' + name + ' has been spotted and auto-muted by ' + botName + '!'; cb.sendNotice(msgPublic, '', botMsgBg,'','bold'); msgPublic = ""; message['X-Spam'] = true; msg = ""; } else { regPattern = /^.*?pornmeds.*?$/; if (msg.match(regPattern)) { result = addUser("spammer", name); msgPublic = 'Spammer ' + name + ' has been spotted and auto-muted by ' + botName + '!'; cb.sendNotice(msgPublic, '', botMsgBg,'','bold'); msgPublic = ""; message['X-Spam'] = true; msg = ""; } } } } } } // check if grey chat is disabled if (!isInGroup && !isCreator && !isModel && isGrey && noGreyChat) { message['X-Spam'] = true; msg = ""; } // does user have modified colors if (!userObject[name]) { // do nothing } else { // apply colors to message if in color array if (userObject[name].fgColor) { message['c'] = userObject[name].fgColor; } if (userObject[name].bgColor) { message['background'] = userObject[name].bgColor; } } // add gender or special icon prefix if (msg != '') { msg = genderStr + ' ' + iconStr + msg; } // return final altered message message['m'] = msg; return message; }); //end onMessage /* * bot functions */ /* * return string of tippers to display * can limit number of tippers returned to show only top 10, top 5 ect. */ function getTippers(topNumber) { var topTippers = new Array(); var tempTippers = []; var output = ''; var x; var count = 0; var divStr = ""; var tokensum = 0; for (x in userObject) { if (userObject[x].tips > 0) { tempTippers[count] = {username: userObject[x].username, tips: userObject[x].tips}; tokensum += userObject[x].tips; count++; } } tempTippers.sort(dynamicSort('-tips')); if (topNumber > 0) { topTippers = tempTippers.slice(0,topNumber); if (topTippers.length == 1) { output = '\nTop Tipper'; } else { output = '\nTop ' + topTippers.length + ' Tippers'; } divStr = makeDiv('-',20,20); output += "\n" + divStr; } else { topTippers = tempTippers; output = '\nAll Tippers (Total: ' + tokensum + ')'; } if (topTippers.length > 0) { for (i = 0; i < topTippers.length; i++) { output += '\n ' + topTippers[i].username + ': ' + topTippers[i].tips + " tokens"; } } else { output = '\nThere have been no tippers since the bot started!\n'; } return output + '\n'; } /* * check if a word or phrase is in a string */ function isWordInString(word,str) { var re = new RegExp(word,"i"); var n = str.search(re); if (n > -1) { return true; } else { return false; } } /* * add a user to the release array */ function addReleaseTime(userArray, username, timeoutMinutes) { var userArrayLength = userArray.length; username = username.toLowerCase(); // check if username is in userarray usernameExists = userInReleaseArray(userArray, username); if (usernameExists === true) { return "duplicate"; // username found in array, return duplicate } else { // add username to array currentEpoch = (new Date).getTime(); userArray[userArrayLength] = new Array(username,currentEpoch + (timeoutMinutes * 60000)); //userArray[userArrayLength][0] = username; //userArray[userArrayLength][1] = currentEpoch + timeoutMinutes * 60000; // check to see that addition of user worked usernameExists = userInReleaseArray(userArray, username); if (usernameExists === true) { return userArray; // it worked, return the array } else { return "failed"; // failed, return failed } } } function delReleaseTime(userArray, username) { var releaseArrayLength = userArray.length; var userElement = -1; username = username.toLowerCase(); if (userInReleaseArray(userArray, username)) { userElement = getReleaseArrayElement(userArray, username); if (userElement > -1) { tempArray = removeArrayElement(userArray, userElement); if (!userInReleaseArray(userArray, username)) { // user was removed return tempArray; } else { // user was not removed, failed return "failed"; } } else { //user element was not in array for some reason return "failed"; } } else { return 'notfound'; } } /* * remove users and model from timeout if their time has expired */ function releaseTimeouts() { // set current epoch time currentEpoch = (new Date).getTime(); //loop through all elements in timeout release array for (i = 0; i < timeoutReleaseArray.length; i++) { if (timeoutReleaseArray[i][1] < currentEpoch) { username = timeoutReleaseArray[i][0]; delUser("timeout", username); msgPublic += "User " + username + " has been released from timeout!\n"; delReleaseTime(timeoutReleaseArray, username); } } // setup next check call cb.setTimeout(releaseTimeouts, timeoutReleaseInterval * 60000); if (msgPublic) { cb.sendNotice(msgPublic, '', botMsgBg,'','bold'); msgPublic = ""; } } /* * display notification message and start interval timer */ function displayNotification1() { cb.sendNotice(autoNotice1Text,'',botNoteBg,'','bold'); cb.setTimeout(displayNotification1, cb.settings.autoNotice1Interval * 60000); } function displayNotification2() { cb.sendNotice(autoNotice2Text,'',botNoteBg,'','bold'); cb.setTimeout(displayNotification2, cb.settings.autoNotice2Interval * 60000); } function displayTippers() { var msg = getTippers(3); cb.sendNotice(msg,'',botNoteBg,'','bold'); cb.setTimeout(displayTippers, cb.settings.announceTippersInterval * 60000); } function displayTipmenu() { var msg = tipMenu; cb.sendNotice(msg,'',botMsgBg,'','bold'); cb.setTimeout(displayTipmenu, cb.settings.announceTipmenuInterval * 60000); } function displayBdayNotification() { cb.sendNotice(bdayNoticeText,'',botAlert2Bg,'','bold'); cb.setTimeout(displayBdayNotification, 6 * 60000); } /* * return parameter value from a message string * Req: msgString = full message as string * Req: splitChr = character to split on (usually space) * Req: paramNumber = number of the parameter to return (first is 0) * Return: paramValue = value of the requested parameter */ function getParam(msgString,splitChr,paramNumber) { var tempArray = new Array(); tempArray = msgString.split(splitChr); paramValue = tempArray[paramNumber]; return paramValue; } /* * build a variable length divider from a character * Req: divChr = the character to use for the divier, ie: _ - * * Req: strLen = length of the data to be divided (lenth of a string, or fixed) * Req: maxDivLen = the max number of characters the div can grow to * Return: divStr = string of repeated character that make the divider */ function makeDiv(divChr, strLen, maxDivLen) { var divLen = 0; var divStr = ""; if (strLen > maxDivLen) { divLen = maxDivLen; } else { divLen = strLen; } while (divStr.length < divLen) { divStr = divChr + divStr; } return divStr; } /* * return array of users with the new user added, duplicate, * or error string. * Req: userArray = array of users to add the new user to * Req: username = username of new user * Return: array of users with new users added * On error: return "duplicate" if username in user array already * On error: return "failed" if user no duplicate and wasn't added */ function addUser(userArray, username) { initUserObject(username); userObject[username][userArray] = "Member"; } /* * return array of users with the new user removed, duplicate, * or error string. * Req: userArray = array of users to add the new user to * Req: username = username of new user * Return: array of users with user removed * On error: return "notfound" if username not in user array * On error: return "failed" if user no duplicate and wasn't added */ function delUser(userArray, username) { if (userObject[username]) { delete userObject[username][userArray]; return 'done'; } else { return 'notfound'; } } /* * remove a user from all groups * Req: username = name over user to remove * Return: none */ function delUserFromAll(username) { if (userObject[username]) { delete userObject[username].friend; delete userObject[username].family; delete userObject[username].lover; delete userObject[username].fiance; delete userObject[username].husband; } } /* retun group bg color */ function getGroupBgColor(username) { var bgc = "#ffffff"; if ( userInArray ("family", username) ) { bgc = familyColor; } else { if ( userInArray ("friend", username) ) { bgc = friendColor; } else { if (userInArray("lover", username)) { bgc = loverColor; } else { if (userInArray("fiance", username)) { bgc = fianceColor; } else { if (userInArray("husband", username)) { bgc = husbandColor; } } } } } return bgc; } /* * return the element or index number of an array value * Req: sourceArray = array to parse * Req: value = value to find * Return: index of the element */ function getArrayElement(sourceArray, value) { var index = -1; for (i = 0; i < sourceArray.length; i++) { if (sourceArray[i] == value) { index = i; } } return index; } /* * same as getArrayElement but for timeout release array */ function getReleaseArrayElement(sourceArray, value) { var index = 0; for (i = 0; i < sourceArray.length; i++) { if (sourceArray[i][0] == value) { index = i; } } return index; } /* * dynamic sort function to sort array by a property * Borrowed from Asdfghjkl28 */ function dynamicSort(property) { var sortOrder = 1; if (property[0] === "-") { sortOrder = -1; property = property.substr(1, property.length - 1); } var sortfunc = function (a, b) { if (typeof a[property] === "undefined") { if (typeof b[property] === "undefined") { // both undef return 0; } else { // b ok, a undef return -1; } } if (typeof b[property] === "undefined") { if (typeof a[property] === "undefined") { // both undef return 0; } else { // a ok, b undef return 1; } } var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0; return result * sortOrder; }; return sortfunc; } /* * return an array with the indicated element removed * Req: sourceArray = array to be modified * Req: element = element to be removed * Return: the modified array */ function removeArrayElement(sourceArray,element) { sourceArray.splice(element, 1); return sourceArray; } /* * return boolean if user is in user array * Req: userArray = array of users to parse * Req: userName = name of user to parse fr * Returns: userFound = true or false */ function userInArray(userArray, username) { var userFound = false; if (userObject[username]) { if (userObject[username][userArray]) { return true; } } return false; } /* * return boolean if user is in user release array * Req: timeoutReleaseArray = array of users to parse * Req: username = name of user to parse fr * Returns: userFound = true or false */ function userInReleaseArray(userArray, username) { var userFound = false; username = username.toLowerCase(); if (userArray.length > 0) { for(i=0; i < userArray.length; i++) { if (userArray[i][0] == username) userFound = true; } } return userFound; } /* * return a string of usernames from an array of users * Req: userArray = array of users * Return: string of of usersnames */ function getUsers(userArray) { var userList = ""; var x; for (x in userObject) { if (userObject[x][userArray]) { userList += userObject[x].username + ' '; } } return userList; } function nrOfUsers(userArray) { var userCount = 0; var x; for (x in userObject) { if (userObject[x][userArray]) { userCount++; } } return userCount; } /* * return list of groups that a user is a member of * Req: username = username to find * Return: string with list of groups the user was found in */ function checkUser(username) { var groupList = ""; if (userObject[username]) { if (userObject[username].family) groupList += "Family "; if (userObject[username].friend) groupList += "Friends "; if (userObject[username].lover) groupList += "Lovers "; if (userObject[username].fiance) groupList += "Fiances "; if (userObject[username].husband) groupList += "Husbands "; } return groupList; } function daysUntilNext(month, day){ var tday= new Date(), y = tday.getFullYear(), next = new Date(y, month - 1, day); tday.setHours(0, 0, 0, 0); if(tday > next) next.setFullYear(y + 1); return Math.round((next - tday)/8.64e7); } function notModel() { var output = '\n\n' + modelName + '! This bot was created for '; output += 'sophy_lovee, you are not her! Please consider having your own '; output += 'bot created. Contact friendlymatt or sophy_lovee\n\n'; return output; } function modWelcome() { var output = '\nGreetings Moderator...'; output += botName + ' version ' + botVersion + ' is running!\n'; return output; } function fillUsers(userArray,namesArray) { var i; var j; for (i = 0; i < namesArray.length; i++) { if (namesArray[i] != '') { var username = namesArray[i].split('/'); addUser(userArray,username[0]); for (j = 1; j < username.length; j++) { userObject[username[0]].tag += ' ' + username[j]; } } } } /* * Builds user arrays and strings based on data provided by bot * config settings */ function loadSettings() { // grey graphics if (cb.settings.allowGreyEmotes == 'Yes') { allowGreyEmotes = true; } else { allowGreyEmotes = false; } // mod commands if (cb.settings.modCommands == 'Yes') { modCommands = true; } else { modCommands = false; } // greetings if (cb.settings.userGreets == 'Yes') { userGreets = true; } else { userGreets = false; } // balls if (cb.settings.userBalls == 'Yes') { userBalls = true; } else { userBalls = false; } // gender emotes if (cb.settings.genderEmotes == 'Yes') { genderEmotes = true; } else { genderEmotes = false; } // load friends into array and other variables if (cb.settings.friendList) { tempStr = cb.settings.friendList.toLowerCase(); //make names all lowercase cb.settings.friendList = tempStr.trim(); // remove extra spaces fillUsers("friend",cb.settings.friendList.split(' ')); } if (cb.settings.friendTag) { friendTag = cb.settings.friendTag.trim(); } if (cb.settings.friendColor) { tempArray = cb.settings.friendColor.split(' '); friendColor = '#' + tempArray[1]; } // load family into array and other variables if (cb.settings.familyList) { tempStr = cb.settings.familyList.toLowerCase(); //make names all lowercase cb.settings.familyList = tempStr.trim(); // remove extra spaces fillUsers("family",cb.settings.familyList.split(' ')); } if (cb.settings.familyTag) { familyTag = cb.settings.familyTag.trim(); } if (cb.settings.familyColor) { tempArray = cb.settings.familyColor.split(' '); familyColor = '#' + tempArray[1]; } // load lover into array and other variables if (cb.settings.loverList) { tempStr = cb.settings.loverList.toLowerCase(); //make names all lowercase cb.settings.loverList = tempStr.trim(); // remove extra spaces fillUsers("lover",cb.settings.loverList.split(' ')); } if (cb.settings.loverTag) { loverTag = cb.settings.loverTag.trim(); } if (cb.settings.loverColor) { tempArray = cb.settings.loverColor.split(' '); loverColor = '#' + tempArray[1]; } // load fiance into array and other variables if (cb.settings.fianceList) { tempStr = cb.settings.fianceList.toLowerCase(); //make names all lowercase cb.settings.fianceList = tempStr.trim(); // remove extra spaces fillUsers("fiance",cb.settings.fianceList.split(' ')); } if (cb.settings.fianceTag) { fianceTag = cb.settings.fianceTag.trim(); } if (cb.settings.fianceColor) { tempArray = cb.settings.fianceColor.split(' '); fianceColor = '#' + tempArray[1]; } // load husband into array and other variables if (cb.settings.husbandList) { tempStr = cb.settings.husbandList.toLowerCase(); //make names all lowercase cb.settings.husbandList = tempStr.trim(); // remove extra spaces fillUsers("husband",cb.settings.husbandList.split(' ')); } if (cb.settings.husbandTag) { husbandTag = cb.settings.husbandTag.trim(); } if (cb.settings.husbandColor) { tempArray = cb.settings.husbandColor.split(' '); husbandColor = '#' + tempArray[1]; } /* check later */ // load spam pattern list into array if (cb.settings.spamPatternList) { tempStr = cb.settings.spamPatternList.toLowerCase(); //make patterns all lowercase cb.settings.spamPatternList = tempStr.trim(); // remove extra spaces spamPatternArray = cb.settings.spamPatternList.split(' '); } // load notifications if (cb.settings.autoNotice1) { autoNotice1Text = cb.settings.autoNotice1.trim(); } if (cb.settings.autoNotice2) { autoNotice2Text = cb.settings.autoNotice2.trim(); } } function announceBot() { var divStr=""; var statusMsg = ""; divStr = makeDiv('*', 45, 45); statusMsg = divStr + botTitle + divStr + '\n'; statusMsg += 'Gender Emotes: '; if (genderEmotes) { statusMsg += 'On'; } else { statusMsg += 'Off'; } statusMsg += '\n'; statusMsg += 'Grey Emotes: '; if (allowGreyEmotes) { statusMsg += 'On'; } else { statusMsg += 'Off'; } statusMsg += '\n'; statusMsg += 'Mod Commands: '; if (modCommands) { statusMsg += 'On'; } else { statusMsg += 'Off'; } statusMsg += '\n'; statusMsg += 'User Greetings: '; if (userGreets) { statusMsg += 'On'; } else { statusMsg += 'Off'; } statusMsg += '\n'; statusMsg += 'Number of Friends: ' + nrOfUsers("friend") + '\n'; statusMsg += 'Number in Family: ' + nrOfUsers("family") + ' (tip 555)\n'; statusMsg += 'Number of Lovers: ' + nrOfUsers("lover") + ' (tip 1111)\n'; statusMsg += 'Number of Fiances: ' + nrOfUsers("fiance") + ' (tip 1666)\n'; statusMsg += 'Number of Husbands: ' + nrOfUsers("husband") + ' (tip 2222)\n'; statusMsg += 'Type - ' + botTrigger + ' help - for list commands\n'; statusMsg += divStr; statusMsg += '\nType /tipmenu for the Tip Menu\n'; statusMsg += divStr; return statusMsg; } function bdaynotice(name) { if (name == 'all') { name = ''; } if (daystobday === 0) { cb.sendNotice(bdayNoticeText,name, botAlertBg,'','bold'); } else { if (daystobday > 0) { cb.sendNotice('Only ' + daystobday + ' day' + (daystobday > 1 ? 's' : '') + ' until Sophy\'s birthday!',name,botAlertBg,'','bold'); } } } loadSettings(); cb.sendNotice(announceBot(),'', botMsgBg,'','bold'); // Birthday notice if (daystobday < 50) { bdaynotice("all"); if (daystobday === 0) { cb.setTimeout(displayBdayNotification, 6 * 60000); } } if (!isSophysRoom) cb.sendNotice(notModel(),modelName,botAlertBg,'','bold'); if (autoNotice1Text) cb.setTimeout(displayNotification1, cb.settings.autoNotice1Interval * 60000); if (autoNotice2Text) cb.setTimeout(displayNotification2, cb.settings.autoNotice2Interval * 60000); if (cb.settings.announceTippersInterval > 0) cb.setTimeout(displayTippers, cb.settings.announceTippersInterval * 60000); if (cb.settings.announceTipmenuInterval > 0) cb.setTimeout(displayTipmenu, cb.settings.announceTipmenuInterval * 60000); // start timeout release event cb.setTimeout(releaseTimeouts, timeoutReleaseInterval * 60000);
© Copyright Chaturbate 2011- 2024. All Rights Reserved.