aboutsummaryrefslogtreecommitdiffstats
path: root/bot
diff options
context:
space:
mode:
Diffstat (limited to 'bot')
-rw-r--r--bot/exts/evergreen/connect_four.py58
1 files changed, 39 insertions, 19 deletions
diff --git a/bot/exts/evergreen/connect_four.py b/bot/exts/evergreen/connect_four.py
index 51d1adc3..50632c1b 100644
--- a/bot/exts/evergreen/connect_four.py
+++ b/bot/exts/evergreen/connect_four.py
@@ -82,15 +82,20 @@ class Game:
if self.message:
await self.message.edit(embed=embed)
else:
- self.message = await self.channel.send(content='Loading ....')
+ self.message = await self.channel.send(content='Loading...')
for emoji in self.unicode_numbers:
await self.message.add_reaction(emoji)
await self.message.add_reaction(CROSS_EMOJI)
await self.message.edit(content=None, embed=embed)
- async def game_over(self, winner: discord.user, loser: discord.user) -> None:
- """Removes games from list of current games and announces to public chat."""
- await self.channel.send(f"Game Over! {winner.mention} won against {loser.mention}")
+ async def game_over(self, action: str, player1: discord.user, player2: discord.user) -> None:
+ """Announces to public chat."""
+ if action == "win":
+ await self.channel.send(f"Game Over! {player1.mention} won against {player2.mention}")
+ elif action == "draw":
+ await self.channel.send(f"Game Over! {player1.mention} {player2.mention} It's A Draw :tada:")
+ elif action == "quit":
+ await self.channel.send(f"{self.player1.mention} surrendered. Game over!")
await self.print_grid()
async def start_game(self) -> None:
@@ -103,8 +108,11 @@ class Game:
if isinstance(self.player_active, AI):
coords = self.player_active.play()
if not coords:
- await self.channel.send("Game Over! It's A Draw :tada:")
- await self.print_grid()
+ await self.game_over(
+ "draw",
+ self.bot.user if isinstance(self.player_active, AI) else self.player_active,
+ self.bot.user if isinstance(self.player_inactive, AI) else self.player_inactive,
+ )
else:
coords = await self.player_turn()
@@ -113,8 +121,9 @@ class Game:
if self.check_win(coords, 1 if self.player_active == self.player1 else 2):
await self.game_over(
- self.bot.user if isinstance(self.player_active, AI) else {self.player_active},
- self.bot.user if isinstance(self.player_inactive, AI) else {self.player_inactive},
+ "win",
+ self.bot.user if isinstance(self.player_active, AI) else self.player_active,
+ self.bot.user if isinstance(self.player_inactive, AI) else self.player_inactive,
)
return
@@ -141,12 +150,11 @@ class Game:
await self.channel.send(f"{self.player_active.mention}, you took too long. Game over!")
return
else:
+ await message.delete()
if str(reaction.emoji) == CROSS_EMOJI:
- await message.delete()
- await self.channel.send(f"{self.player_active.user} surrendered. Game over!")
+ await self.game_over("quit", self.player_active, self.player_inactive)
return
- await message.delete()
await self.message.remove_reaction(reaction, user)
column_num = self.unicode_numbers.index(str(reaction.emoji))
@@ -330,6 +338,15 @@ class ConnectFour(commands.Cog):
"""Check if someone is already in a game."""
return any(player in (game.player1, game.player2) for game in self.games)
+ @staticmethod
+ def check_emojis(e1: EMOJI_CHECK, e2: EMOJI_CHECK) -> typing.Tuple[bool, typing.Optional[str]]:
+ """Validate the emojis, the user put."""
+ if isinstance(e1, str) and len(e1) > 1:
+ return False, e1
+ if isinstance(e2, str) and len(e2) > 1:
+ return False, e2
+ return True, None
+
async def _play_game(
self,
ctx: commands.Context,
@@ -373,10 +390,9 @@ class ConnectFour(commands.Cog):
The game will start once someone has reacted.
All inputs will be through reactions.
"""
- if isinstance(emoji1, str) and len(emoji1) > 1:
- raise commands.EmojiNotFound(emoji1)
- if isinstance(emoji2, str) and len(emoji2) > 1:
- raise commands.EmojiNotFound(emoji2)
+ check, emoji = self.check_emojis(emoji1, emoji2)
+ if not check:
+ raise commands.EmojiNotFound(emoji)
check_author_result = await self.check_author(ctx, board_size)
if not check_author_result:
@@ -424,15 +440,19 @@ class ConnectFour(commands.Cog):
self,
ctx: commands.Context,
board_size: int = 7,
- emoji1: EMOJI_CHECK = "\U0001f535"
+ emoji1: EMOJI_CHECK = "\U0001f535",
+ emoji2: EMOJI_CHECK = "\U0001f534"
) -> None:
"""Play Connect Four against a computer player."""
- if isinstance(emoji1, str) and len(emoji1) > 1:
- raise commands.EmojiNotFound(emoji1)
+ check, emoji = self.check_emojis(emoji1, emoji2)
+ if not check:
+ raise commands.EmojiNotFound(emoji)
+
check_author_result = await self.check_author(ctx, board_size)
if not check_author_result:
return
- await self._play_game(ctx, None, board_size, str(emoji1), ":red_circle:")
+
+ await self._play_game(ctx, None, board_size, str(emoji1), str(emoji2))
def setup(bot: commands.Bot) -> None: