From a1e330be2ccca8c651099fd509e3d0d085cc1f1a Mon Sep 17 00:00:00 2001 From: Athanasius Date: Mon, 17 Jan 2022 09:18:40 +0000 Subject: [PATCH 01/29] scripts/eddn-report: EVA is abandoned, so ignore --- scripts/eddn-report-log-errors | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/eddn-report-log-errors b/scripts/eddn-report-log-errors index a626e23..82a95c2 100755 --- a/scripts/eddn-report-log-errors +++ b/scripts/eddn-report-log-errors @@ -179,6 +179,12 @@ def process_file(input_file: str) -> None: if matches.group('software_version') == '2.0.0.660': print(line) + # Abandoned/unmaintained project + # + # + elif matches.group('software_name') in ('EVA [iPhone]', 'EVA [iPad]'): + pass + ################################################################### # Issues we know about, but haven't yet alerted developers to ################################################################### From 3ffff54c4b2f7c9d2a5a9de9e76c8df567a0201d Mon Sep 17 00:00:00 2001 From: Athanasius Date: Mon, 17 Jan 2022 09:22:37 +0000 Subject: [PATCH 02/29] contrib/eddn-logs-archive: Run gateway error report script on gateway.log * Renamed some variables to be truer to their content and use. * Run eddn-report-log-errors if rotating a gateway.log file. --- contrib/eddn-logs-archive | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/contrib/eddn-logs-archive b/contrib/eddn-logs-archive index ef30aef..c6bcdea 100755 --- a/contrib/eddn-logs-archive +++ b/contrib/eddn-logs-archive @@ -87,8 +87,9 @@ do log " Archiving ${service}.log ..." # We have no means to tell the service to close and re-open output, it's # to stdout/err anyway. So we copy it. - COMPRESSED_NAME="${service}.log.$(date --iso-8601=seconds)" - cp ${service}.log "${COMPRESSED_NAME}" + TIMESTAMP="$(date --iso-8601=seconds)" + ARCHIVED_NAME="${service}.log.${TIMESTAMP}" + cp ${service}.log "${ARCHIVED_NAME}" if [ $? -ne 0 ]; then echo " FAILED copying live log file to new archive!!!" >&2 @@ -97,8 +98,15 @@ do fi # Truncate the live file. :> ${service}.log + + if [ "${service}" == "gateway" ]; + then + # Produce a report of interesting errors + ${HOME}/.local/bin/eddn-report-log-errors "${ARCHIVED_NAME}" > "${HOME}/reports/eddn-errors/by-log-rotation/eddn-errors-${TIMESTAMP}.txt" + fi + # Now compress the newly archived log - gzip -9v "${COMPRESSED_NAME}" + gzip -9v "${ARCHIVED_NAME}" log " DONE" else log " No" From 79b78ac83108c65f9086b69d14746cc9f2adbbf5 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 18 Jan 2022 11:21:21 +0000 Subject: [PATCH 03/29] scripts/eddn-report: Quieten some EDMC errors They're noted in --- scripts/eddn-report-log-errors | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/scripts/eddn-report-log-errors b/scripts/eddn-report-log-errors index 82a95c2..73307fe 100755 --- a/scripts/eddn-report-log-errors +++ b/scripts/eddn-report-log-errors @@ -105,6 +105,23 @@ def process_file(input_file: str) -> None: print(matches.group('err_msg')) print(line) + elif matches.group('schema_ref') == 'https://eddn.edcd.io/schemas/journal/1': + # + if matches.group('err_msg') == 'Failed Validation "[]"': + # + pass + + elif matches.group('err_msg').startswith( + 'Failed Validation "[ + pass + + elif matches.group('schema_ref') == 'https://eddn.edcd.io/schemas/fssdiscoveryscan/1': + if matches.group('err_msg') == 'Failed Validation "[]"': + # + pass + else: print(line) From 872c65c280d33db54833cd29ee66fa1e864fa723 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 18 Jan 2022 14:16:45 +0000 Subject: [PATCH 04/29] setup.py: Do *not* install eddn-logs-archive script This should be done manually, so as to be using the correct version from the correct branch on the live service. --- setup.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/setup.py b/setup.py index d765672..2c04b93 100644 --- a/setup.py +++ b/setup.py @@ -163,16 +163,6 @@ shutil.copy( '%s/start-eddn-%s-service' % ( START_SCRIPT_BIN, setup_env.EDDN_ENV ) ) -# Ensure the service log file archiving script is in place -print """ -****************************************************************************** -Ensuring the service log file archiving script is in place -""" -shutil.copy( - 'contrib/eddn-logs-archive', - START_SCRIPT_BIN -) - # Ensure the latest monitor files are in place old_umask = os.umask(022) print """ From fb3c0348adab2c585cfb58428f9ef114a8c41345 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 18 Jan 2022 15:02:38 +0000 Subject: [PATCH 05/29] Gateway: Support `--loglevel ` CL arg NB: This required changes to src/eddn/conf/Settings.py as well, which means other scripts, e.g. Monitor.py, will also need changing. --- src/eddn/Gateway.py | 29 ++++++++++++++++++++++++++++- src/eddn/conf/Settings.py | 17 ++++++++--------- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/eddn/Gateway.py b/src/eddn/Gateway.py index d9e7dfd..3e33132 100644 --- a/src/eddn/Gateway.py +++ b/src/eddn/Gateway.py @@ -4,6 +4,7 @@ Contains the necessary ZeroMQ socket and a helper function to publish market data to the Announcer daemons. """ +import argparse import gevent import hashlib import logging @@ -51,6 +52,27 @@ statsCollector = StatsCollector() statsCollector.start() +def parse_cl_args(): + parser = argparse.ArgumentParser( + prog='Gateway', + description='EDDN Gateway server', + ) + + parser.add_argument( + '--loglevel', + help='Logging level to output at', + ) + + parser.add_argument( + '-c', '--config', + metavar='config filename', + nargs='?', + default=None, + ) + + return parser.parse_args() + + def extract_message_details(parsed_message): uploader_id = '<>' software_name = '<>' @@ -342,7 +364,12 @@ class EnableCors(object): def main(): - loadConfig() + + cl_args = parse_cl_args() + if cl_args.loglevel: + logger.setLevel(cl_args.loglevel) + + loadConfig(cl_args) configure() app.install(EnableCors()) diff --git a/src/eddn/conf/Settings.py b/src/eddn/conf/Settings.py index ce876b5..92753df 100644 --- a/src/eddn/conf/Settings.py +++ b/src/eddn/conf/Settings.py @@ -134,15 +134,14 @@ class _Settings(object): Settings = _Settings() -def loadConfig(): - ''' - Loads in a settings file specified on the commandline if one has been specified. +def loadConfig(cl_args): + """ + Load in a commandline-specified settings file, if applicable. + A convenience method if you don't need other things specified as commandline options. Otherwise, point the filename to Settings.loadFrom(). - ''' - parser = argparse.ArgumentParser() - parser.add_argument("-c", "--config", nargs="?", default=None) - args = parser.parse_args() - if args.config: - Settings.loadFrom(args.config) + :param cl_args: An `argparse.parse_args()` return. + """ + if cl_args.config: + Settings.loadFrom(cl_args.config) From 86b283f920818c6132b8f64405ab64b9a8b3306c Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 18 Jan 2022 15:09:56 +0000 Subject: [PATCH 06/29] Monitor.py: Minimal changes to allow `--loglevel ` The CL arg won't actually *do* anything yet, because this script doesn't actually have a logger set up at all. But we need to fake this else eddn.conf.Settings.loadConfig() won't be called correctly or work. --- src/eddn/Monitor.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/eddn/Monitor.py b/src/eddn/Monitor.py index 4c188d4..a31853f 100644 --- a/src/eddn/Monitor.py +++ b/src/eddn/Monitor.py @@ -4,6 +4,7 @@ Monitor sit below gateways, or another relay, and simply parse what it receives over SUB. """ from threading import Thread +import argparse import zlib import gevent import simplejson @@ -27,6 +28,26 @@ if Settings.RELAY_DUPLICATE_MAX_MINUTES: duplicateMessages.start() +def parse_cl_args(): + parser = argparse.ArgumentParser( + prog='Gateway', + description='EDDN Gateway server', + ) + + parser.add_argument( + '--loglevel', + help='CURRENTLY NO EFFECT - Logging level to output at', + ) + + parser.add_argument( + '-c', '--config', + metavar='config filename', + nargs='?', + default=None, + ) + + return parser.parse_args() + def date(__format): d = datetime.datetime.utcnow() return d.strftime(__format) @@ -237,7 +258,9 @@ class EnableCors(object): return _enable_cors def main(): - loadConfig() + cl_args = parse_cl_args() + loadConfig(cl_args) + m = Monitor() m.start() app.install(EnableCors()) From fe214583aac2d80287bf35c0771ed8a2c7615ffb Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 18 Jan 2022 15:16:32 +0000 Subject: [PATCH 07/29] Relay: Support `--loglevel ` fully There's no real logging in Relay yet, but this makes it support switching level anyway. --- src/eddn/Relay.py | 60 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 11 deletions(-) diff --git a/src/eddn/Relay.py b/src/eddn/Relay.py index 10629d4..4fbd990 100644 --- a/src/eddn/Relay.py +++ b/src/eddn/Relay.py @@ -4,20 +4,32 @@ Relays sit below an announcer, or another relay, and simply repeat what they receive over PUB/SUB. """ -# Logging has to be configured first before we do anything. +import argparse +import gevent +import hashlib import logging +import simplejson +import time +import uuid +import zlib from threading import Thread -import time - -logger = logging.getLogger(__name__) -import zlib - -import gevent -import simplejson -import hashlib -import uuid import zmq.green as zmq + + +# Logging has to be configured first before we do anything. +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) +__logger_channel = logging.StreamHandler() +__logger_formatter = logging.Formatter( + '%(asctime)s - %(levelname)s - %(module)s:%(lineno)d: %(message)s' + ) +__logger_formatter.default_time_format = '%Y-%m-%d %H:%M:%S' +__logger_formatter.default_msec_format = '%s.%03d' +__logger_channel.setFormatter(__logger_formatter) +logger.addHandler(__logger_channel) +logger.info('Made logger') + from eddn.conf.Settings import Settings, loadConfig from gevent import monkey @@ -25,6 +37,7 @@ monkey.patch_all() from bottle import Bottle, get, request, response, run app = Bottle() + # This import must be done post-monkey-patching! from eddn.core.StatsCollector import StatsCollector statsCollector = StatsCollector() @@ -37,6 +50,26 @@ if Settings.RELAY_DUPLICATE_MAX_MINUTES: duplicateMessages.start() +def parse_cl_args(): + parser = argparse.ArgumentParser( + prog='Gateway', + description='EDDN Gateway server', + ) + + parser.add_argument( + '--loglevel', + help='Logging level to output at', + ) + + parser.add_argument( + '-c', '--config', + metavar='config filename', + nargs='?', + default=None, + ) + + return parser.parse_args() + @app.route('/stats/', method=['OPTIONS', 'GET']) def stats(): stats = statsCollector.getSummary() @@ -171,7 +204,12 @@ class EnableCors(object): def main(): - loadConfig() + cl_args = parse_cl_args() + if cl_args.loglevel: + logger.setLevel(cl_args.loglevel) + + loadConfig(cl_args) + r = Relay() r.start() From 6986af7ca0d5e0592e3a5105d543acba7cdf2c3f Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 18 Jan 2022 15:17:45 +0000 Subject: [PATCH 08/29] Settings.py: Remove `import argparse` CL arg parsing is done in main scripts now. --- src/eddn/conf/Settings.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/eddn/conf/Settings.py b/src/eddn/conf/Settings.py index 92753df..faac1c0 100644 --- a/src/eddn/conf/Settings.py +++ b/src/eddn/conf/Settings.py @@ -1,6 +1,5 @@ # coding: utf8 -import argparse import simplejson from eddn.conf.Version import __version__ as version From 8f7910a5d966934992b994c998876ed6b708d004 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 18 Jan 2022 15:22:02 +0000 Subject: [PATCH 09/29] Bouncer: Support `--loglevel ` CL arg This also aligns the general logger setup with the other scripts --- src/eddn/Bouncer.py | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/src/eddn/Bouncer.py b/src/eddn/Bouncer.py index b2e51f1..93fa673 100644 --- a/src/eddn/Bouncer.py +++ b/src/eddn/Bouncer.py @@ -26,6 +26,7 @@ Architecture: 4. `push_message()` then sends the message to the configured live/real Gateway. """ +import argparse import gevent import hashlib import logging @@ -47,8 +48,15 @@ from bottle import Bottle, run, request, response, get, post app = Bottle() logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) -logger.addHandler(logging.StreamHandler()) +logger.setLevel(logging.INFO) +__logger_channel = logging.StreamHandler() +__logger_formatter = logging.Formatter( + '%(asctime)s - %(levelname)s - %(module)s:%(lineno)d: %(message)s' + ) +__logger_formatter.default_time_format = '%Y-%m-%d %H:%M:%S' +__logger_formatter.default_msec_format = '%s.%03d' +__logger_channel.setFormatter(__logger_formatter) +logger.addHandler(__logger_channel) logger.info('Made logger') @@ -57,6 +65,27 @@ from eddn.core.StatsCollector import StatsCollector statsCollector = StatsCollector() statsCollector.start() + +def parse_cl_args(): + parser = argparse.ArgumentParser( + prog='Gateway', + description='EDDN Gateway server', + ) + + parser.add_argument( + '--loglevel', + help='Logging level to output at', + ) + + parser.add_argument( + '-c', '--config', + metavar='config filename', + nargs='?', + default=None, + ) + + return parser.parse_args() + def push_message(message_body): """ Spawned as a greenlet to push messages (strings) through ZeroMQ. @@ -243,8 +272,12 @@ class CustomLogging(object): return _log_to_logger def main(): + cl_args = parse_cl_args() + if cl_args.loglevel: + logger.setLevel(cl_args.loglevel) + logger.info('Loading config...') - loadConfig() + loadConfig(cl_args) logger.info('Installing EnableCors ...') app.install(EnableCors()) From 8d5b03915bb142d79a621a7490f320d01b481c21 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 18 Jan 2022 15:53:06 +0000 Subject: [PATCH 10/29] Gateway: Log where upload data is form-encoded We suspect no-one is actually using this possible form of upload, and ideally would remove the code for it entirely. First we need to log any uploaders that do use this form to be sure. --- src/eddn/Gateway.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/eddn/Gateway.py b/src/eddn/Gateway.py index 3e33132..19912ed 100644 --- a/src/eddn/Gateway.py +++ b/src/eddn/Gateway.py @@ -160,6 +160,7 @@ def get_decompressed_message(): # Auto header checking. logger.debug('Trying zlib.decompress (15 + 32)...') message_body = zlib.decompress(request.body.read(), 15 + 32) + except zlib.error: logger.error('zlib.error, trying zlib.decompress (-15)') # Negative wbits suppresses adler32 checksumming. @@ -171,12 +172,14 @@ def get_decompressed_message(): # body. If it's not form-encoded, this will return an empty dict. form_enc_parsed = urlparse.parse_qs(message_body) if form_enc_parsed: - logger.debug('Request is form-encoded') + logger.info('Request is form-encoded, compressed, from %s' % (get_remote_address())) # This is a form-encoded POST. The value of the data attrib will # be the body we're looking for. try: message_body = form_enc_parsed['data'][0] + except (KeyError, IndexError): + logger.error('form-encoded, compressed, upload did not contain a "data" key. From %s', get_remote_address()) raise MalformedUploadError( "No 'data' POST key/value found. Check your POST key " "name for spelling, and make sure you're passing a value." @@ -192,7 +195,7 @@ def get_decompressed_message(): # POST key/vals, or un-encoded body. data_key = request.forms.get('data') if data_key: - logger.debug('form-encoded POST request detected...') + logger.info('Request is form-encoded, uncompressed, from %s' % (get_remote_address())) # This is a form-encoded POST. Support the silly people. message_body = data_key From 7819eff82665304aed3f6cc966025e66198b8cf0 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Thu, 20 Jan 2022 11:32:08 +0000 Subject: [PATCH 11/29] schemas/README: Give some hints about odyssey/horizons flags --- schemas/README-EDDN-schemas.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/schemas/README-EDDN-schemas.md b/schemas/README-EDDN-schemas.md index b4651d8..bbdbc43 100644 --- a/schemas/README-EDDN-schemas.md +++ b/schemas/README-EDDN-schemas.md @@ -245,6 +245,17 @@ Each `message` object must have, at bare minimum: will be much more than this. Consult the [schemas and their documentation](./). +Where the schema allows for them, add the `horizons` and `odyssey` +keys with boolean values. `null` is not allowed in the values, so if +you cannot determine a value do not include that key at all. The best +source of these is the `LoadGame` event from journals. It's present +both in the PC local files and the CAPI journal data. If you're +composing a shipyard or outfitting message from CAPI data then it is +possible to synthesise the `horizons` flag. For now consult the function +`capi_is_horizons()` in +[EDMarketConnector:plugins/eddn.py](https://github.com/EDCD/EDMarketConnector/blob/stable/plugins/eddn.py) +for a method to achieve this. + Because the first versions of some schemas were defined when only the CAPI data was available, before Journal files existed, many of the key names chosen in the schemas are based on the equivalent in CAPI data, not Journal events. From 853c309df0a104d755acdb7f18194709c36f0a5e Mon Sep 17 00:00:00 2001 From: Athanasius Date: Thu, 20 Jan 2022 11:40:41 +0000 Subject: [PATCH 12/29] schemas/README: Give examples of `LoadGame` for `Horizons`/`Odyssey` flags --- schemas/README-EDDN-schemas.md | 44 +++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/schemas/README-EDDN-schemas.md b/schemas/README-EDDN-schemas.md index bbdbc43..50c1dfd 100644 --- a/schemas/README-EDDN-schemas.md +++ b/schemas/README-EDDN-schemas.md @@ -245,17 +245,6 @@ Each `message` object must have, at bare minimum: will be much more than this. Consult the [schemas and their documentation](./). -Where the schema allows for them, add the `horizons` and `odyssey` -keys with boolean values. `null` is not allowed in the values, so if -you cannot determine a value do not include that key at all. The best -source of these is the `LoadGame` event from journals. It's present -both in the PC local files and the CAPI journal data. If you're -composing a shipyard or outfitting message from CAPI data then it is -possible to synthesise the `horizons` flag. For now consult the function -`capi_is_horizons()` in -[EDMarketConnector:plugins/eddn.py](https://github.com/EDCD/EDMarketConnector/blob/stable/plugins/eddn.py) -for a method to achieve this. - Because the first versions of some schemas were defined when only the CAPI data was available, before Journal files existed, many of the key names chosen in the schemas are based on the equivalent in CAPI data, not Journal events. @@ -279,6 +268,39 @@ changes to your code. It is also advisable to Watch this repository on GitHub so as to be aware of any changes to schemas. +#### `horizons` and `odyssey` flags + +Where the schema allows for them, add the `horizons` and `odyssey` +keys with boolean values. `null` is not allowed in the values, so if +you cannot determine a value do not include that key at all. The best +source of these is the `LoadGame` event from journals. It's present +both in the PC local files and the CAPI journal data. If you're +composing a shipyard or outfitting message from CAPI data then it is +possible to synthesise the `horizons` flag. For now consult the function +`capi_is_horizons()` in +[EDMarketConnector:plugins/eddn.py](https://github.com/EDCD/EDMarketConnector/blob/stable/plugins/eddn.py) +for a method to achieve this. + +As of 2022-01-22 the following was observed for the `LoadGame` events as +present in CAPI-sourced Journal files (which were confirmed to match the +PC-local files for these events): + +- PC Odyssey Client, game version `4.0.0.1002`: + ```json + { "timestamp":"2022-01-20T11:15:22Z", "event":"LoadGame", "FID":"F", "Commander":"", "Horizons":true, "Odyssey":true,... + ``` +- PC Horizons Client, game version `3.8.0.403`, no `Odyssey` key was + present: + ```json + { "timestamp":"2022-01-20T11:20:17Z", "event":"LoadGame", "FID":"F", "Commander":"", "Horizons":true,... + ``` + +- PC 'base' Client, game version `3.8.0.403`, no `Odyssey` key was + present: + ```json + { "timestamp":"2022-01-20T11:22:54Z", "event":"LoadGame", "FID":"F", "Commander":"", "Horizons":false,... + ``` + ### Server responses There are three possible sources of HTTP responses when sending an upload to EDDN. From a8f657c2d6a5354df19df778780cbc2f75601174 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Fri, 21 Jan 2022 09:43:55 +0000 Subject: [PATCH 13/29] schemas/README: bottle body size limit *is* affected by compression I explicitly tested this with a 50KiB limit on beta EDDN service: 1. 49973 byte message does make it through, in plain text. 2. 51312 byte message, no compression, 413. 3. Same message, with gzip compression, 200 4. The 149242 byte file I based those extra ones on also makes it through when compressed. Indeed the Gateway logging cites the compressed-body size. `bottle` isn't looking at the message and magically decompressing it in order to check plain-text size. --- schemas/README-EDDN-schemas.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/schemas/README-EDDN-schemas.md b/schemas/README-EDDN-schemas.md index 50c1dfd..3de98f6 100644 --- a/schemas/README-EDDN-schemas.md +++ b/schemas/README-EDDN-schemas.md @@ -332,8 +332,10 @@ make a valid request" responses you might experience the following: #### bottle responses 1. `413` - `Payload Too Large` - `bottle` enforces a maximum request size - and the request exceeds that. As of 2022-01-07 the limit is 1MiB, and - pertains to the plain-text size, not after gzip compression if used. + and the request exceeds that. As of 2022-01-07 the limit is 1MiB, + which is versus the compressed size of the body, if compression is + used. Thus compression *will* allow for sending approximately 10x + larger messages. To verify the current limit check for the line that looks like: ``` From 4f3225c3af604f6bbdd2c5380dc0c671766c62f0 Mon Sep 17 00:00:00 2001 From: robbyxp1 Date: Thu, 27 Jan 2022 11:10:59 +0000 Subject: [PATCH 14/29] Add Approachsettlement --- schemas/approachsettlement-README.md | 33 +++++++++++ schemas/approachsettlement-v1.0.json | 89 ++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 schemas/approachsettlement-README.md create mode 100644 schemas/approachsettlement-v1.0.json diff --git a/schemas/approachsettlement-README.md b/schemas/approachsettlement-README.md new file mode 100644 index 0000000..e4af2af --- /dev/null +++ b/schemas/approachsettlement-README.md @@ -0,0 +1,33 @@ +# EDDN ApproachSettlement Schema + +## Introduction +Here we document how to take data from an ED `FSSAllBodiesFound` Journal +Event and properly structure it for sending to EDDN. + +Please consult [EDDN Schemas README](./README-EDDN-schemas.md) for general +documentation for a schema such as this. + +## Senders +The primary data source for this schema is the ED Journal event +`ApproachSettlement`. + +### Key Renames +Many of the key names have a different case defined in this schema, make +sure you are renaming them as appropriate. + +### Elisions +None + +### Augmentations +#### horizons flag +You SHOULD add this key/value pair, using the value from the `LoadGame` event. + +#### odyssey flag +You SHOULD add this key/value pair, using the value from the `LoadGame` event. + +#### StarSystem + +You MUST add a StarSystem key/value pair representing the name of the system this event occurred in. Source this from either Location, FSDJump or CarrierJump as appropriate. + +#### StarPos +You MUST add a `StarPos` array containing the system co-ordinates from the last `FSDJump`, `CarrierJump`, or `Location` event. diff --git a/schemas/approachsettlement-v1.0.json b/schemas/approachsettlement-v1.0.json new file mode 100644 index 0000000..958d5d3 --- /dev/null +++ b/schemas/approachsettlement-v1.0.json @@ -0,0 +1,89 @@ +{ + "$schema" : "http://json-schema.org/draft-04/schema#", + "id" : "https://eddn.edcd.io/schemas/approachsettlement/1#", + "type" : "object", + "additionalProperties" : false, + "required": [ "$schemaRef", "header", "message" ], + "properties": { + "$schemaRef": { + "type" : "string" + }, + "header": { + "type" : "object", + "additionalProperties" : true, + "required" : [ "uploaderID", "softwareName", "softwareVersion" ], + "properties" : { + "uploaderID": { + "type" : "string" + }, + "softwareName": { + "type" : "string" + }, + "softwareVersion": { + "type" : "string" + }, + "gatewayTimestamp": { + "type" : "string", + "format" : "date-time", + "description" : "Timestamp upon receipt at the gateway. If present, this property will be overwritten by the gateway; submitters are not intended to populate this property." + } + } + }, + "message": { + "type" : "object", + "description" : "Contains all properties from the listed events in the client's journal minus the event key, Localised strings and the properties marked below as 'disallowed'", + "additionalProperties" : false, + "required" : [ "timestamp", "StarSystem", "StarPos", "SystemAddress", "Name", "MarketID", "BodyID", "BodyName", "Latitude", "Longitude" ], + "properties" : { + "timestamp": { + "type" : "string", + "format" : "date-time" + }, + "horizons": { + "type" : "boolean", + "description" : "Whether the sending Cmdr has a Horizons pass." + }, + "odyssey": { + "type" : "boolean", + "description" : "Whether the sending Cmdr has an Odyssey expansion." + }, + "StarSystem": { + "type" : "string", + "minLength" : 1 + }, + "StarPos": { + "type" : "array", + "items" : { "type": "number" }, + "minItems" : 3, + "maxItems" : 3, + "description" : "Must be added by the sender" + }, + "SystemAddress": { + "type" : "integer", + }, + "Name" : { + "type" : "string", + "description" : "Name of settlement" + }, + "MarketID": { + "type" : "integer" + }, + "BodyID": { + "type" : "integer" + }, + "BodyName": { + "type" : "string" + }, + "Latitude": { + "type" : "number" + }, + "Longitude": { + "type" : "number" + } + } + } + }, + "definitions": { + "disallowed" : { "not" : { "type": [ "array", "boolean", "integer", "number", "null", "object", "string" ] } } + } +} From 42742ae9e6a9b283a1bf5379ac250b2e3748fd5f Mon Sep 17 00:00:00 2001 From: robbyxp1 Date: Thu, 27 Jan 2022 11:30:57 +0000 Subject: [PATCH 15/29] Add back in event after discussion --- schemas/approachsettlement-v1.0.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/schemas/approachsettlement-v1.0.json b/schemas/approachsettlement-v1.0.json index 958d5d3..7f974a6 100644 --- a/schemas/approachsettlement-v1.0.json +++ b/schemas/approachsettlement-v1.0.json @@ -31,7 +31,7 @@ }, "message": { "type" : "object", - "description" : "Contains all properties from the listed events in the client's journal minus the event key, Localised strings and the properties marked below as 'disallowed'", + "description" : "Contains all properties from the listed events in the client's journal minus the Localised strings and the properties marked below as 'disallowed'", "additionalProperties" : false, "required" : [ "timestamp", "StarSystem", "StarPos", "SystemAddress", "Name", "MarketID", "BodyID", "BodyName", "Latitude", "Longitude" ], "properties" : { @@ -39,6 +39,9 @@ "type" : "string", "format" : "date-time" }, + "event" : { + "enum" : [ "ApproachBody" ] + }, "horizons": { "type" : "boolean", "description" : "Whether the sending Cmdr has a Horizons pass." From 5c5ce32d09e2403f01e21fc363b1ac4145733efd Mon Sep 17 00:00:00 2001 From: Athanasius Date: Thu, 27 Jan 2022 12:31:48 +0000 Subject: [PATCH 16/29] schemas/README: Preserve Journal event key:value, even if redundant --- schemas/README-EDDN-schemas.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/schemas/README-EDDN-schemas.md b/schemas/README-EDDN-schemas.md index 3de98f6..2773270 100644 --- a/schemas/README-EDDN-schemas.md +++ b/schemas/README-EDDN-schemas.md @@ -244,6 +244,10 @@ Each `message` object must have, at bare minimum: 2. At least one other key/value pair representing the data. In general there will be much more than this. Consult the [schemas and their documentation](./). +3. Where the data is sourced from a Journal event please do preserve the + event key and value. Yes, where we use an event-specific schema this + might seem redundant, but it might aid an EDDN listener in streamlining + their code, and it does no harm. Because the first versions of some schemas were defined when only the CAPI data was available, before Journal files existed, many of the key names chosen From e85e3d4b85f032d828bc05a1aa8f123ac4a1873f Mon Sep 17 00:00:00 2001 From: robbyxp1 Date: Thu, 27 Jan 2022 13:09:50 +0000 Subject: [PATCH 17/29] Fix tab issue, add description --- schemas/approachsettlement-v1.0.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/schemas/approachsettlement-v1.0.json b/schemas/approachsettlement-v1.0.json index 7f974a6..c5cfb2e 100644 --- a/schemas/approachsettlement-v1.0.json +++ b/schemas/approachsettlement-v1.0.json @@ -53,6 +53,7 @@ "StarSystem": { "type" : "string", "minLength" : 1 + "description" : "Must be added by the sender" }, "StarPos": { "type" : "array", @@ -67,17 +68,17 @@ "Name" : { "type" : "string", "description" : "Name of settlement" - }, + }, "MarketID": { "type" : "integer" }, - "BodyID": { + "BodyID": { "type" : "integer" }, "BodyName": { "type" : "string" }, - "Latitude": { + "Latitude": { "type" : "number" }, "Longitude": { From eba946bf99d5359bb4fef54e36abbd5ee31a5371 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Thu, 27 Jan 2022 18:22:07 +0000 Subject: [PATCH 18/29] Add .editorconfig to enforce some standards --- .editorconfig | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..977ec02 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,21 @@ +# This is the project top-level .editorconfig +root = true + +# Defaults for all file types +[*] +# 4-space indents, no TABs +indent_style = space +tab_width = 4 +indent_size = tab + +# Hard-wrap at 120 columns +max_line_length = 119 + +# Unix EOL, single \n +end_of_line = lf + +# UTF-8 is the only sensible option, no BOM +charset = utf-8 + +# All files should have a final newline +insert_final_newline = true From 8ac2ac8ac603c315d69d65e7fbf7b822d120bf33 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Thu, 27 Jan 2022 18:23:28 +0000 Subject: [PATCH 19/29] Start a docs/Contributing.md * Call out the .editorconfig file --- docs/Contributing.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 docs/Contributing.md diff --git a/docs/Contributing.md b/docs/Contributing.md new file mode 100644 index 0000000..1eaadd3 --- /dev/null +++ b/docs/Contributing.md @@ -0,0 +1,13 @@ +# Contributing to the EDDN Project + +## Introduction + +This file is still mostly a stub. + +## Text format + +The project contains an `.editorconfig` file at its root. Please either ensure +your editor is taking note of those settings, or cross-check its contents +with the +[editorconfig documentation](https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties) +, and ensure your editor/IDE's settings match. From 3b7c002b51255f8b153babdbaa6183e09a598c93 Mon Sep 17 00:00:00 2001 From: robbyxp1 Date: Fri, 28 Jan 2022 08:14:45 +0000 Subject: [PATCH 20/29] Add schema to settings --- src/eddn/conf/Settings.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/eddn/conf/Settings.py b/src/eddn/conf/Settings.py index faac1c0..af15e95 100644 --- a/src/eddn/conf/Settings.py +++ b/src/eddn/conf/Settings.py @@ -73,6 +73,9 @@ class _Settings(object): "https://eddn.edcd.io/schemas/navroute/1" : "schemas/navroute-v1.0.json", "https://eddn.edcd.io/schemas/navroute/1/test" : "schemas/navroute-v1.0.json", + + "https://eddn.edcd.io/schemas/approachsettlement/1" : "schemas/approachsettlement-v1.0.json", + "https://eddn.edcd.io/schemas/approachsettlement/1/test" : "schemas/approachsettlement-v1.0.json", } GATEWAY_OUTDATED_SCHEMAS = [ From 87a81aaa376c4f318d43082303569af59b05f9ab Mon Sep 17 00:00:00 2001 From: robbyxp1 Date: Fri, 28 Jan 2022 13:47:01 +0000 Subject: [PATCH 21/29] Fix comma typo in ApproachSettlement JSON and fix readme --- schemas/approachsettlement-README.md | 2 +- schemas/approachsettlement-v1.0.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/schemas/approachsettlement-README.md b/schemas/approachsettlement-README.md index e4af2af..44d72ca 100644 --- a/schemas/approachsettlement-README.md +++ b/schemas/approachsettlement-README.md @@ -1,7 +1,7 @@ # EDDN ApproachSettlement Schema ## Introduction -Here we document how to take data from an ED `FSSAllBodiesFound` Journal +Here we document how to take data from an ED `ApproachSettlement` Journal Event and properly structure it for sending to EDDN. Please consult [EDDN Schemas README](./README-EDDN-schemas.md) for general diff --git a/schemas/approachsettlement-v1.0.json b/schemas/approachsettlement-v1.0.json index c5cfb2e..6685f29 100644 --- a/schemas/approachsettlement-v1.0.json +++ b/schemas/approachsettlement-v1.0.json @@ -52,7 +52,7 @@ }, "StarSystem": { "type" : "string", - "minLength" : 1 + "minLength" : 1, "description" : "Must be added by the sender" }, "StarPos": { @@ -63,7 +63,7 @@ "description" : "Must be added by the sender" }, "SystemAddress": { - "type" : "integer", + "type" : "integer" }, "Name" : { "type" : "string", From 5ff342cc8bf56451d2c605ddf6a2e33063d5b630 Mon Sep 17 00:00:00 2001 From: robbyxp1 Date: Fri, 28 Jan 2022 13:52:20 +0000 Subject: [PATCH 22/29] Add event to required list --- schemas/approachsettlement-v1.0.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemas/approachsettlement-v1.0.json b/schemas/approachsettlement-v1.0.json index 6685f29..a656bb7 100644 --- a/schemas/approachsettlement-v1.0.json +++ b/schemas/approachsettlement-v1.0.json @@ -33,7 +33,7 @@ "type" : "object", "description" : "Contains all properties from the listed events in the client's journal minus the Localised strings and the properties marked below as 'disallowed'", "additionalProperties" : false, - "required" : [ "timestamp", "StarSystem", "StarPos", "SystemAddress", "Name", "MarketID", "BodyID", "BodyName", "Latitude", "Longitude" ], + "required" : [ "timestamp", "event", "StarSystem", "StarPos", "SystemAddress", "Name", "MarketID", "BodyID", "BodyName", "Latitude", "Longitude" ], "properties" : { "timestamp": { "type" : "string", From 3690aab87eef04f37071fd45ca095e41317686eb Mon Sep 17 00:00:00 2001 From: robbyxp1 Date: Fri, 28 Jan 2022 15:10:36 +0000 Subject: [PATCH 23/29] Fix another typo in ApproachSettlement event tag --- schemas/approachsettlement-v1.0.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemas/approachsettlement-v1.0.json b/schemas/approachsettlement-v1.0.json index a656bb7..571db77 100644 --- a/schemas/approachsettlement-v1.0.json +++ b/schemas/approachsettlement-v1.0.json @@ -40,7 +40,7 @@ "format" : "date-time" }, "event" : { - "enum" : [ "ApproachBody" ] + "enum" : [ "ApproachSettlement" ] }, "horizons": { "type" : "boolean", From 1678c467d7da3ef18907bc9fddbd33894662e9b6 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Fri, 28 Jan 2022 15:14:00 +0000 Subject: [PATCH 24/29] scripts/testing: Various additional inputs to test-sender --- .../gateway-responses/approachsettlement.json | 23 + .../commodity-just-over-50KiB.json | 2266 +++++++++++++++++ .../commodity-just-under-50KiB.json | 2206 ++++++++++++++++ .../commodity-smallest-message.json | 1 + .../gateway-responses/fssallbodiesfound.json | 18 + .../shipyard-smallest-message.json | 1 + 6 files changed, 4515 insertions(+) create mode 100644 scripts/testing/gateway-responses/approachsettlement.json create mode 100644 scripts/testing/gateway-responses/commodity-just-over-50KiB.json create mode 100644 scripts/testing/gateway-responses/commodity-just-under-50KiB.json create mode 100644 scripts/testing/gateway-responses/commodity-smallest-message.json create mode 100644 scripts/testing/gateway-responses/fssallbodiesfound.json create mode 100644 scripts/testing/gateway-responses/shipyard-smallest-message.json diff --git a/scripts/testing/gateway-responses/approachsettlement.json b/scripts/testing/gateway-responses/approachsettlement.json new file mode 100644 index 0000000..65f4906 --- /dev/null +++ b/scripts/testing/gateway-responses/approachsettlement.json @@ -0,0 +1,23 @@ +{ + "$schemaRef": "https://eddn.edcd.io/schemas/approachsettlement/1", + "header": { + "uploaderID": "from Athanasius Testing", + "softwareName": "Athanasius Testing script", + "softwareVersion": "v0.0.1" + }, + "message": { + "timestamp":"2021-10-14T12:37:54Z", + "event":"ApproachSettlement", + "Name":"Arnold Defence Base", + "MarketID":3915738368, + "SystemAddress":2381282543963, + "StarSystem": "Ix", + "BodyID":32, + "BodyName":"Ix 5 a a", + "Latitude":17.090912, + "Longitude":160.236679, + "StarPos": [ + -65.21875 , 7.75 , -111.03125 + ] + } +} diff --git a/scripts/testing/gateway-responses/commodity-just-over-50KiB.json b/scripts/testing/gateway-responses/commodity-just-over-50KiB.json new file mode 100644 index 0000000..c9df676 --- /dev/null +++ b/scripts/testing/gateway-responses/commodity-just-over-50KiB.json @@ -0,0 +1,2266 @@ +{ + "$schemaRef": "https://eddn.edcd.io/schemas/commodity/3", + "message": { + "timestamp": "2022-01-06T11:19:27Z", + "systemName": "LP 98-132", + "stationName": "Freeport", + "marketId": 128008448, + "commodities": [ + { + "name": "advancedcatalysers", + "meanPrice": 3039, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3756, + "demand": 936, + "demandBracket": 3 + }, + { + "name": "advancedmedicines", + "meanPrice": 1485, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1726, + "demand": 296, + "demandBracket": 3 + }, + { + "name": "advert1", + "meanPrice": 21542, + "buyPrice": 15267, + "stock": 0, + "stockBracket": 0, + "sellPrice": 15266, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "aerialedenapple", + "meanPrice": 8331, + "buyPrice": 1660, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1659, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "agriculturalmedicines", + "meanPrice": 1231, + "buyPrice": 543, + "stock": 0, + "stockBracket": 0, + "sellPrice": 542, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "agronomictreatment", + "meanPrice": 3105, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 15596, + "demand": 2, + "demandBracket": 3 + }, + { + "name": "alacarakmoskinart", + "meanPrice": 8899, + "buyPrice": 1858, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1857, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "albinoquechuamammoth", + "meanPrice": 9687, + "buyPrice": 2663, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2662, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "alexandrite", + "meanPrice": 217277, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 357530, + "demand": 2, + "demandBracket": 3 + }, + { + "name": "algae", + "meanPrice": 356, + "buyPrice": 23, + "stock": 0, + "stockBracket": 0, + "sellPrice": 22, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "alieneggs", + "meanPrice": 25067, + "buyPrice": 19095, + "stock": 0, + "stockBracket": 0, + "sellPrice": 19094, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "altairianskin", + "meanPrice": 8432, + "buyPrice": 1262, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1261, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "aluminium", + "meanPrice": 551, + "buyPrice": 1127, + "stock": 352, + "stockBracket": 2, + "sellPrice": 1045, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "alyabodilysoap", + "meanPrice": 8218, + "buyPrice": 1078, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1077, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ancientcasket", + "meanPrice": 16294, + "buyPrice": 5581, + "stock": 0, + "stockBracket": 0, + "sellPrice": 5580, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ancientkey", + "meanPrice": 29931, + "buyPrice": 9760, + "stock": 0, + "stockBracket": 0, + "sellPrice": 9759, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ancientorb", + "meanPrice": 17415, + "buyPrice": 5967, + "stock": 0, + "stockBracket": 0, + "sellPrice": 5966, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ancientrelic", + "meanPrice": 24962, + "buyPrice": 9126, + "stock": 0, + "stockBracket": 0, + "sellPrice": 9125, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ancienttablet", + "meanPrice": 17415, + "buyPrice": 5967, + "stock": 0, + "stockBracket": 0, + "sellPrice": 5966, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ancienttotem", + "meanPrice": 20437, + "buyPrice": 7379, + "stock": 0, + "stockBracket": 0, + "sellPrice": 7378, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ancienturn", + "meanPrice": 14907, + "buyPrice": 3907, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3906, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "anduligafireworks", + "meanPrice": 8519, + "buyPrice": 1574, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1573, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "animalmeat", + "meanPrice": 1539, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1695, + "demand": 26, + "demandBracket": 1 + }, + { + "name": "animalmonitors", + "meanPrice": 537, + "buyPrice": 630, + "stock": 0, + "stockBracket": 0, + "sellPrice": 629, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "antiquejewellery", + "meanPrice": 183163, + "buyPrice": 158957, + "stock": 0, + "stockBracket": 0, + "sellPrice": 158949, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "anynacoffee", + "meanPrice": 9160, + "buyPrice": 2165, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2164, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "apavietii", + "meanPrice": 10362, + "buyPrice": 3386, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3385, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "aquaponicsystems", + "meanPrice": 524, + "buyPrice": 321, + "stock": 0, + "stockBracket": 0, + "sellPrice": 320, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "aroucaconventualsweets", + "meanPrice": 8737, + "buyPrice": 1557, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1556, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "articulationmotors", + "meanPrice": 7588, + "buyPrice": 4463, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4462, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "assaultplans", + "meanPrice": 26074, + "buyPrice": 3294, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3293, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "atmosphericextractors", + "meanPrice": 571, + "buyPrice": 331, + "stock": 0, + "stockBracket": 0, + "sellPrice": 330, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "autofabricators", + "meanPrice": 3827, + "buyPrice": 2685, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2684, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "azcancriformula42", + "meanPrice": 12440, + "buyPrice": 6106, + "stock": 0, + "stockBracket": 0, + "sellPrice": 6105, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "bakedgreebles", + "meanPrice": 8211, + "buyPrice": 1056, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1055, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "baltahsinevacuumkrill", + "meanPrice": 8479, + "buyPrice": 1502, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1501, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "bankiamphibiousleather", + "meanPrice": 8338, + "buyPrice": 1138, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1137, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "basicmedicines", + "meanPrice": 493, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 963, + "demand": 904, + "demandBracket": 3 + }, + { + "name": "bastsnakegin", + "meanPrice": 8659, + "buyPrice": 1724, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1723, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "battleweapons", + "meanPrice": 7451, + "buyPrice": 4463, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4462, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "bauxite", + "meanPrice": 1140, + "buyPrice": 10730, + "stock": 595, + "stockBracket": 1, + "sellPrice": 10270, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "beer", + "meanPrice": 430, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 799, + "demand": 1777, + "demandBracket": 3 + }, + { + "name": "belalansrayleather", + "meanPrice": 8519, + "buyPrice": 1605, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1604, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "benitoite", + "meanPrice": 149395, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 570449, + "demand": 2, + "demandBracket": 3 + }, + { + "name": "bertrandite", + "meanPrice": 18817, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 21216, + "demand": 1047, + "demandBracket": 2 + }, + { + "name": "beryllium", + "meanPrice": 8243, + "buyPrice": 8041, + "stock": 2, + "stockBracket": 1, + "sellPrice": 7948, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "bioreducinglichen", + "meanPrice": 1204, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1703, + "demand": 5473, + "demandBracket": 3 + }, + { + "name": "biowaste", + "meanPrice": 358, + "buyPrice": 145, + "stock": 103, + "stockBracket": 1, + "sellPrice": 87, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "bismuth", + "meanPrice": 2441, + "buyPrice": 1607, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1606, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "bluemilk", + "meanPrice": 10805, + "buyPrice": 3912, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3911, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "bromellite", + "meanPrice": 30424, + "buyPrice": 70950, + "stock": 0, + "stockBracket": 0, + "sellPrice": 70946, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "buckyballbeermats", + "meanPrice": 7957, + "buyPrice": 8230, + "stock": 0, + "stockBracket": 0, + "sellPrice": 8229, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "buildingfabricators", + "meanPrice": 2312, + "buyPrice": 1448, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1447, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "cd75catcoffee", + "meanPrice": 9571, + "buyPrice": 2452, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2451, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "centaurimegagin", + "meanPrice": 10217, + "buyPrice": 3239, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3238, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ceramiccomposites", + "meanPrice": 415, + "buyPrice": 424, + "stock": 0, + "stockBracket": 0, + "sellPrice": 423, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ceremonialheiketea", + "meanPrice": 9251, + "buyPrice": 2161, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2160, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "cetiaepyornisegg", + "meanPrice": 9769, + "buyPrice": 2741, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2740, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "cetirabbits", + "meanPrice": 9079, + "buyPrice": 2068, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2067, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "chameleoncloth", + "meanPrice": 9071, + "buyPrice": 1959, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1958, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "chateaudeaegaeon", + "meanPrice": 8791, + "buyPrice": 1610, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1609, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "chemicalwaste", + "meanPrice": 672, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 599, + "demand": 159, + "demandBracket": 3 + }, + { + "name": "cherbonesbloodcrystals", + "meanPrice": 16714, + "buyPrice": 10207, + "stock": 0, + "stockBracket": 0, + "sellPrice": 10206, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "chieridanimarinepaste", + "meanPrice": 8450, + "buyPrice": 1426, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1425, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "classifiedexperimentalequipment", + "meanPrice": 11423, + "buyPrice": 4002, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4001, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "clothing", + "meanPrice": 546, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 963, + "demand": 955, + "demandBracket": 3 + }, + { + "name": "cmmcomposite", + "meanPrice": 5988, + "buyPrice": 3907, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3906, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "cobalt", + "meanPrice": 3762, + "buyPrice": 13474, + "stock": 724, + "stockBracket": 1, + "sellPrice": 12870, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "coffee", + "meanPrice": 1499, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2303, + "demand": 527, + "demandBracket": 3 + }, + { + "name": "coltan", + "meanPrice": 6163, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 7849, + "demand": 2063, + "demandBracket": 3 + }, + { + "name": "comercialsamples", + "meanPrice": 1815, + "buyPrice": 656, + "stock": 0, + "stockBracket": 0, + "sellPrice": 655, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "computercomponents", + "meanPrice": 776, + "buyPrice": 267, + "stock": 0, + "stockBracket": 0, + "sellPrice": 266, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "conductivefabrics", + "meanPrice": 709, + "buyPrice": 1937, + "stock": 55, + "stockBracket": 1, + "sellPrice": 1810, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "consumertechnology", + "meanPrice": 6690, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 6883, + "demand": 0, + "demandBracket": 1 + }, + { + "name": "coolinghoses", + "meanPrice": 1886, + "buyPrice": 707, + "stock": 0, + "stockBracket": 0, + "sellPrice": 706, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "copper", + "meanPrice": 689, + "buyPrice": 1115, + "stock": 474, + "stockBracket": 2, + "sellPrice": 1042, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "coquimspongiformvictuals", + "meanPrice": 8077, + "buyPrice": 10924, + "stock": 0, + "stockBracket": 0, + "sellPrice": 10923, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "cropharvesters", + "meanPrice": 2230, + "buyPrice": 1564, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1563, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "cryolite", + "meanPrice": 12173, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 14970, + "demand": 1166, + "demandBracket": 3 + }, + { + "name": "crystallinespheres", + "meanPrice": 12216, + "buyPrice": 5438, + "stock": 0, + "stockBracket": 0, + "sellPrice": 5437, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "damnacarapaces", + "meanPrice": 8120, + "buyPrice": 2925, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2924, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "datacore", + "meanPrice": 6791, + "buyPrice": 3907, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3906, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "deltaphoenicispalms", + "meanPrice": 8188, + "buyPrice": 1528, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1527, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "deuringastruffles", + "meanPrice": 9232, + "buyPrice": 2335, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2334, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "diagnosticsensor", + "meanPrice": 6727, + "buyPrice": 4463, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4462, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "diplomaticbag", + "meanPrice": 28625, + "buyPrice": 4265, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4264, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "disomacorn", + "meanPrice": 8134, + "buyPrice": 1053, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1052, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "domesticappliances", + "meanPrice": 740, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1216, + "demand": 575, + "demandBracket": 3 + }, + { + "name": "duradrives", + "meanPrice": 19356, + "buyPrice": 13002, + "stock": 0, + "stockBracket": 0, + "sellPrice": 13001, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "earthrelics", + "meanPrice": 15161, + "buyPrice": 14640, + "stock": 0, + "stockBracket": 0, + "sellPrice": 14639, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "eleuthermals", + "meanPrice": 8507, + "buyPrice": 1571, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1570, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "emergencypowercells", + "meanPrice": 2368, + "buyPrice": 1338, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1337, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "encripteddatastorage", + "meanPrice": 8313, + "buyPrice": 4049, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4048, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "encryptedcorrespondence", + "meanPrice": 8226, + "buyPrice": 3935, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3934, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "eraninpearlwhisky", + "meanPrice": 9040, + "buyPrice": 2058, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2057, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "eshuumbrellas", + "meanPrice": 9343, + "buyPrice": 2187, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2186, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "esusekucaviar", + "meanPrice": 9625, + "buyPrice": 2573, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2572, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ethgrezeteabuds", + "meanPrice": 10197, + "buyPrice": 3212, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3211, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "evacuationshelter", + "meanPrice": 522, + "buyPrice": 138, + "stock": 0, + "stockBracket": 0, + "sellPrice": 137, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "exhaustmanifold", + "meanPrice": 1873, + "buyPrice": 1009, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1008, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "explosives", + "meanPrice": 512, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2101, + "demand": 3964, + "demandBracket": 3 + }, + { + "name": "fish", + "meanPrice": 650, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1008, + "demand": 481, + "demandBracket": 2 + }, + { + "name": "foodcartridges", + "meanPrice": 265, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 767, + "demand": 1094, + "demandBracket": 3 + }, + { + "name": "fossilremnants", + "meanPrice": 11785, + "buyPrice": 7379, + "stock": 0, + "stockBracket": 0, + "sellPrice": 7378, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "fruitandvegetables", + "meanPrice": 509, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1060, + "demand": 1637, + "demandBracket": 3 + }, + { + "name": "fujintea", + "meanPrice": 8597, + "buyPrice": 1418, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1417, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "galactictravelguide", + "meanPrice": 8627, + "buyPrice": 359, + "stock": 0, + "stockBracket": 0, + "sellPrice": 358, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "gallite", + "meanPrice": 11915, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 13829, + "demand": 1765, + "demandBracket": 3 + }, + { + "name": "gallium", + "meanPrice": 5203, + "buyPrice": 5165, + "stock": 11, + "stockBracket": 1, + "sellPrice": 5042, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "genebank", + "meanPrice": 59082, + "buyPrice": 46704, + "stock": 0, + "stockBracket": 0, + "sellPrice": 46701, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "geologicalequipment", + "meanPrice": 1886, + "buyPrice": 1186, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1185, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "geologicalsamples", + "meanPrice": 8313, + "buyPrice": 12144, + "stock": 0, + "stockBracket": 0, + "sellPrice": 12143, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "gerasiangueuzebeer", + "meanPrice": 8215, + "buyPrice": 1067, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1066, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "giantirukamasnails", + "meanPrice": 9174, + "buyPrice": 2131, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2130, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "giantverrix", + "meanPrice": 12496, + "buyPrice": 5713, + "stock": 0, + "stockBracket": 0, + "sellPrice": 5712, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "gold", + "meanPrice": 47610, + "buyPrice": 44874, + "stock": 2, + "stockBracket": 1, + "sellPrice": 44362, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "gomanyauponcoffee", + "meanPrice": 8921, + "buyPrice": 1843, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1842, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "goslarite", + "meanPrice": 5979, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 8024, + "demand": 1290, + "demandBracket": 3 + }, + { + "name": "grain", + "meanPrice": 410, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 919, + "demand": 2980, + "demandBracket": 3 + }, + { + "name": "grandidierite", + "meanPrice": 197292, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 458141, + "demand": 2, + "demandBracket": 3 + }, + { + "name": "haidneblackbrew", + "meanPrice": 8837, + "buyPrice": 1693, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1692, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "harmasilversearum", + "meanPrice": 9762, + "buyPrice": 4217, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4216, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "havasupaidreamcatcher", + "meanPrice": 14639, + "buyPrice": 8056, + "stock": 0, + "stockBracket": 0, + "sellPrice": 8055, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "hazardousenvironmentsuits", + "meanPrice": 570, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 915, + "demand": 4363, + "demandBracket": 3 + }, + { + "name": "heatsinkinterlink", + "meanPrice": 2100, + "buyPrice": 1161, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1160, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "heliostaticfurnaces", + "meanPrice": 434, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2010, + "demand": 537, + "demandBracket": 3 + }, + { + "name": "helvetitjpearls", + "meanPrice": 10450, + "buyPrice": 3507, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3506, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "hip10175bushmeat", + "meanPrice": 9382, + "buyPrice": 2246, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2245, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "hip41181squid", + "meanPrice": 8947, + "buyPrice": 1891, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1890, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "hiporganophosphates", + "meanPrice": 8169, + "buyPrice": 1039, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1038, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "hnshockmount", + "meanPrice": 1922, + "buyPrice": 1075, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1074, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "honestypills", + "meanPrice": 8860, + "buyPrice": 1686, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1685, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "hr7221wheat", + "meanPrice": 8190, + "buyPrice": 1540, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1539, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "hydrogenfuel", + "meanPrice": 113, + "buyPrice": 126, + "stock": 379, + "stockBracket": 1, + "sellPrice": 120, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "hydrogenperoxide", + "meanPrice": 3160, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3301, + "demand": 548, + "demandBracket": 3 + }, + { + "name": "indibourbon", + "meanPrice": 8806, + "buyPrice": 1638, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1637, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "indite", + "meanPrice": 11389, + "buyPrice": 10508, + "stock": 296, + "stockBracket": 1, + "sellPrice": 10238, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "indium", + "meanPrice": 5845, + "buyPrice": 5894, + "stock": 8, + "stockBracket": 1, + "sellPrice": 5824, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "insulatingmembrane", + "meanPrice": 10724, + "buyPrice": 10137, + "stock": 2, + "stockBracket": 2, + "sellPrice": 10021, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "iondistributor", + "meanPrice": 2363, + "buyPrice": 1338, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1337, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "jadeite", + "meanPrice": 42383, + "buyPrice": 40631, + "stock": 0, + "stockBracket": 0, + "sellPrice": 40628, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "jaquesquinentianstill", + "meanPrice": 13845, + "buyPrice": 7233, + "stock": 0, + "stockBracket": 0, + "sellPrice": 7232, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "jaradharrepuzzlebox", + "meanPrice": 16816, + "buyPrice": 10325, + "stock": 0, + "stockBracket": 0, + "sellPrice": 10324, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "jarouarice", + "meanPrice": 8169, + "buyPrice": 2711, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2710, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "jotunmookah", + "meanPrice": 8780, + "buyPrice": 1637, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1636, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "kachiriginleaches", + "meanPrice": 8227, + "buyPrice": 1359, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1358, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "kamitracigars", + "meanPrice": 12282, + "buyPrice": 5522, + "stock": 0, + "stockBracket": 0, + "sellPrice": 5521, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "karetiicouture", + "meanPrice": 11582, + "buyPrice": 4748, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4747, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "karsukilocusts", + "meanPrice": 8543, + "buyPrice": 1583, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1582, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "kinagoinstruments", + "meanPrice": 13030, + "buyPrice": 6570, + "stock": 0, + "stockBracket": 0, + "sellPrice": 6569, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "konggaale", + "meanPrice": 8310, + "buyPrice": 1578, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1577, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "korrokungpellets", + "meanPrice": 8067, + "buyPrice": 1190, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1189, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "lanthanum", + "meanPrice": 8707, + "buyPrice": 6087, + "stock": 0, + "stockBracket": 0, + "sellPrice": 6086, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "largeexplorationdatacash", + "meanPrice": 255841, + "buyPrice": 225210, + "stock": 0, + "stockBracket": 0, + "sellPrice": 225198, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "lavianbrandy", + "meanPrice": 10365, + "buyPrice": 3614, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3613, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "leather", + "meanPrice": 435, + "buyPrice": 57, + "stock": 0, + "stockBracket": 0, + "sellPrice": 56, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "leestianeviljuice", + "meanPrice": 8220, + "buyPrice": 1086, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1085, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "lepidolite", + "meanPrice": 771, + "buyPrice": 4193, + "stock": 1271, + "stockBracket": 1, + "sellPrice": 3999, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "lftvoidextractcoffee", + "meanPrice": 9554, + "buyPrice": 2506, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2505, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "liquidoxygen", + "meanPrice": 1474, + "buyPrice": 957, + "stock": 22, + "stockBracket": 1, + "sellPrice": 850, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "liquor", + "meanPrice": 879, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1331, + "demand": 453, + "demandBracket": 3 + }, + { + "name": "lithium", + "meanPrice": 1772, + "buyPrice": 1906, + "stock": 6, + "stockBracket": 1, + "sellPrice": 1855, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "lithiumhydroxide", + "meanPrice": 5673, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 7350, + "demand": 99, + "demandBracket": 3 + }, + { + "name": "livehecateseaworms", + "meanPrice": 8737, + "buyPrice": 1899, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1898, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "lowtemperaturediamond", + "meanPrice": 106353, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 293785, + "demand": 2, + "demandBracket": 3 + }, + { + "name": "ltthypersweet", + "meanPrice": 8054, + "buyPrice": 1233, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1232, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "m3_tissuesample_membrane", + "meanPrice": 18352, + "buyPrice": 12075, + "stock": 0, + "stockBracket": 0, + "sellPrice": 12074, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "m3_tissuesample_mycelium", + "meanPrice": 32825, + "buyPrice": 22634, + "stock": 0, + "stockBracket": 0, + "sellPrice": 22632, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "m3_tissuesample_spores", + "meanPrice": 6031, + "buyPrice": 3380, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3379, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "m_tissuesample_fluid", + "meanPrice": 6031, + "buyPrice": 3380, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3379, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "m_tissuesample_nerves", + "meanPrice": 32825, + "buyPrice": 22634, + "stock": 0, + "stockBracket": 0, + "sellPrice": 22632, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "m_tissuesample_soft", + "meanPrice": 17216, + "buyPrice": 11290, + "stock": 0, + "stockBracket": 0, + "sellPrice": 11289, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "magneticemittercoil", + "meanPrice": 1357, + "buyPrice": 656, + "stock": 0, + "stockBracket": 0, + "sellPrice": 655, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "marinesupplies", + "meanPrice": 4135, + "buyPrice": 2745, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2744, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "mechucoshightea", + "meanPrice": 8846, + "buyPrice": 1709, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1708, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "medbstarlube", + "meanPrice": 8191, + "buyPrice": 1953, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1952, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "medicaldiagnosticequipment", + "meanPrice": 3075, + "buyPrice": 1779, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1778, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "metaalloys", + "meanPrice": 195453, + "buyPrice": 162685, + "stock": 0, + "stockBracket": 0, + "sellPrice": 162676, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "methaneclathrate", + "meanPrice": 1650, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1740, + "demand": 2873, + "demandBracket": 3 + }, + { + "name": "methanolmonohydratecrystals", + "meanPrice": 2478, + "buyPrice": 1290, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1289, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "microcontrollers", + "meanPrice": 5590, + "buyPrice": 3612, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3611, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "militarygradefabrics", + "meanPrice": 984, + "buyPrice": 3690, + "stock": 46, + "stockBracket": 1, + "sellPrice": 3527, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "mineralextractors", + "meanPrice": 801, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2647, + "demand": 1698, + "demandBracket": 3 + }, + { + "name": "mineraloil", + "meanPrice": 423, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1483, + "demand": 3336, + "demandBracket": 3 + }, + { + "name": "modularterminals", + "meanPrice": 2475, + "buyPrice": 1075, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1074, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "moissanite", + "meanPrice": 24833, + "buyPrice": 16662, + "stock": 0, + "stockBracket": 0, + "sellPrice": 16661, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "mokojingbeastfeast", + "meanPrice": 9788, + "buyPrice": 2770, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2769, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "momusbogspaniel", + "meanPrice": 9184, + "buyPrice": 2054, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2053, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "monazite", + "meanPrice": 200975, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 840306, + "demand": 1, + "demandBracket": 3 + }, + { + "name": "mukusubiichitinos", + "meanPrice": 8359, + "buyPrice": 1190, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1189, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "mulachigiantfungus", + "meanPrice": 7957, + "buyPrice": 8230, + "stock": 0, + "stockBracket": 0, + "sellPrice": 8229, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "musgravite", + "meanPrice": 198613, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 382972, + "demand": 2, + "demandBracket": 3 + }, + { + "name": "mutomimager", + "meanPrice": 6311, + "buyPrice": 4218, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4217, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "mysteriousidol", + "meanPrice": 20863, + "buyPrice": 13815, + "stock": 0, + "stockBracket": 0, + "sellPrice": 13814, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "nanobreakers", + "meanPrice": 2366, + "buyPrice": 1009, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1008, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "nanomedicines", + "meanPrice": 9859, + "buyPrice": 2227, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2226, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "naturalfabrics", + "meanPrice": 688, + "buyPrice": 351, + "stock": 0, + "stockBracket": 0, + "sellPrice": 350, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "neofabricinsulation", + "meanPrice": 5978, + "buyPrice": 3380, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3379, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "neritusberries", + "meanPrice": 8497, + "buyPrice": 1616, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1615, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ngadandarifireopals", + "meanPrice": 19112, + "buyPrice": 12751, + "stock": 0, + "stockBracket": 0, + "sellPrice": 12750, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ngunamodernantiques", + "meanPrice": 8545, + "buyPrice": 1989, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1988, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "njangarisaddles", + "meanPrice": 8356, + "buyPrice": 1639, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1638, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "noneuclidianexotanks", + "meanPrice": 8526, + "buyPrice": 1326, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1325, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "nonlethalweapons", + "meanPrice": 1943, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2417, + "demand": 274, + "demandBracket": 3 + }, + { + "name": "ochoengchillies", + "meanPrice": 8601, + "buyPrice": 1659, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1658, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "onionhead", + "meanPrice": 8437, + "buyPrice": 1814, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1813, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "onionheada", + "meanPrice": 8437, + "buyPrice": 1272, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1271, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "onionheadb", + "meanPrice": 8437, + "buyPrice": 1272, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1271, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "onionheadc", + "meanPrice": 4828, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 5755, + "demand": 0, + "demandBracket": 1 + }, + { + "name": "opal", + "meanPrice": 135284, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 525075, + "demand": 1, + "demandBracket": 3 + }, + { + "name": "ophiuchiexinoartefacts", + "meanPrice": 10969, + "buyPrice": 4072, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4071, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "orrerianviciousbrew", + "meanPrice": 8342, + "buyPrice": 1146, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1145, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "osmium", + "meanPrice": 45198, + "buyPrice": 23482, + "stock": 0, + "stockBracket": 0, + "sellPrice": 23480, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "p_particulatesample", + "meanPrice": 45525, + "buyPrice": 32061, + "stock": 0, + "stockBracket": 0, + "sellPrice": 32059, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "painite", + "meanPrice": 53016, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 192955, + "demand": 4, + "demandBracket": 3 + }, + { + "name": "palladium", + "meanPrice": 50639, + "buyPrice": 47901, + "stock": 2, + "stockBracket": 1, + "sellPrice": 47360, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "pantaaprayersticks", + "meanPrice": 9177, + "buyPrice": 2043, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2042, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "performanceenhancers", + "meanPrice": 6790, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 6907, + "demand": 40, + "demandBracket": 1 + }, + { + "name": "personalgifts", + "meanPrice": 16535, + "buyPrice": 10000, + "stock": 0, + "stockBracket": 0, + "sellPrice": 9999, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "pesticides", + "meanPrice": 437, + "buyPrice": 82, + "stock": 0, + "stockBracket": 0, + "sellPrice": 81, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "platinum", + "meanPrice": 58263, + "buyPrice": 39557, + "stock": 0, + "stockBracket": 0, + "sellPrice": 39555, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "platinumaloy", + "meanPrice": 18333, + "buyPrice": 12009, + "stock": 0, + "stockBracket": 0, + "sellPrice": 12008, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "polymers", + "meanPrice": 376, + "buyPrice": 2614, + "stock": 272, + "stockBracket": 1, + "sellPrice": 1960, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "powerconverter", + "meanPrice": 1433, + "buyPrice": 707, + "stock": 0, + "stockBracket": 0, + "sellPrice": 706, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "zeesszeantglue", + "meanPrice": 8161, + "buyPrice": 1089, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1088, + "demand": 0, + "demandBracket": 0 + } + ] + }, + "header": { + "uploaderID": "Athanasius Testing", + "softwareName": "Athanasius Testing", + "softwareVersion": "v0.0.1" + } +} diff --git a/scripts/testing/gateway-responses/commodity-just-under-50KiB.json b/scripts/testing/gateway-responses/commodity-just-under-50KiB.json new file mode 100644 index 0000000..1dff8b1 --- /dev/null +++ b/scripts/testing/gateway-responses/commodity-just-under-50KiB.json @@ -0,0 +1,2206 @@ +{ + "$schemaRef": "https://eddn.edcd.io/schemas/commodity/3", + "message": { + "timestamp": "2022-01-06T11:19:27Z", + "systemName": "LP 98-132", + "stationName": "Freeport", + "marketId": 128008448, + "commodities": [ + { + "name": "advancedcatalysers", + "meanPrice": 3039, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3756, + "demand": 936, + "demandBracket": 3 + }, + { + "name": "advancedmedicines", + "meanPrice": 1485, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1726, + "demand": 296, + "demandBracket": 3 + }, + { + "name": "advert1", + "meanPrice": 21542, + "buyPrice": 15267, + "stock": 0, + "stockBracket": 0, + "sellPrice": 15266, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "aerialedenapple", + "meanPrice": 8331, + "buyPrice": 1660, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1659, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "agriculturalmedicines", + "meanPrice": 1231, + "buyPrice": 543, + "stock": 0, + "stockBracket": 0, + "sellPrice": 542, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "agronomictreatment", + "meanPrice": 3105, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 15596, + "demand": 2, + "demandBracket": 3 + }, + { + "name": "alacarakmoskinart", + "meanPrice": 8899, + "buyPrice": 1858, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1857, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "albinoquechuamammoth", + "meanPrice": 9687, + "buyPrice": 2663, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2662, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "alexandrite", + "meanPrice": 217277, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 357530, + "demand": 2, + "demandBracket": 3 + }, + { + "name": "algae", + "meanPrice": 356, + "buyPrice": 23, + "stock": 0, + "stockBracket": 0, + "sellPrice": 22, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "alieneggs", + "meanPrice": 25067, + "buyPrice": 19095, + "stock": 0, + "stockBracket": 0, + "sellPrice": 19094, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "altairianskin", + "meanPrice": 8432, + "buyPrice": 1262, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1261, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "aluminium", + "meanPrice": 551, + "buyPrice": 1127, + "stock": 352, + "stockBracket": 2, + "sellPrice": 1045, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "alyabodilysoap", + "meanPrice": 8218, + "buyPrice": 1078, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1077, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ancientcasket", + "meanPrice": 16294, + "buyPrice": 5581, + "stock": 0, + "stockBracket": 0, + "sellPrice": 5580, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ancientkey", + "meanPrice": 29931, + "buyPrice": 9760, + "stock": 0, + "stockBracket": 0, + "sellPrice": 9759, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ancientorb", + "meanPrice": 17415, + "buyPrice": 5967, + "stock": 0, + "stockBracket": 0, + "sellPrice": 5966, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ancientrelic", + "meanPrice": 24962, + "buyPrice": 9126, + "stock": 0, + "stockBracket": 0, + "sellPrice": 9125, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ancienttablet", + "meanPrice": 17415, + "buyPrice": 5967, + "stock": 0, + "stockBracket": 0, + "sellPrice": 5966, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ancienttotem", + "meanPrice": 20437, + "buyPrice": 7379, + "stock": 0, + "stockBracket": 0, + "sellPrice": 7378, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ancienturn", + "meanPrice": 14907, + "buyPrice": 3907, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3906, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "anduligafireworks", + "meanPrice": 8519, + "buyPrice": 1574, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1573, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "animalmeat", + "meanPrice": 1539, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1695, + "demand": 26, + "demandBracket": 1 + }, + { + "name": "animalmonitors", + "meanPrice": 537, + "buyPrice": 630, + "stock": 0, + "stockBracket": 0, + "sellPrice": 629, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "antiquejewellery", + "meanPrice": 183163, + "buyPrice": 158957, + "stock": 0, + "stockBracket": 0, + "sellPrice": 158949, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "anynacoffee", + "meanPrice": 9160, + "buyPrice": 2165, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2164, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "apavietii", + "meanPrice": 10362, + "buyPrice": 3386, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3385, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "aquaponicsystems", + "meanPrice": 524, + "buyPrice": 321, + "stock": 0, + "stockBracket": 0, + "sellPrice": 320, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "aroucaconventualsweets", + "meanPrice": 8737, + "buyPrice": 1557, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1556, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "articulationmotors", + "meanPrice": 7588, + "buyPrice": 4463, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4462, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "assaultplans", + "meanPrice": 26074, + "buyPrice": 3294, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3293, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "atmosphericextractors", + "meanPrice": 571, + "buyPrice": 331, + "stock": 0, + "stockBracket": 0, + "sellPrice": 330, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "autofabricators", + "meanPrice": 3827, + "buyPrice": 2685, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2684, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "azcancriformula42", + "meanPrice": 12440, + "buyPrice": 6106, + "stock": 0, + "stockBracket": 0, + "sellPrice": 6105, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "bakedgreebles", + "meanPrice": 8211, + "buyPrice": 1056, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1055, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "baltahsinevacuumkrill", + "meanPrice": 8479, + "buyPrice": 1502, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1501, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "bankiamphibiousleather", + "meanPrice": 8338, + "buyPrice": 1138, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1137, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "basicmedicines", + "meanPrice": 493, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 963, + "demand": 904, + "demandBracket": 3 + }, + { + "name": "bastsnakegin", + "meanPrice": 8659, + "buyPrice": 1724, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1723, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "battleweapons", + "meanPrice": 7451, + "buyPrice": 4463, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4462, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "bauxite", + "meanPrice": 1140, + "buyPrice": 10730, + "stock": 595, + "stockBracket": 1, + "sellPrice": 10270, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "beer", + "meanPrice": 430, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 799, + "demand": 1777, + "demandBracket": 3 + }, + { + "name": "belalansrayleather", + "meanPrice": 8519, + "buyPrice": 1605, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1604, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "benitoite", + "meanPrice": 149395, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 570449, + "demand": 2, + "demandBracket": 3 + }, + { + "name": "bertrandite", + "meanPrice": 18817, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 21216, + "demand": 1047, + "demandBracket": 2 + }, + { + "name": "beryllium", + "meanPrice": 8243, + "buyPrice": 8041, + "stock": 2, + "stockBracket": 1, + "sellPrice": 7948, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "bioreducinglichen", + "meanPrice": 1204, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1703, + "demand": 5473, + "demandBracket": 3 + }, + { + "name": "biowaste", + "meanPrice": 358, + "buyPrice": 145, + "stock": 103, + "stockBracket": 1, + "sellPrice": 87, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "bismuth", + "meanPrice": 2441, + "buyPrice": 1607, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1606, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "bluemilk", + "meanPrice": 10805, + "buyPrice": 3912, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3911, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "bromellite", + "meanPrice": 30424, + "buyPrice": 70950, + "stock": 0, + "stockBracket": 0, + "sellPrice": 70946, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "buckyballbeermats", + "meanPrice": 7957, + "buyPrice": 8230, + "stock": 0, + "stockBracket": 0, + "sellPrice": 8229, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "buildingfabricators", + "meanPrice": 2312, + "buyPrice": 1448, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1447, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "cd75catcoffee", + "meanPrice": 9571, + "buyPrice": 2452, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2451, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "centaurimegagin", + "meanPrice": 10217, + "buyPrice": 3239, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3238, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ceramiccomposites", + "meanPrice": 415, + "buyPrice": 424, + "stock": 0, + "stockBracket": 0, + "sellPrice": 423, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ceremonialheiketea", + "meanPrice": 9251, + "buyPrice": 2161, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2160, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "cetiaepyornisegg", + "meanPrice": 9769, + "buyPrice": 2741, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2740, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "cetirabbits", + "meanPrice": 9079, + "buyPrice": 2068, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2067, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "chameleoncloth", + "meanPrice": 9071, + "buyPrice": 1959, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1958, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "chateaudeaegaeon", + "meanPrice": 8791, + "buyPrice": 1610, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1609, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "chemicalwaste", + "meanPrice": 672, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 599, + "demand": 159, + "demandBracket": 3 + }, + { + "name": "cherbonesbloodcrystals", + "meanPrice": 16714, + "buyPrice": 10207, + "stock": 0, + "stockBracket": 0, + "sellPrice": 10206, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "chieridanimarinepaste", + "meanPrice": 8450, + "buyPrice": 1426, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1425, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "classifiedexperimentalequipment", + "meanPrice": 11423, + "buyPrice": 4002, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4001, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "clothing", + "meanPrice": 546, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 963, + "demand": 955, + "demandBracket": 3 + }, + { + "name": "cmmcomposite", + "meanPrice": 5988, + "buyPrice": 3907, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3906, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "cobalt", + "meanPrice": 3762, + "buyPrice": 13474, + "stock": 724, + "stockBracket": 1, + "sellPrice": 12870, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "coffee", + "meanPrice": 1499, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2303, + "demand": 527, + "demandBracket": 3 + }, + { + "name": "coltan", + "meanPrice": 6163, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 7849, + "demand": 2063, + "demandBracket": 3 + }, + { + "name": "comercialsamples", + "meanPrice": 1815, + "buyPrice": 656, + "stock": 0, + "stockBracket": 0, + "sellPrice": 655, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "computercomponents", + "meanPrice": 776, + "buyPrice": 267, + "stock": 0, + "stockBracket": 0, + "sellPrice": 266, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "conductivefabrics", + "meanPrice": 709, + "buyPrice": 1937, + "stock": 55, + "stockBracket": 1, + "sellPrice": 1810, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "consumertechnology", + "meanPrice": 6690, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 6883, + "demand": 0, + "demandBracket": 1 + }, + { + "name": "coolinghoses", + "meanPrice": 1886, + "buyPrice": 707, + "stock": 0, + "stockBracket": 0, + "sellPrice": 706, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "copper", + "meanPrice": 689, + "buyPrice": 1115, + "stock": 474, + "stockBracket": 2, + "sellPrice": 1042, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "coquimspongiformvictuals", + "meanPrice": 8077, + "buyPrice": 10924, + "stock": 0, + "stockBracket": 0, + "sellPrice": 10923, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "cropharvesters", + "meanPrice": 2230, + "buyPrice": 1564, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1563, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "cryolite", + "meanPrice": 12173, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 14970, + "demand": 1166, + "demandBracket": 3 + }, + { + "name": "crystallinespheres", + "meanPrice": 12216, + "buyPrice": 5438, + "stock": 0, + "stockBracket": 0, + "sellPrice": 5437, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "damnacarapaces", + "meanPrice": 8120, + "buyPrice": 2925, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2924, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "datacore", + "meanPrice": 6791, + "buyPrice": 3907, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3906, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "deltaphoenicispalms", + "meanPrice": 8188, + "buyPrice": 1528, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1527, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "deuringastruffles", + "meanPrice": 9232, + "buyPrice": 2335, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2334, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "diagnosticsensor", + "meanPrice": 6727, + "buyPrice": 4463, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4462, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "diplomaticbag", + "meanPrice": 28625, + "buyPrice": 4265, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4264, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "disomacorn", + "meanPrice": 8134, + "buyPrice": 1053, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1052, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "domesticappliances", + "meanPrice": 740, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1216, + "demand": 575, + "demandBracket": 3 + }, + { + "name": "duradrives", + "meanPrice": 19356, + "buyPrice": 13002, + "stock": 0, + "stockBracket": 0, + "sellPrice": 13001, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "earthrelics", + "meanPrice": 15161, + "buyPrice": 14640, + "stock": 0, + "stockBracket": 0, + "sellPrice": 14639, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "eleuthermals", + "meanPrice": 8507, + "buyPrice": 1571, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1570, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "emergencypowercells", + "meanPrice": 2368, + "buyPrice": 1338, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1337, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "encripteddatastorage", + "meanPrice": 8313, + "buyPrice": 4049, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4048, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "encryptedcorrespondence", + "meanPrice": 8226, + "buyPrice": 3935, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3934, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "eraninpearlwhisky", + "meanPrice": 9040, + "buyPrice": 2058, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2057, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "eshuumbrellas", + "meanPrice": 9343, + "buyPrice": 2187, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2186, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "esusekucaviar", + "meanPrice": 9625, + "buyPrice": 2573, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2572, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ethgrezeteabuds", + "meanPrice": 10197, + "buyPrice": 3212, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3211, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "evacuationshelter", + "meanPrice": 522, + "buyPrice": 138, + "stock": 0, + "stockBracket": 0, + "sellPrice": 137, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "exhaustmanifold", + "meanPrice": 1873, + "buyPrice": 1009, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1008, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "explosives", + "meanPrice": 512, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2101, + "demand": 3964, + "demandBracket": 3 + }, + { + "name": "fish", + "meanPrice": 650, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1008, + "demand": 481, + "demandBracket": 2 + }, + { + "name": "foodcartridges", + "meanPrice": 265, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 767, + "demand": 1094, + "demandBracket": 3 + }, + { + "name": "fossilremnants", + "meanPrice": 11785, + "buyPrice": 7379, + "stock": 0, + "stockBracket": 0, + "sellPrice": 7378, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "fruitandvegetables", + "meanPrice": 509, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1060, + "demand": 1637, + "demandBracket": 3 + }, + { + "name": "fujintea", + "meanPrice": 8597, + "buyPrice": 1418, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1417, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "galactictravelguide", + "meanPrice": 8627, + "buyPrice": 359, + "stock": 0, + "stockBracket": 0, + "sellPrice": 358, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "gallite", + "meanPrice": 11915, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 13829, + "demand": 1765, + "demandBracket": 3 + }, + { + "name": "gallium", + "meanPrice": 5203, + "buyPrice": 5165, + "stock": 11, + "stockBracket": 1, + "sellPrice": 5042, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "genebank", + "meanPrice": 59082, + "buyPrice": 46704, + "stock": 0, + "stockBracket": 0, + "sellPrice": 46701, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "geologicalequipment", + "meanPrice": 1886, + "buyPrice": 1186, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1185, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "geologicalsamples", + "meanPrice": 8313, + "buyPrice": 12144, + "stock": 0, + "stockBracket": 0, + "sellPrice": 12143, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "gerasiangueuzebeer", + "meanPrice": 8215, + "buyPrice": 1067, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1066, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "giantirukamasnails", + "meanPrice": 9174, + "buyPrice": 2131, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2130, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "giantverrix", + "meanPrice": 12496, + "buyPrice": 5713, + "stock": 0, + "stockBracket": 0, + "sellPrice": 5712, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "gold", + "meanPrice": 47610, + "buyPrice": 44874, + "stock": 2, + "stockBracket": 1, + "sellPrice": 44362, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "gomanyauponcoffee", + "meanPrice": 8921, + "buyPrice": 1843, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1842, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "goslarite", + "meanPrice": 5979, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 8024, + "demand": 1290, + "demandBracket": 3 + }, + { + "name": "grain", + "meanPrice": 410, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 919, + "demand": 2980, + "demandBracket": 3 + }, + { + "name": "grandidierite", + "meanPrice": 197292, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 458141, + "demand": 2, + "demandBracket": 3 + }, + { + "name": "haidneblackbrew", + "meanPrice": 8837, + "buyPrice": 1693, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1692, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "harmasilversearum", + "meanPrice": 9762, + "buyPrice": 4217, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4216, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "havasupaidreamcatcher", + "meanPrice": 14639, + "buyPrice": 8056, + "stock": 0, + "stockBracket": 0, + "sellPrice": 8055, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "hazardousenvironmentsuits", + "meanPrice": 570, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 915, + "demand": 4363, + "demandBracket": 3 + }, + { + "name": "heatsinkinterlink", + "meanPrice": 2100, + "buyPrice": 1161, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1160, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "heliostaticfurnaces", + "meanPrice": 434, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2010, + "demand": 537, + "demandBracket": 3 + }, + { + "name": "helvetitjpearls", + "meanPrice": 10450, + "buyPrice": 3507, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3506, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "hip10175bushmeat", + "meanPrice": 9382, + "buyPrice": 2246, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2245, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "hip41181squid", + "meanPrice": 8947, + "buyPrice": 1891, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1890, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "hiporganophosphates", + "meanPrice": 8169, + "buyPrice": 1039, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1038, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "hnshockmount", + "meanPrice": 1922, + "buyPrice": 1075, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1074, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "honestypills", + "meanPrice": 8860, + "buyPrice": 1686, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1685, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "hr7221wheat", + "meanPrice": 8190, + "buyPrice": 1540, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1539, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "hydrogenfuel", + "meanPrice": 113, + "buyPrice": 126, + "stock": 379, + "stockBracket": 1, + "sellPrice": 120, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "hydrogenperoxide", + "meanPrice": 3160, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3301, + "demand": 548, + "demandBracket": 3 + }, + { + "name": "indibourbon", + "meanPrice": 8806, + "buyPrice": 1638, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1637, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "indite", + "meanPrice": 11389, + "buyPrice": 10508, + "stock": 296, + "stockBracket": 1, + "sellPrice": 10238, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "indium", + "meanPrice": 5845, + "buyPrice": 5894, + "stock": 8, + "stockBracket": 1, + "sellPrice": 5824, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "insulatingmembrane", + "meanPrice": 10724, + "buyPrice": 10137, + "stock": 2, + "stockBracket": 2, + "sellPrice": 10021, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "iondistributor", + "meanPrice": 2363, + "buyPrice": 1338, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1337, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "jadeite", + "meanPrice": 42383, + "buyPrice": 40631, + "stock": 0, + "stockBracket": 0, + "sellPrice": 40628, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "jaquesquinentianstill", + "meanPrice": 13845, + "buyPrice": 7233, + "stock": 0, + "stockBracket": 0, + "sellPrice": 7232, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "jaradharrepuzzlebox", + "meanPrice": 16816, + "buyPrice": 10325, + "stock": 0, + "stockBracket": 0, + "sellPrice": 10324, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "jarouarice", + "meanPrice": 8169, + "buyPrice": 2711, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2710, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "jotunmookah", + "meanPrice": 8780, + "buyPrice": 1637, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1636, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "kachiriginleaches", + "meanPrice": 8227, + "buyPrice": 1359, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1358, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "kamitracigars", + "meanPrice": 12282, + "buyPrice": 5522, + "stock": 0, + "stockBracket": 0, + "sellPrice": 5521, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "karetiicouture", + "meanPrice": 11582, + "buyPrice": 4748, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4747, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "karsukilocusts", + "meanPrice": 8543, + "buyPrice": 1583, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1582, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "kinagoinstruments", + "meanPrice": 13030, + "buyPrice": 6570, + "stock": 0, + "stockBracket": 0, + "sellPrice": 6569, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "konggaale", + "meanPrice": 8310, + "buyPrice": 1578, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1577, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "korrokungpellets", + "meanPrice": 8067, + "buyPrice": 1190, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1189, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "lanthanum", + "meanPrice": 8707, + "buyPrice": 6087, + "stock": 0, + "stockBracket": 0, + "sellPrice": 6086, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "largeexplorationdatacash", + "meanPrice": 255841, + "buyPrice": 225210, + "stock": 0, + "stockBracket": 0, + "sellPrice": 225198, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "lavianbrandy", + "meanPrice": 10365, + "buyPrice": 3614, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3613, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "leather", + "meanPrice": 435, + "buyPrice": 57, + "stock": 0, + "stockBracket": 0, + "sellPrice": 56, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "leestianeviljuice", + "meanPrice": 8220, + "buyPrice": 1086, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1085, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "lepidolite", + "meanPrice": 771, + "buyPrice": 4193, + "stock": 1271, + "stockBracket": 1, + "sellPrice": 3999, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "lftvoidextractcoffee", + "meanPrice": 9554, + "buyPrice": 2506, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2505, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "liquidoxygen", + "meanPrice": 1474, + "buyPrice": 957, + "stock": 22, + "stockBracket": 1, + "sellPrice": 850, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "liquor", + "meanPrice": 879, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1331, + "demand": 453, + "demandBracket": 3 + }, + { + "name": "lithium", + "meanPrice": 1772, + "buyPrice": 1906, + "stock": 6, + "stockBracket": 1, + "sellPrice": 1855, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "lithiumhydroxide", + "meanPrice": 5673, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 7350, + "demand": 99, + "demandBracket": 3 + }, + { + "name": "livehecateseaworms", + "meanPrice": 8737, + "buyPrice": 1899, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1898, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "lowtemperaturediamond", + "meanPrice": 106353, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 293785, + "demand": 2, + "demandBracket": 3 + }, + { + "name": "ltthypersweet", + "meanPrice": 8054, + "buyPrice": 1233, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1232, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "m3_tissuesample_membrane", + "meanPrice": 18352, + "buyPrice": 12075, + "stock": 0, + "stockBracket": 0, + "sellPrice": 12074, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "m3_tissuesample_mycelium", + "meanPrice": 32825, + "buyPrice": 22634, + "stock": 0, + "stockBracket": 0, + "sellPrice": 22632, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "m3_tissuesample_spores", + "meanPrice": 6031, + "buyPrice": 3380, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3379, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "m_tissuesample_fluid", + "meanPrice": 6031, + "buyPrice": 3380, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3379, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "m_tissuesample_nerves", + "meanPrice": 32825, + "buyPrice": 22634, + "stock": 0, + "stockBracket": 0, + "sellPrice": 22632, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "m_tissuesample_soft", + "meanPrice": 17216, + "buyPrice": 11290, + "stock": 0, + "stockBracket": 0, + "sellPrice": 11289, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "magneticemittercoil", + "meanPrice": 1357, + "buyPrice": 656, + "stock": 0, + "stockBracket": 0, + "sellPrice": 655, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "marinesupplies", + "meanPrice": 4135, + "buyPrice": 2745, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2744, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "mechucoshightea", + "meanPrice": 8846, + "buyPrice": 1709, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1708, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "medbstarlube", + "meanPrice": 8191, + "buyPrice": 1953, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1952, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "medicaldiagnosticequipment", + "meanPrice": 3075, + "buyPrice": 1779, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1778, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "metaalloys", + "meanPrice": 195453, + "buyPrice": 162685, + "stock": 0, + "stockBracket": 0, + "sellPrice": 162676, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "methaneclathrate", + "meanPrice": 1650, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1740, + "demand": 2873, + "demandBracket": 3 + }, + { + "name": "methanolmonohydratecrystals", + "meanPrice": 2478, + "buyPrice": 1290, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1289, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "microcontrollers", + "meanPrice": 5590, + "buyPrice": 3612, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3611, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "militarygradefabrics", + "meanPrice": 984, + "buyPrice": 3690, + "stock": 46, + "stockBracket": 1, + "sellPrice": 3527, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "mineralextractors", + "meanPrice": 801, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2647, + "demand": 1698, + "demandBracket": 3 + }, + { + "name": "mineraloil", + "meanPrice": 423, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1483, + "demand": 3336, + "demandBracket": 3 + }, + { + "name": "modularterminals", + "meanPrice": 2475, + "buyPrice": 1075, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1074, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "moissanite", + "meanPrice": 24833, + "buyPrice": 16662, + "stock": 0, + "stockBracket": 0, + "sellPrice": 16661, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "mokojingbeastfeast", + "meanPrice": 9788, + "buyPrice": 2770, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2769, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "momusbogspaniel", + "meanPrice": 9184, + "buyPrice": 2054, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2053, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "monazite", + "meanPrice": 200975, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 840306, + "demand": 1, + "demandBracket": 3 + }, + { + "name": "mukusubiichitinos", + "meanPrice": 8359, + "buyPrice": 1190, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1189, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "mulachigiantfungus", + "meanPrice": 7957, + "buyPrice": 8230, + "stock": 0, + "stockBracket": 0, + "sellPrice": 8229, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "musgravite", + "meanPrice": 198613, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 382972, + "demand": 2, + "demandBracket": 3 + }, + { + "name": "mutomimager", + "meanPrice": 6311, + "buyPrice": 4218, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4217, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "mysteriousidol", + "meanPrice": 20863, + "buyPrice": 13815, + "stock": 0, + "stockBracket": 0, + "sellPrice": 13814, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "nanobreakers", + "meanPrice": 2366, + "buyPrice": 1009, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1008, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "nanomedicines", + "meanPrice": 9859, + "buyPrice": 2227, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2226, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "naturalfabrics", + "meanPrice": 688, + "buyPrice": 351, + "stock": 0, + "stockBracket": 0, + "sellPrice": 350, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "neofabricinsulation", + "meanPrice": 5978, + "buyPrice": 3380, + "stock": 0, + "stockBracket": 0, + "sellPrice": 3379, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "neritusberries", + "meanPrice": 8497, + "buyPrice": 1616, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1615, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ngadandarifireopals", + "meanPrice": 19112, + "buyPrice": 12751, + "stock": 0, + "stockBracket": 0, + "sellPrice": 12750, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "ngunamodernantiques", + "meanPrice": 8545, + "buyPrice": 1989, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1988, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "njangarisaddles", + "meanPrice": 8356, + "buyPrice": 1639, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1638, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "noneuclidianexotanks", + "meanPrice": 8526, + "buyPrice": 1326, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1325, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "nonlethalweapons", + "meanPrice": 1943, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2417, + "demand": 274, + "demandBracket": 3 + }, + { + "name": "ochoengchillies", + "meanPrice": 8601, + "buyPrice": 1659, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1658, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "onionhead", + "meanPrice": 8437, + "buyPrice": 1814, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1813, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "onionheada", + "meanPrice": 8437, + "buyPrice": 1272, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1271, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "onionheadb", + "meanPrice": 8437, + "buyPrice": 1272, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1271, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "onionheadc", + "meanPrice": 4828, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 5755, + "demand": 0, + "demandBracket": 1 + }, + { + "name": "opal", + "meanPrice": 135284, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 525075, + "demand": 1, + "demandBracket": 3 + }, + { + "name": "ophiuchiexinoartefacts", + "meanPrice": 10969, + "buyPrice": 4072, + "stock": 0, + "stockBracket": 0, + "sellPrice": 4071, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "orrerianviciousbrew", + "meanPrice": 8342, + "buyPrice": 1146, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1145, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "osmium", + "meanPrice": 45198, + "buyPrice": 23482, + "stock": 0, + "stockBracket": 0, + "sellPrice": 23480, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "p_particulatesample", + "meanPrice": 45525, + "buyPrice": 32061, + "stock": 0, + "stockBracket": 0, + "sellPrice": 32059, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "painite", + "meanPrice": 53016, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 192955, + "demand": 4, + "demandBracket": 3 + }, + { + "name": "palladium", + "meanPrice": 50639, + "buyPrice": 47901, + "stock": 2, + "stockBracket": 1, + "sellPrice": 47360, + "demand": 1, + "demandBracket": 0 + }, + { + "name": "pantaaprayersticks", + "meanPrice": 9177, + "buyPrice": 2043, + "stock": 0, + "stockBracket": 0, + "sellPrice": 2042, + "demand": 0, + "demandBracket": 0 + }, + { + "name": "performanceenhancers", + "meanPrice": 6790, + "buyPrice": 0, + "stock": 0, + "stockBracket": 0, + "sellPrice": 6907, + "demand": 40, + "demandBracket": 1 + }, + { + "name": "zeesszeantglue", + "meanPrice": 8161, + "buyPrice": 1089, + "stock": 0, + "stockBracket": 0, + "sellPrice": 1088, + "demand": 0, + "demandBracket": 0 + } + ] + }, + "header": { + "uploaderID": "Athanasius Testing", + "softwareName": "Athanasius Testing", + "softwareVersion": "v0.0.1" + } +} diff --git a/scripts/testing/gateway-responses/commodity-smallest-message.json b/scripts/testing/gateway-responses/commodity-smallest-message.json new file mode 100644 index 0000000..c109d6e --- /dev/null +++ b/scripts/testing/gateway-responses/commodity-smallest-message.json @@ -0,0 +1 @@ +{"$schemaRef":"https://eddn.edcd.io/schemas/commodity/3","header":{"softwareName":"E:D Market Connector Windows","softwareVersion":"5.3.0-beta4extra","uploaderID":"abcdefghijklm"},"message":{"systemName":"delphi","stationName":"The Oracle","marketId":128782803,"timestamp":"2022-01-26T12:00:00Z","commodities":[]}} diff --git a/scripts/testing/gateway-responses/fssallbodiesfound.json b/scripts/testing/gateway-responses/fssallbodiesfound.json new file mode 100644 index 0000000..04d2424 --- /dev/null +++ b/scripts/testing/gateway-responses/fssallbodiesfound.json @@ -0,0 +1,18 @@ +{ + "$schemaRef": "https://eddn.edcd.io/schemas/fssallbodiesfound/1", + "message": { + "timestamp":"2022-01-26T16:21:00Z", + "event":"FSSAllBodiesFound", + "SystemName":"Zeta Doradus", + "StarPos": [ + 30.40625,-22.65625,-2.18750 + ], + "SystemAddress":44853889387, + "Count":1 + }, + "header": { + "uploaderID": "from Athanasius Testing", + "softwareName": "Athanasius Testing script", + "softwareVersion": "v0.0.1" + } +} diff --git a/scripts/testing/gateway-responses/shipyard-smallest-message.json b/scripts/testing/gateway-responses/shipyard-smallest-message.json new file mode 100644 index 0000000..945f008 --- /dev/null +++ b/scripts/testing/gateway-responses/shipyard-smallest-message.json @@ -0,0 +1 @@ +{"$schemaRef":"https://eddn.edcd.io/schemas/shipyard/2","header":{"softwareName":"E:D Market Connector Windows","softwareVersion":"5.3.0-beta4extra","uploaderID":"abcdefghijklm"},"message":{"systemName":"delphi","stationName":"The Oracle","marketId":128782803,"timestamp":"2022-01-26T12:00:00Z","ships":[]}} From b323460bf824771f3655dd243815a31ed0453c95 Mon Sep 17 00:00:00 2001 From: robbyxp1 Date: Wed, 26 Jan 2022 17:50:41 +0000 Subject: [PATCH 25/29] Add FSSAllBodiesFound --- schemas/fssallbodiesfound-README.md | 30 ++++++++++++ schemas/fssallbodiesfound-v1.0.json | 75 +++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 schemas/fssallbodiesfound-README.md create mode 100644 schemas/fssallbodiesfound-v1.0.json diff --git a/schemas/fssallbodiesfound-README.md b/schemas/fssallbodiesfound-README.md new file mode 100644 index 0000000..a86db5c --- /dev/null +++ b/schemas/fssallbodiesfound-README.md @@ -0,0 +1,30 @@ +# EDDN FSSAllBodiesFound Schema + +## Introduction +Here we document how to take data from an ED `FSSAllBodiesFound` Journal +Event and properly structure it for sending to EDDN. + +Please consult [EDDN Schemas README](./README-EDDN-schemas.md) for general +documentation for a schema such as this. + +## Senders +The primary data source for this schema is the ED Journal event +`FSSAllBodiesFound`. + +### Key Renames +Many of the key names have a different case defined in this schema, make +sure you are renaming them as appropriate. + +### Elisions +None + +### Augmentations +#### horizons flag +You SHOULD add this key/value pair, using the value from the `LoadGame` event. + +#### odyssey flag +You SHOULD add this key/value pair, using the value from the `LoadGame` event. + +#### StarPos +You MUST add a `StarPos` array containing the system co-ordinates from the +last `FSDJump`, `CarrierJump`, or `Location` event. diff --git a/schemas/fssallbodiesfound-v1.0.json b/schemas/fssallbodiesfound-v1.0.json new file mode 100644 index 0000000..14dc507 --- /dev/null +++ b/schemas/fssallbodiesfound-v1.0.json @@ -0,0 +1,75 @@ +{ + "$schema" : "http://json-schema.org/draft-04/schema#", + "id" : "https://eddn.edcd.io/schemas/fssallbodiesfound/1#", + "type" : "object", + "additionalProperties" : false, + "required": [ "$schemaRef", "header", "message" ], + "properties": { + "$schemaRef": { + "type" : "string" + }, + "header": { + "type" : "object", + "additionalProperties" : true, + "required" : [ "uploaderID", "softwareName", "softwareVersion" ], + "properties" : { + "uploaderID": { + "type" : "string" + }, + "softwareName": { + "type" : "string" + }, + "softwareVersion": { + "type" : "string" + }, + "gatewayTimestamp": { + "type" : "string", + "format" : "date-time", + "description" : "Timestamp upon receipt at the gateway. If present, this property will be overwritten by the gateway; submitters are not intended to populate this property." + } + } + }, + "message": { + "type" : "object", + "description" : "Contains all properties from the listed events in the client's journal minus the event key, Localised strings and the properties marked below as 'disallowed'", + "additionalProperties" : false, + "required" : [ "timestamp", "SystemName", "StarPos", "SystemAddress", "Count" ], + "properties" : { + "timestamp": { + "type" : "string", + "format" : "date-time" + }, + "horizons": { + "type" : "boolean", + "description" : "Whether the sending Cmdr has a Horizons pass." + }, + "odyssey": { + "type" : "boolean", + "description" : "Whether the sending Cmdr has an Odyssey expansion." + }, + "SystemName": { + "type" : "string", + "minLength" : 1 + }, + "StarPos": { + "type" : "array", + "items" : { "type": "number" }, + "minItems" : 3, + "maxItems" : 3, + "description" : "Must be added by the sender if not present in the journal event" + }, + "SystemAddress": { + "type" : "integer", + "description" : "Should be added by the sender if not present in the journal event" + }, + "Count" : { + "type" : "integer", + "description" : "Number of bodies in this system" + } + } + } + }, + "definitions": { + "disallowed" : { "not" : { "type": [ "array", "boolean", "integer", "number", "null", "object", "string" ] } } + } +} From b6d25ccebcc099ac93173ec50cc07b7a71014dab Mon Sep 17 00:00:00 2001 From: robbyxp1 Date: Thu, 27 Jan 2022 11:32:46 +0000 Subject: [PATCH 26/29] Added back in the event key --- schemas/fssallbodiesfound-v1.0.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/schemas/fssallbodiesfound-v1.0.json b/schemas/fssallbodiesfound-v1.0.json index 14dc507..b3a4198 100644 --- a/schemas/fssallbodiesfound-v1.0.json +++ b/schemas/fssallbodiesfound-v1.0.json @@ -31,7 +31,7 @@ }, "message": { "type" : "object", - "description" : "Contains all properties from the listed events in the client's journal minus the event key, Localised strings and the properties marked below as 'disallowed'", + "description" : "Contains all properties from the listed events in the client's journal, minus the Localised strings and the properties marked below as 'disallowed'", "additionalProperties" : false, "required" : [ "timestamp", "SystemName", "StarPos", "SystemAddress", "Count" ], "properties" : { @@ -39,6 +39,9 @@ "type" : "string", "format" : "date-time" }, + "event" : { + "enum" : [ "FSSAllBodiesFound" ] + }, "horizons": { "type" : "boolean", "description" : "Whether the sending Cmdr has a Horizons pass." From d4e7409ae0d79a7e4c00de31c28e8cbd4b0fbb7a Mon Sep 17 00:00:00 2001 From: robbyxp1 Date: Thu, 27 Jan 2022 16:28:37 +0000 Subject: [PATCH 27/29] Add to settings.py the fssallbodiesfound schemas --- src/eddn/conf/Settings.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/eddn/conf/Settings.py b/src/eddn/conf/Settings.py index af15e95..b0782ce 100644 --- a/src/eddn/conf/Settings.py +++ b/src/eddn/conf/Settings.py @@ -76,6 +76,8 @@ class _Settings(object): "https://eddn.edcd.io/schemas/approachsettlement/1" : "schemas/approachsettlement-v1.0.json", "https://eddn.edcd.io/schemas/approachsettlement/1/test" : "schemas/approachsettlement-v1.0.json", + "https://eddn.edcd.io/schemas/fssallbodiesfound/1" : "schemas/fssallbodiesfound-v1.0.json", + "https://eddn.edcd.io/schemas/fssallbodiesfound/1/test" : "schemas/fssallbodiesfound-v1.0.json", } GATEWAY_OUTDATED_SCHEMAS = [ @@ -97,6 +99,8 @@ class _Settings(object): "http://schemas.elite-markets.net/eddn/blackmarket/1/test", "http://schemas.elite-markets.net/eddn/journal/1", "http://schemas.elite-markets.net/eddn/journal/1/test", + "http://schemas.elite-markets.net/eddn/fssallbodiesfound/1", + "http://schemas.elite-markets.net/eddn/fssallbodiesfound/1/test", ] ############################################################################### From de33e4460c246cc6094344a4101d38da43e97add Mon Sep 17 00:00:00 2001 From: Athanasius Date: Fri, 28 Jan 2022 17:26:12 +0000 Subject: [PATCH 28/29] Schemas/FSSAllBodiesFound: Make 'event' required --- schemas/fssallbodiesfound-v1.0.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemas/fssallbodiesfound-v1.0.json b/schemas/fssallbodiesfound-v1.0.json index b3a4198..074362a 100644 --- a/schemas/fssallbodiesfound-v1.0.json +++ b/schemas/fssallbodiesfound-v1.0.json @@ -33,7 +33,7 @@ "type" : "object", "description" : "Contains all properties from the listed events in the client's journal, minus the Localised strings and the properties marked below as 'disallowed'", "additionalProperties" : false, - "required" : [ "timestamp", "SystemName", "StarPos", "SystemAddress", "Count" ], + "required" : [ "timestamp", "event", "SystemName", "StarPos", "SystemAddress", "Count" ], "properties" : { "timestamp": { "type" : "string", From 8db880f95def1f9b22af54bf2cd62a7c029fcf3f Mon Sep 17 00:00:00 2001 From: Athanasius Date: Fri, 28 Jan 2022 17:26:57 +0000 Subject: [PATCH 29/29] schemas/FSSAllBodiesFound: Don't list in outdated schemas --- src/eddn/conf/Settings.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/eddn/conf/Settings.py b/src/eddn/conf/Settings.py index b0782ce..5ca2a6f 100644 --- a/src/eddn/conf/Settings.py +++ b/src/eddn/conf/Settings.py @@ -99,8 +99,6 @@ class _Settings(object): "http://schemas.elite-markets.net/eddn/blackmarket/1/test", "http://schemas.elite-markets.net/eddn/journal/1", "http://schemas.elite-markets.net/eddn/journal/1/test", - "http://schemas.elite-markets.net/eddn/fssallbodiesfound/1", - "http://schemas.elite-markets.net/eddn/fssallbodiesfound/1/test", ] ###############################################################################