mirror of
https://github.com/EDCD/EDDN.git
synced 2025-04-19 18:17:37 +03:00
Merge branch 'python3' of github.com:EDCD/EDDN into python3
This commit is contained in:
commit
896eada0b9
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
3
pytest.ini
Normal file
@ -0,0 +1,3 @@
|
||||
[pytest]
|
||||
norecursedirs = src
|
||||
testpaths = tests/
|
@ -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
4
src/.mypy.ini
Normal file
@ -0,0 +1,4 @@
|
||||
[mypy]
|
||||
follow_imports = skip
|
||||
ignore_missing_imports = True
|
||||
scripts_are_modules = True
|
@ -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
|
||||
|
||||
|
@ -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,
|
||||
)
|
||||
|
@ -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,
|
||||
)
|
||||
|
@ -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,
|
||||
)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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).**
|
||||
|
@ -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.
|
||||
|
@ -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).**
|
||||
|
49
src/eddn/schemas/fssbodysignals-README.md
Normal file
49
src/eddn/schemas/fssbodysignals-README.md
Normal 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 } ] }
|
||||
```
|
96
src/eddn/schemas/fssbodysignals-v1.0.json
Normal file
96
src/eddn/schemas/fssbodysignals-v1.0.json
Normal 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" ] } }
|
||||
}
|
||||
}
|
@ -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).**
|
||||
|
187
src/eddn/schemas/fsssignaldiscovered-README.md
Normal file
187
src/eddn/schemas/fsssignaldiscovered-README.md
Normal 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
|
||||
}
|
||||
}
|
||||
```
|
108
src/eddn/schemas/fsssignaldiscovered-v1.0.json
Normal file
108
src/eddn/schemas/fsssignaldiscovered-v1.0.json
Normal 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" ] } }
|
||||
}
|
||||
}
|
@ -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.
|
||||
|
@ -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).**
|
||||
|
@ -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).**
|
||||
|
4
src/tests/config/Gateway-settings-override.json
Normal file
4
src/tests/config/Gateway-settings-override.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"CERT_FILE": "",
|
||||
"KEY_FILE": ""
|
||||
}
|
49
src/tests/conftest.py
Normal file
49
src/tests/conftest.py
Normal 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()
|
@ -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"}}
|
@ -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"}}
|
@ -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"}}
|
@ -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
@ -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":[]}}
|
@ -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": []
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
@ -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": []
|
||||
}
|
||||
}
|
||||
}
|
@ -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": []
|
||||
}
|
||||
}
|
||||
}
|
@ -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": []
|
||||
}
|
||||
}
|
||||
}
|
@ -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": []
|
||||
}
|
||||
}
|
||||
}
|
@ -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
File diff suppressed because one or more lines are too long
@ -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"}]}
|
@ -0,0 +1,3 @@
|
||||
{ "timestamp":"2022-08-31T12:38:08Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
|
||||
|
||||
] }
|
File diff suppressed because one or more lines are too long
@ -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"}]}
|
@ -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 }
|
||||
] }
|
File diff suppressed because one or more lines are too long
@ -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"}]}
|
@ -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 }
|
||||
] }
|
File diff suppressed because one or more lines are too long
@ -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"}]}
|
@ -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 }
|
||||
] }
|
File diff suppressed because one or more lines are too long
@ -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"}]}
|
File diff suppressed because one or more lines are too long
@ -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"}]}
|
@ -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 }
|
||||
] }
|
@ -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 }
|
||||
] }
|
File diff suppressed because one or more lines are too long
@ -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"}]}
|
@ -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 }
|
||||
] }
|
@ -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 }
|
||||
] }
|
File diff suppressed because one or more lines are too long
@ -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"}]}
|
@ -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 }
|
||||
] }
|
@ -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 }
|
||||
] }
|
@ -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 }
|
||||
] }
|
@ -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"}}
|
@ -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"}}
|
@ -0,0 +1,3 @@
|
||||
{ "timestamp":"2022-09-02T15:46:05Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
|
||||
|
||||
] }
|
@ -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 }
|
||||
] }
|
@ -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 }
|
||||
] }
|
@ -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 }
|
||||
] }
|
@ -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 }
|
||||
] }
|
@ -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 }
|
||||
] }
|
@ -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"}}
|
@ -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"}}
|
@ -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"}}
|
@ -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"}}
|
@ -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"}}
|
@ -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"}}
|
@ -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"}}
|
@ -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"}}
|
37
src/tests/eddn_message/invalid/invalid-JSON.json
Normal file
37
src/tests/eddn_message/invalid/invalid-JSON.json
Normal 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
|
||||
}
|
||||
}
|
46
src/tests/eddn_message/invalid/invalid-outdated-schema.json
Normal file
46
src/tests/eddn_message/invalid/invalid-outdated-schema.json
Normal 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"
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
37
src/tests/eddn_message/journal/1/scan/valid.json
Normal file
37
src/tests/eddn_message/journal/1/scan/valid.json
Normal 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"
|
||||
}
|
||||
}
|
@ -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"}}
|
@ -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"}}
|
@ -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"}}
|
@ -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
@ -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"}}
|
@ -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"}}
|
@ -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"}}
|
@ -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
Loading…
x
Reference in New Issue
Block a user