chefle-bot/bot.py

132 lines
3.8 KiB
Python

# bot.py
import os
import discord
from game_logic import connections as con
import re
from collections import Counter
from discord.ext import commands
from dotenv import load_dotenv
WORDLE_CHANNEL = 1317916234863480832
load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
bot = commands.Bot()
@bot.slash_command(
name="stats",
description="Prints out your stats in a daily game, examples include wordle",
guild_ids=[261345598987436033]
)
async def stats(interaction: discord.Interaction, game, user: discord.User = None):
if game.lower() == 'wordle':
channel = bot.get_channel(WORDLE_CHANNEL)
if user is None:
user = interaction.user
WORDLE_PATTERN = r"^Wordle (\d{1,3}(?:,\d{3})*) (X|\d+)/(\d+)"
total_guesses = 0
total_games = 0
wins = 0
async for message in channel.history(limit=1000): # Limit can be adjusted
if message.author == user:
for line in message.content.splitlines():
match = re.match(WORDLE_PATTERN, line.strip())
if match:
total_games += 1
guesses = match.group(2)
if guesses != 'X':
total_guesses += int(guesses)
wins += 1
break
if total_games == 0:
await interaction.response.send_message(
"No Wordle results found.",
ephemeral=True
)
return
average_guesses = total_guesses / wins
win_rate = (wins / total_games) * 100
await interaction.response.send_message(
f"Wordle stats for {user.mention}:\n"
f"Total Games Played: {total_games}\n"
f"Total Guesses: {total_guesses}\n"
f"Average Guesses per Winning Game: {average_guesses:.2f}\n"
f"Win Rate: {win_rate:.2f}%\n",
ephemeral=False # Send message only to the user who called the command
)
elif game.lower() == 'connections':
channel = bot.get_channel(WORDLE_CHANNEL)
if user is None:
user = interaction.user
CONNECTIONS_PATTERN = r"^Connections\nPuzzle #(\d+)\n((?:[\u2B1B\u2B1C\u2B1D\u2B1E\u2B20]{4}\n?)+)$"
total_guesses = 0
total_games = 0
wins = 0
perfects = 0
async for message in channel.history(limit=1000): # Limit can be adjusted
if message.author == user:
color_grid = con.extract_connections_grid( message.content)
if color_grid:
guesses = con.check_connections_win(color_grid)
total_games += 1
if guesses > 0:
total_guesses += guesses
wins += 1
perfect_game = con.is_perfect_game(color_grid)
if perfect_game:
perfects += 1
if total_games == 0:
await interaction.response.send_message(
"No Connections results found.",
ephemeral=True
)
return
average_guesses = total_guesses / wins
win_rate = (wins / total_games) * 100
await interaction.response.send_message(
f"Connections stats for {user.mention}:\n"
f"Total Games Played: {total_games}\n"
f"Average Guesses per Winning Game: {average_guesses:.2f}\n"
f"Win Rate: {win_rate:.2f}%\n"
f"Perfect Games: {perfects}\n",
ephemeral=False # Send message only to the user who called the command
)
else:
await interaction.response.send_message(
"Not a game.",
ephemeral=True
)
@bot.event
async def on_ready():
print('Ready!')
bot.run(TOKEN)