From 753fdedbdf3462af1d74f384b352370fa806a73c Mon Sep 17 00:00:00 2001 From: Athanasius Date: Thu, 12 Sep 2019 11:56:04 +0100 Subject: [PATCH] Fixes plugins/coriolis.py to appear in settings, and confirms click-through works *) Code and imports brought in line with edsy plugin *) 'Coriolis' now appears in Settings > Configuration > Shipyard dropdown *) Confirmed that with this active a valid build opens on coriolis.io --- plugins/coriolis.py | 113 +++++++------------------------------------- 1 file changed, 18 insertions(+), 95 deletions(-) diff --git a/plugins/coriolis.py b/plugins/coriolis.py index 522c261d..2755761c 100644 --- a/plugins/coriolis.py +++ b/plugins/coriolis.py @@ -1,105 +1,28 @@ -#!/usr/bin/python -# -# build ship and module databases from https://github.com/EDCD/coriolis-data/ -# +# Coriolis ship export -from __future__ import print_function -from future import standard_library -standard_library.install_aliases() -from builtins import str -from builtins import range -import csv import base64 -from collections import OrderedDict -import pickle +import gzip import json -from traceback import print_exc +import io +# Migrate settings from <= 3.01 from config import config -import outfitting -import companion +if not config.get('shipyard_provider') and config.getint('shipyard'): + config.set('shipyard_provider', 'Coriolis') +config.delete('shipyard') -if __name__ == "__main__": +def plugin_start(): + return 'Coriolis' - def add(modules, name, attributes): - assert name not in modules or modules[name] == attributes, '%s: %s!=%s' % (name, modules.get(name), attributes) - assert name not in modules, name - modules[name] = attributes +# Return a URL for the current ship +def shipyard_url(loadout, is_beta): + string = json.dumps(loadout, ensure_ascii=False, sort_keys=True, separators=(',', ':')).encode('utf-8') # most compact representation + if not string: + return False + out = io.BytesIO() + with gzip.GzipFile(fileobj=out, mode='w') as f: + f.write(string) - data = json.load(open('coriolis-data/dist/index.json')) - - # Map Coriolis's names to names displayed in the in-game shipyard - coriolis_ship_map = { - 'Cobra Mk III' : 'Cobra MkIII', - 'Cobra Mk IV' : 'Cobra MkIV', - 'Krait Mk II' : 'Krait MkII', - 'Viper' : 'Viper MkIII', - 'Viper Mk IV' : 'Viper MkIV', - } - - # Symbolic name from in-game name - reverse_ship_map = {v: k for k, v in companion.ship_map.items()} - - bulkheads = list(outfitting.armour_map.keys()) - - ships = {} - modules = {} - - # Ship and armour masses - for m in list(data['Ships'].values()): - name = coriolis_ship_map.get(m['properties']['name'], str(m['properties']['name'])) - assert name in reverse_ship_map, name - ships[name] = { 'hullMass' : m['properties']['hullMass'] } - for i in range(len(bulkheads)): - modules['_'.join([reverse_ship_map[name], 'armour', bulkheads[i]])] = { 'mass': m['bulkheads'][i]['mass'] } - - ships = OrderedDict([(k,ships[k]) for k in sorted(ships)]) # sort for easier diffing - pickle.dump(ships, open('ships.p', 'wb')) - - # Module masses - for cat in list(data['Modules'].values()): - for grp, mlist in cat.items(): - for m in mlist: - assert 'symbol' in m, m - key = str(m['symbol'].lower()) - if grp == 'fsd': - modules[key] = { - 'mass' : m['mass'], - 'optmass' : m['optmass'], - 'maxfuel' : m['maxfuel'], - 'fuelmul' : m['fuelmul'], - 'fuelpower' : m['fuelpower'], - } - elif grp == 'gfsb': - modules[key] = { - 'mass' : m['mass'], - 'jumpboost' : m['jumpboost'], - } - else: - modules[key] = { 'mass': m.get('mass', 0) } # Some modules don't have mass - - # Pre 3.3 modules - add(modules, 'int_stellarbodydiscoveryscanner_standard', { 'mass': 2 }) - add(modules, 'int_stellarbodydiscoveryscanner_intermediate', { 'mass': 2 }) - add(modules, 'int_stellarbodydiscoveryscanner_advanced', { 'mass': 2 }) - - # Missing - add(modules, 'hpt_mining_subsurfdispmisle_fixed_small', { 'mass': 2 }) - add(modules, 'hpt_mining_subsurfdispmisle_fixed_medium', { 'mass': 4 }) - add(modules, 'hpt_multicannon_fixed_small_advanced', { 'mass': 2 }) - add(modules, 'hpt_multicannon_fixed_medium_advanced', { 'mass': 4 }) - - modules = OrderedDict([(k,modules[k]) for k in sorted(modules)]) # sort for easier diffing - pickle.dump(modules, open('modules.p', 'wb')) - - # Check data is present for all modules - with open('outfitting.csv') as csvfile: - reader = csv.DictReader(csvfile, restval='') - for row in reader: - try: - module = outfitting.lookup({ 'id': row['id'], 'name': row['symbol'] }, companion.ship_map) - except: - print(row['symbol']) - print_exc() + return (is_beta and 'https://beta.coriolis.io/import?data=' or 'https://coriolis.io/import?data=') + base64.urlsafe_b64encode(out.getvalue()).decode().replace('=', '%3D')