diff --git a/commands/jeux/gunfight.js b/commands/jeux/gunfight.js new file mode 100644 index 0000000..316142d --- /dev/null +++ b/commands/jeux/gunfight.js @@ -0,0 +1,315 @@ +const { EmbedBuilder, ButtonStyle, ButtonBuilder, ActionRowBuilder } = require('discord.js'); +const embedColor = require('../../fonctions/embedColor.js'); +const db = require('../../fonctions/database.js'); + +module.exports = { + aliases: [], + description: 'Joue au gunfight.', + emote: '🔫', + utilisation: '<@membre> ', + permission: 0, + + async execute(message, args, client) { + let member; + let mise; + if (message.mentions.members.first()?.id && args.length === 1) { + member = message.mentions.members.first().id; + mise = args[0]; + } else if (args.length === 2 && message.mentions.members.first()?.id) { + member = message.mentions.members.first()?.id; + mise = args[1]; + } else if (args.length === 2) { + member = args[0]; + mise = args[1]; + } else { + return message.reply({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription(`Vous devez spécifier un membre et une mise. Exemple : \`&gunfight @membre 100\`.`) + .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 (!member || !mise) { + return message.reply({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription(`Vous devez spécifier un membre et une mise. Exemple : \`&gunfight @membre 100\`.`) + .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 (isNaN(mise)) { + return message.reply({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription(`La mise doit être un nombre.`) + .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 (mise < 25) { + return message.reply({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription(`La mise doit être supérieure ou égale à \`25\`.`) + .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 (member === message.author.id) { + return message.reply({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription(`Vous ne pouvez pas jouer contre vous-même.`) + .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 (member === client.user.id) { + return message.reply({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription(`Je ne peux pas jouer contre vous désolé.`) + .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 (client.users.cache.get(member)?.bot) { + return message.reply({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription('Vous ne pouvez pas jouer contre un bot.') + .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 pocketUser = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE userId = ? AND guildId = ?`, [message.author.id, message.guild.id], (err, row) => { + if (err) { + reject(err); + } else { + if (row) { + resolve(row.pocket); + } else { + resolve(null); + } + } + }); + }); + + const pocketMember = await new Promise((resolve, reject) => { + db.get(`SELECT * FROM users WHERE userId = ? AND guildId = ?`, [member, message.guild.id], (err, row) => { + if (err) { + reject(err); + } else { + if (row) { + resolve(row.pocket); + } else { + resolve(null); + } + } + }); + }); + + if (pocketUser === null) { + return message.reply({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription(`Vous n'êtes pas enregistré dans la base de données.`) + .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 (pocketMember === null) { + return message.reply({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription(`Le membre spécifié n'existe pas.`) + .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 (pocketUser < mise) { + return message.reply({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription(`Vous n'avez pas assez d'argent sur vous pour miser cette somme.\nVotre solde actuel est de ${pocketUser} coins.`) + .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 (pocketMember < mise) { + return message.reply({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription(`Ce membre n'a pas assez d'argent sur lui pour miser cette somme.\nSon solde actuel est de ${pocketMember} coins.`) + .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 (pocketUser === 0) { + return message.reply({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription(`Vous n'avez pas d'argent sur vous pour miser.`) + .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 (pocketMember === 0) { + return message.reply({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription(`Ce membre n'a pas d'argent sur lui pour miser.`) + .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('🔫 Gunfight') + .setDescription(`Vous avez défié <@${member}> à un duel de gunfight pour une mise de ${mise} coins.\nVeuillez appuyer sur le bouton pour accepter ou refuser le défi.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }); + + const buttonAccept = new ButtonBuilder() + .setCustomId('gunfight-accept') + .setLabel('Accepter') + .setStyle(ButtonStyle.Success); + + const buttonRefuse = new ButtonBuilder() + .setCustomId('gunfight-refuse') + .setLabel('Refuser') + .setStyle(ButtonStyle.Danger); + + const actionRow = new ActionRowBuilder() + .addComponents(buttonAccept, buttonRefuse); + + const sendMessage = await message.reply({ embeds: [embed], components: [actionRow], allowedMentions: { repliedUser: false } }); + + const filter = i => i.user.id === member; + const collector = sendMessage.createMessageComponentCollector({ filter, time: 60000 }); + collector.on('collect', async i => { + if (i.customId === 'gunfight-accept') { + collector.stop(); + i.deferUpdate(); + + db.run(`UPDATE users SET pocket = pocket - ? WHERE userId = ? AND guildId = ?`, [mise, message.author.id, message.guild.id]); + db.run(`UPDATE users SET pocket = pocket - ? WHERE userId = ? AND guildId = ?`, [mise, member, message.guild.id]); + + const tirerBtn = new ButtonBuilder() + .setCustomId('gunfight-tirer') + .setLabel('Tirer') + .setStyle(ButtonStyle.Danger); + + const actionRow = new ActionRowBuilder() + .addComponents(tirerBtn); + + sendMessage.edit({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription(`Le membre a accepté votre défi de gunfight. Le duel va commencer.\nAppuyez sur le bouton pour tirer quand il devient vert.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], components: [actionRow] }); + + const timer = Math.floor(Math.random() * 10000) + 5000 + let fincollector = false; + const filter = i => i.user.id === member || i.user.id === message.member.id; + const tirerCollector = sendMessage.createMessageComponentCollector({ filter, time: timer }); + tirerCollector.on('collect', async i => { + if (i.customId === 'gunfight-tirer') { + fincollector = true; + tirerCollector.stop(); + sendMessage.edit({ components: [] }); + + let winner; + let notwinner; + if (i.user.id === member) { + winner = member; + notwinner = message.author.id; + } else { + winner = message.author.id; + notwinner = member; + } + + i.reply({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription(`Le duel est terminé. <@${winner}> a gagné la somme de ${mise*2} coins car <@${notwinner}> a tiré trop tôt`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + ] }); + + db.run(`UPDATE users SET pocket = pocket + ? WHERE userId = ? AND guildId = ?`, [mise*2, winner, message.guild.id]); + } + }); + + tirerCollector.on('end', async () => { + if (fincollector) return; + tirerBtn.setStyle(ButtonStyle.Success); + sendMessage.edit({ components: [actionRow] }); + + const filter = i => i.user.id === member || i.user.id === message.member.id; + const tirerCollector = sendMessage.createMessageComponentCollector({ filter, time: 60000 }); + tirerCollector.on('collect', async i => { + if (i.customId === 'gunfight-tirer') { + tirerCollector.stop(); + sendMessage.edit({ components: [] }); + + i.reply({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription(`Le duel est terminé. <@${i.user.id}> a gagné la somme de ${mise*2} coins.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + ] }); + + db.run(`UPDATE users SET pocket = pocket + ? WHERE userId = ? AND guildId = ?`, [mise*2, i.user.id, message.guild.id]); + return; + } + }); + }); + + } else if (i.customId === 'gunfight-refuse') { + collector.stop(); + sendMessage.edit({ embeds: [ + new EmbedBuilder() + .setTitle('🔫 Gunfight') + .setDescription(`Le membre a refusé votre défi de gunfight.`) + .setColor(await embedColor(message.author.id, message.guild.id)) + .setTimestamp() + .setFooter({ text: `Demandé par ${message.author.tag}`, iconURL: message.author.displayAvatarURL() }) + ], components: [] }); + } + }); + } +}; \ No newline at end of file