Files
2024-06-24 00:32:05 +02:00

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();
}
});
}
},
};