const { PermissionFlagsBits, ChannelType } = require('discord.js'); const { stmts } = require('../database'); const { successEmbed, errorEmbed } = require('../utils/embeds'); const { Colors, Roles } = require('../config'); module.exports = { async execute(client, message) { const guild = await client.guilds.fetch(process.env.GUILD_ID); await guild.roles.fetch(); await guild.channels.fetch(); const log = []; // ── 1. Create missing roles ────────────────────────────── const newRoles = ['@@ Server Manager', '@@ Moderator']; for (const roleName of newRoles) { const existing = guild.roles.cache.find(r => r.name === roleName); if (existing) { log.push(`⏭️ Role **${roleName}** already exists`); continue; } const def = Roles.find(r => r.name === roleName); if (!def) continue; // Find position: place below Co-Owner, above Staff const staffRole = guild.roles.cache.find(r => r.name === '@@ Staff'); const pos = staffRole ? staffRole.position + 1 : 1; await guild.roles.create({ name: def.name, color: def.color, permissions: def.permissions, hoist: def.hoist, mentionable: def.mentionable, position: pos, }); log.push(`✅ Created role **${roleName}**`); } // ── 2. Create owner-chat in STAFF ONLY category ────────── const staffCategory = guild.channels.cache.find( c => c.type === ChannelType.GuildCategory && c.name.includes('STAFF ONLY') ); const ownerChatExists = guild.channels.cache.find(c => c.name === '👑・owner-chat'); if (ownerChatExists) { log.push(`⏭️ Channel **👑・owner-chat** already exists`); } else if (!staffCategory) { log.push(`⚠️ STAFF ONLY category not found — skipped owner-chat`); } else { // Fetch roles for permissions const everyoneRole = guild.roles.everyone; const ownerRole = guild.roles.cache.find(r => r.name === '@@ Owner'); const coOwnerRole = guild.roles.cache.find(r => r.name === '@@ Co-Owner'); const svrMgrRole = guild.roles.cache.find(r => r.name === '@@ Server Manager'); const overwrites = [ { id: everyoneRole.id, deny: [PermissionFlagsBits.ViewChannel] }, ]; if (ownerRole) overwrites.push({ id: ownerRole.id, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages] }); if (coOwnerRole) overwrites.push({ id: coOwnerRole.id, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages] }); if (svrMgrRole) overwrites.push({ id: svrMgrRole.id, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages] }); // Get staff-chat to position owner-chat above it const staffChat = guild.channels.cache.find(c => c.name === '🛡️・staff-chat'); const ownerChat = await guild.channels.create({ name: '👑・owner-chat', type: ChannelType.GuildText, parent: staffCategory.id, permissionOverwrites: overwrites, }); // Move above staff-chat if (staffChat) { await ownerChat.setPosition(staffChat.position); } stmts.setState.run('channel_👑・owner-chat', ownerChat.id); log.push(`✅ Created **👑・owner-chat** (above staff-chat)`); } // ── 3. Lock Resources channels to owner-only send ──────── const resourceChannels = ['🌐・resources', '🌐・free-assets', '🌐・scripts', '🌐・drivers']; const everyoneRole = guild.roles.everyone; const ownerRole = guild.roles.cache.find(r => r.name === '@@ Owner'); const verifiedRole = guild.roles.cache.find(r => r.name === '@@ Verified'); const staffRole = guild.roles.cache.find(r => r.name === '@@ Staff'); const boosterRole = guild.roles.cache.find(r => r.name === '@@ Booster'); for (const chName of resourceChannels) { const ch = guild.channels.cache.find(c => c.name === chName); if (!ch) { log.push(`⚠️ Channel **${chName}** not found — skipped`); continue; } const overwrites = [ { id: everyoneRole.id, deny: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages] }, ]; if (verifiedRole) overwrites.push({ id: verifiedRole.id, allow: [PermissionFlagsBits.ViewChannel], deny: [PermissionFlagsBits.SendMessages, PermissionFlagsBits.AttachFiles] }); if (boosterRole) overwrites.push({ id: boosterRole.id, allow: [PermissionFlagsBits.ViewChannel], deny: [PermissionFlagsBits.SendMessages, PermissionFlagsBits.AttachFiles] }); if (staffRole) overwrites.push({ id: staffRole.id, allow: [PermissionFlagsBits.ViewChannel], deny: [PermissionFlagsBits.SendMessages, PermissionFlagsBits.AttachFiles] }); if (ownerRole) overwrites.push({ id: ownerRole.id, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages, PermissionFlagsBits.AttachFiles] }); await ch.permissionOverwrites.set(overwrites); log.push(`🔒 Locked **${chName}** — owner-only send`); } // ── 4. Lock booster-rewards to owner-only send ─────────── const boosterRewards = guild.channels.cache.find(c => c.name === '💎・booster-rewards'); if (boosterRewards) { const overwrites = [ { id: everyoneRole.id, deny: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages] }, ]; if (boosterRole) overwrites.push({ id: boosterRole.id, allow: [PermissionFlagsBits.ViewChannel], deny: [PermissionFlagsBits.SendMessages, PermissionFlagsBits.AttachFiles] }); if (staffRole) overwrites.push({ id: staffRole.id, allow: [PermissionFlagsBits.ViewChannel], deny: [PermissionFlagsBits.SendMessages, PermissionFlagsBits.AttachFiles] }); if (ownerRole) overwrites.push({ id: ownerRole.id, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages, PermissionFlagsBits.AttachFiles] }); await boosterRewards.permissionOverwrites.set(overwrites); log.push(`🔒 Locked **💎・booster-rewards** — owner-only send`); } else { log.push(`⚠️ Channel **💎・booster-rewards** not found — skipped`); } // ── Done ───────────────────────────────────────────────── await message.reply({ embeds: [successEmbed('✅ Updates Applied', log.join('\n'))], }); }, };