from discord.ext import commands import discord import random from typing import Optional from query.channel import get_games from query.user import is_ignored, get_level, get_xp, level_up, get_ability_points_spent, increment_all_coin, get_coin from local_settings import COMMAND_PREFIX def setup(bot: commands.Bot): bot.add_cog(Games(bot)) class Games(commands.Cog): """Gaming commands.""" def __init__(self, bot: commands.Bot): self.bot = bot @commands.command( description="Check the level for a player.", brief="Get player level", help="View game level of player." ) async def level(self, ctx: commands.Context, user: Optional[discord.User]): # Ignore user if on the ignore list. if await is_ignored(self.bot.pg, ctx.author.id): return # Warn if games are off. if not await get_games(self.bot.pg, ctx.channel.id): ctx.author.send(f"Games are disabled in {ctx.channel}, ask an admin to enable them.") return if not user: user = ctx.author level = await get_level(self.bot.pg, user.id) if level == 0: if ctx.author == user: await ctx.send(f"You are not playing, join the game with `{COMMAND_PREFIX}levelup`") else: await ctx.send(f"`{user}` is not playing.") else: xp_spent, total_xp = await get_xp(self.bot.pg, user.id) ability_points_spent = await get_ability_points_spent(self.bot.pg, user.id) coin = await get_coin(self.bot.pg, user.id) if ctx.author == user: await ctx.send(f"You rank at level {level}. (exp {xp_spent}/{total_xp} | abp {ability_points_spent}/{level * 3} | coin {coin})") else: await ctx.send(f"`{user}` ranks at level **{level}**. (**{xp_spent}**/{total_xp} | abp {ability_points_spent}/{level * 3}) | coin {coin}") @commands.command( description="Check the experience points for a player.", brief="Get player xp", help="View amount of XP a game player has." ) async def xp(self, ctx: commands.Context, user: Optional[discord.User]): # Ignore user if on the ignore list. if await is_ignored(self.bot.pg, ctx.author.id): return # Warn if games are off. if not await get_games(self.bot.pg, ctx.channel.id): ctx.author.send(f"Games are disabled in {ctx.channel}, ask an admin to enable them.") return if not user: xp_spent, total_xp = await get_xp(self.bot.pg, ctx.author.id) level = await get_level(self.bot.pg, ctx.author.id) threshold = (level + 1) * 50 + xp_spent if threshold < total_xp - xp_spent: await ctx.send(f"You have spent {xp_spent} experience points of your {total_xp} total and can gain 3 ability points for {threshold} xp.") else: await ctx.send(f"You have spent {xp_spent} experience points of your {total_xp} total and require {threshold - (total_xp - xp_spent)} xp to `{COMMAND_PREFIX}levelup`.") else: xp_spent, total_xp = await get_xp(self.bot.pg, user.id) level = await get_level(self.bot.pg, user.id) threshold = (level + 1) * 50 + xp_spent if threshold < total_xp - xp_spent: await ctx.send(f"`{user}` has spent {xp_spent} of {total_xp} experience points and can level up for {threshold} xp.") else: await ctx.send(f"`{user}` has spent {xp_spent} of {total_xp} experience points and requires {threshold - (total_xp - xp_spent)} xp to level up.") @commands.command( description="Attempt to gain a level.", brief="Level up", help="Try to rank up a level in the game by spending XP." ) async def levelup(self, ctx: commands.Context): # Ignore user if on the ignore list. if await is_ignored(self.bot.pg, ctx.author.id): return # Warn if games are off. if not await get_games(self.bot.pg, ctx.channel.id): ctx.author.send(f"Games are disabled in {ctx.channel}, ask an admin to enable them.") return xp_spent, total_xp = await get_xp(self.bot.pg, ctx.author.id) xp_available = total_xp - xp_spent level = await get_level(self.bot.pg, ctx.author.id) threshold = (level + 1) * 50 + xp_spent if xp_available < threshold: await ctx.send(f"Not yet, you require {threshold - xp_available} more XP to level up.") else: await level_up(self.bot.pg, ctx.author.id, threshold) await ctx.send(f"You have gained three ability points climbed the ranks for {threshold} XP, leaving you {xp_available - threshold} remaining.") await increment_all_coin(self.bot.pg) @commands.command( description="Simulate dice rolls.", brief="Roll dice", help="Roll two dice." ) async def dice(self, ctx: commands.Context, amount: Optional[int], sides: Optional[int]): # Ignore user if on the ignore list. if await is_ignored(self.bot.pg, ctx.author.id): return # Warn if games are off. if not await get_games(self.bot.pg, ctx.channel.id): await ctx.author.send(f"Games are disabled in {ctx.channel}, ask an admin to enable them.") return if not amount: amount = 2 if not sides: sides = 6 if amount < 1: await ctx.send("You want me to roll less than one die? How!?") elif amount > 25: await ctx.send("I can not hold so many dice at one time.") elif sides < 2: await ctx.send("A die has physical minimum of 2 sides. Don't ask for impossible objects.") elif sides > 256: await ctx.send("My tiny hands can not handle such large dice. Even if both are virtual.") else: embed = discord.Embed(title = "Dice roll", description=f"Rolling {amount} dice, with {sides} sides.") while amount > 0: embed.insert_field_at(0, name=f"Die {amount}", value=random.randint(1, sides), inline=True) amount -= 1 await ctx.send(embed=embed) @commands.command( description="Ask the magic 8-ball.", brief="Pose question", help="Simulate the iconic 8-ball gimmic.", name="8ball" ) async def eightball(self, ctx: commands.Context, *, question: str = None): # Ignore user if on the ignore list. if await is_ignored(self.bot.pg, ctx.author.id): return if not await get_games(self.bot.pg, ctx.channel.id): ctx.author.send(f"Games are disabled in {ctx.channel}, ask an admin to enable them.") return if not question: messages = [ "Don't forget to ask a question...", "Hey, that's not a question!", "What would you like to know?", "You want me to predict nothing?", "Are you intentionally not asking a question?", "Ask a question you tease!", "You will die alone.", ] elif question.strip().count(" ") == 0: messages = [ "What?", "That is not a question", "Can you use more than one word?", "What is the question?", "Sorry?" ] elif question.strip()[-1] != "?": messages = [ "Did you forget to end with a question mark?", "Is that a statement or question?", "Don't questions usually end with a question mark?", "Don't forget to use punctuation." ] else: messages = [ "Yes.", "No.", "Affirmative.", "No way!", "Negative.", "Positive.", "Correct.", "Incorrect.", "Likely", "Unlikely", "Maybe.", "Definately!", "Perhaps?", "Most indubitably.", "Does the pope shit in the woods?", "When hell freezes over.", "Only between 9 and 5.", "Only just before you die.", "ERROR: Probability failure.", "Ask again later.", "I don't know.", "Unpredictable.", "Unknown", ] await ctx.send(random.choice(messages))