Merge branch 'python3' of github.com:EDCD/EDDN into python3

This commit is contained in:
Athanasius 2022-12-21 17:27:25 +00:00
commit 896eada0b9
105 changed files with 1441 additions and 196 deletions

View File

@ -73,9 +73,11 @@ repos:
rev: 'v1.2.4'
hooks:
- id: python-safety-dependencies-check
name: safety
entry: safety
args: [check, --bare, -r]
args: [check, --bare, --file ]
language: system
files: requirements-dev.txt
default_language_version:
python: python3.9

View File

@ -171,5 +171,5 @@ Hosting is currently provided by the
### Contacting the EDDN team
* [EDCD Discord](https://discord.gg/XBsdCq9) - **Use the `#eddn` channel**.
* [EDCD Discord - #eddn channel](https://discord.gg/DdqJ8nWVGc)
* [E:D forum thread](https://forums.frontier.co.uk/threads/elite-dangerous-data-network-eddn.585701/#post-9400060)

View File

@ -1,7 +1,7 @@
## Introduction
EDDN is a
[zermoq](https://zeromq.org/) service which allows players of the game
[zeromq](https://zeromq.org/) service which allows players of the game
[Elite Dangerous](https://www.elitedangerous.com/), published
by [Frontier Developments](https://www.frontier.co.uk/), to upload game data so
that interested listeners can receive a copy.
@ -15,7 +15,7 @@ representing this game data and then passes it on to any interested listeners.
## Sources
There are two sources of game data, both provided by the publisher of the game,
Frontier Developerments. They are both explicitly approved for use by
Frontier Developments. They are both explicitly approved for use by
third-party software.
### Journal Files
@ -127,14 +127,13 @@ The body of an EDDN message is a JSON object in UTF-8 encoding. If you do not
compress this body then you MUST set a `Content-Type` header of
`applicaton/json`.
For historical reasons URL form-encoded data *is* supported, **but this is
deprecated and no new software should attempt this method**. We
purposefully do not further document the exact format for this.
You *MAY* use gzip compression on the body of the message, but it is not
required. If you do compress the body then you **MUST** send a `Content-Type`
header of `gzip` instead of `application/json`.
**Due to issues when messages are compressed, form-encoded data is NO LONGER
SUPPORTED as of 2022-06-16.**
You should be prepared to handle all scenarios where sending of a message
fails:
@ -301,6 +300,48 @@ Horizons-only features disabled.
active, but in the non-Odyssey game client case you only get the Horizons
boolean.
#### Other data Augmentations
Some schemas mandate that extra data be added, beyond what is in the source
data, to aid Listeners.
This is usually related to specifying which system an event took place in, and
usually means ensuring there is the full set of:
1. `StarSystem` - the name of the system.
2. `SystemAddress` - the game's unique numerical identifier for the system.
3. `StarPos` - The system's co-ordinates.
Whilst it can be argued that any Listener should see preceding event(s) that
give any missing information where at least the system name or `SystemAddress`
is already in the event data, this might not always be true. So Senders MUST
add this data where required. It helps to fill out basic system information
(name, SystemAddress and co-ordinates).
However, there is a known game bug that can result in it stopping writing to
the game journal, and some observed behaviour implies that it might then later
resume writing to that file, but with events missing. This means any Sender
that blindly assumes it knows the current system/location and uses that for
these Augmentations might send erroneous data.
1. **Senders MUST cross-check available event data with prior 'location'
event(s) to be sure the correct extra data is being added.**
2. **Listeners SHOULD realise that any data added as an Augmentation might be
in error.**
For Senders, if the source data only has `SystemAddress` then you MUST check
that it matches that from the prior `Location`, `FSDJump` or `CarrierJump`
event before adding `StarSystem` and `StarPos` data to a message. Drop the
message entirely if it does not match. Apply similar logic if it is only
the system's name that is already present in data. Do not blindly add
`SystemAddress` or `StarPos`. Likewise, do not blindly add `StarPos` if the
other data is already in the source, without cross-checking the system name
and `SystemAddress`.
Listeners might be able to apply their own cross-check on received messages,
and use any mismatch with respect to what they already know to make a decision
whether to trust the augmented data. Flagging it for manual review is probably
wise.
### Server responses
There are three possible sources of HTTP responses when sending an upload
to EDDN.
@ -435,7 +476,11 @@ data you will first need to zlib-decompress each message. Then you will
have a textual JSON object as per the Schemas.
In general, check the guidance for [Uploading messages](#uploading-messages)
for the expected format of the messages.
for the expected format of the messages. **Pay particular attention to any
schema-specific Augmentations**. Whilst Senders MUST make every effort to
ensure such data is correct it is possible that bugs in either their code, or
the game itself, could mean it is incorrect. Listeners use such data at
their own risk.
Consumers can utilise the `$schemaRef` value to determine which Schema a
particular message is for. There is no need to validate the messages

3
pytest.ini Normal file
View File

@ -0,0 +1,3 @@
[pytest]
norecursedirs = src
testpaths = tests/

View File

@ -62,68 +62,26 @@ def process_file(input_file: str) -> None:
# print(matches.group('sender_ip'))
# print('')
software_version = semantic_version.Version.coerce(matches.group('software_version'))
try:
software_version = semantic_version.Version.coerce(matches.group('software_version'))
except ValueError as e:
print(f"Error parsing sofwareVersion for:\n{matches.group('software_version')}\n{line}\n")
next
###################################################################
# Issues we know about and HAVE already alerted their
# developers to.
###################################################################
if matches.group('software_name') == 'EDDiscovery':
# https://github.com/EDDiscovery/EDDiscovery/releases/latest
if software_version >= semantic_version.Version.coerce('15.0.0.0'):
if matches.group('schema_ref') == 'https://eddn.edcd.io/schemas/approachsettlement/1':
if matches.group('err_msg') == 'Failed Validation "[<ValidationError: "\'Latitude\' is a required property">]"':
# <https://github.com/EDDiscovery/EDDiscovery/issues/3236>
pass
elif matches.group('err_msg') == 'Failed Validation "[<ValidationError: "Additional properties are not allowed (\'Name_Localised\' was unexpected)">]"':
# <https://github.com/EDDiscovery/EDDiscovery/issues/3237>
pass
else:
print(line)
else:
print(line)
elif software_version >= semantic_version.Version.coerce('12.1.7.0'):
if matches.group('schema_ref') in (
'https://eddn.edcd.io/schemas/shipyard/2',
'https://eddn.edcd.io/schemas/outfitting/2',
):
# Reported via Discord PM to Robby 2022-01-07
if matches.group('err_msg') == 'Failed Validation "[<ValidationError: \'[] is too short\'>]"':
pass
else:
print(line)
else:
print(line)
if software_version >= semantic_version.Version.coerce('15.0.4.0'):
print(line)
elif matches.group('software_name') == 'EDDLite':
# https://github.com/EDDiscovery/EDDLite/releases/tag/latest
if software_version >= semantic_version.Version.coerce('2.0.0'):
if matches.group('schema_ref') in (
'https://eddn.edcd.io/schemas/shipyard/2',
'https://eddn.edcd.io/schemas/outfitting/2',
):
# Failed Validation "[<ValidationError: "'2022-02-17T14.25.19Z' is not a 'date-time'">]"
if (
matches.group('err_msg').startswith('Failed Validation "[<ValidationError: "') and
matches.group('err_msg').endswith('\' is not a \'date-time\'">]"')
):
# <https://github.com/EDDiscovery/EDDLite/issues/8>
pass
elif matches.group('err_msg') == 'Failed Validation "[<ValidationError: \'[] is too short\'>]"':
# Reported via Discord PM to Robby 2022-01-07
pass
else:
print(line)
else:
print(line)
if software_version >= semantic_version.Version.coerce('2.2.0'):
print(line)
elif matches.group('software_name') == 'EDDI':
# https://github.com/EDCD/EDDI/releases/latest
@ -132,45 +90,23 @@ def process_file(input_file: str) -> None:
elif matches.group('software_name').startswith('E:D Market Connector'):
# https://github.com/EDCD/EDMarketConnector/releases/latest
if software_version >= semantic_version.Version.coerce('5.3.0'):
if matches.group('schema_ref') == 'https://eddn.edcd.io/schemas/codexentry/1':
# <https://github.com/EDCD/EDMarketConnector/issues/1393>
if matches.group('err_msg') == 'Failed Validation "[<ValidationError: "\'\' is too short">]"':
pass
else:
print(matches.group('err_msg'))
print(line)
elif matches.group('schema_ref') == 'https://eddn.edcd.io/schemas/journal/1':
# <https://github.com/EDCD/EDMarketConnector/issues/1403>
if matches.group('err_msg') == 'Failed Validation "[<ValidationError: "\'SystemAddress\' is a required property">]"':
# <https://github.com/EDCD/EDMarketConnector/issues/1403>
pass
elif matches.group('err_msg').startswith(
if software_version >= semantic_version.Version.coerce('5.4.1'):
if matches.group('schema_ref') == 'https://eddn.edcd.io/schemas/journal/1':
if matches.group('err_msg').startswith(
'Failed Validation "[<ValidationError: "{\'type\': [\'array\', \'boolean\', \'integer\', \'number\', \'null\', \'object\', \'string\']} is not allowed for'
):
# <https://github.com/EDCD/EDMarketConnector/issues/1403>
pass
else:
print(matches.group('err_msg'))
print(line)
elif matches.group('schema_ref') == 'https://eddn.edcd.io/schemas/fssdiscoveryscan/1':
if matches.group('err_msg') == 'Failed Validation "[<ValidationError: "None is not of type \'boolean\'">]"':
# <https://github.com/EDCD/EDMarketConnector/issues/1403>
elif matches.group('schema_ref') == 'https://eddn.edcd.io/schemas/fsssignaldiscovered/1':
if matches.group('err_msg') == 'Failed Validation "[<ValidationError: \'[] is too short\'>]"':
# <https://github.com/EDCD/EDMarketConnector/issues/1598>
pass
else:
print(line)
elif matches.group('schema_ref') == 'https://eddn.edcd.io/schemas/approachsettlement/1':
if matches.group('err_msg') == 'Failed Validation "[<ValidationError: "\'Latitude\' is a required property">]"':
# <https://github.com/EDCD/EDMarketConnector/issues/1476>
elif matches.group('err_msg') == 'Failed Validation "[<ValidationError: "None is not of type \'string\'">]"':
# <https://github.com/EDCD/EDMarketConnector/issues/1599>
pass
else:
print(line)
@ -221,7 +157,7 @@ def process_file(input_file: str) -> None:
elif matches.group('software_name') == 'EDSM - Console':
# It's in-browser, no public source/releases
if software_version >= semantic_version.Version.coerce('1.0'):
if software_version >= semantic_version.Version.coerce('1.0.2'):
if matches.group('schema_ref') == 'https://eddn.edcd.io/schemas/journal/1':
if matches.group('journal_event') == 'Scan':
# <https://github.com/EDSM-NET/FrontEnd/issues/466>
@ -254,6 +190,16 @@ def process_file(input_file: str) -> None:
else:
print(line)
elif matches.group('schema_ref') == 'https://eddn.edcd.io/schemas/shipyard/2':
# <https://discord.com/channels/164411426939600896/205369618284544000/955030485791285258>
if matches.group('err_msg').startswith(
'Failed Validation "[<ValidationError: \'[] is too short\'>]"'
):
pass
else:
print(line)
else:
print(line)
@ -284,10 +230,10 @@ def process_file(input_file: str) -> None:
# Abandoned/unmaintained project
# <https://forums.frontier.co.uk/threads/release-eva-elite-virtual-assistant-for-iphone-ipad-no-longer-working-jan-2020.245900/page-18>
# <https://apps.apple.com/gb/app/eva/id1098763533>
elif matches.group('software_name') in ('EVA [iPhone]', 'EVA [iPad]'):
elif matches.group('software_name') in ('EVA [iPhone]', 'EVA [iPad]', 'EVA [Android]'):
pass
###################################################################
####################################################################
# Issues we know about, but haven't yet alerted developers to
###################################################################
###################################################################

4
src/.mypy.ini Normal file
View File

@ -0,0 +1,4 @@
[mypy]
follow_imports = skip
ignore_missing_imports = True
scripts_are_modules = True

View File

@ -28,12 +28,13 @@ Architecture:
"""
import argparse
import logging
import pathlib
import sys
import zlib
from datetime import datetime
from typing import Callable
if sys.path[0].endswith('/eddn'):
if pathlib.Path(sys.path[0]).as_posix().endswith('/eddn'):
print(sys.path)
print(
'''
@ -55,7 +56,6 @@ instead do:
import gevent
import requests
import simplejson
import urlparse
from bottle import Bottle, request, response
from gevent import monkey
@ -161,30 +161,8 @@ def get_decompressed_message() -> bytes:
# Negative wbits suppresses adler32 checksumming.
message_body = zlib.decompress(request.body.read(), -15)
# At this point, we're not sure whether we're dealing with a straight
# un-encoded POST body, or a form-encoded POST. Attempt to parse the
# 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:
# 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):
raise MalformedUploadError(
"No 'data' POST key/value found. Check your POST key "
"name for spelling, and make sure you're passing a value."
)
else:
# Uncompressed request. Bottle handles all of the parsing of the
# POST key/vals, or un-encoded body.
data_key = request.forms.get("data")
if data_key:
# This is a form-encoded POST. Support the silly people.
message_body = data_key
else:
# This is a non form-encoded POST body.
message_body = request.body.read()
message_body = request.body.read()
return message_body

View File

@ -8,13 +8,13 @@ market data to the Announcer daemons.
"""
import argparse
import pathlib
import sys
import zlib
from datetime import datetime
from typing import Dict
from urllib.parse import parse_qs
if sys.path[0].endswith('/eddn'):
if pathlib.Path(sys.path[0]).as_posix().endswith('/eddn'):
print(sys.path)
print(
'''
@ -55,7 +55,6 @@ from eddn.core.StatsCollector import StatsCollector # noqa: E402
bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024 # 1MiB, default is/was 100KiB
app = Bottle()
logger.info("Made logger")
# This socket is used to push market data out to the Announcers over ZeroMQ.
zmq_context = zmq.Context()
@ -170,7 +169,7 @@ def get_remote_address() -> str:
return request.headers.get("X-Forwarded-For", request.remote_addr)
def get_decompressed_message() -> bytes:
def get_decompressed_message(headers: dict, input: bytes) -> bytes:
"""
Detect gzip Content-Encoding headers and de-compress on the fly.
@ -178,7 +177,7 @@ def get_decompressed_message() -> bytes:
:rtype: str
:returns: The de-compressed request body.
"""
content_encoding = request.headers.get("Content-Encoding", "")
content_encoding = headers.get("Content-Encoding", "")
logger.debug("Content-Encoding: %s", content_encoding)
if content_encoding in ["gzip", "deflate"]:
@ -188,53 +187,18 @@ def get_decompressed_message() -> bytes:
try:
# Auto header checking.
logger.debug("Trying zlib.decompress (15 + 32)...")
message_body = zlib.decompress(request.body.read(), 15 + 32)
message_body = zlib.decompress(input, 15 + 32)
except zlib.error:
logger.error("zlib.error, trying zlib.decompress (-15)")
# Negative wbits suppresses adler32 checksumming.
message_body = zlib.decompress(request.body.read(), -15)
message_body = zlib.decompress(input, -15)
logger.debug("Resulting message_body:\n%s\n", message_body)
# At this point, we're not sure whether we're dealing with a straight
# un-encoded POST body, or a form-encoded POST. Attempt to parse the
# body. If it's not form-encoded, this will return an empty dict.
form_enc_parsed = parse_qs(message_body)
if form_enc_parsed:
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[b"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."
)
else:
logger.debug("Request is *NOT* form-encoded")
else:
logger.debug("Content-Encoding indicates *not* compressed...")
# Uncompressed request. Bottle handles all of the parsing of the
# POST key/vals, or un-encoded body.
data_key = request.forms.get("data")
if data_key:
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
else:
logger.debug("Plain POST request detected...")
# This is a non form-encoded POST body.
message_body = request.body.read()
message_body = input
return message_body
@ -344,13 +308,25 @@ def parse_and_error_handle(data: bytes) -> str:
@app.route("/upload/", method=["OPTIONS", "POST"])
def upload() -> str:
"""
Handle an /upload/ request.
Process an /upload/ request.
:return: The processed message, else error string.
"""
return handle_upload(request.headers, request.body.read(), response)
def handle_upload(headers, body, response) -> str:
"""
Handle an upload request.
This is separate from, and called by, the bottle route to more easily
enable functional/unit testing.
:return: The processed message, else error string.
"""
try:
# Body may or may not be compressed.
message_body = get_decompressed_message()
message_body = get_decompressed_message(headers, body)
except zlib.error as exc:
# Some languages and libs do a crap job zlib compressing stuff. Provide
@ -436,15 +412,8 @@ def apply_cors() -> None:
)
def main() -> None:
"""Handle setting up and running the bottle app."""
cl_args = parse_cl_args()
if cl_args.loglevel:
logger.setLevel(cl_args.loglevel)
load_config(cl_args)
configure()
def setup_bottle_app() -> dict:
"""Handle setup of the bottle app."""
app.add_hook("after_request", apply_cors)
# Build arg dict for args
@ -461,6 +430,21 @@ def main() -> None:
argsd["certfile"] = Settings.CERT_FILE
argsd["keyfile"] = Settings.KEY_FILE
return argsd
def main() -> None:
"""Take note of configuration and start bottle app."""
cl_args = parse_cl_args()
if cl_args.loglevel:
logger.setLevel(cl_args.loglevel)
load_config(cl_args)
configure()
argsd = setup_bottle_app()
logger.info('Starting bottle app...')
app.run(
**argsd,
)

View File

@ -5,12 +5,13 @@ import argparse
import collections
import datetime
import logging
import pathlib
import sys
import zlib
from threading import Thread
from typing import OrderedDict
if sys.path[0].endswith('/eddn'):
if pathlib.Path(sys.path[0]).as_posix().endswith('/eddn'):
print(sys.path)
print(
'''
@ -53,7 +54,6 @@ __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")
# This import must be done post-monkey-patching!
if Settings.RELAY_DUPLICATE_MAX_MINUTES:
@ -333,6 +333,7 @@ def main() -> None:
argsd["certfile"] = Settings.CERT_FILE
argsd["keyfile"] = Settings.KEY_FILE
logger.info('Starting bottle app...')
app.run(
**argsd,
)

View File

@ -4,13 +4,15 @@
import argparse
import hashlib
import logging
import pathlib
import sys
import time
import uuid
import zlib
from threading import Thread
from typing import TYPE_CHECKING
if sys.path[0].endswith('/eddn'):
if pathlib.Path(sys.path[0]).as_posix().endswith('/eddn'):
print(sys.path)
print(
'''
@ -40,6 +42,23 @@ from zmq import SUB as ZMQ_SUB
from zmq import SUBSCRIBE as ZMQ_SUBSCRIBE
# Logging has to be configured first before we do anything.
# Define a TRACE level
LEVEL_TRACE = 5
LEVEL_TRACE_ALL = 3
logging.addLevelName(LEVEL_TRACE, "TRACE")
logging.addLevelName(LEVEL_TRACE_ALL, "TRACE_ALL")
logging.TRACE = LEVEL_TRACE # type: ignore
logging.TRACE_ALL = LEVEL_TRACE_ALL # type: ignore
logging.Logger.trace = lambda self, message, *args, **kwargs: self._log( # type: ignore
logging.TRACE, # type: ignore
message,
args,
**kwargs
)
# isort: off
if TYPE_CHECKING:
from logging import trace, TRACE # type: ignore # noqa: F401
# isort: on
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
__logger_channel = logging.StreamHandler()
@ -48,7 +67,6 @@ __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, load_config # noqa: E402
@ -168,6 +186,7 @@ class Relay(Thread):
if duplicate_messages.is_duplicated(json):
# We've already seen this message recently. Discard it.
stats_collector.tally("duplicate")
logger.trace('Discarding duplicate message') # type: ignore
return
# Mask the uploader with a randomised nonce but still make it unique
@ -188,6 +207,7 @@ class Relay(Thread):
# Send message
sender.send(message)
stats_collector.tally("outbound")
logger.trace('Sent message to Listeners') # type: ignore
while True:
# For each incoming message, spawn a greenlet using the relay_worker
@ -235,6 +255,7 @@ def main() -> None:
argsd["certfile"] = Settings.CERT_FILE
argsd["keyfile"] = Settings.KEY_FILE
logger.info('Starting bottle app...')
app.run(
**argsd,
)

View File

@ -15,13 +15,12 @@ class _Settings(object):
###############################################################################
# Local installation settings
###############################################################################
# If these are set to non-empty strings then you reverse proxt setup
# If these are set to non-empty strings then your reverse proxy setup
# **MUST** pass TLS through properly, including to a https URL, not a
# plain http one.
CERT_FILE = "/etc/letsencrypt/live/eddn.edcd.io/fullchain.pem" # noqa: E221
KEY_FILE = "/etc/letsencrypt/live/eddn.edcd.io/privkey.pem" # noqa: E221
###############################################################################
# Relay settings
###############################################################################
@ -47,7 +46,6 @@ class _Settings(object):
GATEWAY_HTTP_BIND_ADDRESS = "127.0.0.1" # noqa: E221
GATEWAY_HTTP_PORT = 8081 # noqa: E221
GATEWAY_SENDER_BINDINGS = ["tcp://127.0.0.1:8500"] # noqa: E221
GATEWAY_JSON_SCHEMAS = { # noqa: E221
@ -85,6 +83,12 @@ class _Settings(object):
"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",
"https://eddn.edcd.io/schemas/fssbodysignals/1": "schemas/fssbodysignals-v1.0.json",
"https://eddn.edcd.io/schemas/fssbodysignals/1/test": "schemas/fssbodysignals-v1.0.json",
"https://eddn.edcd.io/schemas/fsssignaldiscovered/1": "schemas/fsssignaldiscovered-v1.0.json",
"https://eddn.edcd.io/schemas/fsssignaldiscovered/1/test": "schemas/fsssignaldiscovered-v1.0.json",
}
GATEWAY_OUTDATED_SCHEMAS = [ # noqa: E221

View File

@ -49,11 +49,17 @@ contents all Schemas specify a top-level JSON Object with the data:
Each `message` object must have, at bare minimum:
1. `timestamp` - string date and time in ISO8601 format. Whilst this
technically allows for any timezone to be cited you SHOULD provide this in
UTC, aka 'Zulu Time' as in the example above. You MUST ensure that you are
doing this properly. Do not claim 'Z' whilst actually using a local time
that is offset from UTC.
1. `timestamp` - string date and time in ISO8601 format.
1. Whilst this technically allows for any timezone to be cited you SHOULD
provide this in UTC, aka 'Zulu Time' as in the example above.
You MUST ensure that you are doing this properly.
Do not claim 'Z' whilst actually using a local time that is offset from
UTC.
2. Historically we had never been explicit about if Senders should include
sub-second resolution in the timestamps, or if Listeners should be
prepared to accept such. As of 2022-06-24 we are explicitly stating that
Senders **MAY** include sub-second resolution, and Listeners **MUST**
be prepared to accept such.
If you are only utilising Journal-sourced data then simply using the
value from there should be sufficient as the PC game client is meant to

View File

@ -106,10 +106,20 @@ value is what the name would have been in the source Journal data.
Please read [horizons and odyssey flags](../docs/Developers.md#horizons-and-odyssey-flags)
in the Developers' documentation.
#### StarSystem
You MUST add a `StarSystem` string containing the name of the system from the
last `FSDJump`, `CarrierJump`, or `Location` event.
**You MUST apply a location cross-check, as per
[Other data augmentations](../docs/Developers.md#other-data-augmentations).**
#### StarPos
You MUST add a `StarPos` array containing the system co-ordinates from the
last `FSDJump`, `CarrierJump`, or `Location` event.
**You MUST apply a location cross-check, as per
[Other data augmentations](../docs/Developers.md#other-data-augmentations).**
## Listeners
The advice above for [Senders](#senders), combined with the actual Schema file
*should* provide all the information you need to process these events.

View File

@ -64,6 +64,12 @@ 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.
**You MUST apply a location cross-check, as per
[Other data augmentations](../docs/Developers.md#other-data-augmentations).**
#### StarPos
You MUST add a `StarPos` array containing the system co-ordinates from the
last `FSDJump`, `CarrierJump`, or `Location` event.
**You MUST apply a location cross-check, as per
[Other data augmentations](../docs/Developers.md#other-data-augmentations).**

View File

@ -27,6 +27,9 @@ in the Developers' documentation.
You MUST add a `StarPos` array containing the system co-ordinates from the
last `FSDJump`, `CarrierJump`, or `Location` event.
**You MUST apply a location cross-check, as per
[Other data augmentations](../docs/Developers.md#other-data-augmentations).**
#### BodyID and BodyName
You SHOULD attempt to track the BodyName and BodyID where the player is
and add keys/values for these.

View File

@ -27,3 +27,6 @@ in the Developers' documentation.
#### StarPos
You MUST add a `StarPos` array containing the system co-ordinates from the
last `FSDJump`, `CarrierJump`, or `Location` event.
**You MUST apply a location cross-check, as per
[Other data augmentations](../docs/Developers.md#other-data-augmentations).**

View File

@ -0,0 +1,49 @@
# EDDN FSSAllBodiesFound Schema
## Introduction
Here we document how to take data from an ED `FSSBodySignals` 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.
If you find any discrepancies between what this document says and what is
defined in the relevant Schema file, then you should, in the first instance,
assume that it is the Schema file that is correct.
**PLEASE open
[an issue on GitHub](https://github.com/EDCD/EDDN/issues/new/choose)
to report any such anomalies you find so that we can check and resolve the
discrepancy.**
## Senders
The primary data source for this schema is the ED Journal event
`FSSBodySignals`.
### Augmentations
#### horizons and odyssey flags
Please read [horizons and odyssey flags](../docs/Developers.md#horizons-and-odyssey-flags)
in the Developers' documentation.
#### StarSystem
You MUST add a `StarSystem` string containing the name of the system from the
last `FSDJump`, `CarrierJump`, or `Location` event.
**You MUST apply a location cross-check, as per
[Other data augmentations](../docs/Developers.md#other-data-augmentations).**
#### StarPos
You MUST add a `StarPos` array containing the system co-ordinates from the
last `FSDJump`, `CarrierJump`, or `Location` event.
**You MUST apply a location cross-check, as per
[Other data augmentations](../docs/Developers.md#other-data-augmentations).**
#### Remove _Localised key/values
All keys whose name ends with `_Localised`, i.e. the `Type_Localised`
key/values in Signals.
#### Examples:
```json
{ "timestamp":"2022-05-18T00:10:57Z", "event":"FSSBodySignals", "BodyName":"Phoi Auwsy ZY-Z d132 7 a", "BodyID":37, "SystemAddress":4546986398603, "Signals":[ { "Type":"$SAA_SignalType_Geological;", "Type_Localised":"Geological", "Count":2 } ] }
```

View File

@ -0,0 +1,96 @@
{
"$schema" : "http://json-schema.org/draft-04/schema#",
"id" : "https://eddn.edcd.io/schemas/fssbodysignals/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 Localised strings and the properties marked below as 'disallowed'",
"additionalProperties" : false,
"required" : [ "timestamp", "event", "StarSystem", "StarPos", "SystemAddress", "BodyID", "Signals" ],
"properties" : {
"timestamp": {
"type" : "string",
"format" : "date-time"
},
"event" : {
"enum" : [ "FSSBodySignals" ]
},
"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 if not present in the journal event"
},
"SystemAddress": {
"type" : "integer"
},
"BodyID" : {
"type" : "integer"
},
"BodyName": {
"type" : "string",
"minLength" : 1
},
"Signals": {
"type" : "array",
"items" : {
"type" : "object",
"additionalProperties" : false,
"required" : [ "Type", "Count" ],
"properties" : {
"Type" : {
"type" : "string"
},
"Count" : {
"type" : "integer"
}
}
}
}
}
}
},
"definitions": {
"disallowed" : { "not" : { "type": [ "array", "boolean", "integer", "number", "null", "object", "string" ] } }
}
}

View File

@ -27,3 +27,6 @@ in the Developers' documentation.
#### StarPos
You MUST add a `StarPos` array containing the system co-ordinates from the
last `FSDJump`, `CarrierJump`, or `Location` event.
**You MUST apply a location cross-check, as per
[Other data augmentations](../docs/Developers.md#other-data-augmentations).**

View File

@ -0,0 +1,187 @@
# EDDN FSSSignalDiscovered Schema
## Introduction
Here we document how to take data from an ED `FSSSignalDiscovered` 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 only data source for this schema is the ED Journal event
`FSSSignalDiscovered`.
### Batching
You MUST coalesce contiguous runs of `FSSSignalDiscovered` events into a
single `signals` array in the message. Minimum size of `signals` is 1 item.
Do not make a request for every single event other than where they occur
singly (such as when a player utilises the FSS to zoom into USS individually,
if there is a different following event).
Suggested algorithm for batching:
1. You will need to track the current location from `Location`, `FSDJump` and
`CarrierJump` events. This is in order to add the top-level augmentation
of `StarSystem` (system name) and `StarPos`. You will need to record:
1. `SystemAddress` - for cross-checking.
2. `StarSystem` - name of the star system.
3. `StarPos` - the galactic co-ordinates of the system.
2. If the event is `FSSSignalDiscovered`, store it to the temporal list.
3. If the event is any other, then:
1. check if it is `Location`, `FSDJump` or `CarrierJump` - if so you should
use this new location in the message for the augmentations.
2. If it is not one of those events then you should use the tracked
location from the prior such event for the augmentations.
Now construct the full `fsssignaldiscovered` schema message using the
tracked location and the stored list of events. *You **MUST** check that
the `SystemAddress` for each `FSSSignalDiscovered` event matches the
tracked location.* If there is a mis-match then drop that event.
4. Use the `timestamp` of the first signal in the batch as the top-level
`timestamp` in the `message` object.
Point 3i/ii above are because in the current (3.8.0.406) Horizons client the
`FSSSignalDiscovered` events arrive after `Location`/`FSDJump`/`CarrierJump`,
but in the current (4.0.0.1302) Odyssey client they arrive before such events.
Thus, in Horizons you use the last-tracked location, but in Odyssey you use
the "just arrived" location.
Manually FSS-scanned USS type signals will come in one by one, possibly with
other events between them (such as `Music` due to zooming in/out in FSS).
There is no need to attempt batching these together if separated by other
events, even though you'll be using the `timestamp` of the first on the
message, despite the actual time-line being dependent on how quickly the
player scans them.
This batching is more concerned with not causing an EDDN message per event
upon entry into a system.
### Elisions
Remove the `event` key/pair from each member of the `signals` array. Including
this would be redundant as by definition we're sending `FSSSignalDiscovered`
events on this schema.
You MUST remove the following key/value pairs from the data:
- `TimeRemaining` key/value pair (will be present on USS). This has a slight
PII nature and is also very ephemeral.
You MUST drop the whole `FSSSignalDiscovered` event if `USSType` key
has `$USS_Type_MissionTarget;` value. Only the Cmdr with the mission has any
use of these. There's not even a statistical use.
Because of the location cross-check the `SystemAddress` is in the top-level
`message` object, and thus you **MUST** remove such from each signal in the
array.
Do **NOT** remove the `timestamp` from each signal in the array. Whilst these
should be identical for a "just logged in or arrived in system" set of signals,
this is not true of manually FSS scanned USS signals.
### 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` string containing the system name from the last
tracked location. You **MUST** cross-check each `FSSSignalDiscovered`
->`SystemAddress` value to ensure it matches. If it does not, you **MUST**
drop the event.
#### StarPos
You **MUST** add a `StarPos` array containing the system co-ordinates from the
tracked location. You **MUST** cross-check each `FSSSignalDiscovered`
->`SystemAddress` value to ensure it matches. If it does not, you **MUST**
drop the event.
## Receivers
### Augmentations are 'SHOULD', not 'MUST'
Receivers should remember that `horizons` and `odyssey` augmentations
are optional key/value pairs. You **SHOULD NOT** rely on them being present
in any given event.
### Duplicate messages from 'busy' systems
When a system is particularly full of signals, such as when many Fleet Carriers
are present, it has been observed that the game repeats the identical
sequence of `FSSSignalDiscovered` events. So you might receive what looks like
a duplicate message, other than the timestamp (if the timestamp is the same
then the EDDN Relay should drop the duplicate).
## Examples
This is a few example of messages that passes current `FSSSignalDiscovered` schema.
1. A message without `horizons` or `odyssey` augmentations.
```json
{
"$schemaRef":"https://eddn.edcd.io/schemas/fsssignaldiscovered/1",
"header":{
"gatewayTimestamp":"2021-11-06T22:48:43.483147Z",
"softwareName":"a software",
"softwareVersion":"a version",
"uploaderID":"an uploader"
},
"message":{
"timestamp":"2021-11-06T22:48:42Z",
"event":"FSSSignalDiscovered",
"SystemAddress":1774711381,
"signals":[
{
"timestamp":"2021-11-06T22:48:42Z",
"SignalName":"EXPLORER-CLASS X2X-74M",
"IsStation":true
}
],
"StarSystem":"HR 1185",
"StarPos": [
-64.66, -148.94, -330.41
]
}
}
```
2. A message with `horizons`, `odyssey`, `systemName`, `StarPos` fields which says it sent from Odyssey.
```json
{
"$schemaRef":"https://eddn.edcd.io/schemas/fsssignaldiscovered/1",
"header":{
"gatewayTimestamp":"2021-11-06T22:48:43.483147Z",
"softwareName":"a software",
"softwareVersion":"a version",
"uploaderID":"an uploader"
},
"message":{
"timestamp":"2021-11-06T22:48:42Z",
"event":"FSSSignalDiscovered",
"SystemAddress":1350507186531,
"signals":[
{
"timestamp":"2021-11-06T22:48:42Z",
"event":"FSSSignalDiscovered",
"SignalName":"EXPLORER-CLASS X2X-74M",
"IsStation":true
},
{
"timestamp":"2021-11-06T22:48:42Z",
"event":"FSSSignalDiscovered",
"SignalName":"$USS_NonHumanSignalSource;",
"USSType":"$USS_Type_NonHuman;",
"SpawningState":"$FactionState_None;",
"SpawningFaction":"$faction_none;",
"ThreatLevel":5
}
],
"StarPos": [
8.1875,
124.21875,
-38.5
],
"StarSystem": "HIP 56186",
"horizons": true,
"odyssey": true
}
}
```

View File

@ -0,0 +1,108 @@
{
"$schema" : "http://json-schema.org/draft-04/schema#",
"id" : "https://eddn.edcd.io/schemas/fsssignaldiscovered/1#",
"description" : "EDDN schema for FSSSignalDiscovered Journal events. Full documentation at https://github.com/EDCD/EDDN/tree/master/schemas/fsssignaldiscovered-README.md",
"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 Localised strings and the properties marked below as 'disallowed'",
"additionalProperties" : false,
"required" : [ "event", "timestamp", "SystemAddress", "StarSystem", "StarPos", "signals"],
"properties" : {
"event": {
"enum" : [ "FSSSignalDiscovered" ]
},
"horizons": {
"type" : "boolean",
"description" : "Whether the sending Cmdr has a Horizons pass."
},
"odyssey": {
"type" : "boolean",
"description" : "Whether the sending Cmdr has an Odyssey expansion."
},
"timestamp": {
"type" : "string",
"format" : "date-time",
"description" : "Duplicate of the first signal's timestamp, for commonality with other schemas."
},
"SystemAddress": {
"type": "integer"
},
"signals": {
"type": "array",
"description": "Array of FSSSignalDiscovered events",
"minItems": 1,
"items": {
"type": "object",
"required": ["timestamp", "SignalName"],
"description": "Single FSSSignalDiscovered event",
"properties": {
"timestamp": {
"type" : "string",
"format" : "date-time"
},
"SignalName": { "type": "string" },
"IsStation": { "type": "boolean" },
"USSType": {
"type": "string",
"not": {
"pattern": "^\\$USS_Type_MissionTarget;$"
}
},
"TimeRemaining": {"$ref" : "#/definitions/disallowed"},
"SpawningState": {"type": "string"},
"SpawningFaction" : {"type": "string"},
"ThreatLevel": {"type": "integer" },
"patternProperties": {
"_Localised$" : { "$ref" : "#/definitions/disallowed" }
}
}
}
},
"StarSystem": {
"type" : "string",
"minLength" : 1,
"description": "Should be added by the sender"
},
"StarPos": {
"type" : "array",
"items" : { "type": "number" },
"minItems" : 3,
"maxItems" : 3,
"description" : "Should be added by the sender"
}
}
}
},
"definitions": {
"disallowed" : { "not" : { "type": [ "array", "boolean", "integer", "number", "null", "object", "string" ] } }
}
}

View File

@ -72,15 +72,20 @@ You SHOULD add this key/value pair, using the value from the `LoadGame` event.
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.
If not already present, you MUST add a `StarSystem` string containing the
name of the system from the last `FSDJump`, `CarrierJump`, or `Location` event.
#### SystemAddress
You MUST add a `SystemAddress` key/value pair representing the numerical ID
of the system this event occurred in. Source this from either `Location`,
`FSDJump` or `CarrierJump` as appropriate.
**You MUST apply a location cross-check, as per
[Other data augmentations](../docs/Developers.md#other-data-augmentations).**
This should only apply to `SAASignalsFound` events.
#### StarPos
You MUST add a `StarPos` array containing the system co-ordinates from the
last `FSDJump`, `CarrierJump`, or `Location` event.
If not already present, you MUST add a `StarPos` array containing the
system co-ordinates from the last `FSDJump`, `CarrierJump`, or `Location`
event.
**You MUST apply a location cross-check, as per
[Other data augmentations](../docs/Developers.md#other-data-augmentations).**
This should only apply to `Docked`, `Scan` and `SAASignalsFound` events.

View File

@ -29,6 +29,12 @@ 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.
**You MUST apply a location cross-check, as per
[Other data augmentations](../docs/Developers.md#other-data-augmentations).**
#### StarPos
You MUST add a `StarPos` array containing the system co-ordinates from the
last `FSDJump`, `CarrierJump`, or `Location` event.
**You MUST apply a location cross-check, as per
[Other data augmentations](../docs/Developers.md#other-data-augmentations).**

View File

@ -30,3 +30,6 @@ in the Developers' documentation.
#### StarPos
You MUST add a `StarPos` array containing the system co-ordinates from the
last `FSDJump`, `CarrierJump`, or `Location` event.
**You MUST apply a location cross-check, as per
[Other data augmentations](../docs/Developers.md#other-data-augmentations).**

View File

@ -0,0 +1,4 @@
{
"CERT_FILE": "",
"KEY_FILE": ""
}

49
src/tests/conftest.py Normal file
View File

@ -0,0 +1,49 @@
"""General pytest configuration, including fixtures."""
import os
import pathlib
import sys
from typing import Callable, Optional
import pytest
@pytest.fixture()
def eddn_message() -> Callable:
"""Load and supply a test message from the on-disk collection."""
def _method(msg_type: str) -> Optional[str]:
path = pathlib.Path('tests/eddn_message/' + msg_type + '.json')
with open(path, 'r') as eddn_message:
return eddn_message.read()
return _method
@pytest.fixture
def fix_sys_path() -> None:
"""Set up an eddn.Gateway import."""
# Tests don't include the directory that `pytest` is run from on sys.path
sys.path.append(os.getcwd())
@pytest.fixture(scope="session")
def eddn_gateway():
"""Set up an eddn.Gateway import."""
import eddn.Gateway
class CLArgs:
config = False
cl_args = CLArgs()
eddn.Gateway.load_config(cl_args)
eddn.Gateway.configure()
return eddn.Gateway
@pytest.fixture
def bottle_response() -> object:
"""Mock a `bottle.response` enough for tests."""
class BottleResponseMock:
status: int = 200
return BottleResponseMock()

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/approachsettlement/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:04.300179Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "uploaderID": "405b0315cefe9bd0634dccb6fe3918b7a75c7e4f"}, "message": {"BodyID": 19, "BodyName": "HIP 98621 B 2", "Latitude": 62.727066, "Longitude": -18.212152, "MarketID": 3521656064, "Name": "Rucker's Progress", "StarPos": [57.6875, -65.03125, 86.9375], "StarSystem": "HIP 98621", "SystemAddress": 869487593843, "event": "ApproachSettlement", "horizons": true, "odyssey": false, "timestamp": "2022-11-14T00:00:03Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/approachsettlement/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:04.300179Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "gameversion": "4.0.0.1450", "gamebuild":"r286858/r0 ", "uploaderID": "405b0315cefe9bd0634dccb6fe3918b7a75c7e4f"}, "message": {"BodyID": 19, "BodyName": "HIP 98621 B 2", "Latitude": 62.727066, "Longitude": -18.212152, "MarketID": 3521656064, "Name": "Rucker's Progress", "StarPos": [57.6875, -65.03125, 86.9375], "StarSystem": "HIP 98621", "SystemAddress": 869487593843, "event": "ApproachSettlement", "horizons": true, "odyssey": false, "timestamp": "2022-11-14T00:00:03Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/codexentry/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:14.311963Z", "softwareName": "EDDiscovery", "softwareVersion": "15.1.1.0", "uploaderID": "93f1fed82e9370b706476a21fea118e863ed3714"}, "message": {"BodyID": 36, "Category": "$Codex_Category_Biology;", "EntryID": 2370607, "Latitude": 2.590508, "Longitude": -4.297851, "Name": "$Codex_Ent_Fonticulus_06_M_Name;", "Region": "$Codex_RegionName_32;", "StarPos": [-19731.8125, -643.0, 7165.46875], "SubCategory": "$Codex_SubCategory_Organic_Structures;", "System": "Ovomly OD-G c12-10", "SystemAddress": 2799546407018, "VoucherAmount": 50000, "event": "CodexEntry", "horizons": true, "odyssey": true, "timestamp": "2022-11-14T00:00:10Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/codexentry/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:14.311963Z", "softwareName": "EDDiscovery", "softwareVersion": "15.1.1.0", "gameversion": "4.0.0.1450", "gamebuild":"r286858/r0 ", "uploaderID": "93f1fed82e9370b706476a21fea118e863ed3714"}, "message": {"BodyID": 36, "Category": "$Codex_Category_Biology;", "EntryID": 2370607, "Latitude": 2.590508, "Longitude": -4.297851, "Name": "$Codex_Ent_Fonticulus_06_M_Name;", "Region": "$Codex_RegionName_32;", "StarPos": [-19731.8125, -643.0, 7165.46875], "SubCategory": "$Codex_SubCategory_Organic_Structures;", "System": "Ovomly OD-G c12-10", "SystemAddress": 2799546407018, "VoucherAmount": 50000, "event": "CodexEntry", "horizons": true, "odyssey": true, "timestamp": "2022-11-14T00:00:10Z"}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -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":[]}}

View File

@ -0,0 +1,20 @@
{
"$schemaRef":"https://eddn.edcd.io/schemas/fcmaterials_capi/1",
"header": {
"uploaderID": "Athanasius Testing",
"softwareName": "Ath Testing",
"softwareVersion": "v0.0.1"
},
"message": {
"timestamp": "2022-08-31T12:40:00Z",
"event": "FCMaterials",
"horizons": true,
"odyssey": true,
"MarketID": 3706433792,
"CarrierID": "X3F-5NZ",
"Items": {
"sales": [],
"purchases": []
}
}
}

View File

@ -0,0 +1,39 @@
{
"$schemaRef":"https://eddn.edcd.io/schemas/fcmaterials_capi/1",
"header": {
"uploaderID": "Athanasius Testing",
"softwareName": "Ath Testing",
"softwareVersion": "v0.0.1"
},
"message": {
"timestamp": "2022-08-31T12:42:46Z",
"event": "FCMaterials",
"horizons": true,
"odyssey": true,
"MarketID": 3706433792,
"CarrierID": "X3F-5NZ",
"Items": {
"sales": [],
"purchases": [
{
"name": "aerogel",
"total": 1,
"outstanding": 1,
"price": 500
},
{
"name": "accidentlogs",
"total": 2,
"outstanding": 2,
"price": 4000
},
{
"name": "compactlibrary",
"total": 3,
"outstanding": 3,
"price": 10000
}
]
}
}
}

View File

@ -0,0 +1,27 @@
{
"$schemaRef":"https://eddn.edcd.io/schemas/fcmaterials_capi/1",
"header": {
"uploaderID": "Athanasius Testing",
"softwareName": "Ath Testing",
"softwareVersion": "v0.0.1"
},
"message": {
"timestamp": "2022-08-31T12:50:03Z",
"event": "FCMaterials",
"horizons": true,
"odyssey": true,
"MarketID": 3706433792,
"CarrierID": "X3F-5NZ",
"Items": {
"sales": [],
"purchases": [
{
"name": "aerogel",
"total": 4,
"outstanding": 4,
"price": 500
}
]
}
}
}

View File

@ -0,0 +1,20 @@
{
"$schemaRef":"https://eddn.edcd.io/schemas/fcmaterials_capi/1",
"header": {
"uploaderID": "Athanasius Testing",
"softwareName": "Ath Testing",
"softwareVersion": "v0.0.1"
},
"message": {
"timestamp": "2022-08-31T12:50:40Z",
"event": "FCMaterials",
"horizons": true,
"odyssey": true,
"MarketID": 3706433792,
"CarrierID": "X3F-5NZ",
"Items": {
"sales": [],
"purchases": []
}
}
}

View File

@ -0,0 +1,27 @@
{
"$schemaRef":"https://eddn.edcd.io/schemas/fcmaterials_capi/1",
"header": {
"uploaderID": "Athanasius Testing",
"softwareName": "Ath Testing",
"softwareVersion": "v0.0.1"
},
"message": {
"timestamp": "2022-08-31T12:40:00Z",
"event": "FCMaterials",
"horizons": true,
"odyssey": true,
"MarketID": 3706433792,
"CarrierID": "X3F-5NZ",
"Items": {
"sales": {
"128961524": {
"id": 128961524,
"name": "aerogel",
"price": 500,
"stock": 5
}
},
"purchases": []
}
}
}

View File

@ -0,0 +1,27 @@
{
"$schemaRef":"https://eddn.edcd.io/schemas/fcmaterials_capi/1",
"header": {
"uploaderID": "Athanasius Testing",
"softwareName": "Ath Testing",
"softwareVersion": "v0.0.1"
},
"message": {
"timestamp": "2022-08-31T12:57:25Z",
"event": "FCMaterials",
"horizons": true,
"odyssey": true,
"MarketID": 3706433792,
"CarrierID": "X3F-5NZ",
"Items": {
"sales": {
"128961524": {
"id": 128961524,
"name": "aerogel",
"price": 500,
"stock": 0
}
},
"purchases": []
}
}
}

View File

@ -0,0 +1,39 @@
{
"$schemaRef":"https://eddn.edcd.io/schemas/fcmaterials_capi/1",
"header": {
"uploaderID": "Athanasius Testing",
"softwareName": "Ath Testing",
"softwareVersion": "v0.0.1"
},
"message": {
"timestamp": "2022-08-31T12:58:36Z",
"event": "FCMaterials",
"horizons": true,
"odyssey": true,
"MarketID": 3706433792,
"CarrierID": "X3F-5NZ",
"Items": {
"sales": {
"128961524": {
"id": 128961524,
"name": "aerogel",
"price": 500,
"stock": 0
},
"128972282": {
"id": 128972282,
"name": "accidentlogs",
"price": 4000,
"stock": 4
},
"128962598": {
"id": 128962598,
"name": "compactlibrary",
"price": 10000,
"stock": 9
}
},
"purchases": []
}
}
}

View File

@ -0,0 +1,42 @@
{
"$schemaRef":"https://eddn.edcd.io/schemas/fcmaterials_capi/1",
"header": {
"uploaderID": "Athanasius Testing",
"softwareName": "Ath Testing",
"softwareVersion": "v0.0.1"
},
"message": {
"timestamp": "2022-08-31T12:59:17Z",
"event": "FCMaterials",
"horizons": true,
"odyssey": true,
"MarketID": 3706433792,
"CarrierID": "X3F-5NZ",
"Items": {
"sales": {
"128961524": {
"id": 128961524,
"name": "aerogel",
"locName": "Aerogel",
"price": 500,
"stock": 0
},
"128972282": {
"id": 128972282,
"name": "accidentlogs",
"locName": "Accident Logs",
"price": 4000,
"stock": 0
},
"128962598": {
"id": 128962598,
"name": "compactlibrary",
"locName": "Compact Library",
"price": 10000,
"stock": 0
}
},
"purchases": []
}
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"id":3706433792,"name":"X3F-N5Z","outpostType":"fleetcarrier","imported":[],"exported":[],"services":{"commodities":"ok","carrierfuel":"ok","socialspace":"ok","refuel":"ok","repair":"ok","rearm":"ok","shipyard":"ok","outfitting":"ok","blackmarket":"ok","voucherredemption":"ok","exploration":"ok","bartender":"ok","vistagenomics":"unavailable","pioneersupplies":"unavailable","carriermanagement":"ok","stationmenu":"ok","dock":"ok","crewlounge":"ok","engineer":"ok","contacts":"ok","livery":"ok"},"economies":{"136":{"name":"Carrier","proportion":1}},"prohibited":{"128667728":"ImperialSlaves","128049243":"Slaves"},"orders":{"commodities":{"sales":[{"name":"gold","stock":"0","price":"47681","blackmarket":false},{"name":"silver","stock":"0","price":"37362","blackmarket":false},{"name":"cobalt","stock":"0","price":"17999","blackmarket":false},{"name":"performanceenhancers","stock":"0","price":"25600","blackmarket":false},{"name":"basicmedicines","stock":"5736","price":"2500","blackmarket":false},{"name":"advancedmedicines","stock":"558","price":"75","blackmarket":false},{"name":"survivalequipment","stock":"0","price":"2700","blackmarket":false},{"name":"ancientrelic","stock":"5","price":"24962","blackmarket":false},{"name":"agronomictreatment","stock":"0","price":"30000","blackmarket":false}],"purchases":[]},"onfootmicroresources":{"sales":[],"purchases":[]}},"commodities":[{"id":128682046,"name":"AdvancedMedicines","legality":"","buyPrice":75,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":558,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Advanced Medicines"},{"id":128049210,"name":"BasicMedicines","legality":"","buyPrice":2500,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5736,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Basic Medicines"},{"id":128066403,"categoryname":"NonMarketable","name":"Drones","stock":9999999,"buyPrice":101,"sellPrice":101,"demand":9999999,"legality":"","meanPrice":101,"demandBracket":2,"stockBracket":2,"locName":"Limpet"},{"id":128732183,"name":"AncientRelic","legality":"","buyPrice":24962,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5,"demand":0,"statusFlags":[],"categoryname":"Salvage","locName":"Guardian Relic"}]}

View File

@ -0,0 +1,3 @@
{ "timestamp":"2022-08-31T12:38:08Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
] }

View File

@ -0,0 +1 @@
{"id":3706433792,"name":"X3F-N5Z","outpostType":"fleetcarrier","imported":[],"exported":[],"services":{"commodities":"ok","carrierfuel":"ok","socialspace":"ok","refuel":"ok","repair":"ok","rearm":"ok","shipyard":"ok","outfitting":"ok","blackmarket":"ok","voucherredemption":"ok","exploration":"ok","bartender":"ok","vistagenomics":"unavailable","pioneersupplies":"unavailable","carriermanagement":"ok","stationmenu":"ok","dock":"ok","crewlounge":"ok","engineer":"ok","contacts":"ok","livery":"ok"},"economies":{"136":{"name":"Carrier","proportion":1}},"prohibited":{"128667728":"ImperialSlaves","128049243":"Slaves"},"orders":{"commodities":{"sales":[{"name":"gold","stock":"0","price":"47681","blackmarket":false},{"name":"silver","stock":"0","price":"37362","blackmarket":false},{"name":"cobalt","stock":"0","price":"17999","blackmarket":false},{"name":"performanceenhancers","stock":"0","price":"25600","blackmarket":false},{"name":"basicmedicines","stock":"5736","price":"2500","blackmarket":false},{"name":"advancedmedicines","stock":"558","price":"75","blackmarket":false},{"name":"survivalequipment","stock":"0","price":"2700","blackmarket":false},{"name":"ancientrelic","stock":"5","price":"24962","blackmarket":false},{"name":"agronomictreatment","stock":"0","price":"30000","blackmarket":false}],"purchases":[]},"onfootmicroresources":{"sales":[],"purchases":[{"name":"aerogel","locName":"Aerogel","total":1,"outstanding":1,"price":500},{"name":"accidentlogs","locName":"Accident Logs","total":2,"outstanding":2,"price":4000},{"name":"compactlibrary","locName":"Compact Library","total":3,"outstanding":3,"price":10000}]}},"commodities":[{"id":128682046,"name":"AdvancedMedicines","legality":"","buyPrice":75,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":558,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Advanced Medicines"},{"id":128049210,"name":"BasicMedicines","legality":"","buyPrice":2500,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5736,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Basic Medicines"},{"id":128066403,"categoryname":"NonMarketable","name":"Drones","stock":9999999,"buyPrice":101,"sellPrice":101,"demand":9999999,"legality":"","meanPrice":101,"demandBracket":2,"stockBracket":2,"locName":"Limpet"},{"id":128732183,"name":"AncientRelic","legality":"","buyPrice":24962,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5,"demand":0,"statusFlags":[],"categoryname":"Salvage","locName":"Guardian Relic"}]}

View File

@ -0,0 +1,5 @@
{ "timestamp":"2022-08-31T12:42:29Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
{ "id":128962598, "Name":"$compactlibrary_name;", "Name_Localised":"Compact Library", "Price":10000, "Stock":0, "Demand":3 },
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":1 },
{ "id":128972282, "Name":"$accidentlogs_name;", "Name_Localised":"Accident Logs", "Price":4000, "Stock":0, "Demand":2 }
] }

View File

@ -0,0 +1 @@
{"id":3706433792,"name":"X3F-N5Z","outpostType":"fleetcarrier","imported":[],"exported":[],"services":{"commodities":"ok","carrierfuel":"ok","socialspace":"ok","refuel":"ok","repair":"ok","rearm":"ok","shipyard":"ok","outfitting":"ok","blackmarket":"ok","voucherredemption":"ok","exploration":"ok","bartender":"ok","vistagenomics":"unavailable","pioneersupplies":"unavailable","carriermanagement":"ok","stationmenu":"ok","dock":"ok","crewlounge":"ok","engineer":"ok","contacts":"ok","livery":"ok"},"economies":{"136":{"name":"Carrier","proportion":1}},"prohibited":{"128667728":"ImperialSlaves","128049243":"Slaves"},"orders":{"commodities":{"sales":[{"name":"gold","stock":"0","price":"47681","blackmarket":false},{"name":"silver","stock":"0","price":"37362","blackmarket":false},{"name":"cobalt","stock":"0","price":"17999","blackmarket":false},{"name":"performanceenhancers","stock":"0","price":"25600","blackmarket":false},{"name":"basicmedicines","stock":"5736","price":"2500","blackmarket":false},{"name":"advancedmedicines","stock":"558","price":"75","blackmarket":false},{"name":"survivalequipment","stock":"0","price":"2700","blackmarket":false},{"name":"ancientrelic","stock":"5","price":"24962","blackmarket":false},{"name":"agronomictreatment","stock":"0","price":"30000","blackmarket":false}],"purchases":[]},"onfootmicroresources":{"sales":[],"purchases":[{"name":"aerogel","locName":"Aerogel","total":4,"outstanding":4,"price":500}]}},"commodities":[{"id":128682046,"name":"AdvancedMedicines","legality":"","buyPrice":75,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":558,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Advanced Medicines"},{"id":128049210,"name":"BasicMedicines","legality":"","buyPrice":2500,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5736,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Basic Medicines"},{"id":128066403,"categoryname":"NonMarketable","name":"Drones","stock":9999999,"buyPrice":101,"sellPrice":101,"demand":9999999,"legality":"","meanPrice":101,"demandBracket":2,"stockBracket":2,"locName":"Limpet"},{"id":128732183,"name":"AncientRelic","legality":"","buyPrice":24962,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5,"demand":0,"statusFlags":[],"categoryname":"Salvage","locName":"Guardian Relic"}]}

View File

@ -0,0 +1,3 @@
{ "timestamp":"2022-08-31T12:49:42Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":4 }
] }

View File

@ -0,0 +1 @@
{"id":3706433792,"name":"X3F-N5Z","outpostType":"fleetcarrier","imported":[],"exported":[],"services":{"commodities":"ok","carrierfuel":"ok","socialspace":"ok","refuel":"ok","repair":"ok","rearm":"ok","shipyard":"ok","outfitting":"ok","blackmarket":"ok","voucherredemption":"ok","exploration":"ok","bartender":"ok","vistagenomics":"unavailable","pioneersupplies":"unavailable","carriermanagement":"ok","stationmenu":"ok","dock":"ok","crewlounge":"ok","engineer":"ok","contacts":"ok","livery":"ok"},"economies":{"136":{"name":"Carrier","proportion":1}},"prohibited":{"128667728":"ImperialSlaves","128049243":"Slaves"},"orders":{"commodities":{"sales":[{"name":"gold","stock":"0","price":"47681","blackmarket":false},{"name":"silver","stock":"0","price":"37362","blackmarket":false},{"name":"cobalt","stock":"0","price":"17999","blackmarket":false},{"name":"performanceenhancers","stock":"0","price":"25600","blackmarket":false},{"name":"basicmedicines","stock":"5736","price":"2500","blackmarket":false},{"name":"advancedmedicines","stock":"558","price":"75","blackmarket":false},{"name":"survivalequipment","stock":"0","price":"2700","blackmarket":false},{"name":"ancientrelic","stock":"5","price":"24962","blackmarket":false},{"name":"agronomictreatment","stock":"0","price":"30000","blackmarket":false}],"purchases":[]},"onfootmicroresources":{"sales":[],"purchases":[]}},"commodities":[{"id":128682046,"name":"AdvancedMedicines","legality":"","buyPrice":75,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":558,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Advanced Medicines"},{"id":128049210,"name":"BasicMedicines","legality":"","buyPrice":2500,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5736,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Basic Medicines"},{"id":128066403,"categoryname":"NonMarketable","name":"Drones","stock":9999999,"buyPrice":101,"sellPrice":101,"demand":9999999,"legality":"","meanPrice":101,"demandBracket":2,"stockBracket":2,"locName":"Limpet"},{"id":128732183,"name":"AncientRelic","legality":"","buyPrice":24962,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5,"demand":0,"statusFlags":[],"categoryname":"Salvage","locName":"Guardian Relic"}]}

View File

@ -0,0 +1,3 @@
{ "timestamp":"2022-08-31T12:50:16Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":0 }
] }

View File

@ -0,0 +1 @@
{"id":3706433792,"name":"X3F-N5Z","outpostType":"fleetcarrier","imported":[],"exported":[],"services":{"commodities":"ok","carrierfuel":"ok","socialspace":"ok","refuel":"ok","repair":"ok","rearm":"ok","shipyard":"ok","outfitting":"ok","blackmarket":"ok","voucherredemption":"ok","exploration":"ok","bartender":"ok","vistagenomics":"unavailable","pioneersupplies":"unavailable","carriermanagement":"ok","stationmenu":"ok","dock":"ok","crewlounge":"ok","engineer":"ok","contacts":"ok","livery":"ok"},"economies":{"136":{"name":"Carrier","proportion":1}},"prohibited":{"128667728":"ImperialSlaves","128049243":"Slaves"},"orders":{"commodities":{"sales":[{"name":"gold","stock":"0","price":"47681","blackmarket":false},{"name":"silver","stock":"0","price":"37362","blackmarket":false},{"name":"cobalt","stock":"0","price":"17999","blackmarket":false},{"name":"performanceenhancers","stock":"0","price":"25600","blackmarket":false},{"name":"basicmedicines","stock":"5736","price":"2500","blackmarket":false},{"name":"advancedmedicines","stock":"558","price":"75","blackmarket":false},{"name":"survivalequipment","stock":"0","price":"2700","blackmarket":false},{"name":"ancientrelic","stock":"5","price":"24962","blackmarket":false},{"name":"agronomictreatment","stock":"0","price":"30000","blackmarket":false}],"purchases":[]},"onfootmicroresources":{"sales":{"128961524":{"id":128961524,"name":"aerogel","locName":"Aerogel","price":500,"stock":0}},"purchases":[]}},"commodities":[{"id":128682046,"name":"AdvancedMedicines","legality":"","buyPrice":75,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":558,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Advanced Medicines"},{"id":128049210,"name":"BasicMedicines","legality":"","buyPrice":2500,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5736,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Basic Medicines"},{"id":128066403,"categoryname":"NonMarketable","name":"Drones","stock":9999999,"buyPrice":101,"sellPrice":101,"demand":9999999,"legality":"","meanPrice":101,"demandBracket":2,"stockBracket":2,"locName":"Limpet"},{"id":128732183,"name":"AncientRelic","legality":"","buyPrice":24962,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5,"demand":0,"statusFlags":[],"categoryname":"Salvage","locName":"Guardian Relic"}]}

View File

@ -0,0 +1 @@
{"id":3706433792,"name":"X3F-N5Z","outpostType":"fleetcarrier","imported":[],"exported":[],"services":{"commodities":"ok","carrierfuel":"ok","socialspace":"ok","refuel":"ok","repair":"ok","rearm":"ok","shipyard":"ok","outfitting":"ok","blackmarket":"ok","voucherredemption":"ok","exploration":"ok","bartender":"ok","vistagenomics":"unavailable","pioneersupplies":"unavailable","carriermanagement":"ok","stationmenu":"ok","dock":"ok","crewlounge":"ok","engineer":"ok","contacts":"ok","livery":"ok"},"economies":{"136":{"name":"Carrier","proportion":1}},"prohibited":{"128667728":"ImperialSlaves","128049243":"Slaves"},"orders":{"commodities":{"sales":[{"name":"gold","stock":"0","price":"47681","blackmarket":false},{"name":"silver","stock":"0","price":"37362","blackmarket":false},{"name":"cobalt","stock":"0","price":"17999","blackmarket":false},{"name":"performanceenhancers","stock":"0","price":"25600","blackmarket":false},{"name":"basicmedicines","stock":"5736","price":"2500","blackmarket":false},{"name":"advancedmedicines","stock":"558","price":"75","blackmarket":false},{"name":"survivalequipment","stock":"0","price":"2700","blackmarket":false},{"name":"ancientrelic","stock":"5","price":"24962","blackmarket":false},{"name":"agronomictreatment","stock":"0","price":"30000","blackmarket":false}],"purchases":[]},"onfootmicroresources":{"sales":{"128961524":{"id":128961524,"name":"aerogel","locName":"Aerogel","price":500,"stock":5}},"purchases":[]}},"commodities":[{"id":128682046,"name":"AdvancedMedicines","legality":"","buyPrice":75,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":558,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Advanced Medicines"},{"id":128049210,"name":"BasicMedicines","legality":"","buyPrice":2500,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5736,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Basic Medicines"},{"id":128066403,"categoryname":"NonMarketable","name":"Drones","stock":9999999,"buyPrice":101,"sellPrice":101,"demand":9999999,"legality":"","meanPrice":101,"demandBracket":2,"stockBracket":2,"locName":"Limpet"},{"id":128732183,"name":"AncientRelic","legality":"","buyPrice":24962,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5,"demand":0,"statusFlags":[],"categoryname":"Salvage","locName":"Guardian Relic"}]}

View File

@ -0,0 +1,3 @@
{ "timestamp":"2022-08-31T12:56:46Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":0 }
] }

View File

@ -0,0 +1,3 @@
{ "timestamp":"2022-08-31T12:55:59Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":5, "Demand":0 }
] }

View File

@ -0,0 +1 @@
{"id":3706433792,"name":"X3F-N5Z","outpostType":"fleetcarrier","imported":[],"exported":[],"services":{"commodities":"ok","carrierfuel":"ok","socialspace":"ok","refuel":"ok","repair":"ok","rearm":"ok","shipyard":"ok","outfitting":"ok","blackmarket":"ok","voucherredemption":"ok","exploration":"ok","bartender":"ok","vistagenomics":"unavailable","pioneersupplies":"unavailable","carriermanagement":"ok","stationmenu":"ok","dock":"ok","crewlounge":"ok","engineer":"ok","contacts":"ok","livery":"ok"},"economies":{"136":{"name":"Carrier","proportion":1}},"prohibited":{"128667728":"ImperialSlaves","128049243":"Slaves"},"orders":{"commodities":{"sales":[{"name":"gold","stock":"0","price":"47681","blackmarket":false},{"name":"silver","stock":"0","price":"37362","blackmarket":false},{"name":"cobalt","stock":"0","price":"17999","blackmarket":false},{"name":"performanceenhancers","stock":"0","price":"25600","blackmarket":false},{"name":"basicmedicines","stock":"5736","price":"2500","blackmarket":false},{"name":"advancedmedicines","stock":"558","price":"75","blackmarket":false},{"name":"survivalequipment","stock":"0","price":"2700","blackmarket":false},{"name":"ancientrelic","stock":"5","price":"24962","blackmarket":false},{"name":"agronomictreatment","stock":"0","price":"30000","blackmarket":false}],"purchases":[]},"onfootmicroresources":{"sales":{"128961524":{"id":128961524,"name":"aerogel","locName":"Aerogel","price":500,"stock":0},"128972282":{"id":128972282,"name":"accidentlogs","locName":"Accident Logs","price":4000,"stock":4},"128962598":{"id":128962598,"name":"compactlibrary","locName":"Compact Library","price":10000,"stock":9}},"purchases":[]}},"commodities":[{"id":128682046,"name":"AdvancedMedicines","legality":"","buyPrice":75,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":558,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Advanced Medicines"},{"id":128049210,"name":"BasicMedicines","legality":"","buyPrice":2500,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5736,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Basic Medicines"},{"id":128066403,"categoryname":"NonMarketable","name":"Drones","stock":9999999,"buyPrice":101,"sellPrice":101,"demand":9999999,"legality":"","meanPrice":101,"demandBracket":2,"stockBracket":2,"locName":"Limpet"},{"id":128732183,"name":"AncientRelic","legality":"","buyPrice":24962,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5,"demand":0,"statusFlags":[],"categoryname":"Salvage","locName":"Guardian Relic"}]}

View File

@ -0,0 +1,5 @@
{ "timestamp":"2022-08-31T12:58:56Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
{ "id":128962598, "Name":"$compactlibrary_name;", "Name_Localised":"Compact Library", "Price":10000, "Stock":0, "Demand":0 },
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":0 },
{ "id":128972282, "Name":"$accidentlogs_name;", "Name_Localised":"Accident Logs", "Price":4000, "Stock":0, "Demand":0 }
] }

View File

@ -0,0 +1,5 @@
{ "timestamp":"2022-08-31T12:58:17Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
{ "id":128962598, "Name":"$compactlibrary_name;", "Name_Localised":"Compact Library", "Price":10000, "Stock":9, "Demand":0 },
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":0 },
{ "id":128972282, "Name":"$accidentlogs_name;", "Name_Localised":"Accident Logs", "Price":4000, "Stock":4, "Demand":0 }
] }

View File

@ -0,0 +1 @@
{"id":3706433792,"name":"X3F-N5Z","outpostType":"fleetcarrier","imported":[],"exported":[],"services":{"commodities":"ok","carrierfuel":"ok","socialspace":"ok","refuel":"ok","repair":"ok","rearm":"ok","shipyard":"ok","outfitting":"ok","blackmarket":"ok","voucherredemption":"ok","exploration":"ok","bartender":"ok","vistagenomics":"unavailable","pioneersupplies":"unavailable","carriermanagement":"ok","stationmenu":"ok","dock":"ok","crewlounge":"ok","engineer":"ok","contacts":"ok","livery":"ok"},"economies":{"136":{"name":"Carrier","proportion":1}},"prohibited":{"128667728":"ImperialSlaves","128049243":"Slaves"},"orders":{"commodities":{"sales":[{"name":"gold","stock":"0","price":"47681","blackmarket":false},{"name":"silver","stock":"0","price":"37362","blackmarket":false},{"name":"cobalt","stock":"0","price":"17999","blackmarket":false},{"name":"performanceenhancers","stock":"0","price":"25600","blackmarket":false},{"name":"basicmedicines","stock":"5736","price":"2500","blackmarket":false},{"name":"advancedmedicines","stock":"558","price":"75","blackmarket":false},{"name":"survivalequipment","stock":"0","price":"2700","blackmarket":false},{"name":"ancientrelic","stock":"5","price":"24962","blackmarket":false},{"name":"agronomictreatment","stock":"0","price":"30000","blackmarket":false}],"purchases":[]},"onfootmicroresources":{"sales":{"128961524":{"id":128961524,"name":"aerogel","locName":"Aerogel","price":500,"stock":0},"128972282":{"id":128972282,"name":"accidentlogs","locName":"Accident Logs","price":4000,"stock":0},"128962598":{"id":128962598,"name":"compactlibrary","locName":"Compact Library","price":10000,"stock":0}},"purchases":[]}},"commodities":[{"id":128682046,"name":"AdvancedMedicines","legality":"","buyPrice":75,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":558,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Advanced Medicines"},{"id":128049210,"name":"BasicMedicines","legality":"","buyPrice":2500,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5736,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Basic Medicines"},{"id":128066403,"categoryname":"NonMarketable","name":"Drones","stock":9999999,"buyPrice":101,"sellPrice":101,"demand":9999999,"legality":"","meanPrice":101,"demandBracket":2,"stockBracket":2,"locName":"Limpet"},{"id":128732183,"name":"AncientRelic","legality":"","buyPrice":24962,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5,"demand":0,"statusFlags":[],"categoryname":"Salvage","locName":"Guardian Relic"}]}

View File

@ -0,0 +1,5 @@
{ "timestamp":"2022-08-30T15:58:47Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
{ "id":128962598, "Name":"$compactlibrary_name;", "Name_Localised":"Compact Library", "Price":10000, "Stock":0, "Demand":0 },
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":0 },
{ "id":128972282, "Name":"$accidentlogs_name;", "Name_Localised":"Accident Logs", "Price":4010, "Stock":0, "Demand":0 }
] }

View File

@ -0,0 +1,5 @@
{ "timestamp":"2022-08-30T15:55:25Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
{ "id":128962598, "Name":"$compactlibrary_name;", "Name_Localised":"Compact Library", "Price":10000, "Stock":0, "Demand":1 },
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":1 },
{ "id":128972282, "Name":"$accidentlogs_name;", "Name_Localised":"Accident Logs", "Price":4000, "Stock":0, "Demand":1 }
] }

View File

@ -0,0 +1,5 @@
{ "timestamp":"2022-08-30T15:58:30Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
{ "id":128962598, "Name":"$compactlibrary_name;", "Name_Localised":"Compact Library", "Price":10000, "Stock":1, "Demand":0 },
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":1, "Demand":0 },
{ "id":128972282, "Name":"$accidentlogs_name;", "Name_Localised":"Accident Logs", "Price":4010, "Stock":1, "Demand":0 }
] }

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/fcmaterials_journal/1", "header": {"gatewayTimestamp": "2022-11-14T00:09:18.497867Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "uploaderID": "967cb0e8bd3f177a54d320cdf7193bf7e39e158e"}, "message": {"CarrierID": "V9X-01W", "CarrierName": "The Netherlands", "Items": [{"Demand": 8, "Name": "$multimediaentertainment_name;", "Price": 3000, "Stock": 0, "id": 128972337}, {"Demand": 25, "Name": "$weaponschematic_name;", "Price": 35000, "Stock": 0, "id": 128962614}, {"Demand": 25, "Name": "$suitschematic_name;", "Price": 50000, "Stock": 0, "id": 128962609}, {"Demand": 5, "Name": "$financialprojections_name;", "Price": 6000, "Stock": 0, "id": 128972317}, {"Demand": 20, "Name": "$manufacturinginstructions_name;", "Price": 9000, "Stock": 0, "id": 128972331}, {"Demand": 37, "Name": "$ionisedgas_name;", "Price": 35000, "Stock": 0, "id": 128961570}, {"Demand": 8, "Name": "$classicentertainment_name;", "Price": 7000, "Stock": 0, "id": 128972298}, {"Demand": 8, "Name": "$catmedia_name;", "Price": 1000, "Stock": 0, "id": 128972291}, {"Demand": 8, "Name": "$settlementdefenceplans_name;", "Price": 220000, "Stock": 0, "id": 128972364}], "MarketID": 3705423872, "event": "FCMaterials", "horizons": true, "odyssey": true, "timestamp": "2022-11-14T00:09:17Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/fcmaterials_journal/1", "header": {"gatewayTimestamp": "2022-11-14T00:09:18.497867Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "gameversion": "4.0.0.1450", "gamebuild":"r286858/r0 ", "uploaderID": "967cb0e8bd3f177a54d320cdf7193bf7e39e158e"}, "message": {"CarrierID": "V9X-01W", "CarrierName": "The Netherlands", "Items": [{"Demand": 8, "Name": "$multimediaentertainment_name;", "Price": 3000, "Stock": 0, "id": 128972337}, {"Demand": 25, "Name": "$weaponschematic_name;", "Price": 35000, "Stock": 0, "id": 128962614}, {"Demand": 25, "Name": "$suitschematic_name;", "Price": 50000, "Stock": 0, "id": 128962609}, {"Demand": 5, "Name": "$financialprojections_name;", "Price": 6000, "Stock": 0, "id": 128972317}, {"Demand": 20, "Name": "$manufacturinginstructions_name;", "Price": 9000, "Stock": 0, "id": 128972331}, {"Demand": 37, "Name": "$ionisedgas_name;", "Price": 35000, "Stock": 0, "id": 128961570}, {"Demand": 8, "Name": "$classicentertainment_name;", "Price": 7000, "Stock": 0, "id": 128972298}, {"Demand": 8, "Name": "$catmedia_name;", "Price": 1000, "Stock": 0, "id": 128972291}, {"Demand": 8, "Name": "$settlementdefenceplans_name;", "Price": 220000, "Stock": 0, "id": 128972364}], "MarketID": 3705423872, "event": "FCMaterials", "horizons": true, "odyssey": true, "timestamp": "2022-11-14T00:09:17Z"}}

View File

@ -0,0 +1,3 @@
{ "timestamp":"2022-09-02T15:46:05Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
] }

View File

@ -0,0 +1,3 @@
{ "timestamp":"2022-09-02T15:53:44Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":1 }
] }

View File

@ -0,0 +1,4 @@
{ "timestamp":"2022-09-02T15:55:39Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":1 },
{ "id":128972282, "Name":"$accidentlogs_name;", "Name_Localised":"Accident Logs", "Price":4000, "Stock":0, "Demand":1 }
] }

View File

@ -0,0 +1,3 @@
{ "timestamp":"2022-09-02T15:58:27Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":1, "Demand":0 }
] }

View File

@ -0,0 +1,4 @@
{ "timestamp":"2022-09-02T15:59:55Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":1, "Demand":0 },
{ "id":128972282, "Name":"$accidentlogs_name;", "Name_Localised":"Accident Logs", "Price":4000, "Stock":2, "Demand":0 }
] }

View File

@ -0,0 +1,4 @@
{ "timestamp":"2022-09-02T16:01:38Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":0 },
{ "id":128972282, "Name":"$accidentlogs_name;", "Name_Localised":"Accident Logs", "Price":4000, "Stock":0, "Demand":0 }
] }

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/fssallbodiesfound/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:04.086878Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "uploaderID": "14784f6dee3f3814d4b870ae32c67fbc1fb59ce8"}, "message": {"Count": 15, "StarPos": [-2005.78125, -110.3125, 45397.625], "SystemAddress": 2842865396889, "SystemName": "Fache OS-D b18-1", "event": "FSSAllBodiesFound", "horizons": true, "odyssey": true, "timestamp": "2022-11-14T00:00:00Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/fssallbodiesfound/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:04.086878Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "gameversion": "4.0.0.1450", "gamebuild":"r286858/r0 ", "uploaderID": "14784f6dee3f3814d4b870ae32c67fbc1fb59ce8"}, "message": {"Count": 15, "StarPos": [-2005.78125, -110.3125, 45397.625], "SystemAddress": 2842865396889, "SystemName": "Fache OS-D b18-1", "event": "FSSAllBodiesFound", "horizons": true, "odyssey": true, "timestamp": "2022-11-14T00:00:00Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/fssbodysignals/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:12.793441Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "uploaderID": "4dcba12d5f73d79e314310ba4ee2d1c2d2fbe81d"}, "message": {"BodyID": 33, "BodyName": "Myrielk RT-Q c18-4253 A 3 b", "Signals": [{"Count": 2, "Type": "$SAA_SignalType_Geological;"}], "StarPos": [536.65625, 0.59375, 25339.34375], "StarSystem": "Myrielk RT-Q c18-4253", "SystemAddress": 1169140530292386, "event": "FSSBodySignals", "horizons": true, "odyssey": false, "timestamp": "2022-11-14T00:00:12Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/fssbodysignals/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:12.793441Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "gameversion": "4.0.0.1450", "gamebuild":"r286858/r0 ", "uploaderID": "4dcba12d5f73d79e314310ba4ee2d1c2d2fbe81d"}, "message": {"BodyID": 33, "BodyName": "Myrielk RT-Q c18-4253 A 3 b", "Signals": [{"Count": 2, "Type": "$SAA_SignalType_Geological;"}], "StarPos": [536.65625, 0.59375, 25339.34375], "StarSystem": "Myrielk RT-Q c18-4253", "SystemAddress": 1169140530292386, "event": "FSSBodySignals", "horizons": true, "odyssey": false, "timestamp": "2022-11-14T00:00:12Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/fssdiscoveryscan/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:06.048612Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "uploaderID": "e2ac8d9a2a2e81b3362c9fe53bc61d78b3f1faa8"}, "message": {"BodyCount": 25, "NonBodyCount": 8, "StarPos": [4.9375, -142.34375, 34.8125], "SystemAddress": 670954038705, "SystemName": "ICZ GM-V b2-0", "event": "FSSDiscoveryScan", "horizons": true, "odyssey": true, "timestamp": "2022-11-14T00:00:04Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/fssdiscoveryscan/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:06.048612Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "gameversion": "4.0.0.1450", "gamebuild":"r286858/r0 ", "uploaderID": "e2ac8d9a2a2e81b3362c9fe53bc61d78b3f1faa8"}, "message": {"BodyCount": 25, "NonBodyCount": 8, "StarPos": [4.9375, -142.34375, 34.8125], "SystemAddress": 670954038705, "SystemName": "ICZ GM-V b2-0", "event": "FSSDiscoveryScan", "horizons": true, "odyssey": true, "timestamp": "2022-11-14T00:00:04Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/fsssignaldiscovered/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:06.836870Z", "softwareName": "EDDiscovery", "softwareVersion": "15.1.4.0", "uploaderID": "d52d70ee07b0758d761af437b3c5451b81ab58fb"}, "message": {"StarPos": [-34.46875, 2.3125, 13.96875], "StarSystem": "G 125-30", "SystemAddress": 670417626537, "event": "FSSSignalDiscovered", "horizons": true, "odyssey": true, "signals": [{"SignalName": "LHS 3549 II Aquarius-class Tanker", "timestamp": "2022-11-14T00:00:03Z"}, {"SignalName": "$MULTIPLAYER_SCENARIO77_TITLE;", "timestamp": "2022-11-14T00:00:03Z"}], "timestamp": "2022-11-14T00:00:03Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/fsssignaldiscovered/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:06.836870Z", "softwareName": "EDDiscovery", "softwareVersion": "15.1.4.0", "gameversion": "4.0.0.1450", "gamebuild":"r286858/r0 ", "uploaderID": "d52d70ee07b0758d761af437b3c5451b81ab58fb"}, "message": {"StarPos": [-34.46875, 2.3125, 13.96875], "StarSystem": "G 125-30", "SystemAddress": 670417626537, "event": "FSSSignalDiscovered", "horizons": true, "odyssey": true, "signals": [{"SignalName": "LHS 3549 II Aquarius-class Tanker", "timestamp": "2022-11-14T00:00:03Z"}, {"SignalName": "$MULTIPLAYER_SCENARIO77_TITLE;", "timestamp": "2022-11-14T00:00:03Z"}], "timestamp": "2022-11-14T00:00:03Z"}}

View File

@ -0,0 +1,37 @@
{]
"$schemaRef": "https://eddn.edcd.io/schemas/journal/1",
"header": {
"uploaderID": "Athanasius Testing",
"softwareName": "Athanasius Testing",
"softwareVersion": "v0.0.1"
},
"message": {
"timestamp":"2021-11-05T15:46:28Z",
"event":"Scan",
"ScanType":"AutoScan",
"BodyName":"Elphin",
"BodyID":1,
"Parents":[ {"Null":0} ],
"StarSystem":"Elphin",
"StarPos":[-30.12500,8.18750,-17.00000],
"SystemAddress":3932076118738,
"DistanceFromArrivalLS":0.000000,
"StarType":"K",
"Subclass":3,
"StellarMass":0.769531,
"Radius":587464832.000000,
"AbsoluteMagnitude":6.294067,
"Age_MY":9558,
"SurfaceTemperature":4796.000000,
"Luminosity":"V",
"SemiMajorAxis":1704360246658.325195,
"Eccentricity":0.348740,
"OrbitalInclination":-72.647343,
"Periapsis":86.347190,
"OrbitalPeriod":7189218699.932098,
"AscendingNode":0.000000,
"MeanAnomaly":351.262353,
"RotationPeriod":248957.736717,
"AxialTilt":-0.126915
}
}

View File

@ -0,0 +1,46 @@
{
"$schemaRef": "http://schemas.elite-markets.net/eddn/commodity/2",
"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
}
]
},
"header": {
"uploaderID": "Athanasius Testing",
"softwareName": "Athanasius Testing",
"softwareVersion": "v0.0.1"
}
}

View File

@ -0,0 +1,36 @@
{
"$schemaRef": "https://eddn.edcd.io/schemas/journal/1",
"message": {
"timestamp":"2021-11-05T15:46:28Z",
"event":"Scan",
"ScanType":"AutoScan",
"BodyName":"Elphin",
"BodyID":1,
"Parents":[ {"Null":0} ],
"StarSystem":"Elphin",
"StarPos":[-30.12500,8.18750,-17.00000],
"SystemAddress":3932076118738,
"DistanceFromArrivalLS":0.000000,
"StarType":"K",
"Subclass":3,
"StellarMass":0.769531,
"Radius":587464832.000000,
"AbsoluteMagnitude":6.294067,
"Age_MY":9558,
"SurfaceTemperature":4796.000000,
"Luminosity":"V",
"SemiMajorAxis":1704360246658.325195,
"Eccentricity":0.348740,
"OrbitalInclination":-72.647343,
"Periapsis":86.347190,
"OrbitalPeriod":7189218699.932098,
"AscendingNode":0.000000,
"MeanAnomaly":351.262353,
"RotationPeriod":248957.736717,
"AxialTilt":-0.126915
},
"header": {
"uploaderID": "Athanasius Testing",
"softwareVersion": "v0.0.1"
}
}

View File

@ -0,0 +1,37 @@
{
"$schemaRef": "https://eddn.edcd.io/schemas/journal/1",
"message": {
"timestamp":"2021-11-05T15:46:28Z",
"event":"Scan",
"ScanType":"AutoScan",
"BodyName":"Elphin",
"BodyID":1,
"Parents":[ {"Null":0} ],
"StarSystem":"Elphin",
"StarPos":[-30.12500,8.18750,-17.00000],
"SystemAddress":3932076118738,
"DistanceFromArrivalLS":0.000000,
"StarType":"K",
"Subclass":3,
"StellarMass":0.769531,
"Radius":587464832.000000,
"AbsoluteMagnitude":6.294067,
"Age_MY":9558,
"SurfaceTemperature":4796.000000,
"Luminosity":"V",
"SemiMajorAxis":1704360246658.325195,
"Eccentricity":0.348740,
"OrbitalInclination":-72.647343,
"Periapsis":86.347190,
"OrbitalPeriod":7189218699.932098,
"AscendingNode":0.000000,
"MeanAnomaly":351.262353,
"RotationPeriod":248957.736717,
"AxialTilt":-0.126915
},
"header": {
"uploaderID": "from Athanasius Testing",
"softwareName": "Athanasius Testing script",
"softwareVersion": "v0.0.1"
}
}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/navbeaconscan/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:11.204310Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "uploaderID": "46d7e7dd4f9b2330f9925c61d180be4013684289"}, "message": {"NumBodies": 14, "StarPos": [26.71875, 14.25, 7.375], "StarSystem": "Guy", "SystemAddress": 3932210336466, "event": "NavBeaconScan", "horizons": true, "odyssey": true, "timestamp": "2022-11-14T00:00:09Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/navbeaconscan/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:11.204310Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "gameversion": "4.0.0.1450", "gamebuild":"r286858/r0 ", "uploaderID": "46d7e7dd4f9b2330f9925c61d180be4013684289"}, "message": {"NumBodies": 14, "StarPos": [26.71875, 14.25, 7.375], "StarSystem": "Guy", "SystemAddress": 3932210336466, "event": "NavBeaconScan", "horizons": true, "odyssey": true, "timestamp": "2022-11-14T00:00:09Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/navroute/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:05.212835Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "uploaderID": "7a8379485a2035decb777cfef946f561c41addba"}, "message": {"Route": [{"StarClass": "M", "StarPos": [39.125, 6.96875, 55.53125], "StarSystem": "Geawete", "SystemAddress": 13865630901697}, {"StarClass": "M", "StarPos": [25.90625, -1.46875, 57.625], "StarSystem": "LFT 1291", "SystemAddress": 5069269444033}, {"StarClass": "F", "StarPos": [21.03125, -12.5625, 65.5], "StarSystem": "Lambda Arae", "SystemAddress": 2072078453107}], "event": "NavRoute", "timestamp": "2022-11-14T00:00:04Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/navroute/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:05.212835Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "gameversion": "4.0.0.1450", "gamebuild":"r286858/r0 ", "uploaderID": "7a8379485a2035decb777cfef946f561c41addba"}, "message": {"Route": [{"StarClass": "M", "StarPos": [39.125, 6.96875, 55.53125], "StarSystem": "Geawete", "SystemAddress": 13865630901697}, {"StarClass": "M", "StarPos": [25.90625, -1.46875, 57.625], "StarSystem": "LFT 1291", "SystemAddress": 5069269444033}, {"StarClass": "F", "StarPos": [21.03125, -12.5625, 65.5], "StarSystem": "Lambda Arae", "SystemAddress": 2072078453107}], "event": "NavRoute", "timestamp": "2022-11-14T00:00:04Z"}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/scanbarycentre/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:11.029484Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "uploaderID": "facf698c3dd45e8dacddbe8a0112dbe2af144294"}, "message": {"AscendingNode": -65.247049, "BodyID": 1, "Eccentricity": 0.094186, "MeanAnomaly": 242.661726, "OrbitalInclination": -147.181462, "OrbitalPeriod": 369514530.897141, "Periapsis": 80.313507, "SemiMajorAxis": 178821635246.27686, "StarPos": [13534.6875, -2.8125, 53910.15625], "StarSystem": "Blia Chraei JD-Z c27-1", "SystemAddress": 381413244146, "event": "ScanBaryCentre", "horizons": true, "odyssey": true, "timestamp": "2022-11-14T00:00:09Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/scanbarycentre/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:11.029484Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "gameversion": "4.0.0.1450", "gamebuild":"r286858/r0 ", "uploaderID": "facf698c3dd45e8dacddbe8a0112dbe2af144294"}, "message": {"AscendingNode": -65.247049, "BodyID": 1, "Eccentricity": 0.094186, "MeanAnomaly": 242.661726, "OrbitalInclination": -147.181462, "OrbitalPeriod": 369514530.897141, "Periapsis": 80.313507, "SemiMajorAxis": 178821635246.27686, "StarPos": [13534.6875, -2.8125, 53910.15625], "StarSystem": "Blia Chraei JD-Z c27-1", "SystemAddress": 381413244146, "event": "ScanBaryCentre", "horizons": true, "odyssey": true, "timestamp": "2022-11-14T00:00:09Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/shipyard/2", "header": {"gatewayTimestamp": "2022-11-14T00:00:02.585430Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "uploaderID": "bcb5dfa1a606b752ed9f20efa7864146ed42f8a6"}, "message": {"horizons": true, "marketId": 3223340032, "odyssey": false, "ships": ["adder", "anaconda", "cobramkiii", "diamondback", "diamondbackxl", "eagle", "hauler", "krait_light", "krait_mkii", "sidewinder", "type6", "type7", "type9", "viper", "viper_mkiv"], "stationName": "Houssay Ring", "systemName": "Aasgananu", "timestamp": "2022-11-14T00:00:00Z"}}

View File

@ -0,0 +1 @@
{"$schemaRef": "https://eddn.edcd.io/schemas/shipyard/2", "header": {"gatewayTimestamp": "2022-11-14T00:00:02.585430Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "gameversion": "4.0.0.1450", "gamebuild":"r286858/r0 ", "uploaderID": "bcb5dfa1a606b752ed9f20efa7864146ed42f8a6"}, "message": {"horizons": true, "marketId": 3223340032, "odyssey": false, "ships": ["adder", "anaconda", "cobramkiii", "diamondback", "diamondbackxl", "eagle", "hauler", "krait_light", "krait_mkii", "sidewinder", "type6", "type7", "type9", "viper", "viper_mkiv"], "stationName": "Houssay Ring", "systemName": "Aasgananu", "timestamp": "2022-11-14T00:00:00Z"}}

Some files were not shown because too many files have changed in this diff Show More