mirror of
https://github.com/arthur-pbty/bot-discord-coins.git
synced 2026-06-03 23:36:29 +02:00
366 lines
15 KiB
JavaScript
366 lines
15 KiB
JavaScript
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: '<mise>',
|
|
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();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}; |