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

Merge pull request #574 from A-UNDERSCORE-D/enhancement/cleanup-edshipyard

cleanup edshipyard
This commit is contained in:
Athanasius 2020-07-12 20:50:25 +01:00 committed by GitHub
commit f96b00f8ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -11,13 +11,20 @@ from config import config
import companion import companion
import outfitting import outfitting
from typing import Dict, Union, List
__Module = Dict[str, Union[str, List[str]]]
# Map API ship names to E:D Shipyard ship names # Map API ship names to E:D Shipyard ship names
ship_map = dict(companion.ship_map) ship_map = companion.ship_map.copy()
ship_map['cobramkiii'] = 'Cobra Mk III'
ship_map['cobramkiv'] = 'Cobra Mk IV', ship_map.update(
ship_map['viper'] = 'Viper' {
ship_map['viper_mkiv'] = 'Viper Mk IV' 'cobramkiii': 'Cobra Mk III',
'cobramkiv' : 'Cobra Mk IV',
'viper' : 'Viper',
'viper_mkiv': 'Viper Mk IV',
}
)
# Map API slot names to E:D Shipyard slot names # Map API slot names to E:D Shipyard slot names
@ -40,21 +47,32 @@ slot_map = {
# Ship masses # Ship masses
ships = pickle.load(open(join(config.respath, 'ships.p'), 'rb')) # TODO: prefer something other than pickle for this storage (dev readability, security)
ships = pickle.load(open(join(config.respath, 'ships.p'), 'rb'))
# Export ship loadout in E:D Shipyard plain text format # Export ship loadout in E:D Shipyard plain text format
def export(data, filename=None): def export(data, filename=None):
def class_rating(module: __Module):
mod_class = module['class']
mod_rating = module['rating']
mod_mount = module.get('mount')
mod_guidance = module.get('guidance')
def class_rating(module): ret = '{mod_class}{rating}'.format(mod_class=mod_class, rating=mod_rating)
if 'guidance' in module: # Missiles if 'guidance' in module: # Missiles
return module['class'] + module['rating'] + '/' + module.get('mount', 'F')[0] + module['guidance'][0] + ' ' ret += "/{mount}{guidance}".format(
elif 'mount' in module: # Hardpoints mount=mod_mount[0] if mod_mount is not None else 'F',
return module['class'] + module['rating'] + '/' + module['mount'][0] + ' ' guidance=mod_guidance[0],
elif 'Cabin' in module['name']: # Passenger cabins )
return module['class'] + module['rating'] + '/' + module['name'][0] + ' '
else: elif 'mount' in module: # Hardpoints
return module['class'] + module['rating'] + ' ' ret += "/{mount}".format(mount=mod_mount)
elif 'Cabin' in module['name']: # Passenger cabins
ret += "/{name}".format(name=module['name'][0])
return ret + ' '
querytime = config.getint('querytime') or int(time.time()) querytime = config.getint('querytime') or int(time.time())
@ -69,92 +87,128 @@ def export(data, filename=None):
v = data['ship']['modules'][slot] v = data['ship']['modules'][slot]
try: try:
if not v: continue if not v:
continue
module = outfitting.lookup(v['module'], ship_map) module: __Module = outfitting.lookup(v['module'], ship_map)
if not module: continue if not module:
continue
cr = class_rating(module) cr = class_rating(module)
mods = v.get('modifications') or v.get('WorkInProgress_modifications') or {} mods = v.get('modifications') or v.get('WorkInProgress_modifications') or {}
if mods.get('OutfittingFieldType_Mass'): if mods.get('OutfittingFieldType_Mass'):
mass += (module.get('mass', 0) * mods['OutfittingFieldType_Mass']['value']) mass += (module.get('mass', 0) * mods['OutfittingFieldType_Mass']['value'])
else: else:
mass += module.get('mass', 0) mass += module.get('mass', 0)
# Specials # Specials
if 'Fuel Tank'in module['name']: if 'Fuel Tank' in module['name']:
fuel += 2**int(module['class']) fuel += 2**int(module['class'])
name = '%s (Capacity: %d)' % (module['name'], 2**int(module['class'])) name = '{} (Capacity: {})'.format(module['name'], 2**int(module['class']))
elif 'Cargo Rack' in module['name']: elif 'Cargo Rack' in module['name']:
cargo += 2**int(module['class']) cargo += 2**int(module['class'])
name = '%s (Capacity: %d)' % (module['name'], 2**int(module['class'])) name = '{} (Capacity: {})'.format(module['name'], 2**int(module['class']))
else: else:
name = module['name'] name = module['name']
if name == 'Frame Shift Drive': if name == 'Frame Shift Drive':
fsd = module # save for range calculation fsd = module # save for range calculation
if mods.get('OutfittingFieldType_FSDOptimalMass'): if mods.get('OutfittingFieldType_FSDOptimalMass'):
fsd['optmass'] *= mods['OutfittingFieldType_FSDOptimalMass']['value'] fsd['optmass'] *= mods['OutfittingFieldType_FSDOptimalMass']['value']
if mods.get('OutfittingFieldType_MaxFuelPerJump'): if mods.get('OutfittingFieldType_MaxFuelPerJump'):
fsd['maxfuel'] *= mods['OutfittingFieldType_MaxFuelPerJump']['value'] fsd['maxfuel'] *= mods['OutfittingFieldType_MaxFuelPerJump']['value']
jumpboost += module.get('jumpboost', 0) jumpboost += module.get('jumpboost', 0)
for s in slot_map: for s in slot_map:
if slot.lower().startswith(s): if slot.lower().startswith(s):
loadout[slot_map[s]].append(cr + name) loadout[slot_map[s]].append(cr + name)
break break
else: else:
if slot.lower().startswith('slot'): if slot.lower().startswith('slot'):
loadout[slot[-1]].append(cr + name) loadout[slot[-1]].append(cr + name)
elif __debug__ and not slot.lower().startswith('planetaryapproachsuite'): elif __debug__ and not slot.lower().startswith('planetaryapproachsuite'):
print('EDShipyard: Unknown slot %s' % slot) print('EDShipyard: Unknown slot {}'.format(slot))
except AssertionError as e: except AssertionError as e:
if __debug__: print('EDShipyard: %s' % e) if __debug__:
continue # Silently skip unrecognized modules print('EDShipyard: {}'.format(e))
except:
if __debug__: raise continue # Silently skip unrecognized modules
except Exception:
if __debug__:
raise
# Construct description # Construct description
ship = ship_map.get(data['ship']['name'].lower(), data['ship']['name']) ship = ship_map.get(data['ship']['name'].lower(), data['ship']['name'])
string = '[%s]\n' % (data['ship'].get('shipName') and ', '.join([ship, data['ship']['shipName']]) or ship)
for slot in ['H', 'L', 'M', 'S', 'U', None, 'BH', 'RB', 'TM', 'FH', 'EC', 'PC', 'SS', 'FS', None, 'MC', None, '9', '8', '7', '6', '5', '4', '3', '2', '1']: if data['ship'].get('shipName') is not None:
_ships = '{}, {}'.format(ship, data['ship']['shipName'])
else:
_ships = ship
string = '[{}]\n'.format(_ships)
SLOT_TYPES = (
'H', 'L', 'M', 'S', 'U', None, 'BH', 'RB', 'TM', 'FH', 'EC', 'PC', 'SS', 'FS', None, 'MC', None, '9', '8',
'7', '6', '5', '4', '3', '2', '1'
)
for slot in SLOT_TYPES:
if not slot: if not slot:
string += '\n' string += '\n'
elif slot in loadout: elif slot in loadout:
for name in loadout[slot]: for name in loadout[slot]:
string += '%s: %s\n' % (slot, name) string += '{}: {}\n'.format(slot, name)
string += '---\nCargo : %d T\nFuel : %d T\n' % (cargo, fuel)
string += '---\nCargo : {} T\nFuel : {} T\n'.format(cargo, fuel)
# Add mass and range # Add mass and range
assert data['ship']['name'].lower() in companion.ship_map, data['ship']['name'] assert data['ship']['name'].lower() in companion.ship_map, data['ship']['name']
assert companion.ship_map[data['ship']['name'].lower()] in ships, companion.ship_map[data['ship']['name'].lower()] assert companion.ship_map[data['ship']['name'].lower()] in ships, companion.ship_map[data['ship']['name'].lower()]
try: try:
# https://github.com/cmmcleod/coriolis/blob/master/app/js/shipyard/module-shipyard.js#L184
mass += ships[companion.ship_map[data['ship']['name'].lower()]]['hullMass'] mass += ships[companion.ship_map[data['ship']['name'].lower()]]['hullMass']
string += 'Mass : %.2f T empty\n %.2f T full\n' % (mass, mass + fuel + cargo) string += 'Mass : {:.2f} T empty\n {:.2f} T full\n'.format(mass, mass + fuel + cargo)
multiplier = pow(min(fuel, fsd['maxfuel']) / fsd['fuelmul'], 1.0 / fsd['fuelpower']) * fsd['optmass'] multiplier = pow(min(fuel, fsd['maxfuel']) / fsd['fuelmul'], 1.0 / fsd['fuelpower']) * fsd['optmass']
string += 'Range : %.2f LY unladen\n %.2f LY laden\n' % (
string += 'Range : {:.2f} LY unladen\n {:.2f} LY laden\n'.format(
multiplier / (mass + fuel) + jumpboost, multiplier / (mass + fuel) + jumpboost,
multiplier / (mass + fuel + cargo) + jumpboost) multiplier / (mass + fuel + cargo) + jumpboost
except: )
if __debug__: raise
except Exception:
if __debug__:
raise
if filename: if filename:
with open(filename, 'wt') as h: with open(filename, 'wt') as h:
h.write(string) h.write(string)
return return
# Look for last ship of this type # Look for last ship of this type
ship = companion.ship_file_name(data['ship'].get('shipName'), data['ship']['name']) ship = companion.ship_file_name(data['ship'].get('shipName'), data['ship']['name'])
regexp = re.compile(re.escape(ship) + '\.\d\d\d\d\-\d\d\-\d\dT\d\d\.\d\d\.\d\d\.txt') regexp = re.compile(re.escape(ship) + r'\.\d{4}-\d\d-\d\dT\d\d\.\d\d\.\d\d\.txt')
oldfiles = sorted([x for x in os.listdir(config.get('outdir')) if regexp.match(x)]) oldfiles = sorted([x for x in os.listdir(config.get('outdir')) if regexp.match(x)])
if oldfiles: if oldfiles:
with open(join(config.get('outdir'), oldfiles[-1]), 'rU') as h: with open(join(config.get('outdir'), oldfiles[-1]), 'rU') as h:
if h.read() == string: if h.read() == string:
return # same as last time - don't write return # same as last time - don't write
# Write # Write
filename = join(config.get('outdir'), '%s.%s.txt' % (ship, time.strftime('%Y-%m-%dT%H.%M.%S', time.localtime(querytime)))) filename = join(config.get('outdir'), '{}.{}.txt'.format(
ship, time.strftime('%Y-%m-%dT%H.%M.%S', time.localtime(querytime)))
)
with open(filename, 'wt') as h: with open(filename, 'wt') as h:
h.write(string) h.write(string)