From 74a3bea61989b6b93d19c4de96e1e76df0b93066 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Thu, 15 Apr 2021 18:16:41 +0100 Subject: [PATCH] CAPI: catch lastStarport->services being an empty list (not dict)o This is caused, at least on Odyssey Alpha Phase 3, 4.0.0.20, by: 1. Jump to a new system. 2. Don't dock yet. 3. Cause CAPI pull with 'Update' button. 4. The PTS CAPI server is returning: "lastStarport": { "faction": "", "id": 3221604096, "minorfaction": "", "name": "", "services": [] }, So actually we need to decide it's not sane at all. --- companion.py | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/companion.py b/companion.py index bb9ce713..56f7a27b 100644 --- a/companion.py +++ b/companion.py @@ -603,7 +603,7 @@ class Session(object): return data - def station(self) -> CAPIData: + def station(self) -> CAPIData: # noqa: CCR001 """Perform CAPI /profile endpoint query for station data.""" data = self.query(URL_QUERY) if 'commander' not in data: @@ -614,6 +614,13 @@ class Session(object): return data services = data['lastStarport'].get('services', {}) + if not isinstance(services, dict): + # This happens if you're in-ship in-space and force an Update + logger.error(f'services is "{type(services)}", not dict !') + if __debug__: + self.dump_capi_data(data) + + services = {} last_starport_name = data['lastStarport']['name'] last_starport_id = int(data['lastStarport']['id']) @@ -682,13 +689,21 @@ class Session(object): def dump_capi_data(self, data: CAPIData) -> None: """Dump CAPI data to file for examination.""" if os.path.isdir('dump'): - system = data['lastSystem']['name'] + try: + system = data['lastSystem']['name'] - if data['commander'].get('docked'): - station = f'.{data["lastStarport"]["name"]}' + except (KeyError, ValueError): + system = '' - else: - station = '' + try: + if data['commander'].get('docked'): + station = f'.{data["lastStarport"]["name"]}' + + else: + station = '' + + except (KeyError, ValueError): + station = '' timestamp = time.strftime('%Y-%m-%dT%H.%M.%S', time.localtime()) with open(f'dump/{system}{station}.{timestamp}.json', 'wb') as h: