paper-dynasty-discord/gauntlets.py
2023-03-19 17:53:59 -05:00

379 lines
14 KiB
Python

import copy
import datetime
import logging
import discord
import requests
from peewee import DatabaseError
import ai_manager
import helpers
from helpers import RARITY, get_cal_user
from db_calls import db_get, db_post, db_delete
async def wipe_team(this_team, interaction: discord.Interaction):
await interaction.edit_original_response(content=f'Looking for cards...')
# Delete cards
c_query = db_get('cards', params=[('team_id', this_team['id'])])
await interaction.edit_original_response(content=f'Found {c_query["count"]} cards; deleting cards...')
for x in c_query['cards']:
db_delete('cards', object_id=x['id'])
# Delete packs
await interaction.edit_original_response(content=f'Done deleting cards; searching for packs...')
p_query = db_get('packs', params=[('team_id', this_team['id'])])
await interaction.edit_original_response(content=f'Found {p_query["count"]} packs; deleting packs...')
for x in p_query['packs']:
db_delete('packs', object_id=x['id'])
# Delete team
await interaction.edit_original_response(content=f'Done deleting packs; now deleting team...')
db_delete('teams', object_id=this_team['id'])
await interaction.edit_original_response(content=f'Team is deleted; now finding the run...')
r_query = db_get('gauntletruns', params=[('team_id', this_team['id']), ('is_active', True)])
await interaction.edit_original_response(content=f'Found {r_query["count"]} runs; deleting now...')
for x in r_query['runs']:
db_delete('gauntletruns', object_id=x['id'])
def get_game_code(this_team, this_event, this_run):
return f'gauntlet-{this_event["id"]}-run-{this_run["id"]}-game-{games_played(this_run) + 1}'
def games_played(this_run):
return this_run['wins'] + this_run['losses']
def is_home_team(this_team, this_event, this_run):
if this_event['id'] == 1:
return True
return False
def get_opponent(this_team, this_event, this_run):
if this_event['id'] == 1:
gp = games_played(this_run)
if gp == 0:
t_id = 20
elif gp == 1:
t_id = 9
elif gp == 2:
t_id = 5
elif gp == 3:
t_id = 17
elif gp == 4:
t_id = 3
elif gp == 5:
t_id = 21
elif gp == 6:
t_id = 24
elif gp == 7:
t_id = 23
elif gp == 8:
t_id = 18
elif gp == 9:
t_id = 11
elif gp == 10:
t_id = 14
else:
raise KeyError(f'Huh...I have no idea who you should be playing right now.')
return db_get('teams', object_id=t_id, none_okay=False)
else:
return None
def build_lineup(this_team, this_game, this_event):
if this_event['id'] == 1:
return ai_manager.build_lineup(this_team, this_game.id, f'gauntlet-{this_event["id"]}')
else:
raise KeyError(f'Lineups not found for Gauntlet {this_event["id"]}')
def get_starting_pitcher(this_team, this_game, this_event, this_run):
if this_event['id'] == 1:
set_params = ai_manager.MINOR_CARDSET_PARAMS
params = [
('mlbclub', this_team['lname']), ('pos_include', 'SP'), ('pos_exclude', 'RP'),
('inc_dex', False), ('sort_by', 'cost-desc'), ('limit', 5)
]
params.extend(set_params)
else:
raise KeyError(f'Pitcher not found for Gauntlet {this_event["id"]}')
# Pull pitchers
try:
pitchers = db_get(
endpoint='players',
params=params,
timeout=10
)
except ConnectionError as e:
logging.error(f'Could not get pitchers for {this_team["lname"]}: {e}')
raise ConnectionError(f'Error pulling starting pitchers for the {this_team["lname"]}. Cal help plz.')
if pitchers['count'] == 0:
raise DatabaseError(f'Could not find any SP for {this_team["abbrev"]}. Seems like a Cal issue.')
pitcher_num = games_played(this_run) % 5
card_id = ai_manager.get_or_create_card(pitchers['players'][pitcher_num], this_team)
return {
'game_id': this_game.id,
'team_id': this_team['id'],
'player_id': pitchers['players'][0]['player_id'],
'card_id': card_id,
'position': 'P',
'batting_order': 10,
'after_play': 0
}
async def run_draft(interaction: discord.Interaction, main_team, this_event):
if this_event['id'] == 1:
embed_title = f'{main_team["lname"]} - {this_event["name"]} Draft'
embed_description = f'{this_event["name"]}'
base_params = ai_manager.MAJOR_CARDSET_PARAMS
base_params.append(('limit', 8))
else:
logging.error(f'run_draft - Event ID {this_event["id"]} not recognized')
raise KeyError(f'Draft data not found for Gauntlet {this_event["id"]}')
# Post draft team linked to main team
draft_team = db_post(
'teams',
payload={
'abbrev': f'Gauntlet-{main_team["abbrev"]}',
'sname': main_team['sname'],
'lname': main_team['lname'],
'gmid': main_team['gmid'],
'gmname': main_team['gmname'],
'gsheet': 'NONE',
'logo': main_team['logo'] if main_team['logo'] else None,
'color': main_team['color'] if main_team['color'] else None,
'season': main_team['season'],
'has_guide': main_team['has_guide']
}
)
all_players = []
p_names = []
counts = {
'SP': 0,
'RP': 0,
'CP': 0,
'C': 0,
'1B': 0,
'2B': 0,
'3B': 0,
'SS': 0,
'LF': 0,
'CF': 0,
'RF': 0,
'DH': 0,
'MVP': 0,
'All-Star': 0,
'Starter': 0,
'Reserve': 0,
'Replacement': 0,
}
round_num = 1
counter = 1
def get_embeds():
top_embed = helpers.get_team_embed(f'{embed_title} - Round {round_num}')
top_embed.description = f'Rarity Counts'
bot_embed = helpers.get_team_embed(f'{embed_title} - Round {round_num}')
bot_embed.description = f'Current Roster'
all_str = {
'MVP': '',
'All-Star': '',
'Starter': '',
'Reserve': '',
'Replacement': '',
'C': '',
'1B': '',
'2B': '',
'3B': '',
'SS': '',
'LF': '',
'CF': '',
'RF': '',
'DH': '',
'SP': '',
'RP': '',
'CP': ''
}
for y in all_players:
all_str[y['rarity']['name']] += f'[{y["description"]}]({y["image"]})\n'
for z in helpers.get_all_pos(y):
all_str[z] += f'[{y["description"]}]({y["image"]})\n'
top_embed.add_field(name=f'MVPs ({counts["MVP"]}/1)', value=all_str['MVP'], inline=False)
top_embed.add_field(name=f'All-Stars ({counts["All-Star"]}/3)', value=all_str['All-Star'], inline=False)
top_embed.add_field(name=f'Starters ({counts["Starter"]}/9)', value=all_str['Starter'], inline=False)
top_embed.add_field(name=f'Reserves ({counts["Reserve"]}/8)', value=all_str['Reserve'], inline=False)
top_embed.add_field(
name=f'Replacements ({counts["Replacement"]}/5)', value=all_str['Replacement'], inline=False
)
bot_embed.add_field(name=f'Catcher', value=all_str['C'], inline=False)
bot_embed.add_field(name=f'First Base', value=all_str['1B'], inline=False)
bot_embed.add_field(name=f'Second Base', value=all_str['2B'], inline=False)
bot_embed.add_field(name=f'Third Base', value=all_str['3B'], inline=False)
bot_embed.add_field(name=f'Shortstop', value=all_str['SS'], inline=False)
bot_embed.add_field(name=f'Left Field', value=all_str['LF'], inline=False)
bot_embed.add_field(name=f'Center Field', value=all_str['CF'], inline=False)
bot_embed.add_field(name=f'Right Field', value=all_str['RF'], inline=False)
bot_embed.add_field(name=f'Designated Hitter', value=all_str['DH'], inline=False)
bot_embed.add_field(name=f'Starting Pitcher', value=all_str['SP'], inline=False)
bot_embed.add_field(name=f'Relief Pitcher', value=all_str['RP'], inline=False)
bot_embed.add_field(name=f'Closing Pitcher', value=all_str['CP'], inline=False)
return [top_embed, bot_embed]
await interaction.edit_original_response(
content=None,
embeds=get_embeds()
)
if this_event['id'] == 1:
while round_num <= 26 and counter < 50:
counter += 1
# Set params based on current round
params = copy.deepcopy(base_params)
if round_num == 1:
params.extend([
('min_rarity', RARITY['MVP']), ('max_rarity', RARITY['MVP']), ('pos_exc', 'RP')
])
elif round_num == 2:
params.extend([
('min_rarity', RARITY['All-Star']), ('max_rarity', RARITY['All-Star'])
])
elif round_num <= 5:
params.extend([
('min_rarity', RARITY['Starter']), ('max_rarity', RARITY['Starter'])
])
elif round_num <= 10:
params.extend([
('min_rarity', RARITY['Reserve']), ('max_rarity', RARITY['Reserve'])
])
elif round_num == 11:
params.extend([
('min_rarity', RARITY['All-Star']), ('max_rarity', RARITY['All-Star'])
])
elif round_num == 12:
params.extend([
('min_rarity', RARITY['Starter']), ('max_rarity', RARITY['Starter'])
])
elif round_num <= 15:
params.extend([
('min_rarity', RARITY['Replacement']), ('max_rarity', RARITY['Replacement'])
])
elif round_num <= 18:
params.extend([
('min_rarity', RARITY['Starter']), ('max_rarity', RARITY['Starter'])
])
elif round_num == 19:
params.extend([
('min_rarity', RARITY['All-Star']), ('max_rarity', RARITY['All-Star'])
])
elif round_num <= 21:
params.extend([
('min_rarity', RARITY['Starter']), ('max_rarity', RARITY['Starter'])
])
elif round_num <= 24:
params.extend([
('min_rarity', RARITY['Reserve']), ('max_rarity', RARITY['Reserve'])
])
elif round_num <= 26:
params.extend([
('min_rarity', RARITY['Replacement']), ('max_rarity', RARITY['Replacement'])
])
# Any positional adjustments can be added as params here
for x in ['C', '1B', '2B', '3B', 'SS', 'LF', 'CF', 'RF']:
if counts[x] > 2 and 0 in [
counts['C'], counts['1B'], counts['2B'], counts['3B'], counts['SS'], counts['LF'],
counts['CF'], counts['RF']]:
logging.info(f'0 exists in other positions; excluding {x}')
params.append(('pos_exc', x))
elif counts[x] > 3:
params.append(('pos_exc', x))
if round_num > 20 and counts[x] < 2:
params.append(('pos_inc', x))
if counts['RP'] > 8:
params.append(('pos_exc', 'RP'))
if counts['SP'] > 6:
params.append(('pos_exc', 'SP'))
if counts['RP'] > counts['SP'] + 3:
params.append(('pos_exc', 'RP'))
if counts['SP'] > counts['RP'] + 3:
params.append(('pos_exc', 'RP'))
# Call /players/random to get eight cards
p_query = None
try:
p_query = db_get('players/random', params=params)
except requests.ReadTimeout as e:
logging.error(f'run_draft - timeout error pulling player with params {params}')
if p_query is not None:
test_player_list = ''
for x in p_query['players']:
test_player_list += f'{x["rarity"]["name"]} - {x["description"]} - {helpers.get_all_pos(x)}\n'
# await interaction.channel.send(f'The Round {round_num} players drawn are:\n\n{test_player_list}')
# Collect 4 cards with no repeat player names
this_batch = []
for x in p_query['players']:
if x['p_name'] not in p_names:
this_batch.append(x)
if len(this_batch) == 4:
break
# Present choices and capture selection
p_choice = await helpers.get_choice_from_cards(interaction, this_batch, delete_message=True)
# Add player to list and update counts
p_names.append(p_choice['p_name'])
counts[p_choice['rarity']['name']] += 1
all_players.append(p_choice)
for x in helpers.get_all_pos(p_choice):
if x in counts:
counts[x] += 1
# Update roster embed
await interaction.edit_original_response(
content=None,
embeds=get_embeds()
)
round_num += 1
else:
logging.error(f'run_draft - No draft logic for Event ID {this_event["id"]}')
raise KeyError(f'Draft data not found for Gauntlet {this_event["id"]}')
this_pack = db_post(
'packs/one',
payload={
'team_id': draft_team['id'],
'pack_type_id': 2,
'open_time': datetime.datetime.timestamp(datetime.datetime.now()) * 1000
}
)
db_post(
'cards',
payload={'cards': [
{'player_id': x['player_id'], 'team_id': draft_team['id'], 'pack_id': this_pack['id']} for x in all_players
]}
)
db_post(
'gauntletruns',
payload={
'team_id': main_team['id'],
'gauntlet_id': this_event['id']
}
)