diff options
Diffstat (limited to 'bot/exts/fun/snakes')
| -rw-r--r-- | bot/exts/fun/snakes/_snakes_cog.py | 107 | ||||
| -rw-r--r-- | bot/exts/fun/snakes/_utils.py | 44 |
2 files changed, 72 insertions, 79 deletions
diff --git a/bot/exts/fun/snakes/_snakes_cog.py b/bot/exts/fun/snakes/_snakes_cog.py index 892a3dd2..eca462c6 100644 --- a/bot/exts/fun/snakes/_snakes_cog.py +++ b/bot/exts/fun/snakes/_snakes_cog.py @@ -9,7 +9,7 @@ import textwrap import urllib from functools import partial from io import BytesIO -from typing import Any, Optional +from typing import Any import async_timeout from PIL import Image, ImageDraw, ImageFont @@ -274,7 +274,7 @@ class Snakes(Cog): return message - async def _fetch(self, url: str, params: Optional[dict] = None) -> dict: + async def _fetch(self, url: str, params: dict | None = None) -> dict: """Asynchronous web request helper method.""" if params is None: params = {} @@ -518,52 +518,51 @@ class Snakes(Cog): log.debug("Antidote timed out waiting for a reaction") break # We're done, no reactions for the last 5 minutes - if antidote_tries < 10: - if antidote_guess_count < 4: - if reaction.emoji in ANTIDOTE_EMOJI: - antidote_guess_list.append(reaction.emoji) - antidote_guess_count += 1 - - if antidote_guess_count == 4: # Guesses complete - antidote_guess_count = 0 - page_guess_list[antidote_tries] = " ".join(antidote_guess_list) - - # Now check guess - for i in range(0, len(antidote_answer)): - if antidote_guess_list[i] == antidote_answer[i]: - guess_result.append(TICK_EMOJI) - elif antidote_guess_list[i] in antidote_answer: - guess_result.append(BLANK_EMOJI) - else: - guess_result.append(CROSS_EMOJI) - guess_result.sort() - page_result_list[antidote_tries] = " ".join(guess_result) - - # Rebuild the board - board = [] - for i in range(0, 10): - board.append(f"`{i+1:02d}` " - f"{page_guess_list[i]} - " - f"{page_result_list[i]}") - board.append(EMPTY_UNICODE) - - # Remove Reactions - for emoji in antidote_guess_list: - await board_id.remove_reaction(emoji, user) - - if antidote_guess_list == antidote_answer: - win = True - - antidote_tries += 1 - guess_result = [] - antidote_guess_list = [] - - antidote_embed.clear_fields() - antidote_embed.add_field(name=f"{10 - antidote_tries} " - f"guesses remaining", - value="\n".join(board)) - # Redisplay the board - await board_id.edit(embed=antidote_embed) + if antidote_tries < 10 and antidote_guess_count < 4: + if reaction.emoji in ANTIDOTE_EMOJI: + antidote_guess_list.append(reaction.emoji) + antidote_guess_count += 1 + + if antidote_guess_count == 4: # Guesses complete + antidote_guess_count = 0 + page_guess_list[antidote_tries] = " ".join(antidote_guess_list) + + # Now check guess + for i in range(0, len(antidote_answer)): + if antidote_guess_list[i] == antidote_answer[i]: + guess_result.append(TICK_EMOJI) + elif antidote_guess_list[i] in antidote_answer: + guess_result.append(BLANK_EMOJI) + else: + guess_result.append(CROSS_EMOJI) + guess_result.sort() + page_result_list[antidote_tries] = " ".join(guess_result) + + # Rebuild the board + board = [] + for i in range(0, 10): + board.append(f"`{i+1:02d}` " + f"{page_guess_list[i]} - " + f"{page_result_list[i]}") + board.append(EMPTY_UNICODE) + + # Remove Reactions + for emoji in antidote_guess_list: + await board_id.remove_reaction(emoji, user) + + if antidote_guess_list == antidote_answer: + win = True + + antidote_tries += 1 + guess_result = [] + antidote_guess_list = [] + + antidote_embed.clear_fields() + antidote_embed.add_field(name=f"{10 - antidote_tries} " + f"guesses remaining", + value="\n".join(board)) + # Redisplay the board + await board_id.edit(embed=antidote_embed) # Winning / Ending Screen if win is True: @@ -746,10 +745,10 @@ class Snakes(Cog): await message.delete() # Build and send the embed. - my_snake_embed = Embed(description=":tada: Congrats! You hatched: **{0}**".format(snake_name)) + my_snake_embed = Embed(description=f":tada: Congrats! You hatched: **{snake_name}**") my_snake_embed.set_thumbnail(url=snake_image) my_snake_embed.set_footer( - text=" Owner: {0}#{1}".format(ctx.author.name, ctx.author.discriminator) + text=f" Owner: {ctx.author.name}#{ctx.author.discriminator}" ) await ctx.send(embed=my_snake_embed) @@ -832,7 +831,7 @@ class Snakes(Cog): # Prepare a question. question = random.choice(self.snake_quizzes) answer = question["answerkey"] - options = {key: question["options"][key] for key in ANSWERS_EMOJI.keys()} + options = {key: question["options"][key] for key in ANSWERS_EMOJI} # Build and send the embed. embed = Embed( @@ -879,10 +878,7 @@ class Snakes(Cog): snake_name = snake_name.split()[-1] # If no name is provided, use whoever called the command. - if name: - user_name = name - else: - user_name = ctx.author.display_name + user_name = name if name else ctx.author.display_name # Get the index of the vowel to slice the username at user_slice_index = len(user_name) @@ -1148,3 +1144,4 @@ class Snakes(Cog): embed.description = "Could not generate the snake card! Please try again." embed.title = random.choice(ERROR_REPLIES) await ctx.send(embed=embed) + # endregion diff --git a/bot/exts/fun/snakes/_utils.py b/bot/exts/fun/snakes/_utils.py index 182fa9d9..5332cde2 100644 --- a/bot/exts/fun/snakes/_utils.py +++ b/bot/exts/fun/snakes/_utils.py @@ -6,7 +6,6 @@ import math import random from itertools import product from pathlib import Path -from typing import Union from PIL import Image from PIL.ImageDraw import ImageDraw @@ -132,7 +131,7 @@ def lerp(t: float, a: float, b: float) -> float: return a + t * (b - a) -class PerlinNoiseFactory(object): +class PerlinNoiseFactory: """ Callable that produces Perlin noise for an arbitrary point in an arbitrary number of dimensions. @@ -396,7 +395,7 @@ class SnakeAndLaddersGame: Listen for reactions until players have joined, and the game has been started. """ - def startup_event_check(reaction_: Reaction, user_: Union[User, Member]) -> bool: + def startup_event_check(reaction_: Reaction, user_: User | Member) -> bool: """Make sure that this reaction is what we want to operate on.""" return ( all(( @@ -445,14 +444,12 @@ class SnakeAndLaddersGame: # Allow game author or non-playing moderation staff to cancel a waiting game await self.cancel_game() return - else: - await self.player_leave(user) - elif reaction.emoji == START_EMOJI: - if self.ctx.author == user: - self.started = True - await self.start_game(user) - await startup.delete() - break + await self.player_leave(user) + elif reaction.emoji == START_EMOJI and self.ctx.author == user: + self.started = True + await self.start_game(user) + await startup.delete() + break await startup.remove_reaction(reaction.emoji, user) @@ -461,7 +458,7 @@ class SnakeAndLaddersGame: await self.cancel_game() return # We're done, no reactions for the last 5 minutes - async def _add_player(self, user: Union[User, Member]) -> None: + async def _add_player(self, user: User | Member) -> None: """Add player to game.""" self.players.append(user) self.player_tiles[user.id] = 1 @@ -470,7 +467,7 @@ class SnakeAndLaddersGame: im = Image.open(io.BytesIO(avatar_bytes)).resize((BOARD_PLAYER_SIZE, BOARD_PLAYER_SIZE)) self.avatar_images[user.id] = im - async def player_join(self, user: Union[User, Member]) -> None: + async def player_join(self, user: User | Member) -> None: """ Handle players joining the game. @@ -496,7 +493,7 @@ class SnakeAndLaddersGame: delete_after=10 ) - async def player_leave(self, user: Union[User, Member]) -> bool: + async def player_leave(self, user: User | Member) -> bool: """ Handle players leaving the game. @@ -531,17 +528,17 @@ class SnakeAndLaddersGame: await self.channel.send("**Snakes and Ladders**: Game has been canceled.") self._destruct() - async def start_game(self, user: Union[User, Member]) -> None: + async def start_game(self, user: User | Member) -> None: """ Allow the game author to begin the game. The game cannot be started if the game is in a waiting state. """ - if not user == self.author: + if user != self.author: await self.channel.send(user.mention + " Only the author of the game can start it.", delete_after=10) return - if not self.state == "waiting": + if self.state != "waiting": await self.channel.send(user.mention + " The game cannot be started at this time.", delete_after=10) return @@ -552,7 +549,7 @@ class SnakeAndLaddersGame: async def start_round(self) -> None: """Begin the round.""" - def game_event_check(reaction_: Reaction, user_: Union[User, Member]) -> bool: + def game_event_check(reaction_: Reaction, user_: User | Member) -> bool: """Make sure that this reaction is what we want to operate on.""" return ( all(( @@ -626,8 +623,7 @@ class SnakeAndLaddersGame: # Only allow non-playing moderation staff to cancel a running game await self.cancel_game() return - else: - is_surrendered = await self.player_leave(user) + is_surrendered = await self.player_leave(user) await self.positions.remove_reaction(reaction.emoji, user) @@ -645,7 +641,7 @@ class SnakeAndLaddersGame: if not is_surrendered: await self._complete_round() - async def player_roll(self, user: Union[User, Member]) -> None: + async def player_roll(self, user: User | Member) -> None: """Handle the player's roll.""" if user.id not in self.player_tiles: await self.channel.send(user.mention + " You are not in the match.", delete_after=10) @@ -692,7 +688,7 @@ class SnakeAndLaddersGame: await self.channel.send("**Snakes and Ladders**: " + winner.mention + " has won the game! :tada:") self._destruct() - def _check_winner(self) -> Union[User, Member]: + def _check_winner(self) -> User | Member: """Return a winning member if we're in the post-round state and there's a winner.""" if self.state != "post_round": return None @@ -717,6 +713,6 @@ class SnakeAndLaddersGame: return x_level, y_level @staticmethod - def _is_moderator(user: Union[User, Member]) -> bool: + def _is_moderator(user: User | Member) -> bool: """Return True if the user is a Moderator.""" - return any(role.id in MODERATION_ROLES for role in getattr(user, 'roles', [])) + return any(role.id in MODERATION_ROLES for role in getattr(user, "roles", [])) |