chefle-bot/bot.py
2025-01-13 11:55:52 -08:00

243 lines
8.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 todays 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)