from discord.ext.commands import Bot, Cog from discord_slash import cog_ext, SlashContext from discord import Embed from discord_slash.utils.manage_commands import create_option, create_choice from base import config from models.user import User import random import yaml class BasicGames(Cog): def __init__(self, bot: Bot): self.bot = bot with open("config.yaml", "r") as yamlfile: config = yaml.load(yamlfile, Loader=yaml.CLoader) print("Read config successful") self.config = config @cog_ext.cog_slash( name="coin_flip", description="Flip a coin", guild_ids=[config["discord_server_id"]], options=[ create_option( name="num_coins", description="coins to bet", option_type=4, required=True, ), create_option( name="choice", description="heads or tails?", option_type=3, required=True, choices=[ create_choice(name="Heads", value="Heads"), create_choice(name="Tails", value="Tails"), ], ), ], ) async def coin_flip(self, ctx: SlashContext, num_coins: int, choice: int): user = User.get(User.discord_id == ctx.author_id) await ctx.send( content=f"{user.username} is betting {num_coins} {config['currency']} on {choice}" ) result = random.randint(0, 200) if result <= 110: if choice == "Heads": await ctx.send(content="Coin flip lands on Tails") else: await ctx.send(content="Coin flip lands on Heads") embed = Embed(description=f"{ctx.author.mention} loses!", colour=0xFF0000) embed.add_field(name="Lost:", value=f"{num_coins} {config['currency']}") user.remove_coins(num_coins) elif result > 110 and result < 199: if choice == "Heads": await ctx.send(content="Coin flip lands on Heads") else: await ctx.send(content="Coin flip lands on Tails") embed = Embed(description=f"{ctx.author.mention} wins!", colour=0x00FF00) embed.add_field(name="Prize:", value=f"{num_coins} {config['currency']}") user.add_coins(num_coins) elif result >= 199: winnings = num_coins * 2 embed = Embed( description=f"The coin lands on it's side!{ctx.author.mention} wins double!", colour=0x00FF00, ) embed.add_field(name="Prize:", value=f"{winnings} {config['currency']}") user.add_coins(winnings) await ctx.send(embed=embed) user.save() @cog_ext.cog_slash( name="dice", description="Roll some dice.", guild_ids=[config["discord_server_id"]], options=[ create_option( name="num_coins", description="coins to bet", option_type=4, required=True, ), ], ) async def dice(self, ctx: SlashContext, num_coins: int): user = User.get(User.discord_id == ctx.author_id) if user.currency < num_coins: await ctx.send( content=f"{user.display_name}, you don't have enough {config['currency']} for that bet" ) return False results = [ random.randint(1, 6), random.randint(1, 6), random.randint(1, 6), random.randint(1, 6), ] await ctx.send(content=f"{user.display_name}, you roll a {results[0]} and a {results[1]}") user_total = results[0] + results[1] bot_total = results[2] + results[3] if user_total == 12: winnings = num_coins * 3 embed = Embed( description=f"{ctx.author.mention} rolls a double 6!!! You win!", colour=0x00FF00 ) embed.add_field(name="Prize:", value=f"{winnings} {config['currency']}") user.add_coins(winnings) elif results[0] == results[1]: winnings = num_coins * 2 embed = Embed( description=f"{ctx.author.mention} rolls a double!! You win!", colour=0x00FF00 ) embed.add_field(name="Prize:", value=f"{winnings} {config['currency']}") user.add_coins(winnings) else: await ctx.channel.send( content=f"{user.display_name}, I rolled a {results[2]} and a {results[3]}" ) if user_total > bot_total: embed = Embed(description=f"{ctx.author.mention} wins!", colour=0x00FF00) embed.add_field(name="Prize:", value=f"{num_coins} {config['currency']}") user.add_coins(num_coins) elif user_total == bot_total: embed = Embed( description=f"{ctx.author.mention}, it's a draw. Have your money back...", colour=0xFFFF00, ) else: embed = Embed( description=f"{ctx.author.mention} loses the dice roll :(", colour=0xFF0000, ) embed.add_field(name="Lost:", value=f"{num_coins} {config['currency']}") user.remove_coins(num_coins) await ctx.channel.send(embed=embed) user.save() @cog_ext.cog_slash( name="slots", description="Pull the slot machine.", guild_ids=[config["discord_server_id"]], ) async def slots(self, ctx: SlashContext): user = User.get(User.discord_id == ctx.author_id) cost = 10 if user.currency < cost: await ctx.send( content=f"{user.display_name}, you don't have enough {config['currency']}, it costs 100 {config['currency']} to play" ) return False await ctx.send( content=f"{user.display_name}, you put {cost} {config['currency']} in the machine and pull the handle..." ) user.remove_coins(cost) slots = config["slots"] e = [] for slot in slots: for i in range(slot["rarity"]): e.append(slot) total = len(e) - 1 results = [ e[random.randint(0, total)], e[random.randint(0, total)], e[random.randint(0, total)], ] results_top = [ e[random.randint(0, total)], e[random.randint(0, total)], e[random.randint(0, total)], ] results_bottom = [ e[random.randint(0, total)], e[random.randint(0, total)], e[random.randint(0, total)], ] result_text = "" # e = list(config["slots"].values()) winnings = 0 for r in results_top: result_text += r["dark"] result_text += "\n" for r in results: result_text += r["emoji"] result_text += "\n" for r in results_bottom: result_text += r["dark"] result_text += "\n" double = False triple = False if results[0]["name"] == results[1]["name"] and results[0]["name"] == results[2]["name"]: triple = True winnings += results[0]["reward_triple"] elif results[0]["name"] == results[1]["name"] or results[0]["name"] == results[2]["name"]: double = True winnings += results[0]["reward_double"] elif results[1]["name"] == results[2]["name"]: double = True winnings += results[1]["reward_double"] else: for r in results: winnings += r["reward_single"] await ctx.channel.send(content=result_text) if winnings == 0: embed = Embed(description=f"No match :( {ctx.author.mention} loses...", colour=0xFF0000) embed.add_field(name="Lost:", value=f"{cost} {config['currency']}") else: if triple: embed = Embed( description=f"JACKPOT! {ctx.author.mention} wins with a triple!!!", colour=0x00FF00, ) elif double: embed = Embed( description=f"Ding ding! {ctx.author.mention} wins with a double!!", colour=0x00FF00, ) else: embed = Embed(description=f"{ctx.author.mention} wins!", colour=0x00FF00) embed.add_field(name="Prize:", value=f"{winnings} {config['currency']}") user.add_coins(winnings) await ctx.channel.send(embed=embed) user.save() def setup(bot): bot.add_cog(BasicGames(bot)) print("Loaded BasicGames") print(config["discord_server_id"])