Apps Home
|
Create an App
North101 Test
Author:
north101
Description
Source Code
Launch App
Current Users
Created by:
North101
var ONE_SECOND = 1000; var ONE_MINUTE = 60 * ONE_SECOND; var TEN_MINUTES = 10 * ONE_MINUTE; var TWENTY_MINUTES = 20 * ONE_MINUTE; var ONE_HOUR = 60 * ONE_MINUTE; var ONE_DAY = 24 * ONE_HOUR; var ON_UPDATE_DELAY = 5 * ONE_SECOND; var RunState = Object.freeze({'stopped': 'stopped', 'paused': 'paused', 'running': 'running'}) var UserOnlineState = Object.freeze({'offline': 'offline', 'online': 'online'}); var UserViewState = Object.freeze({'hidden': 'hidden', 'shown': 'shown'}); // settings var CAM_MESSAGE; var USER_SHOWN_MESSAGE; var USER_HIDDEN_MESSAGE; var MAX_SHOWN_CREDITS; var MAX_HIDDEN_CREDITS; var CREDITS_PER_TOKEN; var VIP_USERS = []; function getTime() { return (new Date()).getTime(); } function stringFormat(str, args) { for (arg in args) str = str.replace(RegExp("\\{" + arg + "\\}", "gi"), args[arg]); return str; } function durationFormat(timedelta) { var duration = []; if (timedelta >= ONE_DAY) { duration.push(Math.floor(timedelta / ONE_DAY) + 'd'); timedelta %= ONE_DAY; } if (timedelta >= ONE_HOUR) { duration.push(Math.floor(timedelta / ONE_HOUR) + 'h'); timedelta %= ONE_HOUR; } if (timedelta >= ONE_MINUTE) { duration.push(Math.floor(timedelta / ONE_MINUTE) + 'm'); timedelta %= ONE_MINUTE; } if (timedelta >= ONE_SECOND) { duration.push(Math.floor(timedelta / ONE_SECOND) + 's'); timedelta %= ONE_SECOND; } return duration.join(' '); } function getCamMessage() { var args = { max_shown: durationFormat(MAX_SHOWN_CREDITS), max_hidden: durationFormat(MAX_HIDDEN_CREDITS), extra: durationFormat(CREDITS_PER_TOKEN), }; return stringFormat(CAM_MESSAGE, args); } function sendUserShownMessage(user) { var args = { name: user.name, shown: durationFormat(user.getRemainingShownCredits()), extra: durationFormat(CREDITS_PER_TOKEN), }; cb.sendNotice(stringFormat(USER_SHOWN_MESSAGE, args), user.name); } function sendUserHiddenMessage(user) { var args = { name: user.name, hidden: durationFormat(user.getRemainingHiddenCredits()), extra: durationFormat(CREDITS_PER_TOKEN), }; cb.sendNotice(stringFormat(USER_HIDDEN_MESSAGE, args), user.name); } function UserList() { this.runState = RunState.stopped; this.lastRunState = this.runState; this.users = {}; this.start = function() { if (this.runState === RunState.running) return; if (this.runState === RunState.stopped) { for (var user_name in this.users) { this.users[user_name].resetCredits(); } } this.runState = RunState.running; this.onUpdate(); cb.limitCam_start(getCamMessage()); } this.pause = function() { if (this.runState !== RunState.running) return; cb.limitCam_stop(); this.runState = RunState.paused; this.onUpdate(); } this.stop = function() { if (this.runState !== RunState.running) return; cb.limitCam_stop(); this.runState = RunState.stopped; this.onUpdate(); } this.onUpdate = function(user) { var now = getTime(); var users; if (user) { users = {}; users[user.name] = user; } else { users = this.users; } var running = (this.runState === RunState.running); var addUsers = []; var removeUsers = []; var currentUsers = cb.limitCam_allUsersWithAccess(); for (var user_name in users) { var user = users[user_name]; if (running) { if (user.onlineState === UserOnlineState.online) { user.updateCredits(now); if (user.canView()) { user.viewState = UserViewState.shown; } else { user.viewState = UserViewState.hidden; } } else { user.viewState = UserViewState.hidden; } var hasUser = (currentUsers.indexOf(user.name) !== -1); if (user.viewState === UserViewState.shown) { if (!hasUser) { addUsers.push(user.name); } } else { if (hasUser) { removeUsers.push(user.name); } } } else if (this.lastRunState !== this.runState) { user.updateCredits(now); user.viewState = UserViewState.hidden; var hasUser = (currentUsers.indexOf(user.name) !== -1); if (hasUser) { removeUsers.push(user.name); } } } this.lastRunState = this.runState; if (removeUsers.length) { cb.log('Removing users: ' + removeUsers.join(', ')); cb.limitCam_removeUsers(removeUsers); if (running) { removeUsers.forEach(function(user_name) { var user = this.users[user_name]; sendUserHiddenMessage(user); }.bind(this)); } } if (addUsers.length) { cb.log('Adding users: ' + addUsers.join(', ')); cb.limitCam_addUsers(addUsers); addUsers.forEach(function(user_name) { var user = this.users[user_name]; if (!user.canAlwaysView()) { sendUserShownMessage(user); } }.bind(this)); } cb.setTimeout(this.onUpdate.bind(this), ON_UPDATE_DELAY); } this.onUserEnter = function(userToAdd) { var user = this.users[userToAdd.user]; if (user) { user.in_fanclub = userToAdd.in_fanclub; user.has_tokens = userToAdd.has_tokens; user.is_mod = userToAdd.is_mod; user.tipped_recently = userToAdd.tipped_recently; user.onlineState = UserOnlineState.online; } else { user = new User(userToAdd); this.users[user.name] = user; } cb.log(user.name + ': ' + user.onlineState + '. ' + durationFormat(user.getRemainingShownCredits()) + ' left'); this.onUpdate(user); if (this.runState === RunState.running && user.viewState === UserViewState.hidden) { sendUserHiddenMessage(user); } } this.onUserLeave = function(userToDelete){ var user = this.users[userToDelete.user]; if (!user) return; this.onUpdate(user); user.onlineState = UserOnlineState.offline; cb.log(user.name + ': ' + user.onlineState); } this.onUserTip = function(tip) { var user = this.users[tip.from_user]; if (user) { user.in_fanclub = tip.from_user_in_fanclub; user.has_tokens = tip.from_user_has_tokens; user.is_mod = tip.from_user_is_mod; user.tipped_recently = tip.from_user_tipped_recently; } else { user = new User({ user: tip.from_user, in_fanclub: tip.from_user_in_fanclub, has_tokens: tip.from_user_has_tokens, is_mod: tip.from_user_is_mod, tipped_recently: tip.from_user_tipped_recently, }); this.users[user.name] = user; } user.tokens += tip.amount; this.onUpdate(user); } this.onMessage = function(msg) { var hide = false; if (msg.user === cb.room_slug && msg.m[0] === '/') { var text = msg.m.split(' '); var command = text.shift(); if (command === '/start') { this.start(); hide = true; } else if (command === '/pause') { this.pause(); hide = true; } else if (command === '/stop') { this.stop(); hide = true; } else if (command === '/add') { for (var i = 0; i < text.length; i++) { var name = text[i]; if (VIP_USERS.indexOf(name) !== -1) { VIP_USERS.push(name); } } cb.sendNotice('Adding VIP: ' + text.join(', '), cb.room_slug); hide = true; } else if (command === '/remove') { for (var i = VIP_USERS.length - 1; i >= 0; i--) { var name = VIP_USERS[i]; if (text.indexOf(name) !== -1) { VIP_USERS.splice(i, 1); } } cb.sendNotice('Removing VIP: ' + text.join(', '), cb.room_slug); hide = true; } } if (hide) { msg['X-Spam'] = true; } return msg; } // Used for populating users on app load this.onDrawPanel = function(userToAdd) { if (userToAdd.user === cb.room_slug) return; var user = this.users[userToAdd.user]; if (user) { user.in_fanclub = userToAdd.in_fanclub; user.has_tokens = userToAdd.has_tokens; user.is_mod = userToAdd.is_mod; user.tipped_recently = userToAdd.tipped_recently; user.onlineState = UserOnlineState.online; } else { user = new User(userToAdd); this.users[user.name] = user; } } cb.onDrawPanel(this.onDrawPanel.bind(this)); cb.onEnter(this.onUserEnter.bind(this)); cb.onLeave(this.onUserLeave.bind(this)); cb.onTip(this.onUserTip.bind(this)); cb.onMessage(this.onMessage.bind(this)); this.onUpdate(); } function User(user) { this.name = user.user; this.in_fanclub = user.in_fanclub; this.has_tokens = user.has_tokens; this.is_mod = user.is_mod; this.tipped_recently = user.tipped_recently; this.tokens = 0; this.onlineState = UserOnlineState.online; this.viewState = UserViewState.hidden; this.lastCreditUpdate; this.shownCredits; this.hiddenCredits; this.isVip = function() { return VIP_USERS.indexOf(this.name) !== -1; } this.getMaxShownCredits = function() { return MAX_SHOWN_CREDITS + (this.tokens * CREDITS_PER_TOKEN); } this.getRemainingShownCredits = function() { return this.getMaxShownCredits() - this.shownCredits; } this.getMaxHiddenCredits = function() { return MAX_HIDDEN_CREDITS; } this.getRemainingHiddenCredits = function() { return this.getMaxHiddenCredits() - this.hiddenCredits; } this.resetCredits = function(now) { var now = now || getTime(); this.lastCreditUpdate = now; this.shownCredits = 0; this.hiddenCredits = 0; this.tokens = 0; } this.updateCredits = function(now) { now = now || getTime(); if (this.viewState === UserViewState.shown) { this.shownCredits += (now - this.lastCreditUpdate); this.lastCreditUpdate = now; } else { this.hiddenCredits += (now - this.lastCreditUpdate); if (this.hiddenCredits > this.getMaxHiddenCredits()) { this.resetCredits(now); } else { this.lastCreditUpdate = now; } } } this.canAlwaysView = function() { return this.is_mod || this.in_fanclub || this.isVip(); } this.canView = function() { // If the user is the owner or a mod or fanclub or has tipped, they can view if (this.canAlwaysView()) { return true; // If the user has spent < maxShownCredits in the room, they can view } else if (this.shownCredits < this.getMaxShownCredits()) { return true; } // Otherwise, bye bye! return false; } this.resetCredits(); } var userList = new UserList(); cb.settings_choices = [ { name: 'cam_message', type: 'str', defaultValue: '', label: 'cam_message' }, { name: 'user_shown_message', type: 'str', defaultValue: 'Hi {name}. You can view without tipping for {shown} and an additional {extra} per token.', label: 'user_shown_message' }, { name: 'user_hidden_message', type: 'str', defaultValue: 'Hi {name}. To continue watching each token gives you an additional {extra}. Otherwise you can view again in {hidden}.', label: 'user_hidden_message' }, { name: 'max_shown_seconds', type: 'int', minValue: 1, defaultValue: TEN_MINUTES / ONE_SECOND, label: 'max_shown_seconds' }, { name: 'max_hidden_seconds', type: 'int', minValue: 1, defaultValue: ONE_HOUR / ONE_SECOND, label: 'max_hidden_seconds' }, { name: 'seconds_per_token', type: 'int', defaultValue: ONE_MINUTE / ONE_SECOND, label: 'seconds_per_token' }, { name: 'vip_users', type: 'str', defaultValue: '', label: 'vip_users', required: false } ]; if (Object.keys(cb.settings).length) { CAM_MESSAGE = cb.settings.cam_message; USER_SHOWN_MESSAGE = cb.settings.user_shown_message; USER_HIDDEN_MESSAGE = cb.settings.user_hidden_message; MAX_SHOWN_CREDITS = cb.settings.max_shown_seconds * ONE_SECOND; MAX_HIDDEN_CREDITS = cb.settings.max_hidden_seconds * ONE_SECOND; CREDITS_PER_TOKEN = cb.settings.seconds_per_token * ONE_SECOND; cb.settings.vip_users.split(',').forEach(function(name) { name = name.trim(); if (VIP_USERS.indexOf(name) !== -1) { VIP_USERS.push(name.trim()); } }); }
© Copyright Chaturbate 2011- 2024. All Rights Reserved.