diff --git a/commands/achats/embed.js b/commands/achats/embed.js new file mode 100644 index 0000000..d5cfd5d --- /dev/null +++ b/commands/achats/embed.js @@ -0,0 +1,151 @@ +const { EmbedBuilder, StringSelectMenuBuilder, ActionRowBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: [], + description: 'Change la couleur de vos embed.', + emote: '🔵', + utilisation: '', + permission: 0, + + async execute(message, args, client) { + const embed = new EmbedBuilder() + .setTitle('🔵 Embed') + .setDescription(`Sélectionnez une couleur pour vos embeds`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + const select = new StringSelectMenuBuilder() + .setCustomId('color') + .setPlaceholder('Sélectionnez une couleur') + .addOptions([ + { + label: '🔴 Rouge', + description: 'Prix : 3 rep🔺', + value: 'red', + }, + { + label: '🟠 Orange', + description: 'Prix : 3 rep🔺', + value: 'orange', + }, + { + label: '🟡 Jaune', + description: 'Prix : 3 rep🔺', + value: 'yellow', + }, + { + label: '🟢 Vert', + description: 'Prix : 3 rep🔺', + value: 'green', + }, + { + label: '🔵 Bleu', + description: 'Prix : 3 rep🔺', + value: 'blue', + }, + { + label: '🟣 Violet', + description: 'Prix : 3 rep🔺', + value: 'purple', + }, + { + label: '🟤 Marron', + description: 'Prix : 3 rep🔺', + value: 'brown', + }, + { + label: '⚫ Noir', + description: 'Prix : 3 rep🔺', + value: 'black', + }, + { + label: '⚪ Blanc', + description: 'Prix : 3 rep🔺', + value: 'white', + }, + { + label: 'Aléatoire 🌈', + description: 'Prix : 5 rep🔺', + value: 'random', + }, + ]); + + const row = new ActionRowBuilder() + .addComponents(select); + + const embedMessage = await message.reply({ embeds: [embed], components: [row], allowedMentions: { repliedUser: false } }); + + const filter = (interaction) => interaction.user.id === message.author.id; + const collector = embedMessage.createMessageComponentCollector({ filter, time: 60000 }); + collector.on('collect', async (interaction) => { + if (interaction.isStringSelectMenu()) { + if (!client.user) return + const value = interaction.values[0]; + const user = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + const reputation = user.reputation; + + if (value === 'random') { + if (reputation < 5) { + const embed = new EmbedBuilder() + .setTitle('Erreur') + .setDescription('❌ Vous n\'avez pas assez de réputations pour acheter cette couleur.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return interaction.reply({ embeds: [embed], ephemeral: true, allowedMentions: { repliedUser: false } }); + } + + db.run(`UPDATE users SET reputation = reputation - 5, embed = 'random' WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err) => { + if (err) return console.error(err); + }); + + const embed = new EmbedBuilder() + .setTitle('🔵 Embed') + .setDescription('✅ Vous avez acheté la couleur aléatoire pour vos embeds.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + interaction.reply({ embeds: [embed], ephemeral: true, allowedMentions: { repliedUser: false } }); + } else { + if (reputation < 3) { + const embed = new EmbedBuilder() + .setTitle('Erreur') + .setDescription('❌ Vous n\'avez pas assez de réputations pour acheter cette couleur.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return interaction.reply({ embeds: [embed], ephemeral: true, allowedMentions: { repliedUser: false } }); + } + + db.run(`UPDATE users SET reputation = reputation - 3, embed = ? WHERE guildId = ? AND userId = ?`, [value, message.guild.id, message.author.id], (err) => { + if (err) return console.error(err); + }); + + const embed = new EmbedBuilder() + .setTitle('🔵 Embed') + .setDescription(`✅ Vous avez acheté la couleur ${value} pour vos embeds.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + interaction.reply({ embeds: [embed], ephemeral: true, allowedMentions: { repliedUser: false } }); + } + } + }); + + collector.on('end', async () => { + embedMessage.edit({ components: [] }); + }); + }, +}; \ No newline at end of file diff --git a/commands/achats/shop.js b/commands/achats/shop.js new file mode 100644 index 0000000..530d739 --- /dev/null +++ b/commands/achats/shop.js @@ -0,0 +1,23 @@ +const { EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['shop', 'magasin', 'boutique', 'store'], + description: 'Affiche le shop du bot.', + emote: '🛍️', + utilisation: '', + permission: 0, + + async execute(message, args, client) { + const embed = new EmbedBuilder() + .setTitle('🛍️ Shop') + .setThumbnail(message.guild.iconURL()) + .setDescription(`Sélectionnez un item à acheter. Voici les items disponibles :\n\n> 🔒 AntiRob - Protège contre les vols pendant 2 heures - Prix : 2000 coins\n> 🔑 Clé - Permet d'ouvrir une boîte - Prix : 10000 coins\n> 🔫 [Job] Braqueur - Permet d'avoir accès à la commande &braquage - Prix : 15 réputations\n> 🔪 [Job] Killer - Permet d'avoir accès à la commande &kill - Prix : 13 réputations\n> 💻 [Job] Hacker - Permet d'avoir accès à la commande &hack - Prix : 11 réputations\n> ⚖️ [Job] Juge - Permet d'avoir accès à la commande &juge - Prix : 15 réputations`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + }, +}; \ No newline at end of file diff --git a/commands/bot control/help.js b/commands/bot control/help.js new file mode 100644 index 0000000..5615db6 --- /dev/null +++ b/commands/bot control/help.js @@ -0,0 +1,163 @@ +const { EmbedBuilder, ButtonStyle, ButtonBuilder, ActionRowBuilder } = require('discord.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +function commandsList (client, category) { + const casinoCommands = client.commands.filter(command => command.category === category).sort((a, b) => a.name.localeCompare(b.name)); + const uniqueCommands = new Map(); + + casinoCommands.forEach(command => { + uniqueCommands.set(command.name, {description: command.description, emote: command.emote, utilisation: command.utilisation}); + }); + + let commandsList = ''; + uniqueCommands.forEach((command, name) => { + commandsList += `${command.emote} \`${name}${command.utilisation ? ' ' + command.utilisation : ''}\`\n┖ ${command.description}\n\n`; + }); + + return commandsList; +} + +module.exports = { + aliases: ['h', 'aide'], + description: 'Affiche la liste des commandes disponibles', + emote: '📚', + utilisation: '[commande]', + permission: 0, + + async execute(message, args, client) { + const embedPage1 = new EmbedBuilder() + .setTitle('📚 Information') + .setThumbnail(message.guild.iconURL()) + .setDescription(`Voici le panel d'aide du bot. Pour plus d'informations sur une commande, utilisez &help \n\n> **🎙️ Récompenses vocales :**\n> Vous gagnez \`1500\` pièces toutes les 15 minutes lorsque vous êtes en vocal.\n> \n> **📺 Récompenses de streaming :**\n> Activer un stream vous fera gagner \`250\`.\n> \n> **📷 Récompenses de caméra :**\n> Activer votre caméra vous fera gagner \`250\`.\n\n> Le coins est une monnaie fictive.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Page 1/10 | Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + const leftButton = new ButtonBuilder() + .setCustomId('left') + .setLabel('◀') + .setStyle(ButtonStyle.Primary); + + const rightButton = new ButtonBuilder() + .setCustomId('right') + .setLabel('▶') + .setStyle(ButtonStyle.Primary); + + const row = new ActionRowBuilder() + .addComponents(leftButton, rightButton); + + const messageEmbed = await message.reply({ embeds: [embedPage1], components: [row], allowedMentions: { repliedUser: false } }); + + const filter = i => i.user.id === message.author.id; + const collector = message.channel.createMessageComponentCollector({ filter, time: 60000 }); + + let page = 1; + collector.on('collect', async i => { + if (i.customId === 'left') { + page--; + if (page < 1) page = 10; + } else if (i.customId === 'right') { + page++; + if (page > 10) page = 1; + } + + if (page === 1) { + i.update({ embeds: [embedPage1], components: [row] }); + } else if (page === 2) { + const embedPage2 = new EmbedBuilder() + .setTitle('💰 Casino') + .setThumbnail(message.guild.iconURL()) + .setDescription(commandsList(client, 'casino')) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Page 2/10 | Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + i.update({ embeds: [embedPage2], components: [row], allowedMentions: { repliedUser: false } }); + } else if (page === 3) { + const embedPage3 = new EmbedBuilder() + .setTitle('🎲 Jeux') + .setThumbnail(message.guild.iconURL()) + .setDescription(commandsList(client, 'jeux')) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Page 3/10 | Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + i.update({ embeds: [embedPage3], components: [row], allowedMentions: { repliedUser: false } }); + } else if (page === 4) { + const embedPage4 = new EmbedBuilder() + .setTitle('🛍️ Achats') + .setThumbnail(message.guild.iconURL()) + .setDescription(commandsList(client, 'achats')) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Page 4/10 | Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + i.update({ embeds: [embedPage4], components: [row], allowedMentions: { repliedUser: false } }); + } else if (page === 5) { + const embedPage5 = new EmbedBuilder() + .setTitle('🏭 Metier et capacité') + .setThumbnail(message.guild.iconURL()) + .setDescription(`page 5`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Page 5/10 | Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + i.update({ embeds: [embedPage5], components: [row], allowedMentions: { repliedUser: false } }); + } else if (page === 6) { + const embedPage6 = new EmbedBuilder() + .setTitle('🛡️ Teams') + .setThumbnail(message.guild.iconURL()) + .setDescription(commandsList(client, 'teams')) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Page 6/10 | Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + i.update({ embeds: [embedPage6], components: [row], allowedMentions: { repliedUser: false } }); + } else if (page === 7) { + const embedPage7 = new EmbedBuilder() + .setTitle('💼 Teams 2') + .setThumbnail(message.guild.iconURL()) + .setDescription(`page 7`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Page 7/10 | Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + i.update({ embeds: [embedPage7], components: [row], allowedMentions: { repliedUser: false } }); + } else if (page === 8) { + const embedPage8 = new EmbedBuilder() + .setTitle('🤝 Alliance') + .setThumbnail(message.guild.iconURL()) + .setDescription(`page 8`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Page 8/10 | Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + i.update({ embeds: [embedPage8], components: [row], allowedMentions: { repliedUser: false } }); + } else if (page === 9) { + const embedPage9 = new EmbedBuilder() + .setTitle('👑 Gestion') + .setThumbnail(message.guild.iconURL()) + .setDescription(commandsList(client, 'gestion')) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Page 9/10 | Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + i.update({ embeds: [embedPage9], components: [row], allowedMentions: { repliedUser: false } }); + } else if (page === 10) { + const embedPage10 = new EmbedBuilder() + .setTitle('👑 Bot control') + .setThumbnail(message.guild.iconURL()) + .setDescription(commandsList(client, 'bot control')) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Page 10/10 | Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + i.update({ embeds: [embedPage10], components: [row], allowedMentions: { repliedUser: false } }); + } + }); + + collector.on('end', () => { + messageEmbed.edit({ components: [], allowedMentions: { repliedUser: false } }) + }); + } +}; \ No newline at end of file diff --git a/commands/bot control/ping.js b/commands/bot control/ping.js new file mode 100644 index 0000000..5764b2f --- /dev/null +++ b/commands/bot control/ping.js @@ -0,0 +1,38 @@ +const { ButtonStyle, ButtonBuilder, ActionRowBuilder } = require('discord.js'); + +module.exports = { + aliases: ['latence'], + description: 'Avoir la latence du bot.', + emote: '⏱️', + utilisation: '', + permission: 0, + + async execute(message, args, client) { + const ping = new ButtonBuilder() + .setCustomId('confirm') + .setLabel('🔄') + .setStyle(ButtonStyle.Primary); + + const row = new ActionRowBuilder() + .addComponents(ping); + const sentMessage = await message.reply({ + content: `La latence est de : ${client.ws.ping}`, + components: [row], + }); + + + const filter = i => i.customId === 'confirm' && i.user.id === message.author.id; + const collector = sentMessage.createMessageComponentCollector({ filter, time: 15000 }) + collector.on('collect', async (interaction) => { + sentMessage.edit({ + content: `La latence est de : ${client.ws.ping}`, + components: [row], + }); + interaction.reply({ content: 'La latence a été rafraichie', ephemeral: true, allowedMentions: { repliedUser: false } }); + }); + + collector.on('end', () => { + sentMessage.edit({ components: [] }); + }); + } +}; \ No newline at end of file diff --git a/commands/bot control/servers.js b/commands/bot control/servers.js new file mode 100644 index 0000000..e32f759 --- /dev/null +++ b/commands/bot control/servers.js @@ -0,0 +1,47 @@ +const { EmbedBuilder, ButtonStyle, ButtonBuilder, ActionRowBuilder } = require('discord.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['srvs'], + description: 'Affiche la liste des serveurs où le bot est présent', + emote: '🌐', + utilisation: '', + permission: 10, + + async execute(message, args, client) { + const embed = new EmbedBuilder() + .setTitle('Liste des serveurs') + .setDescription(client.guilds.cache.map(guild => `${guild.name} (ID: ${guild.id})`).join('\n')) + .setColor(await embedColor(message.author.id, message.guild.id)); + + const ping = new ButtonBuilder() + .setCustomId('confirm') + .setLabel('🔄') + .setStyle(ButtonStyle.Primary); + + const row = new ActionRowBuilder() + .addComponents(ping); + + const sentMessage = await message.reply({ + embeds: [embed], + components: [row], + allowedMentions: { repliedUser: false } + }); + + const filter = i => i.customId === 'confirm' && i.user.id === message.author.id; + const collector = sentMessage.createMessageComponentCollector({ filter, time: 60000 }); + + collector.on('collect', async (interaction) => { + embed.setDescription(client.guilds.cache.map(guild => `${guild.name} (ID: ${guild.id})`).join('\n')); + sentMessage.edit({ + embeds: [embed], + components: [row], + }); + interaction.reply({ content: 'La liste des serveurs a été rafraichie', ephemeral: true }); + }); + + collector.on('end', () => { + sentMessage.edit({ components: [] }); + }); + } +}; \ No newline at end of file diff --git a/commands/casino/coins.js b/commands/casino/coins.js new file mode 100644 index 0000000..59dd85b --- /dev/null +++ b/commands/casino/coins.js @@ -0,0 +1,33 @@ +const { EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['coin', 'money', 'balance', 'bal', 'wallet', 'cash'], + description: 'Affiche le solde d\'un compte.', + emote: '💵', + utilisation: '[@membre]', + permission: 0, + + async execute(message, args, client) { + const member = message.mentions.members.first() || message.member; + const user = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, member.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + const pocket = user.pocket + const bank = user.bank + const reputation = user.reputation + + const embed = new EmbedBuilder() + .setAuthor({ name: `Détails du Compte de ${member.user.tag}`, iconURL: member.user.displayAvatarURL() }) + .setDescription(`> :moneybag: Poche ${pocket}\n> :bank: Banque ${bank}\n> :star2: Réputation ${reputation}`) + .setColor(await embedColor(member.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + }, +}; \ No newline at end of file diff --git a/commands/casino/daily.js b/commands/casino/daily.js new file mode 100644 index 0000000..8d9fdc4 --- /dev/null +++ b/commands/casino/daily.js @@ -0,0 +1,70 @@ +const { EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['dy'], + description: 'Récupère ton argent quotidien.', + emote: '🎁', + utilisation: '', + permission: 0, + + async execute(message, args, client) { + const user = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + const lastDaily = user.lastDaily + const pocket = user.pocket + + if (lastDaily > Date.now() - 86400000) { + const embed = new EmbedBuilder() + .setTitle('Argent Impossible') + .setDescription(`❌ Vous avez déjà récupèré votre argent quotidien récemment. Veuillez attendre ${Math.floor((lastDaily + 86400000 - Date.now()) / 60000)} minutes avant de pouvoir travailler à nouveau.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } + + const randomAmount = Math.floor(Math.random() * (500 - 100 + 1) + 100); + db.run(`UPDATE users SET pocket = ?, lastDaily = ? WHERE guildId = ? AND userId = ?`, [pocket + randomAmount, Date.now(), message.guild.id, message.author.id]); + + const dailys = [ + `🌅 Vous vous êtes réveillé tôt ce matin et avez trouvé ${randomAmount} coins sous votre oreiller.`, + `🍳 Vous avez préparé un délicieux petit-déjeuner et avez été récompensé par ${randomAmount} coins pour votre talent culinaire.`, + `☀️ En partant pour une promenade matinale, vous avez découvert ${randomAmount} coins brillant sous le soleil levant.`, + `🌸 Vous avez aidé à planter de nouvelles fleurs dans le jardin du village et avez reçu ${randomAmount} coins pour votre contribution.`, + `🐦 Vous avez nourri les oiseaux dans le parc et avez trouvé ${randomAmount} coins cachés parmi les graines.`, + `📚 Après avoir lu un livre inspirant, vous avez été inspiré à démarrer votre journée avec ${randomAmount} coins d'idées nouvelles.`, + `🌱 Vous avez planté un arbre pour marquer le début de la journée et avez été récompensé par ${randomAmount} coins pour votre action écologique.`, + `🚴 Vous avez fait une balade à vélo matinale et avez découvert ${randomAmount} coins sur le bord du chemin.`, + `🌞 Vous avez salué le lever du soleil avec une méditation paisible et avez trouvé ${randomAmount} coins cachés dans votre esprit calme.`, + `🌳 En ramassant des déchets dans le parc, vous avez trouvé ${randomAmount} coins comme récompense pour garder l'environnement propre.`, + `🎨 Vous avez commencé la journée avec une séance de peinture et avez vendu votre première toile pour ${randomAmount} coins.`, + `🐶 Vous avez promené le chien du voisin et avez été surpris avec ${randomAmount} coins comme remerciement.`, + `📝 Vous avez tenu un journal de gratitude pour votre routine matinale et avez été récompensé par ${randomAmount} coins pour chaque moment apprécié.`, + `🏃‍♂️ Vous avez fait une course matinale et avez découvert ${randomAmount} coins le long du parcours.`, + `☕ Après avoir préparé un café revigorant, vous avez trouvé ${randomAmount} coins au fond de votre tasse.`, + `🌻 Vous avez cultivé votre jardin et avez récolté ${randomAmount} coins en légumes frais pour le petit-déjeuner.`, + `🎶 Vous avez écouté votre chanson préférée pour commencer la journée et avez été récompensé par ${randomAmount} coins pour votre bon goût musical.`, + `🌈 Vous avez commencé la journée avec une séance de yoga revitalisante et avez trouvé ${randomAmount} coins dans la position du lotus.`, + `💌 Vous avez envoyé des messages de bonnes nouvelles à vos proches et avez été récompensé par ${randomAmount} coins pour répandre la joie.`, + `💻 Vous avez commencé votre journée de travail avec détermination et avez trouvé ${randomAmount} coins cachés dans votre boîte de réception.`, + ]; + + + + const embed = new EmbedBuilder() + .setTitle('Argent Récupéré') + .setDescription(dailys[Math.floor(Math.random() * dailys.length)]) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + }, +}; \ No newline at end of file diff --git a/commands/casino/deposit.js b/commands/casino/deposit.js new file mode 100644 index 0000000..64aaebf --- /dev/null +++ b/commands/casino/deposit.js @@ -0,0 +1,58 @@ +const { EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['dep', 'depot'], + description: 'Dépose de l\'argent dans votre compte en banque.', + emote: '💰', + utilisation: '', + permission: 0, + + async execute(message, args, client) { + const user = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + const pocket = user.pocket + const bank = user.bank + + let title = 'Dépôt Impossible' + let description = '' + + if (args.length === 0) { + description = '❌ Vous devez spécifier un montant à déposer.' + } else if (args[0] === 'all') { + if (pocket <= 0) { + description = '❌ Vous n\'avez pas d\'argent à déposer.' + } else { + title = 'Dépôt Réussi' + description = `💰 Vous avez déposé ${pocket} coins dans votre compte en banque.` + db.run(`UPDATE users SET pocket = ?, bank = ? WHERE guildId = ? AND userId = ?`, [0, pocket + bank, message.guild.id, message.author.id]); + } + } else if (isNaN(args[0])) { + description = '❌ Vous devez spécifier un montant valide à déposer.' + } else if (pocket <= 0) { + description = '❌ Vous n\'avez pas d\'argent à déposer.' + } else if (parseInt(args[0]) > pocket) { + description = '❌ Vous n\'avez pas assez d\'argent pour déposer cette somme.' + } else if (parseInt(args[0]) <= 0) { + description = '❌ Vous ne pouvez pas deposer une somme négative ou nulle.'; + } else { + title = 'Dépôt Réussi' + description = `💰 Vous avez déposé ${args[0]} coins dans votre compte en banque.` + db.run(`UPDATE users SET pocket = ?, bank = ? WHERE guildId = ? AND userId = ?`, [pocket - parseInt(args[0]), bank + parseInt(args[0]), message.guild.id, message.author.id]); + } + + const embed = new EmbedBuilder() + .setTitle(title) + .setDescription(description) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + }, +}; \ No newline at end of file diff --git a/commands/casino/pay.js b/commands/casino/pay.js new file mode 100644 index 0000000..a87eed3 --- /dev/null +++ b/commands/casino/pay.js @@ -0,0 +1,98 @@ +const { EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: [], + description: 'Paye un membre de votre serveur.', + emote: '💳', + utilisation: ' <@membre>', + permission: 0, + + async execute(message, args, client) { + let amount; + const member = message.mentions.members.first(); + + const user = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + const pocket = user.pocket; + + if (!member) { + const embed = new EmbedBuilder() + .setTitle('Erreur') + .setDescription('❌ Veuillez mentionner un membre du serveur.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } + + if (!args[0]) { + const embed = new EmbedBuilder() + .setTitle('Erreur') + .setDescription('❌ Veuillez spécifier un montant à payer.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed] }); + } else if (args[0] === 'all') { + amount = pocket; + } else if (isNaN(args[0])) { + const embed = new EmbedBuilder() + .setTitle('Erreur') + .setDescription('❌ Veuillez spécifier un montant valide.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed] }); + } else if (args[0] <= 0) { + const embed = new EmbedBuilder() + .setTitle('Erreur') + .setDescription('❌ Veuillez spécifier un montant supérieur à 0.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed] }); + } else if (args[0] > pocket) { + const embed = new EmbedBuilder() + .setTitle('Erreur') + .setDescription('❌ Vous n\'avez pas assez d\'argent pour effectuer cette transaction.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed] }); + } else if (!Number.isInteger(Number(args[0]))) { + const embed = new EmbedBuilder() + .setTitle('Erreur') + .setDescription('❌ Veuillez spécifier un montant entier.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } else { + amount = args[0]; + } + + db.run(`UPDATE users SET pocket = pocket - ? WHERE guildId = ? AND userId = ?`, [amount, message.guild.id, message.author.id]); + db.run(`UPDATE users SET pocket = pocket + ? WHERE guildId = ? AND userId = ?`, [amount, message.guild.id, member.id]); + + const embed = new EmbedBuilder() + .setTitle('Paiement') + .setDescription(`💰 Vous avez payé ${amount} à ${member.user.tag}.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + }, +}; diff --git a/commands/casino/rob.js b/commands/casino/rob.js new file mode 100644 index 0000000..2be5648 --- /dev/null +++ b/commands/casino/rob.js @@ -0,0 +1,87 @@ +const { EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: [], + description: 'Vol de l\'argent a un membre.', + emote: '🦹', + utilisation: '<@membre>', + permission: 0, + + async execute(message, args, client) { + const member = message.mentions.users.first(); + if (!member) { + const embed = new EmbedBuilder() + .setTitle('Erreur') + .setDescription('❌ Vous devez mentionner un membre.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } + + const user = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + + if (user.lastRob + 7200000 > Date.now()) { + const embed = new EmbedBuilder() + .setTitle('Erreur') + .setDescription(`❌ Vous devez encore attendre ${Math.floor((user.lastRob + 7200000 - Date.now()) / 60000)} minutes avant de pouvoir voler à nouveau.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } + + const memberInfo = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, member.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + + if (memberInfo.antiRob + 7200000 > Date.now()) { + const embed = new EmbedBuilder() + .setTitle('Erreur') + .setDescription(`❌ Vous ne pouvez pas voler <@${member.id}> pour le moment, il est protégé par un bouclier anti-vol pendant encore ${Math.floor((memberInfo.antiRob + 7200000 - Date.now()) / 60000)} minutes.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } + + const memberPocket = memberInfo.pocket; + + if (memberPocket <= 0) { + const embed = new EmbedBuilder() + .setTitle('Erreur') + .setDescription(`❌ <@${member.id}> n'a pas d'argent sur lui pour que vous puissiez le voler.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } + + const amount = Math.floor(Math.random() * memberPocket) + 1; + db.run(`UPDATE users SET pocket = pocket - ? WHERE guildId = ? AND userId = ?`, [amount, message.guild.id, member.id]); + db.run(`UPDATE users SET pocket = pocket + ?, lastRob = ? WHERE guildId = ? AND userId = ?`, [amount, Date.now(), message.guild.id, message.author.id]); + + const embed = new EmbedBuilder() + .setTitle('Vol') + .setDescription(`💰 Vous avez volé ${amount} à <@${member.id}>.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + }, +}; diff --git a/commands/casino/top.js b/commands/casino/top.js new file mode 100644 index 0000000..1a42b11 --- /dev/null +++ b/commands/casino/top.js @@ -0,0 +1,110 @@ +const { EmbedBuilder, ActionRowBuilder, StringSelectMenuBuilder, StringSelectMenuOptionBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['leaderboard', 'lb'], + description: 'Affiche le top 10 des membres du serveur', + emote: '🏆', + utilisation: '[pocket|bank|reputation]', + permission: 0, + + async execute(message, args, client) { + let type = 'bank'; + let emote = ':bank:'; + if (args[0] ==='pocket') { + type = args[0] + emote = ':moneybag:'; + } else if (args[0] === 'reputation') { + type = args[0] + emote = ':star2:'; + } else if (args[0] && args[0] !== 'bank') { + const embed = new EmbedBuilder() + .setTitle('Erreur') + .setDescription('❌ Veuillez spécifier un type de leaderboard valide: `pocket`, `bank` ou `reputation`') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + } + + const [embed, row] = await leaderboard(message, type); + const replyMessage = await message.reply({ embeds: [embed], components: [row] }); + + client.on('interactionCreate', async (interaction) => { + if (!interaction.isStringSelectMenu()) return; + + if (interaction.customId === 'topLeaderboard') { + const selected = interaction.values[0]; + + await interaction.deferUpdate(); + + const [embed, row] = await leaderboard(message, selected); + replyMessage.edit({ embeds: [embed], components: [row] }); + interaction.followUp({ content: `Leaderboard mis à jour en fonction de \`${selected}\``, ephemeral: true }); + } + }); + }, +}; + + +async function leaderboard(message, type) { + const topUsers = await new Promise((resolve, reject) => { + db.all(`SELECT * FROM users WHERE guildId = ? ORDER BY ${type} DESC LIMIT 10`, [message.guild.id], (err, rows) => { + if (err) reject(err); + resolve(rows); + }); + }); + + let emote = ':bank:'; + if (type === 'pocket') { + emote = ':moneybag:'; + } else if (type === 'reputation') { + emote = ':star2:'; + } + + const description = topUsers.map((user, index) => { + let place; + if (index === 0) { + place = ':first_place:'; + } else if (index === 1) { + place = ':second_place:'; + } else if (index === 2) { + place = ':third_place:'; + } else { + place = `${index + 1}.`; + } + return `${place} <@${user.userId}> - \`${user[type]}\` ${emote}`; + }); + + const embed = new EmbedBuilder() + .setAuthor({ name: `Top 10 des Membres de ${message.guild.name} en ${type}`, iconURL: message.guild.iconURL() }) + .setDescription(description.join('\n\n')) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + const select = new StringSelectMenuBuilder() + .setCustomId('topLeaderboard') + .setPlaceholder('Choisissez un type de leaderboard') + .addOptions( + new StringSelectMenuOptionBuilder() + .setLabel('Pocket') + .setDescription('Affiche le top en fonction de leur argent de poche') + .setValue('pocket'), + new StringSelectMenuOptionBuilder() + .setLabel('Bank') + .setDescription('Affiche le top en fonction de leur argent en banque') + .setValue('bank'), + new StringSelectMenuOptionBuilder() + .setLabel('Reputation') + .setDescription('Affiche le top en fonction de leur réputation') + .setValue('reputation') + ); + + const row = new ActionRowBuilder() + .addComponents(select); + + return [embed, row]; +} \ No newline at end of file diff --git a/commands/casino/withdraw.js b/commands/casino/withdraw.js new file mode 100644 index 0000000..a737468 --- /dev/null +++ b/commands/casino/withdraw.js @@ -0,0 +1,58 @@ +const { EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['ret', 'retrait', 'with', 'withdraw', 'wd', 'take', 'wh'], + description: 'Retire de l\'argent de votre compte en banque.', + emote: '🏦', + utilisation: '', + permission: 0, + + async execute(message, args, client) { + const user = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + const pocket = user.pocket; + const bank = user.bank; + + let title = 'Retrait Impossible'; + let description = ''; + + if (args.length === 0) { + description = '❌ Vous devez spécifier un montant à retirer.'; + } else if (args[0] === 'all') { + if (bank <= 0) { + description = '❌ Vous n\'avez pas d\'argent à retirer de votre compte en banque.'; + } else { + title = 'Retrait Réussi'; + description = `🏦 Vous avez retiré ${bank} coins de votre compte en banque.`; + db.run(`UPDATE users SET pocket = ?, bank = ? WHERE guildId = ? AND userId = ?`, [pocket + bank, 0, message.guild.id, message.author.id]); + } + } else if (isNaN(args[0])) { + description = '❌ Vous devez spécifier un montant valide à retirer.'; + } else if (bank <= 0) { + description = '❌ Vous n\'avez pas d\'argent à retirer.' + } else if (parseInt(args[0]) > bank) { + description = '❌ Vous n\'avez pas assez d\'argent dans votre compte en banque pour retirer cette somme.'; + } else if (parseInt(args[0]) <= 0) { + description = '❌ Vous ne pouvez pas retirer une somme négative ou nulle.'; + } else { + title = 'Retrait Réussi'; + description = `🏦 Vous avez retiré ${args[0]} coins de votre compte en banque.`; + db.run(`UPDATE users SET pocket = ?, bank = ? WHERE guildId = ? AND userId = ?`, [pocket + parseInt(args[0]), bank - parseInt(args[0]), message.guild.id, message.author.id]); + } + + const embed = new EmbedBuilder() + .setTitle(title) + .setDescription(description) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + }, +}; diff --git a/commands/casino/work.js b/commands/casino/work.js new file mode 100644 index 0000000..b425f8f --- /dev/null +++ b/commands/casino/work.js @@ -0,0 +1,84 @@ +const { EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['wk', 'travail'], + description: 'Travaillez pour gagner de l\'argent.', + emote: '💼', + utilisation: '', + permission: 0, + + async execute(message, args, client) { + const user = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + const lastWork = user.lastWork + const pocket = user.pocket + + if (lastWork > Date.now() - 3600000) { + const embed = new EmbedBuilder() + .setTitle('Travail Impossible') + .setDescription(`❌ Vous avez déjà travaillé récemment. Veuillez attendre ${Math.floor((lastWork + 3600000 - Date.now()) / 60000)} minutes avant de pouvoir travailler à nouveau.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } + + const randomAmount = Math.floor(Math.random() * (500 - 100 + 1) + 100); + db.run(`UPDATE users SET pocket = ?, lastWork = ? WHERE guildId = ? AND userId = ?`, [pocket + randomAmount, Date.now(), message.guild.id, message.author.id]); + + const works = [ + `💼 Vous avez exploré une ancienne ruine et avez trouvé ${randomAmount} coins.`, + `🛠️ Vous avez aidé un marchand à réparer son chariot et il vous a donné ${randomAmount} coins en remerciement.`, + `🌳 En chassant dans la forêt, vous avez découvert un trésor caché contenant ${randomAmount} coins.`, + `🔍 Après avoir résolu une énigme antique, vous avez reçu ${randomAmount} coins comme récompense.`, + `🧪 Vous avez vendu des potions magiques sur le marché et avez gagné ${randomAmount} coins.`, + `🕵️ En explorant une grotte sombre, vous avez trouvé ${randomAmount} coins dissimulés dans un coffre.`, + `🐉 Après avoir vaincu un dragon, vous avez récupéré ${randomAmount} coins dans son repaire.`, + `🏆 Vous avez participé à un tournoi de chevalerie et avez remporté ${randomAmount} coins en prix.`, + `🗺️ En aidant un groupe de voyageurs perdus à retrouver leur chemin, vous avez reçu ${randomAmount} coins.`, + `🔎 Après avoir résolu un mystère criminel, vous avez été récompensé par ${randomAmount} coins par la ville.`, + `⚓ Vous avez navigué sur les mers et avez trouvé ${randomAmount} coins dans une épave.`, + `⛏️ En explorant les catacombes, vous avez découvert ${randomAmount} coins enfouis dans le sol.`, + `🌉 Après avoir construit un pont pour la communauté, vous avez reçu ${randomAmount} coins comme gratitude.`, + `🦅 Vous avez réussi à apprivoiser un griffon et avez reçu ${randomAmount} coins en récompense.`, + `⛏️ En découvrant une mine abandonnée, vous avez extrait ${randomAmount} coins de minerai précieux.`, + `🏹 Vous avez secouru un groupe de voyageurs attaqués par des brigands et avez reçu ${randomAmount} coins comme reconnaissance.`, + `📚 En explorant une ancienne bibliothèque abandonnée, vous avez trouvé ${randomAmount} coins cachés dans un vieux livre.`, + `🏹 Après avoir participé à une compétition de tir à l'arc, vous avez remporté ${randomAmount} coins en prix.`, + `😺 Vous avez sauvé un chaton coincé dans un arbre et son propriétaire vous a donné ${randomAmount} coins en guise de remerciement.`, + `🕊️ En réussissant à apaiser une querelle entre deux factions rivales, vous avez été récompensé par ${randomAmount} coins.`, + `🌊 Vous avez découvert un trésor antique dans les profondeurs de la mer et avez récupéré ${randomAmount} coins.`, + `🏫 Après avoir construit une école pour les enfants du village, vous avez reçu ${randomAmount} coins de la part des parents reconnaissants.`, + `👮 Vous avez capturé un voleur recherché et avez été récompensé par ${randomAmount} coins par les autorités locales.`, + `🏞️ En explorant une caverne mystérieuse, vous avez trouvé ${randomAmount} coins dissimulés derrière une cascade.`, + `🔨 Après avoir prêté main-forte à un forgeron pour créer une armure, vous avez été payé ${randomAmount} coins pour votre travail.`, + `🏛️ Vous avez découvert un artefact magique dans les ruines d'un temple ancien et l'avez échangé contre ${randomAmount} coins.`, + `🚶 En offrant vos services en tant que guide à des voyageurs perdus, vous avez gagné ${randomAmount} coins pour les ramener en sécurité.`, + `🔥 Après avoir éteint un incendie qui menaçait le village, vous avez été récompensé par ${randomAmount} coins par les habitants reconnaissants.`, + `🎉 Vous avez organisé un festival annuel pour célébrer la récolte et avez collecté ${randomAmount} coins en dons des participants.`, + `🐉 En sauvant un noble des griffes d'une bête féroce, vous avez été généreusement récompensé par ${randomAmount} coins et des terres.`, + `🏰 Après avoir découvert un passage secret dans le château du roi, vous avez trouvé ${randomAmount} coins cachés dans un coffre-fort.`, + `👨‍👩‍👧‍👦 Vous avez résolu un conflit familial ancien et avez reçu ${randomAmount} coins en récompense de votre médiation.`, + `⛏️ En explorant les montagnes, vous avez trouvé une mine abandonnée remplie de ${randomAmount} coins de minerai précieux.`, + `📜 Après avoir livré un message crucial à temps, vous avez été payé ${randomAmount} coins par le destinataire reconnaissant.`, + `🤝 Vous avez négocié un accord commercial fructueux entre deux cités et avez reçu ${randomAmount} coins comme commission.`, + ]; + + + const embed = new EmbedBuilder() + .setTitle('Travail Terminé') + .setDescription(works[Math.floor(Math.random() * works.length)]) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + }, +}; \ No newline at end of file diff --git a/commands/gestion/add.js b/commands/gestion/add.js new file mode 100644 index 0000000..40f4a31 --- /dev/null +++ b/commands/gestion/add.js @@ -0,0 +1,51 @@ +const { EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: [], + description: 'Ajoute de l\'argent de votre compte en banque ou de votre poche ou de votre réputation.', + emote: '💰', + utilisation: ' [@membre]', + permission: 10, + + async execute(message, args, client) { + const user = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + + let member = message.author; + let title = 'Ajout d\'argent'; + let description = `💰 Vous avez ajouté ${args[0]} à votre ${args[1]}.`; + + if (isNaN(args[0])) { + title = 'Erreur'; + description = '❌ Veuillez entrer un montant valide.'; + } else if (args[0] <= 0) { + title = 'Erreur'; + description = '❌ Veuillez entrer un montant supérieur à 0.'; + } else if (args[1] !== 'pocket' && args[1] !== 'bank' && args[1] !== 'reputation') { + title = 'Erreur'; + description = '❌ Veuillez entrer une destination valide (pocket, bank, reputation).'; + } else if (message.mentions.users.first()) { + member = message.mentions.users.first(); + description = `💰 Vous avez ajouté ${args[0]} à la ${args[1]} de ${member.tag}.`; + } + + const embed = new EmbedBuilder() + .setTitle(title) + .setDescription(description) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + if (title !== 'Erreur') { + db.run(`UPDATE users SET ${args[1]} = ${args[1]} + ? WHERE guildId = ? AND userId = ?`, [args[0], message.guild.id, member.id]); + } + + message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + }, +}; diff --git a/commands/gestion/remove.js b/commands/gestion/remove.js new file mode 100644 index 0000000..add97e4 --- /dev/null +++ b/commands/gestion/remove.js @@ -0,0 +1,51 @@ +const { EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: [], + description: 'Retire de l\'argent de votre compte en banque ou de votre poche ou de votre réputation.', + emote: '💰', + utilisation: ' [@membre]', + permission: 10, + + async execute(message, args, client) { + const user = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + + let member = message.author; + let title = 'Argent retiré'; + let description = `💰 Vous avez retiré ${args[0]} à votre ${args[1]}.`; + + if (isNaN(args[0])) { + title = 'Erreur'; + description = '❌ Veuillez entrer un montant valide.'; + } else if (args[0] <= 0) { + title = 'Erreur'; + description = '❌ Veuillez entrer un montant supérieur à 0.'; + } else if (args[1] !== 'pocket' && args[1] !== 'bank' && args[1] !== 'reputation') { + title = 'Erreur'; + description = '❌ Veuillez entrer une destination valide (pocket, bank, reputation).'; + } else if (message.mentions.users.first()) { + member = message.mentions.users.first(); + description = `💰 Vous avez retiré ${args[0]} à la ${args[1]} de ${member.tag}.`; + } + + const embed = new EmbedBuilder() + .setTitle(title) + .setDescription(description) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + if (title !== 'Erreur') { + db.run(`UPDATE users SET ${args[1]} = ${args[1]} - ? WHERE guildId = ? AND userId = ?`, [args[0], message.guild.id, member.id]); + } + + message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + }, +}; diff --git a/commands/jeux/blackjack.js b/commands/jeux/blackjack.js new file mode 100644 index 0000000..a67a1ac --- /dev/null +++ b/commands/jeux/blackjack.js @@ -0,0 +1,366 @@ +const { EmbedBuilder, ButtonStyle, ButtonBuilder, ActionRowBuilder } = require('discord.js'); +const embedColor = require('../../fonctions/embedColor.js'); +const db = require('../../fonctions/database.js'); + + +const cardValues = { + 'A': 11, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '10': 10, 'J': 10, 'Q': 10, 'K': 10 +}; + +const cardSymbols = ['♠️', '♥️', '♦️', '♣️']; +const usersWithGameInProgress = new Map(); +setInterval(() => { + usersWithGameInProgress.clear(); +}, 180000); + +function drawCard() { + const symbol = cardSymbols[Math.floor(Math.random() * cardSymbols.length)]; + const value = Object.keys(cardValues)[Math.floor(Math.random() * Object.keys(cardValues).length)]; + return { symbol, value }; +} + + +module.exports = { + aliases: ['bj'], + description: 'Joue au blackjack.', + emote: '🃏', + utilisation: '', + permission: 0, + + async execute(message, args, client) { + if (args.length !== 1) { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🃏 Blackjack') + .setDescription(`Vous devez spécifier une mise. Exemple : \`&blackjack 100\`.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + } else if (isNaN(args[0])) { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🃏 Blackjack') + .setDescription(`La mise doit être un nombre.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + } else if (args[0] < 25) { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🃏 Blackjack') + .setDescription(`La mise doit être supérieure ou égale à \`25\`.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + } + + const pocket = await new Promise((resolve, reject) => { + db.get(`SELECT pocket FROM users WHERE userId = ? AND guildId = ?`, [message.author.id, message.guild.id], (err, row) => { + if (err) { + reject(err); + } else { + resolve(row.pocket); + } + }); + }); + + if (pocket < args[0]) { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🃏 Blackjack') + .setDescription(`Vous n'avez pas assez d'argent pour miser cette somme.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + } else { + const user = message.author; + const guildId = message.guild.id; + const currencyName = 'coins' + + let amount = args[0]; + + let pocketAmount = await new Promise((resolve, reject) => { + db.get(`SELECT pocket FROM users WHERE userId = ? AND guildId = ?`, [message.author.id, message.guild.id], (err, row) => { + if (err) { + reject(err); + } else { + resolve(row.pocket || 0); + } + }); + }); + + + const playerCards = [drawCard(), drawCard()]; + const dealerCards = [drawCard()]; + + const playerTotal = playerCards.reduce((total, card) => total + cardValues[card.value], 0); + if (playerTotal === 21 && playerCards.length === 2) { + const blackjackPayoutMultiplier = 1.25; + const winnings = Math.floor(amount * blackjackPayoutMultiplier); + + let pocketAmount = await new Promise((resolve, reject) => { + db.get(`SELECT pocket FROM users WHERE userId = ? AND guildId = ?`, [message.author.id, message.guild.id], (err, row) => { + if (err) { + reject(err); + } else { + resolve(row.pocket || 0); + } + }); + }); + + await new Promise((resolve, reject) => { + db.run(`UPDATE users SET pocket = ? WHERE userId = ? AND guildId = ?`, [pocketAmount + winnings, message.author.id, message.guild.id], (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + + const winEmbed = new EmbedBuilder() + .setTitle('Blackjack 🎲') + .setDescription(`Félicitations ! Vous avez un blackjack naturel et vous avez gagné ${winnings} ${currencyName}.`) + .setColor('#0099ff'); + + return message.reply({ embeds: [winEmbed], allowedMentions: { repliedUser: false } }); + } + + const embed = new EmbedBuilder() + .setTitle('Blackjack 🎲') + .setThumbnail('https://cdn.discordapp.com/attachments/1120446538544595005/1190016467257802843/kumarhane-poker.gif?ex=65a04433&is=658dcf33&hm=3ea3b7c74eb724d17249e3a60968f8c10b7d85452f3684b969a02a17ca79ab3e&') + .addFields( + { name: 'Votre main', value: `Cartes: ${playerCards.map(card => card.symbol + ' ' + card.value).join(' ')}\nTotal: ${playerTotal}`, inline: true }, + { name: 'Main du croupier', value: `Cartes: ${dealerCards[0].symbol + ' ' + dealerCards[0].value} ?\nTotal: ?`, inline: true } + ) + .setColor('#0099ff'); + + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId('blackjack_hit') + .setLabel('Hit') + .setStyle(ButtonStyle.Primary), + new ButtonBuilder() + .setCustomId('blackjack_stand') + .setLabel('Stand') + .setStyle(ButtonStyle.Primary), + new ButtonBuilder() + .setCustomId('blackjack_cancel') + .setLabel('Annuler') + .setStyle(ButtonStyle.Danger) + ); + + const msg = await message.channel.send({ embeds: [embed], components: [row], allowedMentions: { repliedUser: false } }); + + const collector = msg.createMessageComponentCollector({time: 60000 }); + + await new Promise((resolve, reject) => { + db.run(`UPDATE users SET pocket = ? WHERE userId = ? AND guildId = ?`, [pocketAmount - amount, message.author.id, message.guild.id], (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + + usersWithGameInProgress.set(user.id); + collector.on('collect', async i => { + if (i.user.id !== user.id) { + return i.reply({ content: ":x: Vous n'avez pas la permission d'interagir avec ces boutons", ephemeral: true }); + } + + await i.deferUpdate(); + + if (i.customId === 'blackjack_hit') { + playerCards.push(drawCard()); + + let playerTotal = playerCards.reduce((total, card) => total + cardValues[card.value], 0); + + if (playerTotal === 21) { + const winnings = amount * 1.5; + let pocketAmount = await new Promise((resolve, reject) => { + db.get(`SELECT pocket FROM users WHERE userId = ? AND guildId = ?`, [message.author.id, message.guild.id], (err, row) => { + if (err) { + reject(err); + } else { + resolve(row.pocket || 0); + } + }); + }); + + await new Promise((resolve, reject) => { + db.run(`UPDATE users SET pocket = ? WHERE userId = ? AND guildId = ?`, [pocketAmount + winnings, message.author.id, message.guild.id], (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + + const winEmbed = new EmbedBuilder() + .setTitle('Blackjack 🎲') + .setDescription(`Félicitations ! Vous avez atteint 21. Vous avez gagné ${winnings} ${currencyName}.`) + .setColor('#0099ff'); + + message.reply({ embeds: [winEmbed], allowedMentions: { repliedUser: false } }); + usersWithGameInProgress.delete(user.id); + collector.stop(); + } else if (playerTotal > 21) { + const loseEmbed = new EmbedBuilder() + .setTitle('Blackjack 🎲') + .setDescription(`Vous avez dépassé 21. Vous avez perdu ${amount} ${currencyName}.`) + .setColor('#0099ff'); + + message.reply({ embeds: [loseEmbed], allowedMentions: { repliedUser: false } }); + collector.stop(); + } else { + embed.spliceFields(0, 1, { name: 'Votre main', value: `Cartes: ${playerCards.map(card => card.symbol + ' ' + card.value).join(' ')}\nTotal: ${playerTotal}`, inline: true }); + i.editReply({ embeds: [embed] }); + } + usersWithGameInProgress.delete(user.id); + } else if (i.customId === 'blackjack_stand') { + let dealerTotal = dealerCards.reduce((total, card) => total + cardValues[card.value], 0); + while (dealerTotal < 17) { + dealerCards.push(drawCard()); + dealerTotal = dealerCards.reduce((total, card) => total + cardValues[card.value], 0); + } + + const playerTotal = playerCards.reduce((total, card) => total + cardValues[card.value], 0); + let result; + if (dealerTotal > 21) { + result = `Le croupier a dépassé 21. Vous gagnez ${amount * 1.5} ${currencyName}. !`; + + let pocketAmount = await new Promise((resolve, reject) => { + db.get(`SELECT pocket FROM users WHERE userId = ? AND guildId = ?`, [message.author.id, message.guild.id], (err, row) => { + if (err) { + reject(err); + } else { + resolve(row.pocket || 0); + } + }); + }); + + await new Promise((resolve, reject) => { + db.run(`UPDATE users SET pocket = ? WHERE userId = ? AND guildId = ?`, [pocketAmount + amount * 1.5, message.author.id, message.guild.id], (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + + const winEmbed = new EmbedBuilder() + .setTitle('Blackjack 🎲') + .setDescription(result) + .setColor('#0099ff'); + + message.reply({ embeds: [winEmbed], allowedMentions: { repliedUser: false } }); + usersWithGameInProgress.delete(user.id); + } else if (dealerTotal > playerTotal) { + result = `Le croupier a ${dealerTotal} et gagne. Vous avez perdu ${amount} ${currencyName}.`; + + const loseEmbed = new EmbedBuilder() + .setTitle('Blackjack 🎲') + .setDescription(result) + .setColor('#0099ff'); + + message.reply({ embeds: [loseEmbed], allowedMentions: { repliedUser: false } }); + usersWithGameInProgress.delete(user.id); + + } else if (dealerTotal < playerTotal) { + let pocketAmount = await new Promise((resolve, reject) => { + db.get(`SELECT pocket FROM users WHERE userId = ? AND guildId = ?`, [message.author.id, message.guild.id], (err, row) => { + if (err) { + reject(err); + } else { + resolve(row.pocket || 0); + } + }); + }); + + const winnings = amount * 1.5; + + await new Promise((resolve, reject) => { + db.run(`UPDATE users SET pocket = ? WHERE userId = ? AND guildId = ?`, [pocketAmount + winnings, message.author.id, message.guild.id], (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + + result = `Vous gagnez ! Vous avez gagné ${winnings} ${currencyName}.`; + + const winEmbed = new EmbedBuilder() + .setTitle('Blackjack 🎲') + .setDescription(result) + .setColor('#0099ff'); + + message.reply({ embeds: [winEmbed], allowedMentions: { repliedUser: false } }); + usersWithGameInProgress.delete(user.id); + } else { + result = 'Il y a eu égalité. Vous récupérez votre mise.'; + let pocketAmount = await db.get(`${guildId}.pocket.${user.id}`) || 0; + await db.set(`${guildId}.pocket.${user.id}`, pocketAmount + amount); + + const tieEmbed = new EmbedBuilder() + .setTitle('Blackjack 🎲') + .setDescription(result) + .setColor('#0099ff'); + + message.reply({ embeds: [tieEmbed], allowedMentions: { repliedUser: false } }); + } + usersWithGameInProgress.delete(user.id); + collector.stop(); + } else if (i.customId === 'blackjack_cancel') { + let pocketAmount = await new Promise((resolve, reject) => { + db.get(`SELECT pocket FROM users WHERE userId = ? AND guildId = ?`, [message.author.id, message.guild.id], (err, row) => { + if (err) { + reject(err); + } else { + resolve(row.pocket || 0); + } + }); + }); + + await new Promise((resolve, reject) => { + db.run(`UPDATE users SET pocket = ? WHERE userId = ? AND guildId = ?`, [pocketAmount + amount / 2, message.author.id, message.guild.id], (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + + const cancelEmbed = new EmbedBuilder() + .setTitle('Blackjack 🎲') + .setDescription('Partie annulée. Vous récupérez la moitié de votre mise.') + .setColor('#0099ff'); + + message.reply({ embeds: [cancelEmbed], allowedMentions: { repliedUser: false } }); + + usersWithGameInProgress.delete(user.id); + collector.stop(); + } + }); + } + } +}; \ No newline at end of file diff --git a/commands/jeux/roll.js b/commands/jeux/roll.js new file mode 100644 index 0000000..cc24ed8 --- /dev/null +++ b/commands/jeux/roll.js @@ -0,0 +1,147 @@ +const { EmbedBuilder, ButtonStyle, ButtonBuilder, ActionRowBuilder } = require('discord.js'); +const embedColor = require('../../fonctions/embedColor.js'); +const db = require('../../fonctions/database.js'); + +module.exports = { + aliases: ['roulette'], + description: 'Lance une roulette.', + emote: '🎲', + utilisation: ' ', + permission: 0, + + async execute(message, args, client) { + if (args.length !== 2) { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🎲 Roulette') + .setDescription(`Vous devez spécifier une mise et une couleur. Exemple : \`&roulette 100 rouge\`.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + } else if (isNaN(args[0])) { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🎲 Roulette') + .setDescription(`La mise doit être un nombre.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + } else if (args[0] < 25) { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🎲 Roulette') + .setDescription(`La mise doit être supérieure ou égale à \`25\`.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + } else if (args[1] !== 'rouge' && args[1] !== 'noir' && args[1] !== 'vert' && args[1] !== 'red' && args[1] !== 'black' && args[1] !== 'green') { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🎲 Roulette') + .setDescription(`La couleur doit être \`rouge\`, \`noir\` ou \`vert\`.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + } + + const pocket = await new Promise((resolve, reject) => { + db.get(`SELECT pocket FROM users WHERE userId = ? AND guildId = ?`, [message.author.id, message.guild.id], (err, row) => { + if (err) { + reject(err); + } else { + if (row.pocket < args[0]) { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🎲 Roulette') + .setDescription(`Vous n'avez pas assez d'argent sur vous pour miser cette somme.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + } else { + resolve(row.pocket); + } + } + }); + }); + + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🎲 Roulette') + .setImage('https://images-ext-1.discordapp.net/external/Zz7GmmFoFdFRB7GCjiJGaDHDjJi8noOLY8zasCmUOGQ/https/media.giphy.com/media/26uflBhaGt5lQsaCA/giphy.gif') + .setDescription(`Vous avez misé \`${args[0]}\` sur \`${args[1]}\`. La bille tourne...\nRésultat dans 10 secondes...`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + + await new Promise(resolve => setTimeout(resolve, 10000)); + + const result = Math.floor(Math.random() * 37); + let colorR = ''; + if (result === 0) { + colorR = 'vert'; + } else if (result % 2 === 0) { + colorR = 'rouge'; + } else { + colorR = 'noir'; + } + + let gain = 0; + if (((args[1] === 'rouge' || args[1] === 'red') && colorR === 'rouge') || ((args[1] === 'noir' || args[1] === 'black') && colorR === 'noir') || ((args[1] === 'vert' || args[1] === 'green') && colorR === 'vert')) { + gain = args[0] * 2; + } else { + gain = 0-args[0]; + } + + await new Promise((resolve, reject) => { + db.run(`UPDATE users SET pocket = pocket + ? WHERE userId = ? AND guildId = ?`, [gain, message.author.id, message.guild.id], (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + + if (gain >= 0) { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🎲 Roulette') + .setDescription(`Vous avez misé \`${args[0]}\` sur \`${args[1]}\` et la bille est tombée sur \`${colorR}\`. Vous avez gagné \`${gain}\` !`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + } else { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🎲 Roulette') + .setDescription(`Vous avez misé \`${args[0]}\` sur \`${args[1]}\` et la bille est tombée sur \`${colorR}\`. Vous avez perdu \`${0-gain}\` !`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + } + } +}; \ No newline at end of file diff --git a/commands/teams/tcreate.js b/commands/teams/tcreate.js new file mode 100644 index 0000000..6eee549 --- /dev/null +++ b/commands/teams/tcreate.js @@ -0,0 +1,130 @@ +const { EmbedBuilder } = require('discord.js'); +const embedColor = require('../../fonctions/embedColor.js'); +const db = require('../../fonctions/database.js'); + +let teamName +let teamDescription + +module.exports = { + aliases: ['teamcreate'], + description: 'Crée une team.', + emote: '🛡️', + utilisation: '', + permission: 0, + + async execute(message, args, client) { + await new Promise((resolve, reject) => { + db.get(`SELECT teamId, pocket FROM users WHERE userId = ? AND guildId = ?`, [message.author.id, message.guild.id], (err, row) => { + if (err) { + reject(err); + } else { + if (row.teamId !== null ) { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🛡️ Création de team') + .setDescription(`Vous êtes déjà dans une team. Vous devez quitter votre team actuelle pour en créer une nouvelle.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + } else if (row.pocket < 3000) { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🛡️ Création de team') + .setDescription(`Vous n'avez pas assez de fonds pour créer une team. Vous avez besoin de 3000.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + } else { + db.run(`UPDATE users SET pocket = pocket - 3000 WHERE userId = ? AND guildId = ?`, [message.author.id, message.guild.id]); + resolve(); + } + } + }); + }); + + const embed = new EmbedBuilder() + .setTitle('🛡️ Création de team') + .setDescription(`Ecrivez le nom de votre team dans le chat.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + const messageTeam = await message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + + const filter = m => m.author.id === message.author.id; + const collector = message.channel.createMessageCollector({ filter, time: 60000, max: 1 }); + collector.on('collect', async m => { + if (m.content.length > 20) { + m.reply('Le nom de la team ne doit pas dépasser 20 caractères.'); + return collector.stop(); + } else if (m.content.length < 3) { + m.reply('Le nom de la team doit contenir au moins 3 caractères.'); + return collector.stop(); + } else { + teamName = m.content; + const embed = new EmbedBuilder() + .setTitle('🛡️ Création de team') + .setDescription(`Ecrivez la description de votre team dans le chat.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + messageTeam.edit({ embeds: [embed] }); + m.delete(); + + const collectorD = message.channel.createMessageCollector({ filter, time: 60000, max: 1 }); + collectorD.on('collect', async m => { + if (m.content.length > 100) { + m.reply('La description de la team ne doit pas dépasser 100 caractères.'); + return collectorD.stop(); + } else if (m.content.length < 2) { + m.reply('La description de la team doit contenir au moins 2 caractères.'); + return collectorD.stop(); + } else { + teamDescription = m.content; + + let idBase = teamName.toLowerCase().replace(/ /g, ''); + let id = idBase; + let increment = 1; + let exists = true; + do { + await new Promise((resolve, reject) => { + db.get(`SELECT * FROM teams WHERE id = ? AND guildId = ?`, [id, message.guild.id], (err, row) => { + if (err) { + reject(err); + } else { + exists = !!row; + if (exists) { + increment++; + id = idBase + increment; + } else { + db.run(`INSERT INTO teams (guildId, id, name, description) VALUES (?, ?, ?, ?)`, [message.guild.id, id, teamName, teamDescription]); + db.run(`UPDATE users SET teamId = ?, teamRole = ? WHERE guildId = ? AND userId = ?`, [id, 'owner', message.guild.id, message.author.id]); + } + resolve(); + } + }); + }); + } while (exists); + + const embed = new EmbedBuilder() + .setTitle('🛡️ Création de team') + .setDescription(`Votre team a été créée avec succès !\n\n**ID :** ${id}\n**Nom :** ${teamName}\n**Description :** ${teamDescription}\n\nVous pouvez maintenant inviter des membres dans votre team avec la commande \`&teaminvite\`.\n\nPour quitter la team, utilisez la commande \`&teamleave\`.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + messageTeam.edit({ embeds: [embed] }); + m.delete(); + } + }); + } + }); + } +}; \ No newline at end of file diff --git a/commands/teams/tdelete.js b/commands/teams/tdelete.js new file mode 100644 index 0000000..179f4ae --- /dev/null +++ b/commands/teams/tdelete.js @@ -0,0 +1,105 @@ +const { ButtonStyle, ButtonBuilder, ActionRowBuilder, EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['teamdelete'], + description: 'Supprime votre équipe.', + emote: '🛡️', + util: '', + permission: 0, + + async execute(message, args, client) { + const team = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM teams WHERE guildId = ? AND id = (SELECT teamId FROM users WHERE guildId = ? AND userId = ?)`, [message.guild.id, message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + + if (!team) { + const embed = new EmbedBuilder() + .setTitle('🛡️ Suppression de l\'équipe') + .setDescription('Vous n\'êtes actuellement pas dans une équipe.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } else { + const teamRole = await new Promise((resolve, reject) => { + db.get(`SELECT teamRole FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row.teamRole); + }); + }); + + if (teamRole !== 'owner') { + const embed = new EmbedBuilder() + .setTitle('Suppression Impossible') + .setDescription('❌ Vous n\'avez pas la permission de supprimer cette équipe.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } + + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId('confirm_delete') + .setLabel('Confirmer') + .setStyle(ButtonStyle.Danger), + new ButtonBuilder() + .setCustomId('cancel_delete') + .setLabel('Annuler') + .setStyle(ButtonStyle.Secondary) + ); + + const embed = new EmbedBuilder() + .setTitle('🛡️ Suppression de l\'équipe') + .setDescription(`Êtes-vous sûr de vouloir supprimer l'équipe ${team.name}? Cette action est irréversible.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + message.reply({ embeds: [embed], components: [row], allowedMentions: { repliedUser: false } }).then(sentMessage => { + const filter = i => i.customId === 'confirm_delete' || i.customId === 'cancel_delete' && i.user.id === message.author.id; + + const collector = sentMessage.createMessageComponentCollector({ filter, time: 15000 }); + + collector.on('collect', async i => { + if (i.customId === 'confirm_delete') { + db.run(`DELETE FROM teams WHERE guildId = ? AND id = ?`, [message.guild.id, team.id], async (err) => { + if (err) { + return i.update({ content: 'Une erreur est survenue lors de la suppression de l\'équipe.', components: [] }); + } + + db.run(`UPDATE users SET teamRole = NULL, teamId = NULL WHERE guildId = ? AND teamId = ?`, [message.guild.id, team.id], async (err) => { + if (err) { + return i.update({ content: 'Une erreur est survenue lors de la mise à jour des membres de l\'équipe.', components: [] }); + } + + const embed = new EmbedBuilder() + .setTitle('🛡️ Suppression de l\'équipe') + .setDescription(`L'équipe ${team.name} a été supprimée avec succès.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return i.update({ embeds: [embed], components: [] }); + }); + }); + } else { + await i.update({ content: 'Suppression de l\'équipe annulée.', components: [] }); + } + }); + + collector.on('end', collected => { + if (collected.size === 0) sentMessage.edit({ content: 'Temps écoulé. Suppression de l\'équipe annulée.', components: [] }); + }); + }); + } + }, +}; \ No newline at end of file diff --git a/commands/teams/tdemote.js b/commands/teams/tdemote.js new file mode 100644 index 0000000..7aeb902 --- /dev/null +++ b/commands/teams/tdemote.js @@ -0,0 +1,113 @@ +const { EmbedBuilder, ButtonStyle, ButtonBuilder, ActionRowBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['teamdemote'], + description: 'Rétrograder un officier à membre dans votre équipe.', + emote: '🛡️', + utilisation: '<@user>', + permission: 0, + + async execute(message, args, client) { + if (!args[0]) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Rétrograder un officier') + .setDescription('Veuillez mentionner un utilisateur à rétrograder.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const userToDemote = message.mentions.users.first(); + if (!userToDemote) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Rétrograder un officier') + .setDescription('Utilisateur non trouvé.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const user = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + + if (!user || user.teamRole !== 'owner') { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Rétrograder un officier') + .setDescription('Vous n\'êtes pas administrateur de cette équipe.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const userToDemoteInfo = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, userToDemote.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + + if (!userToDemoteInfo || userToDemoteInfo.teamId !== user.teamId) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Rétrograder un officier') + .setDescription('L\'utilisateur mentionné n\'est pas dans votre équipe.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + if (userToDemoteInfo.teamRole !== 'officer') { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Rétrograder un officier') + .setDescription('L\'utilisateur mentionné n\'est pas un officier.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + db.run(`UPDATE users SET teamRole = 'membre' WHERE guildId = ? AND userId = ?`, [message.guild.id, userToDemote.id], async (err) => { + if (err) { + return message.reply('Une erreur est survenue lors de la rétrogradation de l\'utilisateur.'); + } + + const embed = new EmbedBuilder() + .setTitle('🛡️ Rétrogradation dans l\'équipe') + .setDescription(`${userToDemote.tag} a été rétrogradé au rang de membre.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + }); + }, +}; \ No newline at end of file diff --git a/commands/teams/tdeposit.js b/commands/teams/tdeposit.js new file mode 100644 index 0000000..f9e4027 --- /dev/null +++ b/commands/teams/tdeposit.js @@ -0,0 +1,94 @@ +const { EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['tdep', 'tdepot', 'teamdep', 'teamdepot'], + description: 'Dépose de l\'argent dans la banque de votre team.', + emote: '💰', + utilisation: '', + permission: 0, + + async execute(message, args, client) { + if (args.length !== 1) { + const embed = new EmbedBuilder() + .setTitle('Dépôt Impossible') + .setDescription('❌ Vous devez spécifier un montant à déposer.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } else if (args[0] !== 'all' && isNaN(args[0])) { + const embed = new EmbedBuilder() + .setTitle('Dépôt Impossible') + .setDescription('❌ Vous devez spécifier un montant valide à déposer.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } else if (args[0] < 1) { + const embed = new EmbedBuilder() + .setTitle('Dépôt Impossible') + .setDescription('❌ Vous devez déposer au moins 1 coin.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } + + const pocket = await new Promise((resolve, reject) => { + db.get(`SELECT pocket FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row.pocket); + }); + }); + + let amout; + if (args[0] === 'all') { + amout = pocket; + } else if (args[0] > pocket) { + const embed = new EmbedBuilder() + .setTitle('Dépôt Impossible') + .setDescription('❌ Vous n\'avez pas assez d\'argent sur vous pour déposer cette somme.\n\n💰 Vous avez actuellement **' + pocket + 'coins** sur vous.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } else { + amout = args[0]; + } + + const team = await new Promise((resolve, reject) => { + db.get(`SELECT teamId FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row.teamId); + }); + }); + if (!team) { + const embed = new EmbedBuilder() + .setTitle('Dépôt Impossible') + .setDescription('❌ Vous n\'êtes pas dans une team.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } else { + db.run(`UPDATE users SET pocket = pocket - ? WHERE guildId = ? AND userId = ?`, [amout, message.guild.id, message.author.id]); + db.run(`UPDATE teams SET bank = bank + ? WHERE id = ?`, [amout, team]); + + const embed = new EmbedBuilder() + .setTitle('Dépôt Effectué') + .setDescription('💰 Vous avez déposé **' + amout + '** coins dans la banque de votre team.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } + }, +}; \ No newline at end of file diff --git a/commands/teams/team.js b/commands/teams/team.js new file mode 100644 index 0000000..1290370 --- /dev/null +++ b/commands/teams/team.js @@ -0,0 +1,57 @@ +const { EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['t'], + description: 'Affiche les informations de votre team.', + emote: '🛡️', + utilisation: '', + permission: 0, + + async execute(message, args, client) { + const team = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM teams WHERE guildId = ? AND id = (SELECT teamId FROM users WHERE guildId = ? AND userId = ?)`, [message.guild.id, message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + + if (!team) { + const embed = new EmbedBuilder() + .setTitle('🛡️ Informations de team') + .setDescription('Vous n\'êtes actuellement pas dans une team.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } else { + const memberlist = await new Promise((resolve, reject) => { + db.all(`SELECT userId, teamRole FROM users WHERE guildId = ? AND teamId = ?`, [message.guild.id, team.id], (err, rows) => { + if (err) reject(err); + resolve(rows); + }); + }); + + const embed = new EmbedBuilder() + .setTitle('🛡️ Informations de team') + .setDescription(`**Nom:** ${team.name}\n**Description:** ${team.description}\n**Banque:** ${team.bank} coins\n**Niveau:** ${team.level}\n**Soldats:** ${team.soldiers}\n**Soldats blessés:** ${team.woundedSoldiers}\n**Niveau du camp:** ${team.campLevel}\n**Tourelles:** ${team.turrets}\n**Cadenas:** ${team.padlock}\n**Membres (${memberlist.length}):**\n${memberlist.map(member => `<@${member.userId}> : ${member.teamRole}`).join('\n')}`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + const urlRegex1 = /(https?:\/\/[^\s]+)/g; + if (team.icon && urlRegex1.test(team.icon)) { + embed.setThumbnail(team.icon); + } + + const urlRegex2 = /(https?:\/\/[^\s]+)/g; + if (team.banner && urlRegex2.test(team.banner)) { + embed.setImage(team.banner); + } + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } + }, +}; \ No newline at end of file diff --git a/commands/teams/tedit.js b/commands/teams/tedit.js new file mode 100644 index 0000000..b667cfb --- /dev/null +++ b/commands/teams/tedit.js @@ -0,0 +1,54 @@ +const { EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['tedit'], + description: 'Modifie les informations de votre team.', + emote: '🛡️', + utilisation: ' ', + permission: 0, + + async execute(message, args, client) { + if (args.length > 0) { + const subCommand = args[0].toLowerCase(); + const newValue = args.slice(1).join(' '); + + if (['name', 'banner', 'icon', 'description'].includes(subCommand)) { + await new Promise((resolve, reject) => { + db.run(`UPDATE teams SET ${subCommand} = ? WHERE guildId = ? AND id = (SELECT teamId FROM users WHERE guildId = ? AND userId = ?)`, [newValue, message.guild.id, message.guild.id, message.author.id], (err) => { + if (err) reject(err); + resolve(); + }); + }); + + const embed = new EmbedBuilder() + .setTitle('🛡️ Modification de team') + .setDescription(`La ${subCommand} de votre team a été mise à jour.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } else { + const embed = new EmbedBuilder() + .setTitle('🛡️ Modification de team') + .setDescription('❌ Vous devez spécifier ce que vous voulez modifier (name, banner, icon ou description).') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } + } else { + const embed = new EmbedBuilder() + .setTitle('🛡️ Modification de team') + .setDescription('Veuillez spécifier ce que vous voulez modifier et la nouvelle valeur.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } + }, +}; \ No newline at end of file diff --git a/commands/teams/tinvite.js b/commands/teams/tinvite.js new file mode 100644 index 0000000..b11b1b5 --- /dev/null +++ b/commands/teams/tinvite.js @@ -0,0 +1,95 @@ +const { EmbedBuilder, ButtonStyle, ButtonBuilder, ActionRowBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['tinvite'], + description: 'Invite un utilisateur à votre team.', + emote: '🛡️', + utilisation: '<@user>', + permission: 0, + + async execute(message, args, client) { + if (!args[0]) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Invitation à l\'équipe') + .setDescription('Veuillez mentionner un utilisateur à inviter.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const userToInvite = message.mentions.users.first(); + if (!userToInvite) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Invitation à l\'équipe') + .setDescription('Utilisateur non trouvé.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const user = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + + if (!user || user.teamRole !== 'owner') { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Invitation à l\'équipe') + .setDescription('Vous n\'êtes pas administrateur de cette équipe.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + embedColor(message.author.id, message.guild.id).then(color => { + const accept = new ButtonBuilder() + .setCustomId('accept') + .setLabel('Rejoindre la team') + .setStyle(ButtonStyle.Success); + + const row = new ActionRowBuilder() + .addComponents(accept); + + const embed = new EmbedBuilder() + .setTitle('🛡️ Invitation à l\'équipe') + .setDescription(`<@${userToInvite.id}> tu as été invité à rejoindre l'équipe de <@${message.author.id}>. Pour accepter l'invitation, clique sur le bouton.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + (async () => { + const sentMessage = await message.reply({ embeds: [embed], components: [row], allowedMentions: { repliedUser: false } }); + + const filter = i => i.customId === 'accept' && i.user.id === userToInvite.id; + const collector = sentMessage.createMessageComponentCollector({ filter, time: 120000 }); + collector.on('collect', async (interaction) => { + db.run(`UPDATE users SET teamId = ?, teamRole = ? WHERE guildId = ? AND userId = ?`, [user.teamId, 'membre', message.guild.id, userToInvite.id], (err) => { + if (err) { + return message.reply('Une erreur est survenue lors de l\'invitation de l\'utilisateur.'); + } + interaction.reply({ content: 'Tu as rejoint l\'équipe.', allowedMentions: { repliedUser: false } }); + sentMessage.edit({ components: [] }); + }); + }); + })(); + }); + }, +}; \ No newline at end of file diff --git a/commands/teams/tkick.js b/commands/teams/tkick.js new file mode 100644 index 0000000..b1617bd --- /dev/null +++ b/commands/teams/tkick.js @@ -0,0 +1,144 @@ +const { EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['teamkick'], + description: 'Expulse un utilisateur de votre team.', + emote: '🛡️', + utilisation: '<@user>', + permission: 0, + + async execute(message, args, client) { + if (!args[0]) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Expulsion de l\'équipe') + .setDescription('Veuillez mentionner un utilisateur à expulser.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const userToKick = message.mentions.users.first(); + if (!userToKick) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Expulsion de l\'équipe') + .setDescription('Utilisateur non trouvé.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } else if (userToKick.id === message.author.id) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Expulsion de l\'équipe') + .setDescription('Vous ne pouvez pas vous expulser de votre propre équipe. Si vous souhaitez quitter votre équipe, utilisez la commande `&tleave`.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const team = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM teams WHERE guildId = ? AND id = (SELECT teamId FROM users WHERE guildId = ? AND userId = ?)`, [message.guild.id, message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + + if (!team) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Expulsion de l\'équipe') + .setDescription('Vous n\'êtes pas dans une équipe.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const user = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + + const userToKickInfo = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, userToKick.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + + if (!userToKickInfo || userToKickInfo.teamId !== user.teamId) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Expulsion de l\'équipe') + .setDescription('L\'utilisateur mentionné n\'est pas dans votre équipe.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + if (!user || user.teamRole !== 'owner') { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Expulsion de l\'équipe') + .setDescription('Vous n\'êtes pas administrateur de cette équipe.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + db.run(`UPDATE users SET teamId = NULL, teamRole = NULL WHERE guildId = ? AND userId = ?`, [message.guild.id, userToKick.id], async (err) => { + if (err) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Expulsion de l\'équipe') + .setDescription('Une erreur est survenue lors de l\'expulsion de l\'utilisateur.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🛡️ Expulsion de l\'équipe') + .setDescription(`${userToKick.tag} a été expulsé de l'équipe.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + }); + }, +}; \ No newline at end of file diff --git a/commands/teams/tleave.js b/commands/teams/tleave.js new file mode 100644 index 0000000..65ceacf --- /dev/null +++ b/commands/teams/tleave.js @@ -0,0 +1,101 @@ +const { EmbedBuilder, ButtonStyle, ButtonBuilder, ActionRowBuilder } = require('discord.js'); +const embedColor = require('../../fonctions/embedColor.js'); +const db = require('../../fonctions/database.js'); + +module.exports = { + aliases: ['teamleave'], + description: 'Quitte une team.', + emote: '🛡️', + utilisation: '', + permission: 0, + + async execute(message, args, client) { + await new Promise((resolve, reject) => { + db.get(`SELECT teamId FROM users WHERE userId = ? AND guildId = ?`, [message.author.id, message.guild.id], (err, row) => { + if (err) { + reject(err); + } else { + if (row.teamId === null ) { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🛡️ Quitter une team') + .setDescription(`Vous n'êtes dans aucune team.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + } else { + resolve(); + } + } + }); + }); + + await new Promise((resolve, reject) => { + db.get(`SELECT teamRole FROM users WHERE userId = ? AND guildId = ?`, [message.author.id, message.guild.id], (err, row) => { + if (err) { + reject(err); + } else { + if (row.teamRole === 'owner') { + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🛡️ Quitter une team') + .setDescription(`Vous êtes le leader de votre team. Vous devez nommer un autre membre leader avant de quitter la team. Pour cela, utilisez la commande \`&tpromote \` jusqu'à ce que vous ne soyez plus leader.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }) + }); + } else { + resolve(); + } + } + }); + }); + + + const embed = new EmbedBuilder() + .setTitle('🛡️ Quitter une team') + .setDescription(`Êtes-vous sûr de vouloir quitter votre team ?`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + const confirmeButton = new ButtonBuilder() + .setCustomId('confirme') + .setLabel('✅') + .setStyle(ButtonStyle.Primary); + + const row = new ActionRowBuilder() + .addComponents(confirmeButton); + + const messageTeam = await message.reply({ embeds: [embed], components: [row], allowedMentions: { repliedUser: false } }); + + const filter = i => i.user.id === message.author.id; + const collector = messageTeam.createMessageComponentCollector({ filter, time: 60000 }); + collector.on('collect', async i => { + if (i.customId === 'confirme') { + db.run(`UPDATE users SET teamId = NULL, teamRole = NULL WHERE userId = ? AND guildId = ?`, [message.author.id, message.guild.id], err => { + if (err) { + console.error(err); + return i.reply('Une erreur est survenue.'); + } + + embedColor(message.author.id, message.guild.id).then(color => { + const embed = new EmbedBuilder() + .setTitle('🛡️ Quitter une team') + .setDescription(`Vous avez quitté votre team.`) + .setColor(color) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + + return i.update({ embeds: [embed], components: [] }); + }); + }); + } + }); + } +}; \ No newline at end of file diff --git a/commands/teams/towner.js b/commands/teams/towner.js new file mode 100644 index 0000000..d495559 --- /dev/null +++ b/commands/teams/towner.js @@ -0,0 +1,147 @@ +const { ButtonStyle, ButtonBuilder, ActionRowBuilder, EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['teamadmin', 'tadmin', 'teamowner'], + description: 'Promouvoir un utilisateur à administrateur dans votre équipe.', + emote: '🛡️', + utilisation: '<@user>', + permission: 0, + + async execute(message, args, client) { + if (!args[0]) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Promotion dans l\'équipe') + .setDescription('Veuillez mentionner un utilisateur à promouvoir.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const userToPromote = message.mentions.users.first(); + if (!userToPromote) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Promotion dans l\'équipe') + .setDescription('Utilisateur non trouvé.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const user = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + + if (!user || user.teamRole !== 'owner') { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Promotion dans l\'équipe') + .setDescription('Vous n\'êtes pas administrateur de cette équipe.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const userToPromoteInfo = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, userToPromote.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + + if (!userToPromoteInfo || userToPromoteInfo.teamId !== user.teamId) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Promotion dans l\'équipe') + .setDescription('L\'utilisateur mentionné n\'est pas dans votre équipe.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const bouton = new ButtonBuilder() + .setCustomId('promote_to_admin') + .setLabel('Confirmer') + .setStyle(ButtonStyle.Success); + + const row = new ActionRowBuilder() + .addComponents(bouton); + + const embed = new EmbedBuilder() + .setTitle('🛡️ Promotion dans l\'équipe') + .setDescription(`Êtes-vous sûr de vouloir promouvoir ${userToPromote.tag} au rang d'administrateur ?`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + const sendMessage = await message.reply({ embeds: [embed], components: [row], allowedMentions: { repliedUser: false } }); + + const filter = i => i.customId === 'promote_to_admin' && i.user.id === message.author.id; + const collector = sendMessage.createMessageComponentCollector({ filter, time: 120000 }); + + collector.on('collect', async (interaction) => { + db.run(`UPDATE users SET teamRole = 'owner' WHERE guildId = ? AND userId = ?`, [message.guild.id, userToPromote.id], async (err) => { + if (err) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Promotion dans l\'équipe') + .setDescription('Une erreur est survenue lors de la promotion de l\'utilisateur.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + db.run(`UPDATE users SET teamRole = 'officier' WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], async (err) => { + if (err) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Promotion dans l\'équipe') + .setDescription('Une erreur est survenue lors de la mise à jour de votre rôle.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const embed = new EmbedBuilder() + .setTitle('🛡️ Promotion dans l\'équipe') + .setDescription(`${userToPromote.tag} a été promu au rang d'administrateur. Vous avez été rétrogradé au rang d'officier.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + sendMessage.edit({ embeds: [embed], components: [] }); + }); + }); + }); + }, +}; \ No newline at end of file diff --git a/commands/teams/tpromote.js b/commands/teams/tpromote.js new file mode 100644 index 0000000..223a334 --- /dev/null +++ b/commands/teams/tpromote.js @@ -0,0 +1,123 @@ +const { EmbedBuilder, ButtonStyle, ButtonBuilder, ActionRowBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['teampromote'], + description: 'Promouvoir un utilisateur à officier dans votre équipe.', + emote: '🛡️', + utilisation: '<@user>', + permission: 0, + + async execute(message, args, client) { + if (!args[0]) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Promotion dans l\'équipe') + .setDescription('Veuillez mentionner un utilisateur à promouvoir.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const userToPromote = message.mentions.users.first(); + if (!userToPromote) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Promotion dans l\'équipe') + .setDescription('Utilisateur non trouvé.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const user = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + + if (!user || user.teamRole !== 'owner') { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Promotion dans l\'équipe') + .setDescription('Vous n\'êtes pas administrateur de cette équipe.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const userToPromoteInfo = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, userToPromote.id], (err, row) => { + if (err) reject(err); + resolve(row); + }); + }); + + if (!userToPromoteInfo || userToPromoteInfo.teamId !== user.teamId) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Promotion dans l\'équipe') + .setDescription('L\'utilisateur mentionné n\'est pas dans votre équipe.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + if (userToPromoteInfo.teamRole === 'officer') { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Promotion dans l\'équipe') + .setDescription('L\'utilisateur mentionné est déjà un officier.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + db.run(`UPDATE users SET teamRole = 'officer' WHERE guildId = ? AND userId = ?`, [message.guild.id, userToPromote.id], async (err) => { + if (err) { + return message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle('🛡️ Promotion dans l\'équipe') + .setDescription('Une erreur est survenue lors de la promotion de l\'utilisateur.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], + allowedMentions: { repliedUser: false } + }); + } + + const embed = new EmbedBuilder() + .setTitle('🛡️ Promotion dans l\'équipe') + .setDescription(`${userToPromote.tag} a été promu au rang d'officier.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + }); + }, +}; \ No newline at end of file diff --git a/commands/teams/twithdraw.js b/commands/teams/twithdraw.js new file mode 100644 index 0000000..9c4f96e --- /dev/null +++ b/commands/teams/twithdraw.js @@ -0,0 +1,113 @@ +const { EmbedBuilder } = require('discord.js'); +const db = require('../../fonctions/database.js'); +const embedColor = require('../../fonctions/embedColor.js'); + +module.exports = { + aliases: ['tretirer', 'teamwithdraw', 'teamretirer', 'teamwh', 'twh'], + description: 'Retire de l\'argent de la banque de votre team.', + emote: '💰', + utilisation: '', + permission: 0, + + async execute(message, args, client) { + if (args.length !== 1) { + const embed = new EmbedBuilder() + .setTitle('Retrait Impossible') + .setDescription('❌ Vous devez spécifier un montant à retirer.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } else if (args[0] !== 'all' && isNaN(args[0])) { + const embed = new EmbedBuilder() + .setTitle('Retrait Impossible') + .setDescription('❌ Vous devez spécifier un montant valide à retirer.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } else if (args[0] < 1) { + const embed = new EmbedBuilder() + .setTitle('Retrait Impossible') + .setDescription('❌ Vous devez retirer au moins 1 coin.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } + + const teamRole = await new Promise((resolve, reject) => { + db.get(`SELECT teamRole FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row.teamRole); + }); + }); + + if (!teamRole || (teamRole !== 'officier' && teamRole !== 'owner')) { + const embed = new EmbedBuilder() + .setTitle('Retrait Impossible') + .setDescription('❌ Vous n\'avez pas la permission de retirer de l\'argent de la banque de l\'équipe.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } + + const team = await new Promise((resolve, reject) => { + db.get(`SELECT teamId FROM users WHERE guildId = ? AND userId = ?`, [message.guild.id, message.author.id], (err, row) => { + if (err) reject(err); + resolve(row.teamId); + }); + }); + + if (!team) { + const embed = new EmbedBuilder() + .setTitle('Retrait Impossible') + .setDescription('❌ Vous n\'êtes pas dans une team.') + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } else { + const bank = await new Promise((resolve, reject) => { + db.get(`SELECT bank FROM teams WHERE id = ? AND guildId = ?`, [team, message.guild.id], (err, row) => { + if (err) reject(err); + resolve(row.bank); + }); + }); + + let amount; + if (args[0] === 'all') { + amount = bank; + } else if (args[0] > bank) { + const embed = new EmbedBuilder() + .setTitle('Retrait Impossible') + .setDescription(`❌ Votre team n'a pas assez d'argent dans la banque pour retirer cette somme.\n\n💰 Votre team a actuellement **${bank} coins** dans la banque.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } else { + amount = args[0]; + } + + db.run(`UPDATE users SET pocket = pocket + ? WHERE guildId = ? AND userId = ?`, [amount, message.guild.id, message.author.id]); + db.run(`UPDATE teams SET bank = bank - ? WHERE id = ? AND guildId = ?`, [amount, team, message.guild.id]); + + const embed = new EmbedBuilder() + .setTitle('Retrait Effectué') + .setDescription(`💰 Vous avez retiré **${amount}** coins de la banque de votre team.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + return message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + } + }, +}; \ No newline at end of file