1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-04-16 09:10:35 +03:00

companion: Start moving CAPI 'station' query into thread worker

This commit is contained in:
Athanasius 2021-08-17 14:57:21 +01:00
parent 305ba157ec
commit 3fe097a955
No known key found for this signature in database
GPG Key ID: AE3E527847057C7D

View File

@ -480,6 +480,9 @@ class Session(object):
FRONTIER_CAPI_PATH_PROFILE = '/profile'
FRONTIER_CAPI_PATH_MARKET = '/market'
FRONTIER_CAPI_PATH_SHIPYARD = '/shipyard'
# This is a dummy value, to signal to Session.capi_query_worker that we
# the 'station' triplet of queries.
_CAPI_PATH_STATION = '_edmc_station'
def __init__(self) -> None:
self.state = Session.STATE_INIT
@ -621,6 +624,65 @@ class Session(object):
break
logger.trace_if('capi.worker', f'Processing query: {endpoint}')
self.query(self.FRONTIER_CAPI_PATH_PROFILE)
if not data['commander'].get('docked') and not monitor.state['OnFoot']:
return data
# Sanity checks in case data isn't as we expect, and maybe 'docked' flag
# is also lagging.
if (last_starport := data.get('lastStarport')) is None:
logger.error("No lastStarport in data!")
return data
if ((last_starport_name := last_starport.get('name')) is None
or last_starport_name == ''):
# This could well be valid if you've been out exploring for a long
# time.
logger.warning("No lastStarport name!")
return data
# WORKAROUND: n/a | 06-08-2021: Issue 1198 and https://issues.frontierstore.net/issue-detail/40706
# -- strip "+" chars off star port names returned by the CAPI
last_starport_name = last_starport["name"] = last_starport_name.rstrip(" +")
services = last_starport.get('services', {})
if not isinstance(services, dict):
# Odyssey Alpha Phase 3 4.0.0.20 has been observed having
# this be an empty list when you've jumped to another system
# and not yet docked. As opposed to no services key at all
# or an empty dict.
logger.error(f'services is "{type(services)}", not dict !')
if __debug__:
self.dump_capi_data(data)
# Set an empty dict so as to not have to retest below.
services = {}
last_starport_id = int(last_starport.get('id'))
if services.get('commodities'):
marketdata = self.query(self.FRONTIER_CAPI_PATH_MARKET)
if last_starport_id != int(marketdata['id']):
logger.warning(f"{last_starport_id!r} != {int(marketdata['id'])!r}")
raise ServerLagging()
else:
marketdata['name'] = last_starport_name
data['lastStarport'].update(marketdata)
if services.get('outfitting') or services.get('shipyard'):
shipdata = self.query(self.FRONTIER_CAPI_PATH_SHIPYARD)
if last_starport_id != int(shipdata['id']):
logger.warning(f"{last_starport_id!r} != {int(shipdata['id'])!r}")
raise ServerLagging()
else:
shipdata['name'] = last_starport_name
data['lastStarport'].update(shipdata)
# WORKAROUND END
return data
try:
r = self.session.get(self.server + endpoint, timeout=timeout) # type: ignore
r.raise_for_status() # Typically 403 "Forbidden" on token expiry
@ -734,65 +796,8 @@ class Session(object):
:return: Possibly augmented CAPI data.
"""
self.query(self.FRONTIER_CAPI_PATH_PROFILE)
if not data['commander'].get('docked') and not monitor.state['OnFoot']:
return data
# Sanity checks in case data isn't as we expect, and maybe 'docked' flag
# is also lagging.
if (last_starport := data.get('lastStarport')) is None:
logger.error("No lastStarport in data!")
return data
if ((last_starport_name := last_starport.get('name')) is None
or last_starport_name == ''):
# This could well be valid if you've been out exploring for a long
# time.
logger.warning("No lastStarport name!")
return data
# WORKAROUND: n/a | 06-08-2021: Issue 1198 and https://issues.frontierstore.net/issue-detail/40706
# -- strip "+" chars off star port names returned by the CAPI
last_starport_name = last_starport["name"] = last_starport_name.rstrip(" +")
services = last_starport.get('services', {})
if not isinstance(services, dict):
# Odyssey Alpha Phase 3 4.0.0.20 has been observed having
# this be an empty list when you've jumped to another system
# and not yet docked. As opposed to no services key at all
# or an empty dict.
logger.error(f'services is "{type(services)}", not dict !')
if __debug__:
self.dump_capi_data(data)
# Set an empty dict so as to not have to retest below.
services = {}
last_starport_id = int(last_starport.get('id'))
if services.get('commodities'):
marketdata = self.query(self.FRONTIER_CAPI_PATH_MARKET)
if last_starport_id != int(marketdata['id']):
logger.warning(f"{last_starport_id!r} != {int(marketdata['id'])!r}")
raise ServerLagging()
else:
marketdata['name'] = last_starport_name
data['lastStarport'].update(marketdata)
if services.get('outfitting') or services.get('shipyard'):
shipdata = self.query(self.FRONTIER_CAPI_PATH_SHIPYARD)
if last_starport_id != int(shipdata['id']):
logger.warning(f"{last_starport_id!r} != {int(shipdata['id'])!r}")
raise ServerLagging()
else:
shipdata['name'] = last_starport_name
data['lastStarport'].update(shipdata)
# WORKAROUND END
return data
# Ask the thread worker to perform all three queries
self.capi_query_queue.put(_CAPI_PATH_STATION)
######################################################################
######################################################################