Bots Home
|
Create an App
cleobot
Author:
osumba
Description
Source Code
Launch Bot
Current Users
Created by:
Osumba
/************************************************************* ** ** Title: Cleopatra House Construction Bot (With Manual Export/Import Persistence) ** Description: Chatbot managing house renovation tiers, manual backup via settings, dynamic count notices, and rewards. ** *************************************************************/ /* * Setup vars & Data Loading from Settings */ var userHouseData = {}; /* * Funzione di caricamento dei dati salvati manualmente dalle impostazioni * Formato atteso nel campo di testo: utente1:1450, utente2:600, utente3:3330 */ function loadSavedData() { if (cb.settings.savedUsersInput && cb.settings.savedUsersInput.trim().length > 0) { var rawData = cb.settings.savedUsersInput.trim().split(','); for (var i = 0; i < rawData.length; i++) { var parts = rawData[i].split(':'); if (parts.length === 2) { var uName = parts[0].trim().toLowerCase(); var uPoints = parseInt(parts[1].trim()); if (!isNaN(uPoints)) { userHouseData[uName] = { totalPoints: uPoints, currentTier: calculateTier(uPoints) }; } } } } } var botVersion = "1.9.0"; var modelName = cb.room_slug; var botTrigger = "/cleobot"; var modCommands = true; var userGreets = true; var genderEmotes = true; var botMsgBg = '#BDDEDC'; var botAlertBg = '#D32B2B'; var botNoteBg = '#99FF66'; // Color, Tag and Emote configurations for each tier var tierConfigs = { 1: { name: "Laborer", tag: "[Laborer 👷]", color: "#73EBEB", emote: "👷" }, 2: { name: "Bricklayer", tag: "[Bricklayer 🧱]", color: "#73B5EB", emote: "🧱" }, 3: { name: "Finisher", tag: "[Finisher 🎨]", color: "#CD73EB", emote: "🎨" }, 4: { name: "Technician", tag: "[Technician 📐]", color: "#FFC517", emote: "📐" }, 5: { name: "Architect", tag: "[Architect 🏛️]", color: "#FCED79", emote: "🏛️" } }; /* * Settings choices */ cb.settings_choices = [ { name: 'genderEmotes', type: 'choice', label: 'Show gender of users in chat?', choice1: 'Yes', choice2: 'No', defaultValue: 'Yes' }, { name: 'userGreets', type: 'choice', label: 'Make special user announcements when they enter?', choice1: 'Yes', choice2: 'No', defaultValue: 'Yes' }, { name: 'autoNotice1', label: 'Promotional Notice 1 text', type: 'str', minLength: 0, maxLength: 512, required: false, defaultValue: '' }, { name: 'tiersDescription', label: 'Description of Tiers and Rewards', type: 'str', minLength: 0, maxLength: 1024, required: false, defaultValue: 'Level 1 (Laborer): 555 tokens. Level 2 (Bricklayer): 1,332 tokens. Level 3 (Finisher): 2,331 tokens. Level 4 (Technician): 3,330 tokens. Level 5 (Architect): 4,329 tokens.' }, // Campo in cui incollare i dati esportati prima di avviare la nuova live { name: 'savedUsersInput', label: 'Saved Users Data (Paste exported string here before starting)', type: 'str', minLength: 0, maxLength: 10240, required: false, defaultValue: '' }, // Tip Menu Items (Livelli 1-5) { name: 'reward1_1', label: 'Reward Tier 1 - Item 1', type: 'str', minLength: 0, maxLength: 100, required: false, defaultValue: '' }, { name: 'reward1_2', label: 'Reward Tier 1 - Item 2', type: 'str', minLength: 0, maxLength: 100, required: false, defaultValue: '' }, { name: 'reward2_1', label: 'Reward Tier 2 - Item 1', type: 'str', minLength: 0, maxLength: 100, required: false, defaultValue: '' }, { name: 'reward2_2', label: 'Reward Tier 2 - Item 2', type: 'str', minLength: 0, maxLength: 100, required: false, defaultValue: '' }, { name: 'reward3_1', label: 'Reward Tier 3 - Item 1', type: 'str', minLength: 0, maxLength: 100, required: false, defaultValue: '' }, { name: 'reward3_2', label: 'Reward Tier 3 - Item 2', type: 'str', minLength: 0, maxLength: 100, required: false, defaultValue: '' }, { name: 'reward4_1', label: 'Reward Tier 4 - Item 1', type: 'str', minLength: 0, maxLength: 100, required: false, defaultValue: '' }, { name: 'reward4_2', label: 'Reward Tier 4 - Item 2', type: 'str', minLength: 0, maxLength: 100, required: false, defaultValue: '' }, { name: 'reward5_1', label: 'Reward Tier 5 - Item 1', type: 'str', minLength: 0, maxLength: 100, required: false, defaultValue: '' }, { name: 'reward5_2', label: 'Reward Tier 5 - Item 2', type: 'str', minLength: 0, maxLength: 100, required: false, defaultValue: '' } ]; // Esegue il caricamento dei dati all'avvio loadSavedData(); /* * Notifiche periodiche automatiche e dinamiche */ function displayNotification1() { if (cb.settings.autoNotice1 && cb.settings.autoNotice1.trim().length > 0) { cb.chatNotice(cb.settings.autoNotice1.trim(), '', botNoteBg, '', 'bold'); } cb.setTimeout(displayNotification1, 10 * 60000); } function displayDynamicStatusNotice() { var laborerCount = 0; var bricklayerCount = 0; var finisherCount = 0; var technicianCount = 0; var architectCount = 0; for (var user in userHouseData) { if (userHouseData.hasOwnProperty(user)) { var tier = userHouseData[user].currentTier; if (tier === 1) laborerCount++; else if (tier === 2) bricklayerCount++; else if (tier === 3) finisherCount++; else if (tier === 4) technicianCount++; else if (tier >= 5) architectCount++; } } var noticeMsg = "Want to enter Cleopatra's house? Tip 555 or more to join the group. Currently there are " + laborerCount + " laborers, " + bricklayerCount + " bricklayers, " + finisherCount + " finishers, " + technicianCount + " technicians, and " + architectCount + " architects!"; cb.chatNotice(noticeMsg, '', botNoteBg, '', 'bold'); cb.setTimeout(displayDynamicStatusNotice, 15 * 60000); } /* * Helper functions */ function isDoubleOrTriple(amount) { var str = amount.toString(); if (str.length === 2) { return str.charAt(0) === str.charAt(1); } if (str.length === 3) { return str.charAt(0) === str.charAt(1) && str.charAt(1) === str.charAt(2); } return false; } function calculateTier(points) { if (points < 555) return 0; if (points >= 555 && points < 1332) return 1; if (points >= 1332 && points < 2331) return 2; if (points >= 2331 && points < 3330) return 3; if (points >= 3330 && points < 4329) return 4; var extraPoints = points - 4329; var architectExtraLevel = Math.floor(extraPoints / 999) + 1; return 5 + architectExtraLevel; } /* * Handle tips from users */ cb.onTip(function (tip) { var tipAmount = parseInt(tip['amount']); var name = tip['from_user'].toLowerCase(); var displayName = tip['from_user']; var msgPublic = ""; if (!userHouseData[name]) { userHouseData[name] = { totalPoints: 0, currentTier: 0 }; } var userData = userHouseData[name]; var oldTier = userData.currentTier; if (oldTier === 0) { if (tipAmount >= 555) { userData.totalPoints += tipAmount; userData.currentTier = calculateTier(userData.totalPoints); msgPublic = '🎉 ' + displayName + ' tipped ' + tipAmount + ' tokens and officially joined the House Construction Crew as a Laborer!'; } else { userData.totalPoints += tipAmount; var missing = 555 - userData.totalPoints; msgPublic = 'Thank you ' + displayName + ' for your tip of ' + tipAmount + ' tokens! You need ' + (missing > 0 ? missing : 0) + ' more cumulative tokens to join the Construction Crew.'; } } else { if (isDoubleOrTriple(tipAmount)) { userData.totalPoints += tipAmount; userData.currentTier = calculateTier(userData.totalPoints); var tierInfo = getTierDisplayInfo(userData.currentTier); msgPublic = '⭐ ' + displayName + ' tipped ' + tipAmount + ' tokens (double/triple digit bonus)! Total points: ' + userData.totalPoints + '. Current Rank: ' + tierInfo.title + '!'; } else { msgPublic = 'Thank you ' + displayName + ' for your tip of ' + tipAmount + ' tokens! (Note: Only double/triple digit tips count towards house progression).'; } } if (msgPublic.length > 0) { cb.chatNotice(msgPublic, '', botMsgBg, '', 'bold'); } }); function getTierDisplayInfo(tier) { if (tier === 0) return { title: "None", tag: "", color: "#FFFFFF", emote: "" }; if (tier >= 1 && tier <= 5) { return { title: tierConfigs[tier].name, tag: tierConfigs[tier].tag, color: tierConfigs[tier].color, emote: tierConfigs[tier].emote }; } else { var archSubLevel = tier - 5; return { title: "Architect Level " + archSubLevel, tag: "[Architect Lvl " + archSubLevel + " 🏛️]", color: tierConfigs[5].color, emote: "🏛️" }; } } /* * Gestione comandi in chat */ cb.onMessage(function(message) { var msg = message['m'].trim(); var name = message['user'].toLowerCase(); var displayName = message['user']; var gender = message['gender']; var genderStr = ""; var isModel = (name === modelName.toLowerCase()); if (userHouseData[name] && userHouseData[name].currentTier > 0) { var tierInfo = getTierDisplayInfo(userHouseData[name].currentTier); message['background'] = tierInfo.color; message['m'] = tierInfo.tag + ' ' + message['m']; } if (msg.indexOf(botTrigger) === 0) { var parts = msg.split(' '); var cmd = parts[1] ? parts[1].toLowerCase() : 'help'; if (cmd === 'help') { message['X-Spam'] = true; var helpText = "--- House Bot Commands ---\n" + botTrigger + " tiers -> Show house tiers description and rewards\n" + botTrigger + " menu -> Show available rewards based on your level\n" + botTrigger + " status -> Show your current points and level"; if (isModel) { helpText += "\n" + botTrigger + " export -> Generate backup text string of user points"; } cb.chatNotice(helpText, displayName, botMsgBg, '', 'bold'); } else if (cmd === 'export' && isModel) { message['X-Spam'] = true; var exportStr = ""; for (var u in userHouseData) { if (userHouseData.hasOwnProperty(u)) { exportStr += u + ":" + userHouseData[u].totalPoints + ","; } } cb.chatNotice("BACKUP STRING (Copy this to settings before next broadcast):\n" + exportStr, displayName, botNoteBg, '', 'bold'); } else if (cmd === 'tiers') { message['X-Spam'] = true; var desc = cb.settings.tiersDescription ? cb.settings.tiersDescription : "No tiers description provided."; cb.chatNotice("--- House Construction Tiers & Rewards ---\n" + desc, displayName, botMsgBg, '', 'bold'); } else if (cmd === 'menu') { message['X-Spam'] = true; var userTier = (userHouseData[name] && userHouseData[name].currentTier > 0) ? userHouseData[name].currentTier : 0; if (userTier === 0) { cb.chatNotice("You are not part of the Construction Crew yet! Tip at least 555 tokens to join as a Laborer.", displayName, botAlertBg, '', 'bold'); } else { var maxAvailableRewardTier = (userTier >= 5) ? 5 : userTier; var menuText = "--- Available Rewards Menu (Your Level: " + getTierDisplayInfo(userTier).title + ") ---\n"; var hasRewards = false; for (var t = 1; t <= maxAvailableRewardTier; t++) { menuText += "► Tier " + t + " Rewards:\n"; var tierHasItems = false; for (var i = 1; i <= 2; i++) { var item = cb.settings['reward' + t + '_' + i]; if (item && item.trim().length > 0) { menuText += " - " + item.trim() + "\n"; tierHasItems = true; hasRewards = true; } } if (!tierHasItems) { menuText += " (No items configured)\n"; } } cb.chatNotice(menuText, displayName, botMsgBg, '', 'bold'); } } else if (cmd === 'status') { message['X-Spam'] = true; var points = (userHouseData[name]) ? userHouseData[name].totalPoints : 0; var tier = (userHouseData[name]) ? userHouseData[name].currentTier : 0; var info = getTierDisplayInfo(tier); cb.chatNotice("Your Stats -> Points: " + points + " | Rank: " + info.title, displayName, botMsgBg, '', 'bold'); } } if (genderEmotes) { switch (gender) { case 'm': genderStr = ':avatar_gen_male'; break; case 'f': genderStr = ':avatar_gen_female'; break; case 's': genderStr = ':avatar_gen_trans'; break; case 'c': genderStr = ':avatar_gen_couple'; break; default: genderStr = ':avatar_gen_unknown'; break; } message['m'] = genderStr + ' ' + message['m']; } }); /* * Handle user entrance messages */ cb.onEnter(function(user) { var name = user['user'].toLowerCase(); if (userGreets && userHouseData[name] && userHouseData[name].currentTier > 0) { var tierInfo = getTierDisplayInfo(userHouseData[name].currentTier); cb.chatNotice('Welcome back to the site, ' + tierInfo.title + ' ' + user['user'] + '!', '', tierInfo.color, '', 'bold'); } cb.chatNotice('\nWelcome to the room! Type ' + botTrigger + ' help to see available commands. Tip at least 555 tokens to join the House Construction Crew!\n\n', user['user'], botMsgBg, '', 'bold'); }); /* * Avvio dei timer per le notifiche periodiche */ if (cb.settings.autoNotice1 && cb.settings.autoNotice1.trim().length > 0) { cb.setTimeout(displayNotification1, 10 * 60000); } cb.setTimeout(displayDynamicStatusNotice, 15 * 60000); /* * Bot Initialization Notice */ cb.chatNotice('House Construction Bot initialized successfully!', '', botMsgBg, '', 'bold');
© Copyright Chaturbate 2011- 2026. All Rights Reserved.