Apps Home
|
My Uploads
|
Create an App
lovense_new
Author:
philwhelp
Description
Source Code
Launch App
Current Users
Created by:
Philwhelp
App Images
// vars tags = cb.settings.tags; RoomSubject = cb.settings.RoomSubject; GRtopic = cb.settings.GRtopic; // tippers settings var total_tipped = 0; var high_tip_username = "----"; var high_tip_amount = 0; var last_tip_username = "----"; var last_tip_amount = 0; var king_tip_username = "----"; var king_tip_amount = 0; var subject_is_set_with_0 = false; total_tippers = 0; last_time_goal_reached = "never"; //goal settings GoalsReached = 0; GoalR = "no"; goal_done = 0; Gbar =''; pro = 0; toGo = cb.settings.Goal_Value; Goal = cb.settings.Goal_Value; GR = 0; tipper =[]; Gtotal_tipped = 0; GoalType = cb.settings.GoalType; // settings rows line1 = cb.settings.line1_off; line2 = cb.settings.line2_off; line3 = cb.settings.line3_off; // use to switch between panels.. function chktip() { if ((Gtotal_tipped == 0) && (total_tipped == 0) && (cb.settings.useStart == "yes")){ line1 = cb.settings.line1_off; line2 = cb.settings.line2_off; line3 = cb.settings.line3_off;} else if (cb.settings.useGoal == "no"){ line1 = cb.settings.line1_on; line2 = cb.settings.line2_on; line3 = cb.settings.line3_on;} else { line1 = cb.settings.line1_goal; line2 = cb.settings.line2_goal; line3 = cb.settings.line3_goal;} } function mySplit(e) { return e.trim().replace(/\s+/g, " ").split(" ") } //for goal function runRepeatGoal(GT) { if (cb.settings.useGoal == "no") {return;} GT !== "" ? GT : 0; Gtotal_tipped += GT; if(Gtotal_tipped >= Goal) {Gtotal_tipped -=Goal; last_time_goal_reached = new Date(); GoalsReached++;} goal_done = Gtotal_tipped; toGo = Goal - goal_done; desG(); if (GR < GoalsReached) {GR++; (cb.settings.useGoal == "yes" && cb.settings.useGReached == "yes") ? cb.sendNotice('******************************* \n Goal ('+GR+') Reached\n Prize : '+ cb.settings.goal +'\n*******************************','','',cb.settings['msgcolor']) : ''; return runRepeatGoal(0);} } function runSingleGoal(GT) { if (cb.settings.useGoal == "no") {return;} GT !== "" ? GT : 0; Gtotal_tipped += GT; if((Gtotal_tipped >= Goal) && (GR == GoalsReached) && (GoalR == "no")) {Gtotal_tipped = Goal; last_time_goal_reached = new Date(); GoalsReached++;} else if(Gtotal_tipped >= Goal) {Gtotal_tipped = Goal;} goal_done = Gtotal_tipped; toGo = Goal - goal_done; desG(); if ((GR < GoalsReached) && (GoalR == "no")) {GoalR = "yes"; GR++; cb.settings.useGoal == "yes" ? cb.sendNotice('******************************* \n Goal ('+GR+') Reached\n Prize : '+ cb.settings.goal +'\n*******************************','','',cb.settings['msgcolor']) : ''; (cb.settings.useGoal == "yes" && cb.settings.useGoalsub == "yes")? runSubject() : ''; runSingleGoal(0);} (GT > 0 && cb.settings.useGoal == "yes" && cb.settings.useGoalsub == "yes")? runSubject() : ''; } function desG() { Gbar =''; pro = goal_done/Goal*100; pro = pro.toFixed(2); pro_C = Math.floor((pro)/5)*5; pro_full = Math.floor(pro_C/10); pro_half = Math.ceil(pro_C/10)-pro_full; pro_empty =10-pro_full-pro_half; if (cb.settings.gBarType == "blocks") { for (i = 0; i < pro_full; i++) {Gbar += '\u2588';} for (i = 0; i < pro_half; i++) {Gbar += '\u2584';} for (i = 0; i < pro_empty; i++) {Gbar += '\u2002\u007c';} } else { for (i = 0; i < pro_full; i++) {Gbar += '\u2665\u200b';} for (i = 0; i < pro_half; i++) {Gbar += '\u2661';} for (i = 0; i < pro_empty; i++) {Gbar += '\u2661';} } } function resetGoal() { if (GoalType != "single") {cb.sendNotice("you are not in single mode", cb.room_slug,'',"#444444", "normal"); return;} GoalR = "no"; Gtotal_tipped = 0; goal_done = 0; chktip(); runGoals(0); cb.drawPanel(); (cb.settings.useGoalsub == "yes" && cb.settings.useGoal == "yes") ? runSubject(): '';} //setting choices ( main choices ) cb.settings_choices = [ {name: 'sub_goal', label: "--------------Subject & Goal settings---------------", type:'choice', required: false,}, {name: 'RoomSubject', label: "Room Subject.", type: 'str', minLength: 1, maxLength: 255, required: false, defaultValue: 'Welcome to my room:'}, { name: "tags", label: "Tags (#) ", type: "str", minLength: 1, maxLength: 120, required: true, defaultValue: "Lovense" }, {name:'Wmsg', type:'str', required: true, label:'welcome message(# = username)', defaultValue:'Welcome to my room #'}, {name:'useStart', label: 'Do you want to use the start screen?', type:'choice', choice1:'yes', choice2:'no', defaultValue: 'yes'}, {name:'useGoal', label: 'are you using the goal?', type:'choice', choice1:'yes', choice2:'no', defaultValue: 'yes'}, {name:'useGoalsub', label: 'Use Goal instead of subject?', type:'choice', choice1:'yes', choice2:'no', defaultValue: 'no'}, {name:'useGReached', label: 'see reached goal notice(only for repeat goal)?', type:'choice', choice1:'yes', choice2:'no', defaultValue: 'no'}, {name:'GoalType', label: 'Goal Type (single/repeat goal)?', type:'choice', choice1:'single', choice2:'repeat', defaultValue: 'repeat'}, {name:'gBarType', label: 'Goal bar type', type:'choice', choice1:'blocks', choice2:'hearts', defaultValue: 'blocks'}, {name: 'goal', label: "The goal is:(if you are using a goal)", type: 'str', minLength: 1, maxLength: 255, required: true, defaultValue: 'naked'}, {name:'Goal_Value', label:'Goal Amount', type:'int', minValue:0, maxValue:999999, defaultValue:300}, {name:'GRtopic', type:'str', required: true, label:'Topic when goal Reached (single mode only)',}, {name: 'lovense', label: "--------------Options for lovense---------------", type:'choice', required: false,}, {name: 'lovense_options', label: "lovense options colors(back color/text color)", type: 'str', minLength: 7, maxLength: 15, required: true, defaultValue: '#e0ccff/#8A2BE2'}, {name: 'lovense_active', label: "lovense activator colors(back color/text color)", type: 'str', minLength: 7, maxLength: 15, required: true, defaultValue: '#ffccff/#660066'}, {name: 'panel', label: "-------------Options for the panel--------------", type:'choice', required: false,}, {name:'app_back', label: 'Background image for panel', type:'choice', choice1:'fda5004f-c7ea-42f5-8de8-21c876f4b5b6', choice2:'ee74e800-a83e-4e63-9421-37eddaed3086', defaultValue: 'fda5004f-c7ea-42f5-8de8-21c876f4b5b6'}, {name: 'cust_back', label: "custom background for panel (id)", type: 'str', required: false}, {name: 'cust_wid', label: "custom width (line1/line2/line3)", type: 'str', required: false}, {name: 'cust_left', label: "custom position from left (line1/line2/line3)", type: 'str', required: false}, {name:'p_text_pos', label:'text position in the panel', type:'choice', choice1:'center', choice2:'left', choice3:'right', defaultValue: 'center'}, {name: 'panel_colors_off', label: "panel text colors-before tips(1st/2ed/3rd)", type: 'str', minLength: 11, maxLength: 23, required: true, defaultValue: '#DDDDDD/#DDDDDD/#DDDDDD'}, {name: 'line1_off', label: "1st line in panal(start/goal)", type: 'str', minLength: 1, maxLength: 255, required: false, defaultValue: 'Welcome !member'}, {name: 'line2_off', label: "2st line in panal(start/goal)", type: 'str', minLength: 1, maxLength: 255, required: false, defaultValue: 'Tip to start the fun!!'}, {name: 'line3_off', label: "1st line in panal(start/goal)", type: 'str', minLength: 1, maxLength: 255, required: false, defaultValue: 'All tips are appreciated.'}, {name: 'line1_on', label: "1st line in panal(during tips without goal)", type: 'str', minLength: 1, maxLength: 255, required: false, defaultValue: '!TU minions '}, {name: 'line2_on', label: "2st line in panal(during tips without goal)", type: 'str', minLength: 1, maxLength: 255, required: false, defaultValue: '⭐Best minion : "!HTU" - !HTA'}, {name: 'line3_on', label: "1st line in panal(during tips without goal)", type: 'str', minLength: 1, maxLength: 255, required: false, defaultValue:'⭐New minion : "!LTU" - !LTA'}, {name: 'line1_goal', label: "1st line in panal(when using goal)", type: 'str', minLength: 1, maxLength: 255, required: false, defaultValue: 'Goal #!next_goal : !G_sofar / !G_amount ★ [ !remaining Remaining ]'}, {name: 'line2_goal', label: "2st line in panal(when using goal)", type: 'str', minLength: 1, maxLength: 255, required: false, defaultValue: 'Goal is ★ !goal'}, {name: 'line3_goal', label: "3rd line in panal(when using goal)", type: 'str', minLength: 1, maxLength: 255, required: false, defaultValue:'Progress: !Goal_bar ★ !Goal_pro'}, {name: 'gms', label: "-------------Options for alto messages--------------", type:'choice', required: false,}, {name:'useGame', label: 'Are you using a game?', type:'choice', choice1:'yes', choice2:'no', defaultValue: 'no'}, {name:'Gameflex', label: 'how are the tokens set?', type:'choice', choice1:'0 - fixed amount per game', choice2:'1 - multiple games with fixed amounts', choice3:'2 - multiple games with flexible amounts', defaultValue: '0 - fixed amount per game'}, {name:'GameTot', label:'max games that can be played in 1 tip', type:'int', minValue:0, maxValue:999999, defaultValue:3}, {name:'GameAmount', label:'Tokens per game', type:'int', minValue:0, maxValue:999999, defaultValue:25}, {name: 'ads', label: "-------------Options for alto messages--------------", type:'choice', required: false,}, {name:'msgcolor', type:'str', label:'Notice color (html code default dark red #9F000F)', defaultValue: '#9F000F'}, {name:'use_thx', label:'Use auto thank you msg', type:'choice', choice1:'yes', choice2:'no', defaultValue: 'yes'}, {name:'thx_color', type:'str', label:'thank you message (back color/text color)', defaultValue: '#fdfdfd/#9F000F'}, {name:'thx_msg', type:'str', label:'thank you message (# = members name)', defaultValue: 'thank you so much #'}, {name:'use_auto', label:'Use auto Message', type:'choice', choice1:'yes', choice2:'no', defaultValue: 'yes'}, {name: 'chat_ad', type:'int', minValue: 1, maxValue: 999, defaultValue: 2, label: 'Delay in minutes between notices being displayed (minimum 1)'}, {name:'msg1', type:'str', required: true, label:'auto Message 1',}, {name:'msg2', type:'str', required: false, label:'auto Message 2',}, {name:'msg3', type:'str', required: false, label:'auto Message 3',}, {name:'msg4', type:'str', required: false, label:'auto Message 4',}, {name:'msg5', type:'str', required: false, label:'auto Message 5',}, {name:'msg6', type:'str', required: false, label:'auto Message 6',} ]; //split function function C_split(s,v) { if (s) { res = s.split("\/") [v]; return res;} else {return;} } function changeGoal(ST) { if (GoalType != "single") {cb.sendNotice("you are not in single mode", cb.room_slug,'',"#444444", "normal"); return;} GoalR = "no"; var nub = ST.match(/[1-9][0-9]{0,3}/g)[0]; var nub_length = nub.length; var nub_pos = ST.indexOf(nub); n_str = ST.slice(nub_pos+nub_length+1); cb.settings.goal = ST.slice(nub_pos+nub_length+1); Goal = nub; Gtotal_tipped = 0; runGoals(0); cb.drawPanel(); (cb.settings.useGoalsub == "yes" && cb.settings.useGoal == 'yes')? runSubject() : ''; cb.sendNotice('Goal Updated to : (' + Goal + ')' + cb.settings.goal, cb.room_slug); } function changeGoalA(ST) { var nub = ST.match(/[1-9][0-9]{0,3}/g)[0]; Goal = nub; runGoals(0); cb.drawPanel(); (cb.settings.useGoalsub == "yes" && cb.settings.useGoal == 'yes')? runSubject() : ''; cb.sendNotice('the Goal amount is now : (' + Goal + ')', cb.room_slug); } function changeGoalN(ST) { var nub_pos = ST.indexOf("goalName"); cb.settings.goal = ST.slice(nub_pos+9); runGoals(0); cb.drawPanel(); cb.settings.useGoal == 'yes'? runSubject() : ''; cb.sendNotice('The Goal Name has been set to : (' + cb.settings.goal + ')', cb.room_slug); } function changeTip(ST) { if (cb.settings.useGoal == 'no') {cb.sendNotice("the goal is not active", cb.room_slug,'',"#444444", "normal"); return;} res = ST.match(/[1-9][0-9]{0,3}|-[1-9][0-9]{0,3}/g); Gtotal_tipped += Number(res); Gtotal_tipped < 0? Gtotal_tipped = 0 : ''; chT = Goal - Gtotal_tipped; chktip(); cb.sendNotice('Total Needed has been changed to : (' + chT + ')', cb.room_slug); runGoals(0); (Gtotal_tipped < Goal && cb.settings.useGoal == "yes" && cb.settings.useGoalsub == "yes")? runSubject() : ''; refreshpanel(); } cb.onMessage(function (msg) { str = msg['m']; if ((str.includes("------")) && (msg['user'] == cb.room_slug)){ msg['background'] = C_split(cb.settings.lovense_options, '0'); msg['c'] = C_split(cb.settings.lovense_options,'1'); msg['f'] = "Arial Black"; } if ((str.includes("******")) && (msg['user'] == cb.room_slug)){ msg['background'] = C_split(cb.settings.lovense_active, '0');; msg['c'] = C_split(cb.settings.lovense_active, '1'); msg['f'] = "Arial Black";} if ((str.includes("/resetGoal")) && (msg['user'] == cb.room_slug)) {msg['X-Spam'] = true; resetGoal();} if (str.startsWith("/")) {msg['X-Spam'] = true; if ((str.startsWith("/startGoal")) && (msg['user'] == cb.room_slug)) {cb.settings.useGoal = "yes";runGoals(0); chktip(); cb.drawPanel(); runSubject(); } if ((str.startsWith("/stopGoal")) && (msg['user'] == cb.room_slug)) {cb.settings.useGoal = "no"; runGoals(0); chktip(); cb.drawPanel(); runSubject();} if ((str.startsWith("/help")) && (msg['user'] == cb.room_slug)) {loadhelpMSG();} else if ((str.startsWith("/change")) && (msg['user'] == cb.room_slug)) { if (str.includes("goalAmount")) {changeGoalA(str);} else if (str.includes("goalName")) {changeGoalN(str);} else if (str.includes("tipAmount")) {changeTip(str);} else if (str.includes("goal")) { changeGoal(str);} else {cb.sendNotice('nothing updated');} } } return msg; }); var fontSize = 11; var f_weight = 'bold'; var backgroundImage = (cb.settings.cust_back !== "")? cb.settings.cust_back : cb.settings.app_back; var cust_wid = (cb.settings.cust_wid !== "")? cb.settings.cust_wid : "260/260/260"; var cust_left = (cb.settings.cust_left !== "")? cb.settings.cust_left : "5/5/5"; if (backgroundImage == cb.settings.cust_back) {left1 = C_split(cust_left,0); left2 = C_split(cust_left,1),left3 = C_split(cust_left,2); wid1 = C_split(cust_wid,0); wid2 = C_split(cust_wid,1);wid3 = C_split(cust_wid,2);} else if (backgroundImage == "a45ca1da-3464-41c9-8c06-e1304c211db8") {left1 = "4"; left2 = "4"; left3 = "4"; wid1= "225"; wid2 ="225"; wid3 ="225";} else if (backgroundImage == "a758885e-c9c3-4efe-a515-9b85c31d2811") {left1 = "5"; left2 = "5"; left3 = "5"; wid1= "230"; wid2 ="230"; wid3 ="230";} else if (backgroundImage == "f38d2076-7062-401f-b04c-9499b24777d4") {left1 = "25"; left2 = "25"; left3 = "25"; wid1= "245"; wid2 ="245"; wid3 ="245";} else {left1 = C_split(cust_left,0); left2 = C_split(cust_left,1),left3 = C_split(cust_left,2); wid1 = C_split(cust_wid,0); wid2 = C_split(cust_wid,1);wid3 = C_split(cust_wid,2);} cb.onDrawPanel(function(user) { U = user['user']; if (U == '') {U = 'Guest';} return { "template": "image_template", "layers": [ {'type': 'image', 'fileID': backgroundImage}, { 'type': 'text', 'text': loadoptions(line1), 'top': 5, 'left': left1, 'width' : wid1, 'text-align': cb.settings.p_text_pos, 'font-size': fontSize, 'font-weight' : f_weight, 'color': C_split(cb.settings.panel_colors_off, '0'), }, { 'type': 'text', 'text': loadoptions(line2), 'top': 28, 'left': left2, 'width' : wid2, 'text-align': cb.settings.p_text_pos, 'font-size': fontSize, 'font-weight' : f_weight, 'color': C_split(cb.settings.panel_colors_off, '1'), }, { 'type': 'text', 'text': loadoptions(line3), 'top': 50, 'left': left3, 'width' : wid3, 'text-align': cb.settings.p_text_pos, 'font-size': fontSize, 'font-weight' : f_weight, 'color': C_split(cb.settings.panel_colors_off, '2'), }, ], };} ); String.prototype.allReplace = function(obj) { var retStr = this; for (var x in obj) { retStr = retStr.replace(new RegExp(x, 'g'), obj[x]); } return retStr; }; function runSubject() { var RS =(RoomSubject ? RoomSubject : ""); if (GoalR == "yes") { RS = GRtopic +": " + cb.settings.goal;} if((GoalR == "no") && (cb.settings.useGoal == "yes") && (cb.settings.useGoalsub == "yes")) { if (GoalType == "single" ) {RS = "GOAL : "+cb.settings.goal+" ["+toGo+ " tokens Needed]";} else {RS = "Repeat GOAL : "+cb.settings.goal;} ;} cb.changeRoomSubject(RS+tags); } function loadoptions(str) { repArr =[]; if (str.includes("!member") ) {repArr['!member'] = U;} if (str.includes("!LTA") ) {repArr['!LTA'] = last_tip_amount;} if (str.includes("!LTU") ) {repArr['!LTU'] = last_tip_username;} if (str.includes("!HTA") ) {repArr['!HTA'] = high_tip_amount;} if (str.includes("!HTU") ) {repArr['!HTU'] = high_tip_username;} if (str.includes("!KTA") ) {repArr['!KTA'] = king_tip_amount;} if (str.includes("!KTU") ) {repArr['!KTU'] = king_tip_username;} if (str.includes("!TU") ) {repArr['!TU'] = total_tippers;} if (str.includes("!TT") ) {repArr['!TT'] = total_tipped;} if (str.includes("!Goals_Received") ) {repArr['!Goals_Received'] = GoalsReached;} if (str.includes("!next_goal") ) {repArr['!next_goal'] = GoalsReached+1;} if (str.includes("!G_amount") ) {repArr['!G_amount'] = Goal;} if (str.includes("!remaining") ) {repArr['!remaining'] = toGo;} if (str.includes("!G_sofar") ) {repArr['!G_sofar'] = goal_done;} if (str.includes("!Goal_bar") ) {repArr['!Goal_bar'] = Gbar;} if (str.includes("!Goal_pro") ) {repArr['!Goal_pro'] = pro + '%';} if (str.includes("!goal") ) {repArr['!goal'] = cb.settings.goal;} if (str.includes("!reachedTime") && GoalsReached > 0) {repArr['!reachedTime'] = Math.floor(((new Date()).getTime() - last_time_goal_reached.getTime()) / 60000) + ' minutes ago';} else if (str.includes("!reachedTime")) {repArr['!reachedTime'] = last_time_goal_reached;} if (str.includes(" ") ) {repArr[' '] = "\xa0";} if (cb.settings.useGoal == 'no') { repArr['!G_amount'] = 0; repArr['!goal'] = 'not set'; repArr['!remaining'] = 0; repArr['!G_sofar'] = 0; repArr['!Goal_bar'] = "\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591"; repArr['!Goal_pro'] = '0.001%'; } return str.allReplace(repArr); } cb.onTip(function(tip) { if(tipper[tip['from_user']]!==""||tipper[tip['from_user']]!==null||tipper[tip['from_user']]!=='null') { tipper[tip['from_user']] = tip['amount'];} else {tipper[tip['from_user']] += tip['amount'];} total_tipped += tip['amount']; total_tippers = Object.keys(tipper).length; chktip(); runGoals(tip['amount']); if (tipper[tip['from_user']] > king_tip_amount) { king_tip_amount += tip['amount']; king_tip_username = tip['from_user']; } if (total_tipped > cb.settings.tokens) { total_tipped = cb.settings.tokens; } last_tip_amount = tip['amount']; last_tip_username = tip['from_user']; if (tip['amount'] > high_tip_amount) { high_tip_amount = tip['amount']; high_tip_username = tip['from_user'] } if ((cb.settings.thx_msg !== "") && (cb.settings.use_thx == "yes")) { cb.sendNotice(cb.settings['thx_msg'].replace( /#/gi, tip['from_user'] ), '', C_split(cb.settings.thx_color, '0'), C_split(cb.settings.thx_color, '1'), 'bold'); } refreshpanel(); }); cb.settings.tags && (tags = cb.settings.tags.trim() ? cb.settings.tags : ''), (!tags || tags < 0) && (tags += ""); var e = mySplit(tags); tags = ""; for (var t = 0; t < e.length; t++) tags += "#" == e[t].substring(0, 1) ? e[t] : "#" + e[t]; function runGoals(N) { if (GoalType == "single" ) {runSingleGoal(N);} else {runRepeatGoal(N);};} cb.onEnter(function(user) { WelcomeMSG = ''; if (user['user'] == cb.room_slug) {WelcomeMSG = 'welcome ' + user['user'] + ' to your room';} else if (user['is_mod'] == true) {WelcomeMSG = 'welcome ' + user['user'] + ' you are my moderator';} else if (user['user']) {WelcomeMSG = cb.settings['Wmsg'].replace( /#/gi, user['user'] );} if ((user['user'] == cb.room_slug) || (user['is_mod'] == true)) { WelcomeMSG += '\n The Welcome message is: ' + cb.settings['Wmsg'].replace( /#/gi, user['user'] ); } cb.sendNotice(WelcomeMSG,user['user'],'',cb.settings['msgcolor'],'bold'); }); var XY=0; var MAXITEMS=6; modnote = cb.settings.modnote; color = cb.settings['msgcolor']; sid = ''; function chatAd() { if (cb.settings.use_auto == "no") {return;} var msg; while (cb.settings['msg' + (XY + 1)] == 0) { //skip empty messages XY++; XY %= MAXITEMS; } msg = cb.settings['msg' + (XY+1)]; XY++; XY %= MAXITEMS; cb.sendNotice(msg,'','',cb.settings['msgcolor'],'bold'); cb.setTimeout(chatAd, (cb.settings.chat_ad * 60000)); } function loadhelpMSG() { loadMSG = "welcome to the advanced panel \n"; loadMSG += "you can use these options in chat : \n"; loadMSG += "/help - to see all the options \n"; loadMSG += "/resetGoal - will reset the goal (single mode only)\n"; loadMSG += "/change goal (goal Amount) (the goal you want to set) - will also reset the goal (in single mode only) \n"; loadMSG += "/change goalAmount (goal Amount) \n"; loadMSG += "/change goalName (the goal what you want to set) \n"; loadMSG += "/change tipAmount (+/- tip amount) \n"; cb.sendNotice(loadMSG, cb.room_slug,'',"#444444", "normal"); } function refreshpanel() { cb.drawPanel(); if (typeof runner !== 'undefined') {cb.cancelTimeout(runner);} runner = cb.setTimeout(refreshpanel, 10000); } chatAd(); chktip(); runGoals(0); refreshpanel(); runSubject(); loadhelpMSG()
© Copyright Chaturbate 2011- 2024. All Rights Reserved.