Bots Home
|
Create an App
Addy
Author:
sageadvice247
Description
Source Code
Launch Bot
Current Users
Created by:
Sageadvice247
/** * Safe Room Guide Bot * - Welcomes users * - Responds to commands * - Announces goals/tip menu * - Enforces consent-first rules * * You must adapt the "onMessage" hook + "sendChat" function * to match the Chaturbate bot environment youβre using. */ // ====== CONFIG ====== const CONFIG = { modelName: "(sageadvice247)", botName: "Room Guide β¨", welcomeCooldownMs: 12 * 60 * 1000, // 12 minutes per user globalAnnounceEveryMs: 10 * 60 * 1000, // 10 minutes minTipForPriority: 25, // tokens (adjust) rules: [ "Consent-first. Be respectful.", "No demands or pressure.", "No doxxing, hate, or harassment.", "If you want something, tip + ask politely.", ], tipMenu: [ { remind: "πΆοΈ Tease vibes", tokens: 25 }, { remind: "β¨ Spin the wheel / surprise", tokens: 55 }, { remind: "π΅ Song request / mood change", tokens: 35 }, { remind: "πΈ Snapshot moment", tokens: 45 }, { remind: "π₯ Goal push", tokens: 10 }, ], goals: { title: "Next vibe goal", target: 500, current: 0, }, flirtLines: [ "Hey {user} π glad youβre here.", "{user} just walked in and raised the room temperature π₯", "Welcome, {user} β¨ settle in and enjoy the show.", "{user}β¦ I see you π behave (or tip).", ], softBoundaryLines: [ "I keep things consent-first here π Tip + ask nicely and {model} will decide.", "Keeping it respectful + fun β¨ Use !menu or !goals to play along.", "I canβt negotiate explicit stuff β but I *can* point you to !menu π", ], promos: [ "Tip to support the show π Try: !menu", "Want to help hit the goal? Type !goals β¨", "House vibe: consent-first + respect. Type !rules π‘οΈ", ], }; // ====== STATE ====== const lastWelcomeAt = new Map(); // username -> timestamp let lastGlobalAnnounce = 0; // ====== HELPERS ====== function now() { return Date.now(); } function pick(arr) { return arr[Math.floor(Math.random() * arr.length)]; } function format(str, vars) { return str.replace(/\{(\w+)\}/g, (_, k) => (vars[k] ?? `{${k}}`)); } function buildMenuText() { const lines = CONFIG.tipMenu .map((i) => `${i.remind} β ${i.tokens}`) .join(" | "); return `π Tip Menu: ${lines}`; } function buildGoalText() { const { title, target, current } = CONFIG.goals; const remaining = Math.max(0, target - current); return `π― ${title}: ${current}/${target} (${remaining} to go)`; } function buildRulesText() { return `π‘οΈ Rules: ${CONFIG.rules.join(" β’ ")}`; } function shouldWelcome(username) { const t = lastWelcomeAt.get(username) || 0; return now() - t > CONFIG.welcomeCooldownMs; } function markWelcomed(username) { lastWelcomeAt.set(username, now()); } // ====== INTEGRATION POINTS ====== // Replace these with your actual platform hooks. function sendChat(text) { // TODO: replace with the platformβs send message method console.log(`[BOT CHAT] ${text}`); } // Call this whenever a user sends a message. // message = { username, text, isTip, tipAmount } function onMessage(message) { const username = message.username || "there"; const text = (message.text || "").trim(); // 1) Soft welcome (rate-limited) if (shouldWelcome(username) && !message.isTip) { const line = format(pick(CONFIG.flirtLines), { user: username, model: CONFIG.modelName, }); sendChat(line); markWelcomed(username); } // 2) Commands if (text.startsWith("!")) { const cmd = text.toLowerCase().split(/\s+/)[0]; if (cmd === "!menu") return sendChat(buildMenuText()); if (cmd === "!goals") return sendChat(buildGoalText()); if (cmd === "!rules") return sendChat(buildRulesText()); if (cmd === "!hi") { return sendChat( format("Hey {user} π want the menu or the goal? (!menu / !goals)", { user: username, }) ); } return sendChat("β¨ Try !menu, !goals, or !rules"); } // 3) Tip handling (priority & progress) if (message.isTip) { const amt = Number(message.tipAmount || 0); CONFIG.goals.current += amt; const thanks = amt >= CONFIG.minTipForPriority ? `π ${username}, youβre a star. That tip hits different π` : `π Thank you ${username}!`; sendChat(`${thanks} ${buildGoalText()}`); return; } // 4) If someone is pushing for explicit / negotiation, redirect safely // (Keyword check is intentionally broad β you can tune it.) const pushy = /\b(show|private|nude|explicit|sex|fuck|pussy|cock|anal|dildo|tits|boobs)\b/i.test(text); if (pushy) { return sendChat( format(pick(CONFIG.softBoundaryLines), { model: CONFIG.modelName, }) ); } // 5) Periodic global promo if (now() - lastGlobalAnnounce > CONFIG.globalAnnounceEveryMs) { lastGlobalAnnounce = now(); sendChat(pick(CONFIG.promos)); } } // ====== Example simulation (remove in production) ====== // onMessage({ username: "newguy", text: "hey" }); // onMessage({ username: "newguy", text: "!menu" }); // onMessage({ username: "tipper", isTip: true, tipAmount: 50 }); // onMessage({ username: "pushy", text: "show me tits" });
© Copyright Chaturbate 2011- 2026. All Rights Reserved.