Apps Home
|
Create an App
app1
Author:
pepe123
Description
Source Code
Launch App
Current Users
Created by:
Pepe123
/* ################################################################################################################# # Custom bot for tipGoal # # Modules included are: tipGoal,Help # # Author: bot_factory # Version: 20211008.1907 ################################################################################################################# */ /* ############################## # Main (version 20211008.1624) ############################## */ var botname='tipGoal',roomname='tipGoal'; /* ##################################################### # Declare Global variables and initalization function ##################################################### */ var modules={},thismod={},botmods={}; modules.names=[]; var model=cb.room_slug var debug=0; cb.settings_choices=[]; function init() { modnames=modules.names.join(); sendNotice(`:blankx Running ${botname} with the following functions enabled:\n:blankx :blankx ${modnames}\n:blankx Type /help for more info\n:blankx ${botname} was created by bot_factory`,"","#900000"); // sendNotice(`:blankx Bot ${botname} courtesy of alanstuart`,model,"#900000"); for (const m of modsHandling("onInit")) {modules[m].funct("onInit","",m);} botInit(); } /* ############################# # Process Messages ############################# */ cb.onMessage(function (msg) { let c=parseMsg(msg); if (debug) {sendNotice("Debug: user="+c.user+",iscmd="+c.iscmd+",ismod="+c.ismod+",ismodel="+c.ismodel+",isgrey="+c.isgrey+",isfan="+c.isfan+",model="+model+",msg="+c.msg.m,c.user,"#ffffff","#000090","bold");} /* ####################################### # Process chat messages (non-commands) ####################################### */ if (!c.iscmd) { for (const m of modsHandling("onMessage")) { if (modules[m].funct("onMessage",c,m)) {return msg;} } return msg; } /* ####################################### # Process command messages ####################################### */ if (c.iscmd) { if (debug) {sendNotice("Debug: cmd="+c.cmd+",cpct="+c.cmdparmct+",c0="+c.cmd0+",c1="+c.cmd1+",c2="+c.cmd2+",cp1="+c.cmdparms[1],c.user,"#ffffff","#000090","bold");} for (const m of modsHandling("onCommand")) { if (modules[m].funct("onCommand",c,m)) {msg['X-Spam']=true;return msg;} } } // If it was a recognized command but not processed above, it must be syntax or permission error, // Otherwise pass through the command message unaltered (it may be used by another bot) if (c.cmd in c.cmds) {return badCommand('Syntax or Authorization error in command, type "/help" for more info',c);} else {return msg;} }); /* ############################# # Process User Entering Room ############################# */ cb.onEnter(function(user) { if (debug) {sendNotice("Debug: user "+user.user+" entered room","","#ffffff","#000090","bold");} for (const m of modsHandling("onEnter")) {modules[m].funct("onEnter",user,m);} }); /* ############################# # Process User Leaving Room ############################# */ cb.onLeave(function(user) { if (debug) {sendNotice("Debug: user "+user.user+" left room","","#ffffff","#000090","bold");} for (const m of modsHandling("onLeave")) {modules[m].funct("onLeave",user,m);} }); /* ############################# # Process User Following ############################# */ cb.onFollow(function(user) { if (debug) {sendNotice("Debug: user "+user.user+" followed","","#ffffff","#000090","bold");} for (const m of modsHandling("onFollow")) {modules[m].funct("onFollow",user,m);} }); /* ############################# # Process User unFollowing ############################# */ cb.onUnFollow(function(user) { if (debug) {sendNotice("Debug: user "+user.user+" unfollowed","","#ffffff","#000090","bold");} for (const m of modsHandling("onUnFollow")) {modules[m].funct("onUnFollow",user,m);} }); /* ############## # Process Tip ############## */ cb.onTip(function(tip) { if (debug) {sendNotice(`Debug: amt=${tip.smount},msg=${tip.message},from=${tip.from_user}`,"","#ffffff","#000090","bold");} for (const m of modsHandling("onTip")) {modules[m].funct("onTip",tip,m);} }); /* ################## # CORE FUNCTIONS # ################## /* ####################################################################### # Get the list of mods that have a handler for the event ####################################################################### */ function modsHandling(event) { let modlist=[]; modules.names.forEach(m=>{if (modules[m].events.includes(event)) {modlist.push(m)}}) return modlist; } /* ####################################################################### # Parse command parameters and user info into variables ####################################################################### */ function parseMsg(msg) { let c={}; c.msg=msg; c.origmsg=msg.m; c.user=msg.user; if (msg.is_mod||botmods[c.user]) {c.ismod=1;} else {c.ismod=0;} if (msg.has_tokens) {c.isgrey=0;} else {c.isgrey=1;} if (msg.in_fanclub) {c.isfan=1;} else {c.isfan=0;} if (c.user==model) {c.ismodel=1; c.ismod=1;} else {c.ismodel=0;} if (msg.m.substr(0,1)!=='/') {c.iscmd=0; return c;} else {c.iscmd=1} c.cmdparms=[]; c.cmdparms = notBlank(msg.m.substr(1).split(" ")); c.cmd = c.cmdparms[0]; c.cmdparmct = c.cmdparms.length-1; c.cmd0=c.cmd1=c.cmd2=c.cmd1p=c.cms2p=""; if (c.cmdparmct==0) {c.cmd0=c.cmd;} if (c.cmdparmct==1) {c.cmd1=c.cmd; c.cmd1p=c.cmd+" "+c.cmdparms[1];} if (c.cmdparmct==2) {c.cmd2=c.cmd; c.cmd2p=c.cmd+" "+c.cmdparms[1]+" "+c.cmdparms[2];} c.cmds=[]; return c; } /* ########################################################################### # Sends an error message notice in response to an invalid command message ########################################################################### */ function badCommand(badmsg,c) { cb.sendNotice('Error in command "'+c.msg.m+'"'+"\n"+badmsg,c.user,"#900000","#ffffff"); c.msg['X-Spam'] = true; return c.msg; } /* ########################################################################### # Function to facilitate splitting command message parms ########################################################################### */ function notBlank(array) { return array.filter(function(item){ return item != ""; }); } /* ##################################################################################### # Notice management # (if your bot uses this function, add "checkNotices()" into the init section) ##################################################################################### */ var notices={},notice={},lastsend=0;notice.timer=0; // function checkNotices() { const now=new Date().getTime(); if (notice.timer==0) {notice.last=now;} Object.keys(notices).forEach(n=>{ if (notices[n].interval>0) { notices[n].timeleft-=now-notice.last; if (notices[n].timeleft<=0) { showNotice(n); notices[n].timeleft+=notices[n].interval; } } }); notice.last=now; notice.timer=cb.setTimeout(checkNotices,1000); } // function addNotice(n,msg,user,interval,delay=0,fgcolor="#000090",bgcolor="#ffffff",weight="bold") { if (n in notices) {delete notices[n];} if (delay==-1) {delay=Math.floor(Math.random()*interval);} notices[n]={"message":msg,"user":user,"interval":interval*1000,"fgcolor":fgcolor,"bgcolor":bgcolor,"weight":weight,"timeleft":delay*1000}; if ((interval!==0)&&(delay!==0)) showNotice(n); } // function delNotice(n) {if (n in notices) {notices[n].interval=0;}} // function listNotices(user) { if (Object.keys(notices).length==0) {sendNotice("There are currently no Notices",user); return;} sendNotice("# List of notices",user); Object.keys(notices).forEach(n=>{ let u=notices[n].user; if (Array.isArray(u)) {u=u.join();} let m=notices[n].message; if (typeof(m)=='function') {m=m.name+"()";} sendNotice("# name="+n+", user="+u+", interval="+notices[n].interval/1000+" sec, nextnotice="+notices[n].timeleft/1000+"sec, message= "+m,user); }); } // function processUserList(ul) { let ul1=((ul.split(" ")).join("")).split(","); if (ul1.length==0) {return [`#Invalid user list: "${ul}"`]} let ul2=[]; for (u of ul1) { if (validateUserName(u)) {ul2.push(u)} else {return [`#Invalid user name: "${u}"`]} } if (ul2.includes("*")) {return ["*"];} return ul2; } // function validateUserName(n) { if (n.length>32) {return 0;} if ((n=="*")||(n=="*m")||(n=="*b")) {return 1;} if (!/^[a-zA-X0-9_]+$/.test(n)) {return 0;} return 1; } // function showNotice(n) { let m=""; if (typeof(notices[n].message)=='function') {m=notices[n].message();} else {m=notices[n].message;} let users=notices[n].user; if (!Array.isArray(users)) {users=[users];} for (u of users) { if (u=="*m") {sendNotice(m,"",notices[n].fgcolor,notices[n].bgcolor,notices[n].weight,"red");} else { if (u=="*b") {u=model;} else if (u=="*") {u="";} sendNotice(m,u,notices[n].fgcolor,notices[n].bgcolor,notices[n].weight); } } } // function sendNotice(notice,touser="",fgcolor="#000090",bgcolor="#ffffff",weight="bold",togroup="") { var now = new Date().getTime(); var wait = Math.max(lastsend+200-now,0); setTimeout(function(){cb.sendNotice(notice,touser,bgcolor,fgcolor,weight,togroup);},wait); lastsend=now+wait; } /* ##################################################################################### # Read settings for a module into modules[mod].data ##################################################################################### */ function readCBSettings(mod) { const m = modules[mod]; Object.keys(cb.settings).forEach(s=>{ let val = cb.settings[s]; let sp = s.split('_'); if (sp[0].toLowerCase()==mod.toLowerCase()) { if (typeof(val)=="string") { if ((val.toLowerCase()=="-yes-")||(val.toLowerCase()=="-true-")) {val=1;} else if ((val.toLowerCase()=="-no-")||(val.toLowerCase()=="-false-")) {val=0;} } sp.splice(0,1); if (sp[0]) { const ind=Number(sp[0]); if (Number.isInteger(ind)) { sp.splice(0,1); const vn=sp.join('_'); if (!m.data[vn]) {m.data[vn]=[];} m.data[vn][ind]=val; } else { const vn=sp.join('_'); m.data[vn]=val; } } else {m.data[s]=val;} } }) } /* ##################################################################################### # Override cb.setting_choices parameters setup in modules ##################################################################################### */ function deleteSC(scn) { cb.settings_choices.forEach((sc,i)=>{ if (sc.name.toLowerCase()==scn.toLowerCase()) {cb.settings_choices.splice(i,1); return;} }); } /* ######################################################################################### # Stub function to be run on bot initialization -- to be overridden with custom bot code ######################################################################################### */ function botInit() {} /* #################### # MODULES #################### */ /* ##################################################################################### # Module: tipGoal (version 20211008.1907) ##################################################################################### */ modules['tipGoal']={};thismod=modules['tipGoal'];thismod.data={};modules.names.push('tipGoal');thismod.name='tipGoal'; thismod.cmd='g'; thismod.data.fgcol="#ffffff";thismod.data.bgcol="#880000"; thismod.data.goal={}; cb.settings_choices.push( {name:`${thismod.name}_amt`,type:'int',defaultValue:0,minValue:0,label:"Tip Goal Amount (enter 0 for no tip goal)",required:false}, {name:`${thismod.name}_desc`,type:'str',defaultValue:'',label:'Tip Goal Description',required:false,maxLength:128}, {name:`${thismod.name}_start`,type:'int',defaultValue:0,minValue:0,label:"Tip Goal Amount Collected (enter 0 unless continuing a prior goal)",required:false}, {name:`${thismod.name}_timer`,type:'int',defaultValue:180,minValue:0,label:"How often to Display the Goal Counter in the room (seconds)",required:false}, {name:`${thismod.name}_modcmd`,type:'choice',choice1:"-No-",choice2:"-Yes-",defaultValue:'-Yes-',label:'Allow Mods to run tipGoal commands?',required:true} ); thismod.events=["onInit","onCommand","onTip"]; thismod.funct = function(mode,c,m) { mod=modules[m]; if (mode=="onCommand") { if (c.cmd==mod.cmd) { c.cmds[c.cmd]=1; if (c.cmdparmct==0) { let tmsg=`:blankx Tip Goal: ${mod.data.goal.amt} (${mod.data.goal.curramt} Collected, ${mod.data.goal.amt-mod.data.goal.curramt} Remaining)`; if (c.ismodel||(mod.data.modcmd&&c.ismod)) { let gstat="Inactive"; if (mod.data.goal.active) {gstat="Active";} tmsg+=` Timer=${mod.data.goal.timer} Status=${gstat} :blankx\n :blankx ${mod.data.goal.desc} :blankx`; } else { if (!mod.data.goal.active) {tmsg=":blankx Tip Goal is not Active :blankx";} else {tmsg+=` :blankx\n :blankx ${mod.data.goal.desc} :blankx`;} } sendNotice(tmsg,c.user,mod.data.fgcol,mod.data.bgcol); return 1; } else if (!c.ismodel && !(mod.data.modcmd&&c.ismod)) {badCommand(`You are not authorized to run the ${mod.cmd} command`,c); return 1;} else if (c.cmdparmct==1) { if (c.cmdparms[1]=="show") {sendNotice(mod.tipProgress(),"",mod.data.fgcol,mod.data.bgcol); return 1;} else if (c.cmdparms[1]=="stop") { if (!mod.data.goal.active) {badCommand("Tip goal.is not active, it cannot be stoped",c); return 1;} mod.data.goal.active=0; delNotice("tipGoal"); sendNotice("Tip goal.turned off",c.user); return 1; } else if (c.cmdparms[1]=="restart") { if (mod.data.goal.desc==""||mod.data.goal.timer==0||mod.data.goal.amt==0) {badCommand("The tip goal.description, timer, or amount is not set, cannot restart goal",c); return 1;} sendNotice("Tip Goal restarted",c.user); mod.data.goal.active=1; mod.data.goal.curramt=0; addNotice('tipGoal',mod.tipProgress,'*',mod.data.goal.timer,-1,mod.data.fgcol,mod.data.bgcol); return 1; } else { if (!Number.isInteger(Number(c.cmdparms[1]))) {badCommand("The goal.amount specified ("+c.cmdparms[1]+") is not an integer",c); return 1;} if (Number(c.cmdparms[1])<=0) {badCommand("The goal.amount specified ("+c.cmdparms[1]+") must be greater than zero",c); return 1;} if (mod.data.goal.desc==""||mod.data.goal.timer==0) {badCommand("The goal.description or timer is not set, cannot change the amount",c); return 1;} mod.data.goal.amt=Number(c.cmdparms[1]); sendNotice("Tip Goal target changed to "+mod.data.goal.amt+" tokens",c.user); mod.processGoalChange(0,mod.data.goal.curramt); return 1; } } else if (c.cmdparmct==2) { if (c.cmdparms[1]=="sofar") { if (!Number.isInteger(Number(c.cmdparms[2]))) {badCommand("The amount collected specified ("+c.cmdparms[2]+") is not an integer",c); return 1;} if (Number(c.cmdparms[2])<=0) {badCommand("The amount collected specified ("+c.cmdparms[2]+") must be greater than zero",c); return 1;} mod.data.goal.curramt=Number(c.cmdparms[2]); sendNotice("Tip Goal current amount collected changed to "+mod.data.goal.curramt+" tokens",c.user); mod.processGoalChange(0,mod.data.goal.curramt); return 1; } } else { if (!Number.isInteger(Number(c.cmdparms[1]))) {badCommand("The goal.amount specified ("+c.cmdparms[1]+") is not an integer",c); return 1;} if (Number(c.cmdparms[1])<=0) {badCommand("The goal.amount specified ("+c.cmdparms[1]+") must be greater than zero",c); return 1;} if (!Number.isInteger(Number(c.cmdparms[2]))) {badCommand("The goal.noticication timer specified ("+c.cmdparms[2]+") is not an integer",c); return 1;} if (Number(c.cmdparms[2])<=0) {badCommand("The goal.notification timer specified ("+c.cmdparms[2]+") must be greater than zero",c); return 1;} mod.data.goal.amt=Number(c.cmdparms[1]); mod.data.goal.timer=Number(c.cmdparms[2]); let descwords=c.cmdparms.slice(3); mod.data.goal.desc=descwords.join(" "); mod.data.goal.curramt=0; mod.data.goal.active=1; addNotice('tipGoal',mod.tipProgress,'*',mod.data.goal.timer,-1,mod.data.fgcol,mod.data.bgcol); return 1; } } return 0; } else if (mode=="onTip") { let t=c; if (mod.data.goal.active) { mod.data.goal.curramt+=t.amount; mod.processGoalChange(mod.data.goal.curramt-t.amount,mod.data.goal.curramt); } } else if (mode=="onInit") { sendNotice("Module tipGoal is running, Type /g to view Current Goal","",mod.data.bgcol); readCBSettings(m); mod.loadParmsTG(mod.data.amt,mod.data.desc,mod.data.start,mod.data.timer); if (mod.data.goal.active) {addNotice('tipGoal',mod.tipProgress,'*',mod.data.goal.timer,-1,mod.data.fgcol,mod.data.bgcol);} checkNotices(); } return 0; } thismod['loadParmsTG'] = function(a,d,s,t) { const mod=modules["tipGoal"]; mod.data.goal.active=0;mod.data.goal.desc="";mod.data.goal.amt=0;mod.data.goal.curramt=0;mod.data.goal.timer=0; if (a==0) {sendNotice("Goal amount specified in launch parms is 0, tipGoal not activated",model,"#900000"); return;} if (s>=a) {sendNotice("Goal amount specified in launch parms is less than starting amount, tipGoal not activated",model,"#900000"); return;} if (!d) {sendNotice("Goal description specified in launch parms is blank, tipGoal not activated".model,"#900000"); return;} if (t==0) {sendNotice("Goal timer specified in launch parms is 0, tipGoal not activated",model,"#900000"); return;} mod.data.goal.amt=Number(a); mod.data.goal.desc=d; mod.data.goal.timer=t; mod.data.goal.curramt=Number(s);mod.data.goal.active=1; } thismod['tipProgress'] = function() { const mod=modules["tipGoal"]; if (!mod.data.goal.active) {return `Tip Goal is not active`;} if (mod.data.goal.curramt<mod.data.goal.amt) {return `:blankx ##### TIP GOAL (${mod.data.goal.amt}tk) #####\n`+ `:blankx :4rightarrows ${mod.data.goal.desc } :4leftarrows :blankx\n`+ `:blankx :danteyellowdot ONLY ${mod.data.goal.amt-mod.data.goal.curramt} TOKENS TO GO! :danteyellowdot :blankx`;} else {return `Tip Goal of ${mod.data.goal.amt} tokens Reached! ${mod.data.goal.desc}`;} } thismod['processGoalChange'] = function(pa,ca) { const mod=modules["tipGoal"]; if (mod.data.goal.active) { if ((pa<mod.data.goal.amt)&&(ca>=mod.data.goal.amt)) { sendNotice(":goalreached666"); sendNotice(":blankx ### GOAL HAS BEEN REACHED ### :blankx\n"+ ":blankx ### GOAL HAS BEEN REACHED ### :blankx\n"+ ":blankx ### GOAL HAS BEEN REACHED ### :blankx\n"+ ":blankx ### GOAL HAS BEEN REACHED ### :blankx\n"+ ":blankx ### GOAL HAS BEEN REACHED ### :blankx\n", model,"#ffffff","#ff0000"); mod.data.goal.active=0; delNotice("tipGoal"); } else {showNotice('tipGoal');} } } thismod.summary = "set and manage Tip Goals"; thismod.desc = "Establishes a tip goal. tracks how much has been collected against the goal.and displays it\n"+ "as a room notice, and notifies you when the goal.is met. Commands allow you to check the goal.status,\n"+ "stop/restart the goal. replace the goal. and change the goal.target or amount collected."; thismod.lparms = {'Tip Goal Amount': 'AMount of the goal, enter 0 to disable the tip goal', 'Tip Goal Description': 'Description of what the performer will do when the goal is met', 'Tip Goal Amount Collected': 'If you are restrting the bot in the middle of a tip goal, enter the amount already collected, otherwise enter 0', 'How often to display tip goal': 'Enter the frequency (in seconds) the tip goal status notice is to be displayed in the chat', 'Allow mods to run commands': 'Enter Yes or No as to whether mods (in addition to the performer) will be allowed to reset tip goals, etc' }; thismod.commands = {'/g': 'Show the goal and amount collected to the user typing the command. For mods/broadcaster, shows timer as well', '*/g [amt] [timer] [desc]': 'Set the goal.to [amt] with description [desc], with notice displayed timer [timer] minutes', '*/g [amt]': 'Change the goal.target amount to [amt], keeping the same description, timer, and amount collected', '*/g stop': 'Disable the tip goal.', '*/g restart': 'Restart the the tip goal. using previously set amount, description, and timer, Amount collected gets reset to 0', '*/g sofar [amt]': 'Change the amount collected against the goal.to [amt]', '*/g show': 'Display the goal.and its status as a room notice now' }; /* ##################################################################################### # Module: Help (version 20211008.1907) ##################################################################################### */ modules['Help']={};thismod=modules['Help'];thismod.data={};modules.names.push('Help');thismod.name='Help'; thismod.data.fgcol="#000000";thismod.data.bgcol="#00ee00"; thismod.cmd="help"; thismod.events=["onCommand"]; thismod.funct = function(mode,c,m) { mod=modules[m]; if (mode=="onCommand") { if ((c.cmd==mod.cmd)||(c.cmd=="h")||(c.cmd=="?")) { c.cmds[c.cmd]=1; if (c.cmdparmct==0) { let h=`:blankx Help for Bot ${botname}`; if (bothelp&&(typeof(bothelp)=="string")) {bothelp.split("\n").forEach(l=>{h+=`\n :blankx ${l}`})}; if (modules.names.length>0) { h+="\n :blankx This Bot includes the following functions: \n"; for (const m of modules.names) { h+=` :blankx > "${m}"`; if (m.summary) {h+=` - ${m.summary}`;} h+=` \n`; } h+=" :blankx For help on one of these functions, type \"/help [function]\""; } sendNotice(h,c.user,mod.data.fgcol,mod.data.bgcol,"normal"); return 1; } else if (c.cmdparmct==1) { let cm = c.cmdparms[1]; if (cm!=='*') { let mfound=0; for (const m of modules.names) { if ((m==cm)||(m.toLowerCase()==cm)) {mfound=1;cm=m;} else if (modules[m].cmd) {if (modules[m].cmd.toLowerCase()==cm) {mfound=1;cm=m;}} } if (!mfound) {badCommand(`Function "${cm}" not found. Type "/help" for the list of functions in this Bot`,c); return 1;} let h1=` :blankx Help for function "${cm}"`; let cmod=modules[cm]; if (cmod.summary) {h1+=` (${cmod.summary})`;} let h2=""; if (cmod.desc) {cmod.desc.split("\n").forEach(l=>{h2+=` :blankx ${l}\n`});} if (cmod.commands && Object.keys(cmod.commands).length) { h2+=" :blankx Commands: \n"; Object.keys(cmod.commands).forEach(c=>{ let nc=c; let mo=""; if (c.substr(0,1)='*') {nc=c.substr(1);mo="(model/mods only)"} h2+=` :blankx > "${nc}" - ${cmod.commands[c]} ${mo}\n` }); } if (cmod.lparms && Object.keys(cmod.lparms).length) { h2+=" :blankx \n :blankx Launch Parms: \n"; Object.keys(cmod.lparms).forEach(c=>{h2+=` :blankx > "${c}" - ${cmod.lparms[c]}\n`}); } if (h2=="") {sendNotice("No help found for function "+m,c.user,mod.data.fgcol,mod.data.bgcol,"normal");} else {sendNotice(`${h1}\n${h2}`,c.user,mod.data.fgcol,mod.data.bgcol,"normal");} return 1; } else { let h=`Custom bot for <a href="https://chaturbate.com/${roomname}" style="color:#8888ff;text-decoration:underline;">`+ `${roomname}</a>'s room. Current modules included are: ${modnames}<br>`; for (const m of modules.names) { let mod=modules[m]; let mdesc=""; if (mod.summary) {mdesc=" - "+mod.summary;} h+=`<br><span style="font-style:italic;font-weight:bold;text-decoration:underline;color:#0000ff;">${m}</span><b>${mdesc}</b><br>`; if (mod.desc) {mod.desc.split("\n").forEach(l=>{h+=`${l}<br>`});} if (mod.commands && Object.keys(mod.commands).length) { h+=`<span style="text-decoration:underline;font-style:italic;font-weight:bold;color:#000000;">Commands</span><br>`; Object.keys(mod.commands).forEach(c=>{ let nc=c; let mo=""; if (c.substr(0,1)='*') {nc=c.substr(1);mo="(model/mods only)"} h+=` > <span style="font-style:italic;color:#000000;font-weight:bold;">${nc}</span>`+ ` ${modules[m].commands[c]} ${mo}<br>`; }); } if (mod.lparms && Object.keys(mod.lparms).length) { h+=`<span style="text-decoration:underline;font-style:italic;font-weight:bold;color:#000000;">Launch Parameters</span><br>`; Object.keys(mod.lparms).forEach(c=>{ h+=` > <span style="font-style:italic;color:#000000;font-weight:bold;">${c}</span>`+ ` ${modules[m].lparms[c]}<br>`; }); } } sendNotice(`Copy this code to the bot description: ${h}`,c.user,"","","normal"); return 1; } } } } return 0; } thismod.summary = "get help on Bot functions and commands", thismod.desc = "Get help by typing /help, /h, or /?", thismod.commands = {'/h': "Get help on the Bot, and a list of all functions in the bot", '/h [function]': 'Get help on one of the functions in the bot, including it\'s commands', '/h *': "Display an auto-genertaed html description of the bot, that can be cut and paste into the Bot's description screen" }; /* ############ # BOT CODE ############ */ //debug=1; bothelp="tipGoal by bot_factory"; /* ################################################ # AFTER MODULES HAVE BEEN PROCESSED, RUN INIT # ################################################ */ init();
© Copyright Chaturbate 2011- 2024. All Rights Reserved.