2022-07-26 21:48:50 +02:00
|
|
|
from typing import Optional
|
|
|
|
|
2022-07-27 21:10:43 +02:00
|
|
|
import discord
|
2022-07-26 21:48:50 +02:00
|
|
|
from discord import app_commands
|
|
|
|
from discord.ext import commands
|
|
|
|
|
2022-07-27 21:10:43 +02:00
|
|
|
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,
|
|
|
|
)
|
2022-07-26 21:48:50 +02:00
|
|
|
from didier import Didier
|
2022-07-27 21:10:43 +02:00
|
|
|
from didier.data.embeds.wordle import WordleEmbed, WordleErrorEmbed
|
2022-07-26 21:48:50 +02:00
|
|
|
|
|
|
|
|
|
|
|
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!")
|
2022-07-27 21:10:43 +02:00
|
|
|
async def wordle(self, interaction: discord.Interaction, guess: Optional[str] = None):
|
2022-07-26 21:48:50 +02:00
|
|
|
"""View your active Wordle game
|
|
|
|
|
|
|
|
If an argument is provided, make a guess instead
|
|
|
|
"""
|
2022-07-27 21:10:43 +02:00
|
|
|
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)
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
# 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)
|
|
|
|
|
|
|
|
# Make a guess
|
|
|
|
if guess:
|
|
|
|
# The guess is not a real word
|
|
|
|
if guess 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)
|
|
|
|
|
|
|
|
await make_wordle_guess(self.client.mongo_db, interaction.user.id, guess)
|
|
|
|
|
|
|
|
# Don't re-request the game, we already have it
|
|
|
|
# just append locally
|
|
|
|
active_game.guesses.append(guess)
|
|
|
|
|
|
|
|
embed = WordleEmbed(game=active_game, word=self.client.database_caches.wordle_word.data[0]).to_embed()
|
|
|
|
await interaction.followup.send(embed=embed)
|
2022-07-26 21:48:50 +02:00
|
|
|
|
|
|
|
|
|
|
|
async def setup(client: Didier):
|
|
|
|
"""Load the cog"""
|
|
|
|
await client.add_cog(Games(client))
|