jelly-djs
Version:
An easy discord.js multipurpose npm for memes and fun!
584 lines (536 loc) • 29.4 kB
JavaScript
const Discord = require("discord.js")
const shuffle = require("shuffle-array")
const games = new Set();
/**
* @param {Discord.Message} message The Message Object sent by the user
* @param {Discord.Client} client The Discord Client
* @returns String
* @async
* @example
* const Discord = require("discord.js")
* const blackjack = require("discord-blackjack")
* const client = new Discord.Client(ws: ["GUILDS", "GUILD_MESSAGES", "GUILD_MESSAGE_REACTIONS"])
* const prefix = "-"
* const token = "TOKEN_GOES_HERE"
*
* client.on("ready", () => {
* console.log("Bot has logged in!")
* })
*
* client.on("message", async message => {
* if (message.author.bot || !message.content.startsWith("prefix")) return
*
* if (message.content == `${prefix}blackjack` || message.content == `${prefix}bj`) {
* let game = await blackjack(message, client)
* let result = game.result
* if (result == "Win") {
* // do win stuff here
* } else if (result == "Tie") {
* // do tie stuff here
* } else if (result == "Lose") {
* // do lose stuff here
* } else if (result == "Double Win") {
* // do double-down here
* }
* }
* })
*
* client.login(token)
*/
module.exports = async (message, client, options) => {
let normalembed = false
let copiedEmbed = {
content: "",
value: ""
}
let method = "None"
if (!message) throw new Error("[DETAILS_NOT_PROVIDED]: The Message Object was not provided!")
if (!client) throw new Error("[DETAILS_NOT_PROVIDED]: The Discord Client Object was not provided!")
if (!options) options = {}
if (typeof options != "object") throw new Error("[INVALID_DETAILS]: Options is expected to be an object!")
if (!options.resultEmbed && options.resultEmbed != false) options.resultEmbed = true
if (!options.normalEmbed && options.normalEmbed != false) options.normalEmbed = true
if (!options.doubledown && options.doubledown != false) options.doubledown = true
if (!options.split && options.split != false) options.split = true
if (options.normalEmbed == false) {
if (!options.normalEmbedContent) throw new Error("[DETAILS_NOT_PROVIDED]: The Embed object was not provided!")
normalembed = options.normalEmbedContent
}
if (!message.id || !message.channel || !message.channel.id || !message.author) throw new Error("[INVALID_DETAILS]: The Message Object was invalid!")
if (!client.user.id || !client.user) throw new Error("[INVALID_DETAILS]: The Discord Client Object was invalid!")
if (!message.guild || !message.guild.me) throw new TypeError("[WRONG_USAGE]: This cannot be used in DMs!")
if (games.has(message.author.id)) {
return message.channel.send("You are already playing a game!")
}
games.add(message.author.id)
try {
let DECK = [
{ suit: 'clubs', rank: 'A', value: [1, 11], emoji: "♣️" },
{ suit: 'clubs', rank: '2', value: 2, emoji: "♣️" },
{ suit: 'clubs', rank: '3', value: 3, emoji: "♣️" },
{ suit: 'clubs', rank: '4', value: 4, emoji: "♣️" },
{ suit: 'clubs', rank: '5', value: 5, emoji: "♣️" },
{ suit: 'clubs', rank: '6', value: 6, emoji: "♣️" },
{ suit: 'clubs', rank: '7', value: 7, emoji: "♣️" },
{ suit: 'clubs', rank: '8', value: 8, emoji: "♣️" },
{ suit: 'clubs', rank: '9', value: 9, emoji: "♣️" },
{ suit: 'clubs', rank: '10', value: 10, emoji: "♣️" },
{ suit: 'clubs', rank: 'J', value: 10, emoji: "♣️" },
{ suit: 'clubs', rank: 'Q', value: 10, emoji: "♣️" },
{ suit: 'clubs', rank: 'K', value: 10, emoji: "♣️" },
{ suit: 'diamonds', rank: 'A', value: [1, 11], emoji: "️️️️️️♦️" },
{ suit: 'diamonds', rank: '2', value: 2, emoji: "♦️" },
{ suit: 'diamonds', rank: '3', value: 3, emoji: "♦️" },
{ suit: 'diamonds', rank: '4', value: 4, emoji: "♦️" },
{ suit: 'diamonds', rank: '5', value: 5, emoji: "♦️" },
{ suit: 'diamonds', rank: '6', value: 6, emoji: "♦️" },
{ suit: 'diamonds', rank: '7', value: 7, emoji: "♦️" },
{ suit: 'diamonds', rank: '8', value: 8, emoji: "♦️" },
{ suit: 'diamonds', rank: '9', value: 9, emoji: "♦️" },
{ suit: 'diamonds', rank: '10', value: 10, emoji: "♦️" },
{ suit: 'diamonds', rank: 'J', value: 10, emoji: "♦️" },
{ suit: 'diamonds', rank: 'Q', value: 10, emoji: "♦️" },
{ suit: 'diamonds', rank: 'K', value: 10, emoji: "♦️" },
{ suit: 'hearts', rank: 'A', value: [1, 11], emoji: "♥️" },
{ suit: 'hearts', rank: '2', value: 2, emoji: "♥️" },
{ suit: 'hearts', rank: '3', value: 3, emoji: "♥️" },
{ suit: 'hearts', rank: '4', value: 4, emoji: "♥️" },
{ suit: 'hearts', rank: '5', value: 5, emoji: "♥️" },
{ suit: 'hearts', rank: '6', value: 6, emoji: "♥️" },
{ suit: 'hearts', rank: '7', value: 7, emoji: "♥️" },
{ suit: 'hearts', rank: '8', value: 8, emoji: "♥️" },
{ suit: 'hearts', rank: '9', value: 9, emoji: "♥️" },
{ suit: 'hearts', rank: '10', value: 10, emoji: "♥️" },
{ suit: 'hearts', rank: 'J', value: 10, emoji: "♥️" },
{ suit: 'hearts', rank: 'Q', value: 10, emoji: "♥️" },
{ suit: 'hearts', rank: 'K', value: 10, emoji: "♥️" },
{ suit: 'spades', rank: 'A', value: [1, 11], emoji: "♠️" },
{ suit: 'spades', rank: '2', value: 2, emoji: "♠️" },
{ suit: 'spades', rank: '3', value: 3, emoji: "♠️" },
{ suit: 'spades', rank: '4', value: 4, emoji: "♠️" },
{ suit: 'spades', rank: '5', value: 5, emoji: "♠️" },
{ suit: 'spades', rank: '6', value: 6, emoji: "♠️" },
{ suit: 'spades', rank: '7', value: 7, emoji: "♠️" },
{ suit: 'spades', rank: '8', value: 8, emoji: "♠️" },
{ suit: 'spades', rank: '9', value: 9, emoji: "♠️" },
{ suit: 'spades', rank: '10', value: 10, emoji: "♠️" },
{ suit: 'spades', rank: 'J', value: 10, emoji: "♠️" },
{ suit: 'spades', rank: 'Q', value: 10, emoji: "♠️" },
{ suit: 'spades', rank: 'K', value: 10, emoji: "♠️" },
];
let RESULTS = "Unknown"
let NEWDECKS = shuffle(DECK)
// all the variables
let addco = ""
for (let a = 0; a < NEWDECKS.length; a++) {
if (NEWDECKS[a].rank == "A") {
NEWDECKS[a].value = 11
}
}
if (NEWDECKS[0].rank == "A") {
addco = "Soft "
if (NEWDECKS[2].rank == "A") {
NEWDECKS[2].value = 1
}
}
if (NEWDECKS[2].rank == "A") {
addco = "Soft "
}
if (NEWDECKS[1].rank == "A") {
if (NEWDECKS[3].rank == "A") {
NEWDECKS[3].value = 1
}
}
let startAt = 5
let yourdeck = [NEWDECKS[0], NEWDECKS[2]].sort((a, b) => a.value - b.value)
let yourrank = [NEWDECKS[0].rank, NEWDECKS[2].rank]
let youremoji = [NEWDECKS[0].emoji, NEWDECKS[2].emoji]
let yourcontent = [`${NEWDECKS[0].emoji} ${NEWDECKS[0].rank}`, `${NEWDECKS[2].emoji} ${NEWDECKS[2].rank}`]
let value = NEWDECKS[0].value + NEWDECKS[2].value
let dealerdeck = [NEWDECKS[1], NEWDECKS[3]].sort((a, b) => a.value - b.value)
let dealerrank = [NEWDECKS[1].rank, NEWDECKS[3].rank]
let dealeremoji = [NEWDECKS[1].emoji, NEWDECKS[3].emoji]
let dealercontent = [`${NEWDECKS[1].emoji} ${NEWDECKS[1].rank}`, `${NEWDECKS[3].emoji} ${NEWDECKS[3].rank}`]
let dvalue = dealerdeck[0].value + dealerdeck[1].value
let usertag = message.author.tag
let avatar = message.author.displayAvatarURL()
if (normalembed == false) {
normalembed = new Discord.MessageEmbed()
.setAuthor(usertag, avatar)
.setColor("RANDOM")
.addField(`Your Hand`, `Cards: [\`${yourcontent.join("\`](https://google.com) [\`")}\`](https://google.com)\nTotal: \`${addco}${value}\``, true)
.addField(`${client.user.username}'s Hand`, `Cards: [\`${dealerdeck[0].emoji} ${dealerdeck[0].rank}\`](https://google.com) \` ? \`\nTotal: \` ? \``, true)
.setTitle(`Blackjack Game`)
.setFooter("Type E or End to stop the game")
} else {
normalembed.fields[0].value = normalembed.fields[0].value.replace(`{yourcontent}`, `[\`${yourcontent.join("\`](https://google.com) [\`")}\`](https://google.com)`).replace("{yvalue}", `${addco}${value}`)
normalembed.fields[1].value = normalembed.fields[1].value.replace(`{dcontent}`, `[\`${dealerdeck[0].emoji} ${dealerdeck[0].rank}\`](https://google.com) \` ? \``).replace("{dvalue}", `?`)
copiedEmbed.content = `[\`${yourcontent.join("\`](https://google.com) [\`")}\`](https://google.com)`
copiedEmbed.value = `${addco}${value}`
}
let winembed = new Discord.MessageEmbed()
.setAuthor(usertag, avatar)
.setColor("#008800")
.addField(`Your Hand`, `Cards: [\`${yourcontent.join("`](https://google.com) [`")}\`](https://google.com)\nTotal: \`${addco}${value}\``, true)
.addField(`${client.user.username}'s Hand`, `Cards: [\`${dealercontent.join("`](https://google.com) [`")}\`](https://google.com)\nTotal: \`${dvalue}\``, true)
.setTitle(`You won!`)
let loseembed = new Discord.MessageEmbed()
.setAuthor(usertag, avatar)
.setColor("#880000")
.addField(`Your Hand`, `Cards: [\`${yourcontent.join("`](https://google.com) [`")}](https://google.com)\`\nTotal: \`${addco}${value}\``, true)
.addField(`${client.user.username}'s Hand`, `Cards: [\`${dealercontent.join("`](https://google.com) [`")}\`](https://google.com)\nTotal: \`${dvalue}\``, true)
.setTitle(`You lost!`)
let tieembed = new Discord.MessageEmbed()
.setAuthor(usertag, avatar)
.setColor("#888800")
.addField(`Your Hand`, `Cards: [\`${yourcontent.join("`](https://google.com) [`")}](https://google.com)\`\nTotal: \`${addco}${value}\``, true)
.addField(`${client.user.username}'s Hand`, `Cards: [\`${dealercontent.join("`](https://google.com) [`")}\`](https://google.com)\nTotal: \`${dvalue}\``, true)
.setTitle(`It's a tie!`)
let cancelembed = new Discord.MessageEmbed()
.setAuthor(usertag, avatar)
.setColor("#880000")
.setTitle("Game Canceled")
.setFooter("Auhh, please stay next time!")
.setDescription("Game has succesfully been canceled!")
let noResEmbed = new Discord.MessageEmbed()
.setAuthor(usertag, avatar)
.setTitle(`Game Ended`)
.setDescription(`**${message.author.username}, your Game has Ended due to 30 seconds of Inactivity.**`)
.setColor("RANDOM")
let normalcontent = `Type \`h\` to draw a card or type \`s\` to stand.`
let doubledown = `Type \`h\` to draw a card, type \`s\` to stand or type \`d\` to double down.`
let split = `Type \`h\` to draw a card, type \`s\` to stand or \`split\` to split`
let content = normalcontent
let answers1 = ["h", "hit", "hi", "e", "en", "end", "s", "stand", "st", "sta", "stan"] // normalcontent
let answers2 = ["h", "hit", "hi", "e", "en", "end", "s", "stand", "st", "sta", "stan", "d", "dd", "double-down", "double down"] // doubledown
let answers3 = ["h", "hit", "hi", "e", "en", "end", "s", "stand", "st", "sta", "stan", "sp", "split", "spl", "spli"] // split
let filter1 = m => m.author.id == message.author.id && answers1.includes(m.content.toLowerCase()) // answers1
let filter2 = m => m.author.id == message.author.id && answers2.includes(m.content.toLowerCase()) // answers2
let filter3 = m => m.author.id == message.author.id && answers3.includes(m.content.toLowerCase()) // answers3
let filter = filter1
let doubledtrue = false
let responsenow = "h"
if (value == 21) {
responsenow = "s"
if (dvalue == 21) {
if (options.resultEmbed == true) {
message.channel.send({ embeds: [tieembed] })
}
method = "Tie"
RESULTS = "Tie"
} else {
if (options.resultEmbed == true) {
message.channel.send({ embeds: [winembed] })
}
method = "Blackjack"
RESULTS = "Win"
}
}
if (addco != "Soft ") {
if (value == 9 || (value == 10 || value == 11 && dealerdeck[1].value < 10)) {
content = doubledown
filter = filter2
} else if (yourdeck[0].rank == yourdeck[1].rank) {
content = split
filter = filter3
}
}
if (RESULTS == "Unknown") {
let ori = message.channel.send({ content: content, embeds: [normalembed] })
normalembed.fields[0].value = normalembed.fields[0].value.replace(copiedEmbed.value, `{yvalue}`)
await message.channel.awaitMessages({
filter,
max: 1,
time: 30000
}).then(
async allresponses => {
if (!allresponses.size) {
responsenow = "timeout"
} else {
let theanswer = String(allresponses.first()).toLowerCase()
if (["h", "hit", "hi"].includes(theanswer)) {
let dealCard = NEWDECKS[startAt - 1]
yourdeck.push(dealCard)
if (dealCard.rank == "A") {
if (yourrank.includes("A")) {
dealCard.value = 1
} else {
dealCard.value = 11
addco = "Soft "
}
}
value = value + dealCard.value
yourcontent.push(`${dealCard.emoji} ${dealCard.rank}`)
yourrank.push(dealCard.rank)
youremoji.push(dealCard.emoji)
let endtrue = false
if (value >= 21) {
if (addco == "Soft ") {
addco = ""
for (let e = 0; e < yourdeck.length; e++) {
if (yourdeck[e].rank == "A") {
yourdeck[e].value = 1
value = value - 10
}
}
} else {
if (dealCard.rank != "A") {
endtrue = true
responsenow = "s"
} else {
addco = "Soft "
}
}
}
if (endtrue == false) {
if (value >= 21) {
responsenow = "s"
} else {
responsenow = "h"
}
}
if (responsenow != "s") {
if (options.normalEmbed == true) {
normalembed.fields[0].value = `Cards: [\`${yourcontent.join("`](https://google.com) [`")}\`](https://google.com)\nTotal: \`${addco}${value}\``
} else {
normalembed.fields[0].value = normalembed.fields[0].value.replace(copiedEmbed.content, `[\`${yourcontent.join("`](https://google.com) [`")}\`](https://google.com)`).replace(`{yvalue}`, `${addco}${value}`)
copiedEmbed.content = `[\`${yourcontent.join("`](https://google.com) [`")}\`](https://google.com)`
copiedEmbed.value = `${addco}${value}`
}
ori = message.channel.send({ content: normalcontent, embeds: [normalembed] })
normalembed.fields[0].value = normalembed.fields[0].value.replace(copiedEmbed.value, `{yvalue}`)
}
startAt++
} else if (["e", "en", "end"].includes(theanswer)) {
responsenow = "cancel"
} else if (["s", "st", "sta", "stan", "stand"].includes(theanswer)) {
responsenow = "s"
} else if (["dd", "double-down", "double down", "d"].includes(theanswer)) {
responsenow = "dd"
} else if (["sp", "spl", "spli", "split"].includes(theanswer)) {
responsenow = "split"
}
}
}
)
}
while (responsenow == "dd") {
doubledtrue = true
let dealCard = NEWDECKS[startAt - 1]
yourdeck.push(dealCard)
if (dealCard.rank == "A") {
if (yourrank.includes("A")) {
dealCard.value = 1
} else {
dealCard.value = 11
}
}
yourcontent.push(`${dealCard.emoji} ${dealCard.rank}`)
yourrank.push(dealCard.rank)
youremoji.push(dealCard.emoji)
value = value + dealCard.value
responsenow = "s"
}
while (responsenow == "split") {
let deletedi = yourdeck.pop()
value = value - deletedi.value
yourrank.pop()
youremoji.pop()
yourcontent.pop()
if (options.normalEmbed == true) {
normalembed.fields[0].value = `Cards: [\`${yourcontent.join("`](https://google.com) [`")}\`](https://google.com)\nTotal: \`${addco}${value}\``
} else {
normalembed.fields[0].value = normalembed.fields[0].value.replace(copiedEmbed.content, `[\`${yourcontent.join("`](https://google.com) [`")}\`](https://google.com)`).replace(`{yvalue}`, `${addco}${value}`)
copiedEmbed.content = `[\`${yourcontent.join("`](https://google.com) [`")}\`](https://google.com)`
copiedEmbed.value = `${addco}${value}`
}
ori = message.channel.send({ content: normalcontent, embeds: [normalembed] })
normalembed.fields[0].value = normalembed.fields[0].value.replace(copiedEmbed.value, `{yvalue}`)
responsenow = "h"
}
while (responsenow == "h") {
await message.channel.awaitMessages({
filter1,
max: 1,
time: 30000
}).then(async allresponses => {
if (!allresponses.size) {
responsenow = "timeout"
} else {
let theanswer = String(allresponses.first()).toLowerCase()
if (["h", "hi", "hit"].includes(theanswer)) {
let dealCard = NEWDECKS[startAt - 1]
yourdeck.push(dealCard)
if (dealCard.rank == "A") {
if (yourrank.includes("A")) {
dealCard.value = 1
} else {
dealCard.value = 11
addco = "Soft "
}
}
value = value + dealCard.value
yourcontent.push(`${dealCard.emoji} ${dealCard.rank}`)
yourrank.push(dealCard.rank)
youremoji.push(dealCard.emoji)
let endtrue = false
if (value >= 21) {
if (addco == "Soft ") {
addco = ""
for (let usu = 0; usu < yourdeck.length; usu++) {
if (yourdeck[usu].rank == "A") {
yourdeck[usu].value = 1
value = value - 10
}
}
} else {
if (dealCard.rank != "A") {
endtrue = true
responsenow = "s"
} else {
addco = "Soft "
}
}
}
if (endtrue == false) {
if (value >= 21) {
responsenow = "s"
} else {
responsenow = "h"
}
}
if (responsenow != "s") {
if (options.normalEmbed == true) {
normalembed.fields[0].value = `Cards: [\`${yourcontent.join("`](https://google.com) [`")}\`](https://google.com)\nTotal: \`${addco}${value}\``
} else {
normalembed.fields[0].value = normalembed.fields[0].value.replace(copiedEmbed.content, `[\`${yourcontent.join("`](https://google.com) [`")}\`](https://google.com)`).replace(`{yvalue}`, `${addco}${value}`)
copiedEmbed.content = `[\`${yourcontent.join("`](https://google.com) [`")}\`](https://google.com)`
copiedEmbed.value = `${addco}${value}`
}
ori = message.channel.send({ content: normalcontent, embeds: [normalembed] })
normalembed.fields[0].value = normalembed.fields[0].value.replace(copiedEmbed.value, `{yvalue}`)
}
startAt++
} else if (["e", "end", "en"].includes(theanswer)) {
responsenow = "cancel"
} else {
responsenow = "s"
}
}
})
}
while (responsenow == "s") {
games.delete(message.author.id)
while (dvalue < 17) {
let newcard = dealerdeck.push(NEWDECKS[startAt - 1])
dealercontent.push(`${NEWDECKS[startAt - 1].emoji} ${NEWDECKS[startAt - 1].rank}`)
dealerrank.push(NEWDECKS[startAt - 1].rank)
dealeremoji.push(NEWDECKS[startAt - 1].emoji)
if (newcard.rank == "A") {
if (dealerrank.includes("A")) {
NEWDECKS[startAt - 1].value = 1
} else {
NEWDECKS[startAt - 1].value = 11
}
}
dvalue = dvalue + NEWDECKS[startAt - 1].value
if (dvalue > 21 && dealerrank.includes("A")) {
let unu = 0
dealerdeck.forEach(e => {
if (e.rank == "A") {
dealerdeck[unu].value = 1
}
unu++
})
}
startAt++
}
responsenow = "INVALID"
if (value > 21 || (dvalue <= 21 && value < dvalue)) {
if (value > 21) {
method = "Busted"
} else if (dvalue == 21) {
method = "Dealer reached 21"
} else {
method = "Dealer had more"
}
loseembed.fields[0].value = `Cards: [\`${yourcontent.join("`](https://google.com) [`")}\`](https://google.com)\nTotal: \`${addco}${value}\``
loseembed.fields[1].value = `Cards: [\`${dealercontent.join("`](https://google.com) [`")}\`](https://google.com)\nTotal: \`${dvalue}\``
if (options.resultEmbed == true) {
message.channel.send({ embeds: [loseembed] })
}
RESULTS = "Lose"
if (doubledtrue == true) {
RESULTS = "Double Lose"
}
} else if (value == 21 || value > dvalue || dvalue > 21) {
if (value == 21) {
method = "Blackjack"
} else if (dvalue > 21) {
method = "Dealer Bust"
} else {
method = "Player had more"
}
winembed.fields[0].value = `Cards: [\`${yourcontent.join("`](https://google.com) [`")}\`](https://google.com)\nTotal: \`${addco}${value}\``
winembed.fields[1].value = `Cards: [\`${dealercontent.join("`](https://google.com) [`")}\`](https://google.com)\nTotal: \`${dvalue}\``
if (options.resultEmbed == true) {
message.channel.send({ embeds: [winembed] })
}
RESULTS = "Win"
if (doubledtrue == true) {
RESULTS = "Double Win"
}
} else if (value == dvalue) {
method = "Tie"
tieembed.fields[0].value = `Cards: [\`${yourcontent.join("`](https://google.com) [`")}\`](https://google.com)\nTotal: \`${addco}${value}\``
tieembed.fields[1].value = `Cards: [\`${dealercontent.join("`](https://google.com) [`")}\`](https://google.com)\nTotal: \`${dvalue}\``
if (options.resultEmbed == true) {
message.channel.send({ embeds: [tieembed] })
}
RESULTS = "Tie"
} else {
let errEmbed = new Discord.MessageEmbed()
.setAuthor(usertag, avatar)
.setTitle("An Error Occured")
.setDescription("Uh oh! An error occured! Please join our server by clicking [here](https://discord.gg/DcC4xFfTnB)")
.setFooter("Oops")
.setColor("#FF0000")
if (options.resultEmbed == true) {
message.channel.send({ embed: errEmbed })
}
RESULTS = "ERROR"
}
}
while (responsenow == "cancel") {
games.delete(message.author.id)
if (options.resultEmbed == true) {
message.channel.send({ embeds: [cancelembed] })
}
responsenow = "INVALID"
RESULTS = "Cancel"
}
while (responsenow == "timeout") {
games.delete(message.author.id)
if (options.resultEmbed == true) {
message.channel.send({ embeds: [noResEmbed] })
}
RESULTS = "Timeout"
responsenow = "INVALID"
}
let FINALRESULTS = {
result: RESULTS,
method: method,
yvalue: `${addco}${value}`,
dvalue: dvalue,
ycontent: `[\`${yourcontent.join("`](https://google.com) [`")}\`](https://google.com)`,
dcontent: `[\`${dealercontent.join("`](https://google.com) [`")}\`](https://google.com)`,
yrank: yourrank,
yemoji: youremoji,
drank: dealerrank,
demoji: dealeremoji
}
return FINALRESULTS
} catch (e) {
console.log(`${e.message}`)
}
}