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; } }