diff options
Diffstat (limited to 'bot/exts/evergreen')
| -rw-r--r-- | bot/exts/evergreen/connect_four.py | 58 | 
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: | 
