aboutsummaryrefslogtreecommitdiffstats
path: root/bot/exts/fun/snakes
diff options
context:
space:
mode:
authorGravatar ChrisJL <[email protected]>2023-05-09 16:01:01 +0100
committerGravatar GitHub <[email protected]>2023-05-09 16:01:01 +0100
commitc3e23e60278d34658f801bd7d7ed721d5a272637 (patch)
treee159a0fae7850d706d713cf2b49dfed2140ce655 /bot/exts/fun/snakes
parentBump sentry-sdk from 1.21.1 to 1.22.1 (#1273) (diff)
parentMove unshared contants inside modules (diff)
Merge pull request #1270 from python-discord/migrate-to-ruff
Migrate to ruff
Diffstat (limited to 'bot/exts/fun/snakes')
-rw-r--r--bot/exts/fun/snakes/_snakes_cog.py107
-rw-r--r--bot/exts/fun/snakes/_utils.py44
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", []))