import copy import datetime import logging import random from typing import Literal import discord from sqlmodel import Session from discord import SelectOption from exceptions import * from in_game import ai_manager import helpers from helpers import RARITY, get_or_create_role, send_to_channel, get_channel from api_calls import db_get, db_post, db_delete, db_patch from in_game.gameplay_models import Lineup, Team from in_game.gameplay_queries import ( get_player_or_none, get_team_or_none, get_or_create_ai_card, get_player_id_from_dict, ) from utilities.dropdown import DropdownView, SelectPokemonEvolution logger = logging.getLogger("discord_app") async def wipe_team( this_team: Team, interaction: discord.Interaction, delete_team: bool = False, delete_runs: bool = False, ): await interaction.edit_original_response(content=f"Looking for cards...") # Delete cards # c_query = await 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']: # await db_delete('cards', object_id=x['id']) c_query = await db_post(f"cards/wipe-team/{this_team.id}") # Delete packs await interaction.edit_original_response( content=f"Done deleting cards; searching for packs..." ) p_query = await 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"]: await db_delete("packs", object_id=x["id"]) # Delete team if delete_team: await interaction.edit_original_response( content=f"Done deleting packs; now deleting team..." ) await db_delete("teams", object_id=this_team.id) await interaction.edit_original_response( content=f"Team is deleted; now finding the run..." ) if delete_runs: r_query = await 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"]: await 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']}" 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"] in [1, 2]: return True return False async def get_opponent(session: Session, this_team, this_event, this_run) -> Team: gp = games_played(this_run) if this_event["id"] == 1: if gp == 0: t_id = 30 elif gp == 1: t_id = 12 elif gp == 2: t_id = 15 elif gp == 3: t_id = 13 elif gp == 4: t_id = 6 elif gp == 5: t_id = 4 elif gp == 6: t_id = 23 elif gp == 7: t_id = 16 elif gp == 8: t_id = 2 elif gp == 9: t_id = 14 elif gp == 10: t_id = 58 else: raise KeyError(f"Huh...I have no idea who you should be playing right now.") elif this_event["id"] == 2: if gp == 0: t_id = 23 elif gp == 1: t_id = 15 elif gp == 2: t_id = 24 elif gp == 3: t_id = 25 elif gp == 4: t_id = 18 elif gp == 5: t_id = 6 elif gp == 6: t_id = 16 elif gp == 7: t_id = 2 elif gp == 8: t_id = 5 elif gp == 9: t_id = 9 elif gp == 10: t_id = 28 else: raise KeyError(f"Huh...I have no idea who you should be playing right now.") elif this_event["id"] == 3: if gp == 0: t_id = 28 elif gp == 1: t_id = 7 elif gp == 2: t_id = 15 elif gp == 3: t_id = 6 elif gp == 4: t_id = 21 elif gp == 5: t_id = 23 elif gp == 6: t_id = 24 elif gp == 7: t_id = 13 elif gp == 8: t_id = 4 elif gp == 9: t_id = 2 elif gp == 10: t_id = 19 else: raise KeyError(f"Huh...I have no idea who you should be playing right now.") elif this_event["id"] == 4: if gp == 0: t_id = 3 elif gp == 1: t_id = 1 elif gp == 2: t_id = 24 elif gp == 3: t_id = 25 elif gp == 4: t_id = 21 elif gp == 5: t_id = 16 elif gp == 6: t_id = 30 elif gp == 7: t_id = 29 elif gp == 8: t_id = 10 elif gp == 9: t_id = 8 elif gp == 10: t_id = 79 else: raise KeyError(f"Hmm...I do not know who you should be playing right now.") elif this_event["id"] == 5: if gp == 0: t_id = 15 elif gp == 1: t_id = 10 elif gp == 2: t_id = 28 elif gp == 3: t_id = 30 elif gp == 4: t_id = 7 elif gp == 5: t_id = 22 elif gp == 6: t_id = 23 elif gp == 7: t_id = 2 elif gp == 8: t_id = 14 elif gp == 9: t_id = 4 elif gp == 10: t_id = 19 else: raise KeyError(f"Hmm...I do not know who you should be playing right now.") elif this_event["id"] == 6: if gp == 0: t_id = 18 elif gp == 1: t_id = 6 elif gp == 2: t_id = 17 elif gp == 3: t_id = 21 elif gp == 4: t_id = 4 elif gp == 5: t_id = 23 elif gp == 6: t_id = 5 elif gp == 7: t_id = 3 elif gp == 8: t_id = 19 elif gp == 9: t_id = 27 elif gp == 10: t_id = 25 else: raise KeyError(f"Hmm...I do not know who you should be playing right now.") elif this_event["id"] == 7: if gp == 0: t_id = 10 elif gp == 1: t_id = 20 elif gp == 2: t_id = 25 elif gp == 3: t_id = 27 elif gp == 4: t_id = 6 elif gp == 5: t_id = 5 elif gp == 6: t_id = 4 elif gp == 7: t_id = 16 elif gp == 8: t_id = 13 elif gp == 9: t_id = 30 elif gp == 10: t_id = 17 else: raise KeyError(f"Hmm...I do not know who you should be playing right now.") elif this_event["id"] == 8: if gp == 0: teams = [6, 9] # White Sox and Rockies elif gp == 1: teams = [22, 30, 20, 2] # Pirates, Nats, A's, Braves elif gp == 2: teams = [3, 15, 12] # Orioles, Marlins, Royals elif gp == 3: teams = [17, 8, 13] # Twins, Guardians, Angels elif gp == 4: teams = [13, 1, 28] # Angels, Dbacks, Rangers elif gp == 5: teams = [26, 27] # Cardinals, Rays elif gp == 6: teams = [7, 25, 4] # Reds, Giants, Red Sox elif gp == 7: teams = [24, 23, 19] # Mariners, Padres, Yankees elif gp == 8: teams = [18, 21, 11] # Mets, Phillies, Astros elif gp == 9: teams = [14, 29, 16] # Dodgers, Blue Jays, Brewers elif gp == 10: teams = [5, 10] # Cubs, Tigers else: raise KeyError(f"Hmm...I do not know who you should be playing right now.") t_id = teams[random.randint(0, len(teams) - 1)] elif this_event["id"] == 9: gp_to_tid = { 0: 7, 1: 4, 2: 19, 3: 22, 4: 30, 5: 3, 6: 2, 7: 1, 8: 26, 9: 20, 10: 6, } try: t_id = gp_to_tid[gp] except KeyError: raise KeyError( f"Hmm...I do not know who you should be playing with {gp} games played." ) else: return None this_team = await get_team_or_none(session, team_id=t_id) logger.info(f"Gauntlet opponent: {this_team}") return await get_team_or_none(session, t_id) async def build_lineup(this_team, this_game, this_event, sp_name): return await ai_manager.build_lineup( this_team, this_game.id, f"gauntlet-{this_event['id']}", sp_name ) async def get_starting_pitcher(session, this_team, this_game, this_event, this_run): sp_rank = (games_played(this_run) % 5) + 1 starter = await db_get( f"teams/{this_team.id}/sp/gauntlet-{this_event['id']}?sp_rank={sp_rank}" ) logger.info(f"starter: {starter}") this_player = await get_player_or_none(session, get_player_id_from_dict(starter)) if this_player is None: log_exception( PlayerNotFoundException, "Could not pull the AI's starting pitcher" ) # get player card; create one if none found logger.info(f"SP this_player: {this_player}") this_card = await get_or_create_ai_card(session, this_player, this_team) return Lineup( team=this_team, player=this_player, card=this_card, position="P", batting_order=10, is_fatigued=False, game=this_game, ) async def run_draft( interaction: discord.Interaction, main_team: Team, this_event, draft_team: Team = None, ): logger.info( f"Starting draft for {main_team.abbrev if draft_team is None else draft_team.abbrev}" ) if this_event["id"] == 1: embed_title = f"{main_team.lname} - {this_event['name']} Draft" embed_description = f"{this_event['name']}" base_params = copy.deepcopy(ai_manager.GAUNTLET1_PARAMS) base_params.extend([("limit", 8), ("cardset_id", 8)]) elif this_event["id"] == 2: embed_title = f"{main_team.lname} - {this_event['name']} Draft" embed_description = f"{this_event['name']}" base_params = copy.deepcopy(ai_manager.GAUNTLET2_PARAMS) base_params.extend([("limit", 8)]) elif this_event["id"] == 3: embed_title = f"{main_team.lname} - {this_event['name']} Draft" embed_description = f"{this_event['name']}" base_params = [ ("cardset_id", 8), ("cardset_id", 13), ("cardset_id", 14), ("cardset_id", 15), ("limit", 8), ] elif this_event["id"] == 4: embed_title = f"{main_team.lname} - {this_event['name']} Draft" embed_description = f"{this_event['name']}" base_params = [ ("cardset_id", 3), ("cardset_id", 4), ("cardset_id", 6), ("cardset_id", 16), ("cardset_id", 15), ("limit", 8), ] elif this_event["id"] == 5: embed_title = f"{main_team.lname} - {this_event['name']} Draft" embed_description = f"{this_event['name']}" base_params = [ ("cardset_id", 17), ("cardset_id", 18), ("cardset_id", 19), ("cardset_id", 16), ("cardset_id", 8), ("limit", 8), ] elif this_event["id"] == 6: embed_title = f"{main_team.lname} - {this_event['name']} Draft" embed_description = f"{this_event['name']}" base_params = [ ("cardset_id", 20), ("cardset_id", 21), ("cardset_id", 22), ("cardset_id", 16), ("cardset_id", 8), ("limit", 8), ] elif this_event["id"] == 7: embed_title = f"{main_team.lname} - {this_event['name']} Draft" embed_description = f"{this_event['name']}" base_params = [ ("cardset_id", 5), ("cardset_id", 1), ("cardset_id", 3), ("cardset_id", 4), ("cardset_id", 23), ("cardset_id", 22), ("limit", 4), ] elif this_event["id"] == 8: embed_title = f"{main_team.lname} - {this_event['name']} Draft" embed_description = f"{this_event['name']}" base_params = [ ("cardset_id", 24), ("cardset_id", 25), ("cardset_id", 22), ("cardset_id", 23), ("limit", 8), ] elif this_event["id"] == 9: embed_title = f"{main_team.lname} - {this_event['name']} Draft" embed_description = f"{this_event['name']}" base_params = [ ("cardset_id", 27), ("cardset_id", 28), ("cardset_id", 29), ("limit", 8), ] else: logger.error(f"run_draft - Event ID {this_event['id']} not recognized") raise KeyError(f"Draft data not found for Gauntlet {this_event['id']}") if draft_team is None: # Post draft team linked to main team draft_team = await 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, "Hall of Fame": 0, "MVP": 0, "All-Star": 0, "Starter": 0, "Reserve": 0, "Replacement": 0, } max_counts = { "Hall of Fame": 1, "MVP": 1, "All-Star": 3, "Starter": 9, "Reserve": 7, "Replacement": 5, } if this_event["id"] in [1, 2]: max_counts["MVP"] = 2 elif this_event["id"] in [5, 6, 8, 9]: # Handle draft_team as either Team object or dict dt_season = ( draft_team.season if isinstance(draft_team, Team) else draft_team["season"] ) dt_id = draft_team.id if isinstance(draft_team, Team) else draft_team["id"] g_query = await db_get( "games", params=[ ("season", dt_season), ("team1_id", dt_id), ("gauntlet_id", this_event["id"]), ], ) if g_query["count"] > 4: game_count = g_query["count"] if game_count <= 14: max_counts = { "Hall of Fame": 1, "MVP": 1, "All-Star": 3, "Starter": 10, "Reserve": 7, "Replacement": 4, } elif game_count <= 24: max_counts = { "Hall of Fame": 1, "MVP": 1, "All-Star": 4, "Starter": 10, "Reserve": 7, "Replacement": 3, } elif game_count <= 34: max_counts = { "Hall of Fame": 1, "MVP": 2, "All-Star": 4, "Starter": 10, "Reserve": 7, "Replacement": 2, } elif game_count <= 49: max_counts = { "Hall of Fame": 2, "MVP": 2, "All-Star": 4, "Starter": 10, "Reserve": 7, "Replacement": 1, } elif game_count <= 64: max_counts = { "Hall of Fame": 2, "MVP": 2, "All-Star": 4, "Starter": 11, "Reserve": 7, "Replacement": 0, } elif game_count <= 79: max_counts = { "Hall of Fame": 2, "MVP": 2, "All-Star": 5, "Starter": 11, "Reserve": 6, "Replacement": 0, } elif game_count <= 99: max_counts = { "Hall of Fame": 2, "MVP": 3, "All-Star": 5, "Starter": 11, "Reserve": 5, "Replacement": 0, } elif game_count <= 119: max_counts = { "Hall of Fame": 2, "MVP": 3, "All-Star": 5, "Starter": 12, "Reserve": 4, "Replacement": 0, } elif game_count <= 139: max_counts = { "Hall of Fame": 2, "MVP": 3, "All-Star": 6, "Starter": 12, "Reserve": 3, "Replacement": 0, } elif game_count <= 164: max_counts = { "Hall of Fame": 2, "MVP": 4, "All-Star": 6, "Starter": 12, "Reserve": 2, "Replacement": 0, } elif game_count <= 189: max_counts = { "Hall of Fame": 3, "MVP": 4, "All-Star": 6, "Starter": 12, "Reserve": 1, "Replacement": 0, } elif game_count <= 219: max_counts = { "Hall of Fame": 3, "MVP": 4, "All-Star": 6, "Starter": 13, "Reserve": 0, "Replacement": 0, } elif game_count <= 249: max_counts = { "Hall of Fame": 3, "MVP": 4, "All-Star": 7, "Starter": 12, "Reserve": 0, "Replacement": 0, } else: max_counts = { "Hall of Fame": 3, "MVP": 5, "All-Star": 7, "Starter": 11, "Reserve": 0, "Replacement": 0, } logger.info(f"gauntlets.py - run_draft / max_counts: {max_counts}") round_num = 1 counter = 0 view = helpers.Confirm([interaction.user]) if this_event["id"] == 1: view.confirm.label = "Let's a-Go!" else: view.confirm.label = "Let's Go!" intro_embed = await get_embed(this_event=this_event) intro_embed.title += " - Are you ready?" await interaction.edit_original_response(content=None, embed=intro_embed, view=view) await view.wait() if not view.value: await interaction.edit_original_response( content=None, embed=intro_embed, view=None ) await interaction.channel.send("You'll be back") raise ZeroDivisionError() else: await interaction.edit_original_response( content=None, embed=intro_embed, view=None ) def get_embeds(include_links=True, round_num=1): 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 = { "Hall of Fame": "", "MVP": "", "All-Star": "", "Starter": "", "Reserve": "", "Replacement": "", "C": "", "1B": "", "2B": "", "3B": "", "SS": "", "LF": "", "CF": "", "RF": "", "DH": "", "SP": "", "RP": "", "CP": "", } for y in all_players: if include_links: name_string = f"[{helpers.player_desc(y)}]({y['image']})" else: name_string = f"{helpers.player_desc(y)}" all_str[y["rarity"]["name"]] += f"{name_string}\n" for z in helpers.get_all_pos(y): all_str[z] += f"{name_string}\n" if max_counts["Hall of Fame"] > 0: top_embed.add_field( name=f"HoFs ({counts['Hall of Fame']}/{max_counts['Hall of Fame']})", value=all_str["Hall of Fame"], inline=False, ) if max_counts["MVP"] > 0: top_embed.add_field( name=f"MVPs ({counts['MVP']}/{max_counts['MVP']})", value=all_str["MVP"], inline=False, ) if max_counts["All-Star"] > 0: top_embed.add_field( name=f"All-Stars ({counts['All-Star']}/{max_counts['All-Star']})", value=all_str["All-Star"], inline=False, ) if max_counts["Starter"] > 0: top_embed.add_field( name=f"Starters ({counts['Starter']}/{max_counts['Starter']})", value=all_str["Starter"], inline=False, ) if max_counts["Reserve"] > 0: top_embed.add_field( name=f"Reserves ({counts['Reserve']}/{max_counts['Reserve']})", value=all_str["Reserve"], inline=False, ) if max_counts["Replacement"] > 0: top_embed.add_field( name=f"Replacements ({counts['Replacement']}/{max_counts['Replacement']})", 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] logger.info(f"getting last message") last_message = await interaction.channel.send( content=None, embeds=get_embeds(include_links=False) ) async def draft_loop(): round_num = 1 counter = 0 while round_num <= 26 and counter < 50: counter += 1 params = copy.deepcopy(base_params) logger.info( f"gauntlets.py - run_draft - event_id {this_event['id']} / round_num: {round_num} / counter: {counter} / counts: {counts} / max_counts: {max_counts}" ) # Set rarity based on remaining counts if counts["Hall of Fame"] < max_counts["Hall of Fame"]: params.extend( [("min_rarity", RARITY["HoF"]), ("max_rarity", RARITY["HoF"])] ) elif counts["MVP"] < max_counts["MVP"]: params.extend( [("min_rarity", RARITY["MVP"]), ("max_rarity", RARITY["MVP"])] ) elif counts["All-Star"] < max_counts["All-Star"]: params.extend( [ ("min_rarity", RARITY["All-Star"]), ("max_rarity", RARITY["All-Star"]), ] ) elif counts["Starter"] < max_counts["Starter"]: params.extend( [ ("min_rarity", RARITY["Starter"]), ("max_rarity", RARITY["Starter"]), ] ) elif counts["Reserve"] < max_counts["Reserve"]: params.extend( [ ("min_rarity", RARITY["Reserve"]), ("max_rarity", RARITY["Reserve"]), ] ) else: params.extend( [ ("min_rarity", RARITY["Replacement"]), ("max_rarity", RARITY["Replacement"]), ] ) this_batch = [] for x in ["SP", "RP", "IF", "OF"]: # Slot 1 - SP if x == "SP": if counts["SP"] > 5: slot_params = [("pos_exc", "SP")] if counts["RP"] > 7: slot_params = [("pos_exc", "RP")] else: slot_params = [("pos_inc", "SP")] # if counts['SP'] > 5: # slot_params = [('pos_exc', 'SP')] # elif counts['RP'] < 6: # slot_params = [('pos_inc', 'RP')] # else: # slot_params = [('pos_exc', 'SP'), ('pos_exc', 'RP')] # Slot 2 - RP elif x == "RP": logger.info(f"counts[RP]: {counts['RP']}") if counts["RP"] > 7: slot_params = [("pos_exc", "RP")] if counts["SP"] > 5: slot_params = [("pos_exc", "SP")] else: slot_params = [("pos_inc", "RP")] # Slot 3 - IF elif x == "IF": slot_params = [] for y in ["1B", "2B", "3B", "SS", "C"]: if (counts[y] > 1) and 0 in [ counts["C"], counts["1B"], counts["2B"], counts["3B"], counts["SS"], ]: slot_params.append(("pos_exc", y)) elif (y == "C" and counts["C"] < 3) or ( y != "C" and counts[y] < 4 ): slot_params.append(("pos_inc", y)) # if counts['C'] < 2: # slot_params.append(('pos_inc', 'C')) # if len(slot_params) == 0: # slot_params = [('pos_exc', 'C'), ('pos_exc', '1B'), ('pos_exc', '2B'), ('pos_exc', '3B'), # ('pos_exc', 'SS')] # Slot 4 - OF else: slot_params = [] for y in ["LF", "CF", "RF"]: if counts[y] > 4: slot_params.append(("pos_exc", y)) elif counts[y] > 1 and 0 in [ counts["LF"], counts["CF"], counts["RF"], ]: slot_params.append(("pos_exc", y)) elif counts[y] < 5: slot_params.append(("pos_inc", y)) # if len(slot_params) == 0: # slot_params = [('pos_exc', 'LF'), ('pos_exc', 'CF'), ('pos_exc', 'RF')] logger.info(f"this_batch: {this_batch}") logger.info(f"slot_params: {slot_params}") logger.info(f"params: {params}") # No position explicitly requested or denied if len(slot_params) == 0: if (counts["SP"] + counts["RP"]) > ( counts["C"] + counts["1B"] + counts["2B"] + counts["SS"] + counts["LF"] + counts["CF"] + counts["RF"] ): pos_counts = [ ("C", counts["C"]), ("1B", counts["1B"]), ("2B", counts["2B"]), ("3B", counts["3B"]), ("SS", counts["SS"]), ("LF", counts["LF"]), ("CF", counts["CF"]), ("RF", counts["RF"]), ] pos_counts.sort(key=lambda z: z[1]) slot_params = [("pos_inc", pos_counts[0][0])] else: if counts["SP"] >= counts["RP"]: slot_params = [("pos_inc", "RP")] else: slot_params = [("pos_inc", "SP")] slot_params.extend(params) p_query = await db_get("players/random", params=slot_params, timeout=10) # Fallback for Event 9 RP shortage if this_event["id"] == 9 and x == "RP" and p_query["count"] < 3: logger.warning( f"Low RP count ({p_query['count']}) in Event 9, expanding cardsets to 24, 25, 26" ) fallback_params = [p for p in slot_params if p[0] != "cardset_id"] fallback_params.extend( [("cardset_id", 24), ("cardset_id", 25), ("cardset_id", 26)] ) p_query = await db_get( "players/random", params=fallback_params, timeout=10 ) logger.info( f"Fallback query returned {p_query['count']} RP options" ) if p_query["count"] > 0: # test_player_list = '' # for z in p_query['players']: # test_player_list += f'{z["rarity"]["name"]} - {z["description"]} - {helpers.get_all_pos(x)}\n' # Collect 1 cards with no repeat player names for i in p_query["players"]: if i["p_name"] not in p_names and i not in this_batch: this_batch.append(i) break if len(this_batch) < 4: logger.error(f"Pulled less than 4 players in gauntlet draft") p_query = await db_get("players/random", params=params, timeout=10) for i in p_query["players"]: if i["p_name"] not in p_names and i not in this_batch: this_batch.append(i) if len(this_batch) >= 4: break if len(this_batch) < 4: raise KeyError( f"This is embarassing, but I couldn't find enough players for you to draft from." ) # 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) if p_choice["pos_1"] in ["SP", "RP"]: counts[p_choice["pos_1"]] += 1 else: for x in helpers.get_all_pos(p_choice): if x in counts: counts[x] += 1 # Update roster embed round_num += 1 await last_message.edit( content=None, embeds=get_embeds(include_links=False, round_num=round_num), ) logger.info(f"going into draft") backyard_round = None custom_player_round = None if this_event["id"] == 1: mario_round = None while round_num <= 26 and counter < 50: counter += 1 params = copy.deepcopy(base_params) # Set rarity param based on round number if round_num == 1: params.extend( [("min_rarity", RARITY["MVP"]), ("max_rarity", RARITY["MVP"])] ) 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 == 6: if random.randint(1, 2) == 1: params = [ ("min_rarity", RARITY["MVP"]), ("max_rarity", RARITY["MVP"]), ("cardset_id", 8), ] mario_round = 6 else: params.extend( [ ("min_rarity", RARITY["MVP"]), ("max_rarity", RARITY["MVP"]), ("pos_exc", "RP"), ] ) elif round_num == 7: if random.randint(1, 2) == 1 and mario_round is None: params = [ ("min_rarity", RARITY["All-Star"]), ("max_rarity", RARITY["All-Star"]), ("cardset_id", 8), ] mario_round = 7 else: params.extend( [ ("min_rarity", RARITY["All-Star"]), ("max_rarity", RARITY["All-Star"]), ] ) elif round_num == 8: if mario_round is None: params = [ ("min_rarity", RARITY["Starter"]), ("max_rarity", RARITY["Starter"]), ("cardset_id", 8), ] mario_round = 12 else: params.extend( [ ("min_rarity", RARITY["Starter"]), ("max_rarity", RARITY["Starter"]), ] ) elif round_num <= 11: params.extend( [ ("min_rarity", RARITY["Starter"]), ("max_rarity", RARITY["Starter"]), ] ) elif round_num <= 15: params.extend( [ ("min_rarity", RARITY["Reserve"]), ("max_rarity", RARITY["Reserve"]), ] ) elif round_num <= 18: params.extend( [ ("min_rarity", RARITY["Replacement"]), ("max_rarity", RARITY["Replacement"]), ] ) 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"]), ] ) this_batch = [] for x in ["SP", "RP", "IF", "OF"]: # Slot 1 - SP if x == "SP": if counts["SP"] < 6: slot_params = [("pos_inc", "SP")] elif counts["RP"] < 6: slot_params = [("pos_inc", "RP")] else: slot_params = [("pos_exc", "SP"), ("pos_exc", "RP")] # Slot 2 - RP elif x == "RP": logger.info(f"counts[RP]: {counts['RP']}") if counts["RP"] < 8: slot_params = [("pos_inc", "RP")] elif counts["SP"] < 4: slot_params = [("pos_inc", "SP")] else: slot_params = [("pos_exc", "SP"), ("pos_exc", "RP")] # Slot 3 - IF elif x == "IF": slot_params = [] for y in ["1B", "2B", "3B", "SS"]: if (counts[y] == 2 or counts[y] == 3) and 0 not in [ counts["C"], counts["1B"], counts["2B"], counts["3B"], counts["SS"], counts["LF"], counts["CF"], counts["RF"], ]: slot_params.append(("pos_inc", y)) elif counts[y] < 4: slot_params.append(("pos_inc", y)) if counts["C"] < 2: slot_params.append(("pos_inc", "C")) if len(slot_params) == 0: slot_params = [ ("pos_exc", "C"), ("pos_exc", "1B"), ("pos_exc", "2B"), ("pos_exc", "3B"), ("pos_exc", "SS"), ] # Slot 4 - OF else: slot_params = [] for y in ["LF", "CF", "RF"]: if counts[y] > 4: pass elif counts[y] > 2 and 0 not in [ counts["LF"], counts["CF"], counts["RF"], ]: slot_params.append(("pos_inc", y)) elif counts[y] < 3: slot_params.append(("pos_inc", y)) if len(slot_params) == 0: slot_params = [ ("pos_exc", "LF"), ("pos_exc", "CF"), ("pos_exc", "RF"), ] logger.info(f"this_batch: {this_batch}") logger.info(f"slot_params: {slot_params}") logger.info(f"params: {params}") slot_params.extend(params) p_query = await db_get("players/random", params=slot_params, timeout=10) if p_query["count"] > 0: # test_player_list = '' # for z in p_query['players']: # test_player_list += f'{z["rarity"]["name"]} - {z["description"]} - {helpers.get_all_pos(x)}\n' # Collect 1 cards with no repeat player names for i in p_query["players"]: if i["p_name"] not in p_names and i not in this_batch: this_batch.append(i) break if len(this_batch) < 4: logger.error(f"Pulled less than 4 players in gauntlet draft") p_query = await db_get("players/random", params=params, timeout=10) for i in p_query["players"]: if i["p_name"] not in p_names and i not in this_batch: this_batch.append(i) if len(this_batch) >= 4: break if len(this_batch) < 4: raise KeyError( f"This is embarassing, but I couldn't find enough players for you to draft from." ) # 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) if p_choice["pos_1"] in ["SP", "RP"]: counts[p_choice["pos_1"]] += 1 else: for x in helpers.get_all_pos(p_choice): if x in counts: counts[x] += 1 # Update roster embed round_num += 1 await last_message.edit( content=None, embeds=get_embeds(include_links=False) ) elif this_event["id"] == 2: while round_num <= 26 and counter < 50: counter += 1 params = copy.deepcopy(base_params) # Set rarity param based on round number if round_num == 1: params.extend( [("min_rarity", RARITY["MVP"]), ("max_rarity", RARITY["MVP"])] ) 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 == 6: params.extend( [ ("min_rarity", RARITY["MVP"]), ("max_rarity", RARITY["MVP"]), ("pos_exc", "RP"), ] ) elif round_num == 7: params.extend( [ ("min_rarity", RARITY["All-Star"]), ("max_rarity", RARITY["All-Star"]), ] ) elif round_num <= 11: params.extend( [ ("min_rarity", RARITY["Starter"]), ("max_rarity", RARITY["Starter"]), ] ) elif round_num <= 15: params.extend( [ ("min_rarity", RARITY["Reserve"]), ("max_rarity", RARITY["Reserve"]), ] ) elif round_num <= 18: params.extend( [ ("min_rarity", RARITY["Replacement"]), ("max_rarity", RARITY["Replacement"]), ] ) 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"]), ] ) this_batch = [] for x in ["SP", "RP", "IF", "OF"]: # Slot 1 - SP if x == "SP": if counts["SP"] > 5: slot_params = [("pos_exc", "RP")] if counts["RP"] > 7: slot_params = [("pos_exc", "SP")] else: slot_params = [("pos_inc", "SP")] # if counts['SP'] > 5: # slot_params = [('pos_exc', 'SP')] # elif counts['RP'] < 6: # slot_params = [('pos_inc', 'RP')] # else: # slot_params = [('pos_exc', 'SP'), ('pos_exc', 'RP')] # Slot 2 - RP elif x == "RP": logger.info(f"counts[RP]: {counts['RP']}") if counts["RP"] > 7: slot_params = [("pos_exc", "RP")] if counts["SP"] > 5: slot_params = [("pos_exc", "SP")] else: slot_params = [("pos_inc", "RP")] # Slot 3 - IF elif x == "IF": slot_params = [] for y in ["1B", "2B", "3B", "SS", "C"]: if (counts[y] > 1) and 0 in [ counts["C"], counts["1B"], counts["2B"], counts["3B"], counts["SS"], ]: slot_params.append(("pos_exc", y)) elif (y == "C" and counts["C"] < 3) or ( y != "C" and counts[y] < 4 ): slot_params.append(("pos_inc", y)) # if counts['C'] < 2: # slot_params.append(('pos_inc', 'C')) # if len(slot_params) == 0: # slot_params = [('pos_exc', 'C'), ('pos_exc', '1B'), ('pos_exc', '2B'), ('pos_exc', '3B'), # ('pos_exc', 'SS')] # Slot 4 - OF else: slot_params = [] for y in ["LF", "CF", "RF"]: if counts[y] > 4: slot_params.append(("pos_exc", y)) elif counts[y] > 1 and 0 in [ counts["LF"], counts["CF"], counts["RF"], ]: slot_params.append(("pos_exc", y)) elif counts[y] < 5: slot_params.append(("pos_inc", y)) # if len(slot_params) == 0: # slot_params = [('pos_exc', 'LF'), ('pos_exc', 'CF'), ('pos_exc', 'RF')] logger.info(f"this_batch: {this_batch}") logger.info(f"slot_params: {slot_params}") logger.info(f"params: {params}") # No position explicitly requested or denied if len(slot_params) == 0: if (counts["SP"] + counts["RP"]) > ( counts["C"] + counts["1B"] + counts["2B"] + counts["SS"] + counts["LF"] + counts["CF"] + counts["RF"] ): pos_counts = [ ("C", counts["C"]), ("1B", counts["1B"]), ("2B", counts["2B"]), ("3B", counts["3B"]), ("SS", counts["SS"]), ("LF", counts["LF"]), ("CF", counts["CF"]), ("RF", counts["RF"]), ] pos_counts.sort(key=lambda z: z[1]) slot_params = [("pos_inc", pos_counts[0][0])] else: if counts["SP"] >= counts["RP"]: slot_params = [("pos_inc", "RP")] else: slot_params = [("pos_inc", "SP")] slot_params.extend(params) p_query = await db_get("players/random", params=slot_params, timeout=10) if p_query["count"] > 0: # test_player_list = '' # for z in p_query['players']: # test_player_list += f'{z["rarity"]["name"]} - {z["description"]} - {helpers.get_all_pos(x)}\n' # Collect 1 cards with no repeat player names for i in p_query["players"]: if i["p_name"] not in p_names and i not in this_batch: this_batch.append(i) break if len(this_batch) < 4: logger.error(f"Pulled less than 4 players in gauntlet draft") p_query = await db_get("players/random", params=params, timeout=10) for i in p_query["players"]: if i["p_name"] not in p_names and i not in this_batch: this_batch.append(i) if len(this_batch) >= 4: break if len(this_batch) < 4: raise KeyError( f"This is embarassing, but I couldn't find enough players for you to draft from." ) # 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) if p_choice["pos_1"] in ["SP", "RP"]: counts[p_choice["pos_1"]] += 1 else: for x in helpers.get_all_pos(p_choice): if x in counts: counts[x] += 1 # Update roster embed round_num += 1 await last_message.edit( content=None, embeds=get_embeds(include_links=False) ) elif this_event["id"] == 3: while round_num <= 26 and counter < 50: logger.info(f"round {round_num}") counter += 1 params = copy.deepcopy(base_params) # Set rarity param based on round number if round_num == 1: params.extend( [("min_rarity", RARITY["HoF"]), ("max_rarity", RARITY["HoF"])] ) 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 == 6: params.extend( [ ("min_rarity", RARITY["MVP"]), ("max_rarity", RARITY["MVP"]), ("pos_exc", "RP"), ] ) elif round_num == 7: params.extend( [ ("min_rarity", RARITY["All-Star"]), ("max_rarity", RARITY["All-Star"]), ] ) elif round_num <= 11: params.extend( [ ("min_rarity", RARITY["Starter"]), ("max_rarity", RARITY["Starter"]), ] ) elif round_num <= 15: params.extend( [ ("min_rarity", RARITY["Reserve"]), ("max_rarity", RARITY["Reserve"]), ] ) elif round_num <= 18: params.extend( [ ("min_rarity", RARITY["Replacement"]), ("max_rarity", RARITY["Replacement"]), ] ) 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"]), ] ) logger.info(f"starting position loop") this_batch = [] for x in ["SP", "RP", "IF", "OF"]: # Slot 1 - SP if x == "SP": if counts["SP"] > 5: slot_params = [("pos_exc", "RP")] if counts["RP"] > 7: slot_params = [("pos_exc", "SP")] else: slot_params = [("pos_inc", "SP")] # if counts['SP'] > 5: # slot_params = [('pos_exc', 'SP')] # elif counts['RP'] < 6: # slot_params = [('pos_inc', 'RP')] # else: # slot_params = [('pos_exc', 'SP'), ('pos_exc', 'RP')] # Slot 2 - RP elif x == "RP": logger.info(f"counts[RP]: {counts['RP']}") if counts["RP"] > 7: slot_params = [("pos_exc", "RP")] if counts["SP"] > 5: slot_params = [("pos_exc", "SP")] else: slot_params = [("pos_inc", "RP")] # Slot 3 - IF elif x == "IF": slot_params = [] for y in ["1B", "2B", "3B", "SS", "C"]: if (counts[y] > 1) and 0 in [ counts["C"], counts["1B"], counts["2B"], counts["3B"], counts["SS"], ]: slot_params.append(("pos_exc", y)) elif (y == "C" and counts["C"] < 3) or ( y != "C" and counts[y] < 4 ): slot_params.append(("pos_inc", y)) # if counts['C'] < 2: # slot_params.append(('pos_inc', 'C')) # if len(slot_params) == 0: # slot_params = [('pos_exc', 'C'), ('pos_exc', '1B'), ('pos_exc', '2B'), ('pos_exc', '3B'), # ('pos_exc', 'SS')] # Slot 4 - OF else: slot_params = [] for y in ["LF", "CF", "RF"]: if counts[y] > 4: slot_params.append(("pos_exc", y)) elif counts[y] > 1 and 0 in [ counts["LF"], counts["CF"], counts["RF"], ]: slot_params.append(("pos_exc", y)) elif counts[y] < 5: slot_params.append(("pos_inc", y)) # if len(slot_params) == 0: # slot_params = [('pos_exc', 'LF'), ('pos_exc', 'CF'), ('pos_exc', 'RF')] logger.info(f"this_batch: {this_batch}") logger.info(f"slot_params: {slot_params}") logger.info(f"params: {params}") # No position explicitly requested or denied if len(slot_params) == 0: if (counts["SP"] + counts["RP"]) > ( counts["C"] + counts["1B"] + counts["2B"] + counts["SS"] + counts["LF"] + counts["CF"] + counts["RF"] ): pos_counts = [ ("C", counts["C"]), ("1B", counts["1B"]), ("2B", counts["2B"]), ("3B", counts["3B"]), ("SS", counts["SS"]), ("LF", counts["LF"]), ("CF", counts["CF"]), ("RF", counts["RF"]), ] pos_counts.sort(key=lambda z: z[1]) slot_params = [("pos_inc", pos_counts[0][0])] else: if counts["SP"] >= counts["RP"]: slot_params = [("pos_inc", "RP")] else: slot_params = [("pos_inc", "SP")] slot_params.extend(params) p_query = await db_get("players/random", params=slot_params, timeout=10) if p_query["count"] > 0: # test_player_list = '' # for z in p_query['players']: # test_player_list += f'{z["rarity"]["name"]} - {z["description"]} - {helpers.get_all_pos(x)}\n' # Collect 1 cards with no repeat player names for i in p_query["players"]: if i["p_name"] not in p_names and i not in this_batch: this_batch.append(i) break if len(this_batch) < 4: logger.error(f"Pulled less than 4 players in gauntlet draft") p_query = await db_get("players/random", params=params, timeout=10) for i in p_query["players"]: if i["p_name"] not in p_names and i not in this_batch: this_batch.append(i) if len(this_batch) >= 4: break if len(this_batch) < 4: raise KeyError( f"This is embarassing, but I couldn't find enough players for you to draft from." ) # 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) if p_choice["pos_1"] in ["SP", "RP"]: counts[p_choice["pos_1"]] += 1 else: for x in helpers.get_all_pos(p_choice): if x in counts: counts[x] += 1 # Update roster embed round_num += 1 await last_message.edit( content=None, embeds=get_embeds(include_links=False) ) elif this_event["id"] == 4: while round_num <= 26 and counter < 50: counter += 1 params = copy.deepcopy(base_params) # Set rarity param based on round number if round_num == 1: params.extend( [("min_rarity", RARITY["HoF"]), ("max_rarity", RARITY["HoF"])] ) 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 == 6: if random.randint(1, 2) == 1: params = [ ("min_rarity", RARITY["MVP"]), ("max_rarity", RARITY["MVP"]), ("cardset_id", 16), ] backyard_round = 6 else: params.extend( [ ("min_rarity", RARITY["MVP"]), ("max_rarity", RARITY["MVP"]), ("pos_exc", "RP"), ] ) elif round_num == 7: if random.randint(1, 2) == 1 and backyard_round is None: params = [ ("min_rarity", RARITY["All-Star"]), ("max_rarity", RARITY["All-Star"]), ("cardset_id", 16), ] backyard_round = 7 else: params.extend( [ ("min_rarity", RARITY["All-Star"]), ("max_rarity", RARITY["All-Star"]), ] ) elif round_num == 8: if backyard_round is None: params = [ ("min_rarity", RARITY["Starter"]), ("max_rarity", RARITY["Starter"]), ("cardset_id", 16), ] backyard_round = 8 else: params.extend( [ ("min_rarity", RARITY["Starter"]), ("max_rarity", RARITY["Starter"]), ] ) elif round_num <= 11: params.extend( [ ("min_rarity", RARITY["Starter"]), ("max_rarity", RARITY["Starter"]), ] ) elif round_num <= 15: params.extend( [ ("min_rarity", RARITY["Reserve"]), ("max_rarity", RARITY["Reserve"]), ] ) elif round_num <= 18: params.extend( [ ("min_rarity", RARITY["Replacement"]), ("max_rarity", RARITY["Replacement"]), ] ) 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"]), ] ) this_batch = [] for x in ["SP", "RP", "IF", "OF"]: # Slot 1 - SP if x == "SP": if counts["SP"] > 5: slot_params = [("pos_exc", "SP")] if counts["RP"] > 7: slot_params = [("pos_exc", "RP")] else: slot_params = [("pos_inc", "SP")] # if counts['SP'] > 5: # slot_params = [('pos_exc', 'SP')] # elif counts['RP'] < 6: # slot_params = [('pos_inc', 'RP')] # else: # slot_params = [('pos_exc', 'SP'), ('pos_exc', 'RP')] # Slot 2 - RP elif x == "RP": logger.info(f"counts[RP]: {counts['RP']}") if counts["RP"] > 7: slot_params = [("pos_exc", "RP")] if counts["SP"] > 5: slot_params = [("pos_exc", "SP")] else: slot_params = [("pos_inc", "RP")] # Slot 3 - IF elif x == "IF": slot_params = [] for y in ["1B", "2B", "3B", "SS", "C"]: if (counts[y] > 1) and 0 in [ counts["C"], counts["1B"], counts["2B"], counts["3B"], counts["SS"], ]: slot_params.append(("pos_exc", y)) elif (y == "C" and counts["C"] < 3) or ( y != "C" and counts[y] < 4 ): slot_params.append(("pos_inc", y)) # if counts['C'] < 2: # slot_params.append(('pos_inc', 'C')) # if len(slot_params) == 0: # slot_params = [('pos_exc', 'C'), ('pos_exc', '1B'), ('pos_exc', '2B'), ('pos_exc', '3B'), # ('pos_exc', 'SS')] # Slot 4 - OF else: slot_params = [] for y in ["LF", "CF", "RF"]: if counts[y] > 4: slot_params.append(("pos_exc", y)) elif counts[y] > 1 and 0 in [ counts["LF"], counts["CF"], counts["RF"], ]: slot_params.append(("pos_exc", y)) elif counts[y] < 5: slot_params.append(("pos_inc", y)) # if len(slot_params) == 0: # slot_params = [('pos_exc', 'LF'), ('pos_exc', 'CF'), ('pos_exc', 'RF')] logger.info(f"this_batch: {this_batch}") logger.info(f"slot_params: {slot_params}") logger.info(f"params: {params}") # No position explicitly requested or denied if len(slot_params) == 0: if (counts["SP"] + counts["RP"]) > ( counts["C"] + counts["1B"] + counts["2B"] + counts["SS"] + counts["LF"] + counts["CF"] + counts["RF"] ): pos_counts = [ ("C", counts["C"]), ("1B", counts["1B"]), ("2B", counts["2B"]), ("3B", counts["3B"]), ("SS", counts["SS"]), ("LF", counts["LF"]), ("CF", counts["CF"]), ("RF", counts["RF"]), ] pos_counts.sort(key=lambda z: z[1]) slot_params = [("pos_inc", pos_counts[0][0])] else: if counts["SP"] >= counts["RP"]: slot_params = [("pos_inc", "RP")] else: slot_params = [("pos_inc", "SP")] slot_params.extend(params) p_query = await db_get("players/random", params=slot_params, timeout=10) if p_query["count"] > 0: # test_player_list = '' # for z in p_query['players']: # test_player_list += f'{z["rarity"]["name"]} - {z["description"]} - {helpers.get_all_pos(x)}\n' # Collect 1 cards with no repeat player names for i in p_query["players"]: if i["p_name"] not in p_names and i not in this_batch: this_batch.append(i) break if len(this_batch) < 4: logger.error(f"Pulled less than 4 players in gauntlet draft") p_query = await db_get("players/random", params=params, timeout=10) for i in p_query["players"]: if i["p_name"] not in p_names and i not in this_batch: this_batch.append(i) if len(this_batch) >= 4: break if len(this_batch) < 4: raise KeyError( f"This is embarassing, but I couldn't find enough players for you to draft from." ) # 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) if p_choice["pos_1"] in ["SP", "RP"]: counts[p_choice["pos_1"]] += 1 else: for x in helpers.get_all_pos(p_choice): if x in counts: counts[x] += 1 # Update roster embed round_num += 1 await last_message.edit( content=None, embeds=get_embeds(include_links=False) ) elif this_event["id"] in [5, 6, 8, 9]: await draft_loop() elif this_event["id"] == 7: round_num = 1 counter = 0 while round_num <= 26 and counter < 50: counter += 1 params = copy.deepcopy(base_params) logger.info( f"gauntlets.py - run_draft - event_id {this_event['id']} / round_num: {round_num} / counter: {counter} / counts: {counts} / max_counts: {max_counts}" ) # Set rarity based on remaining counts if counts["Hall of Fame"] < max_counts["Hall of Fame"]: params.extend( [("min_rarity", RARITY["HoF"]), ("max_rarity", RARITY["HoF"])] ) elif counts["MVP"] < max_counts["MVP"]: params.extend( [("min_rarity", RARITY["MVP"]), ("max_rarity", RARITY["MVP"])] ) elif counts["All-Star"] < max_counts["All-Star"]: params.extend( [ ("min_rarity", RARITY["All-Star"]), ("max_rarity", RARITY["All-Star"]), ] ) elif counts["Starter"] < max_counts["Starter"]: if counts["Starter"] < 5: params = [("cardset_id", 23), ("limit", 16)] params.extend( [ ("min_rarity", RARITY["Starter"]), ("max_rarity", RARITY["Starter"]), ] ) elif counts["Reserve"] < max_counts["Reserve"]: params.extend( [ ("min_rarity", RARITY["Reserve"]), ("max_rarity", RARITY["Reserve"]), ] ) else: params.extend( [ ("min_rarity", RARITY["Replacement"]), ("max_rarity", RARITY["Replacement"]), ] ) this_batch = [] for x in ["SP", "RP", "IF", "OF"]: # Slot 1 - SP if x == "SP": if counts["SP"] > 5: slot_params = [("pos_exc", "SP")] if counts["RP"] > 7: slot_params = [("pos_exc", "RP")] else: slot_params = [("pos_inc", "SP")] # if counts['SP'] > 5: # slot_params = [('pos_exc', 'SP')] # elif counts['RP'] < 6: # slot_params = [('pos_inc', 'RP')] # else: # slot_params = [('pos_exc', 'SP'), ('pos_exc', 'RP')] # Slot 2 - RP elif x == "RP": logger.info(f"counts[RP]: {counts['RP']}") if counts["RP"] > 7: slot_params = [("pos_exc", "RP")] if counts["SP"] > 5: slot_params = [("pos_exc", "SP")] else: slot_params = [("pos_inc", "RP")] # Slot 3 - IF elif x == "IF": slot_params = [] for y in ["1B", "2B", "3B", "SS", "C"]: if (counts[y] > 1) and 0 in [ counts["C"], counts["1B"], counts["2B"], counts["3B"], counts["SS"], ]: slot_params.append(("pos_exc", y)) elif (y == "C" and counts["C"] < 3) or ( y != "C" and counts[y] < 4 ): slot_params.append(("pos_inc", y)) # if counts['C'] < 2: # slot_params.append(('pos_inc', 'C')) # if len(slot_params) == 0: # slot_params = [('pos_exc', 'C'), ('pos_exc', '1B'), ('pos_exc', '2B'), ('pos_exc', '3B'), # ('pos_exc', 'SS')] # Slot 4 - OF else: slot_params = [] for y in ["LF", "CF", "RF"]: if counts[y] > 4: slot_params.append(("pos_exc", y)) elif counts[y] > 1 and 0 in [ counts["LF"], counts["CF"], counts["RF"], ]: slot_params.append(("pos_exc", y)) elif counts[y] < 5: slot_params.append(("pos_inc", y)) # if len(slot_params) == 0: # slot_params = [('pos_exc', 'LF'), ('pos_exc', 'CF'), ('pos_exc', 'RF')] logger.info(f"this_batch: {this_batch}") logger.info(f"slot_params: {slot_params}") logger.info(f"params: {params}") # No position explicitly requested or denied if len(slot_params) == 0: if (counts["SP"] + counts["RP"]) > ( counts["C"] + counts["1B"] + counts["2B"] + counts["SS"] + counts["LF"] + counts["CF"] + counts["RF"] ): pos_counts = [ ("C", counts["C"]), ("1B", counts["1B"]), ("2B", counts["2B"]), ("3B", counts["3B"]), ("SS", counts["SS"]), ("LF", counts["LF"]), ("CF", counts["CF"]), ("RF", counts["RF"]), ] pos_counts.sort(key=lambda z: z[1]) slot_params = [("pos_inc", pos_counts[0][0])] else: if counts["SP"] >= counts["RP"]: slot_params = [("pos_inc", "RP")] else: slot_params = [("pos_inc", "SP")] slot_params.extend(params) p_query = await db_get("players/random", params=slot_params, timeout=10) if p_query["count"] > 0: for i in p_query["players"]: if i["p_name"] not in p_names and i not in this_batch: if ( i["cardset"]["id"] == 23 and "420420" not in i["strat_code"] ): pass else: this_batch.append(i) break if len(this_batch) < 4: logger.error(f"Pulled less than 4 players in gauntlet draft") p_query = await db_get("players/random", params=params, timeout=10) for i in p_query["players"]: if i["p_name"] not in p_names and i not in this_batch: this_batch.append(i) if len(this_batch) >= 4: break if len(this_batch) < 4: raise KeyError( f"This is embarassing, but I couldn't find enough players for you to draft from." ) # 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) if p_choice["pos_1"] in ["SP", "RP"]: counts[p_choice["pos_1"]] += 1 else: for x in helpers.get_all_pos(p_choice): if x in counts: counts[x] += 1 # Update roster embed round_num += 1 await last_message.edit( content=None, embeds=get_embeds(include_links=False, round_num=round_num), ) else: logger.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']}") if len(all_players) < 26: raise KeyError( f"I gotta be honest - I shit the bed here and wasn't able to get you enough players to fill " f"a team. I have to wipe this team, but please draft again after you tell Cal his bot sucks." ) # Handle draft_team as either Team object or dict draft_team_id = draft_team.id if isinstance(draft_team, Team) else draft_team["id"] this_pack = await db_post( "packs/one", payload={ "team_id": draft_team_id, "pack_type_id": 2, "open_time": datetime.datetime.timestamp(datetime.datetime.now()) * 1000, }, ) await 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 ] }, ) await db_post( "gauntletruns", payload={"team_id": draft_team_id, "gauntlet_id": this_event["id"]}, ) final_embed = get_embeds(False)[0] final_embed.title = f"{main_team.lname} - {this_event['name']} Draft" if main_team.logo: final_embed.set_thumbnail(url=main_team.logo) return final_embed async def get_embed(this_run=None, this_event=None, this_team=None): logger.info(f"get_embed - this_run:\n{this_run}\n\nthis_event:\n{this_event}") if this_run is None and this_event is None: raise KeyError("Must provide either a run or an event to get_embed") if this_run is not None: this_event = this_run["gauntlet"] embed = helpers.image_embed( image_url=this_event["url"], title=f"{this_event['name']}", ) if this_run is not None and this_run["team"]["logo"]: embed.set_thumbnail(url=this_run["team"]["logo"]) embed.description = this_run["team"]["lname"] embed.add_field(name="Event Info", value=this_event["short_desc"], inline=False) if this_run is not None: embed.add_field( name="Current Record", value=f"{this_run['wins']}-{this_run['losses']}", inline=False, ) r_query = await db_get( "gauntletrewards", params=[("gauntlet_id", this_event["id"])] ) reward_string = "" for x in r_query["rewards"]: if this_run is not None: if this_run["wins"] >= x["win_num"] and this_run["losses"] <= x["loss_max"]: reward_string += "✅️ " elif this_run["losses"] > x["loss_max"]: reward_string += "❌ " else: reward_string += "⬜ " reward_string += f"{x['win_num']}{'-0' if x['loss_max'] == 0 else ' Wins'}: " if x["reward"]["money"]: reward_string += f" {x['reward']['money']}₼\n" elif x["reward"]["player"]: reward_string += f" {x['reward']['player']['description']}\n" elif x["reward"]["pack_type"]: reward_string += f" {x['reward']['pack_type']['name']} Pack\n" if len(reward_string) > 0: embed.add_field(name="Rewards", value=reward_string) if this_team is not None: run_query = await db_get( "gauntletruns", params=[("team_id", this_team["id"]), ("gauntlet_id", this_event["id"])], ) record_name = f"{this_team['abbrev'].split('-')[1]} Record" else: run_query = await db_get( "gauntletruns", params=[("gauntlet_id", this_event["id"])] ) record_name = f"League Record" record_value = "" if run_query["count"] > 0: max_wins, victories, perfects = 0, 0, 0 record_value += f"Attempts: {run_query['count']}\n" for x in run_query["runs"]: if x["wins"] > max_wins: max_wins = x["wins"] if x["wins"] == 10: victories += 1 if x["losses"] == 0: perfects += 1 if victories > 0: record_value += f"Victories: {victories}\n10-0 Runs: {perfects}" else: record_value += f"Most Wins: {max_wins}" embed.add_field(name=record_name, value=record_value) if this_run is not None: embed.add_field( name="Team Sheet", value=helpers.get_roster_sheet(this_run["team"]), inline=False, ) return embed async def end_run( this_run, this_event, this_team: Team, bot=None, main_team=None, force_end: bool = False, ): l_message = ( f"Tough loss. That brings your {this_event['name']} record to " f"**{this_run['wins']}-{this_run['losses']}**. " ) if this_run["losses"] == 2 or force_end: l_message += "That's the end of this run - better luck next time!" this_run = await db_patch( "gauntletruns", object_id=this_run["id"], params=[("ended", True)] ) c_query = await db_post(f"cards/wipe-team/{this_team.id}") # Send news-ticker message for natural run completion (2 losses), not for manual resets if bot and main_team and this_run["losses"] == 2 and not force_end: team_name = ( main_team.lname if isinstance(main_team, Team) else main_team.get("lname", "Unknown Team") ) await send_to_channel( bot, "pd-news-ticker", content=f"The **{team_name}**'s **{this_event['name']} Gauntlet** run has ended " f"with a final record of {this_run['wins']}-{this_run['losses']}.", ) return l_message async def evolve_pokemon(this_team: Team, channel, responders): c_query = await db_get( "cards", params=[("team_id", this_team.id), ("order_by", "new"), ("limit", 26)] ) logger.info(f"received {c_query['count']} cards, searching now") evolvable_mons = [ x for x in c_query["cards"] if x["player"]["cardset"]["id"] in [23] and x["player"]["fangr_id"] is not None and len(x["player"]["fangr_id"]) > 3 ] logger.info(f"evolvable_mons: {evolvable_mons}") if len(evolvable_mons) > 0: evo_target_options = [ SelectOption( label=f"{x['player']['rarity']['name']} | {x['player']['p_name']}", value=x["id"], ) for x in evolvable_mons ] view = DropdownView( dropdown_objects=[ SelectPokemonEvolution( options=evo_target_options, this_team=this_team, responders=responders, ) ] ) await channel.send( content="What? One of your pokemon is ready to evolve!\n\n-# The selected pokemon will be removed from your team and replaced with its evolution", view=view, ) else: await channel.send("All of your Pokemon are fully evolved!") async def post_result( run_id: int, is_win: bool, this_team: Team, bot, channel, responders: list[discord.User] = None, ): this_run = await db_get("gauntletruns", object_id=run_id) this_event = await db_get("events", object_id=this_run["gauntlet"]["id"]) t_query = await db_get( "teams", params=[("abbrev", f"{this_team.abbrev.replace('Gauntlet-', '')}")] ) main_team = t_query["teams"][0] if is_win: this_run = await db_patch( "gauntletruns", object_id=this_run["id"], params=[ ("wins", this_run["wins"] + 1), ("ended", this_run["wins"] + 1 == 10), ], ) r_query = await db_get( "gauntletrewards", params=[ ("gauntlet_id", this_event["id"]), ("win_num", this_run["wins"]), ("loss_max", this_run["losses"]), ], ) reward_string = "" for x in r_query["rewards"]: if x["reward"]["money"]: await db_post(f"teams/{main_team['id']}/money/{x['reward']['money']}") reward_string += f"- {x['reward']['money']}₼\n" elif x["reward"]["player"]: this_pack = await db_post( "packs/one", payload={ "team_id": main_team["id"], "pack_type_id": 4, "open_time": datetime.datetime.timestamp( datetime.datetime.now() ) * 1000, }, ) await helpers.give_cards_to_team( main_team, player_ids=[x["reward"]["player"]["player_id"]], pack_id=this_pack["id"], ) reward_string += f"- {helpers.player_desc(x['reward']['player'])}\n" elif x["reward"]["pack_type"] and this_event["id"] in [3, 4, 5, 6, 8, 9]: if this_event["id"] == 3: cardset_id = 13 team_id = 58 elif this_event["id"] == 4: cardset_id = 16 team_id = 79 elif this_event["id"] == 5: cardset_id = 17 team_id = None if x["reward"]["pack_type"]["id"] == 9: cardset_id = 18 elif this_event["id"] == 6: cardset_id = 20 team_id = None if x["reward"]["pack_type"]["id"] == 9: cardset_id = 21 elif this_event["id"] == 8: cardset_id = 24 team_id = None if x["reward"]["pack_type"]["id"] == 9: cardset_id = 25 elif this_event["id"] == 9: cardset_id = 27 team_id = None if x["reward"]["pack_type"]["id"] == 9: cardset_id = 26 await db_post( "packs", payload={ "packs": [ { "team_id": main_team["id"], "pack_type_id": x["reward"]["pack_type"]["id"], "pack_cardset_id": cardset_id, "pack_team_id": team_id if x["reward"]["pack_type"]["id"] == 8 else None, } ] }, ) reward_string += f"- 1x {x['reward']['pack_type']['name']} Pack" elif x["reward"]["pack_type"] and this_event["id"] in [7]: if this_event["id"] == 7: cardset_id = 23 team_id = 91 await db_post( "packs", payload={ "packs": [ { "team_id": main_team["id"], "pack_type_id": x["reward"]["pack_type"]["id"], "pack_cardset_id": cardset_id if x["reward"]["pack_type"]["id"] != 8 else None, "pack_team_id": team_id if x["reward"]["pack_type"]["id"] == 8 else None, } ] }, ) reward_string += f"- 1x {x['reward']['pack_type']['name']} Pack" elif x["reward"]["pack_type"]: await helpers.give_packs(main_team, 1, x["reward"]["pack_type"]) reward_string += f"- 1x {x['reward']['pack_type']['name']} Pack" if this_run["wins"] == 10: choas_role = await get_or_create_role( channel, "CHOAS ALERT", mentionable=True ) await send_to_channel( bot, "pd-network-news", content=f"{choas_role.mention}\n\nThe **{this_team.lname}** have completed the " f"**{this_event['name']} Gauntlet** with a record of {this_run['wins']}-" f"{this_run['losses']}!", ) final_message = ( f"That's number 10! Way to go - you have completed the **{this_event['name']} Gauntlet** " f"with a record of {this_run['wins']}-{this_run['losses']}! " ) c_query = await db_post(f"cards/wipe-team/{this_team.id}") else: final_message = ( f"Big win there! Your {this_event['name']} record is now **{this_run['wins']}-" f"{this_run['losses']}**. " ) if len(reward_string) > 0: final_message += f"You earned the following rewards:\n{reward_string}" final_message += f"\n\nGo share the highlights in {get_channel(channel, 'pd-news-ticker').mention}!" await channel.send(content=final_message, embed=await get_embed(this_run)) else: # this_run = await db_patch( # 'gauntletruns', # object_id=this_run['id'], # params=[('losses', this_run['losses'] + 1), ('ended', this_run['losses'] + 1 == 2)] # ) # l_message = f'Tough loss. That brings your {this_event["name"]} record to ' \ # f'**{this_run["wins"]}-{this_run["losses"]}**. ' # if this_run['losses'] == 2: # l_message += 'That\'s the end of this run - better luck next time!' # c_query = await db_post(f'cards/wipe-team/{this_team["id"]}') # this_run = await db_patch( "gauntletruns", object_id=this_run["id"], params=[("losses", this_run["losses"] + 1)], ) l_message = await end_run(this_run, this_event, this_team, bot, main_team) await channel.send(content=l_message, embed=await get_embed(this_run)) # Evolve a card! logger.info( f"Post-game evolution check: Gauntlet ID {this_run['id']} / Wins: {this_run['wins']} / Losses: {this_run['losses']}" ) if this_event["id"] == 7 and this_run["wins"] < 10 and this_run["losses"] < 2: logger.info(f"trying to evolve now") await evolve_pokemon(this_team, channel, responders)