didier/didier/cogs/games.py

68 lines
2.5 KiB
Python

from typing import Optional
import discord
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
from didier import Didier
from didier.data.embeds.wordle import WordleEmbed, WordleErrorEmbed
class Games(commands.Cog):
"""Cog for various games"""
client: Didier
def __init__(self, client: Didier):
self.client = client
@app_commands.command(name="wordle", description="Play Wordle!")
async def wordle(self, interaction: discord.Interaction, guess: Optional[str] = None):
"""View your active Wordle game
If an argument is provided, make a guess instead
"""
await interaction.response.defer(ephemeral=True)
# Guess is wrong length
if guess is not None and len(guess) != 0 and len(guess) != WORDLE_WORD_LENGTH:
embed = WordleErrorEmbed(message=f"Guess must be 5 characters, but `{guess}` is {len(guess)}.").to_embed()
return await interaction.followup.send(embed=embed)
word = self.client.database_caches.wordle_word.data[0].lower()
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))
# 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)
# 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)
guess = guess.lower()
await make_wordle_guess(session, interaction.user.id, guess)
# 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):
"""Load the cog"""
await client.add_cog(Games(client))