From 9bd39c69cabdff7b5da5ad48209ea3fc09ad2a70 Mon Sep 17 00:00:00 2001 From: VALOU3336 Date: Mon, 22 Apr 2024 18:30:33 +0200 Subject: [PATCH] grand commit que tutur attend ( marche pas le raidmode en dev) sinon il y a pleins de truc comme les anti raid , des coorectif ect --- yourDatabase.db => CHANGELOG.md | 0 README.md | 2 +- backups.db | Bin 12288 -> 12288 bytes commands/antiraid/antiadmin.js | 60 +++ commands/antiraid/antiban.js | 63 ++++ commands/antiraid/antibot.js | 61 +++ commands/antiraid/antichannel.js | 61 +++ commands/antiraid/antieveryone.js | 4 +- commands/antiraid/antijoin.js | 45 +++ commands/antiraid/antileak.js | 45 +++ commands/antiraid/antilink.js | 4 +- commands/antiraid/antimention.js | 58 +++ commands/antiraid/antirole.js | 60 +++ commands/antiraid/antithread.js | 60 +++ commands/antiraid/antiupdate.js | 60 +++ commands/antiraid/antiwebhook.js | 60 +++ commands/antiraid/bunker.js | 40 +- commands/antiraid/creationlimit.js | 47 +++ commands/antiraid/dperm.js | 98 +++++ commands/antiraid/raidmode.js | 39 ++ commands/antiraid/rolelimit.js | 28 +- commands/antiraid/secur.js | 352 ++++++++++++++++++ commands/botcontrol/invite.js | 5 + commands/botcontrol/leave.js | 2 - commands/botcontrol/reload.js | 48 ++- commands/botcontrol/set.js | 81 +++- commands/botcontrol/setactivity.js | 99 +++-- commands/botcontrol/setbanner.js | 48 +++ commands/game/2048.js | 3 - commands/game/claque.js | 46 +++ commands/game/demineur.js | 2 - commands/game/epicgamer.js | 20 + commands/game/fasttype.js | 2 - commands/game/findemoji.js | 3 - commands/game/flood.js | 3 - commands/game/kiss.js | 46 +++ commands/game/lc.js | 2 +- commands/game/marry.js | 4 +- commands/game/morpion.js | 1 - commands/game/rickroll.js | 27 ++ commands/game/slot.js | 2 - commands/game/unmarry.js | 2 +- commands/game/wordle.js | 3 - commands/gestion/bypass.js | 21 ++ commands/gestion/change.js | 41 +- commands/gestion/changeall.js | 34 +- commands/gestion/create.js | 2 +- commands/gestion/embed.js | 11 +- commands/gestion/log.js | 78 ++++ commands/gestion/prefix.js | 7 +- commands/gestion/renew.js | 2 +- commands/gestion/rolereact.js | 4 +- .../{confession.js => setconfession.js} | 0 commands/invite/addinvite.js | 33 ++ commands/invite/invite.js | 34 ++ commands/invite/inviteboard.js | 40 ++ commands/invite/invitereset.js | 44 +++ commands/invite/removeinvite.js | 32 ++ commands/logs/boostlog.js | 64 ++++ commands/logs/channellog.js | 64 ++++ commands/logs/messagelog.js | 29 +- commands/logs/modlog.js | 13 +- commands/logs/presetlog.js | 2 +- commands/logs/rolelog.js | 15 +- commands/logs/{logs.js => setlogs.js} | 35 +- commands/logs/vocallog.js | 15 +- commands/moderation/addrole.js | 54 +++ commands/moderation/badword.js | 22 ++ commands/moderation/ban.js | 54 +-- commands/moderation/baninfo.js | 30 ++ commands/moderation/banlist.js | 68 ++-- commands/moderation/cmute.js | 21 ++ commands/moderation/cunmute.js | 21 ++ commands/moderation/delrole.js | 50 +++ commands/moderation/kick.js | 87 +++-- commands/moderation/nickelreset.js | 20 + commands/moderation/prison.js | 23 +- commands/moderation/sanction.js | 2 +- commands/moderation/unbanall.js | 29 ++ commands/moderation/unwarn.js | 3 +- commands/moderation/warn.js | 5 +- commands/owner/bl.js | 30 +- commands/owner/blinfo.js | 47 +++ commands/owner/version.js | 119 ++++++ commands/owner/wl.js | 2 +- commands/utils/banner.js | 44 ++- commands/utils/blague.js | 25 ++ commands/utils/botconfig.js | 22 +- commands/utils/christmas.js | 20 + commands/utils/films.js | 2 +- commands/utils/halloween.js | 20 + commands/utils/help.js | 153 +++++++- commands/utils/helpall.js | 48 ++- commands/utils/image.js | 3 +- commands/utils/memberstat.js | 2 +- commands/utils/news.js | 56 +++ commands/utils/prevname.js | 139 +++++-- commands/utils/wiki.js | 2 +- events/antiraid.js/ChannelCreate.js | 110 ++++++ events/antiraid.js/ChannelDelete.js | 124 ++++++ events/antiraid.js/ChannelUpdate.js | 127 +++++++ events/antiraid.js/GuildBanAdd.js | 113 ++++++ events/antiraid.js/GuildMemberAdd.js | 186 +++++++++ events/antiraid.js/GuildUpdate.js | 152 ++++++++ events/antiraid.js/MessageCreate2.js | 53 +++ events/antiraid.js/RoleCreate.js | 111 ++++++ events/antiraid.js/RoleDelete.js | 223 +++++++++++ events/antiraid.js/Roleupdate.js | 144 +++++++ events/antiraid.js/ThreadCreate.js | 112 ++++++ events/antiraid.js/TreathDelete.js | 109 ++++++ events/antiraid.js/TreathUpdate.js | 121 ++++++ events/antiraid.js/WehbookCreate.js | 119 ++++++ events/antiraid.js/guildMemberupdate.js | 186 +++++++++ events/antiraid.js/messageCreate.js | 81 +++- events/antiraid.js/ready.js | 49 +++ events/auto/addreact.js | 1 - events/auto/buttonrolevent.js | 1 + events/auto/removereact.js | 37 ++ events/client/ready.js | 40 +- events/client/setstatusready.js | 63 ++++ events/gestion/bl.js | 1 - events/gestion/buttongestion.js | 7 +- events/gestion/greet.js | 2 - ...guildMemberAdd.js => guildMemberUpdate.js} | 14 +- events/gestion/messageUpdate.js | 2 +- events/logs/LogBooste.js | 60 +++ events/logs/channelCreate.js | 27 ++ events/logs/channelDelete.js | 27 ++ events/logs/channelUpdate.js | 32 ++ events/{gestion => logs}/roleUpdate.js | 20 +- fonction/getPermissionLevel.js | 33 +- loaders/events/antiraid.js/ChannelCreate.js | 110 ++++++ loaders/events/antiraid.js/ChannelDelete.js | 124 ++++++ loaders/events/antiraid.js/ChannelUpdate.js | 127 +++++++ loaders/events/antiraid.js/GuildBanAdd.js | 113 ++++++ loaders/events/antiraid.js/GuildMemberAdd.js | 186 +++++++++ loaders/events/antiraid.js/GuildUpdate.js | 152 ++++++++ loaders/events/antiraid.js/MessageCreate2.js | 53 +++ loaders/events/antiraid.js/RoleCreate.js | 111 ++++++ loaders/events/antiraid.js/RoleDelete.js | 223 +++++++++++ loaders/events/antiraid.js/Roleupdate.js | 144 +++++++ loaders/events/antiraid.js/ThreadCreate.js | 112 ++++++ loaders/events/antiraid.js/TreathDelete.js | 109 ++++++ loaders/events/antiraid.js/TreathUpdate.js | 121 ++++++ loaders/events/antiraid.js/WehbookCreate.js | 119 ++++++ loaders/events/antiraid.js/alerteping.js | 43 +++ .../events/antiraid.js/guildMemberupdate.js | 186 +++++++++ loaders/events/antiraid.js/messageCreate.js | 89 +++++ loaders/events/antiraid.js/ready.js | 49 +++ loaders/events/auto/addreact.js | 36 ++ loaders/events/auto/autoreact.js | 27 ++ loaders/events/auto/buttonrolevent.js | 31 ++ loaders/events/auto/removereact.js | 37 ++ loaders/events/client/interactionCreate.js | 11 + loaders/events/client/ready.js | 167 +++++++++ loaders/events/client/setstatusready.js | 63 ++++ loaders/events/gestion/ButtonGestion.js | 158 ++++++++ loaders/events/gestion/Voice.js | 53 +++ loaders/events/gestion/badwordEvent.js | 36 ++ loaders/events/gestion/bl.js | 35 ++ loaders/events/gestion/greet.js | 45 +++ loaders/events/gestion/guildMemberUpdate.js | 68 ++++ loaders/events/gestion/joinevent.js | 66 ++++ loaders/events/gestion/leaveevent.js | 49 +++ loaders/events/gestion/memberconnecte.js | 46 +++ loaders/events/gestion/messageCreate.js | 89 +++++ loaders/events/gestion/messageDelete.js | 37 ++ loaders/events/gestion/messageUpdate.js | 40 ++ loaders/events/gestion/prevname.js | 34 ++ loaders/events/logs/LogBooste.js | 60 +++ loaders/events/logs/channelCreate.js | 27 ++ loaders/events/logs/channelDelete.js | 27 ++ loaders/events/logs/channelUpdate.js | 32 ++ loaders/events/logs/roleUpdate.js | 73 ++++ loaders/loadCommands.js | 120 +++--- package-lock.json | 17 + package.json | 1 + permissions.json | 39 +- 178 files changed, 9241 insertions(+), 480 deletions(-) rename yourDatabase.db => CHANGELOG.md (100%) create mode 100644 commands/antiraid/antiadmin.js create mode 100644 commands/antiraid/antiban.js create mode 100644 commands/antiraid/antibot.js create mode 100644 commands/antiraid/antichannel.js create mode 100644 commands/antiraid/antijoin.js create mode 100644 commands/antiraid/antileak.js create mode 100644 commands/antiraid/antimention.js create mode 100644 commands/antiraid/antirole.js create mode 100644 commands/antiraid/antithread.js create mode 100644 commands/antiraid/antiupdate.js create mode 100644 commands/antiraid/antiwebhook.js create mode 100644 commands/antiraid/creationlimit.js create mode 100644 commands/antiraid/dperm.js create mode 100644 commands/antiraid/raidmode.js create mode 100644 commands/antiraid/secur.js create mode 100644 commands/botcontrol/setbanner.js create mode 100644 commands/game/claque.js create mode 100644 commands/game/epicgamer.js create mode 100644 commands/game/kiss.js create mode 100644 commands/game/rickroll.js create mode 100644 commands/gestion/bypass.js create mode 100644 commands/gestion/log.js rename commands/gestion/{confession.js => setconfession.js} (100%) create mode 100644 commands/invite/addinvite.js create mode 100644 commands/invite/invite.js create mode 100644 commands/invite/inviteboard.js create mode 100644 commands/invite/invitereset.js create mode 100644 commands/invite/removeinvite.js create mode 100644 commands/logs/boostlog.js create mode 100644 commands/logs/channellog.js rename commands/logs/{logs.js => setlogs.js} (60%) create mode 100644 commands/moderation/addrole.js create mode 100644 commands/moderation/baninfo.js create mode 100644 commands/moderation/cmute.js create mode 100644 commands/moderation/cunmute.js create mode 100644 commands/moderation/delrole.js create mode 100644 commands/moderation/nickelreset.js create mode 100644 commands/moderation/unbanall.js create mode 100644 commands/owner/blinfo.js create mode 100644 commands/owner/version.js create mode 100644 commands/utils/blague.js create mode 100644 commands/utils/christmas.js create mode 100644 commands/utils/halloween.js create mode 100644 commands/utils/news.js create mode 100644 events/antiraid.js/ChannelCreate.js create mode 100644 events/antiraid.js/ChannelDelete.js create mode 100644 events/antiraid.js/ChannelUpdate.js create mode 100644 events/antiraid.js/GuildBanAdd.js create mode 100644 events/antiraid.js/GuildMemberAdd.js create mode 100644 events/antiraid.js/GuildUpdate.js create mode 100644 events/antiraid.js/MessageCreate2.js create mode 100644 events/antiraid.js/RoleCreate.js create mode 100644 events/antiraid.js/RoleDelete.js create mode 100644 events/antiraid.js/Roleupdate.js create mode 100644 events/antiraid.js/ThreadCreate.js create mode 100644 events/antiraid.js/TreathDelete.js create mode 100644 events/antiraid.js/TreathUpdate.js create mode 100644 events/antiraid.js/WehbookCreate.js create mode 100644 events/antiraid.js/guildMemberupdate.js create mode 100644 events/antiraid.js/ready.js create mode 100644 events/client/setstatusready.js rename events/gestion/{guildMemberAdd.js => guildMemberUpdate.js} (73%) create mode 100644 events/logs/LogBooste.js create mode 100644 events/logs/channelCreate.js create mode 100644 events/logs/channelDelete.js create mode 100644 events/logs/channelUpdate.js rename events/{gestion => logs}/roleUpdate.js (73%) create mode 100644 loaders/events/antiraid.js/ChannelCreate.js create mode 100644 loaders/events/antiraid.js/ChannelDelete.js create mode 100644 loaders/events/antiraid.js/ChannelUpdate.js create mode 100644 loaders/events/antiraid.js/GuildBanAdd.js create mode 100644 loaders/events/antiraid.js/GuildMemberAdd.js create mode 100644 loaders/events/antiraid.js/GuildUpdate.js create mode 100644 loaders/events/antiraid.js/MessageCreate2.js create mode 100644 loaders/events/antiraid.js/RoleCreate.js create mode 100644 loaders/events/antiraid.js/RoleDelete.js create mode 100644 loaders/events/antiraid.js/Roleupdate.js create mode 100644 loaders/events/antiraid.js/ThreadCreate.js create mode 100644 loaders/events/antiraid.js/TreathDelete.js create mode 100644 loaders/events/antiraid.js/TreathUpdate.js create mode 100644 loaders/events/antiraid.js/WehbookCreate.js create mode 100644 loaders/events/antiraid.js/alerteping.js create mode 100644 loaders/events/antiraid.js/guildMemberupdate.js create mode 100644 loaders/events/antiraid.js/messageCreate.js create mode 100644 loaders/events/antiraid.js/ready.js create mode 100644 loaders/events/auto/addreact.js create mode 100644 loaders/events/auto/autoreact.js create mode 100644 loaders/events/auto/buttonrolevent.js create mode 100644 loaders/events/auto/removereact.js create mode 100644 loaders/events/client/interactionCreate.js create mode 100644 loaders/events/client/ready.js create mode 100644 loaders/events/client/setstatusready.js create mode 100644 loaders/events/gestion/ButtonGestion.js create mode 100644 loaders/events/gestion/Voice.js create mode 100644 loaders/events/gestion/badwordEvent.js create mode 100644 loaders/events/gestion/bl.js create mode 100644 loaders/events/gestion/greet.js create mode 100644 loaders/events/gestion/guildMemberUpdate.js create mode 100644 loaders/events/gestion/joinevent.js create mode 100644 loaders/events/gestion/leaveevent.js create mode 100644 loaders/events/gestion/memberconnecte.js create mode 100644 loaders/events/gestion/messageCreate.js create mode 100644 loaders/events/gestion/messageDelete.js create mode 100644 loaders/events/gestion/messageUpdate.js create mode 100644 loaders/events/gestion/prevname.js create mode 100644 loaders/events/logs/LogBooste.js create mode 100644 loaders/events/logs/channelCreate.js create mode 100644 loaders/events/logs/channelDelete.js create mode 100644 loaders/events/logs/channelUpdate.js create mode 100644 loaders/events/logs/roleUpdate.js diff --git a/yourDatabase.db b/CHANGELOG.md similarity index 100% rename from yourDatabase.db rename to CHANGELOG.md diff --git a/README.md b/README.md index fc9012a..25fa9cf 100644 --- a/README.md +++ b/README.md @@ -20,4 +20,4 @@ valou336 - Développeur principal ## Licence -Ce projet est sous licence Apache 2.0. Consultez le fichier LICENSE pour plus de détails. +Ce projet est sous licence Privée. Consultez le fichier LICENSE pour plus de détails. diff --git a/backups.db b/backups.db index db4dc0fdb47cc7be7d175a2a5a2cbd3a32b5eaf3..a424bc743a740f009dde0f6b0b95c0206d8f4840 100644 GIT binary patch delta 95 zcmZojXh@hK&B!)U#+i|AW5PmyUIqpRW`08k{xW_;{@t4e6_oiW8_IXFIJ2-aOx`aq zscvazZf0z3U~FP!WMph%Ze(O&WTIIyu=u~c03$O1D!Ubc diff --git a/commands/antiraid/antiadmin.js b/commands/antiraid/antiadmin.js new file mode 100644 index 0000000..75c9d21 --- /dev/null +++ b/commands/antiraid/antiadmin.js @@ -0,0 +1,60 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'antiadmin', + description: 'Gère la protection contre les actions d\'administrateur dans le serveur.', + utilisation: 'antiadmin ', + category: 'antiraid', + emote: '🛡️', + async execute(message, args, client) { + const botId = client.user.id; + const guildId = message.guild.id; + let type = args[0]; + let action = args[1]; + + if (!type || !action || + (type !== 'whitelist' && type !== 'wl' && type !== 'owner' && type !== 'buyer' && type !== 'off') || + (action !== 'derank' && action !== 'kick' && action !== 'ban' && action !== 'nothing' && action !== 'rien')) { + return message.reply('Veuillez utiliser la commande correctement: `+antiadmin whitelist/owner/buyer/off derank/kick/ban/nothing`.'); + } + if (type === 'wl') { + type = 'whitelist'; + } + if (action === 'rien') { + action = 'nothing'; + } + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[guildId]) { + data[guildId] = {}; + } + + if (type === 'off') { + data[guildId].antiadmin = null; + message.reply(`La protection contre les actions d'administrateur a été désactivée.`); + } else { + data[guildId].antiadmin = { + type: type, + action: action + }; + message.reply(`La protection contre les actions d'administrateur a été configurée pour les ${type} avec l'action ${action}.`); + } + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], function(err) { + if (err) { + console.error(err.message); + return message.reply('Une erreur est survenue lors de la mise à jour de la configuration.'); + } + }); + }, +}; \ No newline at end of file diff --git a/commands/antiraid/antiban.js b/commands/antiraid/antiban.js new file mode 100644 index 0000000..daf6196 --- /dev/null +++ b/commands/antiraid/antiban.js @@ -0,0 +1,63 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'antiban', + description: 'Gère la protection contre les bans dans le serveur.', + utilisation: 'antiban ', + category: 'antiraid', + emote: '⛔', + async execute(message, args, client) { + const botId = client.user.id; + const guildId = message.guild.id; + let type = args[0]; + let action = args[1]; + const args2 = args[2]; + + if (!type || !action || !args2 || + (type !== 'whitelist' && type !== 'wl' && type !== 'owner' && type !== 'buyer' && type !== 'off') || + (action !== 'derank' && action !== 'kick' && action !== 'ban' && action !== 'nothing' && action !== 'rien') || + isNaN(args2)) { + return message.reply('Veuillez utiliser la commande correctement: `+antiban whitelist/owner/buyer/off derank/kick/ban/nothing `.'); + } + if (type === 'wl') { + type = 'whitelist'; + } + if (action === 'rien') { + action = 'nothing'; + } + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[guildId]) { + data[guildId] = {}; + } + + if (type === 'off') { + data[guildId].antiban = null; + message.reply(`La protection contre les bans a été désactivée.`); + } else { + data[guildId].antiban = { + type: type, + action: action, + number: args2 + }; + message.reply(`La protection contre les bans a été configurée pour les ${type} avec l'action ${action} et le max de ${args2}.`); + } + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], function(err) { + if (err) { + console.error(err.message); + return message.reply('Une erreur est survenue lors de la mise à jour de la configuration.'); + } + }); + }, +}; \ No newline at end of file diff --git a/commands/antiraid/antibot.js b/commands/antiraid/antibot.js new file mode 100644 index 0000000..bb1474f --- /dev/null +++ b/commands/antiraid/antibot.js @@ -0,0 +1,61 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'antibot', + description: 'Gère la protection contre les bots dans le serveur.', + utilisation: 'antibot ', + category: 'antiraid', + emote: '🤖', + async execute(message, args, client) { + const botId = client.user.id; + const guildId = message.guild.id; + let type = args[0]; + let action = args[1]; + + if (!type || !action || + (type !== 'whitelist' && type !== 'wl' && type !== 'owner' && type !== 'buyer' && type !== 'off') || + (action !== 'derank' && action !== 'kick' && action !== 'ban' && action !== 'nothing' && action !== 'rien')) { + return message.reply('Veuillez utiliser la commande correctement: `+antibot whitelist/owner/buyer/off derank/kick/ban/nothing`.'); + } + + if (type === 'wl') { + type = 'whitelist'; + } + if (action === 'rien') { + action = 'nothing'; + } + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[guildId]) { + data[guildId] = {}; + } + + if (type === 'off') { + data[guildId].antibot = null; + message.reply(`La protection contre les bots a été désactivée.`); + } else { + data[guildId].antibot = { + type: type, + action: action + }; + message.reply(`La protection contre les bots a été configurée pour les ${type} avec l'action ${action}.`); + } + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], function(err) { + if (err) { + console.error(err.message); + return message.reply('Une erreur est survenue lors de la mise à jour de la configuration.'); + } + }); + }, +}; \ No newline at end of file diff --git a/commands/antiraid/antichannel.js b/commands/antiraid/antichannel.js new file mode 100644 index 0000000..7f6fb48 --- /dev/null +++ b/commands/antiraid/antichannel.js @@ -0,0 +1,61 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'antichannel', + description: 'Gère la protection contre les channel dans le serveur.', + utilisation: 'antichannel ', + category: 'antiraid', + emote: '#️⃣', + async execute(message, args, client) { + const botId = client.user.id; + const guildId = message.guild.id; + let type = args[0]; + let action = args[1]; + + if (!type || !action || + (type !== 'whitelist' && type !== 'wl' && type !== 'owner' && type !== 'buyer' && type !== 'off') || + (action !== 'derank' && action !== 'kick' && action !== 'ban' && action !== 'nothing' && action !== 'rien')) { + return message.reply('Veuillez utiliser la commande correctement: `+antichannel whitelist/owner/buyer/off derank/kick/ban/nothing`.'); + } + if (type === 'wl') { + type = 'whitelist'; + } + if (action === 'rien') { + action = 'nothing'; + } + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[guildId]) { + data[guildId] = {}; + } + + + if (type === 'off') { + data[guildId].antichannel = null; + message.reply(`La protection contre les channel a été désactivée.`); + } else { + data[guildId].antichannel = { + type: type, + action: action + }; + message.reply(`La protection contre les channel a été configurée pour les ${type} avec l'action ${action}.`); + } + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], function(err) { + if (err) { + console.error(err.message); + return message.reply('Une erreur est survenue lors de la mise à jour de la configuration.'); + } + }); + }, +}; \ No newline at end of file diff --git a/commands/antiraid/antieveryone.js b/commands/antiraid/antieveryone.js index dcbb83f..a86bbd5 100644 --- a/commands/antiraid/antieveryone.js +++ b/commands/antiraid/antieveryone.js @@ -4,9 +4,9 @@ const db = new sqlite3.Database('myDatabase.db'); module.exports = { name: 'antieveryone', description: 'Active ou désactive la protection contre les mentions de tout le monde dans le serveur.', - utilisation: '+antieveryone on/off', + utilisation: 'antieveryone on/off', category: 'antiraid', - + emote: '📢', async execute(message, args, client) { const botId = client.user.id; const guildId = message.guild.id; diff --git a/commands/antiraid/antijoin.js b/commands/antiraid/antijoin.js new file mode 100644 index 0000000..ac7c90e --- /dev/null +++ b/commands/antiraid/antijoin.js @@ -0,0 +1,45 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'antijoin', + description: 'Active ou désactive la protection contre les nouveaux membres rejoignant le serveur.', + utilisation: 'antijoin on/off', + category: 'antiraid', + emote: '🚪', + async execute(message, args, client) { + const botId = client.user.id; + const guildId = message.guild.id; + const status = args[0]; + + if (!status || (status !== 'on' && status !== 'off')) { + return message.reply('Veuillez utiliser la commande correctement: `+antijoin on/off`.'); + } + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[guildId]) { + data[guildId] = {}; + } + + data[guildId].antijoin = { + status: status + }; + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], function(err) { + if (err) { + console.error(err.message); + return message.reply('Une erreur est survenue lors de la mise à jour de la configuration.'); + } + message.reply(`La protection contre les nouveaux membres a été ${status === 'on' ? 'activée' : 'désactivée'}.`); + }); + }, +}; \ No newline at end of file diff --git a/commands/antiraid/antileak.js b/commands/antiraid/antileak.js new file mode 100644 index 0000000..0592966 --- /dev/null +++ b/commands/antiraid/antileak.js @@ -0,0 +1,45 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'antileak', + description: 'Active ou désactive la protection contre les fuites de données dans le serveur.', + utilisation: 'antileak on/off', + category: 'antiraid', + emote: '🔒', + async execute(message, args, client) { + const botId = client.user.id; + const guildId = message.guild.id; + const status = args[0]; + + if (!status || (status !== 'on' && status !== 'off' && status !== 'max')) { + return message.reply('Veuillez utiliser la commande correctement: `+antileak on/off`.'); + } + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[guildId]) { + data[guildId] = {}; + } + + data[guildId].antileak = { + status: status + }; + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], function(err) { + if (err) { + console.error(err.message); + return message.reply('Une erreur est survenue lors de la mise à jour de la configuration.'); + } + message.reply(`La protection contre les fuites de données a été ${status === 'on' ? 'activée' : status === 'max' ? 'maximisée' : 'désactivée'}.`); + }); + }, +}; \ No newline at end of file diff --git a/commands/antiraid/antilink.js b/commands/antiraid/antilink.js index 38121ff..501de8d 100644 --- a/commands/antiraid/antilink.js +++ b/commands/antiraid/antilink.js @@ -4,9 +4,9 @@ const db = new sqlite3.Database('myDatabase.db'); module.exports = { name: 'antilink', description: 'Active ou désactive la protection contre les liens dans le serveur.', - utilisation: '+antilink on/off all/invite', + utilisation: 'antilink on/off all/invite', category: 'antiraid', - + emote: '🔗', async execute(message, args, client) { const botId = client.user.id; const guildId = message.guild.id; diff --git a/commands/antiraid/antimention.js b/commands/antiraid/antimention.js new file mode 100644 index 0000000..f22d605 --- /dev/null +++ b/commands/antiraid/antimention.js @@ -0,0 +1,58 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'antimention', + description: 'Gère la protection contre les mentions dans le serveur.', + utilisation: 'antimention ', + category: 'antiraid', + emote: '✋', + async execute(message, args, client) { + const botId = client.user.id; + const guildId = message.guild.id; + let type = args[0]; + const nombre = args[1]; + + if (!type || !nombre || + (type !== 'whitelist' && type !== 'wl' && type !== 'owner' && type !== 'buyer' && type !== 'off')) { + return message.reply('Veuillez utiliser la commande correctement: `+antimention whitelist/owner/buyer/off `.'); + } + if (type === 'wl') { + type = 'whitelist'; + } + if (isNaN(nombre)) { + return message.reply('Le nombre fourni n\'est pas valide. Veuillez fournir un nombre.'); + } + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[guildId]) { + data[guildId] = {}; + } + + if (type === 'off') { + data[guildId].antimention = null; + message.reply(`La protection contre les mentions a été désactivée.`); + } else { + data[guildId].antimention = { + type: type, + nombre: nombre + }; + message.reply(`La protection contre les mentions a été configurée pour les ${type} avec un nombre de ${nombre}.`); + } + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], function(err) { + if (err) { + console.error(err.message); + return message.reply('Une erreur est survenue lors de la mise à jour de la configuration.'); + } + }); + }, +}; \ No newline at end of file diff --git a/commands/antiraid/antirole.js b/commands/antiraid/antirole.js new file mode 100644 index 0000000..aabbbca --- /dev/null +++ b/commands/antiraid/antirole.js @@ -0,0 +1,60 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'antirole', + description: 'Gère la protection contre les rôles dans le serveur.', + utilisation: 'antirole ', + category: 'antiraid', + emote: '👑', + async execute(message, args, client) { + const botId = client.user.id; + const guildId = message.guild.id; + let type = args[0]; + let action = args[1]; + + if (!type || !action || + (type !== 'whitelist' && type !== 'wl' && type !== 'owner' && type !== 'buyer' && type !== 'off') || + (action !== 'derank' && action !== 'kick' && action !== 'ban' && action !== 'nothing' && action !== 'rien')) { + return message.reply('Veuillez utiliser la commande correctement: `+antirole whitelist/owner/buyer/off derank/kick/ban/nothing`.'); + } + if (type === 'wl') { + type = 'whitelist'; + } + if (action === 'rien') { + action = 'nothing'; + } + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[guildId]) { + data[guildId] = {}; + } + + if (type === 'off') { + data[guildId].antirole = null; + message.reply(`La protection contre les rôles a été désactivée.`); + } else { + data[guildId].antirole = { + type: type, + action: action + }; + message.reply(`La protection contre les rôles a été configurée pour les ${type} avec l'action ${action}.`); + } + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], function(err) { + if (err) { + console.error(err.message); + return message.reply('Une erreur est survenue lors de la mise à jour de la configuration.'); + } + }); + }, +}; \ No newline at end of file diff --git a/commands/antiraid/antithread.js b/commands/antiraid/antithread.js new file mode 100644 index 0000000..943d166 --- /dev/null +++ b/commands/antiraid/antithread.js @@ -0,0 +1,60 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'antithread', + description: 'Gère la protection contre les threads dans le serveur.', + utilisation: 'antiThread ', + category: 'antiraid', + emote: '#️⃣', + async execute(message, args, client) { + const botId = client.user.id; + const guildId = message.guild.id; + let type = args[0]; + let action = args[1]; + + if (!type || !action || + (type !== 'whitelist' && type !== 'wl' && type !== 'owner' && type !== 'buyer' && type !== 'off') || + (action !== 'derank' && action !== 'kick' && action !== 'ban' && action !== 'nothing' && action !== 'rien')) { + return message.reply('Veuillez utiliser la commande correctement: `+antiThread whitelist/owner/buyer/off derank/kick/ban/nothing`.'); + } + if (type === 'wl') { + type = 'whitelist'; + } + if (action === 'rien') { + action = 'nothing'; + } + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[guildId]) { + data[guildId] = {}; + } + + if (type === 'off') { + data[guildId].antiThread = null; + message.reply(`La protection contre les threads a été désactivée.`); + } else { + data[guildId].antiThread = { + type: type, + action: action + }; + message.reply(`La protection contre les threads a été configurée pour les ${type} avec l'action ${action}.`); + } + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], function(err) { + if (err) { + console.error(err.message); + return message.reply('Une erreur est survenue lors de la mise à jour de la configuration.'); + } + }); + }, +}; \ No newline at end of file diff --git a/commands/antiraid/antiupdate.js b/commands/antiraid/antiupdate.js new file mode 100644 index 0000000..e788293 --- /dev/null +++ b/commands/antiraid/antiupdate.js @@ -0,0 +1,60 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'antiupdate', + description: 'Gère la protection contre les mises à jour de canal dans le serveur.', + utilisation: 'antiupdate ', + category: 'antiraid', + emote: '🔄', + async execute(message, args, client) { + const botId = client.user.id; + const guildId = message.guild.id; + let type = args[0]; + let action = args[1]; + + if (!type || !action || + (type !== 'whitelist' && type !== 'wl' && type !== 'owner' && type !== 'buyer' && type !== 'off') || + (action !== 'derank' && action !== 'kick' && action !== 'ban' && action !== 'nothing' && action !== 'rien')) { + return message.reply('Veuillez utiliser la commande correctement: `+antiupdate whitelist/owner/buyer/off derank/kick/ban/nothing`.'); + } + if (type === 'wl') { + type = 'whitelist'; + } + if (action === 'rien') { + action = 'nothing'; + } + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[guildId]) { + data[guildId] = {}; + } + + if (type === 'off') { + data[guildId].antiupdate = null; + message.reply(`La protection contre les mises à jour du serveur a été désactivée.`); + } else { + data[guildId].antiupdate = { + type: type, + action: action + }; + message.reply(`La protection contre les mises à jour du serveur a été configurée pour les ${type} avec l'action ${action}.`); + } + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], function(err) { + if (err) { + console.error(err.message); + return message.reply('Une erreur est survenue lors de la mise à jour de la configuration.'); + } + }); + }, +}; \ No newline at end of file diff --git a/commands/antiraid/antiwebhook.js b/commands/antiraid/antiwebhook.js new file mode 100644 index 0000000..edb2661 --- /dev/null +++ b/commands/antiraid/antiwebhook.js @@ -0,0 +1,60 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'antiwebhook', + description: 'Gère la protection contre les webhooks dans le serveur.', + utilisation: 'antiwebhook ', + category: 'antiraid', + emote: '🌐', + async execute(message, args, client) { + const botId = client.user.id; + const guildId = message.guild.id; + let type = args[0]; + let action = args[1]; + + if (!type || !action || + (type !== 'whitelist' && type !== 'wl' && type !== 'owner' && type !== 'buyer' && type !== 'off') || + (action !== 'derank' && action !== 'kick' && action !== 'ban' && action !== 'nothing' && action !== 'rien')) { + return message.reply('Veuillez utiliser la commande correctement: `+antiwebhook whitelist/owner/buyer/off derank/kick/ban/nothing`.'); + } + if (type === 'wl') { + type = 'whitelist'; + } + if (action === 'rien') { + action = 'nothing'; + } + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[guildId]) { + data[guildId] = {}; + } + + if (type === 'off') { + data[guildId].antiwebhook = null; + message.reply(`La protection contre les webhooks a été désactivée.`); + } else { + data[guildId].antiwebhook = { + type: type, + action: action + }; + message.reply(`La protection contre les webhooks a été configurée pour les ${type} avec l'action ${action}.`); + } + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], function(err) { + if (err) { + console.error(err.message); + return message.reply('Une erreur est survenue lors de la mise à jour de la configuration.'); + } + }); + }, +}; \ No newline at end of file diff --git a/commands/antiraid/bunker.js b/commands/antiraid/bunker.js index dc2bda1..ed3f961 100644 --- a/commands/antiraid/bunker.js +++ b/commands/antiraid/bunker.js @@ -7,19 +7,32 @@ module.exports = { category: 'antiraid', async execute(message, args, client) { const guild = message.guild; - const dangerousPermissions = [ - PermissionsBitField.Flags.Administrator, - PermissionsBitField.Flags.ManageGuild, - PermissionsBitField.Flags.ManageRoles, - PermissionsBitField.Flags.ManageChannels, - PermissionsBitField.Flags.KickMembers, - PermissionsBitField.Flags.BanMembers, - PermissionsBitField.Flags.ManageWebhooks, - PermissionsBitField.Flags.MuteMembers, - PermissionsBitField.Flags.MentionEveryone, - PermissionsBitField.Flags.ManageEvents, - PermissionsBitField.Flags.ManageThreads, - ]; + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + if(args[0] === 'bot') { + await Promise.all(guild.members.cache.filter(member => member.user.bot).map(member => member.kick())); + return message.reply("Tous les bots ont bien été supprimés du serveur"); + }else if (args[0] === 'role') { + await Promise.all(guild.roles.cache.filter(role => dangerousPermissions.some(permission => role.permissions.has(permission))).map(role => role.delete())); + return message.reply("Tous les rôles dangereux ont bien été supprimés du serveur"); + }else if (args[0] === 'salon' || args[0] === 'channels') { + 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, {}))); + })); + return message.reply("Toutes les permissions dangereuses sur les salons ont bien été supprimées du serveur"); + }else { // Kick all bots await Promise.all(guild.members.cache.filter(member => member.user.bot).map(member => member.kick())); @@ -34,5 +47,6 @@ module.exports = { })); await message.reply('Le serveur a bien été sécurisé'); + } }, }; diff --git a/commands/antiraid/creationlimit.js b/commands/antiraid/creationlimit.js new file mode 100644 index 0000000..ea72a45 --- /dev/null +++ b/commands/antiraid/creationlimit.js @@ -0,0 +1,47 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'creationlimit', + description: 'Définit une limite de création de salon après un certain nombre de jours.', + utilisation: 'creationlimit off/10d', + category: 'antiraid', + emote: '🔗', + async execute(message, args, client) { + const botId = client.user.id; + const guildId = message.guild.id; + const limit = args[0]; + + if (!limit || (limit !== 'off' && !limit.match(/^\d+(m|h|d|w)$/))) { + return message.reply('Veuillez utiliser la commande correctement: `+creationlimit off/temps`.'); + } + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[guildId]) { + data[guildId] = {}; + } + + if (limit === 'off') { + data[guildId].creationLimit = null; + } else { + data[guildId].creationLimit = limit; + } + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], function(err) { + if (err) { + console.error(err.message); + return message.reply('Une erreur est survenue lors de la mise à jour de la configuration.'); + } + message.reply(`La limite de création de compte a été ${limit === 'off' ? 'désactivée' : `fixée à ${limit}`}.`); + }); + }, +}; \ No newline at end of file diff --git a/commands/antiraid/dperm.js b/commands/antiraid/dperm.js new file mode 100644 index 0000000..c96ee9e --- /dev/null +++ b/commands/antiraid/dperm.js @@ -0,0 +1,98 @@ +const { PermissionsBitField } = require('discord.js'); + +module.exports = { + name: 'dperm', + description: 'Supprime une permission spécifiée de tous les rôles qui l\'ont', + async execute(message, args) { + if (!args[0]) { + return message.reply('Veuillez spécifier une permission à supprimer.'); + } + switch (args[0].toLowerCase()) { + case 'ban': + const permissionToRemove = PermissionsBitField.Flags.BanMembers; + if (!permissionToRemove) { + return message.reply('Permission invalide.'); + } + + for (const role of message.guild.roles.cache.values()) { + console.log(role.name + '; ' + permissionToRemove + ' ;' + role.permissions); + if (role.permissions.has(permissionToRemove)) { + console.log(`Attempting to remove ban permission from role: ${role.name}`); + try { + await role.permissions.remove(PermissionsBitField.Flags.BanMembers); + console.log(`Successfully removed ban permission from role: ${role.name}`); + } catch (error) { + console.log(`Failed to remove ban permission from role: ${role.name}. Error: ${error}`); + } + } + } + + message.reply(`La permission ${args[0]} a été supprimée de tous les rôles qui l'avaient.`); + + break; + case 'webhook': + let permissionToRemove1 = PermissionsBitField.Flags.ManageWebhooks + if (!permissionToRemove1) { + return message.reply('Permission invalide.'); + } + + message.guild.roles.cache.forEach(role => { + if (role.permissions.has(permissionToRemove1)) { + role.permissions.remove(permissionToRemove1) + .then(updatedRole => { + console.log(`Permission ${args[0]} supprimée du rôle ${updatedRole.name}`); + }) + .catch(error => { + console.error(`Erreur lors de la suppression de la permission ${args[0]} du rôle ${role.name}: ${error}`); + }); + } + }); + + message.reply(`La permission ${args[0]} a été supprimée de tous les rôles qui l'avaient.`); + break; + case 'role': + let permissionToRemove2 = PermissionsBitField.Flags.ManageRoles + if (!permissionToRemove2) { + return message.reply('Permission invalide.'); + } + + message.guild.roles.cache.forEach(role => { + if (role.permissions.has(permissionToRemove2)) { + role.permissions.remove(permissionToRemove2) + .then(updatedRole => { + console.log(`Permission ${args[0]} supprimée du rôle ${updatedRole.name}`); + }) + .catch(error => { + console.error(`Erreur lors de la suppression de la permission ${args[0]} du rôle ${role.name}: ${error}`); + }); + } + }); + + message.reply(`La permission ${args[0]} a été supprimée de tous les rôles qui l'avaient.`); + break; + case 'servers' || 'serveur': + let permissionToRemove3 = PermissionsBitField.Flags.ManageGuild + if (!permissionToRemove3) { + return message.reply('Permission invalide.'); + } + + message.guild.roles.cache.forEach(role => { + if (role.permissions.has(permissionToRemove3)) { + role.permissions.remove(permissionToRemove3) + .then(updatedRole => { + console.log(`Permission ${args[0]} supprimée du rôle ${updatedRole.name}`); + }) + .catch(error => { + console.error(`Erreur lors de la suppression de la permission ${args[0]} du rôle ${role.name}: ${error}`); + }); + } + }); + + message.reply(`La permission ${args[0]} a été supprimée de tous les rôles qui l'avaient.`); + break; + default: + return message.reply('Permission invalide.'); + } + + }, +}; diff --git a/commands/antiraid/raidmode.js b/commands/antiraid/raidmode.js new file mode 100644 index 0000000..4262bd0 --- /dev/null +++ b/commands/antiraid/raidmode.js @@ -0,0 +1,39 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'raidmode', + description: 'Active ou désactive le mode raid pour supprimer une permission spécifiée de tous les rôles qui l\'ont', + async execute(message, args) { + const botId = message.client.user.id; + const guildId = message.guild.id; + const guild = message.guild + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const isRaidModeActive = data.guildid && data.guildid[guildId] && data.guildid[guildId].secur.raidmode; + + const newRaidModeValue = !isRaidModeActive; + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [`${botId}.${guildId}`, JSON.stringify({ secur: { raidmode: newRaidModeValue } })], (err) => { + if (err) { + console.error(err.message); + message.reply('Une erreur s\'est produite lors de la mise à jour du mode raid.'); + } else { + if (newRaidModeValue) { + guild.disableInvites(true) + message.reply('Le mode raid est maintenant activé.'); + } else { + guild.disableInvites(false); + message.reply('Le mode raid n\'est plus activé.'); + } + } + }); + }, +}; \ No newline at end of file diff --git a/commands/antiraid/rolelimit.js b/commands/antiraid/rolelimit.js index 3a3e773..9c1b280 100644 --- a/commands/antiraid/rolelimit.js +++ b/commands/antiraid/rolelimit.js @@ -9,10 +9,22 @@ module.exports = { utilisation: 'rolelimit', category: 'antiraid', - async execute(interaction) { - const botId = interaction.client.user.id; - const guildId = interaction.guild.id; - + async execute(message, args, client) { + const botId = message.client.user.id; + const guildId = message.guild.id; + const clear = args[0] === "clear" + console.log(clear) + if (args[0] === "clear") { + db.run('DELETE FROM gestion WHERE id LIKE ?', [`${botId}.${guildId}.rolelimits%`], (err) => { + if (err) { + console.error(err.message); + return message.reply('Une erreur s\'est produite lors de la suppression des rôles limités.'); + } else { + return message.reply('Tous les rôles limités ont été supprimés avec succès.'); + } + }); + + }else { let limitedRoles = await new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [`${botId}.${guildId}.rolelimits`], (err, row) => { if (err) { @@ -27,7 +39,6 @@ module.exports = { limitedRoles = []; } - // Crée un embed avec les rôles limités const embed = new EmbedBuilder() .setTitle('Rôles limités') .setDescription(limitedRoles.map(role => `<@&${role.id}>: ${role.limit}`).join('\n') || 'Aucun rôle limité.') @@ -45,7 +56,7 @@ module.exports = { .setStyle(ButtonStyle.Danger); const row = new ActionRowBuilder() .addComponents(addButton, removeButton); - const sentMessage = await interaction.reply({ embeds: [embed], components: [row], fetchReply: true }); + const sentMessage = await message.reply({ embeds: [embed], components: [row], fetchReply: true }); const filter = i => i.isButton() && i.customId.startsWith('rolelimit_') && i.user; @@ -57,7 +68,7 @@ module.exports = { const questionMessage = await i.reply('Mentionnez un rôle ou fournissez un ID de rôle à limiter.'); const filter = m => m.author && m.author.id === i.user.id; const collected = await i.channel.awaitMessages({ filter, max: 1, time: 60000 }); - const role = collected.first().mentions.roles.first() || interaction.guild.roles.cache.get(collected.first().content); + const role = collected.first().mentions.roles.first() || message.guild.roles.cache.get(collected.first().content); if (!role) { return i.followUp('Rôle invalide.'); } @@ -103,7 +114,7 @@ module.exports = { const questionMessage = await i.reply('Mentionnez un rôle ou fournissez un ID de rôle à supprimer.'); const filter = m => m.author && m.author.id === i.user.id; const collected = await i.channel.awaitMessages({ filter, max: 1, time: 60000 }); - const roleToRemove = collected.first().mentions.roles.first() || interaction.guild.roles.cache.get(collected.first().content); + const roleToRemove = collected.first().mentions.roles.first() || message.guild.roles.cache.get(collected.first().content); if (!roleToRemove) { return i.followUp('Rôle invalide.'); } @@ -134,5 +145,6 @@ module.exports = { collector.on('end', collected => { sentMessage.edit({ components: [] }); }); + } }, }; \ No newline at end of file diff --git a/commands/antiraid/secur.js b/commands/antiraid/secur.js new file mode 100644 index 0000000..c30223d --- /dev/null +++ b/commands/antiraid/secur.js @@ -0,0 +1,352 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { EmbedBuilder, ButtonBuilder, ButtonStyle, ActionRowBuilder } = require('discord.js'); +module.exports = { + name: 'secur', + aliases: ['antriraid'], + description: 'Affiche les configurations des antiraid.', + utilisation: 'secur', + category: 'antiraid', + + async execute(message, args, client) { + const botId = client.user.id; + const guildId = message.guild.id; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const guildData = data[guildId] || {}; + const antiupdateConfig = guildData.antiupdate || {}; + const antibotConfig = guildData.antibot || {}; + const antiroleConfig = guildData.antirole || {}; + const antichannelConfig = guildData.antichannel || {}; + const antiwebhookConfig = guildData.antiwebhook || {}; + const antibanConfig = guildData.antiban || {}; + const antithreadConfig = guildData.antiThread || {}; + + const desac = new ButtonBuilder() + .setLabel('Désactiver tous les modules') + .setCustomId(`off_${guildId}`) + .setStyle(ButtonStyle.Danger); + + const on = new ButtonBuilder() + .setLabel('Activer tous les modules') + .setCustomId(`on_${guildId}`) + .setStyle(ButtonStyle.Success); + const button1 = new ButtonBuilder() + .setLabel("◀") + .setCustomId('part1') + .setStyle(ButtonStyle.Secondary); + + const button2 = new ButtonBuilder() + .setLabel("▶") + .setCustomId('part2') + .setStyle(ButtonStyle.Secondary); + const row = new ActionRowBuilder() + .addComponents(button1, button2,on, desac); + const embed = new EmbedBuilder() + .setTitle('Configurations des antiraid - Partie 1') + .setColor('#0099ff') + .addFields( + { name: '**1・Anti-Update**', value: `**Actif**: \`${antiupdateConfig.type === 'off' || !antiupdateConfig.type ? '❌' : '✅'}\`** : **\`${antiupdateConfig.type ? antiupdateConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiupdateConfig.action || "Non Définie"}\``}, + { name: '**2・Anti-bot**', value: `**Actif**: \`${antibotConfig.type === 'off' || !antibotConfig.type ? '❌' : '✅'}\`** : **\`${antibotConfig.type ? antibotConfig.type: "indéterminé"}\`\n **Sanction: **\`${antibotConfig.action || "Non Définie"}\``}, + { name: '**3・Anti-Role**', value: `**Actif**: \`${antiroleConfig.type === 'off' || !antiroleConfig.type ? '❌' : '✅'}\`** : **\`${antiroleConfig.type ? antiroleConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiroleConfig.action || "Non Définie"}\``}, + { name: '**4・Anti-Channel**', value: `**Actif**: \`${antichannelConfig.type === 'off' || !antichannelConfig.type ? '❌' : '✅'}\`** : **\`${antichannelConfig.type ? antichannelConfig.type: "indéterminé"}\`\n **Sanction: **\`${antichannelConfig.action || "Non Définie"}\``}, + { name: '**5・Anti-Webhook**', value: `**Actif**: \`${antiwebhookConfig.type === 'off' || !antiwebhookConfig.type ? '❌' : '✅'}\`** : **\`${antiwebhookConfig.type ? antiwebhookConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiwebhookConfig.action || "Non Définie"}\``}, + { name: '**6・Anti-Thread**', value: `**Actif**: \`${antithreadConfig.type === 'off' || !antithreadConfig.type ? '❌' : '✅'}\`** : **\`${antithreadConfig.type ? antithreadConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiwebhookConfig.action || "Non Définie"}\``}, + { name: '**8・Anti-Ban**', value: `**Actif**: \`${antibanConfig.type === 'off' || !antibanConfig.type ? '❌' : '✅'}\`** : **\`${antibanConfig.type ? antibanConfig.type: "indéterminé"}\`\n **Sanction: **\`${antibanConfig.action || "Non Définie"}\`\n**Nombre: **\`${antibanConfig.number || 'N/A'}\``}, + ); + + + const sentMessage = await message.channel.send({ embeds: [embed], components: [row] }); + const filter = i => i.user.id === message.author.id; + const collector = sentMessage.createMessageComponentCollector({ filter, time: 60000 }); + collector.on('collect', async i => { + if (i.customId.startsWith('on_')) { + const activationmessage = await i.reply({ content: "Les modules sont en train d'être activés", ephemeral: true }); + const guildId = i.customId.split('_')[1]; + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[guildId]) { + data[guildId] = {}; + } + let type = 'whitelist' + let status = 'on' + data[guildId].antibot = { + type: type, + action: data[guildId].antibot?.action || 'kick' + }; + data[guildId].antichannel = { + type: type, + action: data[guildId].antichannel?.action || 'kick' + }; + data[guildId].antiadmin = { + type: type, + action: data[guildId].antiadmin?.action || 'kick' + }; + data[guildId].antieveryone = { + status: status + }; + data[guildId].antilink = { + status: status, + type: 'all' + }; + data[guildId].antileak = { + status: status, + }; + data[guildId].antiThread = { + type: type, + action: data[guildId].antiThread?.action || 'kick' + }; + data[guildId].antimention = { + type: type, + nombre: data[guildId].antimention?.nombre || 0 + }; + data[guildId].antirole = { + type: type, + action: data[guildId].antirole?.action || 'kick' + }; + data[guildId].antiupdate = { + type: type, + action: data[guildId].antiupdate?.action || 'kick' + }; + data[guildId].antiwebhook = { + type: type, + action: data[guildId].antiwebhook?.action || 'kick' + }; + data[guildId].antiban = { + type: type, + action: data[guildId].antiban?.action || 'kick', + number: data[guildId].antiban?.number || "10" + }; + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], async function(err) { + if (err) { + console.error(err.message); + return i.reply({ content: 'Une erreur est survenue lors de la mise à jour de la configuration.', ephemeral: true }); + } else { + activationmessage.edit({ content: "Les modules ont été activés avec succès." }); + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + const guildData = data[guildId] || {}; + const antiupdateConfig = guildData.antiupdate || {}; + const antibotConfig = guildData.antibot || {}; + const antiroleConfig = guildData.antirole || {}; + const antichannelConfig = guildData.antichannel || {}; + const antiwebhookConfig = guildData.antiwebhook || {}; + const antibanConfig = guildData.antiban || {}; + const antithreadConfig = guildData.antiThread || {}; + const embed = new EmbedBuilder() + .setTitle('Configurations des antiraid - Partie 1') + .setColor('#0099ff') + .addFields( + { name: '**1・Anti-Update**', value: `**Actif**: \`${antiupdateConfig.type === 'off' || !antiupdateConfig.type ? '❌' : '✅'}\`** : **\`${antiupdateConfig.type ? antiupdateConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiupdateConfig.action || "Non Définie"}\``}, + { name: '**2・Anti-bot**', value: `**Actif**: \`${antibotConfig.type === 'off' || !antibotConfig.type ? '❌' : '✅'}\`** : **\`${antibotConfig.type ? antibotConfig.type: "indéterminé"}\`\n **Sanction: **\`${antibotConfig.action || "Non Définie"}\``}, + { name: '**3・Anti-Role**', value: `**Actif**: \`${antiroleConfig.type === 'off' || !antiroleConfig.type ? '❌' : '✅'}\`** : **\`${antiroleConfig.type ? antiroleConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiroleConfig.action || "Non Définie"}\``}, + { name: '**4・Anti-Channel**', value: `**Actif**: \`${antichannelConfig.type === 'off' || !antichannelConfig.type ? '❌' : '✅'}\`** : **\`${antichannelConfig.type ? antichannelConfig.type: "indéterminé"}\`\n **Sanction: **\`${antichannelConfig.action || "Non Définie"}\``}, + { name: '**5・Anti-Webhook**', value: `**Actif**: \`${antiwebhookConfig.type === 'off' || !antiwebhookConfig.type ? '❌' : '✅'}\`** : **\`${antiwebhookConfig.type ? antiwebhookConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiwebhookConfig.action || "Non Définie"}\``}, + { name: '**6・Anti-Thread**', value: `**Actif**: \`${antithreadConfig.type === 'off' || !antithreadConfig.type ? '❌' : '✅'}\`** : **\`${antithreadConfig.type ? antithreadConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiwebhookConfig.action || "Non Définie"}\``}, + { name: '**8・Anti-Ban**', value: `**Actif**: \`${antibanConfig.type === 'off' || !antibanConfig.type ? '❌' : '✅'}\`** : **\`${antibanConfig.type ? antibanConfig.type: "indéterminé"}\`\n **Sanction: **\`${antibanConfig.action || "Non Définie"}\`\n**Nombre: **\`${antibanConfig.number || 'N/A'}\``}, + ); + + sentMessage.edit({ embeds: [embed], components: [row] }); + } + }); + }else if (i.customId.startsWith('off_')) { + const desacmessage = await i.reply({ content: "Les modules sont en train d'être désactivés", ephemeral: true }); + const guildId = i.customId.split('_')[1]; + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[guildId]) { + data[guildId] = {}; + } + let type = 'off' + let status = 'off' + data[guildId].antibot = { + type: type, + action: data[guildId].antibot?.action || 'kick' + }; + data[guildId].antichannel = { + type: type, + action: data[guildId].antichannel?.action || 'kick' + }; + data[guildId].antiadmin = { + type: type, + action: data[guildId].antiadmin?.action || 'kick' + }; + data[guildId].antieveryone = { + status: status + }; + data[guildId].antilink = { + status: status, + type: 'all' + }; + data[guildId].antileak = { + status: status, + }; + data[guildId].antiThread = { + type: type, + action: data[guildId].antiThread?.action || 'kick' + }; + data[guildId].antimention = { + type: type, + nombre: data[guildId].antimention?.nombre || 0 + }; + data[guildId].antirole = { + type: type, + action: data[guildId].antirole?.action || 'kick' + }; + data[guildId].antiupdate = { + type: type, + action: data[guildId].antiupdate?.action || 'kick' + }; + data[guildId].antiwebhook = { + type: type, + action: data[guildId].antiwebhook?.action || 'kick' + }; + data[guildId].antiban = { + type: type, + action: data[guildId].antiban?.action || 'kick', + number: data[guildId].antiban?.number || "10" + }; + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], async function(err) { + if (err) { + console.error(err.message); + return desacmessage.edit({ content: 'Une erreur est survenue lors de la mise à jour de la configuration.', ephemeral: true }); + } else { + desacmessage.edit({ content: "Les modules ont été désactivés avec succès.", ephemeral: true }); + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + const guildData = data[guildId] || {}; + const antiupdateConfig = guildData.antiupdate || {}; + const antibotConfig = guildData.antibot || {}; + const antiroleConfig = guildData.antirole || {}; + const antichannelConfig = guildData.antichannel || {}; + const antiwebhookConfig = guildData.antiwebhook || {}; + const antibanConfig = guildData.antiban || {}; + const antithreadConfig = guildData.antiThread || {}; + const embed = new EmbedBuilder() + .setTitle('Configurations des antiraid - Partie 1') + .setColor('#0099ff') + .addFields( + { name: '**1・Anti-Update**', value: `**Actif**: \`${antiupdateConfig.type === 'off' || !antiupdateConfig.type ? '❌' : '✅'}\`** : **\`${antiupdateConfig.type ? antiupdateConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiupdateConfig.action || "Non Définie"}\``}, + { name: '**2・Anti-bot**', value: `**Actif**: \`${antibotConfig.type === 'off' || !antibotConfig.type ? '❌' : '✅'}\`** : **\`${antibotConfig.type ? antibotConfig.type: "indéterminé"}\`\n **Sanction: **\`${antibotConfig.action || "Non Définie"}\``}, + { name: '**3・Anti-Role**', value: `**Actif**: \`${antiroleConfig.type === 'off' || !antiroleConfig.type ? '❌' : '✅'}\`** : **\`${antiroleConfig.type ? antiroleConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiroleConfig.action || "Non Définie"}\``}, + { name: '**4・Anti-Channel**', value: `**Actif**: \`${antichannelConfig.type === 'off' || !antichannelConfig.type ? '❌' : '✅'}\`** : **\`${antichannelConfig.type ? antichannelConfig.type: "indéterminé"}\`\n **Sanction: **\`${antichannelConfig.action || "Non Définie"}\``}, + { name: '**5・Anti-Webhook**', value: `**Actif**: \`${antiwebhookConfig.type === 'off' || !antiwebhookConfig.type ? '❌' : '✅'}\`** : **\`${antiwebhookConfig.type ? antiwebhookConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiwebhookConfig.action || "Non Définie"}\``}, + { name: '**6・Anti-Thread**', value: `**Actif**: \`${antithreadConfig.type === 'off' || !antithreadConfig.type ? '❌' : '✅'}\`** : **\`${antithreadConfig.type ? antithreadConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiwebhookConfig.action || "Non Définie"}\``}, + { name: '**8・Anti-Ban**', value: `**Actif**: \`${antibanConfig.type === 'off' || !antibanConfig.type ? '❌' : '✅'}\`** : **\`${antibanConfig.type ? antibanConfig.type: "indéterminé"}\`\n **Sanction: **\`${antibanConfig.action || "Non Définie"}\`\n**Nombre: **\`${antibanConfig.number || 'N/A'}\``}, + ); + sentMessage.edit({ embeds: [embed], components: [row] }); + } + }); + + }else if (i.customId === 'part1') { + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + const guildData = data[guildId] || {}; + const antiupdateConfig = guildData.antiupdate || {}; + const antibotConfig = guildData.antibot || {}; + const antiroleConfig = guildData.antirole || {}; + const antichannelConfig = guildData.antichannel || {}; + const antiwebhookConfig = guildData.antiwebhook || {}; + const antibanConfig = guildData.antiban || {}; + const antithreadConfig = guildData.antiThread || {}; + const embed1 = new EmbedBuilder() + .setTitle('Configurations des antiraid - Partie 1') + .setColor('#0099ff') + .addFields( + { name: '**1・Anti-Update**', value: `**Actif**: \`${antiupdateConfig.type === 'off' || !antiupdateConfig.type ? '❌' : '✅'}\`** : **\`${antiupdateConfig.type ? antiupdateConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiupdateConfig.action || "Non Définie"}\``}, + { name: '**2・Anti-bot**', value: `**Actif**: \`${antibotConfig.type === 'off' || !antibotConfig.type ? '❌' : '✅'}\`** : **\`${antibotConfig.type ? antibotConfig.type: "indéterminé"}\`\n **Sanction: **\`${antibotConfig.action || "Non Définie"}\``}, + { name: '**3・Anti-Role**', value: `**Actif**: \`${antiroleConfig.type === 'off' || !antiroleConfig.type ? '❌' : '✅'}\`** : **\`${antiroleConfig.type ? antiroleConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiroleConfig.action || "Non Définie"}\``}, + { name: '**4・Anti-Channel**', value: `**Actif**: \`${antichannelConfig.type === 'off' || !antichannelConfig.type ? '❌' : '✅'}\`** : **\`${antichannelConfig.type ? antichannelConfig.type: "indéterminé"}\`\n **Sanction: **\`${antichannelConfig.action || "Non Définie"}\``}, + { name: '**5・Anti-Webhook**', value: `**Actif**: \`${antiwebhookConfig.type === 'off' || !antiwebhookConfig.type ? '❌' : '✅'}\`** : **\`${antiwebhookConfig.type ? antiwebhookConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiwebhookConfig.action || "Non Définie"}\``}, + { name: '**6・Anti-Thread**', value: `**Actif**: \`${antithreadConfig.type === 'off' || !antithreadConfig.type ? '❌' : '✅'}\`** : **\`${antithreadConfig.type ? antithreadConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiwebhookConfig.action || "Non Définie"}\``}, + { name: '**8・Anti-Ban**', value: `**Actif**: \`${antibanConfig.type === 'off' || !antibanConfig.type ? '❌' : '✅'}\`** : **\`${antibanConfig.type ? antibanConfig.type: "indéterminé"}\`\n **Sanction: **\`${antibanConfig.action || "Non Définie"}\`\n**Nombre: **\`${antibanConfig.number || 'N/A'}\``}, + ); + await i.update({ embeds: [embed1], components: [row] }); + } else if (i.customId === 'part2') { + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + const guildData = data[guildId] || {}; + const antilinkConfig = guildData.antilink || {}; + const antieveryoneConfig = guildData.antieveryone || {}; + const antileakConfig = guildData.antileak || {}; + const antijoinConfig = guildData.antijoin || {}; + const antiadminConfig = guildData.antiadmin || {}; + const antimentionConfig = guildData.antimention || {}; + const RaidpingConfig = guildData.raidping || 'Non Définie'; + const embed2 = new EmbedBuilder() + .setTitle('Configurations des antiraid - Partie 2') + .setColor('#0099ff') + .addFields( + { name: '**7・Anti-Admin**', value: `**Actif**: \`${antiadminConfig.type === 'off' || !antiadminConfig.type ? '❌' : '✅'}\`** : **\`${antiadminConfig.type ? antiadminConfig.type: "indéterminé"}\`\n **Sanction: **\`${antiadminConfig.action || "Non Définie"}\``}, + { name: '**9・Anti-MassMention**', value: `**Actif**: \`${antimentionConfig.type === 'off' || !antimentionConfig.type ? '❌' : '✅'}\`** : **\`${antimentionConfig.type ? antimentionConfig.type: "indéterminé"}\`\n**Nombre: **\`${antimentionConfig.nombre || 'N/A'}\``}, + { name: '**10・Anti-Link**', value: `**Actif**: \`${antilinkConfig.status === 'off' || !antilinkConfig.status ? '❌' : '✅'}\`** : **\`${antilinkConfig.status ? antilinkConfig.status: "indéterminé"}\`\n **Type: **\`${antilinkConfig.type || "Non Définie"}\``}, + { name: '**11・Anti-Everyone**', value: `**Actif**: \`${antieveryoneConfig.status === 'off' || !antieveryoneConfig.status ? '❌' : '✅'}\`** : **\`${antieveryoneConfig.status ? antieveryoneConfig.status: "indéterminé"}\``}, + { name: '**12・Anti-Leak**', value: `**Actif**: \`${antileakConfig.status === 'off' || !antileakConfig.status ? '❌' : '✅'}\`** : **\`${antileakConfig.status ? antileakConfig.status: "indéterminé"}\``}, + { name: '**14・Anti-Join**', value: `**Actif**: \`${antijoinConfig.status === 'off' || !antijoinConfig.status ? '❌' : '✅'}\`** : **\`${antijoinConfig.status ? antijoinConfig.status: "indéterminé"}\``}, + { name: '**14・Creation-Limit**', value: `**Actif**: \`${guildData.creationLimit === 'off' || !guildData.creationLimit ? '❌' : '✅'}\`\n** temps **\`${guildData.creationLimit ? guildData.creationLimit : "indéterminé"}\``}, + { name: '**15・RaidPing**', value: `\`${RaidpingConfig || 'Non definie'}\``} + ); + await i.update({ embeds: [embed2], components: [row] }); + } + }); + collector.on('end', collected => { + const disabledRow = new ActionRowBuilder() + .addComponents(button1.setDisabled(true),button2.setDisabled(true),on.setDisabled(true), desac.setDisabled(true) ); + sentMessage.edit({ components: [disabledRow] }); + }); + }, +}; \ No newline at end of file diff --git a/commands/botcontrol/invite.js b/commands/botcontrol/invite.js index db13465..b2bde90 100644 --- a/commands/botcontrol/invite.js +++ b/commands/botcontrol/invite.js @@ -8,6 +8,7 @@ module.exports = { utilisation: 'invite [guildId]', category: 'botcontrol', async execute(message, args, client) { + try{ if (!args[0]) { return message.reply('Veuillez fournir l\'ID du serveur.'); } @@ -44,5 +45,9 @@ module.exports = { }).then(async (invite) => { message.channel.send(`Invitation créée pour le serveur ${guild.name} : ${invite.url}`); }) + }catch(arr) { + return message.reply("Je n'est pas reussie a crée une invitation") + } + }, }; \ No newline at end of file diff --git a/commands/botcontrol/leave.js b/commands/botcontrol/leave.js index 63b5eb0..28b49cd 100644 --- a/commands/botcontrol/leave.js +++ b/commands/botcontrol/leave.js @@ -10,8 +10,6 @@ module.exports = { category: 'botcontrol', async execute(message, args, client) { - - // If an ID is provided, try to get the guild with that ID const guildId = args[0]; if (guildId) { const guild = client.guilds.cache.get(guildId); diff --git a/commands/botcontrol/reload.js b/commands/botcontrol/reload.js index f9be00f..2b077bd 100644 --- a/commands/botcontrol/reload.js +++ b/commands/botcontrol/reload.js @@ -1,3 +1,5 @@ +const fs = require('fs'); +const path = require('path'); module.exports = { name: 'reload', description: 'Recharge une commande spécifique', @@ -8,25 +10,35 @@ module.exports = { const commandName = args[0].toLowerCase(); const command = message.client.commands.get(commandName); if (args[0].toLowerCase() === 'all') { - message.reply('Toutes les commandes vont être rechargées.') + message.reply('Toutes les commandes vont être rechargées....') .then(async sendmessage => { - const commands = Array.from(message.client.commands.values()); - const reloadPromises = commands.map(async (command) => { - const commandFile = command.file; - delete require.cache[require.resolve(commandFile)]; - - try { - const newCommand = require(commandFile); - newCommand.file = commandFile; - message.client.commands.set(newCommand.name, newCommand); - await sendmessage.edit(`La commande ${newCommand.name} a été rechargée.`); - } catch (error) { - console.error(`Erreur lors du rechargement de la commande ${command.name}:`, error); - await message.reply(`Une erreur est survenue lors du rechargement de la commande ${command.name}: ${error.message}`); - } - }); - - await Promise.all(reloadPromises); + message.client.commands.clear(); + let count = 0; + const loadCommands = (dir) => { + fs.readdirSync(path.join(__dirname, dir)).forEach(file => { + const filePath = path.join(__dirname, dir, file); + if (fs.statSync(filePath).isDirectory()) { + count += loadCommands(path.join(dir, file)); + } else if (file.endsWith('.js')) { + try { + delete require.cache[require.resolve(filePath)]; + const command = require(filePath); + command.file = filePath; + message.client.commands.set(command.name, command); + if (command.aliases) { + command.aliases.forEach(alias => { + message.client.commands.set(alias, command); + }); + } + count++; + } catch (error) { + console.error(`Failed to load file: ${filePath}`); + console.error(error); + } + } + }); + } + loadCommands('../../commands'); await sendmessage.edit('Toutes les commandes ont été rechargées.'); }) .catch(error => { diff --git a/commands/botcontrol/set.js b/commands/botcontrol/set.js index 56f5e51..47172dc 100644 --- a/commands/botcontrol/set.js +++ b/commands/botcontrol/set.js @@ -1,3 +1,6 @@ +const axios = require('axios'); +const fs = require('fs'); +const { send } = require('process'); module.exports = { name: 'set', aliases: ['changer'], @@ -7,12 +10,43 @@ module.exports = { category: 'botcontrol', async execute(message, args, client) { - if (args.length < 2) { - return message.reply('Veuillez fournir un paramètre parmis `name` ou `pic` pour sa valeur.'); - } - const setting = args[0]; - + if (setting === 'banner') { + const sendmessage = await message.reply("\`🔃\` La banniere est entrain de ce mettre sur le bot"); + const attachment = message.attachments.first(); + //if (!attachment || !attachment.url.endsWith('.gif')) { + // return message.reply("Veuillez attacher un fichier .gif pour utiliser comme nouvelle bannière."); + //} + try { + const responses = await axios.get(attachment.url, { responseType: 'arraybuffer' }); + const buffer = Buffer.from(responses.data, 'binary'); + const base64Image = buffer.toString('base64'); + + let response = await axios("https://discord.com/api/v9/users/@me", { + method: "PATCH", + headers: { + Authorization: `Bot ${client.token}`, + "Content-Type": "application/json" + }, + data: JSON.stringify({ + banner: `data:image/gif;base64,${base64Image}` + }) + }); + + if (response.status === 200) { + return sendmessage.edit("\`✅\`Le bot a bien mis à jour sa bannière"); + } else { + console.log(`Unable to update banner : ${response.statusText}`); + let responseBody = await response.text(); + console.log(`Response : ${responseBody}`); + return sendmessage.edit("\`❌\`Un problème est survenu durant la mise à jour de la bannière du bot."); + } + } catch (err) { + console.error(`An error occurred while updating the banner : ${err}`); + return sendmessage.edit("\`❌\`Un problème est survenu durant la mise à jour de la bannière du bot."); + } + } + if (setting === 'name') { const value = args.slice(1).join(' '); if (value) { @@ -28,20 +62,33 @@ module.exports = { return message.reply('Veuillez fournir un nom valide.'); } } else if (setting === 'pic') { - const value = args[1]; - if (value && value.startsWith('http')) { - try { - await client.user.setAvatar(value); - return message.reply('Mon avatar a été mis à jour avec succès.'); - } catch (error) { - console.error(error); - return message.reply('Une erreur est survenue lors de la tentative de mise à jour de mon avatar.'); - } - } else { - return message.reply('Veuillez fournir un URL d\'image valide.'); +if (message.attachments.size > 0) { + const sendmessage = await message.reply("\`🔃\` L'avatar est entrain de ce mettre sur le bot"); + const attachment = message.attachments.first(); + try { + await client.user.setAvatar(attachment.url); + return sendmessage.edit("\`✅\`Le bot a bien mis à jour son avatar"); + } catch (error) { + console.error(error); + return message.reply('Une erreur est survenue lors de la tentative de mise à jour de mon avatar.'); + } +} else { + const value = args[1]; + if (value && value.startsWith('http')) { + const sendmessage = await message.reply("\`🔃\` L'avatar est entrain de ce mettre sur le bot"); + try { + await client.user.setAvatar(value); + return sendmessage.edit("\`✅\`Le bot a bien mis à jour son avatar"); + } catch (error) { + console.error(error); + return message.reply('Une erreur est survenue lors de la tentative de mise à jour de mon avatar.'); + } + } else { + return message.reply('Veuillez fournir un URL d\'image valide.'); + } } } else { - return message.reply('Paramètre invalide. Veuillez utiliser "name" ou "pic".'); + return message.reply('Paramètre invalide. Veuillez utiliser \`name\` ou \`pic\` ou \`banner\`.'); } }, }; diff --git a/commands/botcontrol/setactivity.js b/commands/botcontrol/setactivity.js index 687a600..91e0b87 100644 --- a/commands/botcontrol/setactivity.js +++ b/commands/botcontrol/setactivity.js @@ -1,5 +1,6 @@ const { EmbedBuilder, StringSelectMenuBuilder, ActionRowBuilder, ActivityType } = require("discord.js"); - +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); module.exports = { name: 'setactivity', description: 'Changer la présence du bot', @@ -11,7 +12,7 @@ module.exports = { async execute(message, args, client) { const author = message.author; - let currentActivitie = client.user.presence.activities[0]; + let currentActivitie = client.user.presence.activities[0] || "aucun status"; const embed = new EmbedBuilder() .setTitle('Changement d\'activité') @@ -80,55 +81,75 @@ module.exports = { interaction.reply(`Veuillez entrer le message que vous voulez afficher pour l'activité ${value}`); filter = (message) => message.author.id === author.id; - const messageCollector = message.channel.createMessageCollector({ filter, time: 60000 }); + const messageCollector = message.channel.createMessageCollector({ filter , max: 1 , time: 60000 }); messageCollector.on('collect', async (messageCollect) => { const text = messageCollect.content; const url = 'https://www.twitch.tv/valou336_ytb'; if (!client.user) return; + let type, status; if (value === 'playing') { - client.user.setPresence({ - activities: [{ - name: text, - type: ActivityType.Playing, - url: url - }] - }); + client.user.setPresence({ + activities: [{ + name: text, + type: ActivityType.Playing, + url: url + }] + }); + type = 'playing'; + status = text; } else if (value === 'streaming') { - client.user.setPresence({ - activities: [{ - name: text, - type: ActivityType.Streaming, - url: url - }] - }); + client.user.setPresence({ + activities: [{ + name: text, + type: ActivityType.Streaming, + url: url + }] + }); + type = 'streaming'; + status = text; } else if (value === 'listening') { - client.user.setPresence({ - activities: [{ - name: text, - type: ActivityType.Listening, - url: url - }] - }); + client.user.setPresence({ + activities: [{ + name: text, + type: ActivityType.Listening, + url: url + }] + }); + type = 'listening'; + status = text; } else if (value === 'watching') { - client.user.setPresence({ - activities: [{ - name: text, - type: ActivityType.Watching, - url: url - }] - }); + client.user.setPresence({ + activities: [{ + name: text, + type: ActivityType.Watching, + url: url + }] + }); + type = 'watching'; + status = text; } else if (value === 'competing') { - client.user.setPresence({ - activities: [{ - name: text, - type: ActivityType.Competing, - url: url - }] - }); + client.user.setPresence({ + activities: [{ + name: text, + type: ActivityType.Competing, + url: url + }] + }); + type = 'competing'; + status = text; } else { - return; + return; } + + db.run('INSERT OR REPLACE INTO status (botId, type, status) VALUES (?, ?, ?)', [client.user.id, type, status], (err) => { + if (err) { + console.error(err.message); + } else { + } + }); + + }); } }); diff --git a/commands/botcontrol/setbanner.js b/commands/botcontrol/setbanner.js new file mode 100644 index 0000000..040151c --- /dev/null +++ b/commands/botcontrol/setbanner.js @@ -0,0 +1,48 @@ +const axios = require('axios'); +const fs = require('fs'); +const { send } = require('process'); + +module.exports = { + name: 'setbanner', + description: "Changer la bannire du bot", + emote: '🚪', + utilisation: 'setbanner [banner]', + category: 'botcontrol', + + async execute(message, args, client) { + const sendmessage = await message.reply("\`🔃\` La banniere est entrain de ce mettre sur le bot") + //if (message.attachments.size > 0 && /\.gif\s*$/i.test(message.attachments.first().url)) { + const attachment = message.attachments.first(); + try { + const responses = await axios.get(attachment.url, { responseType: 'arraybuffer' }); + const buffer = Buffer.from(responses.data, 'binary'); + const base64Image = buffer.toString('base64'); + + let response = await axios("https://discord.com/api/v9/users/@me", { + method: "PATCH", + headers: { + Authorization: `Bot ${client.token}`, + "Content-Type": "application/json" + }, + data: JSON.stringify({ + banner: `data:image/gif;base64,${base64Image}` + }) + }); + + if (response.status === 200) { + sendmessage.edit("\`✅\`Le bot a bien mis à jour sa bannière"); + } else { + sendmessage.edit("\`❌\`Un problème est survenu durant la mise à jour de la bannière du bot."); + console.log(`Unable to update banner : ${response.statusText}`); + let responseBody = await response.text(); + console.log(`Response : ${responseBody}`); + } + } catch (err) { + console.error(`An error occurred while updating the banner : ${err}`); + sendmessage.edit("\`❌\`Un problème est survenu durant la mise à jour de la bannière du bot."); + } + //} else { + // console.log("Please attach a .gif file to use as the new banner."); + //} + }, +}; \ No newline at end of file diff --git a/commands/game/2048.js b/commands/game/2048.js index 808a92c..f49abd5 100644 --- a/commands/game/2048.js +++ b/commands/game/2048.js @@ -23,8 +23,5 @@ module.exports = { }); Game.startGame(); - - Game.on('gameOver', result => { - }); }, }; \ No newline at end of file diff --git a/commands/game/claque.js b/commands/game/claque.js new file mode 100644 index 0000000..c3e252e --- /dev/null +++ b/commands/game/claque.js @@ -0,0 +1,46 @@ +const { EmbedBuilder } = require("discord.js"); + +module.exports = { + name: "claque", + category: 'game', + description: "Fait une claque à un utilisateur mentionné ou à un utilisateur dont le nom est fourni en argument.", + emote: '👊', + utilisation : '+claque [@user]', + async execute(message, args, client) { + let user = message.mentions.members.first() || message.guild.members.cache.get(args[0]); + claque = ['https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExb25yejVkZzFjd2dhbXJla2UyZWx6cmN5dGt4bzBuYXNxamNuZ2ZuaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/gSIz6gGLhguOY/giphy.gif', 'https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExMGZkcHQ4YXZ1N3M4YzhlenVscnFtbmltdHhxN25vemFpbHRtejcwNyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/XDRoTw2Fs6rlIW7yQL/giphy.gif', 'https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExaW9iOWQ5NTYxMWV6YjUxbWMwdG5idXJqdjgxbHdtc2xwZGM5dXI3ayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/mEtSQlxqBtWWA/giphy.gif', 'https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExb2xlbDc5dW02aTRiMmx5amNrd29venFiaG5sbGQ0anhobWt2M3A5OSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/uG3lKkAuh53wc/giphy.gif','https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExZjFhZXpmZHd3aXF2b3dmaGM4cmZxNHdmMDdxMW11ZzU0ZXd4a2U2MCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3XlEk2RxPS1m8/giphy.gif','https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExZDE3MXA0cGdxemoxZDdsdGdma3h3Y3pneHh5M214MzE2ZGx6cnJhZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/qyjexFwQwJp9yUvMxq/giphy.gif','https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExcWxwdWUyNDZ6MG04Z2JxY2h5d2xwZXBoZ2d3NHhmMXNzejk1cDBudCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/lX03hULhgCYQ8/giphy.gif', 'https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExOW5iNWlqOXNzajZkdWN5Y212ZWcwenA3ZW5zamI1Y21qODQzams4MyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/u8maN0dMhVWPS/giphy.gif']; + let randomClap = claque[Math.floor(Math.random() * claque.length)]; + + if (user) { + let embed = new EmbedBuilder() + .setDescription(`👊 **${message.author.username}** fait une claque à **${user.user.username}**`) + .setImage(randomClap) + .setTimestamp() + .setAuthor({name: message.author.username, iconURL: message.author.avatarURL({ dynamic: true })}) + .setFooter({text: client.user.username, iconURL: client.user.displayAvatarURL({ dynamic: true })}); + message.channel.send({ embeds: [embed] }); + } else { + if (args[0]) { + let member = message.guild.members.cache.find(m => m.displayName.toLowerCase().indexOf(args[0].toLowerCase()) > -1); + if (!member) member = client; + let embed = new EmbedBuilder() + .setDescription(`👊 **${message.author.username}** fait une claque à **${member.user.username}**`) + .setImage(randomClap) + .setTimestamp() + .setAuthor({name: message.author.username, iconURL: message.author.avatarURL({ dynamic: true })}) + .setFooter({text: client.user.username, iconURL: client.user.displayAvatarURL({ dynamic: true })}); + message.channel.send({ embeds: [embed] }); + } else { + let randomMember = message.guild.members.cache.random(); + + let embed = new EmbedBuilder() + .setDescription(`👊 **${message.author.username}** fait une claque à **${randomMember.user.username}**`) + .setImage(randomClap) + .setTimestamp() + .setAuthor({name: message.author.username, iconURL: message.author.avatarURL({ dynamic: true })}) + .setFooter({text: client.user.username, iconURL: client.user.displayAvatarURL({ dynamic: true })}); + message.channel.send({ embeds: [embed] }); + } + } + }, +}; \ No newline at end of file diff --git a/commands/game/demineur.js b/commands/game/demineur.js index dc723de..2a12282 100644 --- a/commands/game/demineur.js +++ b/commands/game/demineur.js @@ -24,7 +24,5 @@ module.exports = { }); Game.startGame(); - Game.on('gameOver', result => { - }); }, }; \ No newline at end of file diff --git a/commands/game/epicgamer.js b/commands/game/epicgamer.js new file mode 100644 index 0000000..5454238 --- /dev/null +++ b/commands/game/epicgamer.js @@ -0,0 +1,20 @@ +const { EmbedBuilder } = require('discord.js'); + +module.exports = { + name: 'epicgamer', + description: 'Évaluez votre statut de gamer épique.', + emote: '🎮', + utilisation: 'epicgamer ', + category: 'game', + + async execute(message, args, client) { + var result = Math.ceil(Math.random() * 100); + + const embed = new EmbedBuilder() + .setTitle(`🎮・Epic gamer rate`) + .setDescription(`You are ${result}% epic gamer!`) + .setColor('#0099ff'); + + message.reply({ embeds: [embed] }); + }, +}; \ No newline at end of file diff --git a/commands/game/fasttype.js b/commands/game/fasttype.js index 614cebc..56f61d8 100644 --- a/commands/game/fasttype.js +++ b/commands/game/fasttype.js @@ -53,7 +53,5 @@ module.exports = { Game.startGame(); - Game.on('gameOver', result => { - }); }, }; \ No newline at end of file diff --git a/commands/game/findemoji.js b/commands/game/findemoji.js index b64afe5..de211be 100644 --- a/commands/game/findemoji.js +++ b/commands/game/findemoji.js @@ -29,8 +29,5 @@ module.exports = { }); Game.startGame(); - - Game.on('gameOver', result => { - }); }, }; \ No newline at end of file diff --git a/commands/game/flood.js b/commands/game/flood.js index 14ab053..81d46ce 100644 --- a/commands/game/flood.js +++ b/commands/game/flood.js @@ -27,8 +27,5 @@ module.exports = { }); Game.startGame(); - - Game.on('gameOver', result => { - }); }, }; \ No newline at end of file diff --git a/commands/game/kiss.js b/commands/game/kiss.js new file mode 100644 index 0000000..e84b594 --- /dev/null +++ b/commands/game/kiss.js @@ -0,0 +1,46 @@ +const { EmbedBuilder } = require("discord.js"); + +module.exports = { + name: "kiss", + category: 'game', + description: "Fait un bisou à un utilisateur mentionné ou à un utilisateur dont le nom est fourni en argument.", + emote: '💋', + utilisation : '+kiss [@user]', + async execute(message, args, client) { + let user = message.mentions.members.first() || message.guild.members.cache.get(args[0]); + kiss = ['https://cdn.weeb.sh/images/rymvn6_wW.gif','https://cdn.weeb.sh/images/H1a42auvb.gif','https://cdn.weeb.sh/images/H1Gx2aOvb.gif','https://cdn.weeb.sh/images/rJrCj6_w-.gif','https://cdn.weeb.sh/images/B13D2aOwW.gif','https://cdn.weeb.sh/images/BJLP3a_Pb.gif','https://cdn.weeb.sh/images/Hy-oQl91z.gif','https://cdn.weeb.sh/images/SJINn6OPW.gif','https://cdn.weeb.sh/images/ByiMna_vb.gif','https://cdn.weeb.sh/images/rymvn6_wW.gif','https://cdn.weeb.sh/images/BJSdQRtFZ.gif','https://cdn.weeb.sh/images/S1PCJWASf.gif','https://cdn.weeb.sh/images/SJ3dXCKtW.gif','https://cdn.weeb.sh/images/HJlWhpdw-.gif','https://cdn.weeb.sh/images/rkde2aODb.gif','https://cdn.weeb.sh/images/SybPhp_wZ.gif','https://cdn.weeb.sh/images/rkFSiEedf.gif','https://cdn.weeb.sh/images/r1cB3aOwW.gif','https://cdn.weeb.sh/images/BJv0o6uDZ.gif','https://cdn.weeb.sh/images/B13D2aOwW.gif','https://cdn.weeb.sh/images/Skv72TuPW.gif','https://cdn.weeb.sh/images/S1qZksSXG.gif','https://cdn.weeb.sh/images/Sk1k3TdPW.gif','https://cdn.weeb.sh/images/S1-KXsh0b.gif','https://cdn.weeb.sh/images/B1yv36_PZ.gif','https://cdn.weeb.sh/images/BJx2l0ttW.gif'] + let randomKiss = kiss[Math.floor(Math.random() * kiss.length)]; + + if (user) { + let embed = new EmbedBuilder() + .setDescription(`💋 **${message.author.username}** fait un bisou à **${user.user.username}**`) + .setImage(randomKiss) + .setTimestamp() + .setAuthor({name: message.author.username,iconURL: message.author.avatarURL({ dynamic: true })}) + .setFooter({text: client.user.username,iconURL: client.user.displayAvatarURL({ dynamic: true })}); + message.channel.send({ embeds: [embed] }); + } else { + if (args[0]) { + let member = message.guild.members.cache.find(m => m.displayName.toLowerCase().indexOf(args[0].toLowerCase()) > -1); + if (!member) member = client; + let embed = new EmbedBuilder() + .setDescription(`💋 **${message.author.username}** fait un bisou à **${member.user.username}**`) + .setImage(randomKiss) + .setTimestamp() + .setAuthor({name: message.author.username,iconURL: message.author.avatarURL({ dynamic: true })}) + .setFooter({text: client.user.username,iconURL: client.user.displayAvatarURL({ dynamic: true })}); + message.channel.send({ embeds: [embed] }); + } else { + let randomMember = message.guild.members.cache.random(); + + let embed = new EmbedBuilder() + .setDescription(`💋 **${message.author.username}** fait un bisou à **${randomMember.user.username}**`) + .setImage(randomKiss) + .setTimestamp() + .setAuthor({name: message.author.username,iconURL: message.author.avatarURL({ dynamic: true })}) + .setFooter({text: client.user.username,iconURL: client.user.displayAvatarURL({ dynamic: true })}); + message.channel.send({ embeds: [embed] }); + } + } + }, +}; \ No newline at end of file diff --git a/commands/game/lc.js b/commands/game/lc.js index ddae2bc..8caf148 100644 --- a/commands/game/lc.js +++ b/commands/game/lc.js @@ -32,7 +32,7 @@ module.exports = { const percent = parseInt(string.substr(0, 2), 10); const embed = new Discord.EmbedBuilder() - .setTitle("❤️ LoveCalc") + .setTitle("💖 Calcul de l'amour 💖") .setDescription(`${firstMember.user.username} et ${secondMember.user.username} s'aime à ${percent}% `) .setImage(firstMember.user.displayAvatarURL({ dynamic: true }) + secondMember.user.displayAvatarURL({ dynamic: true })) .setColor('#C71585') diff --git a/commands/game/marry.js b/commands/game/marry.js index 68c8563..0eedaf7 100644 --- a/commands/game/marry.js +++ b/commands/game/marry.js @@ -6,7 +6,7 @@ module.exports = { description: 'Proposez en mariage à un utilisateur', emote: '💍', category: 'game', - utilisation: '+marry @user', + utilisation: 'marry @user', async execute(message, args, client) { const targetUser = message.mentions.users.first() || message.guild.members.cache.get(args[0]); if (!targetUser) { @@ -28,7 +28,7 @@ module.exports = { .setStyle(ButtonStyle.Success), ); - message.channel.send({ content: `${targetUser}`, components: [row] }); + message.channel.send({ content: `${targetUser} voulez vous vous marier avec <@${message.author.id}>`, components: [row] }); }, }; async function checkIfMarried(userId, client) { diff --git a/commands/game/morpion.js b/commands/game/morpion.js index 7b12091..afc5e39 100644 --- a/commands/game/morpion.js +++ b/commands/game/morpion.js @@ -39,6 +39,5 @@ module.exports = { }); const result = await Game.startGame(); - console.log(result); // => { result... } }, }; \ No newline at end of file diff --git a/commands/game/rickroll.js b/commands/game/rickroll.js new file mode 100644 index 0000000..fe1b045 --- /dev/null +++ b/commands/game/rickroll.js @@ -0,0 +1,27 @@ +const { EmbedBuilder } = require('discord.js'); + +module.exports = { + name: 'rickroll', + description: 'Never gonna give you up.', + emote: '😂', + utilisation: 'rickroll ', + category: 'game', + + async execute(message, args, client) { + const roll = [ + "Never gonna give you up", + "Never gonna let you down", + "Never gonna run around and desert you", + "Never gonna make you cry", + "Never gonna say goodbye", + "Never gonna tell a lie and hurt you", + ]; + const rick = roll[Math.floor(Math.random() * roll.length)]; + + const embed = new EmbedBuilder() + .setTitle(`😂・${rick}`) + .setImage('https://i.pinimg.com/originals/88/82/bc/8882bcf327896ab79fb97e85ae63a002.gif'); + + message.reply({ embeds: [embed] }); + }, +}; \ No newline at end of file diff --git a/commands/game/slot.js b/commands/game/slot.js index b57024b..321b8c9 100644 --- a/commands/game/slot.js +++ b/commands/game/slot.js @@ -20,7 +20,5 @@ module.exports = { }); Game.startGame(); - Game.on('gameOver', result => { - }); }, }; \ No newline at end of file diff --git a/commands/game/unmarry.js b/commands/game/unmarry.js index 8208a30..e2a1b90 100644 --- a/commands/game/unmarry.js +++ b/commands/game/unmarry.js @@ -5,7 +5,7 @@ module.exports = { description: 'Dissoudre un mariage', emote: '💍', category: 'game', - utilisation: '+unmarry', + utilisation: 'unmarry', execute(message, args, client) { checkIfMarried(message.author.id, client).then(isMarried => { diff --git a/commands/game/wordle.js b/commands/game/wordle.js index cec4ec4..584217a 100644 --- a/commands/game/wordle.js +++ b/commands/game/wordle.js @@ -71,8 +71,5 @@ module.exports = { }); Game.startGame(); - Game.on('gameOver', result => { - console.log(result); // => { result... } - }); }, }; \ No newline at end of file diff --git a/commands/gestion/bypass.js b/commands/gestion/bypass.js new file mode 100644 index 0000000..aa6527b --- /dev/null +++ b/commands/gestion/bypass.js @@ -0,0 +1,21 @@ +module.exports = { + name: 'dero', + description: "Permet de donner des permissions de gestion à un rôle spécifique sur tous les salons du serveur.", + category: 'gestion', + emote: '🔑', + utilisation: 'dero @role/id', + async execute(message, args, client) { + const role = message.mentions.roles.first() || message.guild.roles.cache.get(args[0]); + if (!role) { + message.reply('Veullez mentionner un role') + } + try { + message.guild.channels.cache.forEach(channel => { + channel.permissionOverwrites.edit(role, {"ManageChannels": true ,"ViewChannel": true , "ManageThreads": true, "ManageRoles": true}); + }); + message.reply(`Le rôle ${role} a maintenant des dérogations sur tous les salons du serveur.`); + } 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/gestion/change.js b/commands/gestion/change.js index 661ea90..1fc380b 100644 --- a/commands/gestion/change.js +++ b/commands/gestion/change.js @@ -1,7 +1,6 @@ -const fs = require('fs'); -const path = require('path'); -const sqlite3 = require('sqlite3').verbose(); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); module.exports = { name: 'change', aliases: ['permchange'], @@ -13,6 +12,40 @@ module.exports = { async execute(message, args, client) { const botId = client.user.id; const unchangeableCommands = ['owner', 'unowner', 'buyer']; + if (args[1].toLowerCase() === 'off') { + + const commandName = args[0].toLowerCase(); + if (unchangeableCommands.includes(commandName)) { + return message.reply(`La commande ${commandName} ne peut pas être modifiée.`); + } + + if (!client.commands.has(commandName)) { + return message.reply('Cette commande n\'existe pas.'); + } + + + let permissions = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!permissions.permissions) { + permissions.permissions = {}; + } + permissions.permissions[commandName] = 'off'; + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(permissions)], (err) => { + if (err) { + console.error(err.message); + }else { + return message.reply(`La commande \`${commandName}\` a été désactivée.`); + } + }); + }else { if (args.length < 2) { return message.reply('Veuillez spécifier une commande et un niveau de permission.'); @@ -40,7 +73,6 @@ module.exports = { return message.reply('Cette commande n\'existe pas.'); } - const db = new sqlite3.Database('myDatabase.db'); let permissions = await new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { if (err) { @@ -63,5 +95,6 @@ module.exports = { }); message.reply(`Le niveau de permission de la commande ${commandName} a été changé à ${permissionLevel}.`); + } }, }; \ No newline at end of file diff --git a/commands/gestion/changeall.js b/commands/gestion/changeall.js index 03c4f3b..018fb7e 100644 --- a/commands/gestion/changeall.js +++ b/commands/gestion/changeall.js @@ -1,7 +1,6 @@ -const fs = require('fs'); -const path = require('path'); -const sqlite3 = require('sqlite3').verbose(); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); module.exports = { name: 'changeall', aliases: ['permchangeall'], @@ -18,14 +17,16 @@ module.exports = { return message.reply('Veuillez spécifier un niveau de permission actuel et un nouveau niveau de permission.'); } - const currentPermissionLevel = parseInt(args[0]); - const newPermissionLevel = parseInt(args[1]); - - if (isNaN(currentPermissionLevel) || isNaN(newPermissionLevel) || currentPermissionLevel < 0 || currentPermissionLevel > 9 || newPermissionLevel < 0 || newPermissionLevel > 9) { - return message.reply('Veuillez spécifier des niveaux de permission valides (entre 0 et 9).'); + let currentPermissionLevel = args[0].toLowerCase(); + const newPermissionLevelName = args[1].toLowerCase(); + let newPermissionLevel = args[1].toLowerCase(); + + if ((currentPermissionLevel !== 'owner' && currentPermissionLevel !== 'buyer' && isNaN(parseInt(currentPermissionLevel)) || currentPermissionLevel < 0 || currentPermissionLevel > 9) || + (newPermissionLevel !== 'owner' && newPermissionLevel !== 'buyer' && isNaN(parseInt(newPermissionLevel)) || newPermissionLevel < 0 || newPermissionLevel > 9)) { + return message.reply('Veuillez spécifier des niveaux de permission valides (entre 0 et 9) ou les mots "owner" ou "buyer".'); } - const db = new sqlite3.Database('myDatabase.db'); + let permissions = await new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { if (err) { @@ -39,13 +40,16 @@ module.exports = { if (!permissions.permissions) { permissions.permissions = {}; } - - // Parcourir toutes les commandes et mettre à jour le niveau de permission + if(args[1] === "owner") newPermissionLevel = 10; + if(args[1] === "buyer") newPermissionLevel = 11; + if(args[0] === "owner") currentPermissionLevel = 10; + if(args[0] === "buyer") currentPermissionLevel = 11; for (const commandName in permissions.permissions) { - if (permissions.permissions[commandName] === currentPermissionLevel) { - permissions.permissions[commandName] = newPermissionLevel; + + if (permissions.permissions[commandName] === currentPermissionLevel && !unchangeableCommands.includes(commandName)) { + permissions.permissions[commandName] = newPermissionLevel; + } } - } db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(permissions)], (err) => { if (err) { @@ -53,6 +57,6 @@ module.exports = { } }); - message.reply(`Le niveau de permission de toutes les commandes ayant le niveau ${currentPermissionLevel} a été changé à ${newPermissionLevel}.`); + message.reply(`Le niveau de permission de toutes les commandes ayant le niveau \`${args[0]}\` a été changé à \`${newPermissionLevelName}\`.`); }, }; \ No newline at end of file diff --git a/commands/gestion/create.js b/commands/gestion/create.js index a5d5f15..825d4de 100644 --- a/commands/gestion/create.js +++ b/commands/gestion/create.js @@ -5,7 +5,7 @@ module.exports = { aliases: ['createemoji', 'create-emoji', 'create-emojis', 'emoji-create', 'emojicreate'], description: 'Crée un emoji', category: 'gestion', - + utilisation: 'create ', async execute(message, args, client) { if (!args.length) { return message.channel.send({ content: "Veuillez spécifier un émoji." }); diff --git a/commands/gestion/embed.js b/commands/gestion/embed.js index d6fd8c0..ad79e3e 100644 --- a/commands/gestion/embed.js +++ b/commands/gestion/embed.js @@ -39,7 +39,7 @@ module.exports = { let msg = await message.channel.send({ embeds: [embed], components: [embedBuilderActionRow, actionRow]}) var collector = msg.createMessageComponentCollector({ filter: (interaction) => interaction.user.id === message.author.id, - time: 150000 + time: 250000 }); @@ -208,7 +208,14 @@ if(i.values[0] == "embedfooter") { let collected = await question.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1 }).then(collected => { let msgg = collected.first() let channel = message.guild.channels.cache.get(msgg.content) || msgg.mentions.channels.first() - channel.send({ embeds: [embed]}) + if (channel && channel.guild.id === message.guild.id) { + channel.send({ embeds: [embed]}); + message.channel.send("L'embed a bien été envoyé dans le salon " + `${channel}`) + msg.edit({ embeds: [embed], components: []}) + } else { + i.channel.send("Le salon mentionné n'appartient pas à ce serveur."); + } + }) } }) diff --git a/commands/gestion/log.js b/commands/gestion/log.js new file mode 100644 index 0000000..f811dbf --- /dev/null +++ b/commands/gestion/log.js @@ -0,0 +1,78 @@ +const { EventEmitterAsyncResource } = require('discord-gamecord/src/2048'); +const { AuditLogEvent, EmbedBuilder, } = require('discord.js'); + +module.exports = { + name: 'log', + description: 'Affiche les 10 derniers logs d\'un utilisateur', + async execute(message, args) { + // Vérifie si un utilisateur a été mentionné ou si un ID a été fourni + const user = message.mentions.users.first() || message.guild.members.cache.get(args[0]); + if (!user) { + return message.reply('Veuillez mentionner un utilisateur ou fournir un ID.'); + } + try { + const fetchedLogs = await message.guild.fetchAuditLogs({ limit: 100 }); + const userLogs = fetchedLogs.entries.filter(entry => entry.executor.id === message.author.id); + const embed = new EmbedBuilder() + .setTitle(`Derniers logs pour l'utilisateur ${user.username}`) + .setColor('#0099ff'); + let index = 0; + userLogs.forEach(async (log) => { + const date = new Date(log.createdAt); + const actionText = await getActionText(log.action); + console.log(actionText) + const formattedDate = `${date.getDate()}/${date.getMonth() + 1}/${date.getFullYear()}`; + embed.addFields({name: `Log ${index + 1}`, value: `${actionText} - ${formattedDate}`}); +}); + + + message.channel.send({ embeds: [embed] }); + } catch (error) { + console.error(error); + message.reply('Une erreur est survenue lors de la récupération des logs.'); + } + + + }, +}; +async function getActionText(actionType) { + const actionTypeMapping = { + 1: 'Ajout de bot', + 2: 'Création de canal', + 3: 'Suppression de canal', + 4: 'Mise à jour de canal', + 5: 'Ban de membre', + 6: 'Débannissement de membre', + 7: 'Mise à jour du serveur', + 8: 'Création d\'intégration', + 9: 'Suppression d\'intégration', + 10: 'Mise à jour d\'intégration', + 11: 'Création d\'émoji', + 12: 'Suppression d\'émoji', + 13: 'Mise à jour d\'émoji', + 14: 'Création de rôle', + 15: 'Suppression de rôle', + 16: 'Mise à jour de rôle', + 17: 'Création de webhook', + 18: 'Suppression de webhook', + 19: 'Mise à jour de webhook', + 20: 'Création de commande d\'application', + 21: 'Suppression de commande d\'application', + 22: 'Mise à jour de commande d\'application', + 23: 'Création d\'événement programmé', + 24: 'Suppression d\'événement programmé', + 25: 'Mise à jour d\'événement programmé', + 26: 'Ajout d\'utilisateur à un événement programmé', + 27: 'Retrait d\'utilisateur d\'un événement programmé', + 28: 'Création de fil de discussion', + 29: 'Suppression de fil de discussion', + 30: 'Mise à jour de fil de discussion', + 31: 'Création de sticker', + 32: 'Suppression de sticker', + 33: 'Mise à jour de sticker', + 34: 'Création de fil de discussion', + 35: 'Suppression de fil de discussion', + 36: 'Mise à jour de fil de discussion', + }; + return actionTypeMapping[actionType] || 'Action inconnue'; +} \ No newline at end of file diff --git a/commands/gestion/prefix.js b/commands/gestion/prefix.js index 2aca59f..e24e082 100644 --- a/commands/gestion/prefix.js +++ b/commands/gestion/prefix.js @@ -1,5 +1,5 @@ const sqlite3 = require('sqlite3').verbose(); - +const db = new sqlite3.Database('myDatabase.db'); module.exports = { name: 'prefix', aliases: ['setprefix'], @@ -9,14 +9,15 @@ module.exports = { category: 'botcontrol', async execute(message, args, client) { - const db = new sqlite3.Database('myDatabase.db'); const botId = client.user.id; const guildId = message.guild.id; if (args.length < 1) { return message.reply('Veuillez spécifier un nouveau préfixe.'); } - + if (args[0].length > 4) { + return message.reply('Veuillez spécifier un préfixe plus court.'); + } let data = await new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { if (err) { diff --git a/commands/gestion/renew.js b/commands/gestion/renew.js index 983719f..0e9c6a2 100644 --- a/commands/gestion/renew.js +++ b/commands/gestion/renew.js @@ -22,7 +22,7 @@ module.exports = { newChannel.send(`${message.author}, ce salon a été renouvelé.`); } else { - return message.reply("Je ne peux pas supprimer ce salon."); + return message.reply("❌ Vous ne pouvez pas renew un salon de communauté"); } }, }; \ No newline at end of file diff --git a/commands/gestion/rolereact.js b/commands/gestion/rolereact.js index fa9c40e..9d90201 100644 --- a/commands/gestion/rolereact.js +++ b/commands/gestion/rolereact.js @@ -5,11 +5,11 @@ module.exports = { name: 'rolereact', description: 'Associate an emoji with a role and add the reaction to a message', emote: '🎭', - utilisation: '+rolereact @role/id ', + utilisation: 'rolereact @role/id ', category: 'gestion', async execute(message, args, client) { if (args.length < 3) { - return message.reply('Veuillez fournir un rôle, un message ID et un emoji.'); + return message.reply('Veuillez utiliser : \`+rolereact @role/id \`'); } const role = message.mentions.roles.first() || message.guild.roles.cache.get(args[0]); diff --git a/commands/gestion/confession.js b/commands/gestion/setconfession.js similarity index 100% rename from commands/gestion/confession.js rename to commands/gestion/setconfession.js diff --git a/commands/invite/addinvite.js b/commands/invite/addinvite.js new file mode 100644 index 0000000..35592b0 --- /dev/null +++ b/commands/invite/addinvite.js @@ -0,0 +1,33 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'addinvite', + description: 'Ajoute un nombre spécifique d\'invitations à un utilisateur.', + emote: '📈', + utilisation: 'addinvite [@user/id] ', + category: 'invitation', + async execute(message, args, client) { + const member = message.mentions.members.first() || message.guild.members.cache.get(args[0]); + if (!member) { + return message.reply('Veuillez mentionner un membre ou fournir un ID de membre valide.'); + } + const numberToAdd = parseInt(args[1], 10); + if (isNaN(numberToAdd)) { + return message.reply('Veuillez fournir un nombre valide.'); + } + addInviteCount(message.guild.id, member.id, numberToAdd); + message.reply(`${numberToAdd} invitations ont été ajoutées à ${member.user.tag}.`); + }, +}; + +function addInviteCount(guildId, memberId, numberToAdd) { + db.run(`INSERT INTO invitations (guild_id, member_id, invite_count) + VALUES (?, ?, ?) + ON CONFLICT(guild_id, member_id) DO UPDATE SET invite_count = invite_count + ?`, + [guildId, memberId, numberToAdd, numberToAdd], function(err) { + if (err) { + return console.error(err.message); + } + }); +} \ No newline at end of file diff --git a/commands/invite/invite.js b/commands/invite/invite.js new file mode 100644 index 0000000..d4fbb58 --- /dev/null +++ b/commands/invite/invite.js @@ -0,0 +1,34 @@ +const { EmbedBuilder } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +module.exports = { + name: 'invite', + description: 'Affiche le nombre d\'invitations d\'un utilisateur.', + emote: '📈', + utilisation: 'invite [@user/id]', + category: 'invitation', + + async execute(message, args, client) { + let memberId = message.mentions.users.first()?.id ||client.users.cache.get(args[0])?.id || message.author.id; + + getInviteCount(message.guild.id, memberId, (inviteCount) => { + const embed = new EmbedBuilder() + .setColor('#0099ff') + .setTitle('Nombre d\'invitations') + .setDescription(`<@${memberId}> a invité ${inviteCount} personnes.`); + + message.reply({ embeds: [embed] }); + }); + }, +}; + +function getInviteCount(guildId, memberId, callback) { + const db = new sqlite3.Database('myDatabase.db'); + db.get(`SELECT invite_count FROM invitations WHERE guild_id = ? AND member_id = ?`, + [guildId, memberId], (err, row) => { + if (err) { + return console.error(err.message); + } + callback(row ? row.invite_count : 0); + }); +} \ No newline at end of file diff --git a/commands/invite/inviteboard.js b/commands/invite/inviteboard.js new file mode 100644 index 0000000..857e7be --- /dev/null +++ b/commands/invite/inviteboard.js @@ -0,0 +1,40 @@ +const { EmbedBuilder } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'inviteboard', + description: 'Affiche les 10 personnes du serveur avec le plus d\'invitations.', + emote: '📊', + utilisation: 'inviteboard', + category: 'invitation', + async execute(message, args, client) { + db.all(`SELECT member_id, invite_count FROM invitations WHERE guild_id = ? ORDER BY invite_count DESC LIMIT 10`, [message.guild.id], (err, rows) => { + if (err) { + console.error(err.message); + return message.reply('Une erreur s\'est produite lors de la récupération des données d\'invitation.'); + } + + if (rows.length === 0) { + return message.reply('Aucune donnée d\'invitation disponible pour ce serveur.'); + } + + let leaderboard = 'Top 10 des invitations:\n'; + rows.forEach((row, index) => { + const member = message.guild.members.cache.get(row.member_id); + if (member) { + leaderboard += `${index + 1}. **${member.user.tag}**: \`${row.invite_count}\` invitations\n`; + } + }); + + const embed = new EmbedBuilder() + .setTitle('Classement des invitations') + .setDescription(leaderboard) + .setThumbnail(message.guild.iconURL({ dynamic: true, size: 1024 })) + .setFooter({text: `Invite leaderborder | ${client.user.username}`}) + .setColor('#0099ff'); + + message.channel.send({ embeds: [embed] }); + }); + }, +}; \ No newline at end of file diff --git a/commands/invite/invitereset.js b/commands/invite/invitereset.js new file mode 100644 index 0000000..b0ba45b --- /dev/null +++ b/commands/invite/invitereset.js @@ -0,0 +1,44 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'invitereset', + aliases: ['resetinvite'], + description: 'Réinitialise le compteur d\'invitations pour un utilisateur ou un serveur.', + emote: '🔄', + utilisation: 'invitereset [user|guild] [@user/id]', + category: 'invitation', + async execute(message, args, client) { + if (args[0] === 'user') { + const member = message.mentions.members.first() || message.guild.members.cache.get(args[1]); + if (!member) { + return message.reply('Veuillez mentionner un membre ou fournir un ID de membre valide.'); + } + resetInviteCountForUser(message.guild.id, member.id); + message.reply(`Le compteur d'invitations de ${member.user.tag} a été réinitialisé.`); + } else if (args[0] === 'guild') { + resetInviteCountForGuild(message.guild.id); + message.reply(`Le compteur d'invitations pour le serveur ${message.guild.name} a été réinitialisé.`); + } else { + message.reply('Veuillez spécifier \`user\` ou \`guild\` pour réinitialiser le compteur d\'invitations.'); + } + }, +}; + +function resetInviteCountForUser(guildId, memberId) { + db.run(`UPDATE invitations SET invite_count = 0 WHERE guild_id = ? AND member_id = ?`, + [guildId, memberId], function(err) { + if (err) { + return console.error(err.message); + } + }); +} + +function resetInviteCountForGuild(guildId) { + db.run(`DELETE FROM invitations WHERE guild_id = ?`, + [guildId], function(err) { + if (err) { + return console.error(err.message); + } + }); +} \ No newline at end of file diff --git a/commands/invite/removeinvite.js b/commands/invite/removeinvite.js new file mode 100644 index 0000000..5829d12 --- /dev/null +++ b/commands/invite/removeinvite.js @@ -0,0 +1,32 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'removeinvite', + description: 'Retire un nombre spécifique d\'invitations d\'un utilisateur.', + emote: '📈', + utilisation: 'removeinvite [@user/id] ', + category: 'invitation', + async execute(message, args, client) { + const member = message.mentions.members.first() || message.guild.members.cache.get(args[0]); + if (!member) { + return message.reply('Veuillez mentionner un membre ou fournir un ID de membre valide.'); + } + const numberToRemove = parseInt(args[1], 10); + if (isNaN(numberToRemove)) { + return message.reply('Veuillez fournir un nombre valide.'); + } + removeInviteCount(message.guild.id, member.id, numberToRemove); + message.reply(`${numberToRemove} invitations ont été retirées de ${member.user.tag}.`); + }, +}; +function removeInviteCount(guildId, memberId, numberToRemove) { + db.run(`INSERT INTO invitations (guild_id, member_id, invite_count) + VALUES (?, ?, 0) + ON CONFLICT(guild_id, member_id) DO UPDATE SET invite_count = invite_count - ?`, + [guildId, memberId, numberToRemove], function(err) { + if (err) { + return console.error(err.message); + } + }); +} \ No newline at end of file diff --git a/commands/logs/boostlog.js b/commands/logs/boostlog.js new file mode 100644 index 0000000..4bbc023 --- /dev/null +++ b/commands/logs/boostlog.js @@ -0,0 +1,64 @@ +const { EmbedBuilder, ChannelType } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'boostlog', + description: 'Enregistre l\'ID d\'un salon pour les logs de boosts.', + category: 'gestion', + emote: '🚀', + utilisation: 'boostlog [#salon/id]', + async execute(message, args, client) { + let channelId; + const mentionedChannel = message.mentions.channels.first(); + + if (mentionedChannel) { + channelId = mentionedChannel.id; + } else if (args[0]) { + const channel = message.guild.channels.cache.get(args[0]); + if (channel && channel.type === ChannelType.GuildText) { + channelId = args[0]; + } else { + return message.reply('Le salon spécifié est invalide ou n\'existe pas dans ce serveur.'); + } + } else { + channelId = message.channel.id; + } + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [message.client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[message.guild.id]) { + data[message.guild.id] = {}; + } + + if (data[message.guild.id].boostlog && data[message.guild.id].boostlog === channelId) { + delete data[message.guild.id].boostlog; + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], function(err) { + if (err) { + return console.error(err.message); + } + }); + return message.reply("Le salon de boostlog a bien etait supprimé") + } else { + data[message.guild.id].boostlog = channelId; + } + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], function(err) { + if (err) { + return console.error(err.message); + } + }); + + const embed = new EmbedBuilder() + .setColor('#0099ff') + .setDescription(`Le salon de log de boosts a été mis à jour dans le salon <#${channelId}>`); + message.channel.send({ embeds: [embed] }); + }, +}; \ No newline at end of file diff --git a/commands/logs/channellog.js b/commands/logs/channellog.js new file mode 100644 index 0000000..eef0810 --- /dev/null +++ b/commands/logs/channellog.js @@ -0,0 +1,64 @@ +const { EmbedBuilder, ChannelType } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'channelog', + description: 'Enregistre l\'ID d\'un salon pour les logs de salons.', + category: 'gestion', + emote: '📝', + utilisation: 'channelog [#salon/id]', + async execute(message, args, client) { + let channelId; + const mentionedChannel = message.mentions.channels.first(); + + if (mentionedChannel) { + channelId = mentionedChannel.id; + } else if (args[0]) { + const channel = message.guild.channels.cache.get(args[0]); + if (channel && channel.type === ChannelType.GuildText) { + channelId = args[0]; + } else { + return message.reply('Le salon spécifié est invalide ou n\'existe pas dans ce serveur.'); + } + } else { + channelId = message.channel.id; + } + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [message.client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[message.guild.id]) { + data[message.guild.id] = {}; + } + + if (data[message.guild.id].channelog && data[message.guild.id].channelog === channelId) { + delete data[message.guild.id].channelog; + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], function(err) { + if (err) { + return console.error(err.message); + } + }); + return message.reply("Le salon de channelog a bien etait supprimé") + } else { + data[message.guild.id].channelog = channelId; + } + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], function(err) { + if (err) { + return console.error(err.message); + } + }); + + const embed = new EmbedBuilder() + .setColor('#0099ff') + .setDescription(`Le salon de log de salons a été mis à jour dans le salon <#${channelId}>`); + message.channel.send({ embeds: [embed] }); + }, +}; \ No newline at end of file diff --git a/commands/logs/messagelog.js b/commands/logs/messagelog.js index 4329a16..8c0bc15 100644 --- a/commands/logs/messagelog.js +++ b/commands/logs/messagelog.js @@ -34,16 +34,27 @@ module.exports = { }); }); - if (!data[message.guild.id]) { - data[message.guild.id] = {}; - } - data[message.guild.id].messagelog = channelId; + if (!data[message.guild.id]) { + data[message.guild.id] = {}; + } - db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], function(err) { - if (err) { - return console.error(err.message); - } - }); + if (data[message.guild.id].messagelog && data[message.guild.id].messagelog === channelId) { + delete data[message.guild.id].messagelog; + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], function(err) { + if (err) { + return console.error(err.message); + } + }); + return message.reply("Le salon de messagelog a bien etait supprimé") + } else { + data[message.guild.id].messagelog = channelId; + } + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], function(err) { + if (err) { + return console.error(err.message); + } + }); const embed = new EmbedBuilder() .setColor('#0099ff') diff --git a/commands/logs/modlog.js b/commands/logs/modlog.js index 8fda1d8..85bcf4d 100644 --- a/commands/logs/modlog.js +++ b/commands/logs/modlog.js @@ -38,7 +38,18 @@ module.exports = { if (!data[message.guild.id]) { data[message.guild.id] = {}; } - data[message.guild.id].modlog = channelId; + + if (data[message.guild.id].modlog && data[message.guild.id].modlog === channelId) { + delete data[message.guild.id].modlog; + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], function(err) { + if (err) { + return console.error(err.message); + } + }); + return message.reply("Le salon de modlog a bien etait supprimé") + } else { + data[message.guild.id].modlog = channelId; + } db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], function(err) { if (err) { diff --git a/commands/logs/presetlog.js b/commands/logs/presetlog.js index 99b326c..4f6a7f5 100644 --- a/commands/logs/presetlog.js +++ b/commands/logs/presetlog.js @@ -12,7 +12,7 @@ module.exports = { const sendmessage = await message.reply("\`🔄\` Les salon de log sont entrain d'etre crée...") const guild = message.guild; const categoryName = 'log'; - const channelNames = ['modlog', 'messagelog', 'vocallog', 'rolelog', 'raidlog']; + const channelNames = ['modlog', 'messagelog', 'vocallog', 'rolelog', 'raidlog', 'channelog']; const channelTypes = [ChannelType.GuildText, ChannelType.GuildText, ChannelType.GuildText, ChannelType.GuildText, ChannelType.GuildText]; let data = await new Promise((resolve, reject) => { diff --git a/commands/logs/rolelog.js b/commands/logs/rolelog.js index bfba46d..ac4a077 100644 --- a/commands/logs/rolelog.js +++ b/commands/logs/rolelog.js @@ -1,6 +1,7 @@ const { EmbedBuilder, ChannelType } = require('discord.js'); const sqlite3 = require('sqlite3').verbose(); const db = new sqlite3.Database('myDatabase.db'); + module.exports = { name: 'rolelog', description: 'Enregistre l\'ID d\'un salon pour les logs de rôles.', @@ -23,6 +24,7 @@ module.exports = { } else { channelId = message.channel.id; } + let data = await new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [message.client.user.id], (err, row) => { if (err) { @@ -36,7 +38,18 @@ module.exports = { if (!data[message.guild.id]) { data[message.guild.id] = {}; } - data[message.guild.id].rolelog = channelId; + + if (data[message.guild.id].rolelog && data[message.guild.id].rolelog === channelId) { + delete data[message.guild.id].rolelog; + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], function(err) { + if (err) { + return console.error(err.message); + } + }); + return message.reply("Le salon de rolelog a bien etait supprimé") + } else { + data[message.guild.id].rolelog = channelId; + } db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], function(err) { if (err) { diff --git a/commands/logs/logs.js b/commands/logs/setlogs.js similarity index 60% rename from commands/logs/logs.js rename to commands/logs/setlogs.js index 5118c1c..e013cdc 100644 --- a/commands/logs/logs.js +++ b/commands/logs/setlogs.js @@ -2,7 +2,7 @@ const { ActionRowBuilder, StringSelectMenuBuilder, EmbedBuilder } = require('dis const sqlite3 = require('sqlite3').verbose(); const db = new sqlite3.Database('myDatabase.db'); module.exports = { - name: 'logs', + name: 'setlogs', description: 'Affiche et configure les logs du serveur.', category: 'gestion', emote: '📝', @@ -22,12 +22,13 @@ module.exports = { .setColor('#0099ff') .setTitle('Configuration des logs') .addFields( - { name: '📝 Logs de messages', value: data[message.guild.id]?.messagelog ? `<#${data[message.guild.id].messagelog}>` : 'Non configuré', inline: true }, - { name: '📚 Logs de rôles', value: data[message.guild.id]?.rolelog ? `<#${data[message.guild.id].rolelog}>` : 'Non configuré', inline: true }, - { name: '🎙️ Logs vocaux', value: data[message.guild.id]?.vocallog ? `<#${data[message.guild.id].vocallog}>` : 'Non configuré', inline: true }, - { name: '🛡️ Logs de raid', value: data[message.guild.id]?.raidlog ? `<#${data[message.guild.id].raidlog}>` : 'Non configuré', inline: true }, - { name: '🔧 Logs de modération', value: data[message.guild.id]?.modlog ? `<#${data[message.guild.id].modlog}>` : 'Non configuré', inline: true }, - { name: '🛡️ raidping', value: data[message.guild.id]?.modlog ? `${data[message.guild.id].raidping}` : 'Non configuré', inline: true }, + { name: '📝 Logs de messages', value: `**Actif**: \`${data[message.guild.id]?.messagelog ? '✅' : '❌'}\`\n **Salon: **${data[message.guild.id]?.messagelog ? `<#${data[message.guild.id].messagelog}>` : '\`Non configuré\`'}` }, + { name: '📚 Logs de rôles', value: `**Actif**: \`${data[message.guild.id]?.rolelog ? '✅' : '❌'}\`\n **Salon: **${data[message.guild.id]?.rolelog ? `<#${data[message.guild.id].rolelog}>` : '\`Non configuré\`'}` }, + { name: '🎙️ Logs vocaux', value: `**Actif**: \`${data[message.guild.id]?.vocallog ? '✅' : '❌'}\`\n **Salon: **${data[message.guild.id]?.vocallog ? `<#${data[message.guild.id].vocallog}>` : '\`Non configuré\`'}` }, + { name: '🛡️ Logs de raid', value: `**Actif**: \`${data[message.guild.id]?.raidlog ? '✅' : '❌'}\`\n **Salon: **${data[message.guild.id]?.raidlog ? `<#${data[message.guild.id].raidlog}>` : '\`Non configuré\`'}` }, + { name: '🔧 Logs de modération', value: `**Actif**: \`${data[message.guild.id]?.modlog ? '✅' : '❌'}\`\n **Salon: **${data[message.guild.id]?.modlog ? `<#${data[message.guild.id].modlog}>` : '\`Non configuré\`'}` }, + { name: '📝 Logs de salons', value: `**Actif**: \`${data[message.guild.id]?.channelog ? '✅' : '❌'}\`\n **Salon: **${data[message.guild.id]?.channelog ? `<#${data[message.guild.id].channelog}>` : '\`Non configuré\`'}` }, + { name: '🚀 Logs de boosts', value: `**Actif**: \`${data[message.guild.id]?.boostlog ? '✅' : '❌'}\`\n **Salon: **${data[message.guild.id]?.boostlog ? `<#${data[message.guild.id].boostlog}>` : '\`Non configuré\`'}` }, ); const selectMenu = new StringSelectMenuBuilder() @@ -39,7 +40,8 @@ module.exports = { { label: '🎙️ Logs vocaux', value: 'vocallog', description: 'Configurer le salon de logs vocaux' }, { label: '🛡️ Logs de raid', value: 'raidlog', description: 'Configurer le salon de logs de raid' }, { label: '🔧 Logs de modération', value: 'modlog', description: 'Configurer le salon de logs de modération' }, - { label: '🛡️ raidping', value: 'raidping', description: 'Configurer le mesage de raid' }, + { label: '📝 Logs de salons', value: 'channelog', description: 'Configurer le salon de logs de salons' }, + { label: '🚀 Logs de boosts', value: 'boostlog', description: 'Configurer le salon de logs de boosts' }, ]); @@ -99,7 +101,7 @@ module.exports = { } }); - let data2 = await new Promise((resolve, reject) => { + data = await new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [message.client.user.id], (err, row) => { if (err) { console.error(err.message); @@ -115,13 +117,14 @@ module.exports = { .setColor('#0099ff') .setTitle('Configuration des logs') .addFields( - { name: '📝 Logs de messages', value: data2[message.guild.id]?.messagelog ? `<#${data2[message.guild.id].messagelog}>` : 'Non configuré', inline: true }, - { name: '📚 Logs de rôles', value: data2[message.guild.id]?.rolelog ? `<#${data2[message.guild.id].rolelog}>` : 'Non configuré', inline: true }, - { name: '🎙️ Logs vocaux', value: data2[message.guild.id]?.vocallog ? `<#${data2[message.guild.id].vocallog}>` : 'Non configuré', inline: true }, - { name: '🛡️ Logs de raid', value: data2[message.guild.id]?.raidlog ? `<#${data2[message.guild.id].raidlog}>` : 'Non configuré', inline: true }, - { name: '🔧 Logs de modération', value: data2[message.guild.id]?.modlog ? `<#${data2[message.guild.id].modlog}>` : 'Non configuré', inline: true }, - { name: '🛡️ raidping', value: data2[message.guild.id]?.modlog ? `${data2[message.guild.id].raidping}` : 'Non configuré', inline: true }, - ); + { name: '📝 Logs de messages', value: `**Actif**: \`${data[message.guild.id]?.messagelog ? '✅' : '❌'}\`\n **Salon: **${data[message.guild.id]?.messagelog ? `<#${data[message.guild.id].messagelog}>` : '\`Non configuré\`'}` }, + { name: '📚 Logs de rôles', value: `**Actif**: \`${data[message.guild.id]?.rolelog ? '✅' : '❌'}\`\n **Salon: **${data[message.guild.id]?.rolelog ? `<#${data[message.guild.id].rolelog}>` : '\`Non configuré\`'}` }, + { name: '🎙️ Logs vocaux', value: `**Actif**: \`${data[message.guild.id]?.vocallog ? '✅' : '❌'}\`\n **Salon: **${data[message.guild.id]?.vocallog ? `<#${data[message.guild.id].vocallog}>` : '\`Non configuré\`'}` }, + { name: '🛡️ Logs de raid', value: `**Actif**: \`${data[message.guild.id]?.raidlog ? '✅' : '❌'}\`\n **Salon: **${data[message.guild.id]?.raidlog ? `<#${data[message.guild.id].raidlog}>` : '\`Non configuré\`'}` }, + { name: '🔧 Logs de modération', value: `**Actif**: \`${data[message.guild.id]?.modlog ? '✅' : '❌'}\`\n **Salon: **${data[message.guild.id]?.modlog ? `<#${data[message.guild.id].modlog}>` : '\`Non configuré\`'}` }, + { name: '📝 Logs de salons', value: `**Actif**: \`${data[message.guild.id]?.channelog ? '✅' : '❌'}\`\n **Salon: **${data[message.guild.id]?.channelog ? `<#${data[message.guild.id].channelog}>` : '\`Non configuré\`'}` }, + { name: '🚀 Logs de boosts', value: `**Actif**: \`${data[message.guild.id]?.boostlog ? '✅' : '❌'}\`\n **Salon: **${data[message.guild.id]?.boostlog ? `<#${data[message.guild.id].boostlog}>` : '\`Non configuré\`'}` }, + ); logmessage.edit({ embeds: [updatedEmbed], components: [row] }); }); diff --git a/commands/logs/vocallog.js b/commands/logs/vocallog.js index f593ff3..5b95954 100644 --- a/commands/logs/vocallog.js +++ b/commands/logs/vocallog.js @@ -1,6 +1,7 @@ const { EmbedBuilder, ChannelType } = require('discord.js'); const sqlite3 = require('sqlite3').verbose(); const db = new sqlite3.Database('myDatabase.db'); + module.exports = { name: 'vocallog', description: 'Enregistre l\'ID d\'un salon pour les logs vocaux.', @@ -23,6 +24,7 @@ module.exports = { } else { channelId = message.channel.id; } + let data = await new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [message.client.user.id], (err, row) => { if (err) { @@ -36,7 +38,18 @@ module.exports = { if (!data[message.guild.id]) { data[message.guild.id] = {}; } - data[message.guild.id].vocallog = channelId; + + if (data[message.guild.id].vocallog && data[message.guild.id].vocallog === channelId) { + delete data[message.guild.id].vocallog; + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], function(err) { + if (err) { + return console.error(err.message); + } + }); + return message.reply("Le salon de rolelog a bien etait supprimé") + } else { + data[message.guild.id].vocallog = channelId; + } db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], function(err) { if (err) { diff --git a/commands/moderation/addrole.js b/commands/moderation/addrole.js new file mode 100644 index 0000000..51b8386 --- /dev/null +++ b/commands/moderation/addrole.js @@ -0,0 +1,54 @@ +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); +const { PermissionsBitField } = require('discord.js'); + +module.exports = { + name: 'addrole', + description: 'Ajoute un rôle à un utilisateur.', + usage: '+addrole @user/id ', + category: 'moderation', + + async execute(message, args, client) { + const botMember = await message.guild.members.fetch(client.user.id); + const userMember = await message.guild.members.fetch(message.author.id); + if (!botMember.permissions.has(PermissionsBitField.Flags.ManageRoles)) { + return message.reply("Je n'est pas la permission de pouvoir donnée des role"); + } + const user = message.mentions.members.first() || message.guild.members.cache.get(args[0]); + if (!user) { + return message.reply('Utilisateur non trouvé.'); + } + + let role; + if (message.mentions.roles.first()) { + role = message.mentions.roles.first(); + } else if (args[1].match(/^<@&(\d+)>$/)) { + const roleId = args[1].match(/^<@&(\d+)>$/)[1]; + role = message.guild.roles.cache.get(roleId); + } else { + role = message.guild.roles.cache.find(r => r.name.toLowerCase() === args[1].toLowerCase()); + } + + if (!role) { + return message.reply('Rôle non trouvé.'); + } + + if (role.position >= (botMember.roles.highest ? botMember.roles.highest.position : 0)) { + return message.reply('Je ne peux pas gérer ce rôle car il est plus haut ou égal à mon rôle le plus élevé.'); + } + + const permlevel = await getPermissionLevel(user, client); + if (role.permissions.has(PermissionsBitField.Flags.Administrator)&& permlevel < 10) { + return message.reply('Le rôle que vous demandez est dangereux.'); + } + const roleposition = role.position; + const userroleposition = userMember.roles.highest.position; + if (roleposition >= userroleposition && permlevel < 10) return message.reply('Vous ne pouvez pas supprimer un rôle plus élevé ou égal au vôtre.'); + + try { + await user.roles.add(role, `addrole : ${message.author.username}`); + message.reply(`Le rôle ${role} a été ajouté à ${user.user.tag}.`); + } catch (error) { + return message.reply('Une erreur est survenue lors de l\'ajout du rôle.'); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/badword.js b/commands/moderation/badword.js index 969b6cb..d4acb79 100644 --- a/commands/moderation/badword.js +++ b/commands/moderation/badword.js @@ -15,6 +15,7 @@ module.exports = { const add = args[0] === "add"; const del = args[0] === "del"; const list = args[0] === "list"; + const preset = args[0] === "preset"; let data = await new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { @@ -66,7 +67,28 @@ module.exports = { .setDescription(data[guildId].badwords.join('\n') || 'Aucun mot interdit n\'est défini.') .setFooter({text: `Mots interdits | ${client.user.username}`}) .setColor('#0099ff'); + try { message.channel.send({ embeds: [embed] }); + }catch (e) { + message.reply("Je n'ai pas pu envoyer l'embed, vérifier mes permissions.") + } + } else if (preset) { + const presetBadwords = [ + "connard", "salope", "encule", "pute", "pd", "Nique", "batard", "gueule", "enfoire", "creve", "degage", "Trou du cul","raclure", "connasse", "petasse", "pute", "suceur", "ordure", "con", "foutre", "merdeux", "pedale", "chibre" + ]; + presetBadwords.forEach(word => { + if (!data[guildId].badwords.includes(word)) { + data[guildId].badwords.push(word); + } + }); + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], (err) => { + if (err) { + console.error(err.message); + message.reply('Une erreur est survenue lors de la mise à jour de la base de données.'); + return; + } + }); + message.reply('La liste prédéfinie des mots interdits a été mise à jour.') } else { message.reply('Commande invalide. Utilisez `badword add [mot]`, `badword del [mot]` ou `badword list`.'); } diff --git a/commands/moderation/ban.js b/commands/moderation/ban.js index 92cf243..71fa7f1 100644 --- a/commands/moderation/ban.js +++ b/commands/moderation/ban.js @@ -1,18 +1,21 @@ -const { EmbedBuilder, User } = require("discord.js") -const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); +const { getPermissionLevel2 } = require('../../fonction/getPermissionLevel'); module.exports = { - name: 'ban', - description: 'Ban a member', - emote: '🚫', - utilisation: 'ban <@member> [reason]', - category: 'moderation', + name: 'ban', + description: 'Bannir un membre', + emote: '🚫', + utilisation: 'ban <@member> [reason]', + category: 'moderation', - async execute(message, args, client) { - const userId = message.mentions.users.first()?.id - || args[0]; - - const user = await client.users.fetch(userId); + async execute(message, args, client) { + const userId = message.mentions.users.first()?.id || args[0]; + const guildId = message.guild.id; + const user = await message.guild.members.fetch(userId).catch(error => { + return null; + }); + const author = await message.guild.members.fetch(message.author.id).catch(error => { + return null; + }); if (!user) { return message.reply('Veuillez mentionner un utilisateur valide ou fournir un ID valide.'); } @@ -23,23 +26,28 @@ module.exports = { if (user.id === client.user.id) { return message.reply('Vous ne pouvez pas me ban'); } - if (await getPermissionLevel(user, client) === 11) { + const permissionMember = await getPermissionLevel2(user, client,guildId); + if (permissionMember === 11) { return message.reply('Vous ne pouvez pas ban un membre buyer'); } - if (await getPermissionLevel(user, client) === 10) { + if (permissionMember === 10) { return message.reply('Vous ne pouvez pas ban un membre owner'); } - if (await getPermissionLevel(message.author, client) !== 11 || await getPermissionLevel(message.author, client) !== 10) { - if (await getPermissionLevel(user, client) >= await getPermissionLevel(message.author, client)) { + const permissionAuthor = await getPermissionLevel2(message.author, client, guildId); + if (permissionAuthor !== 11 && permissionAuthor !== 10) { + if (permissionMember >= permissionAuthor) { return message.reply('Vous ne pouvez pas ban un membre avec une permission égale ou supérieure à la votre'); } } - - try { - await message.guild.members.ban(user, { reason: args.slice(1).join(' ')+` : ${message.author.tag}` || `Aucune raison spécifiée : ${message.author.tag}` }); - message.channel.send(`L'utilisateur ${user.username} a été banni.`); - } catch { - message.reply(`Une erreur s'est produite lors de la tentative de bannissement de ${user.username}.`); + if(user.roles.highest.position >= author.roles.highest.position && permissionAuthor !== 11 && permissionAuthor !== 10) { + return message.reply('Vous ne pouvez pas ban un membre avec un role égale ou supérieure à la votre'); } - }, + try { + const reason = args.slice(1).join(' ') || `Aucune raison spécifiée : ${message.author.tag}`; + await message.guild.members.ban(user, { reason: `${reason} : ${message.author.tag}` }); + message.channel.send(`L'utilisateur ${user.user.username} a été banni.`); + } catch { + message.reply(`Une erreur s'est produite lors de la tentative de bannissement de ${user.user.username}.`); + } + }, }; \ No newline at end of file diff --git a/commands/moderation/baninfo.js b/commands/moderation/baninfo.js new file mode 100644 index 0000000..40d4e64 --- /dev/null +++ b/commands/moderation/baninfo.js @@ -0,0 +1,30 @@ +const { EmbedBuilder } = require('discord.js'); + +module.exports = { + name: 'baninfo', + description: 'Affiche les informations d\'un utilisateur bannie', + emote: '🚫', + utilisation: 'baninfo [id]', + category: 'gestion', + + async execute(message, args, client) { + const userIdToCheck = args[0]; + const bans = await message.guild.bans.fetch(); + + const ban = bans.find(ban => ban.user.id === userIdToCheck); + + if (!ban) { + return message.reply('Cet utilisateur n\'est pas dans la liste des bannis.'); + } + const banner = ban.executor; + const reason = ban.reason || 'Raison non disponible'; + const banDate = ban.createdAt; + + const embed = new EmbedBuilder() + .setTitle(`Informations sur l'utilisateur ${ban.user.tag}`) + .setDescription(`**Raison: **\`${reason}\`\n**Bannie par: **${banner ? banner.tag : 'Inconnu'}\n**Date: **${banDate}`) + .setColor('#0099ff'); + + message.channel.send({ embeds: [embed] }); + }, +}; \ No newline at end of file diff --git a/commands/moderation/banlist.js b/commands/moderation/banlist.js index 3e0658e..f07e2bf 100644 --- a/commands/moderation/banlist.js +++ b/commands/moderation/banlist.js @@ -9,25 +9,28 @@ module.exports = { async execute(message) { try { const bans = await message.guild.bans.fetch(); + const bansArray = Array.from(bans.values()); const embeds = []; - const maxPerPage = 10; - let currentPage = 0; + const maxPerPage = 15; + let index = 0; - for (let i = 0; i < bans.size; i += maxPerPage) { + for (let i = 0; i < bansArray.length; i += maxPerPage) { + const page = bansArray.slice(i, i + maxPerPage).map((ban) => { + const reason = ban.reason || 'Raison non disponible'; + const entry = `**${index + 1}.** ${ban.user.tag} - **Raison: **\`${reason}\``; + index++; + return entry; + }).join('\n'); + const embed = new EmbedBuilder() .setTitle('Liste des utilisateurs bannis') + .setDescription(page) .setColor('#ff0000'); - - bans.each((ban, index) => { - if (index >= i && index < i + maxPerPage) { - const reason = ban.reason || 'Raison non disponible'; - embed.addFields({ name: ban.user.tag, value: `Raison: ${reason}` }); - } - }); - - embeds.push(embed); - } - + + embeds.push(embed); + } + + let currentPage = 0; const row = new ActionRowBuilder() .addComponents( @@ -41,27 +44,46 @@ module.exports = { .setStyle(ButtonStyle.Primary) ); - await message.channel.send({ embeds: [embeds[currentPage]], components: [row] }); + const sentMessage = await message.channel.send({ embeds: [embeds[currentPage]], components: [row] }); const filter = i => i.customId === 'previous' || i.customId === 'next' && i.user.id === message.author.id; - const collector = message.channel.createMessageComponentCollector({ filter, time: 60000 }); + const collector = sentMessage.createMessageComponentCollector({ filter, time: 60000 }); collector.on('collect', async i => { if (i.customId === 'previous') { - currentPage = Math.max(currentPage - 1, 0); + currentPage--; } else if (i.customId === 'next') { - currentPage = Math.min(currentPage + 1, embeds.length - 1); + currentPage++; } - - await i.update({ embeds: [embeds[currentPage]], components: [row] }); + + if (currentPage < 0) { + currentPage = 0; + } else if (currentPage >= embeds.length) { + currentPage = embeds.length - 1; + } + + const newEmbed = embeds[currentPage]; + const backButton = new ButtonBuilder() + .setCustomId('previous') + .setLabel('Précédent') + .setStyle(ButtonStyle.Primary); + + const nextButton = new ButtonBuilder() + .setCustomId('next') + .setLabel('Suivant') + .setStyle(ButtonStyle.Primary); + + const row = new ActionRowBuilder() + .addComponents(backButton, nextButton); + + await i.update({ embeds: [newEmbed], components: [row] }); }); - collector.on('end', collected => { - message.channel.send('Navigation terminée.'); + sentMessage.edit({ components: [] }); }); } catch (error) { console.error('Erreur lors de la récupération des utilisateurs bannis:', error); message.reply('Une erreur est survenue lors de la récupération des utilisateurs bannis.'); } }, -}; +}; \ No newline at end of file diff --git a/commands/moderation/cmute.js b/commands/moderation/cmute.js new file mode 100644 index 0000000..fd2d141 --- /dev/null +++ b/commands/moderation/cmute.js @@ -0,0 +1,21 @@ +const { PermissionsBitField } = require('discord.js'); +module.exports = { + name: 'cmute', + description: 'Mute un utilisateur dans un salon', + emote: '🔇', + utilisation: 'cmute <@utilisateur> ou cmute ', + category: 'moderation', + + async execute(message, args) { + + const user = message.mentions.members.first() || message.guild.members.cache.get(args[0]); + if (!user) { + return message.reply('Veuillez mentionner une utilisateur valide.'); + } + if (user.id === message.author.id) { + return message.reply("Vous ne pouvez pas vous mute"); + } + await message.channel.permissionOverwrites.edit(user, { "SendMessages": false }); + message.reply(`${user} a bien été mute dans le salon : <#${message.channel.id}>`) + }, +}; \ No newline at end of file diff --git a/commands/moderation/cunmute.js b/commands/moderation/cunmute.js new file mode 100644 index 0000000..cdaa8e2 --- /dev/null +++ b/commands/moderation/cunmute.js @@ -0,0 +1,21 @@ +module.exports = { + name: 'cunmute', + description: 'Déverrouille l\'envoi de messages pour un utilisateur dans un salon', + emote: '🔊', + utilisation: 'cunmute <@utilisateur> ou cunmute ', + category: 'moderation', + + async execute(message, args) { + + const user = message.mentions.members.first() || message.guild.members.cache.get(args[0]); + if (!user) { + return message.reply('Veuillez mentionner une utilisateur valide.'); + } + if (user.id === message.author.id) { + return message.reply("Vous ne pouvez pas vous déverrouiller vous-même"); + } + await message.channel.permissionOverwrites.delete(user.id).catch(error => { + }); + message.reply(`${user} a bien été déverrouillé dans le salon : <#${message.channel.id}>`) + }, +}; \ No newline at end of file diff --git a/commands/moderation/delrole.js b/commands/moderation/delrole.js new file mode 100644 index 0000000..3dcd2a8 --- /dev/null +++ b/commands/moderation/delrole.js @@ -0,0 +1,50 @@ +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); +const { PermissionsBitField } = require('discord.js'); + +module.exports = { + name: 'delrole', + description: 'Supprime un rôle d\'un utilisateur.', + usage: '+delrole <@user ou ID> <@role ou ID ou nom>', + category: 'moderation', + + async execute(message, args, client) { + const botMember = await message.guild.members.fetch(client.user.id); + const userMember = await message.guild.members.fetch(message.author.id); + if (!botMember.permissions.has(PermissionsBitField.Flags.ManageRoles)) { + return message.reply("Je n'ai pas la permission de pouvoir supprimer des rôles"); + } + const user = message.mentions.members.first() || message.guild.members.cache.get(args[0]); + if (!user) { + return message.reply('Utilisateur non trouvé.'); + } + + let role; + if (message.mentions.roles.first()) { + role = message.mentions.roles.first(); + } else if (args[1].match(/^<@&(\d+)>$/)) { + const roleId = args[1].match(/^<@&(\d+)>$/)[1]; + role = message.guild.roles.cache.get(roleId); + } else { + role = message.guild.roles.cache.find(r => r.name.toLowerCase() === args[1].toLowerCase()); + } + + if (!role) { + return message.reply('Rôle non trouvé.'); + } + + if (role.position >= (botMember.roles.highest ? botMember.roles.highest.position : 0)) { + return message.reply('Je ne peux pas gérer ce rôle car il est plus haut ou égal à mon rôle le plus élevé.'); + } + + const permlevel = await getPermissionLevel(user, client); + const roleposition = role.position; + const userroleposition = userMember.roles.highest.position; + if (roleposition >= userroleposition && permlevel < 10) return message.reply('Vous ne pouvez pas supprimer un rôle plus élevé ou égal au vôtre.'); + try { + await user.roles.remove(role, `delrole : ${message.author.username}`); + message.reply(`Le rôle ${role} a été supprimé de ${user.user.tag}.`); + } catch (error) { + return message.reply('Une erreur est survenue lors de la suppression du rôle.'); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/kick.js b/commands/moderation/kick.js index 49bc4a3..5bb69ec 100644 --- a/commands/moderation/kick.js +++ b/commands/moderation/kick.js @@ -1,42 +1,53 @@ -const { EmbedBuilder, User } = require("discord.js") -const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); +const { getPermissionLevel2 } = require('../../fonction/getPermissionLevel'); module.exports = { - name: 'kick', - aliases: ['expulse'], - description: 'Kick a member', - emote: '🚫', - utilisation: 'kick <@member> [reason]', - category: 'moderation', + name: 'kick', + description: 'Expluser un membre', + emote: '🚫', + utilisation: 'kick <@member> [reason]', + category: 'moderation', - async execute(message, args, client) { - const member = message.mentions.members.first(); - const reason = args.slice(1).join(' ') || 'Aucune raison spécifiée'; - if (!member) { - return message.reply('Veuillez mentionner un membre à kick'); - } - if (member.id === message.author.id) { - return message.reply('Vous ne pouvez pas vous kick vous même'); - } - if (member.id === client.user.id) { - return message.reply('Vous ne pouvez pas me kick'); - } - if (await getPermissionLevel(member, client) === 11) { - return message.reply('Vous ne pouvez pas kick un membre buyer'); - } - if (await getPermissionLevel(member, client) === 10) { - return message.reply('Vous ne pouvez pas kick un membre owner'); - } - if (await getPermissionLevel(message.member, client) !== 11 || await getPermissionLevel(message.member, client) !== 10) { - if (await getPermissionLevel(member, client) >= await getPermissionLevel(message.member, client)) { - return message.reply('Vous ne pouvez pas kick un membre avec une permission égale ou supérieure à la votre'); - } - } - - member.kick(`${reason} : ${message.author.tag}`).then(() => { - message.reply(`${member.user.tag} a bien été kick`); - }).catch((err) => { - message.reply(`Une erreur est survenue lors du kick de ${member.user.tag}`); - }); - }, + async execute(message, args, client) { + const userId = message.mentions.users.first()?.id || args[0]; + const guildId = message.guild.id; + const user = await message.guild.members.fetch(userId).catch(error => { + return null; + }); + const author = await message.guild.members.fetch(message.author.id).catch(error => { + return null; + }); + if (!user) { + return message.reply('Veuillez mentionner un utilisateur valide ou fournir un ID valide.'); + } + + if (user.id === message.author.id) { + return message.reply('Vous ne pouvez pas vous kick vous même'); + } + if (user.id === client.user.id) { + return message.reply('Vous ne pouvez pas me kick'); + } + const permissionMember = await getPermissionLevel2(user, client, guildId); + if (permissionMember === 11) { + return message.reply('Vous ne pouvez pas kick un membre buyer'); + } + if (permissionMember === 10) { + return message.reply('Vous ne pouvez pas kick un membre owner'); + } + const permissionAuthor = await getPermissionLevel2(message.author, client, guildId); + if (permissionAuthor !== 11 && permissionAuthor !== 10) { + if (permissionMember >= permissionAuthor) { + return message.reply('Vous ne pouvez pas kick un membre avec une permission égale ou supérieure à la votre'); + } + } + if(user.roles.highest.position >= author.roles.highest.position && permissionAuthor !== 11 && permissionAuthor !== 10) { + return message.reply('Vous ne pouvez pas kick un membre avec un role égale ou supérieure à la votre'); + } + try { + const reason = args.slice(1).join(' ') || `Aucune raison spécifiée : ${message.author.tag}`; + await user.kick(reason); + message.channel.send(`L'utilisateur ${user.user.username} a été kick.`); + } catch { + message.reply(`Une erreur s'est produite lors de la tentative de kick de ${user.user.username}.`); + } + }, }; \ No newline at end of file diff --git a/commands/moderation/nickelreset.js b/commands/moderation/nickelreset.js new file mode 100644 index 0000000..e01bebd --- /dev/null +++ b/commands/moderation/nickelreset.js @@ -0,0 +1,20 @@ +module.exports = { + name: 'nickreset', + description: 'Réinitialise le pseudo d\'un membre à son nom d\'utilisateur réel.', + utilisation: 'nickreset [@member/memberID]', + category: 'moderation', + emote:'🛠️ ', + async execute(message, args, client) { + const member = message.mentions.members.first() || message.guild.members.cache.get(args[0]); + + if (!member) { + return message.reply('Veuillez mentionner un membre ou fournir un ID de membre valide.'); + } + try { + await member.setNickname(member.user.username); + message.reply(`Le pseudo de ${member.user.tag} a été réinitialisé à son nom d'utilisateur réel.`); + } catch (error) { + message.reply('Une erreur s\'est produite lors de la tentative de réinitialisation du pseudo.'); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/prison.js b/commands/moderation/prison.js index 8aebc5a..3e8f9c6 100644 --- a/commands/moderation/prison.js +++ b/commands/moderation/prison.js @@ -72,6 +72,27 @@ module.exports = { } message.reply(reply); } else { + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [message.client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + data[message.guild.id] = data[message.guild.id] || {}; + data[message.guild.id].prisonlist = data[message.guild.id].prisonlist || []; + const userIndex = data[message.guild.id].prisonlist.indexOf(users.id); + if (userIndex !== -1) { + data[message.guild.id].prisonlist.splice(userIndex, 1); + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], function(err) { + if (err) { + console.error(err.message); + return message.reply('Une erreur est survenue lors de la mise à jour de la liste des utilisateurs en prison.'); + } + }); + } message.reply(`👮 <@${users.id}> est libéré de prison`); } } else if (args[0] === "list") { @@ -97,8 +118,6 @@ module.exports = { embed.addFields({ name: `${index + 1}`, value: `<@${userId}>`}); }); } - - // Envoyer l'embed message.channel.send({ embeds: [embed] }); }else { const users = message.mentions.users.first() || message.guild.members.cache.get(args[1]) diff --git a/commands/moderation/sanction.js b/commands/moderation/sanction.js index 3dda8eb..c5dc4cc 100644 --- a/commands/moderation/sanction.js +++ b/commands/moderation/sanction.js @@ -7,7 +7,7 @@ module.exports = { description: 'Afficher tous les avertissements d\'un utilisateur', aliases: ['sanction'], category: 'moderation', - utilisation: '+sanction @user/id', + utilisation: 'sanction @user/id', async execute(message, args, client) { const user = message.mentions.users.first() || client.users.cache.get(args[0]); diff --git a/commands/moderation/unbanall.js b/commands/moderation/unbanall.js new file mode 100644 index 0000000..9650b23 --- /dev/null +++ b/commands/moderation/unbanall.js @@ -0,0 +1,29 @@ +module.exports = { + name: 'unbanall', + aliases: ['debannir-tous'], + description: 'Débannit tous les membres bannis', + emote: '🚫', + utilisation: 'unbanall ', + category: 'moderation', + + async execute(message, args, client) { + try { + const sendmessage = await message.reply("Récupération de la liste des personnes bannies"); + const reason = args.slice(1).join(' ') || 'Aucune raison spécifiée'; + const bannedMembers = await message.guild.bans.fetch(); + if (bannedMembers.size === 0) { + return sendmessage.edit('Il n\'y a aucun membre banni sur ce serveur.'); + } + sendmessage.edit("Le unbanall est entrain d'etre effectué") + let counter = 0; + for (const user of bannedMembers.values()) { + await message.guild.members.unban(user.user, `unbanall par ${message.author.tag} : ${reason}`); + counter++; + } + + sendmessage.edit(`Tous les membres bannis ont été débannis. Nombre de membres débannis : \`${counter}\``); + } catch (err) { + message.reply(`Une erreur est survenue lors du débannissement des membres.`); + } + }, + }; \ No newline at end of file diff --git a/commands/moderation/unwarn.js b/commands/moderation/unwarn.js index 5c21915..081b108 100644 --- a/commands/moderation/unwarn.js +++ b/commands/moderation/unwarn.js @@ -5,7 +5,7 @@ module.exports = { name: 'unwarn', description: 'Supprimer un avertissement d\'un utilisateur', category: 'moderation', - utilisation: '+unwarn @user ', + utilisation: 'unwarn @user ', async execute(message, args, client) { const user = message.mentions.users.first() || client.users.cache.get(args[0]); @@ -23,7 +23,6 @@ module.exports = { const warningId = parseInt(args[1]); if (!warningId) return message.reply("Veuillez mettre l'id du warn."); - // Supprimer l'avertissement de la base de données db.run('DELETE FROM warnings WHERE guildId = ? AND userId = ? AND warningId = ?', [message.guild.id, user.id, warningId], (err) => { if (err) { console.error(err.message); diff --git a/commands/moderation/warn.js b/commands/moderation/warn.js index c96d92d..615690f 100644 --- a/commands/moderation/warn.js +++ b/commands/moderation/warn.js @@ -5,14 +5,13 @@ module.exports = { name: 'warn', description: 'Ajouter un avertissement à un utilisateur', category: 'moderation', - utilisation: '+warn @user ', + utilisation: 'warn @user ', async execute(message, args, client) { const user = message.mentions.users.first() || client.users.cache.get(args[0]); if (!user) return message.reply('Utilisateur non trouvé.'); const reason = args.slice(1).join(' ') || 'pas de raison fournie'; - // Récupérer le dernier warningId pour cette guilde et utilisateur let lastWarningId = await new Promise((resolve, reject) => { db.get('SELECT MAX(warningId) as lastWarningId FROM warnings WHERE guildId = ? AND userId = ?', [message.guild.id, user.id], (err, row) => { if (err) { @@ -23,10 +22,8 @@ module.exports = { }); }); - // Incrémenter le warningId pour le nouvel avertissement const newWarningId = lastWarningId + 1; - // Insérer l'avertissement dans la base de données db.run('INSERT INTO warnings (guildId, userId, warningId, reason, timestamp) VALUES (?, ?, ?, ?, ?)', [message.guild.id, user.id, newWarningId, reason, Date.now()], (err) => { if (err) { console.error(err.message); diff --git a/commands/owner/bl.js b/commands/owner/bl.js index e7a914a..884784e 100644 --- a/commands/owner/bl.js +++ b/commands/owner/bl.js @@ -1,20 +1,20 @@ const sqlite3 = require('sqlite3').verbose(); const { EmbedBuilder } = require('discord.js'); - +const db = new sqlite3.Database('myDatabase.db'); module.exports = { name: 'bl', aliases: ['blacklist', 'blacklistlist', 'bliste'], description: 'AJouter ou affiché la list des blacklist', emote: '🚫', - utilisation: 'bl [@user]', + utilisation: 'bl [@user] [raison]', category: 'gestion', async execute(message, args, client) { - const db = new sqlite3.Database('myDatabase.db'); const botId = message.client.user.id; - const user = message.mentions.users.first() || (args[0] && client.users.cache.get(args[0])); + const userToBlacklist = message.mentions.users.first() || (args[0] && client.users.cache.get(args[0])); + const reason = args.slice(1).join(' ') || 'Aucune raison spécifiée'; - if (user) { + if (userToBlacklist) { let data = await new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { if (err) { @@ -29,7 +29,11 @@ module.exports = { data.blacklist = {}; } - data.blacklist[user.id] = true; + data.blacklist[userToBlacklist.id] = { + reason: reason, + blacklistedBy: message.author.id, + timestamp: Math.floor(Date.now() / 1000) + }; db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], (err) => { if (err) { @@ -37,23 +41,22 @@ module.exports = { } }); - let successfulBans = 0; + let successfulBans = 0; try { if (client.guilds && client.guilds.cache) { for (const guild of client.guilds.cache.values()) { - const member = await guild.members.fetch(user.id).catch(() => null); + const member = await guild.members.fetch(userToBlacklist.id).catch(() => null); if (member && !member.banned) { - await guild.members.ban(user.id, { reason: 'Blacklisted by bot owner' }); + await guild.members.ban(userToBlacklist.id, { reason: `Blacklisted by ${message.author.tag} for: ${reason}` }); successfulBans++; } } } } catch (error) { - console.error(error); } // Informe l'utilisateur que l'opération a réussi - message.reply(`L'utilisateur <@${user.id}> a été ajouté à la blacklist et a été banni de ${successfulBans} serveurs.`); + message.reply(`L'utilisateur <@${userToBlacklist.id}> a été ajouté à la blacklist pour: ${reason} et a été banni de ${successfulBans} serveurs.`); } else { // Récupère les données existantes de la base de données let data = await new Promise((resolve, reject) => { @@ -65,14 +68,11 @@ module.exports = { resolve(row ? JSON.parse(row.value) : {}); }); }); - - // Récupère la liste noire spécifique à partir des données const blacklist = data.blacklist || {}; - // Crée un embed pour afficher la liste noire const embed = new EmbedBuilder() .setTitle('Liste des blacklist') - .setDescription(Object.keys(blacklist).map(bllist => `<@${bllist}>`).join('\n') || "Aucun personne n'est blacklist") + .setDescription(Object.keys(blacklist).map(userId => `<@${userId}>`).join('\n') || "Aucun personne n'est blacklist") .setColor('#0099ff'); // Envoie l'embed dans le canal diff --git a/commands/owner/blinfo.js b/commands/owner/blinfo.js new file mode 100644 index 0000000..ebca858 --- /dev/null +++ b/commands/owner/blinfo.js @@ -0,0 +1,47 @@ +const sqlite3 = require('sqlite3').verbose(); +const { EmbedBuilder } = require('discord.js'); +const db = new sqlite3.Database('myDatabase.db'); +module.exports = { + name: 'blinfo', + description: 'Affiche les informations d\'un utilisateur blacklisté', + emote: '🚫', + utilisation: 'blinfo [id]', + category: 'gestion', + + async execute(message, args, client) { + const botId = message.client.user.id; + const userIdToCheck = args[0]; + + if (!userIdToCheck) { + return message.reply('Veuillez fournir un identifiant d\'utilisateur.'); + } + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const blacklist = data.blacklist || {}; + const userInfo = blacklist[userIdToCheck]; + + if (!userInfo) { + return message.reply('Cet utilisateur n\'est pas dans la liste noire.'); + } + const user = await client.users.fetch(userIdToCheck).catch(() => null); + if (!user) { + return message.reply('Utilisateur introuvable.'); + } + + const embed = new EmbedBuilder() + .setTitle(`Informations sur l'utilisateur ${user.username}`) + .setDescription(`**Raison: **\`${userInfo.reason}\`\n**Blacklisté par: **<@${userInfo.blacklistedBy}>\n**Date: **`) + .setColor('#0099ff'); + + message.channel.send({ embeds: [embed] }); + }, +}; \ No newline at end of file diff --git a/commands/owner/version.js b/commands/owner/version.js new file mode 100644 index 0000000..e493325 --- /dev/null +++ b/commands/owner/version.js @@ -0,0 +1,119 @@ +const sqlite3 = require('sqlite3').verbose(); +const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); +const paginationEmbed = require('discordjs-button-pagination'); + +module.exports = { + name: 'version', + description: 'Affiche la version du bot', + emote: '📝', + utilisation: 'version', + category: 'gestion', + + async execute(message, args, client) { + const db = new sqlite3.Database('myDatabase.db'); + const botId = message.client.user.id; + + let versionData = await new Promise((resolve, reject) => { + db.get('SELECT value FROM master WHERE id = ?', ['botVersion'], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? row.value : 'Version non trouvée'); + }); + }); + + + const button = new ButtonBuilder() + .setCustomId('changelog') + .setLabel('Changelog') + .setStyle(ButtonStyle.Primary) + .setEmoji('📌'); + + + const row = new ActionRowBuilder() + .addComponents(button); + + const embed = new EmbedBuilder() + .setTitle('Version du bot') + .setDescription(`La version actuelle du bot est : ${versionData}`) + .setColor('#0099ff'); + message.channel.send({ embeds: [embed], components: [row] }); + const filter = i => i.customId === 'changelog' && i.user.id === message.author.id; + const collector = message.channel.createMessageComponentCollector({ filter, time: 15000 }); + + collector.on('collect', async i => { + if (i.customId === 'changelog') { + let changelogs = await new Promise((resolve, reject) => { + db.get('SELECT value FROM master WHERE id = ?', ["changelogGestion"], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : []); + }); + }); + + if (changelogs.length === 0) { + const noChangeLogEmbed = new EmbedBuilder() + .setTitle('Aucun changement récent') + .setDescription('Il n\'y a aucun changement récent à afficher.') + .setColor('#0099ff'); + return i.reply({ embeds: [noChangeLogEmbed], ephemeral: true }); + } else { + const embeds = changelogs.map((log, index) => { + const embed = new EmbedBuilder() + .setTitle(new Date(log.timestamp).toLocaleDateString()) + .setDescription(log.text) + .setColor('#0099ff'); + return embed; + }); + sendPaginatedEmbeds(i, embeds); + } + + } + }); + + + }, +}; +async function sendPaginatedEmbeds(interaction, embeds, timeout = 15000) { + let currentPage = 0; + + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId('previousbtn') + .setLabel('Précédent') + .setStyle(ButtonStyle.Danger) + .setDisabled(currentPage === 0), + new ButtonBuilder() + .setCustomId('nextbtn') + .setLabel('Suivant') + .setStyle(ButtonStyle.Success) + .setDisabled(currentPage === embeds.length - 1) + ); + + const embedMessage = await interaction.reply({ embeds: [embeds[currentPage]], components: [row], fetchReply: true }); + + const filter = i => i.customId === 'previousbtn' || i.customId === 'nextbtn' && i.user.id === interaction.user.id; + const collector = embedMessage.createMessageComponentCollector({ filter, time: timeout }); + + collector.on('collect', async i => { + if (i.customId === 'previousbtn') { + currentPage = Math.max(currentPage - 1, 0); + } else if (i.customId === 'nextbtn') { + currentPage = Math.min(currentPage + 1, embeds.length - 1); + } + + row.components[0].setDisabled(currentPage === 0); + row.components[1].setDisabled(currentPage === embeds.length - 1); + + await i.update({ embeds: [embeds[currentPage]], components: [row] }); + }); + + collector.on('end', collected => { + row.components.forEach(button => button.setDisabled(true)); + interaction.editReply({ components: [row] }); + }); +} \ No newline at end of file diff --git a/commands/owner/wl.js b/commands/owner/wl.js index 2f6ff3f..9fbb3c0 100644 --- a/commands/owner/wl.js +++ b/commands/owner/wl.js @@ -31,7 +31,7 @@ module.exports = { const embed = new EmbedBuilder() .setTitle('Liste blanche') .setDescription(Object.keys(whitelist).map(id => `<@${id}>`).join('\n') || 'Aucun utilisateur sur la liste blanche') - .setFooter({ text: 'design by valou336', iconURL: client.user.displayAvatarURL({dynamic: true})}); + .setFooter({ text: 'by valou336', iconURL: client.user.displayAvatarURL({dynamic: true})}); message.channel.send({ embeds: [embed] }); diff --git a/commands/utils/banner.js b/commands/utils/banner.js index 9eaa8d4..980cd23 100644 --- a/commands/utils/banner.js +++ b/commands/utils/banner.js @@ -1,6 +1,29 @@ -const fetch = require('node-fetch'); +const axios = require('axios'); const { EmbedBuilder } = require('discord.js'); +async function getUserBanner(user, message) { + try { + const response = await axios.get(`https://discord.com/api/users/${user.id}`, { + headers: { + Authorization: `Bot ${message.client.token}` + } + }); + const data = response.data; + + if (!data.banner) { + return null; + } + + const format = data.banner.startsWith('a_') ? 'gif' : 'png'; + const bannerURL = `https://cdn.discordapp.com/banners/${user.id}/${data.banner}.${format}?size=2048`; + + return bannerURL; + } catch (error) { + console.error(error); + message.reply('Une erreur s\'est produite lors de la récupération des données de l\'utilisateur.'); + return null; + } +} module.exports = { name: 'banner', aliases: ['bannière', 'banniere'], @@ -11,26 +34,15 @@ module.exports = { async execute(message, args, client) { const user = message.mentions.users.first() || message.author; + const bannerURL = await getUserBanner(user, message); - const response = await fetch(`https://discord.com/api/users/${user.id}`, { - method: 'GET', - headers: { - Authorization: `Bot ${message.client.token}` - } - }); - const data = await response.json(); - - if (!data.banner) { - return message.reply('Cet utilisateur n\'a pas de bannière.'); + if (!bannerURL) { + return message.reply('Cet utilisateur n\'a pas de bannière.'); } - const format = data.banner.startsWith('a_') ? 'gif' : 'png'; - - const bannerURL = `https://cdn.discordapp.com/banners/${user.id}/${data.banner}.${format}?size=2048`; - const embed = new EmbedBuilder() .setTitle(`Bannière de ${user.tag}`) - .setImage(bannerURL) + .setImage(bannerURL || '') .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) .setTimestamp(); diff --git a/commands/utils/blague.js b/commands/utils/blague.js new file mode 100644 index 0000000..4e8200c --- /dev/null +++ b/commands/utils/blague.js @@ -0,0 +1,25 @@ +const axios = require('axios'); +const BlaguesAPI = require('blagues-api'); +const { EmbedBuilder } = require('discord.js'); + +module.exports = { + name: 'blague', + description: 'Envoie une blague au hasard.', + emote: '😄', + utilisation: 'blague ', + category: 'utils', + + async execute(message, args, client) { + const blagues = new BlaguesAPI("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMjcyNzI0MTA4NjQ1NDk4ODgwIiwibGltaXQiOjEwMCwia2V5Ijoib3V6cDQ2cjhkT3NlV1I1ZmlmcDNCc1pZSDBGWHJsb0lBQmtSTXpmcnpJalp3NmVidEciLCJjcmVhdGVkX2F0IjoiMjAyNC0wMy0wNVQxODowMjozOCswMDowMCIsImlhdCI6MTcwOTY2MTc1OH0.i-hNHrRXSdceVa_4ozInjVAapkK6KNRPt1PjO5z6I7g"); + const blague = await blagues.random(); + const question = blague.joke; + const reponse = blague.answer; + const randomColor = Math.floor(Math.random() * 16777215).toString(16); + + const blagueEmbed = new EmbedBuilder() + .setDescription(`**${question}**\n➜ ||${reponse}||`) + .setColor(parseInt(randomColor, 16)) + + message.reply({ embeds: [blagueEmbed] }); + }, + }; \ No newline at end of file diff --git a/commands/utils/botconfig.js b/commands/utils/botconfig.js index d463375..6c7a63f 100644 --- a/commands/utils/botconfig.js +++ b/commands/utils/botconfig.js @@ -1,5 +1,5 @@ const { EmbedBuilder } = require('discord.js'); - +const fetch = require('node-fetch'); module.exports = { name: 'botconfig', description: 'Affiche la configuration du bot', @@ -11,8 +11,23 @@ module.exports = { async execute(message, args, client) { const bot = client.user; const presenceStatus = bot.presence.status; - let presenceEmoji = ''; - + const axios = require('axios'); + const response = await fetch(`https://discord.com/api/users/${bot.id}`, { + method: 'GET', + headers: { + Authorization: `Bot ${message.client.token}` + } + }); + const data = await response.json(); + + if (!data.banner) { + return message.reply('Cet utilisateur n\'a pas de bannière.'); + } + + const format = data.banner.startsWith('a_') ? 'gif' : 'png'; + + const bannerURL = `https://cdn.discordapp.com/banners/${bot.id}/${data.banner}.${format}?size=2048`; + let presenceEmoji = ''; switch (presenceStatus) { case 'online': presenceEmoji = '🟢'; @@ -36,6 +51,7 @@ module.exports = { { name: 'Nom du bot', value: bot.username || 'Inconnu' }, { name: 'ID du bot', value: bot.id || 'Inconnu'}, { name: ' ', value: `[URL du profil](${bot.displayAvatarURL({ dynamic: true })})`}, + { name: ' ', value: `[URL de la banniere](${bannerURL})`}, { name: 'Présence', value: `${presenceEmoji}`}, { name: 'Statut', value: bot.presence.activities[0] && bot.presence.activities[0].state ? bot.presence.activities[0].state : 'Aucun statut'} ) diff --git a/commands/utils/christmas.js b/commands/utils/christmas.js new file mode 100644 index 0000000..e879626 --- /dev/null +++ b/commands/utils/christmas.js @@ -0,0 +1,20 @@ +module.exports = { + name: 'christmas', + description: 'Calcule le nombre de jours jusqu\'à Noël.', + emote: '🎄', + utilisation: 'christmas ', + category: 'game', + + async execute(message, args, client) { + let today = new Date(); + let xmas = new Date(today.getFullYear(), 11, 24); + if (today.getMonth() == 11 && today.getDate() > 24) { + xmas.setFullYear(xmas.getFullYear() + 1); + } + let one_day = 1000 * 60 * 60 * 24; + let daysleft = Math.ceil((xmas.getTime() - today.getTime()) / (one_day)); + let days = daysleft + 1; + + message.reply(`🎄・Noël\n${days} jours jusqu'à Noël`); + }, +}; \ No newline at end of file diff --git a/commands/utils/films.js b/commands/utils/films.js index 19d9554..1caa51f 100644 --- a/commands/utils/films.js +++ b/commands/utils/films.js @@ -28,7 +28,7 @@ module.exports = { .setTitle('🎬 Films Populaires & Récents 🎥') .setDescription('Voici les films populaires et les plus récents en ce moment :') .setThumbnail(botUser.displayAvatarURL()) - .setTimestamp() // Ajoute l'heure actuelle + .setTimestamp() .setFooter({ text: 'Commande Films', iconURL:botUser.displayAvatarURL() }); filmsEmbed.addFields({ name: 'Films Populaires', value: popularFilms.map(film => film.title).join(',') || 'Non disponible' }); filmsEmbed.addFields({ name: 'Nouveautés au Cinéma', value: recentFilms.map(film => film.title).join(',') || 'Non disponible' }); diff --git a/commands/utils/halloween.js b/commands/utils/halloween.js new file mode 100644 index 0000000..0df91bb --- /dev/null +++ b/commands/utils/halloween.js @@ -0,0 +1,20 @@ +module.exports = { + name: 'halloween', + description: 'Calcule le nombre de jours jusqu\'à Halloween.', + emote: '🎃', + utilisation: 'halloween ', + category: 'game', + + async execute(message, args, client) { + let today = new Date(); + let halloween = new Date(today.getFullYear(), 9, 31); + if (today.getMonth() > 9) { + halloween.setFullYear(halloween.getFullYear() + 1); + } + let one_day = 1000 * 60 * 60 * 24; + let daysleft = Math.ceil((halloween.getTime() - today.getTime()) / (one_day)); + let days = daysleft + 1; + + message.reply(`🎃・Halloween\n${days} jours jusqu'à Halloween`); + }, +}; \ No newline at end of file diff --git a/commands/utils/help.js b/commands/utils/help.js index 6e1ccae..36d7bfd 100644 --- a/commands/utils/help.js +++ b/commands/utils/help.js @@ -17,18 +17,126 @@ module.exports = { const embed = new EmbedBuilder() .setTitle("Arguments de messages") .addFields( - { name: '{MemberMention}', value: `Mentionne le membre concerné` , inline: true }, - { name: '{MemberName}', value: `Le nom du membre concerné` , inline: true }, - { name: '{MemberDisplayName}', value:'Le pseudo de serveur du membre concerné', inline: true }, - { name: '{MemberJoinedAt}',value: `La date à la quelle le membre concerné a rejoint le serveur`, inline: true }, - { name: '{MemberID}', value: `L'ID du membre concerné` , inline: true }, - { name: '{MemberPic}', value:'La photo de profil du membre concerné' , inline: true }, - { name: '{MemberCreatedAt}', value: 'La date de création du compte du membre concerné ', inline: true }, - { name: '{ServerName}', value: 'Le nom du serveur concerné', inline: true }, - { name: '{ServerMembersCount}', value: 'Le nombre total de membres sur le serveur', inline: true } - ) + { name: '{MemberMention}', value: `Mentionne le membre concerné (\`exemple\`: **<@${message.author.id}>**)`, inline: true }, + { name: '{MemberName}', value: `Le nom du membre concerné (\`exemple\`: **${message.author.username}**)`, inline: true }, + { name: '{MemberDisplayName}', value: `Le pseudo de serveur du membre concerné (\`exemple\`: **${message.member.displayName}**)`, inline: true }, + { name: '{MemberJoinedAt}', value: `La date à laquelle le membre concerné a rejoint le serveur (\`exemple\`: **${new Date(message.member.joinedAt).toLocaleDateString('fr-FR')}**)`, inline: true }, + { name: '{MemberID}', value: `L\'ID du membre concerné (\`exemple\`: **${message.author.id}**)`, inline: true }, + { name: '{MemberPic}', value: `La photo de profil du membre concerné (\`exemple\`: **${message.author.displayAvatarURL({dynamic: true})}**)`, inline: true }, + { name: '{MemberCreatedAt}', value: `La date de création du compte du membre concerné (\`exemple\`: **${new Date(message.author.createdAt).toLocaleDateString('fr-FR')}**)`, inline: true }, + { name: '{ServerName}', value: `Le nom du serveur concerné (\`exemple\`: **${message.guild.name}**)`, inline: true }, + { name: '{ServerMembersCount}', value: `Le nombre total de membres sur le serveur (\`exemple\`: **${message.guild.memberCount}**)`, inline: true } + ) return message.reply({ embeds: [embed] }); - } + } else if (args[0] === 'antiraid' ) { + const embed = new EmbedBuilder() + .setTitle("Help AntiRaid") + .setDescription(` + **AntiRaid Configuration** + + La commande \`antiraid\` permet de configurer la protection anti-raid pour votre serveur. Voici comment vous pouvez la configurer : + + **Syntaxe :** + \`\`\` + +antiraid [type] [action] + \`\`\` + + **Types disponibles :** + - \`whitelist\` : Permet de limiter l'accès aux actions anti-raid uniquement au whitelist du serveur et aux owners et buyer du bot. + - \`owner\` : Permet de limiter l'accès aux actions anti-raid uniquement au owners et buyer du bot. + - \`buyer\` : Permet de limiter l'accès aux actions anti-raid uniquement aux buyer du bot. + - \`off\` : Désactive la protection anti-raid. + + **Actions disponibles :** + - \`derank\` : Retire les rôles dangereux des utilisateurs qui tentent de déclencher un raid. + - \`kick\` : Expulse les utilisateurs qui tentent de déclencher un raid. + - \`ban\` : Bannit les utilisateurs qui tentent de déclencher un raid. + - \`nothing\` : Ne fait rien en réponse à un raid. + + **Exemples d'utilisation :** + - Pour activer la protection anti-raid avec une liste blanche : \`+antiraid whitelist derank\` + - Pour désactiver la protection anti-raid : \`+antiraid off\` + + Note : Assurez-vous d'avoir les permissions nécessaires pour exécuter cette commande. + `) + return message.reply({ embeds: [embed] }); + } else if (args[0] === 'backup') { + const embed = new EmbedBuilder() + .setTitle("Aide pour la commande Backup") + .setDescription(` + **Gestion des sauvegardes** + + La commande \`backup\` permet de créer, lister, charger ou supprimer des sauvegardes du serveur. Voici comment vous pouvez l'utiliser : + + **Syntaxe :** + \`\`\` + +backup + \`\`\` + + **Paramètres disponibles :** + - \`create\` : Crée une sauvegarde du serveur actuel. + - \`list\` : Affiche la liste de toutes les sauvegardes disponibles. + - \`load\` : Charge une sauvegarde sur le serveur. Vous devez spécifier l'ID de la sauvegarde à charger. + - \`delete\` : Supprime une sauvegarde. Vous devez spécifier l'ID de la sauvegarde à supprimer. + + **Exemples d'utilisation :** + * Pour créer une sauvegarde : \`+backup create\` + * Pour afficher la liste des sauvegardes : \`+backup list\` + * Pour charger une sauvegarde (remplacez \`\` par l'ID de la sauvegarde) : \`+backup load \` + * Pour supprimer une sauvegarde (remplacez \`\` par l'ID de la sauvegarde) : \`+backup delete \` + + Note : Assurez-vous d'avoir les permissions nécessaires pour exécuter cette commande. + `) + return message.reply({ embeds: [embed] }); +} else if (args[0] === 'rolelimit') { + const embed = new EmbedBuilder() + .setTitle("Aide pour la commande RoleLimit") + .setDescription(` + **Gestion des limites de rôles** + + La commande \`rolelimit\` permet de gérer les limites de rôles pour les utilisateurs. Voici comment vous pouvez l'utiliser : + + **Syntaxe :** + \`\`\` + +rolelimit + \`\`\` + + **Fonctionnalités :** + - **Ajouter une limite de rôle :** Utilisez le bouton "Add" pour ajouter une limite à un rôle spécifique. Vous devrez mentionner le rôle ou fournir son ID et spécifier la limite. + - **Supprimer une limite de rôle :** Utilisez le bouton "Remove" pour supprimer une limite de rôle. Vous devrez mentionner le rôle ou fournir son ID. + + **Exemples d'utilisation :** + - Pour ajouter une limite de rôle : Sélectionnez le bouton "Add", mentionnez le rôle et spécifiez la limite. + - Pour supprimer une limite de rôle : Sélectionnez le bouton "Remove", mentionnez le rôle. + + Note : Assurez-vous d'avoir les permissions nécessaires pour exécuter cette commande. + `) + return message.reply({ embeds: [embed] }); +} else if (args[0] === 'confession') { + const embed = new EmbedBuilder() + .setTitle("Aide pour le système de confession") + .setDescription(` + **Configuration du système de confession** + + Le système de confession permet aux utilisateurs de partager leurs confessions de manière anonyme. Voici comment vous pouvez le configurer : + + **Syntaxe :** + \`\`\` + +setconfession [channel|send] [channelID|#channel] + \`\`\` + + **Paramètres disponibles :** + - \`channel\` : Définit le salon de confession pour le serveur. Vous devez spécifier l'ID du salon ou mentionner le salon. + - \`send\` : Envoie un embed avec un bouton pour ajouter une confession dans le salon spécifié. Vous devez spécifier l'ID du salon ou mentionner le salon. + + **Exemples d'utilisation :** + - Pour définir le salon de confession : \`+setconfession channel \` + - Pour envoyer un embed de confession : \`+setconfession send \` + + **Note : **Assurez-vous d'avoir les permissions nécessaires pour exécuter cette commande. + `) + return message.reply({ embeds: [embed] }); +} else { let data = await new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { if (err) { @@ -43,7 +151,7 @@ module.exports = { let mainPrefix = data.prefixes && data.prefixes.main ? data.prefixes.main : defaultPrefix; let serverPrefix = data.prefixes && data.prefixes[guildId]; const prefix = serverPrefix !== undefined ? serverPrefix : mainPrefix; - if (args[0]) { + if (args[0] && client.commands.has(args[0])) { const command = client.commands.get(args[0]); if (!command) { return message.reply(`Je n'ai pas trouvé de commande nommée "${args[0]}".`); @@ -74,7 +182,7 @@ module.exports = { { name: 'Permissions', value: commandPerm === 11 ? 'buyer' : commandPerm === 10 ? 'owner' : `Perm level: ${commandPerm}`, inline: true }, ) .setTimestamp() - .setFooter({text: `${client.user.tag} © 2024`, iconURL: client.user.displayAvatarURL({dynamic: true})}) + .setFooter({text: `By Valou336 and tuturp33`, iconURL: client.user.displayAvatarURL({dynamic: true})}) return message.reply({ embeds: [embed_command] }); } @@ -87,9 +195,21 @@ module.exports = { game: [], gestion: [], utils: [], + invitation: [], other: [], }; - + const categoryEmojis = { + antiraid: '🛡️', + botcontrol: '🛠️', + moderation: '⚖️', + buyer: '💰', + game: '🎮', + gestion: '📝', + utils: '⚙️', + invitation: '📩', + other: '❓', + }; + let liste = []; for (const command of client.commands.values()) { const existingCommand = liste.find(cmd => cmd.name === command.name); @@ -144,13 +264,13 @@ module.exports = { .setPlaceholder('Sélectionnez une catégorie') .addOptions([ { label: 'Accueil', value: 'home' }, - ...Object.keys(categories).map(category => ({ label: `Catégorie ${category}`, value: category })), + ...Object.keys(categories).map(category => ({ label: `${categoryEmojis[category]} ${category}`, value: category })), ]); const row = new ActionRowBuilder() .addComponents(menu); + const sentMessage = await message.reply({ embeds: [embeds[args[0]] || embeds.home], components: [row] }); - const sentMessage = await message.reply({ embeds: [embeds.home], components: [row] }); const filter = i => i.customId === 'help_menu' && i.user.id === message.author.id; const collector = sentMessage.createMessageComponentCollector({ filter, time: 60000 }); @@ -161,5 +281,6 @@ module.exports = { collector.on('end', () => { sentMessage.edit({ components: [] }); }); + } }, }; \ No newline at end of file diff --git a/commands/utils/helpall.js b/commands/utils/helpall.js index 12f8e30..4c41cdf 100644 --- a/commands/utils/helpall.js +++ b/commands/utils/helpall.js @@ -1,6 +1,7 @@ const { EmbedBuilder , ButtonBuilder, ButtonStyle, ActionRowBuilder } = require('discord.js'); const sqlite3 = require('sqlite3').verbose(); const db = new sqlite3.Database('myDatabase.db'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); module.exports = { name: 'helpall', description: 'Liste toutes les commandes disponibles par niveau de permission', @@ -35,27 +36,43 @@ try { commandsByPermission[permissionLevel].push(commandName); } - + const embeds = Object.entries(commandsByPermission).map(([permissionLevel, commands]) => { const commandDescriptions = commands.map(commandName => { const command = client.commands.get(commandName); - if (!command) { + if (!command || permissions[command.name] === "off") { return null; } - return `**${prefix}${commandName}**\n\`${command.description}\``; + return `* \`${prefix}${command.utilisation}\``; }).filter(Boolean); - if (commandDescriptions.length === 0) { - return null; + if (commandDescriptions.length === 0) { + return null; } - const embed = new EmbedBuilder() - .setTitle(`Commandes de niveau de permission ${permissionLevel}`) - .setColor('#0099ff'); + const embedsForPermissionLevel = []; + let currentEmbedDescription = ''; + commandDescriptions.forEach(description => { + if ((currentEmbedDescription + description).length <= 4096) { + currentEmbedDescription += description + '\n'; + } else { + embedsForPermissionLevel.push(currentEmbedDescription); + currentEmbedDescription = description + '\n'; + } + }); + if (currentEmbedDescription) { + embedsForPermissionLevel.push(currentEmbedDescription); + } - embed.setDescription(commandDescriptions.join('\n')); - return embed; - }).filter(Boolean) + return embedsForPermissionLevel.map(description => { + const embed = new EmbedBuilder() + .setTitle(`Commandes de niveau de permission ${permissionLevel === '0' ? "public" : permissionLevel === '10' ? "owner" : permissionLevel === '11' ? "buyer" : permissionLevel}`) + .setColor('#0099ff'); + embed.setDescription(description); + embed.permissionLevel = permissionLevel + return embed; + }); + }).flat().filter(Boolean); if (embeds.length === 0) { return message.reply("Aucune commande disponible pour ce serveur."); @@ -81,22 +98,21 @@ try { filter: (interaction) => interaction.isButton() && interaction.user.id === message.author.id, time: 60000 }); - + const userPermissionLevel = await getPermissionLevel(message.member, client); let currentPage = 0; collector.on('collect', async (interaction) => { await interaction.deferUpdate(); - if (interaction.customId === 'back') { - currentPage = currentPage > 0 ? --currentPage : embeds.length - 1; + currentPage = currentPage > 0 ? --currentPage : 0; } else if (interaction.customId === 'next') { - currentPage = currentPage + 1 < embeds.length ? ++currentPage : 0; + currentPage = currentPage + 1 < embeds.length && embeds[currentPage + 1].permissionLevel <= userPermissionLevel ? ++currentPage : 0; } - await msg.edit({ embeds: [embeds[currentPage]], components: [row] }); }); collector.on('end', () => msg.edit({ embeds: [embeds[currentPage]], components: [] })); }catch (error) { + console.log(error); return message.reply("Veuillez changer des commandes de permission pour avoir accès au helpall."); } }, diff --git a/commands/utils/image.js b/commands/utils/image.js index 95a92a8..9b3451d 100644 --- a/commands/utils/image.js +++ b/commands/utils/image.js @@ -7,7 +7,7 @@ module.exports = { description: "Recherche et envoie des images basées sur une requête.", category: 'utils', emote: '🔍', - utilisation: '+image [requête]', + utilisation: 'image [requête]', async execute(message, args, client) { const query = args.join(" "); if (!query) return message.react("❌"); @@ -25,7 +25,6 @@ module.exports = { message.channel.send({ embeds: [embed] }); }).catch(error => { - console.error(error); message.reply('Une erreur est survenue lors de la recherche de l\'image.'); }); diff --git a/commands/utils/memberstat.js b/commands/utils/memberstat.js index 6ea3cd4..b39c6d2 100644 --- a/commands/utils/memberstat.js +++ b/commands/utils/memberstat.js @@ -5,7 +5,7 @@ module.exports = { description: "Permet d'afficher les informations des utilisateurs du serveur.", category: 'utils', emote: '🌐', - utilisation: '+statserveur', + utilisation: 'statserveur', async execute(message, args, client) { const members = await message.guild.members.fetch(); const totalMembers = members.size; diff --git a/commands/utils/news.js b/commands/utils/news.js new file mode 100644 index 0000000..12cc012 --- /dev/null +++ b/commands/utils/news.js @@ -0,0 +1,56 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); +const paginationEmbed = require('discordjs-button-pagination'); + +module.exports = { + name: 'news', + aliases: ['changelog'], + description: 'Affiche tous les changements récents sur le bot', + category: "utils" , + emote:"📌", + utilisation: "changelog", + async execute(message, args, client) { + let changelogs = await new Promise((resolve, reject) => { + db.get('SELECT value FROM master WHERE id = ?', ["changelogGestion"], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : []); + }); + }); + + if (changelogs.length === 0) { + const noChangeLogEmbed = new EmbedBuilder() + .setTitle('Aucun changement récent') + .setDescription('Il n\'y a aucun changement récent à afficher.') + .setColor('#0099ff'); + return message.channel.send({ embeds: [noChangeLogEmbed] }); + } + + const embeds = changelogs.map((log, index) => { + const embed = new EmbedBuilder() + .setTitle(new Date(log.timestamp).toLocaleDateString()) + .setDescription(log.text) + .setColor('#0099ff'); + return embed; + }); + + const backButton = new ButtonBuilder() + .setCustomId('previousbtn') + .setLabel('Précédent') + .setStyle(ButtonStyle.Danger); + + const nextButton = new ButtonBuilder() + .setCustomId('nextbtn') + .setLabel('Suivant') + .setStyle(ButtonStyle.Success); + + const buttonList = [backButton, nextButton]; + + const timeout = 15000; + + paginationEmbed(message, embeds, buttonList, timeout); + }, +}; \ No newline at end of file diff --git a/commands/utils/prevname.js b/commands/utils/prevname.js index 9a9ac63..a786a1f 100644 --- a/commands/utils/prevname.js +++ b/commands/utils/prevname.js @@ -1,43 +1,132 @@ const { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } = require('discord.js'); const sqlite3 = require('sqlite3').verbose(); const db = new sqlite3.Database('myDatabase.db'); - +const paginationEmbed = require('discordjs-button-pagination'); module.exports = { name: 'prevname', description: 'Affiche tous les pseudos précédents et permet de les supprimer', category: 'utils', emote: '🔍', utilisation: 'prevname', - async execute(message, args) { + async execute(message, args, client) { const userId = message.author.id; - - let nameChanges = await new Promise((resolve, reject) => { - db.get('SELECT value FROM prevname WHERE id = ?', [userId], (err, row) => { + if (args[0] === "clear") { + let hasPrevname = await new Promise((resolve, reject) => { + db.get('SELECT value FROM prevname WHERE id = ?', [userId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row !== undefined); + }); + }); + + if (!hasPrevname) { + await message.reply({ content: "Vous n'avez aucun prevname à supprimer."}); + return; + } + + db.run('DELETE FROM prevname WHERE id = ?', [userId], (err) => { if (err) { console.error(err.message); - reject(err); + } else { + message.reply({ content: "Vos prevname ont été correctement supprimés." }); } - resolve(row ? JSON.parse(row.value) : []); }); - }); + }else { + let nameChanges = await new Promise((resolve, reject) => { + db.get('SELECT value FROM prevname WHERE id = ?', [userId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : []); + }); + }); - let description = 'Vous n\'avez pas de pseudos précédents enregistrés.'; - if (nameChanges.length > 0) { - description = nameChanges.map((change, index) => `${index + 1}. ${change.newName} - `).join('\n'); + if (nameChanges.length === 0) { + const embed = new EmbedBuilder() + .setTitle('Pseudos précédents') + .setDescription('Vous n\'avez pas de pseudos précédents enregistrés.') + .setColor('#0099ff'); + await message.reply({ embeds: [embed] }); + return; + } + + const embeds = []; + for (let i = 0; i < nameChanges.length; i += 10) { + const page = nameChanges.slice(i, i + 10).map((change, index) => `${index + 1}. ${change.newName} - `).join('\n'); + const embed = new EmbedBuilder() + .setTitle('Pseudos précédents') + .setDescription(page) + .setColor('#0099ff'); + embeds.push(embed); + } + + + const backButton = new ButtonBuilder() + .setCustomId('previousbtn') + .setEmoji('⬅️') + .setStyle(ButtonStyle.Primary); + + const nextButton = new ButtonBuilder() + .setCustomId('nextbtn') + .setEmoji('➡️') + .setStyle(ButtonStyle.Primary); + + const deleteButton = new ButtonBuilder() + .setCustomId(`deleteprevnames_${message.author.id}`) + .setEmoji('🗑️') + .setStyle(ButtonStyle.Secondary); + const row = new ActionRowBuilder() + .addComponents(backButton, nextButton, deleteButton); + const sentMessage = await message.reply({ embeds: [embeds[0]], components: [row] }); + + + const filter = i => i.user.id === message.author.id; + const collector = sentMessage.createMessageComponentCollector({ filter, time: 30000 }); + collector.on('collect', async i => { + if (!i.message.paginationState) { + i.message.paginationState = { currentPage: 0 }; + } + + if (i.customId === 'previousbtn') { + i.message.paginationState.currentPage--; + } else if (i.customId === 'nextbtn') { + i.message.paginationState.currentPage++; + } + + if (i.message.paginationState.currentPage < 0) { + i.message.paginationState.currentPage = 0; + } else if (i.message.paginationState.currentPage >= embeds.length) { + i.message.paginationState.currentPage = embeds.length - 1; + } + + + const newEmbed = embeds[i.message.paginationState.currentPage]; + const backButton = new ButtonBuilder() + .setCustomId('previousbtn') + .setEmoji('⬅️') + .setStyle(ButtonStyle.Primary); + + const nextButton = new ButtonBuilder() + .setCustomId('nextbtn') + .setEmoji('➡️') + .setStyle(ButtonStyle.Primary); + const deleteButton = new ButtonBuilder() + .setCustomId(`deleteprevnames_${message.author.id}`) + .setEmoji('🗑️') + .setStyle(ButtonStyle.Primary); + const row = new ActionRowBuilder() + .addComponents(backButton, nextButton, deleteButton); + + await i.update({ embeds: [newEmbed], components: [row] }); + }); + collector.on('end', collected => { + const disabledRow = new ActionRowBuilder() + .addComponents(backButton.setDisabled(true), nextButton.setDisabled(true), deleteButton); + sentMessage.edit({ components: [disabledRow] }); + }); } - const embed = new EmbedBuilder() - .setTitle('Pseudos précédents') - .setDescription(description) - .setColor('#0099ff'); - - const deleteButton = new ButtonBuilder() - .setCustomId(`deleteprevnames_${message.author.id}`) - .setEmoji('🗑️') - .setStyle(ButtonStyle.Secondary); - - const row = new ActionRowBuilder() - .addComponents(deleteButton); - - await message.reply({ embeds: [embed], components: [row] }); }, }; \ No newline at end of file diff --git a/commands/utils/wiki.js b/commands/utils/wiki.js index 9564bb5..5a059cd 100644 --- a/commands/utils/wiki.js +++ b/commands/utils/wiki.js @@ -3,7 +3,7 @@ const Discord = require('discord.js'); module.exports = { name: 'wiki', description: 'Recherche un mot clé sur Wikipedia et affiche le résumé dans un embed.', - utilisation: '+wiki ', + utilisation: 'wiki ', category: 'info', async execute(message, args, client) { diff --git a/events/antiraid.js/ChannelCreate.js b/events/antiraid.js/ChannelCreate.js new file mode 100644 index 0000000..1b76ea8 --- /dev/null +++ b/events/antiraid.js/ChannelCreate.js @@ -0,0 +1,110 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder} = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); +module.exports = { + name: Events.ChannelCreate, + async execute(channel, client) { + const botId = client.user.id; + const guildId = channel.guild.id; + const guild = channel.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.ChannelCreate, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antichannelConfig = data[guildId]?.antichannel; + if (!antichannelConfig || antichannelConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antichannelConfig.type; + const permlevel = await getPermissionLevel(user, client) + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + await channel.delete('Anti-channel protection'); + punish(user, antichannelConfig.action, channel.guild); + sendlog(user, antichannelConfig.action, channel.guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + await channel.delete('Anti-channel protection'); + punish(user, antichannelConfig.action, channel.guild); + sendlog(user, antichannelConfig.action, channel.guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + await channel.delete('Anti-channel protection'); + punish(user, antichannelConfig.action, channel.guild); + sendlog(user, antichannelConfig.action, channel.guild, data); + } + }catch(err) { + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-channel protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-channel protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-channel protection'); + } + break; + case 'nothing': + break; + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a créé un salon et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/events/antiraid.js/ChannelDelete.js b/events/antiraid.js/ChannelDelete.js new file mode 100644 index 0000000..fdffd7d --- /dev/null +++ b/events/antiraid.js/ChannelDelete.js @@ -0,0 +1,124 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder} = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); +module.exports = { + name: Events.ChannelDelete, + async execute(channel, client) { + const botId = client.user.id; + const guildId = channel.guild.id; + const guild = channel.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.ChannelDelete, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antichannelConfig = data[guildId]?.antichannel; + if (!antichannelConfig || antichannelConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antichannelConfig.type; + const permlevel = await getPermissionLevel(user, client) + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antichannelConfig.action, channel.guild, channel); + sendlog(user, antichannelConfig.action, channel.guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antichannelConfig.action, channel.guild, channel); + sendlog(user, antichannelConfig.action, channel.guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antichannelConfig.action, channel.guild, channel); + sendlog(user, antichannelConfig.action, channel.guild, data); + } + }catch(err) { + } + }, +}; + +async function punish(user, action, guild, channel) { + + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-channel protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-channel protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-channel protection'); + } + break; + case 'nothing': + break; + } +try { + channel.clone({ + name: channel.name, + permissions: channel.permissionsOverwrites, + type: channel.type, + parent: channel.parent, + topic: channel.withTopic, + nsfw: channel.nsfw, + birate: channel.bitrate, + userLimit: channel.userLimit, + rateLimitPerUser: channel.rateLimitPerUser, + permissions: channel.withPermissions, + position: channel.rawPosition, + reason: 'Anti-channel protection', +}) +} catch (error) { +} +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a supprimée un salon et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/events/antiraid.js/ChannelUpdate.js b/events/antiraid.js/ChannelUpdate.js new file mode 100644 index 0000000..ef87ea9 --- /dev/null +++ b/events/antiraid.js/ChannelUpdate.js @@ -0,0 +1,127 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.ChannelUpdate, + async execute(oldChannel, newChannel, client) { + const botId = client.user.id; + const guildId = newChannel.guild.id; + const guild = newChannel.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.ChannelUpdate, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antichannelConfig = data[guildId]?.antichannel; + if (!antichannelConfig || antichannelConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antichannelConfig.type; + const permlevel = await getPermissionLevel(user, client); + + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antichannelConfig.action, guild, newChannel, oldChannel); + sendlog(user, antichannelConfig.action, newChannel.guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antichannelConfig.action, guild, newChannel, oldChannel); + sendlog(user, antichannelConfig.action, newChannel.guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antichannelConfig.action, guild, newChannel, oldChannel); + sendlog(user, antichannelConfig.action, newChannel.guild, data); + } + } catch (err) { + } + }, +}; + +async function punish(user, action, guild, newChannel, oldChannel) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-channel protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-channel protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-channel protection'); + } + break; + case 'nothing': + break; + } + try { + await newChannel.edit({ + name: oldChannel.name, + permissions: oldChannel.permissionOverwrites, + type: oldChannel.type, + parent: oldChannel.parent, + topic: oldChannel.topic, + nsfw: oldChannel.nsfw, + bitrate: oldChannel.bitrate, + userLimit: oldChannel.userLimit, + rateLimitPerUser: oldChannel.rateLimitPerUser, + position: oldChannel.rawPosition, + reason: 'Anti-channel protection', + }); + newChannel.overwritePermissions(oldChannel.permissionOverwrites) + } catch (error) { + console.error(error); + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a modifié un salon et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/events/antiraid.js/GuildBanAdd.js b/events/antiraid.js/GuildBanAdd.js new file mode 100644 index 0000000..424f2cf --- /dev/null +++ b/events/antiraid.js/GuildBanAdd.js @@ -0,0 +1,113 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +const banMap = new Map(); +setInterval(() => { + banMap.clear(); +}, 10 * 60 * 1000); + +module.exports = { + name: Events.GuildBanAdd, + async execute(ban, client) { + const botId = client.user.id; + const guildId = ban.guild.id; + const guild = ban.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.MemberBanAdd, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + const antibanConfig = data[guildId]?.antiban; + if (!antibanConfig || antibanConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antibanConfig.type; + const banLimit = antibanConfig.number; + const permlevel = await getPermissionLevel(user, client); + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + if (!banMap.has(guildId)) { + banMap.set(guildId, new Map()); + } + const guildBanMap = banMap.get(guildId); + guildBanMap.set(user.id, (guildBanMap.get(user.id) || 0) + 1); + if (guildBanMap.get(user.id) >= banLimit) { + punish(user, antibanConfig.action, guild); + } + } else if (type === "owner") { + if (permlevel >= 10) return; + if (!banMap.has(guildId)) { + banMap.set(guildId, new Map()); + } + const guildBanMap = banMap.get(guildId); + guildBanMap.set(user.id, (guildBanMap.get(user.id) || 0) + 1); + if (guildBanMap.get(user.id) >= banLimit) { + punish(user, antibanConfig.action, guild); + } + } else if (type === "buyer") { + if (permlevel === 11) return; + if (!banMap.has(guildId)) { + banMap.set(guildId, new Map()); + } + const guildBanMap = banMap.get(guildId); + guildBanMap.set(user.id, (guildBanMap.get(user.id) || 0) + 1); + if (guildBanMap.get(user.id) >= banLimit) { + punish(user, antibanConfig.action, guild); + } + + } + } catch (err) { + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-role protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-role protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-role protection'); + } + break; + case 'nothing': + break; + } +} \ No newline at end of file diff --git a/events/antiraid.js/GuildMemberAdd.js b/events/antiraid.js/GuildMemberAdd.js new file mode 100644 index 0000000..fe7ef2e --- /dev/null +++ b/events/antiraid.js/GuildMemberAdd.js @@ -0,0 +1,186 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.GuildMemberAdd, + async execute(member, client) { + if (member.user.bot) { + const botId = client.user.id; + const guildId = member.guild.id; + const guild = member.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.BotAdd, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antibotConfig = data[guildId]?.antibot; + if (!antibotConfig || antibotConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antibotConfig.type; + const permlevel = await getPermissionLevel(user, client); + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antibotConfig.action, guild); + await member.kick('Anti-bot protection'); + sendlog(user, antibotConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antibotConfig.action, guild); + await member.kick('Anti-bot protection'); + sendlog(user, antibotConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antibotConfig.action, guild); + await member.kick('Anti-bot protection'); + sendlog(user, antibotConfig.action, guild, data); + } + } catch (err) { + } + }else { + const botId = client.user.id; + const guildId = member.guild.id; + const guild = member.guild; + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + const antijoinConfig = data[guildId]?.antijoin + if(antijoinConfig && antijoinConfig?.type === 'on') { + try{ + member.kick({ reason: 'Anti-join protection' }); + }catch(err) { + } + } else { + const creationlimitConfig = data[guildId]?.creationLimit + if (creationlimitConfig) { + let limitInMilliseconds; + const lastChar = creationlimitConfig.slice(-1); + const number = parseInt(creationlimitConfig.slice(0, -1), 10); + switch (lastChar) { + case 'm': + limitInMilliseconds = number * 60 * 1000; + break; + case 'h': + limitInMilliseconds = number * 60 * 60 * 1000; + break; + case 'd': + limitInMilliseconds = number * 24 * 60 * 60 * 1000; + break; + default: + return; + } + const memberCreationDate = member.user.createdAt; + const currentDate = new Date(); + const timeDifference = currentDate - memberCreationDate; + if (timeDifference < limitInMilliseconds) { + return member.kick('Votre compte est trop récent.').catch(console.error); + }else { + const invites = await member.guild.invites.fetch(); + const invite = invites.find(i => i.uses > 1); + if (invite && invite.inviter) { + await updateInviteCount(member.guild.id, invite.inviter.id); + return; + + } + } + }else { + + const invites = await member.guild.invites.fetch(); + const invite = invites.find(i => i.uses > 1); + if (invite && invite.inviter) { + await updateInviteCount(member.guild.id, invite.inviter.id); + return; + } + + + } + } + } + } +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-bot protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-bot protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-bot protection'); + } + break; + case 'nothing': + break; + } +} +function updateInviteCount(guildId, memberId) { + const db = new sqlite3.Database('myDatabase.db'); + db.run(`INSERT INTO invitations (guild_id, member_id, invite_count) + VALUES (?, ?, 1) + ON CONFLICT(guild_id, member_id) DO UPDATE SET invite_count = invite_count + 1`, + [guildId, memberId], function(err) { + if (err) { + return console.error(err.message); + } + }); +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a ajoutée un bot et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/events/antiraid.js/GuildUpdate.js b/events/antiraid.js/GuildUpdate.js new file mode 100644 index 0000000..75b4bdb --- /dev/null +++ b/events/antiraid.js/GuildUpdate.js @@ -0,0 +1,152 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); +module.exports = { + name: Events.GuildUpdate, + async execute(oldGuild, newGuild, client) { + const botId = client.user.id; + const guildId = oldGuild.id; + const guild = oldGuild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.GuildUpdate, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antibotConfig = data[guildId]?.antiupdate; + if (!antibotConfig || antibotConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antibotConfig.type; + const permlevel = await getPermissionLevel(user, client) + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antibotConfig.action, newGuild); + await updateGuildSettings(oldGuild, newGuild); + sendlog(user, antibotConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antibotConfig.action, newGuild); + await updateGuildSettings(oldGuild, newGuild); + sendlog(user, antibotConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antibotConfig.action, newGuild); + await updateGuildSettings(oldGuild, newGuild); + sendlog(user, antibotConfig.action, guild, data); + } + }catch(err) { + console.log(err); + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-update protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-update protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-update protection'); + } + break; + case 'nothing': + break; + } +} +async function updateGuildSettings(oldGuild, newGuild) { + if (oldGuild.name !== newGuild.name) { + await newGuild.setName(oldGuild.name); + } + if (oldGuild.iconURL({ dynamic: true }) !== newGuild.iconURL({ dynamic: true })) { + await newGuild.setIcon(oldGuild.iconURL({ dynamic: true })); + } + if (oldGuild.bannerURL() !== newGuild.bannerURL()) { + await newGuild.setBanner(oldGuild.bannerURL()); + } + if (oldGuild.systemChannel !== newGuild.systemChannel) { + await newGuild.setSystemChannel(oldGuild.systemChannel); + } + if (oldGuild.systemChannelFlags !== newGuild.systemChannelFlags) { + await newGuild.setSystemChannelFlags(oldGuild.systemChannelFlags); + } + if (oldGuild.verificationLevel !== newGuild.verificationLevel) { + await newGuild.setVerificationLevel(oldGuild.verificationLevel); + } + if (oldGuild.widget !== newGuild.widget) { + await newGuild.setWidget(oldGuild.widget); + } + if (oldGuild.splashURL !== newGuild.splashURL) { + await newGuild.setSplash(oldGuild.splashURL); + } + if (oldGuild.rulesChannel !== newGuild.rulesChannel) { + await newGuild.setRulesChannel(oldGuild.rulesChannel); + } + if (oldGuild.publicUpdatesChannel !== newGuild.publicUpdatesChannel) { + await newGuild.setPublicUpdatesChannel(oldGuild.publicUpdatesChannel); + } + if (oldGuild.defaultMessageNotifications !== newGuild.defaultMessageNotifications) { + await newGuild.setDefaultMessageNotifications(oldGuild.defaultMessageNotifications); + } + if (oldGuild.afkChannel !== newGuild.afkChannel) { + await newGuild.setAFKChannel(oldGuild.afkChannel); + } + if (oldGuild.region !== newGuild.region) { + await newGuild.setRegion(oldGuild.region) + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a modifiée le serveur et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/events/antiraid.js/MessageCreate2.js b/events/antiraid.js/MessageCreate2.js new file mode 100644 index 0000000..cb994f7 --- /dev/null +++ b/events/antiraid.js/MessageCreate2.js @@ -0,0 +1,53 @@ +const sqlite3 = require('sqlite3').verbose(); +const { Events, ChannelType } = require("discord.js"); +const db = new sqlite3.Database('myDatabase.db'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.MessageCreate, + async execute(message, client) { + const botId = message.client.user.id; + const guildId = message.guild.id; + const user = message.member; + if (message.channel.type === ChannelType.DM) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antimentionConfig = data[guildId]?.antimention; + let statusMention = 'off'; + let mentionLimit = 0; + + if (antimentionConfig) { + ({ type: statusMention, nombre: mentionLimit } = antimentionConfig); + } + + if (statusMention !== "off") { + const mentionCount = message.mentions.users.size; + if (mentionLimit === 0) return; + if (mentionCount > mentionLimit) { + if (statusMention === "wl" || statusMention === "whitelist") { + if (await getPermissionLevel(user, client) >= 10) return; + if (whitelist[message.author.id]) return; + message.delete().catch(err => {}); + }else if (statusMention === "owner") { + const userlevelsawait = await getPermissionLevel(user, client) + if (userlevelsawait >= 10) return; + message.delete().catch(err => {}); + }else if (statusMention === "buyer") { + if (await getPermissionLevel(user, client) === 11) return; + if (whitelist[message.author.id]) return; + message.delete().catch(err => {}); + } + + } + } + }, +}; \ No newline at end of file diff --git a/events/antiraid.js/RoleCreate.js b/events/antiraid.js/RoleCreate.js new file mode 100644 index 0000000..8dd8f80 --- /dev/null +++ b/events/antiraid.js/RoleCreate.js @@ -0,0 +1,111 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.GuildRoleCreate, + async execute(role, client) { + const botId = client.user.id; + const guildId = role.guild.id; + const guild = role.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.RoleCreate, + limit: 1, + }); + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antiroleConfig = data[guildId]?.antirole; + if (!antiroleConfig || antiroleConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiroleConfig.type; + const permlevel = await getPermissionLevel(user, client); + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antiroleConfig.action, guild); + await role.delete('Anti-role protection'); + await sendlog(user, antiroleConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antiroleConfig.action, guild); + await role.delete('Anti-role protection'); + await sendlog(user, antiroleConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antiroleConfig.action, guild); + await role.delete('Anti-role protection'); + await sendlog(user, antiroleConfig.action, guild, data); + } + } catch (err) { + console.error(err); + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-role protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-role protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-role protection'); + } + break; + case 'nothing': + break; + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a crée un role et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/events/antiraid.js/RoleDelete.js b/events/antiraid.js/RoleDelete.js new file mode 100644 index 0000000..fb109b4 --- /dev/null +++ b/events/antiraid.js/RoleDelete.js @@ -0,0 +1,223 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.GuildRoleDelete, + async execute(role, client) { + const botId = client.user.id; + const guildId = role.guild.id; + const guild = role.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.RoleDelete, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + if (!firstEntry) return; + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antiroleConfig = data[guildId]?.antirole; + if (!antiroleConfig || antiroleConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiroleConfig.type; + const permlevel = await getPermissionLevel(user, client); + + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antiroleConfig.action, guild); + let membersWithRole = await new Promise((resolve, reject) => { + db.get('SELECT value FROM antiraid WHERE guild = ?', [guildId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value).role[role.id] : []); + }); + }); + const newRole = await role.guild.roles.create({ + data: { + name: 'TempRole', + color: role.color, + hoist: role.hoist, + permissions: role.permissions, + mentionable: role.mentionable, + position: role.position, + }, + reason: 'Anti-role protection', + }); + try { + await newRole.edit({ + name: role.name, + permissions: role.permissions, + color: role.color, + hoist: role.hoist, + mentionable: role.mentionable, + position: role.position, + }, 'Restauration du rôle supprimé'); + } catch (error) { + } + membersWithRole.forEach(async (memberId) => { + const member = guild.members.cache.get(memberId); + if (member) { + await member.roles.add(newRole, 'Anti-role protection'); + } + }); + await sendlog(user, antiroleConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antiroleConfig.action, guild); + let membersWithRole = await new Promise((resolve, reject) => { + db.get('SELECT value FROM antiraid WHERE guild = ?', [guildId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value).role[role.id] : []); + }); + }); + const newRole = await role.guild.roles.create({ + data: { + name: 'TempRole', + color: role.color, + hoist: role.hoist, + permissions: role.permissions, + mentionable: role.mentionable, + position: role.position, + }, + reason: 'Anti-role protection', + }); + try { + await newRole.edit({ + name: role.name, + permissions: role.permissions, + color: role.color, + hoist: role.hoist, + mentionable: role.mentionable, + position: role.position, + }, 'Restauration du rôle supprimé'); + } catch (error) { + } + + membersWithRole.forEach(async (memberId) => { + const member = guild.members.cache.get(memberId); + if (member) { + await member.roles.add(newRole, 'Anti-role protection'); + } + }); + await sendlog(user, antiroleConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antiroleConfig.action, guild); + let membersWithRole = await new Promise((resolve, reject) => { + db.get('SELECT value FROM antiraid WHERE guild = ?', [guildId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value).role[role.id] : []); + }); + }); + const newRole = await role.guild.roles.create({ + data: { + name: 'TempRole', + color: role.color, + hoist: role.hoist, + permissions: role.permissions, + mentionable: role.mentionable, + position: role.position, + }, + reason: 'Anti-role protection', + }); + try { + await newRole.edit({ + name: role.name, + permissions: role.permissions, + color: role.color, + hoist: role.hoist, + mentionable: role.mentionable, + position: role.position, + }, 'Restauration du rôle supprimé'); + } catch (error) { + } + membersWithRole.forEach(async (memberId) => { + const member = guild.members.cache.get(memberId); + if (member) { + await member.roles.add(newRole, 'Anti-role protection'); + } + }); + await sendlog(user, antiroleConfig.action, guild, data); + } + } catch (err) { + console.error(err); + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-role protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-role protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-role protection'); + } + break; + case 'nothing': + break; + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a modifiée un role et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/events/antiraid.js/Roleupdate.js b/events/antiraid.js/Roleupdate.js new file mode 100644 index 0000000..6f69bd9 --- /dev/null +++ b/events/antiraid.js/Roleupdate.js @@ -0,0 +1,144 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.GuildRoleUpdate, + async execute(oldRole, newRole, client) { + if (oldRole.name !== newRole.name || oldRole.permissions.bitfield !== newRole.permissions.bitfield) { + const botId = client.user.id; + const guildId = newRole.guild.id; + const guild = newRole.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.RoleUpdate, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antiroleConfig = data[guildId]?.antirole; + if (!antiroleConfig || antiroleConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiroleConfig.type; + const permlevel = await getPermissionLevel(user, client); + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antiroleConfig.action, guild); + try { + await newRole.edit({ + name: oldRole.name, + permissions: oldRole.permissions, + color: oldRole.color, + hoist: oldRole.hoist, + mentionable: oldRole.mentionable, + position: oldRole.position, + }, 'Restauration du rôle modifié'); + } catch (error) { + } + await sendlog(user, antiroleConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antiroleConfig.action, guild); + try { + await newRole.edit({ + name: oldRole.name, + permissions: oldRole.permissions, + color: oldRole.color, + hoist: oldRole.hoist, + mentionable: oldRole.mentionable, + position: oldRole.position, + }, 'Restauration du rôle modifié'); + } catch (error) { + } + await sendlog(user, antiroleConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antiroleConfig.action, guild); + try { + await newRole.edit({ + name: oldRole.name, + permissions: oldRole.permissions, + color: oldRole.color, + hoist: oldRole.hoist, + mentionable: oldRole.mentionable, + position: oldRole.position, + }, 'Restauration du rôle modifié'); + } catch (error) { + } + await sendlog(user, antiroleConfig.action, guild, data); + } + } catch (err) { + console.error(err); + } + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-role protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-role protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-role protection'); + } + break; + case 'nothing': + break; + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a supprimée un role et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/events/antiraid.js/ThreadCreate.js b/events/antiraid.js/ThreadCreate.js new file mode 100644 index 0000000..3ce9081 --- /dev/null +++ b/events/antiraid.js/ThreadCreate.js @@ -0,0 +1,112 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField , EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.ThreadCreate, + async execute(thread, okman ,client) { + const botId = client.user.id; + const guildId = thread.guild.id; + const guild = thread.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.ThreadCreate, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antiThreadConfig = data[guildId]?.antiThread; + if (!antiThreadConfig || antiThreadConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiThreadConfig.type; + const permlevel = await getPermissionLevel(user, client) + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antiThreadConfig.action, guild); + await thread.delete('Anti-thread protection'); + await sendlog(user, antiThreadConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antiThreadConfig.action, guild); + await thread.delete('Anti-thread protection'); + await sendlog(user, antiThreadConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antiThreadConfig.action, guild); + await thread.delete('Anti-thread protection'); + await sendlog(user, antiThreadConfig.action, guild, data); + } + } catch(err) { + console.error(err); + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-thread protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-thread protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-thread protection'); + } + break; + case 'nothing': + break; + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a crée un fil et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/events/antiraid.js/TreathDelete.js b/events/antiraid.js/TreathDelete.js new file mode 100644 index 0000000..18ba20d --- /dev/null +++ b/events/antiraid.js/TreathDelete.js @@ -0,0 +1,109 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField , EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.ThreadDelete, + async execute(thread ,client) { + const botId = client.user.id; + const guildId = thread.guild.id; + const guild = thread.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.ThreadDelete, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antiThreadConfig = data[guildId]?.antiThread; + if (!antiThreadConfig || antiThreadConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiThreadConfig.type; + const permlevel = await getPermissionLevel(user, client) + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antiThreadConfig.action, guild); + await sendlog(user, antiThreadConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antiThreadConfig.action, guild); + await sendlog(user, antiThreadConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antiThreadConfig.action, guild); + await sendlog(user, antiThreadConfig.action, guild, data); + } + } catch(err) { + console.error(err); + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-thread protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-thread protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-thread protection'); + } + break; + case 'nothing': + break; + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a supprimée un fil et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/events/antiraid.js/TreathUpdate.js b/events/antiraid.js/TreathUpdate.js new file mode 100644 index 0000000..eefb220 --- /dev/null +++ b/events/antiraid.js/TreathUpdate.js @@ -0,0 +1,121 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.ThreadUpdate, + async execute(oldThread, newThread, client) { + const botId = client.user.id; + const guildId = newThread.guild.id; + const guild = newThread.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.ThreadUpdate, + limit: 1, + }); + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + const antiThreadConfig = data[guildId]?.antiThread; + if (!antiThreadConfig || antiThreadConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiThreadConfig.type; + const permlevel = await getPermissionLevel(user, client) + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antiThreadConfig.action, guild); + await newThread.edit({ + name: oldThread.name, + autoArchiveDuration: oldThread.autoArchiveDuration, + reason: 'Anti-thread protection' + }); + await sendlog(user, antiThreadConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antiThreadConfig.action, guild); + await newThread.edit({ + name: oldThread.name, + autoArchiveDuration: oldThread.autoArchiveDuration, + reason: 'Anti-thread protection' + }); + await sendlog(user, antiThreadConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antiThreadConfig.action, guild); + await newThread.edit({ + name: oldThread.name, + autoArchiveDuration: oldThread.autoArchiveDuration, + reason: 'Anti-thread protection' + }); + await sendlog(user, antiThreadConfig.action, guild, data); + } + } catch(err) { + console.error(err); + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-thread protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-thread protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-thread protection'); + } + break; + case 'nothing': + break; + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a modifiée un fil et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/events/antiraid.js/WehbookCreate.js b/events/antiraid.js/WehbookCreate.js new file mode 100644 index 0000000..cd280c7 --- /dev/null +++ b/events/antiraid.js/WehbookCreate.js @@ -0,0 +1,119 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.WebhooksUpdate, + async execute(channel, client) { + const botId = client.user.id; + const guildId = channel.guild.id; + const guild = channel.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.WebhookCreate, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antiwebhookConfig = data[guildId]?.antiwebhook; + if (!antiwebhookConfig || antiwebhookConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiwebhookConfig.type; + const permlevel = await getPermissionLevel(user, client); + + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antiwebhookConfig.action, guild); + const webhookId = firstEntry.targetId; + const webhook = await client.fetchWebhook(webhookId); + await webhook.delete('Anti-webhook protection'); + await sendlog(user, antiwebhookConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antiwebhookConfig.action, guild); + const webhookId = firstEntry.targetId; + const webhook = await client.fetchWebhook(webhookId); + await webhook.delete('Anti-webhook protection'); + await sendlog(user, antiwebhookConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antiwebhookConfig.action, guild); + const webhookId = firstEntry.targetId; + const webhook = await client.fetchWebhook(webhookId); + await webhook.delete('Anti-webhook protection'); + await sendlog(user, antiwebhookConfig.action, guild, data); + } + } catch (err) { + } + }, +}; + + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-webhook protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-webhook protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-webhook protection'); + } + break; + case 'nothing': + break; + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a crée un webhook et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/events/antiraid.js/guildMemberupdate.js b/events/antiraid.js/guildMemberupdate.js new file mode 100644 index 0000000..d0d9fa2 --- /dev/null +++ b/events/antiraid.js/guildMemberupdate.js @@ -0,0 +1,186 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField , EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.GuildMemberUpdate, + async execute(oldMember, newMember, client) { + const botId = client.user.id; + const guildId = newMember.guild.id; + const guild = newMember.guild; + if (!oldMember.permissions.has(PermissionsBitField.Flags.Administrator) && newMember.permissions.has(PermissionsBitField.Flags.Administrator)) { + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.MemberRoleUpdate, + limit: 1, + }); + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antiadminConfig = data[guildId]?.antiadmin; + if (!antiadminConfig || antiadminConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiadminConfig.type; + const permlevel = await getPermissionLevel(user, client); + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + ]; + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + const member = guild.members.cache.get(newMember.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-admin protection'); + } + punish(user, antiadminConfig.action, guild); + } else if (type === "owner") { + if (permlevel >= 10) return; + const member = guild.members.cache.get(newMember.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-admin protection'); + } + punish(user, antiadminConfig.action, guild); + } else if (type === "buyer") { + if (permlevel === 11) return; + const member = guild.members.cache.get(newMember.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-admin protection'); + } + punish(user, antiadminConfig.action, guild); + } + } catch (err) { + } + }else { + const addedRoles = newMember.roles.cache.filter(role => !oldMember.roles.cache.has(role.id)); + const removedRoles = oldMember.roles.cache.filter(role => !newMember.roles.cache.has(role.id)); + + if (addedRoles.size === 0 && removedRoles.size === 0) return; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.MemberRoleUpdate, + limit: 1, + }); + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === newMember.client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antiRoleConfig = data[guildId]?.antirole; + if (!antiRoleConfig || antiRoleConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiRoleConfig.type; + const permlevel = await getPermissionLevel(user, newMember.client); + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antiRoleConfig.action, guild); + await removeAddedRoles(newMember, addedRoles); + await addRemovedRoles(newMember, removedRoles); + await sendlog(user, antiRoleConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antiRoleConfig.action, guild); + await removeAddedRoles(newMember, addedRoles); + await addRemovedRoles(newMember, removedRoles); + await sendlog(user, antiRoleConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antiRoleConfig.action, guild); + await removeAddedRoles(newMember, addedRoles); + await addRemovedRoles(newMember, removedRoles); + await sendlog(user, antiRoleConfig.action, guild, data); + } + } catch (err) { + console.error(err); + } + + } +} +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-admin protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-admin protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-admin protection'); + } + break; + case 'nothing': + break; + } +} +async function removeAddedRoles(member, addedRoles) { + await member.roles.remove(addedRoles, 'Anti-role protection'); +} + +async function addRemovedRoles(member, removedRoles) { + await member.roles.add(removedRoles, 'Anti-role protection'); +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a ajoutée un role et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/events/antiraid.js/messageCreate.js b/events/antiraid.js/messageCreate.js index 292c65e..830484b 100644 --- a/events/antiraid.js/messageCreate.js +++ b/events/antiraid.js/messageCreate.js @@ -1,15 +1,16 @@ - const sqlite3 = require('sqlite3').verbose(); -const { Events, ChannelType } = require("discord.js"); +const { Events, ChannelType, EmbedBuilder } = require("discord.js"); const db = new sqlite3.Database('myDatabase.db'); const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + module.exports = { name: Events.MessageCreate, async execute(message, client) { const botId = message.client.user.id; const guildId = message.guild.id; + if (message.channel.type === ChannelType.DM) return; - if (!message.content.includes('@everyone')) return; + let data = await new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { if (err) { @@ -19,28 +20,70 @@ module.exports = { resolve(row ? JSON.parse(row.value) : {}); }); }); + const antieveryoneConfig = data[guildId]?.antieveryone; - let status = 'off'; - + const antileakConfig = data[guildId]?.antileak; + const antimentionConfig = data[guildId]?.antimention; + let statusEveryone = 'off'; + let statusLeak = 'off'; + let statusMention = 'off'; + let mentionLimit = 0; + if (antieveryoneConfig) { - ({ status} = antieveryoneConfig); - } - if (status === "off") return; + ({ status: statusEveryone } = antieveryoneConfig); + } + + if (antileakConfig) { + ({ status: statusLeak } = antileakConfig); + } + if (antimentionConfig) { + ({ status: statusMention, nombre: mentionLimit } = antimentionConfig); + } + if (statusEveryone === "off" && statusLeak === "off") return; + data.whitelist = data.whitelist || {}; data.whitelist[guildId] = data.whitelist[guildId] || {}; const whitelist = data.whitelist[guildId]; const user = message.member; - if (status === "on") { - if (await getPermissionLevel(user, client) >= 10) return; - if (whitelist[message.author.id]) return; - message.delete().catch(err => {; - }); - } else if (status === "max") { - const levelperm = await getPermissionLevel(user, client); - if (levelperm >= 10) return; - message.delete().catch(err => {; - }); + + if (statusEveryone !== "off" && message.content.includes('@everyone')) { + if(message.author.id === client.user.id)return; + if (statusEveryone === "on") { + if (await getPermissionLevel(user, client) >= 10) return; + if (whitelist[message.author.id]) return; + message.delete().catch(err => {; + }); + } else if (statusEveryone === "max") { + const levelperm = await getPermissionLevel(user, client); + if (levelperm >= 10) return; + message.delete().catch(err => {; + }); + } + } + + if (statusLeak !== "off") { + if (message.author.bot) return; + const ipRegex = /\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/; + const phoneRegex = /\b(?:\+?(\d{1,3}))?[-. (]*(?:\d{1,4})[-. )]*(\d{1,3})[-. ]*(\d{2,4})\b/; + const addressRegex = /\b\d{1,5} [\w\s]+(?:, [\w\s]+)*\b/; + const cardRegex = /\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9]{2})[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})\b/; + + const cardMatch = message.content.match(cardRegex); + const ipMatch = message.content.match(ipRegex); + const phoneMatch = message.content.match(phoneRegex); + const addressMatch = message.content.match(addressRegex); + + if (ipMatch || phoneMatch || addressMatch || cardMatch) { + if (statusLeak === 'on') { + if (await getPermissionLevel(user, client) >= 10) return; + if (whitelist[message.author.id]) return; + message.delete().catch(err => {}); + } else if (statusLeak === 'max') { + const levelperm = await getPermissionLevel(user, client); + if (levelperm >= 10) return; + message.delete().catch(err => {}); + } + } } - }, }; \ No newline at end of file diff --git a/events/antiraid.js/ready.js b/events/antiraid.js/ready.js new file mode 100644 index 0000000..8577366 --- /dev/null +++ b/events/antiraid.js/ready.js @@ -0,0 +1,49 @@ +const sqlite3 = require('sqlite3').verbose(); +const { Events } = require('discord.js'); + +module.exports = { + name: Events.ClientReady, + async execute(client) { + const db = new sqlite3.Database('myDatabase.db', (err) => { + if (err) { + console.error(err.message); + } + console.log('Connected to the SQLite database.'); + }); + + async function recordMembersWithRole(guild) { + if (!guild) return; + + + const roles = guild.roles.cache; + + let data = { + role: {} + }; + roles.forEach(role => { + const membersWithRole = role.members.map(member => member.id); + data.role[role.id] = membersWithRole; + }); + + db.run('INSERT OR REPLACE INTO antiraid (guild, value) VALUES (?, ?)', [guild.id, JSON.stringify(data)], (err) => { + if (err) { + console.error(err.message); + } + }); + } + + function scheduleRoleRecording() { + client.guilds.cache.forEach(guild => { + recordMembersWithRole(guild); + }); + + setInterval(() => { + client.guilds.cache.forEach(guild => { + recordMembersWithRole(guild); + }); + }, 2 * 60 * 60 * 1000); + } + + scheduleRoleRecording(); + }, +}; \ No newline at end of file diff --git a/events/auto/addreact.js b/events/auto/addreact.js index d57d902..60071db 100644 --- a/events/auto/addreact.js +++ b/events/auto/addreact.js @@ -19,7 +19,6 @@ module.exports = { const roleDataArray = data[reaction.message.guild.id]?.rolereact?.[messageId]; if (!Array.isArray(roleDataArray)) { - console.error('Expected an array of role data objects, but received something else.'); return; } diff --git a/events/auto/buttonrolevent.js b/events/auto/buttonrolevent.js index 355637b..2f56337 100644 --- a/events/auto/buttonrolevent.js +++ b/events/auto/buttonrolevent.js @@ -5,6 +5,7 @@ module.exports = { async execute(interaction, client) { const botId = client.user.id; const customId = interaction.customId; + if (customId == undefined || customId === null) return; if (!customId.startsWith('rolebuttons_')) return; const roleId = customId.split('_')[1]; diff --git a/events/auto/removereact.js b/events/auto/removereact.js index e69de29..265e092 100644 --- a/events/auto/removereact.js +++ b/events/auto/removereact.js @@ -0,0 +1,37 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events } = require("discord.js"); + +module.exports = { + name: Events.MessageReactionRemove, + async execute(reaction, user, client) { + if (user.bot) return; + const messageId = reaction.message.id; + const emoji = reaction.emoji.toString(); + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const roleDataArray = data[reaction.message.guild.id]?.rolereact?.[messageId]; + if (!Array.isArray(roleDataArray)) { + return; + } + + const roleData = roleDataArray.find(r => r.emoji === emoji); + if (!roleData) return; + + const role = reaction.message.guild.roles.cache.get(roleData.roleId); + if (!role) return; + + const member = reaction.message.guild.members.cache.get(user.id); + if (!member) return; + await member.roles.remove(role); + + }, +}; \ No newline at end of file diff --git a/events/client/ready.js b/events/client/ready.js index 80b08cc..c9fc0ac 100644 --- a/events/client/ready.js +++ b/events/client/ready.js @@ -63,6 +63,45 @@ module.exports = { } else { } }); + db.run(`CREATE TABLE IF NOT EXISTS status ( + botId TEXT PRIMARY KEY, + type TEXT NOT NULL, + status TEXT NOT NULL +);`, (err) => { + if (err) { + console.error(err.message); + } else { + } +}); +db.run(`CREATE TABLE IF NOT EXISTS master ( + id TEXT PRIMARY KEY, + value TEXT +);`, (err) => { + if (err) { + console.error(err.message); + } + +}); +db.run(`CREATE TABLE IF NOT EXISTS antiraid ( + guild TEXT PRIMARY KEY, + value TEXT +);`, (err) => { + if (err) { + console.error(err.message); + } + +}); +db.run(`CREATE TABLE IF NOT EXISTS invitations ( + guild_id TEXT NOT NULL, + member_id TEXT NOT NULL, + invite_count INTEGER NOT NULL DEFAULT 0, + PRIMARY KEY (guild_id, member_id) +);;`, (err) => { + if (err) { + console.error(err.message); + } + +}); db.get('SELECT value FROM gestion WHERE id = ?', [client.user.id], (err, row) => { @@ -96,7 +135,6 @@ module.exports = { console.log(`Le bot ${client.user.tag} est en ligne lien d'invite > https://discord.com/oauth2/authorize?client_id=${client.user.id}&scope=bot&permissions=8`); - //AntiCrash process.on('unhandledRejection', (error) => { console.log(' [antiCrash] :: Unhandled Rejection/Catch'); diff --git a/events/client/setstatusready.js b/events/client/setstatusready.js new file mode 100644 index 0000000..8769ff9 --- /dev/null +++ b/events/client/setstatusready.js @@ -0,0 +1,63 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, ActivityType } = require('discord.js'); + +module.exports = { + name: Events.ClientReady, + async execute(client) { + + db.get('SELECT type, status FROM status WHERE botId = ?', [client.user.id], (err, row) => { + if (err) { + console.error(err.message); + return; + } + if (row) { + const { type, status } = row; + const url = 'https://www.twitch.tv/valou336_ytb'; + if (type === 'playing') { + client.user.setPresence({ + activities: [{ + name: status, + type: ActivityType.Playing, + url: url + }] + }); + } else if (type === 'streaming') { + client.user.setPresence({ + activities: [{ + name: status, + type: ActivityType.Streaming, + url: url + }] + }); + } else if (type === 'listening') { + client.user.setPresence({ + activities: [{ + name: status, + type: ActivityType.Listening, + url: url + }] + }); + } else if (type === 'watching') { + client.user.setPresence({ + activities: [{ + name: status, + type: ActivityType.Watching, + url: url + }] + }); + } else if (type === 'competing') { + client.user.setPresence({ + activities: [{ + name: status, + type: ActivityType.Competing, + url: url + }] + }); + } + + } else { + } + }); + }, +}; \ No newline at end of file diff --git a/events/gestion/bl.js b/events/gestion/bl.js index 1c0cdb0..402891a 100644 --- a/events/gestion/bl.js +++ b/events/gestion/bl.js @@ -6,7 +6,6 @@ module.exports = { name: Events.GuildMemberAdd, async execute(member, client) { const botId = client.user.id; - console.log(botId) let data = await new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { if (err) { diff --git a/events/gestion/buttongestion.js b/events/gestion/buttongestion.js index b7de64f..4fb3b02 100644 --- a/events/gestion/buttongestion.js +++ b/events/gestion/buttongestion.js @@ -1,6 +1,8 @@ -const {Events , ModalBuilder, TextInputStyle, ActionRowBuilder, TextInputBuilder , EmbedBuilder} = require("discord.js") +const {Events , ModalBuilder, TextInputStyle, ActionRowBuilder, TextInputBuilder , EmbedBuilder, ButtonBuilder, ButtonStyle} = require("discord.js") const sqlite3 = require('sqlite3').verbose(); const db2 = new sqlite3.Database('myDatabase.db'); +const paginationEmbed = require('discordjs-button-pagination'); + module.exports = { name: Events.InteractionCreate, async execute(interaction, client) { @@ -127,11 +129,10 @@ module.exports = { try { await registerMarriage(userId1, userId2, client); }catch(err){ - console.log(err) } await interaction.reply({ content: '💒 Vous êtes maintenant mariés! 💒'}); - } +} }, }; async function registerMarriage(userId1, userId2, client) { diff --git a/events/gestion/greet.js b/events/gestion/greet.js index 27a2890..e283cdb 100644 --- a/events/gestion/greet.js +++ b/events/gestion/greet.js @@ -34,13 +34,11 @@ module.exports = { ); } } catch (error) { - console.error(error); } } try { await Promise.all(messagePromises); } catch (error) { - console.error(error); } } }, diff --git a/events/gestion/guildMemberAdd.js b/events/gestion/guildMemberUpdate.js similarity index 73% rename from events/gestion/guildMemberAdd.js rename to events/gestion/guildMemberUpdate.js index cd03b82..db6f938 100644 --- a/events/gestion/guildMemberAdd.js +++ b/events/gestion/guildMemberUpdate.js @@ -1,8 +1,6 @@ -const { QuickDB } = require("quick.db"); -const db = new QuickDB() const sqlite3 = require('sqlite3').verbose(); -const db2 = new sqlite3.Database('myDatabase.db'); -const {Events} = require("discord.js") +const db = new sqlite3.Database('myDatabase.db'); +const {Events, EmbedBuilder} = require("discord.js") module.exports = { name: Events.GuildMemberUpdate, async execute(oldMember, newMember, client) { @@ -10,7 +8,7 @@ module.exports = { const guildId = newMember.guild.id; let data = await new Promise((resolve, reject) => { - db2.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { if (err) { console.error(err.message); reject(err); @@ -27,13 +25,12 @@ module.exports = { try { await newMember.roles.remove(role); } catch (error) { - console.error(`Erreur lors de la suppression du rôle <@&${role.id}> pour le membre ${newMember.user.tag}:`, error); } }); return; } let limitedRoles = await new Promise((resolve, reject) => { - db2.get('SELECT value FROM gestion WHERE id = ?', [`${botId}.${guildId}.rolelimits`], (err, row) => { + db.get('SELECT value FROM gestion WHERE id = ?', [`${botId}.${guildId}.rolelimits`], (err, row) => { if (err) { console.error(err.message); reject(err); @@ -56,17 +53,16 @@ module.exports = { try { await newMember.roles.remove(role); } catch (error) { - console.error(`Erreur lors de la suppression du rôle <@&${role.id}> pour le membre ${newMember.user.tag}:`, error); } } if (memberCount > limitedRole.limit) { try { await newMember.roles.remove(role); } catch (error) { - console.error(`Erreur lors de la suppression du rôle <@&${role.id}> pour le membre ${newMember.user.tag}:`, error); } } } }); + }, }; \ No newline at end of file diff --git a/events/gestion/messageUpdate.js b/events/gestion/messageUpdate.js index 4751048..8afb98a 100644 --- a/events/gestion/messageUpdate.js +++ b/events/gestion/messageUpdate.js @@ -6,7 +6,7 @@ module.exports = { once: false, async execute(oldMessage, newMessage, client) { if (oldMessage.author.bot || !oldMessage.content) return; - + const editedEmbed = new EmbedBuilder() .setColor('#FFA500') .setAuthor({ name: oldMessage.author.tag, iconURL: oldMessage.author.displayAvatarURL({ dynamic: true })}) diff --git a/events/logs/LogBooste.js b/events/logs/LogBooste.js new file mode 100644 index 0000000..40115a7 --- /dev/null +++ b/events/logs/LogBooste.js @@ -0,0 +1,60 @@ +const { EmbedBuilder, Events } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: Events.GuildMemberUpdate, + async execute(oldMember, newMember) { + if (!oldMember.premiumSince && newMember.premiumSince) { + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [newMember.client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const boostlogChannelId = data[newMember.guild.id]?.boostlog; + if (boostlogChannelId) { + const boostlogChannel = newMember.guild.channels.cache.get(boostlogChannelId); + if (boostlogChannel) { + const embed = new EmbedBuilder() + .setColor('#0099ff') + .setTitle('Nouveau booster') + .setDescription(`${newMember.user.tag} a commencé à booster le serveur!`) + .setTimestamp(); + + boostlogChannel.send({ embeds: [embed] }); + } + } + } + console.log(newMember.premiumSince) + if (oldMember.premiumSince && !newMember.premiumSince) { + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [newMember.client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const boostlogChannelId = data[newMember.guild.id]?.boostlog; + if (boostlogChannelId) { + const boostlogChannel = newMember.guild.channels.cache.get(boostlogChannelId); + if (boostlogChannel) { + const embed = new EmbedBuilder() + .setColor('#0099ff') + .setTitle('Booster arrêté') + .setDescription(`${newMember.user.tag} a arrêté de booster le serveur.`) + .setTimestamp(); + + boostlogChannel.send({ embeds: [embed] }); + } + } + } + }, +}; \ No newline at end of file diff --git a/events/logs/channelCreate.js b/events/logs/channelCreate.js new file mode 100644 index 0000000..1a87faa --- /dev/null +++ b/events/logs/channelCreate.js @@ -0,0 +1,27 @@ +const { EmbedBuilder, Events } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: Events.ChannelCreate, + execute(channel) { + db.get('SELECT value FROM gestion WHERE id = ?', [channel.client.user.id], (err, row) => { + if (err) { + console.error(err.message); + return; + } + const data = row ? JSON.parse(row.value) : {}; + const logChannelId = data[channel.guild.id]?.channelog; + if (logChannelId) { + const logChannel = channel.guild.channels.cache.get(logChannelId); + if (logChannel) { + const embed = new EmbedBuilder() + .setColor('#0099ff') + .setDescription(`Un nouveau salon a été créé : ${channel.name}`) + .setTimestamp(); + logChannel.send({ embeds: [embed] }); + } + } + }); + }, +}; \ No newline at end of file diff --git a/events/logs/channelDelete.js b/events/logs/channelDelete.js new file mode 100644 index 0000000..6c09a2f --- /dev/null +++ b/events/logs/channelDelete.js @@ -0,0 +1,27 @@ +const { EmbedBuilder, Events } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: Events.ChannelDelete, + execute(channel) { + db.get('SELECT value FROM gestion WHERE id = ?', [channel.client.user.id], (err, row) => { + if (err) { + console.error(err.message); + return; + } + const data = row ? JSON.parse(row.value) : {}; + const logChannelId = data[channel.guild.id]?.channelog; + if (logChannelId) { + const logChannel = channel.guild.channels.cache.get(logChannelId); + if (logChannel) { + const embed = new EmbedBuilder() + .setColor('#0099ff') + .setDescription(`Le salon ${channel.name} a été supprimé.`) + .setTimestamp(); + logChannel.send({ embeds: [embed] }); + } + } + }); + }, +}; \ No newline at end of file diff --git a/events/logs/channelUpdate.js b/events/logs/channelUpdate.js new file mode 100644 index 0000000..39fc394 --- /dev/null +++ b/events/logs/channelUpdate.js @@ -0,0 +1,32 @@ +const { EmbedBuilder, Events } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: Events.ChannelUpdate, + execute(oldChannel, newChannel) { + db.get('SELECT value FROM gestion WHERE id = ?', [newChannel.client.user.id], (err, row) => { + if (err) { + console.error(err.message); + return; + } + const data = row ? JSON.parse(row.value) : {}; + const logChannelId = data[newChannel.guild.id]?.channelog; + if (logChannelId) { + const logChannel = newChannel.guild.channels.cache.get(logChannelId); + if (logChannel) { + + const embed = new EmbedBuilder() + .setColor('#0099ff') + .setTitle('Salon modifié') + .setDescription(`Le salon ${oldChannel.name} a été modifié.`) + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + + } + } + }); + + }, +}; \ No newline at end of file diff --git a/events/gestion/roleUpdate.js b/events/logs/roleUpdate.js similarity index 73% rename from events/gestion/roleUpdate.js rename to events/logs/roleUpdate.js index 2e0daa1..42f3e13 100644 --- a/events/gestion/roleUpdate.js +++ b/events/logs/roleUpdate.js @@ -1,4 +1,4 @@ -const { Events, EmbedBuilder } = require("discord.js"); +const { Events, EmbedBuilder , AuditLogEvent} = require("discord.js"); const sqlite3 = require('sqlite3').verbose(); const db = new sqlite3.Database('myDatabase.db'); module.exports = { @@ -6,7 +6,11 @@ module.exports = { once: false, async execute(oldMember, newMember, client) { if (oldMember.user.bot || newMember.user.bot) return; - + const fetchedLogs = await newMember.guild.fetchAuditLogs({ + limit: 1, + type: AuditLogEvent.MemberRoleUpdate, + }); + const auditEntry = fetchedLogs.entries.first(); let data = await new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [client.user.id], (err, row) => { if (err) { @@ -31,14 +35,18 @@ module.exports = { const removedRoles = oldRoles.filter(role => !newRoles.has(role.id)); - // Si des rôles ont été ajoutés if (addedRoles.size > 0) { + const reason = auditEntry.reason const embed = new EmbedBuilder() .setColor('#00FF00') .setAuthor({ name: newMember.user.username, iconURL: newMember.user.displayAvatarURL({ dynamic: true })}) - .setDescription(`${newMember.user.username} a gagné les rôles suivants : ${addedRoles.map(role => `<@&${role.id}>`).join(', ')}`) + .setDescription(`${newMember.user.username} a gagnéeee les rôles suivants : ${addedRoles.map(role => `<@&${role.id}>`).join(', ')}`) .setTimestamp(); + if (reason && auditEntry.target.id === newMember.id) { + embed.addFields({ name:' ',value: `**Raison : **\`${reason}\``}); + } + try { await logChannel.send({ embeds: [embed] }); } catch (error) { @@ -46,12 +54,16 @@ module.exports = { } if (removedRoles.size > 0) { + const reason = auditEntry.reason const embed = new EmbedBuilder() .setColor('#FF0000') .setAuthor({ name: newMember.user.username, iconURL: newMember.user.displayAvatarURL({ dynamic: true })}) .setDescription(`${newMember.user.tag} a perdu les rôles suivants : ${removedRoles.map(role => `<@&${role.id}>`).join(', ')}`) .setTimestamp(); + if (reason && auditEntry.target.id === newMember.id) { + embed.addFields({ name:' ',value: `**Raison : **\`${reason}\``}); + } try { await logChannel.send({ embeds: [embed] }); } catch (error) { diff --git a/fonction/getPermissionLevel.js b/fonction/getPermissionLevel.js index ef72d19..a668617 100644 --- a/fonction/getPermissionLevel.js +++ b/fonction/getPermissionLevel.js @@ -32,4 +32,35 @@ async function getPermissionLevel(member, client) { } return highestPermission; } -module.exports = { getPermissionLevel }; \ No newline at end of file +async function getPermissionLevel2(member, client, guildId) { + const botId = client.user.id; + const buyerId = ['1003985920162287696', '671763971803447298']; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + let owners = data.owners || {}; + if (buyerId.includes(member.id)) { + return 11; + } + if (owners[member.id]) { + return 10; + } + let highestPermission = 0; + for (let i = 1; i <= 9; i++) { + const roleIds = data.permissions && data.permissions[guildId] && data.permissions[guildId].p && data.permissions[guildId].p[i]; + if (roleIds) { + if (roleIds.some(id => member.roles.cache.has(id))) { + highestPermission = Math.max(highestPermission, i); + } + } + } + return highestPermission; +} +module.exports = { getPermissionLevel , getPermissionLevel2}; \ No newline at end of file diff --git a/loaders/events/antiraid.js/ChannelCreate.js b/loaders/events/antiraid.js/ChannelCreate.js new file mode 100644 index 0000000..1b76ea8 --- /dev/null +++ b/loaders/events/antiraid.js/ChannelCreate.js @@ -0,0 +1,110 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder} = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); +module.exports = { + name: Events.ChannelCreate, + async execute(channel, client) { + const botId = client.user.id; + const guildId = channel.guild.id; + const guild = channel.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.ChannelCreate, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antichannelConfig = data[guildId]?.antichannel; + if (!antichannelConfig || antichannelConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antichannelConfig.type; + const permlevel = await getPermissionLevel(user, client) + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + await channel.delete('Anti-channel protection'); + punish(user, antichannelConfig.action, channel.guild); + sendlog(user, antichannelConfig.action, channel.guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + await channel.delete('Anti-channel protection'); + punish(user, antichannelConfig.action, channel.guild); + sendlog(user, antichannelConfig.action, channel.guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + await channel.delete('Anti-channel protection'); + punish(user, antichannelConfig.action, channel.guild); + sendlog(user, antichannelConfig.action, channel.guild, data); + } + }catch(err) { + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-channel protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-channel protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-channel protection'); + } + break; + case 'nothing': + break; + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a créé un salon et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/loaders/events/antiraid.js/ChannelDelete.js b/loaders/events/antiraid.js/ChannelDelete.js new file mode 100644 index 0000000..fdffd7d --- /dev/null +++ b/loaders/events/antiraid.js/ChannelDelete.js @@ -0,0 +1,124 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder} = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); +module.exports = { + name: Events.ChannelDelete, + async execute(channel, client) { + const botId = client.user.id; + const guildId = channel.guild.id; + const guild = channel.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.ChannelDelete, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antichannelConfig = data[guildId]?.antichannel; + if (!antichannelConfig || antichannelConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antichannelConfig.type; + const permlevel = await getPermissionLevel(user, client) + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antichannelConfig.action, channel.guild, channel); + sendlog(user, antichannelConfig.action, channel.guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antichannelConfig.action, channel.guild, channel); + sendlog(user, antichannelConfig.action, channel.guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antichannelConfig.action, channel.guild, channel); + sendlog(user, antichannelConfig.action, channel.guild, data); + } + }catch(err) { + } + }, +}; + +async function punish(user, action, guild, channel) { + + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-channel protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-channel protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-channel protection'); + } + break; + case 'nothing': + break; + } +try { + channel.clone({ + name: channel.name, + permissions: channel.permissionsOverwrites, + type: channel.type, + parent: channel.parent, + topic: channel.withTopic, + nsfw: channel.nsfw, + birate: channel.bitrate, + userLimit: channel.userLimit, + rateLimitPerUser: channel.rateLimitPerUser, + permissions: channel.withPermissions, + position: channel.rawPosition, + reason: 'Anti-channel protection', +}) +} catch (error) { +} +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a supprimée un salon et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/loaders/events/antiraid.js/ChannelUpdate.js b/loaders/events/antiraid.js/ChannelUpdate.js new file mode 100644 index 0000000..ef87ea9 --- /dev/null +++ b/loaders/events/antiraid.js/ChannelUpdate.js @@ -0,0 +1,127 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.ChannelUpdate, + async execute(oldChannel, newChannel, client) { + const botId = client.user.id; + const guildId = newChannel.guild.id; + const guild = newChannel.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.ChannelUpdate, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antichannelConfig = data[guildId]?.antichannel; + if (!antichannelConfig || antichannelConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antichannelConfig.type; + const permlevel = await getPermissionLevel(user, client); + + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antichannelConfig.action, guild, newChannel, oldChannel); + sendlog(user, antichannelConfig.action, newChannel.guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antichannelConfig.action, guild, newChannel, oldChannel); + sendlog(user, antichannelConfig.action, newChannel.guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antichannelConfig.action, guild, newChannel, oldChannel); + sendlog(user, antichannelConfig.action, newChannel.guild, data); + } + } catch (err) { + } + }, +}; + +async function punish(user, action, guild, newChannel, oldChannel) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-channel protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-channel protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-channel protection'); + } + break; + case 'nothing': + break; + } + try { + await newChannel.edit({ + name: oldChannel.name, + permissions: oldChannel.permissionOverwrites, + type: oldChannel.type, + parent: oldChannel.parent, + topic: oldChannel.topic, + nsfw: oldChannel.nsfw, + bitrate: oldChannel.bitrate, + userLimit: oldChannel.userLimit, + rateLimitPerUser: oldChannel.rateLimitPerUser, + position: oldChannel.rawPosition, + reason: 'Anti-channel protection', + }); + newChannel.overwritePermissions(oldChannel.permissionOverwrites) + } catch (error) { + console.error(error); + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a modifié un salon et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/loaders/events/antiraid.js/GuildBanAdd.js b/loaders/events/antiraid.js/GuildBanAdd.js new file mode 100644 index 0000000..424f2cf --- /dev/null +++ b/loaders/events/antiraid.js/GuildBanAdd.js @@ -0,0 +1,113 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +const banMap = new Map(); +setInterval(() => { + banMap.clear(); +}, 10 * 60 * 1000); + +module.exports = { + name: Events.GuildBanAdd, + async execute(ban, client) { + const botId = client.user.id; + const guildId = ban.guild.id; + const guild = ban.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.MemberBanAdd, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + const antibanConfig = data[guildId]?.antiban; + if (!antibanConfig || antibanConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antibanConfig.type; + const banLimit = antibanConfig.number; + const permlevel = await getPermissionLevel(user, client); + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + if (!banMap.has(guildId)) { + banMap.set(guildId, new Map()); + } + const guildBanMap = banMap.get(guildId); + guildBanMap.set(user.id, (guildBanMap.get(user.id) || 0) + 1); + if (guildBanMap.get(user.id) >= banLimit) { + punish(user, antibanConfig.action, guild); + } + } else if (type === "owner") { + if (permlevel >= 10) return; + if (!banMap.has(guildId)) { + banMap.set(guildId, new Map()); + } + const guildBanMap = banMap.get(guildId); + guildBanMap.set(user.id, (guildBanMap.get(user.id) || 0) + 1); + if (guildBanMap.get(user.id) >= banLimit) { + punish(user, antibanConfig.action, guild); + } + } else if (type === "buyer") { + if (permlevel === 11) return; + if (!banMap.has(guildId)) { + banMap.set(guildId, new Map()); + } + const guildBanMap = banMap.get(guildId); + guildBanMap.set(user.id, (guildBanMap.get(user.id) || 0) + 1); + if (guildBanMap.get(user.id) >= banLimit) { + punish(user, antibanConfig.action, guild); + } + + } + } catch (err) { + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-role protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-role protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-role protection'); + } + break; + case 'nothing': + break; + } +} \ No newline at end of file diff --git a/loaders/events/antiraid.js/GuildMemberAdd.js b/loaders/events/antiraid.js/GuildMemberAdd.js new file mode 100644 index 0000000..fe7ef2e --- /dev/null +++ b/loaders/events/antiraid.js/GuildMemberAdd.js @@ -0,0 +1,186 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.GuildMemberAdd, + async execute(member, client) { + if (member.user.bot) { + const botId = client.user.id; + const guildId = member.guild.id; + const guild = member.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.BotAdd, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antibotConfig = data[guildId]?.antibot; + if (!antibotConfig || antibotConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antibotConfig.type; + const permlevel = await getPermissionLevel(user, client); + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antibotConfig.action, guild); + await member.kick('Anti-bot protection'); + sendlog(user, antibotConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antibotConfig.action, guild); + await member.kick('Anti-bot protection'); + sendlog(user, antibotConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antibotConfig.action, guild); + await member.kick('Anti-bot protection'); + sendlog(user, antibotConfig.action, guild, data); + } + } catch (err) { + } + }else { + const botId = client.user.id; + const guildId = member.guild.id; + const guild = member.guild; + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + const antijoinConfig = data[guildId]?.antijoin + if(antijoinConfig && antijoinConfig?.type === 'on') { + try{ + member.kick({ reason: 'Anti-join protection' }); + }catch(err) { + } + } else { + const creationlimitConfig = data[guildId]?.creationLimit + if (creationlimitConfig) { + let limitInMilliseconds; + const lastChar = creationlimitConfig.slice(-1); + const number = parseInt(creationlimitConfig.slice(0, -1), 10); + switch (lastChar) { + case 'm': + limitInMilliseconds = number * 60 * 1000; + break; + case 'h': + limitInMilliseconds = number * 60 * 60 * 1000; + break; + case 'd': + limitInMilliseconds = number * 24 * 60 * 60 * 1000; + break; + default: + return; + } + const memberCreationDate = member.user.createdAt; + const currentDate = new Date(); + const timeDifference = currentDate - memberCreationDate; + if (timeDifference < limitInMilliseconds) { + return member.kick('Votre compte est trop récent.').catch(console.error); + }else { + const invites = await member.guild.invites.fetch(); + const invite = invites.find(i => i.uses > 1); + if (invite && invite.inviter) { + await updateInviteCount(member.guild.id, invite.inviter.id); + return; + + } + } + }else { + + const invites = await member.guild.invites.fetch(); + const invite = invites.find(i => i.uses > 1); + if (invite && invite.inviter) { + await updateInviteCount(member.guild.id, invite.inviter.id); + return; + } + + + } + } + } + } +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-bot protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-bot protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-bot protection'); + } + break; + case 'nothing': + break; + } +} +function updateInviteCount(guildId, memberId) { + const db = new sqlite3.Database('myDatabase.db'); + db.run(`INSERT INTO invitations (guild_id, member_id, invite_count) + VALUES (?, ?, 1) + ON CONFLICT(guild_id, member_id) DO UPDATE SET invite_count = invite_count + 1`, + [guildId, memberId], function(err) { + if (err) { + return console.error(err.message); + } + }); +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a ajoutée un bot et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/loaders/events/antiraid.js/GuildUpdate.js b/loaders/events/antiraid.js/GuildUpdate.js new file mode 100644 index 0000000..75b4bdb --- /dev/null +++ b/loaders/events/antiraid.js/GuildUpdate.js @@ -0,0 +1,152 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); +module.exports = { + name: Events.GuildUpdate, + async execute(oldGuild, newGuild, client) { + const botId = client.user.id; + const guildId = oldGuild.id; + const guild = oldGuild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.GuildUpdate, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antibotConfig = data[guildId]?.antiupdate; + if (!antibotConfig || antibotConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antibotConfig.type; + const permlevel = await getPermissionLevel(user, client) + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antibotConfig.action, newGuild); + await updateGuildSettings(oldGuild, newGuild); + sendlog(user, antibotConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antibotConfig.action, newGuild); + await updateGuildSettings(oldGuild, newGuild); + sendlog(user, antibotConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antibotConfig.action, newGuild); + await updateGuildSettings(oldGuild, newGuild); + sendlog(user, antibotConfig.action, guild, data); + } + }catch(err) { + console.log(err); + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-update protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-update protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-update protection'); + } + break; + case 'nothing': + break; + } +} +async function updateGuildSettings(oldGuild, newGuild) { + if (oldGuild.name !== newGuild.name) { + await newGuild.setName(oldGuild.name); + } + if (oldGuild.iconURL({ dynamic: true }) !== newGuild.iconURL({ dynamic: true })) { + await newGuild.setIcon(oldGuild.iconURL({ dynamic: true })); + } + if (oldGuild.bannerURL() !== newGuild.bannerURL()) { + await newGuild.setBanner(oldGuild.bannerURL()); + } + if (oldGuild.systemChannel !== newGuild.systemChannel) { + await newGuild.setSystemChannel(oldGuild.systemChannel); + } + if (oldGuild.systemChannelFlags !== newGuild.systemChannelFlags) { + await newGuild.setSystemChannelFlags(oldGuild.systemChannelFlags); + } + if (oldGuild.verificationLevel !== newGuild.verificationLevel) { + await newGuild.setVerificationLevel(oldGuild.verificationLevel); + } + if (oldGuild.widget !== newGuild.widget) { + await newGuild.setWidget(oldGuild.widget); + } + if (oldGuild.splashURL !== newGuild.splashURL) { + await newGuild.setSplash(oldGuild.splashURL); + } + if (oldGuild.rulesChannel !== newGuild.rulesChannel) { + await newGuild.setRulesChannel(oldGuild.rulesChannel); + } + if (oldGuild.publicUpdatesChannel !== newGuild.publicUpdatesChannel) { + await newGuild.setPublicUpdatesChannel(oldGuild.publicUpdatesChannel); + } + if (oldGuild.defaultMessageNotifications !== newGuild.defaultMessageNotifications) { + await newGuild.setDefaultMessageNotifications(oldGuild.defaultMessageNotifications); + } + if (oldGuild.afkChannel !== newGuild.afkChannel) { + await newGuild.setAFKChannel(oldGuild.afkChannel); + } + if (oldGuild.region !== newGuild.region) { + await newGuild.setRegion(oldGuild.region) + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a modifiée le serveur et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/loaders/events/antiraid.js/MessageCreate2.js b/loaders/events/antiraid.js/MessageCreate2.js new file mode 100644 index 0000000..cb994f7 --- /dev/null +++ b/loaders/events/antiraid.js/MessageCreate2.js @@ -0,0 +1,53 @@ +const sqlite3 = require('sqlite3').verbose(); +const { Events, ChannelType } = require("discord.js"); +const db = new sqlite3.Database('myDatabase.db'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.MessageCreate, + async execute(message, client) { + const botId = message.client.user.id; + const guildId = message.guild.id; + const user = message.member; + if (message.channel.type === ChannelType.DM) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antimentionConfig = data[guildId]?.antimention; + let statusMention = 'off'; + let mentionLimit = 0; + + if (antimentionConfig) { + ({ type: statusMention, nombre: mentionLimit } = antimentionConfig); + } + + if (statusMention !== "off") { + const mentionCount = message.mentions.users.size; + if (mentionLimit === 0) return; + if (mentionCount > mentionLimit) { + if (statusMention === "wl" || statusMention === "whitelist") { + if (await getPermissionLevel(user, client) >= 10) return; + if (whitelist[message.author.id]) return; + message.delete().catch(err => {}); + }else if (statusMention === "owner") { + const userlevelsawait = await getPermissionLevel(user, client) + if (userlevelsawait >= 10) return; + message.delete().catch(err => {}); + }else if (statusMention === "buyer") { + if (await getPermissionLevel(user, client) === 11) return; + if (whitelist[message.author.id]) return; + message.delete().catch(err => {}); + } + + } + } + }, +}; \ No newline at end of file diff --git a/loaders/events/antiraid.js/RoleCreate.js b/loaders/events/antiraid.js/RoleCreate.js new file mode 100644 index 0000000..8dd8f80 --- /dev/null +++ b/loaders/events/antiraid.js/RoleCreate.js @@ -0,0 +1,111 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.GuildRoleCreate, + async execute(role, client) { + const botId = client.user.id; + const guildId = role.guild.id; + const guild = role.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.RoleCreate, + limit: 1, + }); + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antiroleConfig = data[guildId]?.antirole; + if (!antiroleConfig || antiroleConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiroleConfig.type; + const permlevel = await getPermissionLevel(user, client); + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antiroleConfig.action, guild); + await role.delete('Anti-role protection'); + await sendlog(user, antiroleConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antiroleConfig.action, guild); + await role.delete('Anti-role protection'); + await sendlog(user, antiroleConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antiroleConfig.action, guild); + await role.delete('Anti-role protection'); + await sendlog(user, antiroleConfig.action, guild, data); + } + } catch (err) { + console.error(err); + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-role protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-role protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-role protection'); + } + break; + case 'nothing': + break; + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a crée un role et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/loaders/events/antiraid.js/RoleDelete.js b/loaders/events/antiraid.js/RoleDelete.js new file mode 100644 index 0000000..fb109b4 --- /dev/null +++ b/loaders/events/antiraid.js/RoleDelete.js @@ -0,0 +1,223 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.GuildRoleDelete, + async execute(role, client) { + const botId = client.user.id; + const guildId = role.guild.id; + const guild = role.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.RoleDelete, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + if (!firstEntry) return; + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antiroleConfig = data[guildId]?.antirole; + if (!antiroleConfig || antiroleConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiroleConfig.type; + const permlevel = await getPermissionLevel(user, client); + + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antiroleConfig.action, guild); + let membersWithRole = await new Promise((resolve, reject) => { + db.get('SELECT value FROM antiraid WHERE guild = ?', [guildId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value).role[role.id] : []); + }); + }); + const newRole = await role.guild.roles.create({ + data: { + name: 'TempRole', + color: role.color, + hoist: role.hoist, + permissions: role.permissions, + mentionable: role.mentionable, + position: role.position, + }, + reason: 'Anti-role protection', + }); + try { + await newRole.edit({ + name: role.name, + permissions: role.permissions, + color: role.color, + hoist: role.hoist, + mentionable: role.mentionable, + position: role.position, + }, 'Restauration du rôle supprimé'); + } catch (error) { + } + membersWithRole.forEach(async (memberId) => { + const member = guild.members.cache.get(memberId); + if (member) { + await member.roles.add(newRole, 'Anti-role protection'); + } + }); + await sendlog(user, antiroleConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antiroleConfig.action, guild); + let membersWithRole = await new Promise((resolve, reject) => { + db.get('SELECT value FROM antiraid WHERE guild = ?', [guildId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value).role[role.id] : []); + }); + }); + const newRole = await role.guild.roles.create({ + data: { + name: 'TempRole', + color: role.color, + hoist: role.hoist, + permissions: role.permissions, + mentionable: role.mentionable, + position: role.position, + }, + reason: 'Anti-role protection', + }); + try { + await newRole.edit({ + name: role.name, + permissions: role.permissions, + color: role.color, + hoist: role.hoist, + mentionable: role.mentionable, + position: role.position, + }, 'Restauration du rôle supprimé'); + } catch (error) { + } + + membersWithRole.forEach(async (memberId) => { + const member = guild.members.cache.get(memberId); + if (member) { + await member.roles.add(newRole, 'Anti-role protection'); + } + }); + await sendlog(user, antiroleConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antiroleConfig.action, guild); + let membersWithRole = await new Promise((resolve, reject) => { + db.get('SELECT value FROM antiraid WHERE guild = ?', [guildId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value).role[role.id] : []); + }); + }); + const newRole = await role.guild.roles.create({ + data: { + name: 'TempRole', + color: role.color, + hoist: role.hoist, + permissions: role.permissions, + mentionable: role.mentionable, + position: role.position, + }, + reason: 'Anti-role protection', + }); + try { + await newRole.edit({ + name: role.name, + permissions: role.permissions, + color: role.color, + hoist: role.hoist, + mentionable: role.mentionable, + position: role.position, + }, 'Restauration du rôle supprimé'); + } catch (error) { + } + membersWithRole.forEach(async (memberId) => { + const member = guild.members.cache.get(memberId); + if (member) { + await member.roles.add(newRole, 'Anti-role protection'); + } + }); + await sendlog(user, antiroleConfig.action, guild, data); + } + } catch (err) { + console.error(err); + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-role protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-role protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-role protection'); + } + break; + case 'nothing': + break; + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a modifiée un role et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/loaders/events/antiraid.js/Roleupdate.js b/loaders/events/antiraid.js/Roleupdate.js new file mode 100644 index 0000000..6f69bd9 --- /dev/null +++ b/loaders/events/antiraid.js/Roleupdate.js @@ -0,0 +1,144 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.GuildRoleUpdate, + async execute(oldRole, newRole, client) { + if (oldRole.name !== newRole.name || oldRole.permissions.bitfield !== newRole.permissions.bitfield) { + const botId = client.user.id; + const guildId = newRole.guild.id; + const guild = newRole.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.RoleUpdate, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antiroleConfig = data[guildId]?.antirole; + if (!antiroleConfig || antiroleConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiroleConfig.type; + const permlevel = await getPermissionLevel(user, client); + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antiroleConfig.action, guild); + try { + await newRole.edit({ + name: oldRole.name, + permissions: oldRole.permissions, + color: oldRole.color, + hoist: oldRole.hoist, + mentionable: oldRole.mentionable, + position: oldRole.position, + }, 'Restauration du rôle modifié'); + } catch (error) { + } + await sendlog(user, antiroleConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antiroleConfig.action, guild); + try { + await newRole.edit({ + name: oldRole.name, + permissions: oldRole.permissions, + color: oldRole.color, + hoist: oldRole.hoist, + mentionable: oldRole.mentionable, + position: oldRole.position, + }, 'Restauration du rôle modifié'); + } catch (error) { + } + await sendlog(user, antiroleConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antiroleConfig.action, guild); + try { + await newRole.edit({ + name: oldRole.name, + permissions: oldRole.permissions, + color: oldRole.color, + hoist: oldRole.hoist, + mentionable: oldRole.mentionable, + position: oldRole.position, + }, 'Restauration du rôle modifié'); + } catch (error) { + } + await sendlog(user, antiroleConfig.action, guild, data); + } + } catch (err) { + console.error(err); + } + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-role protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-role protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-role protection'); + } + break; + case 'nothing': + break; + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a supprimée un role et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/loaders/events/antiraid.js/ThreadCreate.js b/loaders/events/antiraid.js/ThreadCreate.js new file mode 100644 index 0000000..3ce9081 --- /dev/null +++ b/loaders/events/antiraid.js/ThreadCreate.js @@ -0,0 +1,112 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField , EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.ThreadCreate, + async execute(thread, okman ,client) { + const botId = client.user.id; + const guildId = thread.guild.id; + const guild = thread.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.ThreadCreate, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antiThreadConfig = data[guildId]?.antiThread; + if (!antiThreadConfig || antiThreadConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiThreadConfig.type; + const permlevel = await getPermissionLevel(user, client) + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antiThreadConfig.action, guild); + await thread.delete('Anti-thread protection'); + await sendlog(user, antiThreadConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antiThreadConfig.action, guild); + await thread.delete('Anti-thread protection'); + await sendlog(user, antiThreadConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antiThreadConfig.action, guild); + await thread.delete('Anti-thread protection'); + await sendlog(user, antiThreadConfig.action, guild, data); + } + } catch(err) { + console.error(err); + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-thread protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-thread protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-thread protection'); + } + break; + case 'nothing': + break; + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a crée un fil et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/loaders/events/antiraid.js/TreathDelete.js b/loaders/events/antiraid.js/TreathDelete.js new file mode 100644 index 0000000..18ba20d --- /dev/null +++ b/loaders/events/antiraid.js/TreathDelete.js @@ -0,0 +1,109 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField , EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.ThreadDelete, + async execute(thread ,client) { + const botId = client.user.id; + const guildId = thread.guild.id; + const guild = thread.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.ThreadDelete, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antiThreadConfig = data[guildId]?.antiThread; + if (!antiThreadConfig || antiThreadConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiThreadConfig.type; + const permlevel = await getPermissionLevel(user, client) + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antiThreadConfig.action, guild); + await sendlog(user, antiThreadConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antiThreadConfig.action, guild); + await sendlog(user, antiThreadConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antiThreadConfig.action, guild); + await sendlog(user, antiThreadConfig.action, guild, data); + } + } catch(err) { + console.error(err); + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-thread protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-thread protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-thread protection'); + } + break; + case 'nothing': + break; + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a supprimée un fil et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/loaders/events/antiraid.js/TreathUpdate.js b/loaders/events/antiraid.js/TreathUpdate.js new file mode 100644 index 0000000..eefb220 --- /dev/null +++ b/loaders/events/antiraid.js/TreathUpdate.js @@ -0,0 +1,121 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.ThreadUpdate, + async execute(oldThread, newThread, client) { + const botId = client.user.id; + const guildId = newThread.guild.id; + const guild = newThread.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.ThreadUpdate, + limit: 1, + }); + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + const antiThreadConfig = data[guildId]?.antiThread; + if (!antiThreadConfig || antiThreadConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiThreadConfig.type; + const permlevel = await getPermissionLevel(user, client) + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antiThreadConfig.action, guild); + await newThread.edit({ + name: oldThread.name, + autoArchiveDuration: oldThread.autoArchiveDuration, + reason: 'Anti-thread protection' + }); + await sendlog(user, antiThreadConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antiThreadConfig.action, guild); + await newThread.edit({ + name: oldThread.name, + autoArchiveDuration: oldThread.autoArchiveDuration, + reason: 'Anti-thread protection' + }); + await sendlog(user, antiThreadConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antiThreadConfig.action, guild); + await newThread.edit({ + name: oldThread.name, + autoArchiveDuration: oldThread.autoArchiveDuration, + reason: 'Anti-thread protection' + }); + await sendlog(user, antiThreadConfig.action, guild, data); + } + } catch(err) { + console.error(err); + } + }, +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-thread protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-thread protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-thread protection'); + } + break; + case 'nothing': + break; + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a modifiée un fil et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/loaders/events/antiraid.js/WehbookCreate.js b/loaders/events/antiraid.js/WehbookCreate.js new file mode 100644 index 0000000..cd280c7 --- /dev/null +++ b/loaders/events/antiraid.js/WehbookCreate.js @@ -0,0 +1,119 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField, EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.WebhooksUpdate, + async execute(channel, client) { + const botId = client.user.id; + const guildId = channel.guild.id; + const guild = channel.guild; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.WebhookCreate, + limit: 1, + }); + + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antiwebhookConfig = data[guildId]?.antiwebhook; + if (!antiwebhookConfig || antiwebhookConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiwebhookConfig.type; + const permlevel = await getPermissionLevel(user, client); + + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antiwebhookConfig.action, guild); + const webhookId = firstEntry.targetId; + const webhook = await client.fetchWebhook(webhookId); + await webhook.delete('Anti-webhook protection'); + await sendlog(user, antiwebhookConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antiwebhookConfig.action, guild); + const webhookId = firstEntry.targetId; + const webhook = await client.fetchWebhook(webhookId); + await webhook.delete('Anti-webhook protection'); + await sendlog(user, antiwebhookConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antiwebhookConfig.action, guild); + const webhookId = firstEntry.targetId; + const webhook = await client.fetchWebhook(webhookId); + await webhook.delete('Anti-webhook protection'); + await sendlog(user, antiwebhookConfig.action, guild, data); + } + } catch (err) { + } + }, +}; + + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-webhook protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-webhook protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-webhook protection'); + } + break; + case 'nothing': + break; + } +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a crée un webhook et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/loaders/events/antiraid.js/alerteping.js b/loaders/events/antiraid.js/alerteping.js new file mode 100644 index 0000000..3406180 --- /dev/null +++ b/loaders/events/antiraid.js/alerteping.js @@ -0,0 +1,43 @@ +const {EmbedBuilder , PermissionsBitField , Events } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: Events.GuildMemberUpdate, + async execute(oldMember, newMember, client) { + const guildId = newMember.guild.id + if (!oldMember.permissions.has(PermissionsBitField.Flags.Administrator) && newMember.permissions.has(PermissionsBitField.Flags.Administrator)) { + + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + if (!data[newMember.guild.id]) { + data[newMember.guild.id] = {}; + } + + if (data[newMember.guild.id].alerte === 'on') { + const raidlogChannelId = data[newMember.guild.id].raidlog; + const raidlogChannel = newMember.guild.channels.cache.get(raidlogChannelId); + const raidMessage = data[newMember.guild.id].raidping || 'Aucun message de raid configuré.'; + + if (raidlogChannel) { + const embed = new EmbedBuilder() + .setTitle('Alerte de permissions') + .setDescription(`${newMember.user.tag} a reçu des permissions d'administrateur.`) + .setColor(0xff0000); + try { + await raidlogChannel.send({ content: raidMessage, embeds: [embed] }); + } catch (error) { + } + } + } + } + }, +}; \ No newline at end of file diff --git a/loaders/events/antiraid.js/guildMemberupdate.js b/loaders/events/antiraid.js/guildMemberupdate.js new file mode 100644 index 0000000..d0d9fa2 --- /dev/null +++ b/loaders/events/antiraid.js/guildMemberupdate.js @@ -0,0 +1,186 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, AuditLogEvent, PermissionsBitField , EmbedBuilder } = require('discord.js'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.GuildMemberUpdate, + async execute(oldMember, newMember, client) { + const botId = client.user.id; + const guildId = newMember.guild.id; + const guild = newMember.guild; + if (!oldMember.permissions.has(PermissionsBitField.Flags.Administrator) && newMember.permissions.has(PermissionsBitField.Flags.Administrator)) { + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.MemberRoleUpdate, + limit: 1, + }); + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antiadminConfig = data[guildId]?.antiadmin; + if (!antiadminConfig || antiadminConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiadminConfig.type; + const permlevel = await getPermissionLevel(user, client); + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + ]; + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + const member = guild.members.cache.get(newMember.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-admin protection'); + } + punish(user, antiadminConfig.action, guild); + } else if (type === "owner") { + if (permlevel >= 10) return; + const member = guild.members.cache.get(newMember.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-admin protection'); + } + punish(user, antiadminConfig.action, guild); + } else if (type === "buyer") { + if (permlevel === 11) return; + const member = guild.members.cache.get(newMember.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-admin protection'); + } + punish(user, antiadminConfig.action, guild); + } + } catch (err) { + } + }else { + const addedRoles = newMember.roles.cache.filter(role => !oldMember.roles.cache.has(role.id)); + const removedRoles = oldMember.roles.cache.filter(role => !newMember.roles.cache.has(role.id)); + + if (addedRoles.size === 0 && removedRoles.size === 0) return; + const fetchedLogs = await guild.fetchAuditLogs({ + type: AuditLogEvent.MemberRoleUpdate, + limit: 1, + }); + const firstEntry = fetchedLogs.entries.first(); + const user = guild.members.cache.get(`${firstEntry.executor.id}`); + if (user.id === newMember.client.user.id) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antiRoleConfig = data[guildId]?.antirole; + if (!antiRoleConfig || antiRoleConfig.type === 'off') { + return; + } + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const type = antiRoleConfig.type; + const permlevel = await getPermissionLevel(user, newMember.client); + try { + if (type === "whitelist") { + if (permlevel >= 10) return; + if (whitelist[user.id]) return; + punish(user, antiRoleConfig.action, guild); + await removeAddedRoles(newMember, addedRoles); + await addRemovedRoles(newMember, removedRoles); + await sendlog(user, antiRoleConfig.action, guild, data); + } else if (type === "owner") { + if (permlevel >= 10) return; + punish(user, antiRoleConfig.action, guild); + await removeAddedRoles(newMember, addedRoles); + await addRemovedRoles(newMember, removedRoles); + await sendlog(user, antiRoleConfig.action, guild, data); + } else if (type === "buyer") { + if (permlevel === 11) return; + punish(user, antiRoleConfig.action, guild); + await removeAddedRoles(newMember, addedRoles); + await addRemovedRoles(newMember, removedRoles); + await sendlog(user, antiRoleConfig.action, guild, data); + } + } catch (err) { + console.error(err); + } + + } +} +}; + +async function punish(user, action, guild) { + switch (action) { + case 'ban': + await guild.members.ban(user, { reason: 'Anti-admin protection' }); + break; + case 'kick': + await guild.members.kick(user, 'Anti-admin protection'); + break; + case 'derank': + const dangerousPermissions = [ + PermissionsBitField.Flags.Administrator, + PermissionsBitField.Flags.ManageGuild, + PermissionsBitField.Flags.ManageRoles, + PermissionsBitField.Flags.ManageChannels, + PermissionsBitField.Flags.KickMembers, + PermissionsBitField.Flags.BanMembers, + PermissionsBitField.Flags.ManageWebhooks, + PermissionsBitField.Flags.MuteMembers, + PermissionsBitField.Flags.MentionEveryone, + PermissionsBitField.Flags.ManageEvents, + PermissionsBitField.Flags.ManageThreads, + ]; + const member = guild.members.cache.get(user.id); + if (member) { + const rolesToRemove = member.roles.cache.filter(role => dangerousPermissions.includes(role.permissions.bitfield)); + await member.roles.remove(rolesToRemove, 'Anti-admin protection'); + } + break; + case 'nothing': + break; + } +} +async function removeAddedRoles(member, addedRoles) { + await member.roles.remove(addedRoles, 'Anti-role protection'); +} + +async function addRemovedRoles(member, removedRoles) { + await member.roles.add(removedRoles, 'Anti-role protection'); +} +async function sendlog(user, action, guild, data) { + if (!data[guild.id]) { + data[guild.id] = {}; + } + const channelid = data[guild.id]?.raidlog; + if(channelid) { + const logChannel = guild.channels.cache.get(channelid); + if (!logChannel) return ; + + const embed = new EmbedBuilder() + .setDescription(`L'utilisateur <@${user.id}> a ajoutée un role et a été \`${action}\`.`) + .setColor('#ADD8E6') + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/loaders/events/antiraid.js/messageCreate.js b/loaders/events/antiraid.js/messageCreate.js new file mode 100644 index 0000000..830484b --- /dev/null +++ b/loaders/events/antiraid.js/messageCreate.js @@ -0,0 +1,89 @@ +const sqlite3 = require('sqlite3').verbose(); +const { Events, ChannelType, EmbedBuilder } = require("discord.js"); +const db = new sqlite3.Database('myDatabase.db'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); + +module.exports = { + name: Events.MessageCreate, + async execute(message, client) { + const botId = message.client.user.id; + const guildId = message.guild.id; + + if (message.channel.type === ChannelType.DM) return; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const antieveryoneConfig = data[guildId]?.antieveryone; + const antileakConfig = data[guildId]?.antileak; + const antimentionConfig = data[guildId]?.antimention; + let statusEveryone = 'off'; + let statusLeak = 'off'; + let statusMention = 'off'; + let mentionLimit = 0; + + if (antieveryoneConfig) { + ({ status: statusEveryone } = antieveryoneConfig); + } + + if (antileakConfig) { + ({ status: statusLeak } = antileakConfig); + } + if (antimentionConfig) { + ({ status: statusMention, nombre: mentionLimit } = antimentionConfig); + } + if (statusEveryone === "off" && statusLeak === "off") return; + + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const user = message.member; + + if (statusEveryone !== "off" && message.content.includes('@everyone')) { + if(message.author.id === client.user.id)return; + if (statusEveryone === "on") { + if (await getPermissionLevel(user, client) >= 10) return; + if (whitelist[message.author.id]) return; + message.delete().catch(err => {; + }); + } else if (statusEveryone === "max") { + const levelperm = await getPermissionLevel(user, client); + if (levelperm >= 10) return; + message.delete().catch(err => {; + }); + } + } + + if (statusLeak !== "off") { + if (message.author.bot) return; + const ipRegex = /\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/; + const phoneRegex = /\b(?:\+?(\d{1,3}))?[-. (]*(?:\d{1,4})[-. )]*(\d{1,3})[-. ]*(\d{2,4})\b/; + const addressRegex = /\b\d{1,5} [\w\s]+(?:, [\w\s]+)*\b/; + const cardRegex = /\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9]{2})[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})\b/; + + const cardMatch = message.content.match(cardRegex); + const ipMatch = message.content.match(ipRegex); + const phoneMatch = message.content.match(phoneRegex); + const addressMatch = message.content.match(addressRegex); + + if (ipMatch || phoneMatch || addressMatch || cardMatch) { + if (statusLeak === 'on') { + if (await getPermissionLevel(user, client) >= 10) return; + if (whitelist[message.author.id]) return; + message.delete().catch(err => {}); + } else if (statusLeak === 'max') { + const levelperm = await getPermissionLevel(user, client); + if (levelperm >= 10) return; + message.delete().catch(err => {}); + } + } + } + }, +}; \ No newline at end of file diff --git a/loaders/events/antiraid.js/ready.js b/loaders/events/antiraid.js/ready.js new file mode 100644 index 0000000..8577366 --- /dev/null +++ b/loaders/events/antiraid.js/ready.js @@ -0,0 +1,49 @@ +const sqlite3 = require('sqlite3').verbose(); +const { Events } = require('discord.js'); + +module.exports = { + name: Events.ClientReady, + async execute(client) { + const db = new sqlite3.Database('myDatabase.db', (err) => { + if (err) { + console.error(err.message); + } + console.log('Connected to the SQLite database.'); + }); + + async function recordMembersWithRole(guild) { + if (!guild) return; + + + const roles = guild.roles.cache; + + let data = { + role: {} + }; + roles.forEach(role => { + const membersWithRole = role.members.map(member => member.id); + data.role[role.id] = membersWithRole; + }); + + db.run('INSERT OR REPLACE INTO antiraid (guild, value) VALUES (?, ?)', [guild.id, JSON.stringify(data)], (err) => { + if (err) { + console.error(err.message); + } + }); + } + + function scheduleRoleRecording() { + client.guilds.cache.forEach(guild => { + recordMembersWithRole(guild); + }); + + setInterval(() => { + client.guilds.cache.forEach(guild => { + recordMembersWithRole(guild); + }); + }, 2 * 60 * 60 * 1000); + } + + scheduleRoleRecording(); + }, +}; \ No newline at end of file diff --git a/loaders/events/auto/addreact.js b/loaders/events/auto/addreact.js new file mode 100644 index 0000000..60071db --- /dev/null +++ b/loaders/events/auto/addreact.js @@ -0,0 +1,36 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events } = require("discord.js"); +module.exports = { + name: Events.MessageReactionAdd, + async execute(reaction, user, client) { + if (user.bot) return; + const messageId = reaction.message.id; + const emoji = reaction.emoji.toString(); + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const roleDataArray = data[reaction.message.guild.id]?.rolereact?.[messageId]; + if (!Array.isArray(roleDataArray)) { + return; + } + + const roleData = roleDataArray.find(r => r.emoji === emoji); + if (!roleData) return; + + const role = reaction.message.guild.roles.cache.get(roleData.roleId); + if (!role) return; + + const member = reaction.message.guild.members.cache.get(user.id); + if (!member) return; + await member.roles.add(role); + + }, +}; diff --git a/loaders/events/auto/autoreact.js b/loaders/events/auto/autoreact.js new file mode 100644 index 0000000..81fb5fb --- /dev/null +++ b/loaders/events/auto/autoreact.js @@ -0,0 +1,27 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events } = require("discord.js"); +module.exports = { + name: Events.MessageCreate, + async execute(message) { + if (message.author.bot) return; + db.get('SELECT value FROM gestion WHERE id = ?', [message.client.user.id], async (err, row) => { + if (err) { + console.error(err.message); + return; + } + + const data = row ? JSON.parse(row.value) : {}; + const guildData = data[message.guild.id]; + + if (guildData && guildData.autoreact && guildData.autoreact[message.channel.id]) { + const emojis = guildData.autoreact[message.channel.id]; + + try { + await Promise.all(emojis.map(emoji => message.react(emoji))); + } catch (error) { + } + } + }); + }, +}; \ No newline at end of file diff --git a/loaders/events/auto/buttonrolevent.js b/loaders/events/auto/buttonrolevent.js new file mode 100644 index 0000000..2f56337 --- /dev/null +++ b/loaders/events/auto/buttonrolevent.js @@ -0,0 +1,31 @@ +const {Events } = require("discord.js") + +module.exports = { + name: Events.InteractionCreate, + async execute(interaction, client) { + const botId = client.user.id; + const customId = interaction.customId; + if (customId == undefined || customId === null) return; + if (!customId.startsWith('rolebuttons_')) return; + + const roleId = customId.split('_')[1]; + const role = interaction.guild.roles.cache.get(roleId); + + if (!role) { + return; + } + + const member = interaction.member; + if (!member) { + return; + } + + if (member.roles.cache.has(role.id)) { + await member.roles.remove(role); + await interaction.reply({ content: `Le rôle ${role.name} a été retiré.`, ephemeral: true }); + } else { + await member.roles.add(role); + await interaction.reply({ content: `Le rôle ${role.name} a été ajouté.`, ephemeral: true }); + } + }, +}; \ No newline at end of file diff --git a/loaders/events/auto/removereact.js b/loaders/events/auto/removereact.js new file mode 100644 index 0000000..265e092 --- /dev/null +++ b/loaders/events/auto/removereact.js @@ -0,0 +1,37 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events } = require("discord.js"); + +module.exports = { + name: Events.MessageReactionRemove, + async execute(reaction, user, client) { + if (user.bot) return; + const messageId = reaction.message.id; + const emoji = reaction.emoji.toString(); + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const roleDataArray = data[reaction.message.guild.id]?.rolereact?.[messageId]; + if (!Array.isArray(roleDataArray)) { + return; + } + + const roleData = roleDataArray.find(r => r.emoji === emoji); + if (!roleData) return; + + const role = reaction.message.guild.roles.cache.get(roleData.roleId); + if (!role) return; + + const member = reaction.message.guild.members.cache.get(user.id); + if (!member) return; + await member.roles.remove(role); + + }, +}; \ No newline at end of file diff --git a/loaders/events/client/interactionCreate.js b/loaders/events/client/interactionCreate.js new file mode 100644 index 0000000..907fcb8 --- /dev/null +++ b/loaders/events/client/interactionCreate.js @@ -0,0 +1,11 @@ +const { Events, InteractionType } = require("discord.js"); + +module.exports = { + name: Events.InteractionCreate, + async execute(client, interaction) { + if (interaction.type === InteractionType.ApplicationCommand) { + const command = client.commands.get(interaction.commandName); + await command.execute(interaction, client); + } + }, +}; diff --git a/loaders/events/client/ready.js b/loaders/events/client/ready.js new file mode 100644 index 0000000..c9fc0ac --- /dev/null +++ b/loaders/events/client/ready.js @@ -0,0 +1,167 @@ +const sqlite3 = require('sqlite3').verbose(); +const { Events } = require('discord.js'); +const permissions = require('../../permissions.json'); + +module.exports = { + name: Events.ClientReady, + async execute(client) { + const db = new sqlite3.Database('myDatabase.db', (err) => { + if (err) { + console.error(err.message); + } + console.log('Connected to the SQLite database.'); + }); + const backupdb = new sqlite3.Database('backups.db', (err) => { + if (err) { + console.error(err.message); + } + }); + + + + await new Promise((resolve, reject) => { + db.serialize(() => { + db.run('CREATE TABLE IF NOT EXISTS gestion (id TEXT PRIMARY KEY, value TEXT)', (err) => { + if (err) { + console.error(err.message); + reject(err); + } else { + } + }); + + db.run('CREATE TABLE IF NOT EXISTS prevname (id TEXT PRIMARY KEY, value TEXT)', (err) => { + if (err) { + console.error(err.message); + reject(err); + } else { + } + }); + backupdb.run(`CREATE TABLE IF NOT EXISTS backups ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + botId TEXT NOT NULL, + backupId TEXT NOT NULL, + createdAt TEXT NOT NULL + )`, (err) => { + if (err) { + console.error(err.message); + reject(err); + } else { + } + }); + db.run(` + CREATE TABLE IF NOT EXISTS warnings ( + guildId TEXT NOT NULL, + userId TEXT NOT NULL, + warningId INTEGER NOT NULL, + reason TEXT NOT NULL, + timestamp INTEGER NOT NULL, + PRIMARY KEY (guildId, userId, warningId) + ); + `, (err) => { + if (err) { + console.error(err.message); + } else { + } + }); + db.run(`CREATE TABLE IF NOT EXISTS status ( + botId TEXT PRIMARY KEY, + type TEXT NOT NULL, + status TEXT NOT NULL +);`, (err) => { + if (err) { + console.error(err.message); + } else { + } +}); +db.run(`CREATE TABLE IF NOT EXISTS master ( + id TEXT PRIMARY KEY, + value TEXT +);`, (err) => { + if (err) { + console.error(err.message); + } + +}); +db.run(`CREATE TABLE IF NOT EXISTS antiraid ( + guild TEXT PRIMARY KEY, + value TEXT +);`, (err) => { + if (err) { + console.error(err.message); + } + +}); +db.run(`CREATE TABLE IF NOT EXISTS invitations ( + guild_id TEXT NOT NULL, + member_id TEXT NOT NULL, + invite_count INTEGER NOT NULL DEFAULT 0, + PRIMARY KEY (guild_id, member_id) +);;`, (err) => { + if (err) { + console.error(err.message); + } + +}); + + + db.get('SELECT value FROM gestion WHERE id = ?', [client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } else { + let permissionsData = row ? JSON.parse(row.value) : {}; + if (!permissionsData.permissions || Object.keys(permissionsData.permissions).length === 0) { + permissionsData.permissions = permissions; + const permissionsJson = JSON.stringify(permissionsData); + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [client.user.id, permissionsJson], (err) => { + if (err) { + console.error(err.message); + reject(err); + } else { + console.log(`Les permissions ont été chargées pour le bot ${client.user.tag}`); + resolve(); + } + }); + } else { + console.log(`Les permissions existent déjà pour le bot ${client.user.tag}`); + resolve(); + } + } + }); + }); + }); + client.snipes = new Map(); + console.log(`Le bot ${client.user.tag} est en ligne +lien d'invite > https://discord.com/oauth2/authorize?client_id=${client.user.id}&scope=bot&permissions=8`); + +//AntiCrash +process.on('unhandledRejection', (error) => { + console.log(' [antiCrash] :: Unhandled Rejection/Catch'); + console.log(error); +}); + +process.on("uncaughtException", (error, origin) => { + console.log(' [antiCrash] :: Uncaught Exception/Catch'); + console.log(error); + console.log('Information supplémentaire:', origin); +}); + +process.on('uncaughtExceptionMonitor', (error, origin) => { + console.log(' [antiCrash] :: Uncaught Exception Monitor/Catch'); + console.log(error); + console.log('Information supplémentaire:', origin); +}); + +process.on('beforeExit', (code) => { + console.log(' [antiCrash] :: Before Exit'); + console.log('Code de sortie:', code); +}); + +process.on('exit', (code) => { + console.log(' [antiCrash] :: Exit'); + console.log('Code de sortie:', code); +}); + + }, +}; \ No newline at end of file diff --git a/loaders/events/client/setstatusready.js b/loaders/events/client/setstatusready.js new file mode 100644 index 0000000..8769ff9 --- /dev/null +++ b/loaders/events/client/setstatusready.js @@ -0,0 +1,63 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const { Events, ActivityType } = require('discord.js'); + +module.exports = { + name: Events.ClientReady, + async execute(client) { + + db.get('SELECT type, status FROM status WHERE botId = ?', [client.user.id], (err, row) => { + if (err) { + console.error(err.message); + return; + } + if (row) { + const { type, status } = row; + const url = 'https://www.twitch.tv/valou336_ytb'; + if (type === 'playing') { + client.user.setPresence({ + activities: [{ + name: status, + type: ActivityType.Playing, + url: url + }] + }); + } else if (type === 'streaming') { + client.user.setPresence({ + activities: [{ + name: status, + type: ActivityType.Streaming, + url: url + }] + }); + } else if (type === 'listening') { + client.user.setPresence({ + activities: [{ + name: status, + type: ActivityType.Listening, + url: url + }] + }); + } else if (type === 'watching') { + client.user.setPresence({ + activities: [{ + name: status, + type: ActivityType.Watching, + url: url + }] + }); + } else if (type === 'competing') { + client.user.setPresence({ + activities: [{ + name: status, + type: ActivityType.Competing, + url: url + }] + }); + } + + } else { + } + }); + }, +}; \ No newline at end of file diff --git a/loaders/events/gestion/ButtonGestion.js b/loaders/events/gestion/ButtonGestion.js new file mode 100644 index 0000000..4fb3b02 --- /dev/null +++ b/loaders/events/gestion/ButtonGestion.js @@ -0,0 +1,158 @@ +const {Events , ModalBuilder, TextInputStyle, ActionRowBuilder, TextInputBuilder , EmbedBuilder, ButtonBuilder, ButtonStyle} = require("discord.js") +const sqlite3 = require('sqlite3').verbose(); +const db2 = new sqlite3.Database('myDatabase.db'); +const paginationEmbed = require('discordjs-button-pagination'); + +module.exports = { + name: Events.InteractionCreate, + async execute(interaction, client) { + const botId = client.user.id; + let owners = await new Promise((resolve, reject) => { + db2.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value).owners || {} : {}); + }); + }); + if (!interaction.isButton()) return; + if (interaction.customId.startsWith('deletesuggestion_')) { + const userId= interaction.customId.split('_')[1]; + if (interaction.user.id !== userId && !Object.keys(owners).includes(interaction.user.id)) { + await interaction.reply({ content: "vous n'avez pas la permission de supprimer cette suggestion.", ephemeral: true }); + return; + } + await interaction.message.delete(); + } else if (interaction.customId.startsWith('deleteprevnames_')) { + const userId = interaction.customId.split('_')[1]; + if (interaction.user.id !== userId) { + await interaction.reply({ content: "vous n'avez pas la permission de supprimer cette suggestion.", ephemeral: true }); + return; + } + + let hasPrevname = await new Promise((resolve, reject) => { + db2.get('SELECT value FROM prevname WHERE id = ?', [userId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row !== undefined); + }); + }); + + if (!hasPrevname) { + await interaction.reply({ content: "Vous n'avez aucun prevname à supprimer.", ephemeral: true }); + return; + } + + db2.run('DELETE FROM prevname WHERE id = ?', [userId], (err) => { + if (err) { + console.error(err.message); + } else { + interaction.reply({ content: "Vos prevname ont été correctement supprimés.", ephemeral: true }); + } + }); + } else if (interaction.customId.startsWith('addconfession_')) { + + let data = await new Promise((resolve, reject) => { + db2.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + const guildId= interaction.customId.split('_')[1]; + const userId = interaction.user.id; + let Modal = new ModalBuilder() + .setCustomId('confession') + .setTitle(`${client.user.username} - Confession`); + + let question1 = new TextInputBuilder() + .setCustomId('messageconfession') + .setLabel("Quel est votre confession") + .setRequired(true) + .setPlaceholder('Indiquez la description ici') + .setStyle(TextInputStyle.Paragraph); + + let question2 = new TextInputBuilder() + .setCustomId('status') + .setLabel("Vous voulez reste anonyme") + .setRequired(true) + .setPlaceholder('Indiquez par oui ou non') + .setStyle(TextInputStyle.Short); + + let actionRow1 = new ActionRowBuilder().addComponents(question1); + let actionRow2 = new ActionRowBuilder().addComponents(question2); + + Modal.addComponents(actionRow1, actionRow2); + + await interaction.showModal(Modal); + let reponse = await interaction.awaitModalSubmit({time: 300000}) + let ConfessionMessageToSend = reponse.fields.getTextInputValue('messageconfession') + let ConfidentielAuthor = reponse.fields.getTextInputValue('status') + let isConfidential = !ConfidentielAuthor.toLowerCase().startsWith('n'); + data.confession = data.confession || {}; + data.confession.channel = data.confession.channel || {}; + const channelId = data.confession.channel[guildId]; + + const embed = new EmbedBuilder() + .setTitle('**Nouvelle Confession**') + .setDescription(ConfessionMessageToSend) + .setFooter({text: `${client.user.username} - ${interaction.guild.name}`}) + .setColor('#0099ff'); + if (!isConfidential) { + embed.setAuthor({ name: interaction.user.username, iconURL: interaction.user.displayAvatarURL() }) + } else { + embed.setAuthor({ name: 'Confidentiel' }); + } + + if (channelId) { + const channel = interaction.guild.channels.cache.get(channelId); + channel.send({ embeds: [embed] }); + } else { + console.error(`Le salon avec l'ID ${channelId} n'a pas été trouvé.`); + } +} else if (interaction.customId.startsWith('acceptmarriage_')) { + const userId1 = interaction.customId.split('_')[1]; + const userId2 = interaction.customId.split('_')[2]; + const userIdFromInteractionStr = String(interaction.user.id); + const userId1Str = String(userId1); + + + if (userIdFromInteractionStr !== userId1Str) { + await interaction.reply({ content: "vous n'avez pas la permission d'interagir.", ephemeral: true }); + return; + } + try { + await registerMarriage(userId1, userId2, client); + }catch(err){ + } + + await interaction.reply({ content: '💒 Vous êtes maintenant mariés! 💒'}); +} + }, +}; +async function registerMarriage(userId1, userId2, client) { + let data = await new Promise((resolve, reject) => { + db2.get('SELECT value FROM gestion WHERE id = ?', [client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + data.marry = data.marry || []; + data.marry.push(`${userId1}_${userId2}`); + data.marry.push(`${userId2}_${userId1}`); + + db2.run('UPDATE gestion SET value = ? WHERE id = ?', [JSON.stringify(data), client.user.id], function(err) { + if (err) { + + } + }); +} diff --git a/loaders/events/gestion/Voice.js b/loaders/events/gestion/Voice.js new file mode 100644 index 0000000..3408fd6 --- /dev/null +++ b/loaders/events/gestion/Voice.js @@ -0,0 +1,53 @@ +const { Events, EmbedBuilder } = require("discord.js"); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +module.exports = { + name: Events.VoiceStateUpdate, + once: false, + async execute(oldState, newState, client) { + // Ignorer les changements de salon vocal pour les bots + if (oldState.member.user.bot || newState.member.user.bot) return; + + // Récupérer les données de configuration des logs pour le serveur + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + // Vérifier si le serveur a un canal de logs configuré pour les salons vocaux + if (!data[oldState.guild.id] || !data[oldState.guild.id].vocallog) return; + + const logChannelId = data[oldState.guild.id].vocallog; + const logChannel = client.channels.cache.get(logChannelId); + + if (!logChannel) return; + + const joinedVoiceChannel = newState.channel; + const leftVoiceChannel = oldState.channel; + + if (joinedVoiceChannel) { + const embed = new EmbedBuilder() + .setDescription(`${newState.member.user.tag} a rejoint le salon vocal <#${joinedVoiceChannel.id}>`) + .setTimestamp(); + + try { + await logChannel.send({ embeds: [embed] }); + } catch (error) { + } + } else if (leftVoiceChannel) { + const embed = new EmbedBuilder() + .setDescription(`${oldState.member.user.tag} a quitté le salon vocal <#${leftVoiceChannel.id}>`) + .setTimestamp(); + + try { + await logChannel.send({ embeds: [embed] }); + } catch (error) { + } + } + }, +}; \ No newline at end of file diff --git a/loaders/events/gestion/badwordEvent.js b/loaders/events/gestion/badwordEvent.js new file mode 100644 index 0000000..3a3b249 --- /dev/null +++ b/loaders/events/gestion/badwordEvent.js @@ -0,0 +1,36 @@ +const { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, ChannelType } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const { Events } = require("discord.js"); +const db = new sqlite3.Database('myDatabase.db'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); +module.exports = { + name: Events.MessageCreate, + async execute(message, client) { + const botId = message.client.user.id; + const guildId = message.guild.id; + const user = message.member; + if (message.channel.type === ChannelType.DM) return; + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + if (!data[guildId]) { + data[guildId] = { badwords: [] }; + } + const badwords = data[guildId].badwords || []; + const containsBadword = badwords.some(word => message.content.toLowerCase().includes(word.toLowerCase())); + + if (containsBadword) { + if (message.author.id === client.user.id || await getPermissionLevel(user, client) >= 10) return; + try { + await message.delete({ reason: 'Contient un mot interdit' }); + } catch (error) { + } + } + }, +}; \ No newline at end of file diff --git a/loaders/events/gestion/bl.js b/loaders/events/gestion/bl.js new file mode 100644 index 0000000..402891a --- /dev/null +++ b/loaders/events/gestion/bl.js @@ -0,0 +1,35 @@ +const { Events , EmbedBuilder } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: Events.GuildMemberAdd, + async execute(member, client) { + const botId = client.user.id; + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + const blacklist = data.blacklist || {}; + if (blacklist[member.id]) { + try { + await member.ban({ reason: 'Blacklisted ' }); + const embed = new EmbedBuilder() + .setColor('#ff0000') + .setDescription(`L'utilisateur <@${member.id}> a été banni pour être sur la blacklist.`); + const raidLogChannelId = data[member.guild.id].raidlog; + const raidLogChannel = member.guild.channels.cache.get(raidLogChannelId); + if (raidLogChannel) { + raidLogChannel.send({ embeds: [embed] }); + } + } catch (error) { + } + } + }, +}; + diff --git a/loaders/events/gestion/greet.js b/loaders/events/gestion/greet.js new file mode 100644 index 0000000..e283cdb --- /dev/null +++ b/loaders/events/gestion/greet.js @@ -0,0 +1,45 @@ +const sqlite3 = require('sqlite3').verbose(); +const { Events } = require("discord.js"); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: Events.GuildMemberAdd, + async execute(member) { + const botId = member.client.user.id; + const guildId = member.guild.id; + + let greet = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + const guildGreetings = greet[guildId] || []; + + if (guildGreetings.length > 0) { + const welcomeMessage = `Bienvenue <@${member.id}> sur le serveur ${member.guild.name} !`; + const messagePromises = []; + for (const greeting of guildGreetings) { + try { + const channel = await member.guild.channels.fetch(greeting.channelId); + if (channel && channel.type === 0) { + messagePromises.push( + channel.send(welcomeMessage) + .then(message => { + setTimeout(() => message.delete(), 1000); + }) + ); + } + } catch (error) { + } + } + try { + await Promise.all(messagePromises); + } catch (error) { + } + } + }, +}; \ No newline at end of file diff --git a/loaders/events/gestion/guildMemberUpdate.js b/loaders/events/gestion/guildMemberUpdate.js new file mode 100644 index 0000000..db6f938 --- /dev/null +++ b/loaders/events/gestion/guildMemberUpdate.js @@ -0,0 +1,68 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +const {Events, EmbedBuilder} = require("discord.js") +module.exports = { + name: Events.GuildMemberUpdate, + async execute(oldMember, newMember, client) { + const botId = client.user.id; + const guildId = newMember.guild.id; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + let blrank = data[guildId] && data[guildId].blrank ? data[guildId].blrank : {}; + + if (blrank[newMember.id]) { + const addedRoles = newMember.roles.cache.filter(role => !oldMember.roles.cache.has(role.id)); + addedRoles.forEach(async role => { + try { + await newMember.roles.remove(role); + } catch (error) { + } + }); + return; + } + let limitedRoles = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [`${botId}.${guildId}.rolelimits`], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : []); + }); + }); + + if (!Array.isArray(limitedRoles)) { + limitedRoles = []; + } + + const addedRoles = newMember.roles.cache.filter(role => !oldMember.roles.cache.has(role.id)); + + addedRoles.forEach(async role => { + const limitedRole = limitedRoles.find(r => r.id === role.id); + if (limitedRole) { + const memberCount = newMember.guild.members.cache.filter(m => m.roles.cache.has(role.id)).size; + if (limitedRole.limit === 0) { + try { + await newMember.roles.remove(role); + } catch (error) { + } + } + if (memberCount > limitedRole.limit) { + try { + await newMember.roles.remove(role); + } catch (error) { + } + } + } + }); + + }, +}; \ No newline at end of file diff --git a/loaders/events/gestion/joinevent.js b/loaders/events/gestion/joinevent.js new file mode 100644 index 0000000..7136bec --- /dev/null +++ b/loaders/events/gestion/joinevent.js @@ -0,0 +1,66 @@ +const { ChannelType, Events } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: Events.GuildMemberAdd, + async execute(member) { + const guildId = member.guild.id; + const botId = member.client.user.id; + + function replacePlaceholders(message, member) { + return message + .replace('{MemberMention}', member.toString()) + .replace('{MemberName}', member.user.username) + .replace('{MemberDisplayName}', member.displayName) + .replace('{MemberJoinedAt}', member.joinedAt.toLocaleDateString()) + .replace('{MemberID}', member.id) + .replace('{MemberPic}', member.user.displayAvatarURL({ dynamic: true })) + .replace('{MemberCreatedAt}', member.user.createdAt.toLocaleDateString()) + .replace('{ServerMembersCount}', member.guild.memberCount) + .replace('{ServerName}', member.guild.name); + } + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + data = data[guildId]?.join || {}; + + try { + if (data.dm) { + const dmChannel = await member.createDM(); + const formattedMessage = replacePlaceholders(data.dm, member); + await dmChannel.send(formattedMessage); + } + } catch (err) { + } + + try { + if (data.salon && data.message) { + const channel = member.guild.channels.cache.get(data.salon); + if (channel && channel.type === ChannelType.GuildText) { + const formattedMessage = replacePlaceholders(data.message, member); + await channel.send(formattedMessage); + } + } + } catch (err) { + } + + try { + if (data.role) { + const role = member.guild.roles.cache.get(data.role); + if (role) { + await member.roles.add(role); + } + } + } catch (err) { + } + }, +}; \ No newline at end of file diff --git a/loaders/events/gestion/leaveevent.js b/loaders/events/gestion/leaveevent.js new file mode 100644 index 0000000..b9eb74f --- /dev/null +++ b/loaders/events/gestion/leaveevent.js @@ -0,0 +1,49 @@ +const { ChannelType, Events } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: Events.GuildMemberRemove, + async execute(member) { + const guildId = member.guild.id; + const botId = member.client.user.id; + + function replacePlaceholders(message, member) { + return message + .replace('{MemberMention}', member.toString()) + .replace('{MemberName}', member.user.username) + .replace('{MemberDisplayName}', member.displayName) + .replace('{MemberJoinedAt}', member.joinedAt.toLocaleDateString()) + .replace('{MemberID}', member.id) + .replace('{MemberPic}', member.user.displayAvatarURL({ dynamic: true })) + .replace('{MemberCreatedAt}', member.user.createdAt.toLocaleDateString()) + .replace('{ServerMembersCount}', member.guild.memberCount) + .replace('{ServerName}', member.guild.name); + } + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + data = data[guildId]?.leave || {}; + + try { + if (data.salon && data.message) { + const channel = member.guild.channels.cache.get(data.salon); + if (channel && channel.type === ChannelType.GuildText) { + const formattedMessage = replacePlaceholders(data.message, member); + await channel.send(formattedMessage); + } + } + } catch (err) { + } + + + }, +}; \ No newline at end of file diff --git a/loaders/events/gestion/memberconnecte.js b/loaders/events/gestion/memberconnecte.js new file mode 100644 index 0000000..f5e2ff6 --- /dev/null +++ b/loaders/events/gestion/memberconnecte.js @@ -0,0 +1,46 @@ +const sqlite3 = require('sqlite3').verbose(); +const { Events } = require("discord.js"); + +// Setup SQLite3 database connection +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: Events.VoiceStateUpdate, + async execute(oldState, newState) { + if (!oldState.channelId && newState.channelId) { + const guildId = newState.guild.id; + const botId = newState.client.user.id; + const channelId = newState.channelId; + + // Query the bot's data from the SQLite3 database + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + // Access the specific guild's rolevocal data + let rolevocal = data.rolevocal || {}; + let guildRoles = rolevocal[guildId] || {}; + let channelRoles = guildRoles[channelId] || []; + + if (channelRoles.length > 0) { + const member = newState.member; + for (const roleId of channelRoles) { + const role = newState.guild.roles.cache.get(roleId); + if (role) { + try { + await member.roles.add(role); + } catch (error) { + console.error(`Erreur lors de l'ajout du rôle ${roleId} à l'utilisateur ${member.id}:`, error); + } + } + } + } + } + }, +}; \ No newline at end of file diff --git a/loaders/events/gestion/messageCreate.js b/loaders/events/gestion/messageCreate.js new file mode 100644 index 0000000..6a8d5bd --- /dev/null +++ b/loaders/events/gestion/messageCreate.js @@ -0,0 +1,89 @@ +const { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, ChannelType } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const { Events } = require("discord.js"); +const db = new sqlite3.Database('myDatabase.db'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); +module.exports = { + name: Events.MessageCreate, + async execute(message, client) { + const botId = message.client.user.id; + const guildId = message.guild.id; + if (message.channel.type === ChannelType.DM) return; + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + const suggestChannelId = data.suggestChannel && data.suggestChannel[guildId]; + data.piconly = data.piconly || {}; + data.piconly[guildId] = data.piconly[guildId] || {}; + const channelIDpiconly = data.piconly[guildId]; + const antilinkConfig = data[guildId]?.antilink; + let status = 'off'; + let type = 'invite'; + + if (antilinkConfig) { + ({ status, type } = antilinkConfig); + } + if (message.channel.id === suggestChannelId && !message.author.bot) { + await message.delete(); + + const embed = new EmbedBuilder() + .setAuthor({ name: message.author.tag, iconURL: message.author.displayAvatarURL() }) + .setDescription(message.content || 'Aucun contenu fourni') + .setFooter({ text: `${message.guild.name} | ${message.client.user.username}`, }) + .setColor('#409CED'); + + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId(`deletesuggestion_${message.author.id}`) + .setLabel('Supprimer') + .setStyle(ButtonStyle.Danger) + ); + + const suggestionMessage = await message.channel.send({ embeds: [embed], components: [row] }); + suggestionMessage.react('👎') + suggestionMessage.react('👍') + } else if (message.channel.id === channelIDpiconly) { + if (message.attachments.size === 0) { + message.delete() + } + + } else if (status === 'on') { + data.whitelist = data.whitelist || {}; + data.whitelist[guildId] = data.whitelist[guildId] || {}; + const whitelist = data.whitelist[guildId]; + const user = message.member; + if (await getPermissionLevel(user, client) >= 10) return; + if (whitelist[message.author.id]) return; + const messageContent = message.content; + if (type === 'all' && messageContent.includes('https://')) { + message.delete().catch(err => {; + }); + } + if (type === 'invite' && (messageContent.includes('discord.com') || messageContent.includes('discord.gg'))) { + message.delete().catch(err => { + }); + } + } else if (status === 'max') { + if (message.channel.type === ChannelType.DM) return; + const user = message.member; + if (await getPermissionLevel(user, client) >= 10) return; + + const messageContent = message.content; + if (type === 'all' && messageContent.includes('https://')) { + message.delete().catch(err => {; + }); + } + if (type === 'invite' && (messageContent.includes('discord.com') || messageContent.includes('discord.gg'))) { + message.delete().catch(err => { + }); + } + } + }, +}; \ No newline at end of file diff --git a/loaders/events/gestion/messageDelete.js b/loaders/events/gestion/messageDelete.js new file mode 100644 index 0000000..f5e0880 --- /dev/null +++ b/loaders/events/gestion/messageDelete.js @@ -0,0 +1,37 @@ +const {Events , EmbedBuilder} = require("discord.js") +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +module.exports = { + name: Events.MessageDelete, + once: false, + async execute(message, client) { + if (message.author.bot) return; + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + if (!data[message.guild.id]) { + data[message.guild.id] = {}; + } + const deletedEmbed = new EmbedBuilder() + .setColor('#ff0000') + .setAuthor({ name: message.author.tag, iconURL: message.author.displayAvatarURL({ dynamic: true })}) + .setDescription( `<#${message.channel.id}> -` + message.content) + .setTimestamp(message.createdAt); + const logChannelId = data[message.guild.id].messagelog; + const logChannel = client.channels.cache.get(logChannelId); + if (logChannel) { + try {await logChannel.send({ embeds: [deletedEmbed] });} catch (error) {} + } + client.snipes.set(message.channel.id, { + content: message.content, + author: message.author.id, + timestamp: Date.now(), + }); + }, +}; \ No newline at end of file diff --git a/loaders/events/gestion/messageUpdate.js b/loaders/events/gestion/messageUpdate.js new file mode 100644 index 0000000..8afb98a --- /dev/null +++ b/loaders/events/gestion/messageUpdate.js @@ -0,0 +1,40 @@ +const { Events, EmbedBuilder } = require("discord.js"); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +module.exports = { + name: Events.MessageUpdate, + once: false, + async execute(oldMessage, newMessage, client) { + if (oldMessage.author.bot || !oldMessage.content) return; + + const editedEmbed = new EmbedBuilder() + .setColor('#FFA500') + .setAuthor({ name: oldMessage.author.tag, iconURL: oldMessage.author.displayAvatarURL({ dynamic: true })}) + .setDescription(`Message édité dans <#${oldMessage.channel.id}> :\nAvant : ${oldMessage.content}\nAprès : ${newMessage.content}`) + .setTimestamp(oldMessage.editedAt); + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + + if (!data[oldMessage.guild.id] || !data[oldMessage.guild.id].messagelog) return; + + const logChannelId = data[oldMessage.guild.id].messagelog; + const logChannel = client.channels.cache.get(logChannelId); + + if (logChannel) { + try { + await logChannel.send({ embeds: [editedEmbed] }); + } catch (error) { + console.error(`Erreur lors de l'envoi de l'embed dans le logChannel : ${error}`); + } + } + }, +}; \ No newline at end of file diff --git a/loaders/events/gestion/prevname.js b/loaders/events/gestion/prevname.js new file mode 100644 index 0000000..baf80e3 --- /dev/null +++ b/loaders/events/gestion/prevname.js @@ -0,0 +1,34 @@ +const { Events } = require("discord.js"); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: Events.GuildMemberUpdate, + async execute(oldMember, newMember) { + if (oldMember.displayName !== newMember.displayName) { + let changeData = { + oldName: oldMember.displayName, + newName: newMember.displayName, + changeDate: Math.floor(Date.now() / 1000) + }; + + let nameChanges = await new Promise((resolve, reject) => { + db.get('SELECT value FROM prevname WHERE id = ?', [newMember.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : []); + }); + }); + + nameChanges.push(changeData); + + db.run('INSERT OR REPLACE INTO prevname (id, value) VALUES (?, ?)', [newMember.id, JSON.stringify(nameChanges)], (err) => { + if (err) { + console.error(err.message); + } + }); + } + }, +}; \ No newline at end of file diff --git a/loaders/events/logs/LogBooste.js b/loaders/events/logs/LogBooste.js new file mode 100644 index 0000000..40115a7 --- /dev/null +++ b/loaders/events/logs/LogBooste.js @@ -0,0 +1,60 @@ +const { EmbedBuilder, Events } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: Events.GuildMemberUpdate, + async execute(oldMember, newMember) { + if (!oldMember.premiumSince && newMember.premiumSince) { + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [newMember.client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const boostlogChannelId = data[newMember.guild.id]?.boostlog; + if (boostlogChannelId) { + const boostlogChannel = newMember.guild.channels.cache.get(boostlogChannelId); + if (boostlogChannel) { + const embed = new EmbedBuilder() + .setColor('#0099ff') + .setTitle('Nouveau booster') + .setDescription(`${newMember.user.tag} a commencé à booster le serveur!`) + .setTimestamp(); + + boostlogChannel.send({ embeds: [embed] }); + } + } + } + console.log(newMember.premiumSince) + if (oldMember.premiumSince && !newMember.premiumSince) { + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [newMember.client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + const boostlogChannelId = data[newMember.guild.id]?.boostlog; + if (boostlogChannelId) { + const boostlogChannel = newMember.guild.channels.cache.get(boostlogChannelId); + if (boostlogChannel) { + const embed = new EmbedBuilder() + .setColor('#0099ff') + .setTitle('Booster arrêté') + .setDescription(`${newMember.user.tag} a arrêté de booster le serveur.`) + .setTimestamp(); + + boostlogChannel.send({ embeds: [embed] }); + } + } + } + }, +}; \ No newline at end of file diff --git a/loaders/events/logs/channelCreate.js b/loaders/events/logs/channelCreate.js new file mode 100644 index 0000000..1a87faa --- /dev/null +++ b/loaders/events/logs/channelCreate.js @@ -0,0 +1,27 @@ +const { EmbedBuilder, Events } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: Events.ChannelCreate, + execute(channel) { + db.get('SELECT value FROM gestion WHERE id = ?', [channel.client.user.id], (err, row) => { + if (err) { + console.error(err.message); + return; + } + const data = row ? JSON.parse(row.value) : {}; + const logChannelId = data[channel.guild.id]?.channelog; + if (logChannelId) { + const logChannel = channel.guild.channels.cache.get(logChannelId); + if (logChannel) { + const embed = new EmbedBuilder() + .setColor('#0099ff') + .setDescription(`Un nouveau salon a été créé : ${channel.name}`) + .setTimestamp(); + logChannel.send({ embeds: [embed] }); + } + } + }); + }, +}; \ No newline at end of file diff --git a/loaders/events/logs/channelDelete.js b/loaders/events/logs/channelDelete.js new file mode 100644 index 0000000..6c09a2f --- /dev/null +++ b/loaders/events/logs/channelDelete.js @@ -0,0 +1,27 @@ +const { EmbedBuilder, Events } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: Events.ChannelDelete, + execute(channel) { + db.get('SELECT value FROM gestion WHERE id = ?', [channel.client.user.id], (err, row) => { + if (err) { + console.error(err.message); + return; + } + const data = row ? JSON.parse(row.value) : {}; + const logChannelId = data[channel.guild.id]?.channelog; + if (logChannelId) { + const logChannel = channel.guild.channels.cache.get(logChannelId); + if (logChannel) { + const embed = new EmbedBuilder() + .setColor('#0099ff') + .setDescription(`Le salon ${channel.name} a été supprimé.`) + .setTimestamp(); + logChannel.send({ embeds: [embed] }); + } + } + }); + }, +}; \ No newline at end of file diff --git a/loaders/events/logs/channelUpdate.js b/loaders/events/logs/channelUpdate.js new file mode 100644 index 0000000..39fc394 --- /dev/null +++ b/loaders/events/logs/channelUpdate.js @@ -0,0 +1,32 @@ +const { EmbedBuilder, Events } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: Events.ChannelUpdate, + execute(oldChannel, newChannel) { + db.get('SELECT value FROM gestion WHERE id = ?', [newChannel.client.user.id], (err, row) => { + if (err) { + console.error(err.message); + return; + } + const data = row ? JSON.parse(row.value) : {}; + const logChannelId = data[newChannel.guild.id]?.channelog; + if (logChannelId) { + const logChannel = newChannel.guild.channels.cache.get(logChannelId); + if (logChannel) { + + const embed = new EmbedBuilder() + .setColor('#0099ff') + .setTitle('Salon modifié') + .setDescription(`Le salon ${oldChannel.name} a été modifié.`) + .setTimestamp(); + + logChannel.send({ embeds: [embed] }); + + } + } + }); + + }, +}; \ No newline at end of file diff --git a/loaders/events/logs/roleUpdate.js b/loaders/events/logs/roleUpdate.js new file mode 100644 index 0000000..42f3e13 --- /dev/null +++ b/loaders/events/logs/roleUpdate.js @@ -0,0 +1,73 @@ +const { Events, EmbedBuilder , AuditLogEvent} = require("discord.js"); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +module.exports = { + name: Events.GuildMemberUpdate, + once: false, + async execute(oldMember, newMember, client) { + if (oldMember.user.bot || newMember.user.bot) return; + const fetchedLogs = await newMember.guild.fetchAuditLogs({ + limit: 1, + type: AuditLogEvent.MemberRoleUpdate, + }); + const auditEntry = fetchedLogs.entries.first(); + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [client.user.id], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + if (!data[newMember.guild.id] || !data[newMember.guild.id].rolelog) return; + + const logChannelId = data[newMember.guild.id].rolelog; + const logChannel = client.channels.cache.get(logChannelId); + + if (!logChannel) return; + + const oldRoles = oldMember.roles.cache; + const newRoles = newMember.roles.cache; + + const addedRoles = newRoles.filter(role => !oldRoles.has(role.id)); + const removedRoles = oldRoles.filter(role => !newRoles.has(role.id)); + + + if (addedRoles.size > 0) { + const reason = auditEntry.reason + const embed = new EmbedBuilder() + .setColor('#00FF00') + .setAuthor({ name: newMember.user.username, iconURL: newMember.user.displayAvatarURL({ dynamic: true })}) + .setDescription(`${newMember.user.username} a gagnéeee les rôles suivants : ${addedRoles.map(role => `<@&${role.id}>`).join(', ')}`) + .setTimestamp(); + + if (reason && auditEntry.target.id === newMember.id) { + embed.addFields({ name:' ',value: `**Raison : **\`${reason}\``}); + } + + try { + await logChannel.send({ embeds: [embed] }); + } catch (error) { + } + } + + if (removedRoles.size > 0) { + const reason = auditEntry.reason + const embed = new EmbedBuilder() + .setColor('#FF0000') + .setAuthor({ name: newMember.user.username, iconURL: newMember.user.displayAvatarURL({ dynamic: true })}) + .setDescription(`${newMember.user.tag} a perdu les rôles suivants : ${removedRoles.map(role => `<@&${role.id}>`).join(', ')}`) + .setTimestamp(); + + if (reason && auditEntry.target.id === newMember.id) { + embed.addFields({ name:' ',value: `**Raison : **\`${reason}\``}); + } + try { + await logChannel.send({ embeds: [embed] }); + } catch (error) { + } + } + }, +}; \ No newline at end of file diff --git a/loaders/loadCommands.js b/loaders/loadCommands.js index de6f426..b4d90f1 100644 --- a/loaders/loadCommands.js +++ b/loaders/loadCommands.js @@ -54,27 +54,68 @@ module.exports = (client) => { return 10; } - let highestPermission = 0; - for (let i = 1; i <= 9; i++) { - const roleIds = data.permissions && data.permissions[guildId] && data.permissions[guildId].p && data.permissions[guildId].p[i]; - if (roleIds) { - if (roleIds.some(id => member.roles.cache.has(id))) { - highestPermission = Math.max(highestPermission, i); - } + let highestPermission = 0; + for (let i = 1; i <= 9; i++) { + const roleIds = data.permissions?.[guildId]?.p?.[i]; + if (roleIds && roleIds.some(id => member.roles.cache.has(id))) { + highestPermission = i; + break; } } + return highestPermission; + } const totalCommands = loadCommands('../commands'); console.log(`Commands => ${totalCommands} commandes préfixées chargées sur le bot`); - - client.on('messageCreate', async message => { + client.on('messageCreate', message => { + handleMessage(message, client); + }); + async function handleMessage(message, client) { + if (message.author.bot || message.channel.type === ChannelType.DM) return; + const botId = client.user.id; - if (message.channel.type === ChannelType.DM){ - return - } else { const guildId = message.guild.id; - let data = await new Promise((resolve, reject) => { + let data = await getDataFromDatabase(botId); + + const permissions = data.permissions || {}; + const defaultPrefix = "+"; + let mainPrefix = data.prefixes && data.prefixes.main ? data.prefixes.main : defaultPrefix; + let serverPrefix = data.prefixes && data.prefixes[guildId]; + const prefix = serverPrefix !== undefined ? serverPrefix : mainPrefix; + + if (!message.content.startsWith(prefix)) return; + + const args = message.content.slice(prefix.length).trim().split(/ +/); + let commandNameOrAlias = args.shift().toLowerCase(); + + let command = client.commands.get(commandNameOrAlias) || client.commands.find(cmd => cmd.aliases && cmd.aliases.includes(commandNameOrAlias)); + if (!command) { + for (const cmd in data.alias) { + if (data.alias[cmd][commandNameOrAlias]) { + commandNameOrAlias = cmd; + command = client.commands.get(commandNameOrAlias); + break; + } + } + } + if (!command) return; + const permissionLevel = await getPermissionLevel(message.member, client); + if (permissions[command.name] === 'off' && permissionLevel <= 10) return; + try { + if (permissionLevel === 11 || permissionLevel >= permissions[command.name]) { + command.execute(message, args, client); + } else { + message.reply("Vous n'avez pas accès à cette commande."); + } + } catch(err) { + console.error(`Erreur lors de l'exécution de la commande: ${command.name} , ${err}`); + message.reply('Une erreur est survenue lors de l\'exécution de cette commande.'); + } + } + + async function getDataFromDatabase(botId) { + return new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { if (err) { console.error(err.message); @@ -83,56 +124,5 @@ module.exports = (client) => { resolve(row ? JSON.parse(row.value) : {}); }); }); - - const permissions = data.permissions || {}; - const defaultPrefix = "+"; - let mainPrefix = data.prefixes && data.prefixes.main ? data.prefixes.main : defaultPrefix; - let serverPrefix = data.prefixes && data.prefixes[guildId]; - const prefix = serverPrefix !== undefined ? serverPrefix : mainPrefix; - - - if (!message.content.startsWith(prefix) || message.author.bot) return; - - const args = message.content.slice(prefix.length).trim().split(/ +/); - const commandNameOrAlias = args.shift().toLowerCase(); - let commandName = commandNameOrAlias; - //if (!client.commands.has(commandName)) return; - for (const cmd in data.alias) { - if (data.alias[cmd][commandNameOrAlias]) { - commandName = cmd; - break; - } - } - const command = client.commands.get(commandName) - || client.commands.find(cmd => cmd.aliases && cmd.aliases.includes(commandName)); - if (!command) { - for (const cmd in data.alias) { - if (data.alias[cmd][commandNameOrAlias]) { - commandName = cmd; - command = client.commands.get(commandName); - break; - } - } - } - - if (!command) { - return; - } - if (command) { - const permissionLevel = await getPermissionLevel(message.member, client); - try { - if (permissionLevel === 11) { - command.execute(message, args, client); - } else if (permissionLevel >= permissions[command.name]) { - command.execute(message, args, client); - } else { - return message.reply("Vous n'avez pas accès à cette commande."); - } - } catch(err) { - console.error(`Erreur lors de l'exécution de la commande: ${command.name} , ${err}`); - message.reply('Une erreur est survenue lors de l\'exécution de cette commande.'); - } - } } - }); -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 1f538af..e2c99d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "axios": "^1.6.7", "better-sqlite3": "^9.4.3", + "blagues-api": "^2.1.1", "color-name-list": "^10.19.0", "discord-backup": "^3.3.2", "discord-gamecord": "^4.4.1", @@ -432,6 +433,14 @@ "readable-stream": "^3.4.0" } }, + "node_modules/blagues-api": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/blagues-api/-/blagues-api-2.1.1.tgz", + "integrity": "sha512-Wjyvgh/Ke/RHBNLBNbvsHPjEXfeHZEEee++M8+f2YL5GeNty2kvlAGkhGdmPqdWmUYhvtOr9G3MdKF5NoYwW7w==", + "dependencies": { + "cross-fetch": "^3.1.5" + } + }, "node_modules/bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", @@ -669,6 +678,14 @@ "node": ">=0.8" } }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/crypt": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", diff --git a/package.json b/package.json index 02cd42a..783f0d7 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "dependencies": { "axios": "^1.6.7", "better-sqlite3": "^9.4.3", + "blagues-api": "^2.1.1", "color-name-list": "^10.19.0", "discord-backup": "^3.3.2", "discord-gamecord": "^4.4.1", diff --git a/permissions.json b/permissions.json index 5d134e8..616766b 100644 --- a/permissions.json +++ b/permissions.json @@ -174,5 +174,42 @@ "setconfession": 3, "presetlog": 3, "blword": 3, - "wiki": 3 + "wiki": 3, + "antirole": 3, + "epicgamer": 3, + "rickroll": 3, + "channelog": 3, + "blinfo": 3, + "version": 3, + "blague": 3, + "christmas": 3, + "antiban": 3, + "antileak": 3, + "antiupdate": 3, + "antiwebhook": 3, + "baninfo": 3, + "antiadmin": 3, + "antijoin": 3, + "invitereset": 3, + "boostlog": 3, + "nickreset": 3, + "dperm": 3, + "setbanner": 3, + "claque": 3, + "kiss": 3, + "addinvite": 3, + "inviteboard": 3, + "removeinvite": 3, + "cmute": 3, + "cunmute": 3, + "antimention": 3, + "log": 3, + "setlogs": 3, + "news": 3, + "dero": 3, + "up": 3, + "antithread": 3, + "secur2": 3, + "halloween": 3, + "creationlimit": 3 } \ No newline at end of file