diff --git a/commands/antiraid/bunker.js b/commands/antiraid/bunker.js new file mode 100644 index 0000000..2c5e873 --- /dev/null +++ b/commands/antiraid/bunker.js @@ -0,0 +1,26 @@ +module.exports = { + name: 'bunker', + description: 'Activer le bot bunker', + async execute(interaction, client) { + const guild = interaction.guild; + const dangerousPermissions = [ + 'ADMINISTRATOR', 'VIEW_AUDIT_LOG', 'MANAGE_GUILD', 'MANAGE_ROLES', 'MANAGE_CHANNELS', 'KICK_MEMBERS', 'BAN_MEMBERS', + 'MANAGE_NICKNAMES', 'MANAGE_EMOJIS_AND_STICKERS', 'MANAGE_WEBHOOKS', 'MANAGE_MESSAGES', 'EMBED_LINKS', 'ATTACH_FILES', + 'SEND_TTS_MESSAGES', 'MENTION_EVERYONE', 'MUTE_MEMBERS', 'DEAFEN_MEMBERS', 'MOVE_MEMBERS', 'USE_VAD', 'PRIORITY_SPEAKER' + ]; + + // Kick all bots + await Promise.all(guild.members.cache.filter(member => member.user.bot).map(member => member.kick())); + + // Delete dangerous roles + await Promise.all(guild.roles.cache.filter(role => dangerousPermissions.some(permission => role.permissions.has(permission))).map(role => role.delete())); + + // Delete dangerous channel overrides + await Promise.all(guild.channels.cache.map(async (channel) => { + const permissionOverwrites = channel.permissionOverwrites.cache.filter(overwrite => dangerousPermissions.some(permission => overwrite.allow.has(permission) || overwrite.deny.has(permission))); + await Promise.all(permissionOverwrites.map(overwrite => channel.permissionOverwrites.edit(overwrite.id, {}))); + })); + + await interaction.reply('Le serveur a bien été sécurisé'); + }, +}; diff --git a/commands/gestion/embed.js b/commands/gestion/embed.js new file mode 100644 index 0000000..1752557 --- /dev/null +++ b/commands/gestion/embed.js @@ -0,0 +1,99 @@ +const { EmbedBuilder, ActionRowBuilder, StringSelectMenuBuilder } = require('discord.js'); + + +module.exports = { + name: 'embed', + description: 'Crée un embed customisable', + async execute(message, args, client) { + const embed = new EmbedBuilder(); + + const menu = new StringSelectMenuBuilder() + .setCustomId('embed-options') + .setPlaceholder('Select an option') + .addOptions([ + { label: '📝 Titre', value: 'title' }, + { label: '📖 Description', value: 'description' }, + { label: '🎨 Couleur', value: 'color' }, + { label: '🖼️ Image URL', value: 'image' }, + { label: '🖼️ Thumbnail URL', value: 'thumbnail' }, + { label: '👤 Autheur', value: 'author' }, + { label: '👣 Footer', value: 'footer' }, + { label: '🚀 Envoyer', value: 'send' }, + ]); + + const row = new ActionRowBuilder() + .addComponents(menu); + + const selectMenuMessage = await message.channel.send({ content: `Veuillez sélectionner une option pour l'embed:`, components: [row] }); + + client.on('interactionCreate', async (interaction) => { + if (!interaction.isSelectMenu()) return; + + if (interaction.customId === 'embed-options') { + const selectedOption = interaction.values[0]; + + if (selectedOption === 'send') { + const channelMessage = await interaction.reply({ content: `Veuillez mentionner le salon où l'embed sera envoyé.`, fetchReply: true }); + const channelFilter = m => m.author.id === interaction.user.id; + const channelCollector = interaction.channel.createMessageCollector({ filter: channelFilter, max: 1, time: 60000 }); // 1 minute to reply + + channelCollector.on('collect', async (m) => { + let channel = m.mentions.channels.first(); + if (!channel) { + const channelId = m.content; + channel = interaction.guild.channels.cache.get(channelId); + } + + if (!channel) { + interaction.followUp({ content: 'Salon invalide.' }); + return; + } + + channel.send({ embeds: [embed] }); + message.channel.send(`Embed correctement envoyé dans le channel <#${channel.id}>`) + }); + } else { + const optionMessage = await interaction.reply({ content: `Veuillez entrer ${selectedOption} de l'embed:`, fetchReply: true }); + const optionFilter = m => m.author.id === interaction.user.id; + const optionCollector = interaction.channel.createMessageCollector({ filter: optionFilter, max: 1 }); + optionCollector.on('collect', async (m) => { + let optionValue = ''; + if (m.content.toLowerCase() !== 'cancel') { + optionValue = m.content; + } + + optionMessage.delete(); + m.delete(); + + switch (selectedOption) { + case 'title': + embed.setTitle(optionValue); + break; + case 'description': + embed.setDescription(optionValue); + break; + case 'color': + embed.setColor(optionValue); + break; + case 'image': + embed.setImage(optionValue); + break; + case 'thumbnail': + embed.setThumbnail(optionValue); + break; + case 'author': + embed.setAuthor({ name: optionValue }); + break; + case 'footer': + embed.setFooter({ name: optionValue }); + break; + } + + + selectMenuMessage.edit({ embeds: [embed], components: [row] }); + }); + } + } + }); + }, +}; \ No newline at end of file