From 87d8b9a19d126471a2db52d4371f1bb8974d8b2c Mon Sep 17 00:00:00 2001 From: jylpah Date: Mon, 11 Sep 2023 20:53:27 +0300 Subject: [PATCH 1/2] REFACTOR: FileQueue(), use Path for Win compat --- analyze_wotb_replays.py | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/analyze_wotb_replays.py b/analyze_wotb_replays.py index a669f27..2bae2f1 100755 --- a/analyze_wotb_replays.py +++ b/analyze_wotb_replays.py @@ -5,6 +5,7 @@ import sys, argparse, json, os, concurrent, inspect, aiohttp, asyncio, aiofiles, aioconsole import configparser, ssl, re, logging, time, xmltodict, collections, csv +from pathlib import Path from asyncio import Queue, Task, create_task from datetime import datetime, timedelta, date from motor.motor_asyncio import ( @@ -1690,11 +1691,11 @@ class ErrorCatchingArgumentParser(argparse.ArgumentParser): ## main() ------------------------------------------------------------- -async def main(argv): - global wg, wi, WG_APP_ID, OPT_MODE_DEFAULT, OPT_EXPORT_CSV_FILE, OPT_EXPORT_JSON_FILE +async def main(argv: list[str]): + global wg, wi, WG_APP_ID, OPT_EXPORT_CSV_FILE, OPT_EXPORT_JSON_FILE # set the directory for the script current_dir = os.getcwd() - os.chdir(os.path.dirname(sys.argv[0])) + # os.chdir(os.path.dirname(sys.argv[0])) ## Default options: OPT_MODE_DEFAULT = "default" @@ -1728,16 +1729,30 @@ async def main(argv): try: ## Read config - if os.path.isfile(FILE_CONFIG): + + CONFIG: str = "blitzstats.ini" + CONFIG_FILES: list[Path] = [ + Path(".") / CONFIG, + Path(__file__).parent / CONFIG, + Path.home() / f".{CONFIG}", + Path.home() / ".config" / CONFIG, + Path.home() / ".config/blitzstats/config", + ] + + config_file: Path | None = None + for config_file in CONFIG_FILES: + if config_file.is_file(): + break + if config_file is None: + print("no config file found") + else: config = configparser.ConfigParser() - config.read(FILE_CONFIG) + config.read(config_file) try: if "ANALYZER" in config.sections(): configAnalyzer = config["ANALYZER"] - OPT_MODE_DEFAULT = configAnalyzer.getboolean( - "mode", OPT_MODE_DEFAULT - ) + OPT_MODE_DEFAULT = configAnalyzer.get("mode", OPT_MODE_DEFAULT) OPT_HIST = configAnalyzer.getboolean("histograms", OPT_HIST) OPT_STAT_FUNC = configAnalyzer.get( "stat_func", fallback=OPT_STAT_FUNC @@ -3022,9 +3037,9 @@ async def mk_replayQ( scanner: Task = create_task(jsonQ.mk_queue(files=files)) async for fn in jsonQ: try: - replay_json = await bu.open_JSON(fn, wi.chk_JSON_replay) + replay_json = await bu.open_JSON(str(fn), wi.chk_JSON_replay) await replayQ.put(await mk_readerQ_item(replay_json, filename=fn)) - bu.debug("File added to queue: " + fn) + bu.debug("File added to queue: " + str(fn)) Nreplays += 1 except Exception as err: bu.error(exception=err) @@ -3351,4 +3366,4 @@ if __name__ == "__main__": asyncio.get_event_loop_policy(), WindowsSelectorEventLoopPolicy ): asyncio.set_event_loop_policy(WindowsSelectorEventLoopPolicy()) - asyncio.run(main(sys.argv[1:]), debug=False) + asyncio.run(main(sys.argv), debug=False) From d29f092bffc2cb6da9a0e78979f5a08e0c2b418d Mon Sep 17 00:00:00 2001 From: jylpah Date: Mon, 11 Sep 2023 20:53:33 +0300 Subject: [PATCH 2/2] remove unused code --- upload_wotb_replays.py | 98 +++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/upload_wotb_replays.py b/upload_wotb_replays.py index 469fc33..541634b 100755 --- a/upload_wotb_replays.py +++ b/upload_wotb_replays.py @@ -309,60 +309,60 @@ async def replayWorker( return None -def getTitle_old(replayfile: str, title: str, i: int) -> str: - global wg +# def getTitle_old(replayfile: str, title: str, i: int) -> str: +# global wg - if title is None: - try: - filename = os.path.basename(replayfile) - bu.debug(filename) - map_usrStrs = wg.get_map_user_strs() - tank_userStrs = wg.get_tank_user_strs() +# if title is None: +# try: +# filename = os.path.basename(replayfile) +# bu.debug(filename) +# map_usrStrs = wg.get_map_user_strs() +# tank_userStrs = wg.get_tank_user_strs() - # p = re.compile('\\d{8}_\\d{4}_(.+)_(' + '|'.join(map_usrStrs) + ')(?:-\\d)?\\.wotbreplay$') - # update 6.2 changed the file name format. Bug fixed 2019-09-09 Jylpah - p = re.compile( - "\\d{8}_\\d{4}_.*?(" - + "|".join(tank_userStrs) - + ")_(" - + "|".join(map_usrStrs) - + ")(?:-\\d)?\\.wotbreplay$" - ) +# # p = re.compile('\\d{8}_\\d{4}_(.+)_(' + '|'.join(map_usrStrs) + ')(?:-\\d)?\\.wotbreplay$') +# # update 6.2 changed the file name format. Bug fixed 2019-09-09 Jylpah +# p = re.compile( +# "\\d{8}_\\d{4}_.*?(" +# + "|".join(tank_userStrs) +# + ")_(" +# + "|".join(map_usrStrs) +# + ")(?:-\\d)?\\.wotbreplay$" +# ) - m = p.match(filename) - if m is not None: - if wg.tanks is not None: - tank = m.group(1) - if tank in wg.tanks["userStr"]: - tank = wg.tanks["userStr"][tank] - else: - bu.error( - 'Tank code: "' - + tank - + '" not found from Tankopedia (tanks.json)' - ) - else: - tank = m.group(1) - blitz_map = m.group(2) - if blitz_map in wg.maps: - blitz_map = wg.maps[blitz_map] - else: - bu.error( - 'Mapcode: "' - + blitz_map - + '" not found from map database (maps.json)' - ) - title = tank + " @ " + blitz_map - else: - title = re.sub("\\.wotbreplay$", "", filename) - except Exception as err: - bu.error(err) - else: - title.replace("NN", str(i)) - return title +# m = p.match(filename) +# if m is not None: +# if wg.tanks is not None: +# tank = m.group(1) +# if tank in wg.tanks["userStr"]: +# tank = wg.tanks["userStr"][tank] +# else: +# bu.error( +# 'Tank code: "' +# + tank +# + '" not found from Tankopedia (tanks.json)' +# ) +# else: +# tank = m.group(1) +# blitz_map = m.group(2) +# if blitz_map in wg.maps: +# blitz_map = wg.maps[blitz_map] +# else: +# bu.error( +# 'Mapcode: "' +# + blitz_map +# + '" not found from map database (maps.json)' +# ) +# title = tank + " @ " + blitz_map +# else: +# title = re.sub("\\.wotbreplay$", "", filename) +# except Exception as err: +# bu.error(err) +# else: +# title.replace("NN", str(i)) +# return title -def getTitle(replayfile: str, title: str = None, i: int = 0) -> str: +def getTitle(replayfile: str, title: str | None = None, i: int = 0) -> str: global wg assert wg is not None, "wg must not be None"