# 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 MISC_GEOGRAPHY = 1317916442342981722 GLOBLE_CHANNEL = 1320505660701413511 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): await interaction.response.defer() match game.lower(): case "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.followup.send( "No Wordle results found.", ephemeral=True ) return average_guesses = total_guesses / wins win_rate = (wins / total_games) * 100 await interaction.followup.send( f"Wordle 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", ephemeral=False # Send message only to the user who called the command ) case "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.followup.send( "No Connections results found.", ephemeral=True ) return average_guesses = total_guesses / wins win_rate = (wins / total_games) * 100 await interaction.followup.send( 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 ) case "satle": channel = bot.get_channel(MISC_GEOGRAPHY) if user is None: user = interaction.user SATLE_PATTERN = r"🛰Satle #[0-9]+ (\d)/6" total_guesses = 0 total_games = 0 wins = 0 async for message in channel.history(limit=1000): # Limit can be adjusted if message.author == user: lines = message.content.splitlines() for line in lines: match = re.match(SATLE_PATTERN, line.strip()) if match: total_games += 1 guesses = match.group(1) if lines[lines.index(line)+1].__contains__("🟩"): total_guesses += int(guesses) wins += 1 break if total_games == 0: await interaction.followup.send( "No Satle results found.", ephemeral=True ) return average_guesses = total_guesses / wins win_rate = (wins / total_games) * 100 await interaction.followup.send( f"Satle 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", ephemeral=False # Send message only to the user who called the command ) case "globle": misc_channel = bot.get_channel(MISC_GEOGRAPHY) globle_channel = bot.get_channel(GLOBLE_CHANNEL) if user is None: user = interaction.user GLOBLE_PATTERN = r"I guessed today’s Globle in ([0-9]+) tries:" BAD_GLOBLE_PATTERN = r".* = ([0-9]+)" total_guesses = 0 total_games = 0 async for message in misc_channel.history(limit=1000): # Limit can be adjusted if message.author == user: lines = message.content.splitlines() for line in lines: match = re.match(GLOBLE_PATTERN, line.strip()) if match: total_games += 1 guesses = match.group(1) total_guesses += int(guesses) break match = re.match(BAD_GLOBLE_PATTERN, line.strip()) if match: total_games += 1 guesses = match.group(1) total_guesses += int(guesses) break async for message in globle_channel.history(limit=1000): # Limit can be adjusted if message.author == user: lines = message.content.splitlines() for line in lines: match = re.match(GLOBLE_PATTERN, line.strip()) if match: total_games += 1 guesses = match.group(1) total_guesses += int(guesses) break match = re.match(BAD_GLOBLE_PATTERN, line.strip()) if match: total_games += 1 guesses = match.group(1) total_guesses += int(guesses) break if total_games == 0: await interaction.followup.send( "No Globle results found.", ephemeral=True ) return average_guesses = total_guesses / total_games await interaction.followup.send( f"Globle stats for {user.mention}:\n" f"Total Games Played: {total_games}\n" f"Average Guesses per Game: {average_guesses:.2f}\n", ephemeral=False # Send message only to the user who called the command ) case _: await interaction.followup.send( "Not a game.", ephemeral=True ) @bot.event async def on_ready(): print('Ready!') bot.run(TOKEN)