From af836f4c1e9798b75fa1593655437cd2caef54ec Mon Sep 17 00:00:00 2001 From: VALOU3336 Date: Thu, 29 Feb 2024 18:57:43 +0100 Subject: [PATCH] trop de truc pour tout ecrire --- commands/botcontrol/compet.js | 25 + commands/botcontrol/invite.js | 9 +- commands/botcontrol/listen.js | 2 +- commands/botcontrol/play.js | 2 +- commands/botcontrol/say.js | 1 - commands/botcontrol/watch.js | 2 +- commands/game/anime.js | 50 ++ commands/game/ascii.js | 29 + commands/game/guessThePokemon.js | 3 - commands/game/lc.js | 41 + commands/game/marry.js | 53 ++ commands/game/unmarry.js | 98 +++ commands/game/zalgo.js | 21 + commands/gestion/autoreact.js | 78 ++ commands/gestion/clearwbh.js | 30 + commands/gestion/embed.js | 251 ++++-- commands/gestion/giveaway.js | 62 ++ commands/gestion/join.js | 287 ++++++ commands/gestion/leave.js | 183 ++++ commands/gestion/piconly.js | 50 ++ commands/logs/logs.js | 13 +- commands/moderation/derank.js | 43 + commands/moderation/derankall.js | 30 + commands/moderation/rlm.js | 23 + commands/moderation/voicekick.js | 21 + commands/moderation/voicekickall.js | 27 + commands/moderation/voicemove.js | 27 + commands/moderation/voicemoveall.js | 25 + commands/utils/booster.js | 19 + commands/utils/gif.js | 2 +- commands/utils/help.js | 16 + events/antiraid.js/alerteping.js | 3 - events/auto/autoreact.js | 27 + events/client/ready.js | 12 +- events/gestion/buttongestion.js | 41 +- events/gestion/joinevent.js | 66 ++ events/gestion/leaveevent.js | 49 ++ events/gestion/messageCreate.js | 8 + giveaways.json | 1 + loaders/loadCommands.js | 9 +- main.js | 12 +- package-lock.json | 1263 +++++++++++++++++++++++++++ package.json | 7 + 43 files changed, 2902 insertions(+), 119 deletions(-) create mode 100644 commands/botcontrol/compet.js create mode 100644 commands/game/anime.js create mode 100644 commands/game/ascii.js create mode 100644 commands/game/lc.js create mode 100644 commands/game/marry.js create mode 100644 commands/game/unmarry.js create mode 100644 commands/game/zalgo.js create mode 100644 commands/gestion/autoreact.js create mode 100644 commands/gestion/clearwbh.js create mode 100644 commands/gestion/giveaway.js create mode 100644 commands/gestion/join.js create mode 100644 commands/gestion/leave.js create mode 100644 commands/gestion/piconly.js create mode 100644 commands/moderation/derank.js create mode 100644 commands/moderation/derankall.js create mode 100644 commands/moderation/rlm.js create mode 100644 commands/moderation/voicekick.js create mode 100644 commands/moderation/voicekickall.js create mode 100644 commands/moderation/voicemove.js create mode 100644 commands/moderation/voicemoveall.js create mode 100644 commands/utils/booster.js create mode 100644 events/auto/autoreact.js create mode 100644 events/gestion/joinevent.js create mode 100644 events/gestion/leaveevent.js create mode 100644 giveaways.json diff --git a/commands/botcontrol/compet.js b/commands/botcontrol/compet.js new file mode 100644 index 0000000..ff7ed4c --- /dev/null +++ b/commands/botcontrol/compet.js @@ -0,0 +1,25 @@ +const { ActivityType } = require("discord.js"); + +module.exports = { + name: 'competion', + aliases: ['compet'], + description: 'Changer le status du bot en competition', + emote: '🎤', + utilisation: 'compet ', + category: 'botcontrol', + + async execute(message, args, client) { + const streamText = args.join(' ') || 'Streaming'; + const streamURL = 'https://www.twitch.tv/valou336_yt'; + + client.user.setPresence({ + activities: [{ + name: streamText, + type: ActivityType.Competing, + url: streamURL + }] + }); + + message.channel.send(`Le bot est maintenant en compétition : ${streamText}`); + }, +}; \ No newline at end of file diff --git a/commands/botcontrol/invite.js b/commands/botcontrol/invite.js index 48a7e99..db13465 100644 --- a/commands/botcontrol/invite.js +++ b/commands/botcontrol/invite.js @@ -1,4 +1,4 @@ -const { PermissionsBitField } = require('discord.js'); +const { PermissionsBitField , ChannelType } = require('discord.js'); module.exports = { name: 'invite', @@ -7,9 +7,7 @@ module.exports = { emote: '🔗', utilisation: 'invite [guildId]', category: 'botcontrol', - async execute(message, args, client) { - // Vérifie si l'ID du serveur a été fourni if (!args[0]) { return message.reply('Veuillez fournir l\'ID du serveur.'); } @@ -17,7 +15,6 @@ module.exports = { const guildId = args[0]; let guild; - // Tente de trouver le serveur par ID try { guild = await client.guilds.fetch(guildId); } catch (error) { @@ -25,20 +22,18 @@ module.exports = { return message.reply('Je ne peux pas trouver le serveur avec cet ID.'); } - // Vérifie si le bot est membre du serveur if (!guild) { return message.reply('Le bot n\'est pas membre de ce serveur.'); } const botMember = guild.members.cache.get(client.user.id); - // Vérifie si le bot a la permission de créer des invitations if (!botMember.permissions.has(PermissionsBitField.Flags.createInvite)) { return message.reply('Le bot n\'a pas la permission de créer des invitations sur ce serveur.'); } const channel = guild.channels.cache - .filter((channel) => channel.type === 'GUILD_TEXT') + .filter((channel) => channel.type === ChannelType.GuildText) .first(); if (!channel) return message.channel.send(`Aucun channel textuel n'a été trouvé dans ce serveur.`); diff --git a/commands/botcontrol/listen.js b/commands/botcontrol/listen.js index 8de3986..36fa54c 100644 --- a/commands/botcontrol/listen.js +++ b/commands/botcontrol/listen.js @@ -19,6 +19,6 @@ module.exports = { }] }); - message.channel.send(`Le bot est maintenant en streaming : ${streamText}`); + message.channel.send(`Le bot est maintenant en ecoute : ${streamText}`); }, }; \ No newline at end of file diff --git a/commands/botcontrol/play.js b/commands/botcontrol/play.js index 1befb47..a84aaf9 100644 --- a/commands/botcontrol/play.js +++ b/commands/botcontrol/play.js @@ -20,6 +20,6 @@ module.exports = { }] }); - message.channel.send(`Le bot est maintenant en streaming : ${streamText}`); + message.channel.send(`Le bot est maintenant en joue : ${streamText}`); }, }; \ No newline at end of file diff --git a/commands/botcontrol/say.js b/commands/botcontrol/say.js index 113ba18..342fd77 100644 --- a/commands/botcontrol/say.js +++ b/commands/botcontrol/say.js @@ -14,7 +14,6 @@ module.exports = { try { await message.delete(); } catch { - console.log('Impossible de supprimer le message de la commande say'); } message.channel.send(text); }, diff --git a/commands/botcontrol/watch.js b/commands/botcontrol/watch.js index 03de7ea..8be842e 100644 --- a/commands/botcontrol/watch.js +++ b/commands/botcontrol/watch.js @@ -20,6 +20,6 @@ module.exports = { }] }); - message.channel.send(`Le bot est maintenant en streaming : ${streamText}`); + message.channel.send(`Le bot est maintenant en regarde : ${streamText}`); }, }; \ No newline at end of file diff --git a/commands/game/anime.js b/commands/game/anime.js new file mode 100644 index 0000000..357dff6 --- /dev/null +++ b/commands/game/anime.js @@ -0,0 +1,50 @@ +const Discord = require("discord.js"); +const malScraper = require('mal-scraper'); + +module.exports = { + name: "anime", + description: "Obtenez des informations sur un anime!", + emote: '🎬', + category: 'utils', + utilisation: 'anime ', + async execute(message, args, client) { + + const search = `${args}`; + if (!search) + return message.reply(':x: | Veuillez ajouter une requête de recherche.'); + + malScraper.getInfoFromName(search) + .then((data) => { + const malEmbed = new Discord.EmbedBuilder() + .setAuthor( {name: `Résultat de recherce pour ${args}`.split(',').join(' ')}) + .setImage(data.picture) + .addFields( + { name: '📆 Première', value: `\`${data.premiered}\``, inline: true }, + { name: '📺 Diffuser', value: `\`${data.broadcast}\``, inline: true }, + { name: '🎭 Genres', value: `\`${data.genres}\``, inline: true }, + { name: '🇬🇧 Titre anglais', value: `\`${data.englishTitle}\``, inline: true }, + { name: '🇯🇵 Titre japonais', value: `\`${data.japaneseTitle}\``, inline: true }, + { name: '🎬 Type', value: `\`${data.type}\``, inline: true }, + { name: '📚 Episodes', value: `\`${data.episodes}\``, inline: true }, + { name: '🌟 Evaluation', value: `\`${data.rating}\``, inline: true }, + { name: '📡 Diffusé', value: `\`${data.aired}\``, inline: true }, + { name: '💯 Score', value: `\`${data.score}\``, inline: true }, + { name: '👍 Favori', value: `\`${data.favorites}\``, inline: true }, + { name: '📊 Classé', value: `\`${data.ranked}\``, inline: true }, + { name: '⌛ Durée', value: `\`${data.duration}\``, inline: true }, + { name: '🎥 Studios', value: `\`${data.studios}\``, inline: true }, + { name: '📈 Popularité', value: `\`${data.popularity}\``, inline: true }, + { name: '👥 Membres', value: `\`${data.members}\``, inline: true }, + { name: '📊 Score Stats', value: `\`${data.scoreStats}\``, inline: true }, + { name: '🔍 Source', value: `\`${data.source}\``, inline: true }, + { name: '🔄 Synonymes', value: `\`${data.synonyms}\``, inline: true }, + { name: '🔁 Status', value: `\`${data.status}\``, inline: true }, + { name: '🆔 Identifier', value: `\`${data.id}\``, inline: true }, + { name: '🔗 Link', value: `\`${data.url}\``, inline: true } + ) + + message.channel.send({embeds: [malEmbed]}); + + }) + } +}; \ No newline at end of file diff --git a/commands/game/ascii.js b/commands/game/ascii.js new file mode 100644 index 0000000..a394c92 --- /dev/null +++ b/commands/game/ascii.js @@ -0,0 +1,29 @@ +const Discord = require('discord.js') +const db = require('quick.db') +const figlet = require("figlet") + +module.exports = { + name: 'ascii', + description: "Écrivez vos textes en ASCII", + emote: '🎨', + category: 'utils', + utilisation: 'ascii ', + async execute(message, args, client) { + if(!args[0]) return message.channel.send(' **Veuillez fournir du texte**'); + + msg = args.join(" "); + + message.delete() + + figlet.text(msg, function (err, data){ + if(err){ + console.log(`Quelque chose s'est mal passé`); + console.dir(err); + } + if(data.length > 2000) return message.channel.send('**Veuillez fournir un texte de moins de 2 000 caractères**') + + message.channel.send('```' + data + '```') + }) + + } +} \ No newline at end of file diff --git a/commands/game/guessThePokemon.js b/commands/game/guessThePokemon.js index 97d962e..6322c1f 100644 --- a/commands/game/guessThePokemon.js +++ b/commands/game/guessThePokemon.js @@ -24,8 +24,5 @@ module.exports = { }); Game.startGame(); - Game.on('gameOver', result => { - console.log(result); // => { result... } - }); }, }; \ No newline at end of file diff --git a/commands/game/lc.js b/commands/game/lc.js new file mode 100644 index 0000000..ddae2bc --- /dev/null +++ b/commands/game/lc.js @@ -0,0 +1,41 @@ +const Discord = require("discord.js"), +md5 = require("md5"); +module.exports = { + name :"lc", + aliases:["lovecalc"], + description:"calcul un pourcentage d'amour entre deux membres mentionnés", + emote: '💘', + category: "utils", + utilisation: 'lc <@member1> <@member2>', + async execute(message, args, client) { + const firstMember = message.mentions.members.filter(m => m.id !== message.author.id).first(); + if (!firstMember) + return message.channel.send("veuillez mettre une membre valide"); + const secondMember = + message.mentions.members + .filter(m => m.id !== firstMember.id) + .filter(m => m.id !== message.author.id) + .first() || message.member; + if(!secondMember) + return message.error("veuillez mettre une membre valide"); + const members = [firstMember, secondMember].sort( + (a, b) => parseInt(a.id, 10) - parseInt(b.id, 10) + ); + const hash = md5( + `${members[0].id}${members[1].user.username}${members[0].user.username}${members[1].id}` + ); + + const string = hash + .split("") + .filter(e => !isNaN(e)) + .join(""); + const percent = parseInt(string.substr(0, 2), 10); + + const embed = new Discord.EmbedBuilder() + .setTitle("❤️ LoveCalc") + .setDescription(`${firstMember.user.username} et ${secondMember.user.username} s'aime à ${percent}% `) + .setImage(firstMember.user.displayAvatarURL({ dynamic: true }) + secondMember.user.displayAvatarURL({ dynamic: true })) + .setColor('#C71585') + message.channel.send({embeds: [embed]}) + } +} \ No newline at end of file diff --git a/commands/game/marry.js b/commands/game/marry.js new file mode 100644 index 0000000..3e24e76 --- /dev/null +++ b/commands/game/marry.js @@ -0,0 +1,53 @@ +const { ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +module.exports = { + name: 'marry', + description: 'Proposez en mariage à un utilisateur', + emote: '💍', + category: 'game', + category: '+marry @user', + async execute(message, args, client) { + const targetUser = message.mentions.users.first() || message.guild.members.cache.get(args[0]); + if (!targetUser) { + return message.reply('Veuillez mentionner un utilisateur ou fournir un ID d\'utilisateur.'); + } + const isRequesterMarried = checkIfMarried(message.author.id, client); + if (isRequesterMarried === true) { + return message.reply('Vous êtes déjà marié.'); + } + const isTargetMarried = checkIfMarried(targetUser.id, client); + if (isTargetMarried === true) { + return message.reply('Cet utilisateur est déjà marié.'); + } + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId(`acceptmarriage_${targetUser.id}_${message.author.id}`) + .setLabel('Accepter') + .setStyle(ButtonStyle.Success), + ); + + message.channel.send({ content: `${targetUser}`, components: [row] }); + }, +}; +async function checkIfMarried(userId, client) { + 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); + } + const parsedData = row ? JSON.parse(row.value) : {}; + parsedData.marry = parsedData.marry || []; + resolve(parsedData); + }); + }); + + const isMarried = data.marry.some(pair => { + const [userId1, userId2] = pair.split('_'); + return userId1 === userId || userId2 === userId; + }); + + return isMarried; +} \ No newline at end of file diff --git a/commands/game/unmarry.js b/commands/game/unmarry.js new file mode 100644 index 0000000..8208a30 --- /dev/null +++ b/commands/game/unmarry.js @@ -0,0 +1,98 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +module.exports = { + name: 'unmarry', + description: 'Dissoudre un mariage', + emote: '💍', + category: 'game', + utilisation: '+unmarry', + execute(message, args, client) { + + checkIfMarried(message.author.id, client).then(isMarried => { + if (!isMarried) { + return message.reply('Vous n\'êtes pas marié.'); + } + + findMarriage(message.author.id, client).then(marriagePair => { + if (!marriagePair) { + return message.reply('Une erreur s\'est produite lors de la recherche du mariage.'); + } + + unregisterMarriage(marriagePair, client).then(() => { + message.reply('Votre mariage a été dissous.'); + }).catch(err => { + console.error(err); + message.reply('Une erreur s\'est produite lors de la suppression du mariage.'); + }); + }).catch(err => { + console.error(err); + message.reply('Une erreur s\'est produite lors de la recherche du mariage.'); + }); + }).catch(err => { + console.error(err); + message.reply('Une erreur s\'est produite lors de la vérification du mariage.'); + }); + }, +}; + +async function checkIfMarried(userId, client) { + 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); + } + const parsedData = row ? JSON.parse(row.value) : {}; + parsedData.marry = parsedData.marry || []; + resolve(parsedData); + }); + }); + + const isMarried = data.marry.some(pair => { + const [userId1, userId2] = pair.split('_'); + return userId1 === userId || userId2 === userId; + }); + + return isMarried; +} +async function findMarriage(userId, client) { + 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 marriagePair = data.marry.find(pair => { + const [userId1, userId2] = pair.split('_'); + return userId1 === userId || userId2 === userId; + }); + + return marriagePair; +} + +async function unregisterMarriage(marriagePair, client) { + 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 [userId1, userId2] = marriagePair.split('_'); + data.marry = data.marry.filter(pair => pair !== marriagePair && pair !== `${userId2}_${userId1}`); + + + db.run('UPDATE gestion SET value = ? WHERE id = ?', [JSON.stringify(data), client.user.id], function(err) { + if (err) { + console.error(err.message); + throw err; + } + }); +} \ No newline at end of file diff --git a/commands/game/zalgo.js b/commands/game/zalgo.js new file mode 100644 index 0000000..673e67f --- /dev/null +++ b/commands/game/zalgo.js @@ -0,0 +1,21 @@ +const { EmbedBuilder } = require('discord.js'); +const Zalgo = require('to-zalgo') + +module.exports = { + name: 'zalgo', + aliases: ['zlg'], + description: 'Convertissez vos textes en Zalgo', + usage: 'zalgo ', + async execute(message, args, client) { + + message.channel.send({embeds: [ new EmbedBuilder() + .setAuthor({name: message.author.tag}) + .setTitle(`Votre texte: ${args.join(" ")}`) + .setDescription(`${Zalgo(args.join(" "))}`) + .setFooter({ text: `${client.user.username}` }) + .setTimestamp()]} + + ) + + } +} \ No newline at end of file diff --git a/commands/gestion/autoreact.js b/commands/gestion/autoreact.js new file mode 100644 index 0000000..b6e1a5f --- /dev/null +++ b/commands/gestion/autoreact.js @@ -0,0 +1,78 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'autoreact', + description: 'Ajoute des réactions automatiques à un salon', + usage: '+autoreact ...', + async execute(message, args) { + if (args[0] === "remove" || args[0] === "del" ){ + const channel = message.mentions.channels.first() || message.guild.channels.cache.get(args[0]); + if (!channel) { + return message.reply('Salon invalide.'); + } + 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].autoreact) { + data[message.guild.id].autoreact = {}; + } + delete data[message.guild.id].autoreact[channel.id] + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], (err) => { + if (err) { + console.error(err.message); + return message.reply('Une erreur s\'est produite lors de la mise à jour de la base de données.'); + } + message.reply(`Les réactions automatiques ont été supprimé pour le salon ${channel.name}.`); + }); + }else { + if (args.length < 2) { + return message.reply('Veuillez fournir un salon et au moins une émojie.'); + } + + const channel = message.mentions.channels.first() || message.guild.channels.cache.get(args[0]); + if (!channel) { + return message.reply('Salon invalide.'); + } + + const emojis = args.slice(1); + + 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].autoreact) { + data[message.guild.id].autoreact = {}; + } + data[message.guild.id].autoreact[channel.id] = emojis; + + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], (err) => { + if (err) { + console.error(err.message); + return message.reply('Une erreur s\'est produite lors de la mise à jour de la base de données.'); + } + message.reply(`Les réactions automatiques ont été ajoutées pour le salon ${channel.name}.`); + }); + } + }, +}; \ No newline at end of file diff --git a/commands/gestion/clearwbh.js b/commands/gestion/clearwbh.js new file mode 100644 index 0000000..054e27a --- /dev/null +++ b/commands/gestion/clearwbh.js @@ -0,0 +1,30 @@ +const { PermissionsBitField } = require('discord.js'); + +module.exports = { + name: 'clearwbh', + description: 'Supprime tous les webhooks du serveur', + emote: '🗑️', + utilisation: 'clearwbh', + category: 'moderation', + async execute(message, args, client) { + const botMember = message.guild.members.cache.get(client.user.id); + if (!botMember.permissions.has(PermissionsBitField.Flags.ManageWebhooks)) { + return message.reply('Le bot n\'a pas la permission de gérer les webhooks.'); + } + const webhooks = await message.guild.fetchWebhooks(); + + const initialMessage = await message.reply('Début de la suppression des webhooks...'); + + for (const webhook of webhooks.values()) { + await webhook.delete('Suppression des webhooks par la commande +clearwbh') + .then(() => { + initialMessage.edit(`Webhook ${webhook.name} a été supprimé avec succès. ${webhooks.size - 1} webhooks restants à supprimer.`); + }) + .catch(error => { + initialMessage.edit(`Une erreur s'est produite lors de la suppression du webhook ${webhook.name}. ${webhooks.size - 1} webhooks restants à supprimer.`); + }); + } + + initialMessage.edit('Tous les webhooks ont été supprimés du serveur.'); + }, +}; \ No newline at end of file diff --git a/commands/gestion/embed.js b/commands/gestion/embed.js index 42c0e6d..753b432 100644 --- a/commands/gestion/embed.js +++ b/commands/gestion/embed.js @@ -1,4 +1,4 @@ -const { EmbedBuilder, ActionRowBuilder, StringSelectMenuBuilder } = require('discord.js'); +const { EmbedBuilder, ActionRowBuilder, StringSelectMenuBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); module.exports = { name: 'embed', @@ -7,97 +7,170 @@ module.exports = { emote: '📝', utilisation: 'embed', category: 'gestion', - async execute(message, args, client) { - const embed = new EmbedBuilder(); - - const menu = new StringSelectMenuBuilder() - .setCustomId('embed-options') - .setPlaceholder('Select an option') + + var selectMenu = new StringSelectMenuBuilder() + .setCustomId("embedbuilder") + .setPlaceholder("Choisissez une option") .addOptions([ - { label: '📝 Titre', value: 'title' }, - { label: '📖 Description', value: 'description' }, - { label: '🎨 Couleur', value: 'color' }, - { label: '🖼️ Image URL', value: 'image' }, - { label: '🖼️ Thumbnail URL', value: 'thumbnail' }, - { label: '👤 Autheur', value: 'author' }, - { label: '👣 Footer', value: 'footer' }, - { label: '🚀 Envoyer', value: 'send' }, + { label: '📝 Modifier le Titre', value: 'embedtitle' }, + { label: '💬 Modifier la Description', value: 'embeddescription'}, + { label: "🕵️‍♂️ Modifier l'Auteur", value: 'embedauthor'}, + { label: '🔻 Modifier le Footer', value: 'embedfooter'}, + { label: '🔳 Modifier le Thumbnail', value: 'embedthumbnail'}, + { label: '🕙 Modifier le Timestamp', value: 'embedtimestamp'}, + { label: "🖼 Modifier l'Image", value: 'embedimage'}, + { label: "🌐 Modifier l'URL", value: 'embedurl'}, + { label: '🔴 Modifier la Couleur', value: 'embedcolor'}, ]); + var embedBuilderActionRow = new ActionRowBuilder() + .addComponents([selectMenu]) + let embed = (new EmbedBuilder({ description: '\u200B' })) - const row = new ActionRowBuilder() - .addComponents(menu); + var actionRow = new ActionRowBuilder() + actionRow.addComponents([ + new ButtonBuilder() + .setCustomId("embedsend") + .setLabel("Envoyer l'embed") + .setStyle(ButtonStyle.Success) + .setEmoji("✅") + ]) - const selectMenuMessage = await message.channel.send({ content: `Veuillez sélectionner une option pour l'embed:`, components: [row] }); - - client.on('interactionCreate', async (interaction) => { - if (!interaction.isSelectMenu()) return; - - if (interaction.customId === 'embed-options') { - const selectedOption = interaction.values[0]; - - if (selectedOption === 'send') { - const channelMessage = await interaction.reply({ content: `Veuillez mentionner le salon où l'embed sera envoyé.`, fetchReply: true }); - const channelFilter = m => m.author.id === interaction.user.id; - const channelCollector = interaction.channel.createMessageCollector({ filter: channelFilter, max: 1, time: 60000 }); // 1 minute to reply - - channelCollector.on('collect', async (m) => { - let channel = m.mentions.channels.first(); - if (!channel) { - const channelId = m.content; - channel = interaction.guild.channels.cache.get(channelId); - } - - if (!channel) { - interaction.followUp({ content: 'Salon invalide.' }); - return; - } - - channel.send({ embeds: [embed] }); - message.channel.send(`Embed correctement envoyé dans le channel <#${channel.id}>`) - }); - } else { - const optionMessage = await interaction.reply({ content: `Veuillez entrer ${selectedOption} de l'embed:`, fetchReply: true }); - const optionFilter = m => m.author.id === interaction.user.id; - const optionCollector = interaction.channel.createMessageCollector({ filter: optionFilter, max: 1 }); - optionCollector.on('collect', async (m) => { - let optionValue = ''; - if (m.content.toLowerCase() !== 'cancel') { - optionValue = m.content; - } - - optionMessage.delete(); - m.delete(); - - switch (selectedOption) { - case 'title': - embed.setTitle(optionValue); - break; - case 'description': - embed.setDescription(optionValue); - break; - case 'color': - embed.setColor(optionValue); - break; - case 'image': - embed.setImage(optionValue); - break; - case 'thumbnail': - embed.setThumbnail(optionValue); - break; - case 'author': - embed.setAuthor({ name: optionValue }); - break; - case 'footer': - embed.setFooter({ name: optionValue }); - break; - } - - - selectMenuMessage.edit({ embeds: [embed], components: [row] }); - }); - } - } + 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 }); - }, -}; \ No newline at end of file + + + collector.on("collect", async (i) => { + i.deferUpdate() + if(i.customId == "embedbuilder") { + if(i.values[0] == "embedtitle") { + let question = await message.channel.send({ content: "Veuillez saisir le titre de l'embed" }) + let collected = await question.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1 }).then(collected => { + let msgg = collected.first() + embed.setTitle(msgg.content) + msg.edit({ embeds: [embed]}) + }) + } + if(i.values[0] == "embeddescription") { + let question = await message.channel.send({ content: "Veuillez saisir la description de l'embed" }) + let collected = await question.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1 }).then(collected => { + let msgg = collected.first() + embed.setDescription(msgg.content) + msg.edit({ embeds: [embed]}) + + }) + } + if(i.values[0] == "embedauthor") { + let question = await message.channel.send({ content: "Veuillez saisir l'auteur de l'embed" }) + let collected = await question.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1 }).then(collected => { + let msgg = collected.first() + embed.setAuthor({name: msgg.content}) + msg.edit({ embeds: [embed]}) + }) + } + if(i.values[0] == "embedfooter") { + let question = await message.channel.send({ content: "Veuillez saisir le footer de l'embed" }) + let collected = await question.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1 }).then(collected => { + let msgg = collected.first() + embed.setFooter({text: msgg.content}) + msg.edit({ embeds: [embed]}) + }) + } + if(i.values[0] == "embedthumbnail") { + var yx = await message.channel.send({ content: "Quel sera le **Thumnail** de l'embed ?" }) + let collected = await message.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1, time: 60000, errors: ["time"] }) + .then(async (collected) => { + var a; + + if (collected.first().attachments.size > 0) { + collected.first().attachments.forEach(async at => { + a = at.url + }) + + } else if (/^https?:\/\/.*\/.*\.(png|gif|webp|jpeg|jpg|svg)\??.*$/gmi.test(collected.first().content) === true) { + a = collected.first().content + } else { + a = false + } + + collected.first().delete().catch(() => false) + yx.delete().catch(() => false) + + if (a === false) { + return collected.message.channel.send({ content: "L'image voulue est Invalide." }) + } else if (a !== false) { + embed.setThumbnail(a.toString()); + } + msg.edit({ embeds: [embed] }) + }) + } + if(i.values[0] == "embedtimestamp") { + embed.setTimestamp(Date.now()) + msg.edit({ embeds: [embed]}) + } + if(i.values[0] == "embedimage") { + var yx = await message.channel.send({ content: "Quelle sera l'**Image** de l'embed ?" }) + let collected = await message.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1, time: 60000, errors: ["time"] }) + .then(async (collected) => { + var a; + + if (collected.first().attachments.size > 0) { + collected.first().attachments.forEach(async at => { + a = at.url + }) + + } else if (/^https?:\/\/.*\/.*\.(png|gif|webp|jpeg|jpg|svg)\??.*$/gmi.test(collected.first().content) === true) { + a = collected.first().content + } else { + a = false + } + + collected.first().delete().catch(() => false) + yx.delete().catch(() => false) + + if (a === false) { + return collected.message.channel.send({ content: "L'image voulue est Invalide." }) + } else if (a !== false) { + embed.setImage(a.toString()); + } + msg.edit({ embeds: [embed] }) + + }) + } + if(i.customId == "embedurl") { + let question = await message.channel.send({ content: "Veuillez saisir l'URL de l'embed" }) + let collected = await question.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1 }).then(collected => { + let msgg = collected.first() + embed.setURL(msgg.content) + msg.edit({ embeds: [embed]}) + + }) + } + if(i.customId == "embedcolor") { + let question = await message.channel.send({ content: "Veuillez saisir la couleur de l'embed" }) + let collected = await question.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1 }).then(collected => { + let msgg = collected.first() + embed.setColor(msgg.content) + msg.edit({ embeds: [embed]}) + + }) + } + + } + + if (i.customId == "embedsend") { + let question = await message.channel.send({ content: "Dans quel channel voulez-vous envoyer l'embed?" }) + 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]}) + }) + } + }) + + + } + } diff --git a/commands/gestion/giveaway.js b/commands/gestion/giveaway.js new file mode 100644 index 0000000..4d7fab3 --- /dev/null +++ b/commands/gestion/giveaway.js @@ -0,0 +1,62 @@ +const { GiveawaysManager } = require('discord-giveaways'); +const ms = require('ms'); + +module.exports = { + name: 'giveaway', + utilisation: 'giveaway ', + description: 'Crée un giveaway avec une durée, un prix et un nombre de gagnants spécifiés.', + emote: '🎉', + category: 'gestion', + + async execute(message, args, client) { + if (args.length < 3) { + return message.channel.send('Veuillez fournir une durée, un prix et un nombre de gagnants.'); + } + + const duration = args[0]; + const prize = args.slice(1, -1).join(' '); + const winnersCount = parseInt(args[args.length - 1]); + + // Vérifie si la durée est valide + if (isNaN(ms(duration))) { + return message.channel.send('Veuillez fournir une durée valide.'); + } + + // Vérifie si le nombre de gagnants est valide + if (isNaN(winnersCount) || winnersCount < 1) { + return message.channel.send('Veuillez fournir un nombre valide de gagnants.'); + } + + // Crée le giveaway + const giveawayChannel = message.channel; + const giveawayDuration = ms(duration); + const giveawayWinners = winnersCount; + client.giveawaysManager.create(giveawayChannel, { + duration: giveawayDuration, + prize: prize, + winnerCount: giveawayWinners, + messages: { + giveaway: "🎉 **GIVEAWAY** 🎉", + giveawayEnded: "🎉 **GIVEAWAY TERMINÉ** 🎉", + timeRemaining: "Temps restant : **{duration}**!", + inviteToParticipate: "Réagissez avec 🎉 pour participer!", + winMessage: "Félicitations, {winners}! Vous avez gagné **{prize}**!", + embedFooter: "Giveaway", + noWinner: "Giveaway annulé, aucune participation valide.", + hostedBy: "Hébergé par: {user}", + winners: "gagnant(s)", + endedAt: "Se termine le", + units: { + seconds: "secondes", + minutes: "minutes", + hours: "heures", + days: "jours", + pluralS: false + } + } + }).then((gData) => { + console.log(gData); // Donne des informations sur le giveaway + }); + message.channel.send(`Giveaway créé !`); + }, +}; \ No newline at end of file diff --git a/commands/gestion/join.js b/commands/gestion/join.js new file mode 100644 index 0000000..2d24791 --- /dev/null +++ b/commands/gestion/join.js @@ -0,0 +1,287 @@ +const { ActionRowBuilder, StringSelectMenuBuilder, EmbedBuilder, ChannelType } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +module.exports = { + name: 'join', + description: 'Configure le système de join', + emote: '🔑', + category: 'gestion', + utilisation: 'leave [config/test]', + async execute(message, args, client) { + const guildId = message.guild.id; + const botId = message.client.user.id; + const subCommand = args[0]; + if (subCommand === 'config') { + 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[guildId] = data[guildId] || {}; + data[guildId].join = data[guildId].join || {}; + const salonKey = 'salon'; + const roleKey = 'role'; + const messageKey = 'message'; + const dmKey = 'dm'; + + // Création de l'embed + const embed = new EmbedBuilder() + .setTitle('Configuration du système de join') + .addFields( + { name: '🔊 Salon', value: `<#${data[guildId].join[salonKey]}>` || '❌', inline: true }, + { name: '🎭 Rôle', value: `<@&${data[guildId].join[roleKey]}>` || '❌', inline: true }, + { name: '📝 Message', value: data[guildId].join[messageKey] || '❌', inline: true }, + { name: '📧 DM', value: data[guildId].join[dmKey] || '❌', inline: true } + ) + .setColor('#0099ff'); + + // Création du select menu + const menu = new StringSelectMenuBuilder() + .setCustomId(`joinconfig_${guildId}`) + .setPlaceholder('Sélectionnez une option') + .addOptions([ + { + label: '🎭 Role', + description: 'Configurer le rôle de join', + value: 'role', + }, + { + label: '🔊 Salon', + description: 'Configurer le salon de join', + value: 'salon', + }, + { + label: '📝 Message', + description: 'Configurer le message de join', + value: 'message', + }, + { + label: '📧 DM', + description: 'Configurer les DM de join', + value: 'dm', + }, + { + label: '🚫 Del dm', + description: 'Supprimer le message de dm', + value: 'nodm', + }, + ]); + + const row = new ActionRowBuilder() + .addComponents(menu); + + const sendmessage = await message.channel.send({ embeds: [embed], components: [row] }); + const filter = i => i.customId.startsWith('joinconfig_') && i.user.id === message.author.id; + const filter2 = m => m.author.id === message.author.id; + const collector = message.channel.createMessageComponentCollector({ filter:filter, time: 240000 }); + + collector.on('collect', async i => { + const option = i.values[0]; + if ( option === 'nodm') { + 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].join) { + data[guildId].join.dm = null; + } + db.run('UPDATE gestion SET value = ? WHERE id = ?', [JSON.stringify(data), botId], function(err) { + if (err) { + console.error(err.message); + } + }); + let data2 = 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) : {}); + }); + }); + const updatedEmbed = new EmbedBuilder() + .setColor('#0099ff') + .setTitle('Configuration du système de join') + .addFields( + { name: '🔊 Salon', value: data2[guildId].join[salonKey] || '❌', inline: true }, + { name: '🎭 Rôle', value: data2[guildId].join[roleKey] || '❌', inline: true }, + { name: '📝 Message', value: data2[guildId].join[messageKey] || '❌', inline: true }, + { name: '📧 DM', value: data2[guildId].join[dmKey] || '❌', inline: true } + ) + .addFields(); + sendmessage.edit({ embeds: [updatedEmbed], components: [row] }); + }else { + await i.deferReply(); + const guildId = i.customId.split('_')[1]; + let promptMessage = ''; + switch (option) { + case 'commande': + promptMessage = 'Veuillez spécifier la commande de join.'; + break; + case 'role': + promptMessage = 'Veuillez spécifier le rôle de join.'; + break; + case 'salon': + promptMessage = 'Veuillez spécifier le salon de join.'; + break; + case 'message': + promptMessage = 'Veuillez spécifier le message de join.'; + break; + case 'dm': + promptMessage = 'Veuillez spécifier les DM de join.'; + break; + } + const question = await i.editReply(promptMessage); + const channelCollector = message.channel.createMessageCollector({ filter: filter2, max: 1, time: 60000 }); + channelCollector.on('collect', async m => { + + let value; + if (option === 'role') { + const match = m.content.match(/<@&(\d+)>/); + if (match) { + const id = match[1]; + try { + const role = m.guild.roles.cache.get(id); + if (!role) { + console.log(`Role ID: ${id}`); + console.log(`Role cache: ${m.guild.roles.cache.map(r => r.id)}`); + return message.reply('Le rôle mentionné n\'est pas valide ou n\'existe pas dans ce serveur.'); + } + value = id; + } catch(err) {} + } else { + return message.reply('Veuillez spécifier un rôle valide.'); + } + } else if (option === 'salon') { + const match = m.content.match(/<#(\d+)>/); + if (match) { + const id = match[1]; + const channel = m.guild.channels.cache.get(id); + if (!channel || channel.type !== ChannelType.GuildText) { + return message.reply('Le salon mentionné n\'est pas valide ou n\'est pas un salon de texte dans ce serveur.'); + } + value = id; + } else { + return message.reply('Veuillez spécifier un salon valide.'); + } + } else { + value = m.content; + } + 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[guildId] = data[guildId] || {}; + data[guildId].join = data[guildId].join || {}; + data[guildId].join[option] = value; + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], (err) => { + if (err) { + return message.reply('Une erreur s\'est produite lors de la mise à jour de la base de données.'); + + } + }); + + let data2 = 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) : {}); + }); + }); + await m.delete(); + await question.delete(); + + const updatedEmbed = new EmbedBuilder() + .setColor('#0099ff') + .setTitle('Configuration du système de join') + .addFields( + { name: '🔊 Salon', value: `<#${data2[guildId].join[salonKey]}>` || '❌', inline: true }, + { name: '🎭 Rôle', value: `<@&${data2[guildId].join[roleKey]}>` || '❌', inline: true }, + { name: '📝 Message', value: data2[guildId].join[messageKey] || '❌', inline: true }, + { name: '📧 DM', value: data2[guildId].join[dmKey] || '❌', inline: true } + ) + .addFields(); + sendmessage.edit({ embeds: [updatedEmbed], components: [row] }); + }); + } + }); + } else if (subCommand === "test") { + 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); + } + const userid = message.author.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) : {}); + }); + }); + + data = data[guildId]?.join || {}; + + try { + if (data.dm) { + const dmChannel = await message.author.createDM(); + const formattedMessage = replacePlaceholders(data.dm, message.member); + await dmChannel.send(formattedMessage); + } + } catch (err) { + } + + try { + if (data.salon && data.message) { + const channel = message.guild.channels.cache.get(data.salon); + if (channel && channel.type === ChannelType.GuildText) { + const formattedMessage = replacePlaceholders(data.message, message.member); + await channel.send(formattedMessage); + } + } + } catch (err) { + } + + try { + if (data.role) { + const role = message.guild.roles.cache.get(data.role); + if (role) { + await message.member.roles.add(role); + console.log(`Le rôle ${role.name} a été attribué à ${message.member.user.tag}`); + } + } + } catch (err) { + } + return message.reply("Vous venez de tester le système de join"); + } + }, +}; \ No newline at end of file diff --git a/commands/gestion/leave.js b/commands/gestion/leave.js new file mode 100644 index 0000000..7817ff9 --- /dev/null +++ b/commands/gestion/leave.js @@ -0,0 +1,183 @@ +const { ActionRowBuilder, StringSelectMenuBuilder, EmbedBuilder, ChannelType } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +module.exports = { + name: 'leave', + description: 'Configure le système de leave', + emote: '🚪', + category: 'gestion', + utilisation: 'leave [config/test]', + async execute(message, args, client) { + const guildId = message.guild.id; + const botId = message.client.user.id; + const subCommand = args[0]; + if (subCommand === 'config') { + 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[guildId] = data[guildId] || {}; + data[guildId].leave = data[guildId].leave || {}; + const salonKey = 'salon'; + const messageKey = 'message'; + + // Création de l'embed + const embed = new EmbedBuilder() + .setTitle('Configuration du système de leave') + .addFields( + { name: '🔊 Salon', value: `<#${data[guildId].leave[salonKey]}>` || '❌', inline: true }, + { name: '📝 Message', value: data[guildId].leave[messageKey] || '❌', inline: true }, + ) + .setColor('#0099ff'); + + // Création du select menu + const menu = new StringSelectMenuBuilder() + .setCustomId(`leaveconfig_${guildId}`) + .setPlaceholder('Sélectionnez une option') + .addOptions([ + { + label: '🔊 Salon', + description: 'Configurer le salon de leave', + value: 'salon', + }, + { + label: '📝 Message', + description: 'Configurer le message de leave', + value: 'message', + } + ]); + + const row = new ActionRowBuilder() + .addComponents(menu); + + const sendmessage = await message.channel.send({ embeds: [embed], components: [row] }); + const filter = i => i.customId.startsWith('leaveconfig_') && i.user.id === message.author.id; + const filter2 = m => m.author.id === message.author.id; + const collector = message.channel.createMessageComponentCollector({ filter:filter, time: 240000 }); + + collector.on('collect', async i => { + const option = i.values[0]; + + await i.deferReply(); + const guildId = i.customId.split('_')[1]; + let promptMessage = ''; + switch (option) { + case 'salon': + promptMessage = 'Veuillez spécifier le salon de leave.'; + break; + case 'message': + promptMessage = 'Veuillez spécifier le message de leave.'; + break;k; + } + const question = await i.editReply(promptMessage); + const channelCollector = message.channel.createMessageCollector({ filter: filter2, max: 1, time: 60000 }); + channelCollector.on('collect', async m => { + + let value; + if (option === 'salon') { + const match = m.content.match(/<#(\d+)>/); + if (match) { + const id = match[1]; + const channel = m.guild.channels.cache.get(id); + if (!channel || channel.type !== ChannelType.GuildText) { + return message.reply('Le salon mentionné n\'est pas valide ou n\'est pas un salon de texte dans ce serveur.'); + } + value = id; + } else { + return message.reply('Veuillez spécifier un salon valide.'); + } + } else { + value = m.content; + } + 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[guildId] = data[guildId] || {}; + data[guildId].leave = data[guildId].leave || {}; + data[guildId].leave[option] = value; + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [message.client.user.id, JSON.stringify(data)], (err) => { + if (err) { + return message.reply('Une erreur s\'est produite lors de la mise à jour de la base de données.'); + + } + }); + + let data2 = 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) : {}); + }); + }); + await m.delete(); + await question.delete(); + + const updatedEmbed = new EmbedBuilder() + .setColor('#0099ff') + .setTitle('Configuration du système de leave') + .addFields( + { name: '🔊 Salon', value: `<#${data2[guildId].leave[salonKey]}>` || '❌', inline: true }, + { name: '📝 Message', value: data2[guildId].leave[messageKey] || '❌', inline: true }, + ) + .addFields(); + sendmessage.edit({ embeds: [updatedEmbed], components: [row] }); + }); + }); + } else if (subCommand === "test") { + 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); + } + const userid = message.author.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) : {}); + }); + }); + + data = data[guildId]?.leave || {}; + + try { + if (data.salon && data.message) { + const channel = message.guild.channels.cache.get(data.salon); + if (channel && channel.type === ChannelType.GuildText) { + const formattedMessage = replacePlaceholders(data.message, message.member); + await channel.send(formattedMessage); + } + } + } catch (err) { + } + + + return message.reply("Vous venez de tester le système de leave"); + } + }, +}; \ No newline at end of file diff --git a/commands/gestion/piconly.js b/commands/gestion/piconly.js new file mode 100644 index 0000000..e087b26 --- /dev/null +++ b/commands/gestion/piconly.js @@ -0,0 +1,50 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); +module.exports = { + name: "piconly", + description: "Permet de mettre le piconly sur un salon", + emote: '📸', + utilisation: 'piconly [salon/id]', + category: 'gestion', + async execute(message, args, client) { + const channelID = message.mentions.channels.first()?.id || client.channels.cache.get(args[0])?.id; + if (!channelID) { + return message.reply("veuilez indiquer un salon valide") + } + const guildId = message.guild.id; + 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) : {}); + }); + }); + data.piconly = data.piconly || {}; + data.piconly[guildId] = data.piconly[guildId] || {}; + const channeldbid = data.piconly[guildId]; + if (channelID === channeldbid) { + delete data.piconly[guildId] + db.run('UPDATE gestion SET value = ? WHERE id = ?', [JSON.stringify(data), botId], function(err) { + if (err) { + console.error(err.message); + return message.reply('Une erreur s\'est produite lors de la mise à jour de la base de données.'); + } + message.reply(`Le piconly a etait enléve du salon <#${channelID}>.`); + }); + }else { + data.piconly = data.piconly || {}; + data.piconly[guildId] = data.piconly[guildId] || {}; + data.piconly[guildId] = channelID; + db.run('UPDATE gestion SET value = ? WHERE id = ?', [JSON.stringify(data), botId], function(err) { + if (err) { + console.error(err.message); + return message.reply('Une erreur s\'est produite lors de la mise à jour de la base de données.'); + } + message.reply(`Le salon a été marqué pour le piconly est desormais dans la salon <#${channelID}>.`); + }); + } + } +} \ No newline at end of file diff --git a/commands/logs/logs.js b/commands/logs/logs.js index a1b5d76..21d5b86 100644 --- a/commands/logs/logs.js +++ b/commands/logs/logs.js @@ -26,7 +26,8 @@ module.exports = { { 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: '🔧 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].modlog}>` : 'Non configuré', inline: true }, ); const selectMenu = new StringSelectMenuBuilder() @@ -114,10 +115,12 @@ module.exports = { .setColor('#0099ff') .setTitle('Configuration des logs') .addFields( - { name: '📝 Logs de messages', value: data2[guildId]?.messagelog ? `<#${data2[guildId].messagelog}>` : 'Non configuré', inline: true }, - { name: '📚 Logs de rôles', value: data2[guildId]?.rolelog ? `<#${data2[guildId].rolelog}>` : 'Non configuré', inline: true }, - { name: '🎙️ Logs vocaux', value: data2[guildId]?.vocallog ? `<#${data2[guildId].vocallog}>` : 'Non configuré', inline: true }, - { name: '🛡️ Logs de raid', value: data2[guildId]?.raidlog ? `<#${data2[guildId].raidlog}>` : 'Non configuré', inline: true } + { 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].modlog}>` : 'Non configuré', inline: true }, ); logmessage.edit({ embeds: [updatedEmbed], components: [row] }); diff --git a/commands/moderation/derank.js b/commands/moderation/derank.js new file mode 100644 index 0000000..953cd4a --- /dev/null +++ b/commands/moderation/derank.js @@ -0,0 +1,43 @@ +const { EmbedBuilder, User } = require("discord.js") +const { getPermissionLevel } = require('../fonction'); + +module.exports = { + name: 'derank', + aliases: ['unrank'], + description: 'Remove a role from a member', + emote: '🚫', + utilisation: 'derank <@member> ', + 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'); + } + } + + try { + await member.roles.set([]); + message.channel.send(`Tous les rôles ont été supprimés de ${member}.`); + } catch (error) { + message.reply('Une erreur s\'est produite lors de la suppression des rôles du membre.'); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/derankall.js b/commands/moderation/derankall.js new file mode 100644 index 0000000..cc77f21 --- /dev/null +++ b/commands/moderation/derankall.js @@ -0,0 +1,30 @@ +module.exports = { + name: 'derankall', + aliases: ['removeallroles'], + description: 'Retire un rôle à tous les membres qui le détiennent', + emote: '🚫', + utilisation: 'derankall <@role>', + category: 'moderation', + + async execute(message, args, client) { + const role = message.mentions.roles.first() || message.guild.roles.cache.get(args[0]);; + if (!role) { + return message.reply('Veuillez mentionner un rôle à retirer'); + } + + const membersWithRole = message.guild.members.cache.filter(member => member.roles.cache.has(role.id)); + if (membersWithRole.size === 0) { + return message.reply('Aucun membre avec ce rôle n\'a été trouvé'); + } + + membersWithRole.forEach(async (member) => { + try { + await member.roles.remove(role); + } catch (error) { + console.error(`Erreur lors du retrait du rôle ${role.name} à ${member.user.tag}:`, error); + } + }); + + message.channel.send(`Le rôle ${role.name} a été retiré à tous les membres qui le détiennent.`); + }, +}; \ No newline at end of file diff --git a/commands/moderation/rlm.js b/commands/moderation/rlm.js new file mode 100644 index 0000000..912334f --- /dev/null +++ b/commands/moderation/rlm.js @@ -0,0 +1,23 @@ +const Discord = require('discord.js'); + +module.exports = { + name: "lrm", + aliases: ["rolemembers","rlm"], + description: "Permet de voir les membres d'un rôle", + category: 'gestion', + emote: '👥', + utilisation: 'lrm [nom du rôle]', + async execute(message, args, client) { + let role = message.mentions.roles.first() || message.guild.roles.cache.get(args[1]) || message.guild.roles.cache.find(r => r.name === args[0]) || message.guild.roles.cache.find(r => r.id === args[0]) || message.guild.roles.cache.find(r => r.name.toLowerCase() === args[0].toLowerCase()) || message.guild.roles.cache.find(r => r.id.toLowerCase() === args[0].toLowerCase()) + if (!role) return; + let members = role.members.map(m=>m.user).join("\n"); + let count = role.members.size; + + let embed = new Discord.EmbedBuilder() + .setTitle(`Liste des membres du ${role.name} `) + .setDescription(`${members}`) + .setFooter({ text: `Total: ${count}` }); + + message.channel.send({embeds : [embed]}); + } +} \ No newline at end of file diff --git a/commands/moderation/voicekick.js b/commands/moderation/voicekick.js new file mode 100644 index 0000000..f20ffc3 --- /dev/null +++ b/commands/moderation/voicekick.js @@ -0,0 +1,21 @@ +const Discord = require('discord.js'); + +module.exports = { + name: "voicekick", + aliases: ["vckick"], + description: "Permet de kick un utilisateur d'un vocal", + category: 'moderation', + emote: '🔊', + utilisation: 'voicekick @user/id]', + async execute(message, args, client) { + let user = message.guild.members.cache.get(args[0]) || message.mentions.members.first(); + if (!user) return; + if(!user.voice.channel) return message.reply(`${user.user.username} n'est pas dans un salon vocal`) + await user.voice.setChannel(null).then(async () => { + await message.reply(`${user.user.username} a été kick du salon vocal`) + }).catch(async () => { + await message.reply(`${user.user.username} n'a pas pu être kick du salon vocal`) + }) + + } +} \ No newline at end of file diff --git a/commands/moderation/voicekickall.js b/commands/moderation/voicekickall.js new file mode 100644 index 0000000..2f72db8 --- /dev/null +++ b/commands/moderation/voicekickall.js @@ -0,0 +1,27 @@ +const Discord = require('discord.js'); + +module.exports = { + name: "voicekickall", + aliases: ["vckickall"], + description: "Permet de kick tout les membres d'un channel vocal", + category: 'moderation', + emote: '🔊', + utilisation: 'voicekickall [#channel/id] ', + async execute(message, args, client) { + let channelInput = message.mentions.channels.first() || message.guild.channels.cache.get(args[0]) + if (!channelInput) return; + + if (channelInput.type !== Discord.ChannelType.GuildVoice) return message.reply('veuillez mentioner un salon vocal'); + + try { + channelInput.members.forEach(member => { + if (member.voice.channel) { + member.voice.setChannel(null) + } + }) + await message.reply(`Le salon vocal ${channelInput} a été vidé.`); + } catch (error) { + await message.reply('Une erreur s\'est produite lors du déplacement des membres du salon vocal.'); + } + } +} \ No newline at end of file diff --git a/commands/moderation/voicemove.js b/commands/moderation/voicemove.js new file mode 100644 index 0000000..08ed087 --- /dev/null +++ b/commands/moderation/voicemove.js @@ -0,0 +1,27 @@ +const Discord = require('discord.js'); + +module.exports = { + name: "voicemove", + aliases: ["vcmove"], + description: "Permet de move un utilisateur d'un vocal", + category: 'moderation', + emote: '🔊', + utilisation: 'voicemove @user/id #salon/id', + async execute(message, args, client) { + let user = message.guild.members.cache.get(args[0]) || message.mentions.members.first(); + let channel = message.guild.channels.cache.get(args[1]) || message.mentions.channels.first() || message.guild.channels.cache.find(c => c.name === args[1]) || message.guild.channels.cache.find(c => c.name.toLowerCase() === args[1].toLowerCase()) + if (!user) return; + if (!channel) return; + if (channel.type !== Discord.ChannelType.GuildVoice) return message.reply("le salon"); + let userVoiceChannel = user.voice.channel; + if(!userVoiceChannel) return message.reply(`${user.user.username} n'est pas dans un channel vocal`) + + await user.voice.setChannel(channel) + .then(async () => { + await message.reply(`${user.user.username} a été déplacé du channel vocal (${userVoiceChannel}) vers le channel vocal (${channel})`); + }) + .catch(error => { + message.reply('Une erreur s\'est produite lors du déplacement de l\'utilisateur.'); + }); + } +} \ No newline at end of file diff --git a/commands/moderation/voicemoveall.js b/commands/moderation/voicemoveall.js new file mode 100644 index 0000000..2f20c29 --- /dev/null +++ b/commands/moderation/voicemoveall.js @@ -0,0 +1,25 @@ +const Discord = require('discord.js'); + +module.exports = { + name: "voicemoveall", + aliases: ["vcmoveall"], + description: "Permet de faire venir tous les membres en vocal du serveur dans un channel", + category: 'moderation', + emote: '🔊', + utilisation: 'voicemoveall [#channel/id]', + async execute(message, args, client) { + let channelInput = message.mentions.channels.first() || message.guild.channels.cache.get(args[0]) || message.member.voice.channel; + if (!channelInput) return message.channel.send(`Vous devez être dans un salon vocal pour utiliser cette commande ou sinon en mentionner un.`) + + if (channelInput.type !== Discord.ChannelType.GuildVoice) return; + + const channels = message.guild.channels.cache.filter(ch => ch.id !== channelInput.id && ch.type !== Discord.ChannelType.GuildVoice && ch.members.size > 0) + for await(const [_, channel] of channels) + for await(const [_, member] of channel.members) { + await member.voice.setChannel(channelInput, `voicemoveall by ${message.author.tag}`).catch(() => { + }) + } + + message.channel.send(`Tout les membres ont été déplacé vers ${channelInput}`) + } +} \ No newline at end of file diff --git a/commands/utils/booster.js b/commands/utils/booster.js new file mode 100644 index 0000000..d547e05 --- /dev/null +++ b/commands/utils/booster.js @@ -0,0 +1,19 @@ +const {EmbedBuilder} = require('discord.js'); + +module.exports = { + name: 'booster', + description: "Permet de voir les boosters du serveur", + category: 'utils', + emote: '🚀', + utilisation: 'booster', + async execute(message, args, client) { + + let boosters = message.guild.members.cache.filter(m => m.premiumSince)?.map(function(m) {return `<@${m.id}> boost depuis : `}).join("\n"); + if(!boosters || boosters.length < 1) boosters = "Personne n'est en train de booster le serveur"; + + let embed = new EmbedBuilder() + .setTitle("Boosters") + .setDescription(`**Il y a ${message.guild.members.cache.filter(m => m.premiumSince).size} boosters**\n\n${boosters}`) + message.channel.send({embeds : [embed]}); + }, +}; \ No newline at end of file diff --git a/commands/utils/gif.js b/commands/utils/gif.js index adba5a1..c37b117 100644 --- a/commands/utils/gif.js +++ b/commands/utils/gif.js @@ -3,7 +3,7 @@ const giphy = require("giphy-api")("eW1dIGt8WPveUcxEZgXAFtEmuZ8MTxmy"); module.exports = { name: 'gif', - usage: 'gif [terme de recherche]', + utilisation: 'gif [terme de recherche]', description: 'Recherche un gif basé sur le terme de recherche fourni.', emote: '🎮', category: 'utils', diff --git a/commands/utils/help.js b/commands/utils/help.js index 39dc048..16c8872 100644 --- a/commands/utils/help.js +++ b/commands/utils/help.js @@ -13,6 +13,22 @@ module.exports = { async execute(message, args, client) { const botId = client.user.id; const guildId = message.guild.id; + if (args[0] === 'msg' ) { + 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 } + ) + return message.reply({ embeds: [embed] }); + } let data = await new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { if (err) { diff --git a/events/antiraid.js/alerteping.js b/events/antiraid.js/alerteping.js index 2944a10..3406180 100644 --- a/events/antiraid.js/alerteping.js +++ b/events/antiraid.js/alerteping.js @@ -6,9 +6,7 @@ module.exports = { name: Events.GuildMemberUpdate, async execute(oldMember, newMember, client) { const guildId = newMember.guild.id - console.log("dddddddd") if (!oldMember.permissions.has(PermissionsBitField.Flags.Administrator) && newMember.permissions.has(PermissionsBitField.Flags.Administrator)) { - console.log('aaaaaa') let data = await new Promise((resolve, reject) => { @@ -25,7 +23,6 @@ module.exports = { } if (data[newMember.guild.id].alerte === 'on') { - console.log("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é.'; diff --git a/events/auto/autoreact.js b/events/auto/autoreact.js new file mode 100644 index 0000000..81fb5fb --- /dev/null +++ b/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/events/client/ready.js b/events/client/ready.js index 6206349..73ff984 100644 --- a/events/client/ready.js +++ b/events/client/ready.js @@ -49,10 +49,20 @@ module.exports = { } }); }); - }); + }); 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', (reason, p) => { console.log(' [antiCrash] :: Unhandled Rejection/Catch'); console.log(reason, p); diff --git a/events/gestion/buttongestion.js b/events/gestion/buttongestion.js index e64f640..330b6b0 100644 --- a/events/gestion/buttongestion.js +++ b/events/gestion/buttongestion.js @@ -105,6 +105,45 @@ module.exports = { } 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){ + console.log(err) + } + + await interaction.reply({ content: '💒 Vous êtes maintenant mariés! 💒'}); } }, -}; \ No newline at end of file +}; +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/events/gestion/joinevent.js b/events/gestion/joinevent.js new file mode 100644 index 0000000..7136bec --- /dev/null +++ b/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/events/gestion/leaveevent.js b/events/gestion/leaveevent.js new file mode 100644 index 0000000..b9eb74f --- /dev/null +++ b/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/events/gestion/messageCreate.js b/events/gestion/messageCreate.js index 91983df..7c03146 100644 --- a/events/gestion/messageCreate.js +++ b/events/gestion/messageCreate.js @@ -19,6 +19,9 @@ module.exports = { }); }); const suggestChannelId = data.suggestChannel && data.suggestChannel[guildId]; + data.piconly = data.piconly || {}; + data.piconly[guildId] = data.piconly[guildId] || {}; + const channelID = data.piconly[guildId]; if (message.channel.id === suggestChannelId && !message.author.bot) { await message.delete(); @@ -40,6 +43,11 @@ module.exports = { const suggestionMessage = await message.channel.send({ embeds: [embed], components: [row] }); suggestionMessage.react('👎') suggestionMessage.react('👍') + } else if (message.channel.id === channelID) { + if (message.attachments.size === 0) { + message.delete() + } + } }, }; \ No newline at end of file diff --git a/giveaways.json b/giveaways.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/giveaways.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/loaders/loadCommands.js b/loaders/loadCommands.js index 40119b3..64b99fa 100644 --- a/loaders/loadCommands.js +++ b/loaders/loadCommands.js @@ -1,6 +1,7 @@ const fs = require('fs'); const path = require('path'); const sqlite3 = require('sqlite3').verbose(); +const { ChannelType } = require('discord.js'); module.exports = (client) => { const loadCommands = (dir) => { @@ -69,7 +70,7 @@ module.exports = (client) => { client.on('messageCreate', async message => { const botId = 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) { @@ -115,7 +116,7 @@ module.exports = (client) => { return; } if (command) { - const permissionLevel = await getPermissionLevel(message.member, client, guildId); + const permissionLevel = await getPermissionLevel(message.member, client); try { if (permissionLevel === 11) { @@ -125,8 +126,8 @@ module.exports = (client) => { } else { return message.reply("Vous n'avez pas accès à cette commande."); } - } catch { - console.error(`Erreur lors de l'exécution de la commande: ${command.name}`); + } 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.'); } } diff --git a/main.js b/main.js index dbc828f..2e453b3 100644 --- a/main.js +++ b/main.js @@ -3,10 +3,20 @@ const { Client, IntentsBitField, Collection } = require("discord.js"); const loadCommands = require("./loaders/loadCommands"); const loadEvents = require("./loaders/loadEvents"); const client = new Client({intents: new IntentsBitField(3276799)}); +const { GiveawaysManager } = require('discord-giveaways'); client.events = new Collection(); client.commands = new Collection(); - +client.giveawaysManager = new GiveawaysManager(client, { + storage: './giveaways.json', + updateCountdownEvery: 5000, + default: { + botsCanWin: false, + exemptPermissions: [], + embedColor: '#FF0000', + reaction: '🎉' + } +}); (async () => { loadCommands(client); loadEvents(client); diff --git a/package-lock.json b/package-lock.json index 584c282..e31bf32 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,20 +9,38 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { + "@m3rcena/weky": "^4.3.1", "axios": "^1.6.7", "color-name-list": "^10.19.0", "discord-gamecord": "^4.4.1", + "discord-giveaway": "^1.1.5", + "discord-giveaways": "^6.0.1", "discord.js": "^14.14.1", "discordjs-button-pagination": "^3.0.1", "dotenv": "^16.4.4", + "figlet": "^1.7.0", "giphy-api": "^2.0.2", + "mal-scraper": "^2.13.1", + "md5": "^2.3.0", "ms": "^2.1.3", "quick.db": "^7.1.3", "sqlite": "^5.1.1", "sqlite3": "^5.1.7", + "to-zalgo": "^1.0.1", "weather": "^1.0.4" } }, + "node_modules/@babel/runtime": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@discordjs/builders": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.7.0.tgz", @@ -48,6 +66,20 @@ "node": ">=16.11.0" } }, + "node_modules/@discordjs/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@discordjs/formatters": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.3.tgz", @@ -135,6 +167,90 @@ "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "optional": true }, + "node_modules/@m3rcena/weky": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@m3rcena/weky/-/weky-4.3.1.tgz", + "integrity": "sha512-rSQMH0YROX+i2k3SajXzcjts005Hi4FUNKkmg+DCiL3HsbEI1PvxZnruTaFwCPuR7dAgRk2+eb8MgSRJYlUotg==", + "dependencies": { + "chalk": "^5.3.0", + "html-entities": "^2.4.0", + "mathjs": "^12.2.1", + "node-fetch": "^3.3.2", + "quick.db": "^9.1.7", + "string-width": "^7.0.0" + } + }, + "node_modules/@m3rcena/weky/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@m3rcena/weky/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" + }, + "node_modules/@m3rcena/weky/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/@m3rcena/weky/node_modules/quick.db": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/quick.db/-/quick.db-9.1.7.tgz", + "integrity": "sha512-ZLPVLVFZtvFRLHqIK99iyrLDUznOTpnp5tB+QpGErT+reDSvgBELuVsMkGSSiqKT9R2YSOhO+096Wb0xTaOHMA==", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/@m3rcena/weky/node_modules/string-width": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@m3rcena/weky/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@npmcli/fs": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", @@ -198,6 +314,23 @@ "node": ">= 6" } }, + "node_modules/@types/bson": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", + "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mongodb": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", + "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", + "dependencies": { + "@types/bson": "*", + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "20.11.19", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", @@ -238,6 +371,17 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "optional": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -371,6 +515,16 @@ "readable-stream": "^3.4.0" } }, + "node_modules/bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -381,6 +535,14 @@ "concat-map": "0.0.1" } }, + "node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -442,12 +604,85 @@ "node": ">=10" } }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/centra": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/centra/-/centra-2.6.0.tgz", "integrity": "sha512-dgh+YleemrT8u85QL11Z6tYhegAs3MMxsaWAq/oXeAmYJ7VxL3SI9TZtnfaEvNDMAPolj25FXIb3S+HCI4wQaQ==", "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info." }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "engines": { + "node": "*" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -491,6 +726,18 @@ "node": ">= 0.8" } }, + "node_modules/complex.js": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz", + "integrity": "sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -503,6 +750,65 @@ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "optional": true }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cron-parser": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-2.18.0.tgz", + "integrity": "sha512-s4odpheTyydAbTBQepsqd2rNWGa2iV3cyo8g7zbI2QQYGLVsfbhmwukayS1XHppe02Oy1fg7mg6xoaraVJeEcg==", + "dependencies": { + "is-nan": "^1.3.0", + "moment-timezone": "^0.5.31" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "engines": { + "node": "*" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "engines": { + "node": ">= 12" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -526,6 +832,11 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "optional": true }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -548,6 +859,46 @@ "node": ">=4.0.0" } }, + "node_modules/deepmerge-ts": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-4.3.0.tgz", + "integrity": "sha512-if3ZYdkD2dClhnXR5reKtG98cwyaRT1NeugQoAPTTfsOpV9kqyeiBF9Qa5RHjemb3KzD5ulqygv6ED3t5j9eJw==", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -562,6 +913,14 @@ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "optional": true }, + "node_modules/denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/detect-libc": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", @@ -585,6 +944,78 @@ "node-fetch": "^2.6.7" } }, + "node_modules/discord-giveaway": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/discord-giveaway/-/discord-giveaway-1.1.5.tgz", + "integrity": "sha512-jcJ2FyS7o1A/SYcglSY2Xf4wZj1JWR9Tn4NjcvqBCqZEfNShyX6aUmRG0+ZZRN+vBndHM61gBseK0B2CW8HaCg==", + "dependencies": { + "discord.js": "^12.3.1", + "events": "^3.2.0", + "mongoose": "^5.10.0", + "node-schedule": "^1.3.2", + "pretty-ms": "^7.0.0" + } + }, + "node_modules/discord-giveaway/node_modules/@discordjs/collection": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", + "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==", + "deprecated": "no longer supported" + }, + "node_modules/discord-giveaway/node_modules/discord.js": { + "version": "12.5.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz", + "integrity": "sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw==", + "deprecated": "no longer supported", + "dependencies": { + "@discordjs/collection": "^0.1.6", + "@discordjs/form-data": "^3.0.1", + "abort-controller": "^3.0.0", + "node-fetch": "^2.6.1", + "prism-media": "^1.2.9", + "setimmediate": "^1.0.5", + "tweetnacl": "^1.0.3", + "ws": "^7.4.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/discord-giveaway/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/discord-giveaways": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/discord-giveaways/-/discord-giveaways-6.0.1.tgz", + "integrity": "sha512-hs6Vtb62VdlV7NfB93Phaxc8FW0cH4N1Nkb0bXVZ2npgn73yGOFVmdp8bBP5gsC2ady9OAXXI8Gb66t1IddkFw==", + "dependencies": { + "deepmerge-ts": "^4.2.1", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">=16.9.0" + }, + "peerDependencies": { + "discord.js": ">=14.0.0" + } + }, "node_modules/discord.js": { "version": "14.14.1", "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.14.1.tgz", @@ -672,6 +1103,57 @@ "npm": ">=7.0.0" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dotenv": { "version": "16.4.4", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.4.tgz", @@ -706,6 +1188,17 @@ "once": "^1.4.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -721,6 +1214,46 @@ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "optional": true }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-latex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", + "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -734,6 +1267,39 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figlet": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.7.0.tgz", + "integrity": "sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==", + "bin": { + "figlet": "bin/index.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -771,6 +1337,29 @@ "node": ">= 6" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fraction.js": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.4.tgz", + "integrity": "sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -793,6 +1382,14 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "optional": true }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gauge": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", @@ -812,6 +1409,35 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/giphy-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/giphy-api/-/giphy-api-2.0.2.tgz", @@ -842,18 +1468,73 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "optional": true }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "optional": true }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/html-entities": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", @@ -869,6 +1550,24 @@ } ] }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -999,6 +1698,11 @@ "node": ">= 12" } }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -1014,18 +1718,48 @@ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "optional": true }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "optional": true }, + "node_modules/javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==" + }, "node_modules/jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "optional": true }, + "node_modules/kareem": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", + "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -1036,6 +1770,11 @@ "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" }, + "node_modules/long-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==" + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -1079,6 +1818,66 @@ "node": ">= 10" } }, + "node_modules/mal-scraper": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/mal-scraper/-/mal-scraper-2.13.1.tgz", + "integrity": "sha512-yxqbP2Hr6o/S/RDCb4G2e0U5Cil2aK7JhHnjM50M5/TDu456P1n1Ey6V4rkGRev++v2SHtVxUEPojMlTzOWaMg==", + "dependencies": { + "axios": "^1.4.0", + "cheerio": "^1.0.0-rc.12", + "match-sorter": "^6.3.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/match-sorter": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz", + "integrity": "sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==", + "dependencies": { + "@babel/runtime": "^7.23.8", + "remove-accents": "0.5.0" + } + }, + "node_modules/mathjs": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-12.4.0.tgz", + "integrity": "sha512-4Moy0RNjwMSajEkGGxNUyMMC/CZAcl87WBopvNsJWB4E4EFebpTedr+0/rhqmnOSTH3Wu/3WfiWiw6mqiaHxVw==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "complex.js": "^2.1.1", + "decimal.js": "^10.4.3", + "escape-latex": "^1.2.0", + "fraction.js": "4.3.4", + "javascript-natural-sort": "^0.7.1", + "seedrandom": "^3.0.5", + "tiny-emitter": "^2.1.0", + "typed-function": "^4.1.1" + }, + "bin": { + "mathjs": "bin/cli.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -1233,11 +2032,202 @@ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.45", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", + "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mongodb": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", + "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", + "dependencies": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + }, + "peerDependenciesMeta": { + "aws4": { + "optional": true + }, + "bson-ext": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "mongodb-extjson": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb/node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/mongodb/node_modules/optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "dependencies": { + "require-at": "^1.0.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mongodb/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/mongodb/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/mongodb/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/mongoose": { + "version": "5.13.22", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.22.tgz", + "integrity": "sha512-p51k/c4X/MfqeQ3I1ranlDiggLzNumZrTDD9CeezHwZxt2/btf+YZD7MCe07RAY2NgFYVMayq6jMamw02Jmf9w==", + "dependencies": { + "@types/bson": "1.x || 4.0.x", + "@types/mongodb": "^3.5.27", + "bson": "^1.1.4", + "kareem": "2.3.2", + "mongodb": "3.7.4", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.8.4", + "mquery": "3.2.5", + "ms": "2.1.2", + "optional-require": "1.0.x", + "regexp-clone": "1.0.0", + "safe-buffer": "5.2.1", + "sift": "13.5.2", + "sliced": "1.0.1" + }, + "engines": { + "node": ">=4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==", + "peerDependencies": { + "mongoose": "*" + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mpath": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", + "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", + "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", + "dependencies": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/mquery/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/mquery/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "node_modules/multichar-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/multichar-regex/-/multichar-regex-2.0.0.tgz", + "integrity": "sha512-CXPoPXfN5SO2FcpueDeCMoZuJHoX6gnDoQMFIP7HIhpVZ38Txdks77ZLb8Uh9UkIZhhuHKjdTX8NqOER+QRmog==" + }, "node_modules/napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", @@ -1271,6 +2261,24 @@ "node": "^16 || ^18 || >= 20" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -1314,6 +2322,16 @@ "node": ">= 10.12.0" } }, + "node_modules/node-schedule": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-1.3.3.tgz", + "integrity": "sha512-uF9Ubn6luOPrcAYKfsXWimcJ1tPFtQ8I85wb4T3NgJQrXazEzojcFZVk46ZlLHby3eEJChgkV/0T689IsXh2Gw==", + "dependencies": { + "cron-parser": "^2.18.0", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.3.0" + } + }, "node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -1344,6 +2362,25 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1352,6 +2389,14 @@ "wrappy": "1" } }, + "node_modules/optional-require": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", + "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==", + "engines": { + "node": ">=4" + } + }, "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -1367,6 +2412,37 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -1413,6 +2489,50 @@ "node": ">=10" } }, + "node_modules/pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "dependencies": { + "parse-ms": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prism-media": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.5.tgz", + "integrity": "sha512-IQdl0Q01m4LrkN1EGIE9lphov5Hy7WWlH6ulf5QdGePLlPas9p2mhgddTEHrlaXYjjFToM1/rWuwF37VF4taaA==", + "peerDependencies": { + "@discordjs/opus": ">=0.8.0 <1.0.0", + "ffmpeg-static": "^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0", + "node-opus": "^0.3.3", + "opusscript": "^0.0.8" + }, + "peerDependenciesMeta": { + "@discordjs/opus": { + "optional": true + }, + "ffmpeg-static": { + "optional": true + }, + "node-opus": { + "optional": true + }, + "opusscript": { + "optional": true + } + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -1455,6 +2575,14 @@ "lodash": "^4.17.20" } }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -1482,6 +2610,29 @@ "node": ">= 6" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + }, + "node_modules/remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==" + }, + "node_modules/require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", + "engines": { + "node": ">=4" + } + }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -1531,6 +2682,23 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "optional": true }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + }, "node_modules/semver": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", @@ -1545,12 +2713,46 @@ "node": ">=10" } }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "optional": true }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/sift": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", + "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -1600,6 +2802,11 @@ "simple-concat": "^1.0.0" } }, + "node_modules/sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==" + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -1638,6 +2845,20 @@ "node": ">= 10" } }, + "node_modules/sorted-array-functions": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", + "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==" + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", @@ -1784,6 +3005,19 @@ "node": ">=8" } }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "node_modules/to-zalgo": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-zalgo/-/to-zalgo-1.0.1.tgz", + "integrity": "sha512-yVkQh7QSR0h4cJ2BN89ZCinwVvMeQMuaZ2d/07LIPRTW27Zs77cfN5tRyO2agbfHkvquMtpTBExbfhbaLrLYkQ==", + "dependencies": { + "unicode-string": "^1.0.0" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -1810,6 +3044,19 @@ "node": "*" } }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/typed-function": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.1.1.tgz", + "integrity": "sha512-Pq1DVubcvibmm8bYcMowjVnnMwPVMeh0DIdA8ad8NZY2sJgapANJmiigSUwlt+EgXxpfIv8MWrQXTIzkfYZLYQ==", + "engines": { + "node": ">= 14" + } + }, "node_modules/undici": { "version": "5.27.2", "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz", @@ -1826,6 +3073,14 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, + "node_modules/unicode-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unicode-string/-/unicode-string-1.1.1.tgz", + "integrity": "sha512-pM+OYI9vgooXRzuBwjch+aj3TViQTPyQxSkAoVbagx6u2itWx+Z/DWH/kx4WhPm99JTt8fOSimb8/uW8LQOZuQ==", + "dependencies": { + "multichar-regex": "~2.0.0" + } + }, "node_modules/unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -1857,6 +3112,14 @@ "phin": "^3.4.0" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/package.json b/package.json index f4f8b76..a1f7113 100644 --- a/package.json +++ b/package.json @@ -17,17 +17,24 @@ }, "homepage": "https://github.com/Tutur33/gestion#readme", "dependencies": { + "@m3rcena/weky": "^4.3.1", "axios": "^1.6.7", "color-name-list": "^10.19.0", "discord-gamecord": "^4.4.1", + "discord-giveaway": "^1.1.5", + "discord-giveaways": "^6.0.1", "discord.js": "^14.14.1", "discordjs-button-pagination": "^3.0.1", "dotenv": "^16.4.4", + "figlet": "^1.7.0", "giphy-api": "^2.0.2", + "mal-scraper": "^2.13.1", + "md5": "^2.3.0", "ms": "^2.1.3", "quick.db": "^7.1.3", "sqlite": "^5.1.1", "sqlite3": "^5.1.7", + "to-zalgo": "^1.0.1", "weather": "^1.0.4" } }