302 lines
9.0 KiB
Python
Executable File
302 lines
9.0 KiB
Python
Executable File
import discord
|
|
from random import shuffle, choice
|
|
from discord.ext import commands
|
|
import utils.sql_commands as mydb
|
|
|
|
|
|
lottery_list = ["🎁", "🎮", "🎷", "🔫", "📸", "🎃", "🏅"]
|
|
|
|
lottery_win = {
|
|
"🎁": 2,
|
|
"🎁🎁": 5,
|
|
"🎁🎁🎁": 500,
|
|
"🔫🔫🔫": 25,
|
|
"📸📸📸": 50,
|
|
"🎃🎃🎃": 75,
|
|
"🏅🏅🏅": 100,
|
|
"🎮🎮🎮": 250,
|
|
"🎷🎷🎷": 1000,
|
|
}
|
|
|
|
bj_values = {
|
|
"2♦️": 2,
|
|
"2♥️": 2,
|
|
"2♣️": 2,
|
|
"2♠️": 2,
|
|
"3♦️": 3,
|
|
"3♥️": 3,
|
|
"3♣️": 3,
|
|
"3♠️": 3,
|
|
"4♦️": 4,
|
|
"4♥️": 4,
|
|
"4♣️": 4,
|
|
"4♠️": 4,
|
|
"5♦️": 5,
|
|
"5♥️": 5,
|
|
"5♣️": 5,
|
|
"5♠️": 5,
|
|
"6♦️": 6,
|
|
"6♥️": 6,
|
|
"6♣️": 6,
|
|
"6♠️": 6,
|
|
"7♦️": 7,
|
|
"7♥️": 7,
|
|
"7♣️": 7,
|
|
"7♠️": 7,
|
|
"8♦️": 8,
|
|
"8♥️": 8,
|
|
"8♣️": 8,
|
|
"8♠️": 8,
|
|
"9♦️": 9,
|
|
"9♥️": 9,
|
|
"9♣️": 9,
|
|
"9♠️": 9,
|
|
"10♦️": 10,
|
|
"10♥️": 10,
|
|
"10♣️": 10,
|
|
"10♠️": 10,
|
|
"J♦️": 10,
|
|
"J♥️": 10,
|
|
"J♣️": 10,
|
|
"J♠️": 10,
|
|
"Q♦️": 10,
|
|
"Q♥️": 10,
|
|
"Q♣️": 10,
|
|
"Q♠️": 10,
|
|
"K♦️": 10,
|
|
"K♥️": 10,
|
|
"K♣️": 10,
|
|
"K♠️": 10,
|
|
"A♦️": 11,
|
|
"A♥️": 11,
|
|
"A♣️": 11,
|
|
"A♠️": 11,
|
|
}
|
|
|
|
|
|
class Deck:
|
|
def __init__(self):
|
|
self.deck = list(bj_values.keys())
|
|
shuffle(self.deck)
|
|
|
|
async def deal(self):
|
|
return self.deck.pop()
|
|
|
|
|
|
class Hand:
|
|
def __init__(self, name, bet):
|
|
self.cards = []
|
|
self.value = 0
|
|
self.aces = 0
|
|
self.bust = False
|
|
self.name = name
|
|
self.bet = bet
|
|
|
|
async def win_bet(self):
|
|
pass
|
|
|
|
async def lose_bet(self):
|
|
pass
|
|
|
|
async def add_card(self, card):
|
|
self.cards.append(card)
|
|
self.aces = ("".join(self.cards)).count("A")
|
|
value = 0
|
|
for card in self.cards:
|
|
value += bj_values[card]
|
|
self.value = value
|
|
while self.value > 21 and self.aces:
|
|
self.value -= 10
|
|
self.aces -= 1
|
|
|
|
|
|
async def hit(deck, hand):
|
|
await hand.add_card(await deck.deal())
|
|
|
|
|
|
async def double(deck, hand):
|
|
pass
|
|
|
|
|
|
async def split(deck, hands):
|
|
pass
|
|
|
|
|
|
async def payout(ctx, play, amount, multiplier):
|
|
await ctx.reply(
|
|
f"{play}\nBet: {amount:,}\nYou won {amount * multiplier:,} Flooneys"
|
|
)
|
|
|
|
|
|
async def check_winner(msg: discord.Interaction, player_hand, dealer_hand):
|
|
p_value, d_value = player_hand.value, dealer_hand.value
|
|
embed = discord.Embed(description="Blackjack")
|
|
embed.add_field(name="Bet: ", value="amount", inline=True)
|
|
embed.add_field(
|
|
name=player_hand.name,
|
|
value=f"{', '.join(player_hand.cards)}: {player_hand.value}",
|
|
inline=False,
|
|
)
|
|
embed.add_field(
|
|
name=dealer_hand.name,
|
|
value=f"{', '.join(dealer_hand.cards)}: {dealer_hand.value}",
|
|
inline=False,
|
|
)
|
|
|
|
if (p_value > d_value and not player_hand.bust) or dealer_hand.bust:
|
|
embed.add_field(name="Winner:", value=f"{player_hand.name}", inline=False)
|
|
player_balance = int(mydb.select("WALLET", "economy", True, "ID", player_hand.name.id).get("WALLET", None))
|
|
mydb.add("economy", "ID", "WALLET", player_hand.name.id, player_balance + player_hand.bet*2, True)
|
|
elif p_value < d_value and dealer_hand.bust:
|
|
embed.add_field(name="Winner:", value=f"{dealer_hand.name}", inline=False)
|
|
else:
|
|
embed.add_field(name="Winner:", value=f"Draw", inline=False)
|
|
await msg.edit_original_response(embed=embed)
|
|
|
|
|
|
async def dealer(msg: discord.Interaction, player_hand, dealer_hand, cards):
|
|
while dealer_hand.value < 17 and not player_hand.bust and not dealer_hand.bust:
|
|
await hit(cards, dealer_hand)
|
|
if dealer_hand.value > 21:
|
|
dealer_hand.bust = True
|
|
embed = discord.Embed(description="Blackjack")
|
|
embed.add_field(name="Bet: ", value="amount", inline=True)
|
|
embed.add_field(
|
|
name=player_hand.name,
|
|
value=f"{', '.join(player_hand.cards)}: {player_hand.value}",
|
|
inline=False,
|
|
)
|
|
embed.add_field(
|
|
name=dealer_hand.name,
|
|
value=f"{', '.join(dealer_hand.cards)}: {dealer_hand.value}",
|
|
inline=False,
|
|
)
|
|
await msg.edit_original_response(embed=embed)
|
|
await check_winner(msg, player_hand, dealer_hand)
|
|
|
|
|
|
class MyView(discord.ui.View):
|
|
def __init__(self, player_hand, dealer_hand, cards):
|
|
super().__init__()
|
|
self.player_hand = player_hand
|
|
self.dealer_hand = dealer_hand
|
|
self.cards = cards
|
|
|
|
@discord.ui.button(label="Hit", style=discord.ButtonStyle.primary, emoji="✅")
|
|
async def hit(self, interaction: discord.Interaction, button: discord.ui.Button):
|
|
await hit(self.cards, self.player_hand)
|
|
embed = discord.Embed(description="Blackjack")
|
|
embed.add_field(name="Bet: ", value="amount", inline=True)
|
|
embed.add_field(
|
|
name=self.player_hand.name,
|
|
value=f"{', '.join(self.player_hand.cards)}: {self.player_hand.value}",
|
|
inline=False,
|
|
)
|
|
embed.add_field(
|
|
name=self.dealer_hand.name,
|
|
value=f"{(self.dealer_hand.cards)[0]}",
|
|
inline=False,
|
|
)
|
|
msg = interaction
|
|
if self.player_hand.value < 21:
|
|
await msg.response.edit_message(embed=embed)
|
|
else:
|
|
await msg.response.edit_message(embed=embed, view=None)
|
|
if self.player_hand.value > 21:
|
|
self.player_hand.bust = True
|
|
await dealer(msg, self.player_hand, self.dealer_hand, self.cards)
|
|
|
|
@discord.ui.button(label="Stand", style=discord.ButtonStyle.secondary, emoji="🛑")
|
|
async def stand(self, interaction: discord.Interaction, button: discord.ui.Button):
|
|
embed = discord.Embed(description="Blackjack")
|
|
embed.add_field(name="Bet: ", value=self.player_hand.bet, inline=True)
|
|
embed.add_field(
|
|
name=self.player_hand.name,
|
|
value=f"{', '.join(self.player_hand.cards)}: {self.player_hand.value}",
|
|
inline=False,
|
|
)
|
|
embed.add_field(
|
|
name=self.dealer_hand.name,
|
|
value=f"{(self.dealer_hand.cards)[0]}",
|
|
inline=False,
|
|
)
|
|
msg = interaction
|
|
await msg.response.edit_message(embed=embed, view=None)
|
|
await dealer(msg, self.player_hand, self.dealer_hand, self.cards)
|
|
|
|
|
|
class Gamble(commands.Cog):
|
|
def __init__(self, client):
|
|
self.client = client
|
|
|
|
@commands.command()
|
|
async def blackjack(self, ctx, bet):
|
|
amount = int(bet)
|
|
|
|
cards = Deck()
|
|
player_balance = int(mydb.select("WALLET", "economy", True, "ID", ctx.author.id).get(
|
|
"WALLET", None
|
|
)
|
|
)
|
|
if player_balance < bet or bet < 0:
|
|
await ctx.reply("You have insufficient funds.")
|
|
return
|
|
mydb.add("economy", "ID", "WALLET", ctx.author.id, player_balance - bet, True)
|
|
player_hand, dealer_hand = Hand(ctx.author, amount), Hand("Dealer", None)
|
|
|
|
# setup
|
|
for _ in range(2):
|
|
await player_hand.add_card(await cards.deal())
|
|
await dealer_hand.add_card(await cards.deal())
|
|
|
|
embed = discord.Embed(description="Blackjack")
|
|
embed.add_field(name="Bet: ", value=amount, inline=True)
|
|
embed.add_field(
|
|
name=ctx.author,
|
|
value=f"{', '.join(player_hand.cards)}: {player_hand.value}",
|
|
inline=False,
|
|
)
|
|
embed.add_field(name="Dealer", value=f"{(dealer_hand.cards)[0]}", inline=False)
|
|
|
|
view = MyView(player_hand, dealer_hand, cards)
|
|
await ctx.send(embed=embed, view=view)
|
|
|
|
@commands.command()
|
|
async def show_buttons(self, ctx):
|
|
await ctx.reply(
|
|
"This is a button!", view=MyView(None, None, None)
|
|
) # Send a message with our View class that contains the button
|
|
|
|
|
|
@commands.cooldown(1, 1, commands.BucketType.user)
|
|
@commands.command(name="lottery", aliases=["slots"])
|
|
async def lottery(self, ctx, bet: int):
|
|
player_balance = int(
|
|
mydb.select("WALLET", "economy", True, "ID", ctx.author.id).get(
|
|
"WALLET", None
|
|
)
|
|
)
|
|
if player_balance < bet or bet < 0:
|
|
await ctx.reply("You have insufficient funds.")
|
|
return
|
|
play = "".join([choice(lottery_list) for _ in range(3)])
|
|
|
|
if play in lottery_win:
|
|
mult = lottery_win[play]
|
|
await payout(ctx, play, bet, mult)
|
|
|
|
elif play.count("🎁") == 2:
|
|
mult = lottery_win["🎁🎁"]
|
|
await payout(ctx, play, bet, mult)
|
|
|
|
elif play.count("🎁") == 1:
|
|
mult = lottery_win["🎁"]
|
|
await payout(ctx, play, bet, mult)
|
|
|
|
else:
|
|
mydb.add("economy", "ID", "WALLET", ctx.author.id, player_balance - bet, True)
|
|
await ctx.reply(f"{play}\nYou lost {int(bet):,} Flooneys")
|
|
|
|
|
|
async def setup(client):
|
|
await client.add_cog(Gamble(client)) |