paper-dynasty-discord/cogs/players/utility_commands.py
2025-08-17 08:46:55 -05:00

188 lines
7.8 KiB
Python

# Utility Commands Module
# Contains miscellaneous utility and admin commands from the original players.py
from discord.ext import commands
from discord import app_commands
import discord
import random
# Import specific utilities needed by this module
import logging
from discord.ext.commands import Greedy
from api_calls import db_get, db_post
from helpers import (
PD_PLAYERS_ROLE_NAME, IMAGES, get_channel, legal_channel, get_team_embed
)
from helpers.search_utils import fuzzy_player_search
from helpers.random_content import random_conf_gif, random_conf_word
from helpers.utils import get_cal_user
logger = logging.getLogger('discord_app')
class UtilityCommands(commands.Cog):
"""Miscellaneous utility and admin commands for Paper Dynasty."""
def __init__(self, bot):
self.bot = bot
@commands.command(name='in', help='Get Paper Dynasty Players role')
async def give_role(self, ctx, *args):
"""Give the user the Paper Dynasty Players role."""
await ctx.author.add_roles(discord.utils.get(ctx.guild.roles, name='Paper Dynasty Players'))
await ctx.send('I got u, boo. ;)\n\nNow that you\'ve got the PD role, you can run all of the Paper Dynasty '
'bot commands. For help, check out `/help-pd`')
@commands.command(name='out', help='Remove Paper Dynasty Players role')
@commands.has_any_role('Paper Dynasty Players')
async def take_role(self, ctx, *args):
"""Remove the Paper Dynasty Players role from the user."""
await ctx.author.remove_roles(discord.utils.get(ctx.guild.roles, name='Paper Dynasty Players'))
await ctx.send('Oh no! I\'m so sad to see you go! What are we going to do without you?')
@commands.command(name='fuck', help='You know')
@commands.has_any_role(PD_PLAYERS_ROLE_NAME)
@commands.check(legal_channel)
async def fuck_command(self, ctx, gm: discord.Member):
"""Fun command for stress relief."""
t_query = await db_get('teams', params=[('gm_id', gm.id)])
if t_query['count'] == 0:
await ctx.send(f'Who?')
return
await ctx.send(f'{t_query["teams"][0]["sname"]} are a bunch of cuties!')
@commands.command(name='c', aliases=['chaos', 'choas'], help='c, chaos, or choas')
async def chaos_roll(self, ctx):
"""
Have the pitcher check for chaos with a runner on base.
"""
d_twenty = random.randint(1, 20)
d_twenty_two = random.randint(1, 20)
flag = None
if d_twenty == 1:
flag = 'wild pitch'
elif d_twenty == 2:
if random.randint(1, 2) == 1:
flag = 'balk'
else:
flag = 'passed ball'
if not flag:
roll_message = f'Chaos roll for {ctx.author.name}\n```md\nNo Chaos```'
else:
roll_message = f'Chaos roll for {ctx.author.name}\n```md\nCheck {flag}```\n'\
f'{flag.title()} roll```md\n# {d_twenty_two}\nDetails: [1d20 ({d_twenty_two})]```'
await ctx.send(roll_message)
@commands.command(name='sba', hidden=True)
async def sba_command(self, ctx, *, player_name):
"""Hidden search command for player lookup."""
async def get_one_player(id_or_name):
"""Helper function to get player data."""
try:
# Try as ID first
player_id = int(id_or_name)
p_query = await db_get('players', params=[('player_id', player_id)])
except ValueError:
# Search by name
p_query = await db_get('players', params=[('name', id_or_name)])
if p_query and p_query.get('count'):
return p_query['players'][0]
return None
player = await get_one_player(player_name)
if not player:
# Try fuzzy search
fuzzy_results = fuzzy_player_search(player_name)
if fuzzy_results:
player = await get_one_player(fuzzy_results[0])
if not player:
await ctx.send(f'Could not find player: {player_name}')
return
# Simplified to match original - just logs player data
logger.debug(f'this_player: {player}')
@commands.command(name='build_list', help='Mod: Synchronize fuzzy player list')
async def build_player_command(self, ctx):
"""Manual command to rebuild player search list."""
# Find the PlayerLookup cog and trigger its build_list method
player_lookup_cog = self.bot.get_cog('PlayerLookup')
if player_lookup_cog and hasattr(player_lookup_cog, 'build_player_list'):
player_lookup_cog.build_player_list.stop()
player_lookup_cog.build_player_list.start()
await ctx.send(f'Just kicked off the build...')
import asyncio
await asyncio.sleep(10)
await ctx.send(f'There are now {len(player_lookup_cog.player_list)} player names in the fuzzy search list.')
else:
await ctx.send('❌ Could not find PlayerLookup cog or build_player_list method')
@commands.hybrid_command(name='random', help='Check out a random card')
@commands.has_any_role(PD_PLAYERS_ROLE_NAME)
@commands.check(legal_channel)
async def random_card_command(self, ctx: commands.Context):
"""Display a random player card."""
p_query = await db_get('players/random', params=[('limit', 1)])
if not p_query or not p_query.get('count'):
await ctx.send('Could not find any random players')
return
this_player = p_query['players'][0]
# Use blank team card structure like original
from helpers import get_card_embeds, PD_SEASON
this_embed = await get_card_embeds(
{'player': this_player, 'team': {'lname': 'Paper Dynasty', 'logo': IMAGES['logo'], 'season': PD_SEASON}}
)
await ctx.send(content=None, embeds=this_embed)
@commands.hybrid_command(name='ai-teams', help='Get list of AI teams and abbreviations')
@commands.has_any_role(PD_PLAYERS_ROLE_NAME)
@commands.check(legal_channel)
async def ai_teams_command(self, ctx: commands.Context):
"""Display list of AI teams available for solo play."""
embed = get_team_embed(f'Paper Dynasty AI Teams')
embed.description = 'Teams Available for Solo Play'
embed.add_field(
name='AL East',
value=f'BAL - Baltimore Orioles\nBOS - Boston Red Sox\nNYY - New York Yankees\nTBR - Tampa Bay Rays\nTOR - '
f'Toronto Blue Jays'
)
embed.add_field(
name='AL Central',
value=f'CLE - Cleveland Guardians\nCHW - Chicago White Sox\nDET - Detroit Tigers\nKCR - Kansas City '
f'Royals\nMIN - Minnesota Twins'
)
embed.add_field(
name='AL West',
value=f'HOU - Houston Astros\nLAA - Los Angeles Angels\nOAK - Oakland Athletics\nSEA - Seattle Mariners'
f'\nTEX - Texas Rangers'
)
embed.add_field(
name='NL East',
value=f'ATL - Atlanta Braves\nMIA - Miami Marlins\nNYM - New York Mets\nPHI - Philadelphia Phillies\n'
f'WSN - Washington Nationals'
)
embed.add_field(
name='NL Central',
value=f'CHC - Chicago Cubs\nCIN - Cincinnati Reds\nMIL - Milwaukee Brewers\nPIT - Pittsburgh Pirates\n'
f'STL - St Louis Cardinals'
)
embed.add_field(
name='NL West',
value=f'ARI - Arizona Diamondbacks\nCOL - Colorado Rockies\nLAD - Los Angeles Dodgers\nSDP - San Diego '
f'Padres\nSFG - San Francisco Giants'
)
await ctx.send(content=None, embed=embed)
async def setup(bot):
"""Setup function for the UtilityCommands cog."""
await bot.add_cog(UtilityCommands(bot))