From 517a2db9d804f7a06444d3ae953c7d9ab882d759 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Wed, 8 Jun 2022 00:34:45 +0200 Subject: [PATCH] Clients: some improvements (#602) * Clients: some improvements SNIClient is the only client that uses slow_mode, so its definition should be moved there. type info for CommandProcessor was int for some reason. Moved a lot of type info from init to class body, making it easier for type checkers to find. getLogger("") and getLogger(None) is technically different, just happens that our root logger is "", fixed it in case of future confusion though. * Logging: log that init_logging was run and what the current AP version is. --- CommonClient.py | 57 ++++++++++++++++++++++++++++++++----------------- SNIClient.py | 1 + Utils.py | 5 ++++- 3 files changed, 43 insertions(+), 20 deletions(-) diff --git a/CommonClient.py b/CommonClient.py index c4d68fae..b31c4509 100644 --- a/CommonClient.py +++ b/CommonClient.py @@ -114,30 +114,52 @@ class ClientCommandProcessor(CommandProcessor): asyncio.create_task(self.ctx.send_msgs([{"cmd": "Say", "text": raw}]), name="send Say") -class CommonContext(): +class CommonContext: + # Should be adjusted as needed in subclasses tags: typing.Set[str] = {"AP"} + game: typing.Optional[str] = None + items_handling: typing.Optional[int] = None + + # defaults starting_reconnect_delay: int = 5 current_reconnect_delay: int = starting_reconnect_delay - command_processor: int = ClientCommandProcessor - game: typing.Optional[str] = None + command_processor: type(CommandProcessor) = ClientCommandProcessor ui = None ui_task: typing.Optional[asyncio.Task] = None input_task: typing.Optional[asyncio.Task] = None keep_alive_task: typing.Optional[asyncio.Task] = None - items_handling: typing.Optional[int] = None - slot_info: typing.Dict[int, NetworkSlot] + server_task: typing.Optional[asyncio.Task] = None + server: typing.Optional[Endpoint] = None + server_version: Version = Version(0, 0, 0) current_energy_link_value: int = 0 # to display in UI, gets set by server + + last_death_link: float = time.time() # last send/received death link on AP layer + + # remaining type info + slot_info: typing.Dict[int, NetworkSlot] + server_address: str + password: typing.Optional[str] + hint_cost: typing.Optional[int] + games: typing.Dict[int, str] + player_names: typing.Dict[int, str] + + # locations + locations_checked: typing.Set[int] # local state + locations_scouted: typing.Set[int] + missing_locations: typing.Set[int] + checked_locations: typing.Set[int] # server state + locations_info: typing.Dict[int, NetworkItem] + + # current message box through kvui _messagebox = None + def __init__(self, server_address, password): # server state self.server_address = server_address self.password = password - self.server_task = None - self.server: typing.Optional[Endpoint] = None - self.server_version = Version(0, 0, 0) - self.hint_cost: typing.Optional[int] = None - self.games: typing.Dict[int, str] = {} + self.hint_cost = None + self.games = {} self.slot_info = {} self.permissions = { "forfeit": "disabled", @@ -153,24 +175,21 @@ class CommonContext(): self.auth = None self.seed_name = None - self.locations_checked: typing.Set[int] = set() # local state - self.locations_scouted: typing.Set[int] = set() + self.locations_checked = set() # local state + self.locations_scouted = set() self.items_received = [] - self.missing_locations: typing.Set[int] = set() - self.checked_locations: typing.Set[int] = set() # server state - self.locations_info: typing.Dict[int, NetworkItem] = {} + self.missing_locations = set() + self.checked_locations = set() # server state + self.locations_info = {} self.input_queue = asyncio.Queue() self.input_requests = 0 - self.last_death_link: float = time.time() # last send/received death link on AP layer - # game state - self.player_names: typing.Dict[int: str] = {0: "Archipelago"} + self.player_names = {0: "Archipelago"} self.exit_event = asyncio.Event() self.watcher_event = asyncio.Event() - self.slow_mode = False self.jsontotextparser = JSONtoTextParser(self) self.set_getters(network_data_package) diff --git a/SNIClient.py b/SNIClient.py index 01042401..38a50c65 100644 --- a/SNIClient.py +++ b/SNIClient.py @@ -128,6 +128,7 @@ class Context(CommonContext): self.death_state = DeathState.alive # for death link flop behaviour self.killing_player_task = None self.allow_collect = False + self.slow_mode = False self.awaiting_rom = False self.rom = None diff --git a/Utils.py b/Utils.py index 3a199227..68cdc923 100644 --- a/Utils.py +++ b/Utils.py @@ -430,7 +430,8 @@ loglevel_mapping = {'error': logging.ERROR, 'info': logging.INFO, 'warning': log def init_logging(name: str, loglevel: typing.Union[str, int] = logging.INFO, write_mode: str = "w", - log_format: str = "[%(name)s at %(asctime)s]: %(message)s", exception_logger: str = ""): + log_format: str = "[%(name)s at %(asctime)s]: %(message)s", + exception_logger: typing.Optional[str] = None): loglevel: int = loglevel_mapping.get(loglevel, loglevel) log_folder = user_path("logs") os.makedirs(log_folder, exist_ok=True) @@ -466,6 +467,8 @@ def init_logging(name: str, loglevel: typing.Union[str, int] = logging.INFO, wri sys.excepthook = handle_exception + logging.info(f"Archipelago ({__version__}) logging initialized.") + def stream_input(stream, queue): def queuer():