Fix wordle code

This commit is contained in:
stijndcl 2022-08-29 20:49:29 +02:00
parent 8a4baf6bb8
commit 73d44de46e
11 changed files with 58 additions and 48 deletions

View file

@ -5,11 +5,7 @@ from discord import app_commands
from discord.ext import commands
from database.constants import WORDLE_GUESS_COUNT, WORDLE_WORD_LENGTH
from database.crud.wordle import (
get_active_wordle_game,
make_wordle_guess,
start_new_wordle_game,
)
from database.crud.wordle import get_active_wordle_game, make_wordle_guess
from didier import Didier
from didier.data.embeds.wordle import WordleEmbed, WordleErrorEmbed
@ -35,31 +31,35 @@ class Games(commands.Cog):
embed = WordleErrorEmbed(message=f"Guess must be 5 characters, but `{guess}` is {len(guess)}.").to_embed()
return await interaction.followup.send(embed=embed)
active_game = await get_active_wordle_game(self.client.mongo_db, interaction.user.id)
if active_game is None:
active_game = await start_new_wordle_game(self.client.mongo_db, interaction.user.id)
word = self.client.database_caches.wordle_word.data[0].lower()
# Trying to guess with a complete game
if len(active_game.guesses) == WORDLE_GUESS_COUNT and guess:
embed = WordleErrorEmbed(message="You've already completed today's Wordle.\nTry again tomorrow!").to_embed()
return await interaction.followup.send(embed=embed)
async with self.client.postgres_session as session:
guesses_instances = await get_active_wordle_game(session, interaction.user.id)
guesses = list(map(lambda g: g.guess, guesses_instances))
# Make a guess
if guess:
# The guess is not a real word
if guess.lower() not in self.client.wordle_words:
embed = WordleErrorEmbed(message=f"`{guess}` is not a valid word.").to_embed()
# Trying to guess with a complete game
if (len(guesses) == WORDLE_GUESS_COUNT and guess) or word in guesses:
embed = WordleErrorEmbed(
message="You've already completed today's Wordle.\nTry again tomorrow!"
).to_embed()
return await interaction.followup.send(embed=embed)
guess = guess.lower()
await make_wordle_guess(self.client.mongo_db, interaction.user.id, guess)
# Make a guess
if guess:
# The guess is not a real word
if guess.lower() not in self.client.wordle_words:
embed = WordleErrorEmbed(message=f"`{guess}` is not a valid word.").to_embed()
return await interaction.followup.send(embed=embed)
# Don't re-request the game, we already have it
# just append locally
active_game.guesses.append(guess)
guess = guess.lower()
await make_wordle_guess(session, interaction.user.id, guess)
embed = WordleEmbed(game=active_game, word=self.client.database_caches.wordle_word.data[0]).to_embed()
await interaction.followup.send(embed=embed)
# Don't re-request the game, we already have it
# just append locally
guesses.append(guess)
embed = WordleEmbed(guesses=guesses, word=word).to_embed()
await interaction.followup.send(embed=embed)
async def setup(client: Didier):

View file

@ -140,9 +140,9 @@ class Tasks(commands.Cog):
@tasks.loop(time=DAILY_RESET_TIME)
async def reset_wordle_word(self, forced: bool = False):
"""Reset the daily Wordle word"""
db = self.client.mongo_db
word = await set_daily_word(db, random.choice(tuple(self.client.wordle_words)), forced=forced)
self.client.database_caches.wordle_word.data = [word]
async with self.client.postgres_session as session:
word = await set_daily_word(session, random.choice(tuple(self.client.wordle_words)), forced=forced)
self.client.database_caches.wordle_word.data = [word]
@reset_wordle_word.before_loop
async def _before_reset_wordle_word(self):

View file

@ -1,12 +1,11 @@
import enum
from dataclasses import dataclass
from typing import Optional
import discord
from overrides import overrides
from database.constants import WORDLE_GUESS_COUNT, WORDLE_WORD_LENGTH
from database.schemas.mongo.wordle import WordleGame
from database.schemas import WordleGuess
from didier.data.embeds.base import EmbedBaseModel
from didier.utils.types.datetime import int_to_weekday, tz_aware_now
@ -32,7 +31,7 @@ class WordleColour(enum.IntEnum):
class WordleEmbed(EmbedBaseModel):
"""Embed for a Wordle game"""
game: Optional[WordleGame]
guesses: list[WordleGuess]
word: str
def _letter_colour(self, guess: str, index: int) -> WordleColour:
@ -68,9 +67,8 @@ class WordleEmbed(EmbedBaseModel):
colours = []
# Add all the guesses
if self.game is not None:
for guess in self.game.guesses:
colours.append(self._guess_colours(guess))
for guess in self.guesses:
colours.append(self._guess_colours(guess))
# Fill the rest with empty spots
for _ in range(WORDLE_GUESS_COUNT - len(colours)):
@ -93,6 +91,16 @@ class WordleEmbed(EmbedBaseModel):
return emojis
def _is_game_over(self) -> bool:
"""Check if the current game is over or not"""
if not self.guesses:
return False
if len(self.guesses) == WORDLE_GUESS_COUNT:
return True
return self.word.lower() in self.guesses
@overrides
def to_embed(self, **kwargs) -> discord.Embed:
only_colours = kwargs.get("only_colours", False)
@ -105,12 +113,12 @@ class WordleEmbed(EmbedBaseModel):
rows = [" ".join(row) for row in emojis]
# Don't reveal anything if we only want to show the colours
if not only_colours and self.game is not None:
for i, guess in enumerate(self.game.guesses):
if not only_colours and self.guesses:
for i, guess in enumerate(self.guesses):
rows[i] += f" ||{guess.upper()}||"
# If the game is over, reveal the word
if self.game.is_game_over(self.word):
if self._is_game_over():
rows.append(f"\n\nThe word was **{self.word.upper()}**!")
embed.description = "\n\n".join(rows)