diff --git a/aethex-bot/bot.js b/aethex-bot/bot.js index 780e72a..22422d8 100644 --- a/aethex-bot/bot.js +++ b/aethex-bot/bot.js @@ -485,10 +485,11 @@ const REALM_GUILDS = { client.REALM_GUILDS = REALM_GUILDS; // ============================================================================= -// GUILD WHITELIST SYSTEM +// TIERED ACCESS SYSTEM (Open Bot with Federation Gating) // ============================================================================= -const WHITELISTED_GUILDS = [ +// Core AeThex servers - auto-verified for federation +const AETHEX_OFFICIAL_GUILDS = [ '373713073594302464', // AeThex | Corporation '515711457946632232', // AeThex (Main) '525971009313046529', // AeThex | Nexus @@ -496,11 +497,69 @@ const WHITELISTED_GUILDS = [ '1275962459596783686', // AeThex | LABS '1284290638564687925', // AeThex | DevOps '1338564560277344287', // AeThex | Foundation - '352519501201539072', // AeThex | Lone Star Studio - - ...(process.env.EXTRA_WHITELISTED_GUILDS || '').split(',').filter(Boolean), + '352519501201539072', // AeThex | Lone Star Studio ]; -client.WHITELISTED_GUILDS = WHITELISTED_GUILDS; +client.AETHEX_OFFICIAL_GUILDS = AETHEX_OFFICIAL_GUILDS; + +// Check if a server is federation-verified (cached for performance) +const federationCache = new Map(); +client.federationCache = federationCache; + +async function isServerFederationVerified(guildId) { + if (AETHEX_OFFICIAL_GUILDS.includes(guildId)) return true; + + if (federationCache.has(guildId)) { + const cached = federationCache.get(guildId); + if (Date.now() - cached.timestamp < 5 * 60 * 1000) { + return cached.verified; + } + } + + if (!supabase) return false; + + try { + const { data } = await supabase + .from('federation_servers') + .select('verified, tier') + .eq('guild_id', guildId) + .maybeSingle(); + + const verified = data?.verified === true; + federationCache.set(guildId, { verified, tier: data?.tier || 'free', timestamp: Date.now() }); + return verified; + } catch (e) { + return false; + } +} +client.isServerFederationVerified = isServerFederationVerified; + +async function getServerTier(guildId) { + if (AETHEX_OFFICIAL_GUILDS.includes(guildId)) return 'official'; + + if (federationCache.has(guildId)) { + const cached = federationCache.get(guildId); + if (Date.now() - cached.timestamp < 5 * 60 * 1000) { + return cached.tier || 'free'; + } + } + + if (!supabase) return 'free'; + + try { + const { data } = await supabase + .from('federation_servers') + .select('verified, tier') + .eq('guild_id', guildId) + .maybeSingle(); + + const tier = data?.tier || 'free'; + federationCache.set(guildId, { verified: data?.verified, tier, timestamp: Date.now() }); + return tier; + } catch (e) { + return 'free'; + } +} +client.getServerTier = getServerTier; client.on('error', (error) => { console.error('[Discord] Client error:', error.message); @@ -513,17 +572,64 @@ client.on('warn', (warning) => { }); client.on('guildCreate', async (guild) => { - if (!WHITELISTED_GUILDS.includes(guild.id)) { - console.log(`[Whitelist] Unauthorized server detected: ${guild.name} (${guild.id}) - Leaving...`); + console.log(`[Guild] Joined new server: ${guild.name} (${guild.id}) - ${guild.memberCount} members`); + + // Create default server config + if (supabase) { try { - const owner = await guild.fetchOwner(); - await owner.send(`Your server "${guild.name}" is not authorized to use AeThex Bot. The bot has automatically left. Contact the AeThex team if you believe this is an error.`).catch(() => {}); - } catch (e) {} - await guild.leave(); - console.log(`[Whitelist] Left unauthorized server: ${guild.name}`); - return; + await supabase.from('server_config').upsert({ + guild_id: guild.id, + guild_name: guild.name, + created_at: new Date().toISOString() + }, { onConflict: 'guild_id' }); + } catch (e) { + console.warn('[Guild] Could not create server config:', e.message); + } + } + + // Send welcome message to server owner or first available channel + const welcomeEmbed = { + color: 0x4A90E2, + title: '👋 Thanks for adding AeThex Bot!', + description: `Hello **${guild.name}**! I'm now ready to help your community grow with XP, leveling, music, and moderation features.`, + fields: [ + { + name: '🎮 Core Features (Available Now)', + value: '• XP & Leveling System\n• Music Player\n• Basic Moderation\n• Achievements & Quests\n• Welcome/Goodbye Messages', + inline: true + }, + { + name: '🛡️ Federation Features', + value: '• Cross-server ban sync\n• Reputation network\n• Sentinel protection\n• Premium slots\n\n*Requires verification*', + inline: true + }, + { + name: '🚀 Getting Started', + value: '1. Use `/help` to see all commands\n2. Use `/config` to set up your server\n3. Use `/federation apply` to join the protection network' + }, + { + name: '📖 Need Help?', + value: '[Documentation](https://bot.aethex.dev/commands) • [Support Server](https://discord.gg/aethex)' + } + ], + footer: { text: 'AeThex Bot • Powering Communities' }, + timestamp: new Date().toISOString() + }; + + try { + const owner = await guild.fetchOwner(); + await owner.send({ embeds: [welcomeEmbed] }); + } catch (e) { + // Try to find a system channel or first text channel + const channel = guild.systemChannel || guild.channels.cache.find( + c => c.type === 0 && c.permissionsFor(guild.members.me)?.has('SendMessages') + ); + if (channel) { + try { + await channel.send({ embeds: [welcomeEmbed] }); + } catch (err) {} + } } - console.log(`[Whitelist] Joined authorized server: ${guild.name} (${guild.id})`); }); // ============================================================================= @@ -2126,21 +2232,31 @@ const httpServer = http.createServer((req, res) => { return; } - // GET /whitelist - Get whitelisted servers and users + // GET /servers - Get official AeThex servers and all connected servers if (req.url === "/whitelist" && req.method === "GET") { - const whitelistedServers = WHITELISTED_GUILDS.map(guildId => { + const officialServers = AETHEX_OFFICIAL_GUILDS.map(guildId => { const guild = client.guilds.cache.get(guildId); return { id: guildId, name: guild?.name || 'Not Connected', memberCount: guild?.memberCount || 0, connected: !!guild, + official: true, }; }); + const allServers = client.guilds.cache.map(guild => ({ + id: guild.id, + name: guild.name, + memberCount: guild.memberCount, + connected: true, + official: AETHEX_OFFICIAL_GUILDS.includes(guild.id), + })); + res.writeHead(200); res.end(JSON.stringify({ - servers: whitelistedServers, + officialServers, + allServers, users: whitelistedUsers.map(id => ({ id, note: 'Whitelisted User' })), timestamp: new Date().toISOString(), })); diff --git a/aethex-bot/listeners/federationProtection.js b/aethex-bot/listeners/federationProtection.js index 021a2b6..c5f66c8 100644 --- a/aethex-bot/listeners/federationProtection.js +++ b/aethex-bot/listeners/federationProtection.js @@ -8,14 +8,19 @@ module.exports = { if (!supabase) return; try { + // Check if server is federation-verified (uses cache for performance) + const isVerified = await client.isServerFederationVerified?.(member.guild.id); + if (!isVerified) return; + const { data: serverConfig } = await supabase .from('federation_servers') - .select('tier, status, trust_level, reputation_score') + .select('tier, status, trust_level, reputation_score, verified') .eq('guild_id', member.guild.id) .eq('status', 'approved') .maybeSingle(); - if (!serverConfig) return; + // Double-check verification at database level + if (!serverConfig || serverConfig.verified !== true) return; const { data: ban } = await supabase .from('federation_bans') diff --git a/replit.md b/replit.md index cce8b5c..e6d0316 100644 --- a/replit.md +++ b/replit.md @@ -5,7 +5,8 @@ The AeThex Unified Bot is a comprehensive, production-ready Discord bot powering the entire AeThex ecosystem. It provides enterprise-level security, cross-server federation, community engagement features, and multi-purpose server management—all unified into a single powerful instance. ### Current Status -- **Servers:** 7 official AeThex servers (Corporation, Main, Nexus, GameForge, LABS, DevOps, Foundation) +- **Access:** Open to all Discord servers (tiered feature access) +- **Official Servers:** 8 AeThex servers (Corporation, Main, Nexus, GameForge, LABS, DevOps, Foundation, Lone Star Studio) - **Commands:** 76 fully implemented slash commands - **Database:** Supabase (PostgreSQL) with 30+ tables - **Music:** Dual Lavalink nodes for high-availability streaming @@ -14,6 +15,43 @@ The AeThex Unified Bot is a comprehensive, production-ready Discord bot powering --- +## Tiered Access Model + +The bot is now **publicly available** for any Discord server to add. Features are organized into tiers: + +### Free Tier (All Servers) +All servers get immediate access to core features: +- XP & Leveling System +- Music Player (YouTube, Spotify, SoundCloud) +- Basic Moderation (warn, kick, ban, timeout) +- Achievements & Quests +- Welcome/Goodbye Messages +- Polls, Embeds, Announcements +- Daily Rewards & Shop System + +### Federation Tier (Verified Servers) +Servers can apply to join the Federation network for advanced protection: +- Cross-server ban synchronization +- Global reputation tracking +- Sentinel threat detection +- Trust level progression +- Cross-server role sync +- Server directory listing + +**How to Join:** Use `/federation membership apply` to submit an application. + +### Premium Tier ($50/month) +Verified federation servers can upgrade for enhanced protection: +- Auto-kick/ban for ALL severity levels (not just critical) +- Featured server slots +- Priority support +- Advanced analytics + +### Official Tier +AeThex-owned servers have full access to all features automatically. + +--- + ## Core Capabilities ### 1. Unified XP & Leveling System