1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-06-03 00:51:11 +03:00

Add ships sanity checking, and it's all in a helper function now.

* Moved these modules and ships checks to safe_modules_and_ships().
* Applied some paranoia checks to ships as well.
This commit is contained in:
Athanasius 2020-09-18 11:38:20 +01:00
parent 81f71c88ff
commit 22a8da5bf7

View File

@ -11,9 +11,9 @@ from collections import OrderedDict
from os import SEEK_SET
from os.path import join
from platform import system
from typing import TYPE_CHECKING, Any, AnyStr, Dict, Iterator, List, Mapping, MutableMapping, Optional
from typing import TYPE_CHECKING, Any, AnyStr, Dict, Iterator, List, Mapping, MutableMapping, Optional, Tuple
from typing import OrderedDict as OrderedDictT
from typing import Sequence, TextIO, Tuple
from typing import Sequence, TextIO
import requests
@ -262,6 +262,32 @@ Msg:\n{msg}''')
this.commodities = commodities
def safe_modules_and_ships(self, data: Mapping[str, Any]) -> Tuple[Dict, Dict]:
modules: Dict[str, Any] = data['lastStarport'].get('modules')
if modules is None or not isinstance(modules, dict):
if modules is None:
logger.debug('modules was None. FC or Damaged Station?')
elif isinstance(modules, list):
if len(modules) == 0:
logger.debug('modules is empty list. Damaged Station?')
else:
logger.error(f'modules is non-empty list: {modules!r}')
else:
logger.error(f'modules was not None, a list, or a dict! type = {type(modules)}')
# Set a safe value
modules = {}
ships: Dict[str, Any] = data['lastStarport'].get('ships')
if ships is None or not isinstance(ships, dict):
if ships is None:
logger.debug('ships was None')
else:
logger.error(f'ships was neither None nor a Dict! Type = {type(ships)}')
# Set a safe value
ships = {'shipyard_list': {}, 'unavailable_list': []}
return (modules, ships)
def export_outfitting(self, data: Mapping[str, Any], is_beta: bool) -> None:
"""
export_outfitting updates EDDN with the current (lastStarport) station's outfitting options, if any.
@ -270,20 +296,7 @@ Msg:\n{msg}''')
:param data: dict containing the outfitting data
:param is_beta: whether or not we're currently in beta mode
"""
modules: Dict[str, Any] = data['lastStarport'].get('modules')
if modules is None or isinstance(modules, list):
if modules is None:
logger.debug('modules was None')
elif modules == []:
logger.debug('modules is empty list')
else:
logger.error(f'modules is non-empty list: {modules!r}')
modules = {}
ships: Dict[str, Any] = data['lastStarport'].get('ships')
if ships is None:
logger.debug('ships was None')
ships = {'shipyard_list': {}, 'unavailable_list': []}
(modules, ships) = self.safe_modules_and_ships(data)
# Horizons flag - will hit at least Int_PlanetApproachSuite other than at engineer bases ("Colony"),
# prison or rescue Megaships, or under Pirate Attack etc
@ -326,20 +339,7 @@ Msg:\n{msg}''')
:param data: dict containing the shipyard data
:param is_beta: whether or not we are in beta mode
"""
modules: Dict[str, Any] = data['lastStarport'].get('modules')
if modules is None or isinstance(modules, list):
if modules is None:
logger.debug('modules was None')
elif modules == []:
logger.debug('modules is empty list')
else:
logger.error(f'modules is non-empty list: {modules!r}')
modules = {}
ships: Dict[str, Any] = data['lastStarport'].get('ships')
if ships is None:
logger.debug('ships was None')
ships = {'shipyard_list': {}, 'unavailable_list': []}
(modules, ships) = self.safe_modules_and_ships(data)
horizons: bool = is_horizons(
data['lastStarport'].get('economies', {}),