diff --git a/commands/antiraid/bunker.js b/commands/antiraid/bunker.js index c64f2b5..1ffd824 100644 --- a/commands/antiraid/bunker.js +++ b/commands/antiraid/bunker.js @@ -1,3 +1,4 @@ +const { PermissionFlagsBits } = require('discord.js'); module.exports = { name: 'bunker', description: 'Activer le bot bunker', @@ -8,9 +9,25 @@ module.exports = { const guild = message.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' + 'MANAGE_EMOJIS_AND_STICKERS', 'MANAGE_WEBHOOKS', 'MANAGE_MESSAGES', + 'MENTION_EVERYONE', 'MUTE_MEMBERS', 'DEAFEN_MEMBERS', 'MOVE_MEMBERS' ]; + // const dangerousPermissions = [ + PermissionFlagsBits.FLAGS. + Permissions.FLAGS.VIEW_AUDIT_LOG, + Permissions.FLAGS.MANAGE_GUILD, + Permissions.FLAGS.MANAGE_ROLES, + Permissions.FLAGS.MANAGE_CHANNELS, + Permissions.FLAGS.KICK_MEMBERS, + Permissions.FLAGS.BAN_MEMBERS, + Permissions.FLAGS.MANAGE_EMOJIS_AND_STICKERS, + Permissions.FLAGS.MANAGE_WEBHOOKS, + Permissions.FLAGS.MANAGE_MESSAGES, + Permissions.FLAGS.MENTION_EVERYONE, + Permissions.FLAGS.MUTE_MEMBERS, + Permissions.FLAGS.DEAFEN_MEMBERS, + Permissions.FLAGS.MOVE_MEMBERS + //]; // Kick all bots await Promise.all(guild.members.cache.filter(member => member.user.bot).map(member => member.kick())); diff --git a/commands/gestion/sync.js b/commands/gestion/sync.js new file mode 100644 index 0000000..2472924 --- /dev/null +++ b/commands/gestion/sync.js @@ -0,0 +1,57 @@ +const { ChannelType } = require("discord.js") +module.exports = { + name: 'sync', + description: "Synchronise les permissions d'un salon avec sa catégorie ou synchronise tous les salons d'une catégorie.", + category: 'moderation', + emote: '🔄', + utilisation: '+sync [#salon/id/all]', + async execute(message, args, client) { + let channel; + if (args[0] === 'all') { + channel = message.channel; + } else { + channel = message.mentions.channels.first() || message.guild.channels.cache.get(args[0]) || message.channel; + } + if (!channel) { + return message.reply("Je n'ai pas pu trouver le salon ou la catégorie spécifiée."); + } + + const category = channel.parent; + if (!category) { + return message.reply("Le salon spécifié n'a pas de catégorie associée."); + } + try { + if (args[0] === 'all') { + const children = category.children.cache; + if (children && children.size > 0) { + children.forEach(childChannel => { + const permissions = category.permissionOverwrites.cache.map(perm => ({ + id: perm.id, + allow: perm.allow, + deny: perm.deny, + type: perm.type + })); + childChannel.permissionOverwrites.set(permissions); + }); + message.reply(`🔄 Tous les salons de la catégorie <#${category.id}> ont été synchronisés.`); + } else { + message.reply("La catégorie spécifiée ne contient pas de salons."); + } + + } else { + const permissions = channel.parent.permissionOverwrites.cache.map(perm => ({ + id: perm.id, + allow: perm.allow, + deny: perm.deny, + type: perm.type + })); + channel.permissionOverwrites.set(permissions); + message.reply(`🔄 Le salon <#${channel.id}> a été synchronisé avec sa catégorie.`); + } + } catch (error) { + console.error(error); + message.reply("Je n'ai pas la permission de gérer les salons ou les catégories."); + } + + }, +}; \ No newline at end of file diff --git a/commands/moderation/hide.js b/commands/moderation/hide.js new file mode 100644 index 0000000..cad5a47 --- /dev/null +++ b/commands/moderation/hide.js @@ -0,0 +1,18 @@ +module.exports = { + name: 'hide', + description: "Enlève la possibilité de voir un salon spécifique.", + category: 'moderation', + emote: '👁️', + utilisation: '+hide [salon]', + async execute(message, args, client) { + let channel = message.mentions.channels.first() || message.guild.channels.cache.get(args[0]) || message.channel; + + try { + await channel.permissionOverwrites.edit(message.guild.roles.everyone, { "ViewChannel": false }); + message.reply(`👁️ Le salon <#${channel.id}> est maintenant caché.`); + } catch (error) { + console.error(error); + message.reply("Je n'ai pas la permission de gérer les salons."); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/hideall.js b/commands/moderation/hideall.js new file mode 100644 index 0000000..d7803b7 --- /dev/null +++ b/commands/moderation/hideall.js @@ -0,0 +1,17 @@ +module.exports = { + name: 'hideall', + description: "Enlève la possibilité de voir tous les salons.", + category: 'moderation', + emote: '👁️', + utilisation: '+hideall', + async execute(message, args, client) { + try { + message.guild.channels.cache.forEach(channel => { + channel.permissionOverwrites.edit(message.guild.roles.everyone, { "ViewChannel": false }); + }); + message.reply(`👁️ Tous les salons sont maintenant cachés.`); + } catch (error) { + message.reply("Je n'ai pas la permission de gérer les salons."); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/lock.js b/commands/moderation/lock.js new file mode 100644 index 0000000..c2ed2ca --- /dev/null +++ b/commands/moderation/lock.js @@ -0,0 +1,19 @@ +module.exports = { + name: 'lock', + description: "Bloque la possibilité de parler dans un salon spécifique.", + category: 'moderation', + emote: '🔒', + utilisation: '+lock [salon]', + async execute(message, args, client) { + let channel = message.mentions.channels.first() ||message.guild.channels.cache.get(args[0]) || message.channel; + + try { + await channel.permissionOverwrites.edit(message.guild.roles.everyone, { "SendMessages": false }); + message.reply(`🔒 Le salon <#${channel.id}> est maintenant verrouillé.`); + } catch (error) { + console.error(error); + message.reply("Je n'ai pas la permission de gérer les salons."); + } + + }, +}; \ No newline at end of file diff --git a/commands/moderation/lockall.js b/commands/moderation/lockall.js new file mode 100644 index 0000000..0e02272 --- /dev/null +++ b/commands/moderation/lockall.js @@ -0,0 +1,24 @@ +const { ChannelType } = require('discord.js'); + +module.exports = { + name: 'lockall', + description: "Bloque la possibilité de parler dans tous les salons textuels du serveur.", + category: 'moderation', + emote: '🔒', + utilisation: '+lockall', + async execute(message, args, client) { + try { + + const textChannels = message.guild.channels.cache.filter(channel => channel.type === ChannelType.GuildText); + + textChannels.forEach(async (channel) => { + await channel.permissionOverwrites.edit(message.guild.roles.everyone, { "SendMessages": false }); + }); + + message.reply(`🔒 Tous les salons textuels du serveur sont maintenant verrouillés.`); + } catch (error) { + console.error(error); + message.reply("Je n'ai pas la permission de gérer les salons."); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/unhide.js b/commands/moderation/unhide.js new file mode 100644 index 0000000..9472f26 --- /dev/null +++ b/commands/moderation/unhide.js @@ -0,0 +1,17 @@ +module.exports = { + name: 'unhide', + description: "Rend visible un salon spécifique.", + category: 'moderation', + emote: '👀', + utilisation: '+unhide [salon]', + async execute(message, args, client) { + let channel = message.mentions.channels.first() || message.guild.channels.cache.get(args[0]) || message.channel; + + try { + await channel.permissionOverwrites.edit(message.guild.roles.everyone, { "ViewChannel": true }); + message.reply(`👀 Le salon <#${channel.id}> est maintenant visible.`); + } catch (error) { + message.reply("Je n'ai pas la permission de gérer les salons."); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/unhideall.js b/commands/moderation/unhideall.js new file mode 100644 index 0000000..f5b75b3 --- /dev/null +++ b/commands/moderation/unhideall.js @@ -0,0 +1,17 @@ +module.exports = { + name: 'unhideall', + description: "Rend visible tous les salons.", + category: 'moderation', + emote: '👀', + utilisation: '+hundiall', + async execute(message, args, client) { + try { + message.guild.channels.cache.forEach(channel => { + channel.permissionOverwrites.edit(message.guild.roles.everyone, { "ViewChannel": true }); + }); + message.reply(`👀 Tous les salons sont maintenant visibles.`); + } catch (error) { + message.reply("Je n'ai pas la permission de gérer les salons."); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/unlock.js b/commands/moderation/unlock.js new file mode 100644 index 0000000..0e0e592 --- /dev/null +++ b/commands/moderation/unlock.js @@ -0,0 +1,19 @@ +module.exports = { + name: 'unlock', + description: "Autorisé la possibilité de parler dans un salon spécifique.", + category: 'moderation', + emote: '🔓', + utilisation: '+unlock [salon]', + async execute(message, args, client) { + let channel = message.mentions.channels.first() ||message.guild.channels.cache.get(args[0]) || message.channel; + + try { + await channel.permissionOverwrites.edit(message.guild.roles.everyone, { "SendMessages": true }); + message.reply(`🔓 Le salon <#${channel.id}> est maintenant déverrouillé.`); + } catch (error) { + console.error(error); + message.reply("Je n'ai pas la permission de gérer les salons."); + } + + }, +}; \ No newline at end of file diff --git a/commands/moderation/unlockall.js b/commands/moderation/unlockall.js new file mode 100644 index 0000000..e2ad0a0 --- /dev/null +++ b/commands/moderation/unlockall.js @@ -0,0 +1,24 @@ +const { ChannelType } = require('discord.js'); + +module.exports = { + name: 'unlockall', + description: "Autorisé la possibilité de parler dans tous les salons textuels du serveur.", + category: 'moderation', + emote: '🔓', + utilisation: '+unlockall', + async execute(message, args, client) { + try { + + const textChannels = message.guild.channels.cache.filter(channel => channel.type === ChannelType.GuildText); + + textChannels.forEach(async (channel) => { + await channel.permissionOverwrites.edit(message.guild.roles.everyone, { "SendMessages": true }); + }); + + message.reply(`🔓 Tous les salons textuels du serveur sont maintenant déverrouillé.`); + } catch (error) { + console.error(error); + message.reply("Je n'ai pas la permission de gérer les salons."); + } + }, +}; \ No newline at end of file diff --git a/events/client/ready.js b/events/client/ready.js index b6dce4d..4b07c3e 100644 --- a/events/client/ready.js +++ b/events/client/ready.js @@ -12,20 +12,17 @@ module.exports = { console.log('Connected to the SQLite database.'); }); - // Wrap the serialize operations in a promise to use async/await + await new Promise((resolve, reject) => { db.serialize(() => { - // Create the table if it doesn't exist db.run('CREATE TABLE IF NOT EXISTS gestion (id TEXT PRIMARY KEY, value TEXT)', (err) => { if (err) { console.error(err.message); reject(err); } else { - console.log('Table gestion created or already exists.'); } }); - // Now that the table is guaranteed to exist, proceed with other operations db.get('SELECT value FROM gestion WHERE id = ?', [client.user.id], (err, row) => { if (err) { console.error(err.message); @@ -46,21 +43,33 @@ module.exports = { reject(err); } else { console.log(`Les permissions ont été chargées pour le bot ${client.user.tag}`); - resolve(); // Resolve the promise once all operations are complete + resolve(); } }); } }); }); }); - + client.snipes = new Map(); console.log(`Le bot ${client.user.tag} est en ligne`); - process.on('uncaughtException', (error) => { - console.error('Uncaught Exception:', error); - }); - - process.on('unhandledRejection', (reason, promise) => { - console.error('Unhandled Rejection at:', promise, 'reason:', reason); - }); + process.on('unhandledRejection', (reason, p) => { + console.log(' [antiCrash] :: Unhandled Rejection/Catch'); + console.log(reason, p); + }); + + process.on('uncaughtException', (err, origin) => { + console.log(' [antiCrash] :: Uncaught Exception/Catch'); + console.log(err, origin); + }); + + process.on('uncaughtExceptionMonitor', (err, origin) => { + console.log(' [antiCrash] :: Uncaught Exception/Catch (MONITOR)'); + console.log(err, origin); + }); + + process.on('multipleResolves', (type, promise, reason) => { + console.log(' [antiCrash] :: Multiple Resolves'); + console.log(type, promise, reason); + }); }, }; \ No newline at end of file diff --git a/main.js b/main.js index 366a2bc..b6d23dd 100644 --- a/main.js +++ b/main.js @@ -2,18 +2,12 @@ require('dotenv').config(); const { Client, IntentsBitField, Collection } = require("discord.js"); const loadCommands = require("./loaders/loadCommands"); const loadEvents = require("./loaders/loadEvents"); -const db = require('quick.db'); -const GestionDb = new db.table('gestion') const client = new Client({intents: new IntentsBitField(3276799)}); client.events = new Collection(); client.commands = new Collection(); -client.snipes = new Map(); -client.once('ready', () => { - const permissions = require('./permissions.json'); - GestionDb.set(`${client.user.id}.permissions`, permissions); - console.log(`${client.user.username} a bien charge les permissions`); -}); + + (async () => { loadCommands(client);