mirror of
https://github.com/arthur-pbty/bot-discord-coins.git
synced 2026-06-03 15:07:20 +02:00
536 lines
16 KiB
JavaScript
536 lines
16 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();
|
|
}
|
|
});
|
|
}
|
|
},
|
|
};
|