import requests import requests_cache import json import csv session = requests_cache.CachedSession('.hanab-live.cache') player_mapping = { 'RamaNoVarjan': 'Ramanujan', 'purplejoe2': 'PurpleJoe', 'PurpleJoeVar': 'PurpleJoe', 'yagami_blank': 'Yagami', 'yagami_black': 'Yagami', 'MarkusKahlsen': 'Markus', 'NoVarkusKahlsen': 'Markus', 'spring': 'spring', 'str8tsknacker': 'str8tsknacker', 'novarknacker': 'str8tsknacker', 'StKildaFan': 'Kilda', 'noarv': 'Arv', 'arv': 'Arv', 'ElenaDhynho': 'Elena', 'ElenaDhynh0': 'Elena', 'Elenanovar': 'Elena', 'TimeHoodie': 'Hoodie', 'Hoodie': 'Hoodie', 'newduke': 'Duke', } allowed_team_members = ['Carunty', 'HelanaAshryvr', 'rz'] allowed_players = [s.lower() for s in player_mapping.keys()] + [s.lower() for s in allowed_team_members] print(allowed_players) player_cols = set() for _, p in player_mapping.items(): player_cols.add(p) class Entry(): def __init__(self, game_id, seed, score, players, bdr=0): self.game_id = game_id self.seed = seed self.num_players = len(players) self.won = 1 if score == 25 else 0 self.players = players self.bdr = bdr def get_player_games(player: str): r = session.get('https://hanab.live/api/v1/history-full/{}?start={}'.format(player, 1044446)) if r.status_code == 200: return json.loads(r.text) def collect_player_games(): global_games = {} for player in player_mapping.keys(): print('Parsing games for player {}'.format(player)) games = get_player_games(player) for game in games: if game['options'].get('variantName', 'No Variant') != 'No Variant': continue game_id = game['id'] players = game['playerNames'] score = game['score'] seed = game['seed'] if len(players) not in [3,4,5]: continue ok = True for player in players: if player.lower() not in allowed_players: print('rejecting game because of player {}'.format(player)) print(allowed_players) ok = False if ok: global_games[game_id] = Entry(game_id, seed, score, players) return global_games def sort_players_by_num_games(games_dict): nums = {} for _, entry in games_dict.items(): for player in entry.players: col = player_mapping.get(player, None) if col is not None: num = nums.get(col, 0) nums[col] = num + 1 return sorted(player_cols, key = lambda col: -nums[col]) if __name__ == "__main__": games = collect_player_games() streaks = {} fieldnames = ['Replay Number', 'Seed Name', 'Player #', 'W/L(1/0)'] fieldnames += sort_players_by_num_games(games) fieldnames += ['Other'] with open('games.csv', 'w', newline='') as f: f.writelines([','.join(fieldnames), "\n"]) with open('games.csv', 'a', newline='') as f: writer = csv.DictWriter(f, fieldnames=fieldnames) for _, entry in sorted(games.items()): row = { 'Replay Number': entry.game_id, 'Seed Name': entry.seed, 'Player #': entry.num_players, 'W/L(1/0)': entry.won } for player in entry.players: col = player_mapping.get(player, None) if col is not None: if entry.won: streak = streaks.get(col, 0) streak += 1 streaks[col] = streak row[col] = streak else: streaks[col] = 0 row[col] = 0 else: num_others = row.get('Other', 0) row['Other'] = num_others + 1 writer.writerow(row)