Apps Home
|
Create an App
DTCH
Author:
codeanontesting
Description
Source Code
Launch App
Current Users
Created by:
Codeanontesting
cb.settings_choices = [ {name: 'model_name', label: 'Model name (leave blank for default)', type: 'str', required: false}, {name: 'room_subj', label: 'Room subject', type: 'str', defaultValue: 'Hitachi torture show! Type /dtmenu for instructions!', required: false}, {name: 'commanders', label: 'Privileged users', type: 'str', required: false, defaultValue: 'codeanon'}, {name: 'auto_broadcast_timer', label: 'Broadcast control menu every ___ minutes', type: 'int', defaultValue: 2, minValue: 0}, {name: 'dt_downspeed', label: '[PRIMARY CONTROLS] ===== Decrease speed', type: 'int', minValue: 0, defaultValue: 10}, {name: 'dt_upspeed', label: 'Increase speed', type: 'int', minValue: 0, defaultValue: 11}, {name: 'dt_off', label: 'Set to OFF', type: 'int', minValue: 0, defaultValue: 20}, {name: 'dt_low', label: 'Set to LOW', type: 'int', minValue: 0, defaultValue: 21}, {name: 'dt_high', label: 'Set to HIGH', type: 'int', minValue: 0, defaultValue: 22}, {name: 'dt_deny', label: 'Deny cumming', type: 'int', minValue: 0, defaultValue: 50}, {name: 'dt_allow', label: 'Allow cumming', type: 'int', minValue: 0, defaultValue: 51}, {name: 'dt_dildoadd', label: '[MISCELLANEOUS ACTIONS] ===== Add dildo', type: 'int', minValue: 0, defaultValue: 0}, {name: 'dt_dildorem', label: 'Remove dildo', type: 'int', minValue: 0, defaultValue: 0}, {name: 'dt_unmute', label: 'Remove ball gag', type: 'int', minValue: 0, defaultValue: 0}, {name: 'dt_mute', label: 'Put on ball gag', type: 'int', minValue: 0, defaultValue: 0}, {name: 'dt_switch', label: 'Switch between clit and butt', type: 'int', minValue: 0, defaultValue: 0}, ]; /********** ------------ PANEL ------------ **********/ var modelName = ''; var menuText = ''; var level = 'Off'; var speed = 1; var sheCanCum = false; var muted = false; var dildo = false; var butt = false; var speedOn = (cb.settings.dt_upspeed > 0 && cb.settings.dt_downspeed > 0); var speedLabel = function() { if (speedOn) return 'SPEED ::'; return '-----'; }(); //app panel format cb.onDrawPanel(function () { return { 'template': '3_rows_of_labels', 'row1_label': 'LEVEL ::', 'row1_value': level, 'row2_label': speedLabel, 'row2_value': showSpeed(), 'row3_label': 'CUMMING ::', 'row3_value': isCummingAllowed() }; }); cb.onEnter(function(user) { showMenu(user.user); }); function showSpeed() { if (speedOn) return speed + '/7'; return '-----'; } //see if cumming is allowed function isCummingAllowed() { if (sheCanCum) return 'Allowed'; return 'Denied'; } /********** ------------ COMMANDS ------------ **********/ //commands function command(cmd, user) { var array = cmd.split(' '); switch(array[0]) { case 'dt_downspeed': decreaseSpeed(user); cb.drawPanel(); break; case 'dt_upspeed': increaseSpeed(user); cb.drawPanel(); break; case 'dt_setspeed': setSpeed(array[1]); cb.drawPanel(); break; case 'dt_mute': mute(user); cb.drawPanel(); break; case 'dt_unmute': unmute(user); cb.drawPanel(); break; case 'dt_off': off(user); cb.drawPanel(); break; case 'dt_low': low(user); cb.drawPanel(); break; case 'dt_high': high(user); cb.drawPanel(); break; case 'dt_deny': deny(user); cb.drawPanel(); break; case 'dt_allow': allow(user); cb.drawPanel(); break; case 'dt_showmenu': showMenu(); break; case 'promote': promote(array[1]); break; case 'demote': demote(array[1]); break; case 'dt_dildoadd': addDildo(user); break; case 'dt_dildorem': remDildo(user); break; case 'dt_switch': switchLocation(user); break; } } //give a user the ability to use commands function promote(user) { if (user) { commanders.push(user); tellBoth(user + ' can now use commands.'); } } //remove a user's ability to use commands function demote(user) { if (user) { var index = arrayIndexOf(commanders, user); if (index > -1) { commanders.splice(index, 1); tellBoth(user + ' can no longer user commands.'); } } } //increase speed function increaseSpeed(user) { if (user) { var output = user + ' tipped ' + cb.settings.dt_upspeed + ' to increase speed'; if (speed >= 7) { output += '...but speed is already at maximum!'; tipMessage(output); } else { speed++; tipMessage(output + '!'); broadcasterMessage('Set speed to ' + speed + '.'); } } else { if (speed >= 7) { tellBoth('A mod tried to manually increase speed, but speed is already at maximum.'); } else { speed++; tipMessage('A mod manually increased speed.'); broadcasterMessage('Set speed to ' + speed + '.'); } } } //decrease speed function decreaseSpeed(user) { if (user) { var output = user + ' tipped ' + cb.settings.dt_downspeed + ' to decrease speed'; if (speed <= 1) { output += '...but speed is already at minimum!'; tipMessage(output); } else { speed--; tipMessage(output + '!'); broadcasterMessage('Set speed to ' + speed + '.'); } } else { if (speed <= 1) { tellBoth('A mod tried to manually decrease speed, but speed is already at minimum.'); } else { speed--; tipMessage('A mod manually decreased speed.'); broadcasterMessage('Set speed to ' + speed + '.'); } } } //set the speed function setSpeed(input) { if (input) { var num = Number(input); if (!isNaN(num)) { if (num <= 1) { speed = 1; } else if (num >= 7) { speed = 7; } else { speed = Math.floor(num); } tipMessage('A mod manually set speed to ' + speed + '.'); broadcasterMessage('Set speed to ' + speed + '.'); } } } //mute Rhaenys function mute(user) { if (user) { var output = user + ' tipped ' + cb.settings.dt_mute + ' to mute ' + modelName + '!'; if (muted) { output += '...but she\'s already muted!'; tipMessage(output); } else { muted = true; tipMessage(output + '!'); broadcasterMessage('You may no longer speak.'); } } else { if (muted) { tellBoth('A mod tried to manually mute ' + modelName + ', but she\'s already muted.'); } else { muted = true; tipMessage('A mod manually muted ' + + modelName + '.'); broadcasterMessage('You may no longer speak.'); } } } //mute Rhaenys function unmute(user) { if (user) { var output = user + ' tipped ' + cb.settings.dt_unmute + ' to unmute ' + modelName + '!'; if (!muted) { output += '...but she\'s not muted!'; tipMessage(output); } else { muted = false; tipMessage(output + '!'); broadcasterMessage('You may now speak.'); } } else { if (!muted) { tellBoth('A mod tried to manually unmute ' + modelName + '!, but she\'s not muted.'); } else { muted = false; tipMessage('A mod manually unmuted ' + modelName + '!'); broadcasterMessage('You may now speak.'); } } } //turn off the hitachi function off(user) { if (user) { var output = user + ' tipped ' + cb.settings.dt_off + ' to set the hitachi to OFF'; if (level === 'Off') { output += '...but it\'s already off!';; tipMessage(output); } else { level = 'Off'; tipMessage(output + '!'); broadcasterMessage('Turn off the hitachi.'); } } else { if (level === 'Off'){ tellBoth('A mod tried to manually set the hitachi to OFF, but it\'s already off.'); } else { level = 'Off'; tipMessage('A mod manually set the hitachi to OFF.'); broadcasterMessage('Turn off the hitachi.'); } } } //set the hitachi to Low function low(user) { if (user) { var output = user + ' tipped ' + cb.settings.dt_low + ' to set the hitachi to LOW'; if (level === 'Low') { output += '...but it\'s already on that setting!';; tipMessage(output); } else { level = 'Low'; tipMessage(output + '!'); broadcasterMessage('Set the hitachi to Low.'); } } else { if (level === 'Low'){ tellBoth('A mod tried to manually set the hitachi to LOW, but it\'s already on that setting.'); } else { level = 'Low'; tipMessage('A mod manually set the hitachi to LOW.'); broadcasterMessage('Set the hitachi to Low.'); } } } //set the hitachi to High function high(user) { if (user) { var output = user + ' tipped ' + cb.settings.dt_high + ' to set the hitachi to HIGH'; if (level === 'High') { output += '...but it\'s already on that setting!';; tipMessage(output); } else { level = 'High'; tipMessage(output + '!'); broadcasterMessage('Set the hitachi to High.'); } } else { if (level === 'High'){ tellBoth('A mod tried to manually turn set the hitachi to HIGH, but it\'s already on that setting.'); } else { level = 'High'; tipMessage('A mod manually set the hitachi to HIGH.'); broadcasterMessage('Set the hitachi to High.'); } } } //manually remove cum allowance function deny(user) { if (user) { var output = user + ' tipped ' + cb.settings.dt_deny + ' to deny ' + modelName + ' permission to cum'; if (!sheCanCum) { output += '...but she\'s doesn\'t have permission to cum in the first place!'; tipMessage(output); } else { sheCanCum = false; tipMessage(output + '!'); broadcasterMessage('You may no longer cum.'); } } else { if (!sheCanCum) { tellBoth('A mod tried to manually deny cumming, but it\'s already denied.'); } else { sheCanCum = false; tipMessage('A mod manually denied cumming.'); } } } //manually set cum allowance function allow(user) { if (user) { var output = user + ' tipped ' + cb.settings.dt_allow + ' to allow ' + modelName + ' to cum'; if (sheCanCum) { output += '...but she\'s already allowed'; tipMessage(output); } else { sheCanCum = true; tipMessage(output + '!'); broadcasterMessage('You have permission to cum.'); } } else { if (sheCanCum) { tellBoth('A mod tried to manually allow cumming, but it\'s already allowed.'); } else { sheCanCum = true; tipMessage('A mod manually allowed cumming.'); broadcasterMessage('You have permission to cum.'); } } } //adding dildo function addDildo(user) { if (user) { var output = user + ' tipped ' + cb.settings.dt_dildoadd + ' to add the dildo'; if (dildo) { output += '...but she\'s already using a dildo!'; tipMessage(output); } else { dildo = true; tipMessage(output + '!'); broadcasterMessage('Add the dildo.'); } } else { if (dildo) { tellBoth('A mod tried to manually add the dildo, but it\'s already there.'); } else { dildo = true; tipMessage('A mod manually added the dildo.'); broadcasterMessage('Add the dildo.'); } } } //removing dildo function remDildo(user) { if (user) { var output = user + ' tipped ' + cb.settings.dt_dildoadd + ' to remove the dildo'; if (!dildo) { output += '...but she\'s not using a dildo!'; tipMessage(output); } else { dildo = false; tipMessage(output + '!'); broadcasterMessage('Remove the dildo.'); } } else { if (dildo) { tellBoth('A mod tried to manually remove the dildo, but there\'s not a dildo there.'); } else { dildo = false; tipMessage('A mod manually removed the dildo.'); broadcasterMessage('Remove the dildo.'); } } } function switchLocation(user) { var action; if (butt) { butt = false; action = 'BUTT to CLIT!'; } else { butt = true; action = 'CLIT to BUTT!'; } if (user) { tipMessage(user + ' tipped ' + cb.settings.dt_switch + ' to switch from ' + action); } else { tipMessage('A mod manually switched from ' + action); } } /********** ------------ TIPS ------------ **********/ var tipCommands = {}; //event handler cb.onTip(function (tip) { var user = tip['from_user']; var amount = tip['amount']; checkTipCommands(user, amount); }); //see if a tipped amount matches a command function checkTipCommands(user, amount) { if (tipCommands[amount]) { cb.log(user + ' tipped ' + amount); command(tipCommands[amount], user); } } //sets the proper amounts to their tip commands function parseTipCommands() { for (var key in cb.settings) { if (/^dt_/.test(key)) { var amount = cb.settings[key]; if (amount > 0) tipCommands[amount] = key; } } } /********** ------------ MESSAGES ------------ **********/ var commanders = []; //event handler cb.onMessage(function(msg) { if (msg['m'] === '/dtmenu') { msg['X-Spam'] = true; showMenu(msg['user']); } else if (msg['m'].charAt(0) === '/' && isCommander(msg['user'])) { msg['X-Spam'] = true; command(msg['m'].substring(1)); } }); //see if a user is allowed to use commands function isCommander(user) { return (user === cb.room_slug || arrayIndexOf(commanders, user) > -1); } //generate a list of commanders from the settings function parseCommanders() { if (cb.settings.commanders) { commanders = cb.settings.commanders.split(','); for (var i = 0; i < commanders.length; i++) { commanders[i] = commanders[i].trim(); } } } /********** ------------ COMMUNICATION ------------ **********/ function setModelName() { if (!cb.settings.model_name || cb.settings.model_name.trim() === '') { modelName = ucfirst(cb.room_slug); } else { modelName = ucfirst(cb.settings.model_name.trim()); } } function tipMessage(input) { cb.sendNotice(newLines(input), '', '', '#000099', 'bold', ''); cb.sendNotice(newLines('Type /dtmenu to see all the commands you can give to ' + modelName + '!'), '', '', '#000099', 'bold', ''); } function broadcasterMessage(input) { cb.sendNotice(newLines(':: ------------------------------\n:: ' + input + '\n:: ------------------------------'), cb.room_slug, '', '#660000', 'bold', '');; } //send a message to the broadcaster function tellMe(msg) { cb.sendNotice(newLines(msg), cb.room_slug, '', '', 'bold', ''); } //send a message to mods function tellMods(msg) { cb.sendNotice(newLines(msg), '', '', '', 'bold', 'red'); } //send a message to broadcaster and mods function tellBoth(msg) { tellMe(msg); tellMods(msg); } function makeMenuText() { var output = '===== CONTROL THE HITACHI ====='; if (cb.settings.dt_downspeed > 0) output += '\nDecrease speed [' + cb.settings.dt_downspeed + ' tokens]'; if (cb.settings.dt_upspeed > 0) output += '\nIncrease speed [' + cb.settings.dt_upspeed + ' tokens]'; if (cb.settings.dt_off > 0) output += '\nSet hitachi to OFF [' + cb.settings.dt_off + ' tokens]'; if (cb.settings.dt_low > 0) output += '\nSet hitachi to LOW [' + cb.settings.dt_low + ' tokens]'; if (cb.settings.dt_high > 0) output += '\nSet hitachi to HIGH [' + cb.settings.dt_high + ' tokens]'; if (cb.settings.dt_deny > 0) output += '\nDeny cumming [' + cb.settings.dt_deny + ' tokens]'; if (cb.settings.dt_allow > 0) output += '\nAllow cumming [' + cb.settings.dt_allow + ' tokens]'; if (cb.settings.dt_mute > 0) output += '\nPut on ball gag [' + cb.settings.dt_mute + ' tokens]'; if (cb.settings.dt_unmute > 0) output += '\nRemove ball gag [' + cb.settings.dt_unmute + ' tokens]'; if (cb.settings.dt_dildoadd > 0) output += '\nAdd dildo [' + cb.settings.dt_dildoadd + ' tokens]'; if (cb.settings.dt_dildorem > 0) output += '\nRemove dildo [' + cb.settings.dt_dildorem + ' tokens]'; if (cb.settings.dt_switch > 0) output += '\nSwitch between clit and butt [' + cb.settings.dt_switch + ' tokens]'; output += '\nType /dtmenu to see this menu again!'; menuText = newLines(output); } function showMenu(user) { cb.sendNotice(menuText, user, '', '#000099'); } function autoMenu() { showMenu(); cb.setTimeout(autoMenu, cb.settings.auto_broadcast_timer * 60000); } /********** ------------ MISCELLANEOUS ------------ **********/ //make newlines more visible and readable function newLines(input) { return '\u25A0 ' + input.replace(new RegExp('\n', 'g'), '\n\u25A0 '); } //check if an array contains an instane of the object function arrayIndexOf(array, obj) { for (var i = 0; i < array.length; i++) { if (array[i] === obj) return i; } return -1; } //capitalize the first letter of a string function ucfirst(str) { if (str) return str.charAt(0).toUpperCase() + str.slice(1); return void 0; } /********** ------------ INITIALIZATION ------------ **********/ function init() { setModelName(); makeMenuText(); parseCommanders(); parseTipCommands(); autoMenu(); if (cb.settings.room_subj) cb.changeRoomSubject(cb.settings.room_subj); } /********** ------------ EXECUTE ------------ **********/ init();
© Copyright Chaturbate 2011- 2025. All Rights Reserved.