import asyncio import datetime import pathlib import sys from db_calls_card_creation import * from creation_helpers import get_position_string, write_to_csv, ordered_positions, defense_rg, ordered_pitching_positions from exceptions import logger def get_batter_rarity(total_ops): if total_ops < .7: return 'Replacement' elif total_ops < .8: return 'Reserve' elif total_ops < .9: return 'Starter' elif total_ops < 1: return 'All-Star' elif total_ops < 1.2: return 'MVP' else: return 'HoF' def get_pitcher_rarity(total_ops, s_rat): if s_rat > 3: if total_ops <= .4: return 'HoF' elif total_ops <= .475: return 'MVP' elif total_ops <= .53: return 'All-Star' elif total_ops <= .6: return 'Starter' elif total_ops <= .675: return 'Reserve' else: return 'Replacement' else: if total_ops <= .325: return 'HoF' elif total_ops <= .4: return 'MVP' elif total_ops <= .475: return 'All-Star' elif total_ops <= .55: return 'Starter' elif total_ops <= .625: return 'Reserve' else: return 'Replacement' async def main(argv): cardset_name = input(f'What is the name of this Cardset? ') cardset = ScoutCardset.get_or_none(fn.Lower(ScoutCardset.set_title) == cardset_name.lower()) if not cardset: print(f'There is no cardset named **{cardset_name}**.') return else: print(f'Got it! Starting on the {cardset.set_title} cardset.') now = datetime.datetime.now() output_path = pathlib.Path(f'card-output/{cardset.set_title} Cardset/') if not output_path.exists(): output_path.mkdir(parents=True, exist_ok=True) all_players = ScoutPlayer.select() batter_output = [[ 'name', 'hand', 'rarity', 'pos', 'stealing', 'bunt', 'hnr', 'running', 'vl-2d6-1', 'vl-results-1', 'vl-splits-1', 'vl-2d6-2', 'vl-results-2', 'vl-splits-2', 'vl-2d6-3', 'vl-results-3', 'vl-splits-3', 'vr-2d6-1', 'vr-results-1', 'vr-splits-1', 'vr-2d6-2', 'vr-results-2', 'vr-splits-2', 'vr-2d6-3', 'vr-results-3', 'vr-splits-3' ]] batter_rg_output = [[ 'sba_id', 'cardset_id', 'player_name', 'hand', 'vl_hr', 'vl_bphr', 'vl_tr', 'vl_do3', 'vl_do2', 'vl_doP', 'vl_si2', 'vl_si1', 'vl_siC', 'vl_bpsi', 'vl_hbp', 'vl_bb', 'vl_k', 'vl_lo', 'vl_po', 'vl_flya', 'vl_flybq', 'vl_flylfb', 'vl_flyrfb', 'vl_gba', 'vl_gbb', 'vl_gbc', 'vr_hr', 'vr_bphr', 'vr_tr', 'vr_do3', 'vr_do2', 'vr_doP', 'vr_si2', 'vr_si1', 'vr_siC', 'vr_bpsi', 'vr_hbp', 'vr_bb', 'vr_k', 'vr_lo', 'vr_po', 'vr_flya', 'vr_flybq', 'vr_flylfb', 'vr_flyrfb', 'vr_gba', 'vr_gbb', 'vr_gbc', 'running', 'steal-high', 'steal-low', 'auto-jump', 'jump_pct', 'mlbteam', 'rarity' ]] baserunning_output = [[ 'name', 'running', 'st-high', 'st-low', 'auto-jump', 'jump' ]] pitcher_output = [[ 'name', 'hand', 'rarity', 'starter', 'reliever', 'closer', 'hold', 'batting', 'balk', 'wp', 'defense', 'vl-2d6-1', 'vl-results-1', 'vl-splits-1', 'vl-2d6-2', 'vl-results-2', 'vl-splits-2', 'vl-2d6-3', 'vl-results-3', 'vl-splits-3', 'vr-2d6-1', 'vr-results-1', 'vr-splits-1', 'vr-2d6-2', 'vr-results-2', 'vr-splits-2', 'vr-2d6-3', 'vr-results-3', 'vr-splits-3' ]] pitcher_peripherals_output = [[ 'name', 'starter', 'reliever', 'closer', 'hold', 'balk', 'wp' ]] pitcher_rg_output = [[ 'sba-id', 'cardset-id', 'player-name', 'hand', 'hr-vL', 'bp-hr-vL', 'tr-vL', 'do***-vL', 'do**-vL', 'do-cf-vL', 'si**-vL', 'si*-vL', 'si-cf-vL', 'bp-si-vL', 'hbp-vL', 'bb-vL', 'so-vL', 'fo-b-cf-vL', 'fo-b-slap-vL', 'gb-a-vL', 'gb-c-vL', 'gb-x-p-vL', 'gb-x-c-vL', 'gb-x-1b-vL', 'gb-x-2b-vL', 'gb-x-3b-vL', 'gb-x-ss-vL', 'gb-x-lf-vL', 'gb-x-cf-vL', 'gb-x-rf-vL', 'hr-vR', 'bp-hr-vR', 'tr-vR', 'do***-vR', 'do**-vR', 'do-cf-vR', 'si**-vR', 'si*-vR', 'si-cf-vR', 'bp-si-vR', 'hbp-vR', 'bb-vR', 'so-vR', 'fo-b-cf-vR', 'fo-b-slap-vR', 'gb-a-vR', 'gb-c-vR', 'gb-x-p-vR', 'gb-x-c-vR', 'gb-x-1b-vR', 'gb-x-2b-vR', 'gb-x-3b-vR', 'gb-x-ss-vR', 'gb-x-lf-vR', 'gb-x-cf-vR', 'gb-x-rf-vR' ]] player_json_output = [[ 'sba-id', 'name', '', 'fg-id', 'bbref-id', '', '', '', 'cardset-id', 'rarity', '', 'pos_1', 'pos_2', 'pos_3' ]] defense_rg_output = [[ 'full name', 'p-rat', 'c-rat', '1b-rat', '2b-rat', '3b-rat', 'ss-rat', 'lf-rat', 'cf-rat', 'rf-rat', 'p-e', 'c-e', '1b-e', '2b-e', '3b-e', 'ss-e', 'lf-e', 'cf-e', 'rf-e', 'of-arm', 'c-arm', 'c-throw', 'c-pb', 'p-wp', 'p-bk' ]] for player in all_players: valid_player = False b_lines = CardColumns.select().where( CardColumns.b_ratings.is_null(False) & (CardColumns.player == player) & CardColumns.b_ratings.endswith(f'{cardset.id}') ) this_output = [player.name, player.hand] if b_lines.count() == 2: print(f'Found batting lines for {player.name}...') vl_line = None vr_line = None for line in b_lines: this_columns = [ line.one_dice, line.one_results, line.one_splits, line.two_dice, line.two_results, line.two_splits, line.three_dice, line.three_results, line.three_splits ] if 'vL' in line.b_ratings.id: vl_line = this_columns else: vr_line = this_columns vl_ratings = BatterRatings.get_or_none( BatterRatings.player == player, BatterRatings.cardset == cardset, BatterRatings.vs_hand == 'vL', BatterRatings.is_prep == 0 ) vr_ratings = BatterRatings.get_or_none( BatterRatings.player == player, BatterRatings.cardset == cardset, BatterRatings.vs_hand == 'vR', BatterRatings.is_prep == 0 ) # Calculate rarity ops_vl = vl_ratings.obp + vl_ratings.slg ops_vr = vr_ratings.obp + vr_ratings.slg total_ops = (ops_vl + ops_vr + min(ops_vl, ops_vr)) / 3 rarity = get_batter_rarity(total_ops) logger.info( f'player: {player.name} / ops_vl: {ops_vl} / ops_vr: {ops_vr} / total_ops: {total_ops}' ) this_json = [ player.sba_id, player.name, None, player.fg_id, player.br_id, None, None, None, cardset.id, rarity, None ] this_output.append(rarity) this_batter_rg = [ player.sba_id, cardset.id, player.name, player.hand, vl_ratings.homerun, vl_ratings.bp_homerun, vl_ratings.triple, vl_ratings.double_three, vl_ratings.double_two, vl_ratings.double_pull, vl_ratings.single_two, vl_ratings.single_one, vl_ratings.single_center, vl_ratings.bp_single, vl_ratings.hbp, vl_ratings.walk, vl_ratings.strikeout, vl_ratings.lineout, vl_ratings.popout, vl_ratings.flyout_a, vl_ratings.flyout_bq, vl_ratings.flyout_lf_b, vl_ratings.flyout_rf_b, vl_ratings.groundout_a, vl_ratings.groundout_b, vl_ratings.groundout_c, vr_ratings.homerun, vr_ratings.bp_homerun, vr_ratings.triple, vr_ratings.double_three, vr_ratings.double_two, vr_ratings.double_pull, vr_ratings.single_two, vr_ratings.single_one, vr_ratings.single_center, vr_ratings.bp_single, vr_ratings.hbp, vr_ratings.walk, vr_ratings.strikeout, vr_ratings.lineout, vr_ratings.popout, vr_ratings.flyout_a, vr_ratings.flyout_bq, vr_ratings.flyout_lf_b, vr_ratings.flyout_rf_b, vr_ratings.groundout_a, vr_ratings.groundout_b, vr_ratings.groundout_c ] all_positions = Position.select().where((Position.player == player) & (Position.cardset == cardset)) if all_positions.count() > 0: print(f'Found {all_positions.count()} positions for {player.name}...') pos_list = [x for x in all_positions] position_string = get_position_string(pos_list, inc_p=False) else: pos_list = [] position_string = 'dh' this_json.extend(ordered_positions(pos_list)) player_json_output.append(this_json) valid_player = True this_batter_data = BatterData.get_or_none(BatterData.player == player, BatterData.cardset == cardset) if this_batter_data: print(f'Found batter data for {player.name}...') baserunning_output.append([ player.name, this_batter_data.running, this_batter_data.st_high, this_batter_data.st_low, "Y" if this_batter_data.st_auto else "N", this_batter_data.st_jump ]) this_batter_rg.extend([ this_batter_data.running, this_batter_data.st_high, this_batter_data.st_low, "Y" if this_batter_data.st_auto else "N", this_batter_data.st_jump, rarity ]) batter_rg_output.append(this_batter_rg) this_output.extend([ position_string, this_batter_data.stealing, this_batter_data.bunting, this_batter_data.hit_and_run, this_batter_data.running ]) this_output.extend(vl_line) this_output.extend(vr_line) batter_output.append(this_output) p_lines = CardColumns.select().where( CardColumns.p_ratings.is_null(False) & (CardColumns.player == player) & CardColumns.p_ratings.endswith(f'{cardset.id}') ) # if p_lines.count() > 0: # print(f'player: {player.name}') # print(f'p_lines ({p_lines.count()}): {p_lines}') this_output = [player.name, player.hand] if p_lines.count() == 2: print(f'Found pitching lines for {player.name}...') vr_line = None vl_line = None for line in p_lines: this_columns = [ line.one_dice, line.one_results, line.one_splits, line.two_dice, line.two_results, line.two_splits, line.three_dice, line.three_results, line.three_splits ] if 'vL' in line.p_ratings.id: vl_line = this_columns else: vr_line = this_columns if vr_line is not None and vl_line is not None: this_data = PitcherData.get_or_none(PitcherData.player == player, PitcherData.cardset_id == cardset.id) if this_data: print(f'Found pitcher data for {player.name}...') pitcher_peripherals_output.append([ player.name, this_data.starter_rating, this_data.relief_rating, this_data.closer_rating, this_data.hold, this_data.wild_pitch, this_data.balk ]) vl_ratings = PitcherRatings.get_or_none( PitcherRatings.player == player, PitcherRatings.cardset == cardset, PitcherRatings.vs_hand == 'vL', PitcherRatings.is_prep == 0 ) vr_ratings = PitcherRatings.get_or_none( PitcherRatings.player == player, PitcherRatings.cardset == cardset, PitcherRatings.vs_hand == 'vR', PitcherRatings.is_prep == 0 ) # Calculate rarity ops_vl = vl_ratings.obp + vl_ratings.slg ops_vr = vr_ratings.obp + vr_ratings.slg total_ops = (ops_vl + ops_vr + min(ops_vl, ops_vr)) / 3 rarity = get_pitcher_rarity(total_ops, this_data.starter_rating) logger.info( f'player: {player.name} / ops_vl: {ops_vl} / ops_vr: {ops_vr} / total_ops: {total_ops}' ) this_json = [ player.sba_id, player.name, None, player.fg_id, player.br_id, None, None, None, cardset.id, rarity, None ] this_output.extend([ rarity, this_data.starter_rating, this_data.relief_rating, this_data.closer_rating, this_data.hold, this_data.batting, this_data.balk, this_data.wild_pitch ]) pitcher_rg_output.append([ player.sba_id, cardset.id, player.name, player.hand, vl_ratings.homerun, vl_ratings.bp_homerun, vl_ratings.triple, vl_ratings.double_three, vl_ratings.double_two, vl_ratings.double_cf, vl_ratings.single_two, vl_ratings.single_one, vl_ratings.single_center, vl_ratings.bp_single, vl_ratings.hbp, vl_ratings.walk, vl_ratings.strikeout, vl_ratings.fo_center, vl_ratings.fo_slap, vl_ratings.groundout_a, vl_ratings.groundout_b, vl_ratings.xcheck_p, vl_ratings.xcheck_c, vl_ratings.xcheck_1b, vl_ratings.xcheck_2b, vl_ratings.xcheck_3b, vl_ratings.xcheck_ss, vl_ratings.xcheck_lf, vl_ratings.xcheck_cf, vl_ratings.xcheck_rf, vr_ratings.homerun, vr_ratings.bp_homerun, vr_ratings.triple, vr_ratings.double_three, vr_ratings.double_two, vr_ratings.double_cf, vr_ratings.single_two, vr_ratings.single_one, vr_ratings.single_center, vr_ratings.bp_single, vr_ratings.hbp, vr_ratings.walk, vr_ratings.strikeout, vr_ratings.fo_center, vr_ratings.fo_slap, vr_ratings.groundout_a, vr_ratings.groundout_b, vr_ratings.xcheck_p, vr_ratings.xcheck_c, vr_ratings.xcheck_1b, vr_ratings.xcheck_2b, vr_ratings.xcheck_3b, vr_ratings.xcheck_ss, vr_ratings.xcheck_lf, vr_ratings.xcheck_cf, vr_ratings.xcheck_rf, this_data.starter_rating, this_data.relief_rating, this_data.closer_rating, this_data.hold, this_data.wild_pitch, this_data.balk, rarity ]) p_def = Position.get_or_none( (Position.player == player) & (Position.cardset_id == cardset.id) & (Position.position == 'P') ) if p_def: print(f'Found pitcher defense for {player.name}...') this_output.append(f'p-{p_def.range}e{p_def.error}') this_output.extend(vl_line) this_output.extend(vr_line) pitcher_output.append(this_output) all_p_def = Position.select().where( ((Position.player == player) & (Position.cardset == cardset)) & ( (Position.position == 'SP') | (Position.position == 'RP') | (Position.position == 'CP') ) ) print(f'Found {all_p_def.count()} positions for {player.name}...') pos_list = [x for x in all_p_def] ordered_roles = ordered_pitching_positions(pos_list) this_json.extend(ordered_roles) player_json_output.append(this_json) valid_player = True all_pos = Position.select().where( (Position.player == player) & (Position.cardset == cardset) ) if all_pos.count() > 0 and valid_player: this_data = [player.name] this_data.extend(defense_rg(all_pos)) defense_rg_output.append(this_data) print(f'Done processing players; outputting to {output_path}') write_to_csv(output_path, f'batter-card-output-{now.strftime("%Y-%m-%d-%f")}', batter_output) write_to_csv(output_path, f'batter-rg-output-{now.strftime("%Y-%m-%d-%f")}', batter_rg_output) write_to_csv(output_path, f'pitcher-card-output-{now.strftime("%Y-%m-%d-%f")}', pitcher_output) write_to_csv(output_path, f'pitcher-rg-output-{now.strftime("%Y-%m-%d-%f")}', pitcher_rg_output) write_to_csv(output_path, f'player-json-{now.strftime("%Y-%m-%d-%f")}', player_json_output) write_to_csv(output_path, f'defense-rg-{now.strftime("%Y-%m-%d-%f")}', defense_rg_output) print(f'All done!') if __name__ == '__main__': asyncio.run(main(sys.argv[1:]))