mirror of
https://github.com/EDCD/EDDN.git
synced 2025-08-06 02:11:08 +03:00
Merge branch 'python3' of github.com:EDCD/EDDN into python3
This commit is contained in:
commit
896eada0b9
.pre-commit-config.yamlREADME.md
docs
pytest.iniscripts
src
.mypy.ini
eddn
Bouncer.pyGateway.pyMonitor.pyRelay.py
conf
schemas
README-EDDN-schemas.md
TEMPLATES
approachsettlement-README.mdcodexentry-README.mdfssallbodiesfound-README.mdfssbodysignals-README.mdfssbodysignals-v1.0.jsonfssdiscoveryscan-README.mdfsssignaldiscovered-README.mdfsssignaldiscovered-v1.0.jsonjournal-README.mdnavbeaconscan-README.mdscanbarycentre-README.mdtests
config
conftest.pyeddn_message
approachsettlement/1
codexentry/1
commodity/3
001_horizons-notodyssey_no-gameversion.json002_horizons-notodyssey_with-gameversion.jsonvalid-smallest-message.json
fcmaterials_capi/1
001_CAPI-fcmaterials-no-orders_market-2022-08-31_134000BST.json002_CAPI-fcmaterials-buy-orders_market-2022-08-31_134246BST.json003_CAPI-fcmaterials-buy-order-single_market-2022-08-31_135003BST.json004_CAPI-fcmaterials-buy-order-single-fulfilled_market-2022-08-31_135040BST.json005_CAPI-fcmaterials-sell-order-single_market-2022-08-31_135633BST.json006_CAPI-fcmaterials-sell-order-single-bought_market-2022-08-31_135725BST.json007_CAPI-fcmaterials-sell-order-single_market-2022-08-31_135836BST.json008_CAPI-fcmaterials-sell-order-single-just-bought_market-2022-08-31_135917BST.json100_CAPI-fcmaterials_odyssey_no-gameversion.json101_CAPI-fcmaterials_odyssey_with-gameversion.json
old-raw
001_CAPI-fcmaterials-no-orders_fleetcarrier-2022-08-31_134001BST.json001_CAPI-fcmaterials-no-orders_market-2022-08-31_134000BST.json001_journal-no-orders.json002_CAPI-fcmaterials-buy-orders_fleetcarrier-2022-08-31_134247BST.json002_CAPI-fcmaterials-buy-orders_market-2022-08-31_134246BST.json002_journal-buy-orders.json003_CAPI-fcmaterials-buy-order-single_fleetcarrier-2022-08-31_135005BST.json003_CAPI-fcmaterials-buy-order-single_market-2022-08-31_135003BST.json003_journal-buy-order-single.json004_CAPI-fcmaterials-buy-order-single-fulfilled_fleetcarrier-2022-08-31_135041BST.json004_CAPI-fcmaterials-buy-order-single-fulfilled_market-2022-08-31_135040BST.json004_journal-buy-order-single-fulfilled.json005_CAPI-fcmaterials-sell-order-single-bought_fleetcarrier-2022-08-31_135726BST.json005_CAPI-fcmaterials-sell-order-single-bought_market-2022-08-31_135725BST.json005_CAPI-fcmaterials-sell-order-single_fleetcarrier-2022-08-31_135635BST.json005_CAPI-fcmaterials-sell-order-single_market-2022-08-31_135633BST.json005_journal-sell-order-single-just-bought.json005_journal-sell-order-single.json006_CAPI-fcmaterials-sell-order-single_fleetcarrier-2022-08-31_135838BST.json006_CAPI-fcmaterials-sell-order-single_market-2022-08-31_135836BST.json006_journal-sell-order-two-just-bought.json006_journal-sell-order-two.json007_CAPI-fcmaterials-sell-order-single-just-bought_fleetcarrier-2022-08-31_135918BST.json007_CAPI-fcmaterials-sell-order-single-just-bought_market-2022-08-31_135917BST.json101_journal-no-longer-stock.json102_journal-one-demand-each-category.json103_journal-one-stock-each-category.json
fcmaterials_journal/1
001_horizons-odyssey_no-gameversion.json002_horizons-odyssey_with-gameversion.json
raw
010_journal-no-orders_2022-09-02T154605Z.json011_journal-demand-single-item_2022-09-02T155344Z.json012_journal-demand-two-items_2022-09-02T155539Z.json013_journal-supply-single-item_2022-09-02T155827Z.json014_journal-supply-two-items_2022-09-02T15955Z.json015_journal-supply-sold-but-still-listed_2022-09-02T160138Z.json
fssallbodiesfound/1
fssbodysignals/1
fssdiscoveryscan/1
fsssignaldiscovered/1
invalid
journal/1/scan
navbeaconscan/1
navroute/1
outfitting/2
scanbarycentre/1
shipyard/2
@ -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,67 +62,25 @@ def process_file(input_file: str) -> None:
|
||||
# print(matches.group('sender_ip'))
|
||||
# print('')
|
||||
|
||||
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:
|
||||
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:
|
||||
if software_version >= semantic_version.Version.coerce('2.2.0'):
|
||||
print(line)
|
||||
|
||||
elif matches.group('software_name') == 'EDDI':
|
||||
@ -132,43 +90,21 @@ 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:
|
||||
@ -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,29 +161,7 @@ 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()
|
||||
|
||||
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()
|
1
src/tests/eddn_message/approachsettlement/1/001_horizons-notodyssey_no-gameversion.json
Normal file
1
src/tests/eddn_message/approachsettlement/1/001_horizons-notodyssey_no-gameversion.json
Normal file
@ -0,0 +1 @@
|
||||
{"$schemaRef": "https://eddn.edcd.io/schemas/approachsettlement/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:04.300179Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "uploaderID": "405b0315cefe9bd0634dccb6fe3918b7a75c7e4f"}, "message": {"BodyID": 19, "BodyName": "HIP 98621 B 2", "Latitude": 62.727066, "Longitude": -18.212152, "MarketID": 3521656064, "Name": "Rucker's Progress", "StarPos": [57.6875, -65.03125, 86.9375], "StarSystem": "HIP 98621", "SystemAddress": 869487593843, "event": "ApproachSettlement", "horizons": true, "odyssey": false, "timestamp": "2022-11-14T00:00:03Z"}}
|
1
src/tests/eddn_message/approachsettlement/1/002_horizons-notodyssey_with-gameversion.json
Normal file
1
src/tests/eddn_message/approachsettlement/1/002_horizons-notodyssey_with-gameversion.json
Normal file
@ -0,0 +1 @@
|
||||
{"$schemaRef": "https://eddn.edcd.io/schemas/approachsettlement/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:04.300179Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "gameversion": "4.0.0.1450", "gamebuild":"r286858/r0 ", "uploaderID": "405b0315cefe9bd0634dccb6fe3918b7a75c7e4f"}, "message": {"BodyID": 19, "BodyName": "HIP 98621 B 2", "Latitude": 62.727066, "Longitude": -18.212152, "MarketID": 3521656064, "Name": "Rucker's Progress", "StarPos": [57.6875, -65.03125, 86.9375], "StarSystem": "HIP 98621", "SystemAddress": 869487593843, "event": "ApproachSettlement", "horizons": true, "odyssey": false, "timestamp": "2022-11-14T00:00:03Z"}}
|
@ -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":[]}}
|
20
src/tests/eddn_message/fcmaterials_capi/1/001_CAPI-fcmaterials-no-orders_market-2022-08-31_134000BST.json
Normal file
20
src/tests/eddn_message/fcmaterials_capi/1/001_CAPI-fcmaterials-no-orders_market-2022-08-31_134000BST.json
Normal file
@ -0,0 +1,20 @@
|
||||
{
|
||||
"$schemaRef":"https://eddn.edcd.io/schemas/fcmaterials_capi/1",
|
||||
"header": {
|
||||
"uploaderID": "Athanasius Testing",
|
||||
"softwareName": "Ath Testing",
|
||||
"softwareVersion": "v0.0.1"
|
||||
},
|
||||
"message": {
|
||||
"timestamp": "2022-08-31T12:40:00Z",
|
||||
"event": "FCMaterials",
|
||||
"horizons": true,
|
||||
"odyssey": true,
|
||||
"MarketID": 3706433792,
|
||||
"CarrierID": "X3F-5NZ",
|
||||
"Items": {
|
||||
"sales": [],
|
||||
"purchases": []
|
||||
}
|
||||
}
|
||||
}
|
39
src/tests/eddn_message/fcmaterials_capi/1/002_CAPI-fcmaterials-buy-orders_market-2022-08-31_134246BST.json
Normal file
39
src/tests/eddn_message/fcmaterials_capi/1/002_CAPI-fcmaterials-buy-orders_market-2022-08-31_134246BST.json
Normal file
@ -0,0 +1,39 @@
|
||||
{
|
||||
"$schemaRef":"https://eddn.edcd.io/schemas/fcmaterials_capi/1",
|
||||
"header": {
|
||||
"uploaderID": "Athanasius Testing",
|
||||
"softwareName": "Ath Testing",
|
||||
"softwareVersion": "v0.0.1"
|
||||
},
|
||||
"message": {
|
||||
"timestamp": "2022-08-31T12:42:46Z",
|
||||
"event": "FCMaterials",
|
||||
"horizons": true,
|
||||
"odyssey": true,
|
||||
"MarketID": 3706433792,
|
||||
"CarrierID": "X3F-5NZ",
|
||||
"Items": {
|
||||
"sales": [],
|
||||
"purchases": [
|
||||
{
|
||||
"name": "aerogel",
|
||||
"total": 1,
|
||||
"outstanding": 1,
|
||||
"price": 500
|
||||
},
|
||||
{
|
||||
"name": "accidentlogs",
|
||||
"total": 2,
|
||||
"outstanding": 2,
|
||||
"price": 4000
|
||||
},
|
||||
{
|
||||
"name": "compactlibrary",
|
||||
"total": 3,
|
||||
"outstanding": 3,
|
||||
"price": 10000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
27
src/tests/eddn_message/fcmaterials_capi/1/003_CAPI-fcmaterials-buy-order-single_market-2022-08-31_135003BST.json
Normal file
27
src/tests/eddn_message/fcmaterials_capi/1/003_CAPI-fcmaterials-buy-order-single_market-2022-08-31_135003BST.json
Normal file
@ -0,0 +1,27 @@
|
||||
{
|
||||
"$schemaRef":"https://eddn.edcd.io/schemas/fcmaterials_capi/1",
|
||||
"header": {
|
||||
"uploaderID": "Athanasius Testing",
|
||||
"softwareName": "Ath Testing",
|
||||
"softwareVersion": "v0.0.1"
|
||||
},
|
||||
"message": {
|
||||
"timestamp": "2022-08-31T12:50:03Z",
|
||||
"event": "FCMaterials",
|
||||
"horizons": true,
|
||||
"odyssey": true,
|
||||
"MarketID": 3706433792,
|
||||
"CarrierID": "X3F-5NZ",
|
||||
"Items": {
|
||||
"sales": [],
|
||||
"purchases": [
|
||||
{
|
||||
"name": "aerogel",
|
||||
"total": 4,
|
||||
"outstanding": 4,
|
||||
"price": 500
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
20
src/tests/eddn_message/fcmaterials_capi/1/004_CAPI-fcmaterials-buy-order-single-fulfilled_market-2022-08-31_135040BST.json
Normal file
20
src/tests/eddn_message/fcmaterials_capi/1/004_CAPI-fcmaterials-buy-order-single-fulfilled_market-2022-08-31_135040BST.json
Normal file
@ -0,0 +1,20 @@
|
||||
{
|
||||
"$schemaRef":"https://eddn.edcd.io/schemas/fcmaterials_capi/1",
|
||||
"header": {
|
||||
"uploaderID": "Athanasius Testing",
|
||||
"softwareName": "Ath Testing",
|
||||
"softwareVersion": "v0.0.1"
|
||||
},
|
||||
"message": {
|
||||
"timestamp": "2022-08-31T12:50:40Z",
|
||||
"event": "FCMaterials",
|
||||
"horizons": true,
|
||||
"odyssey": true,
|
||||
"MarketID": 3706433792,
|
||||
"CarrierID": "X3F-5NZ",
|
||||
"Items": {
|
||||
"sales": [],
|
||||
"purchases": []
|
||||
}
|
||||
}
|
||||
}
|
27
src/tests/eddn_message/fcmaterials_capi/1/005_CAPI-fcmaterials-sell-order-single_market-2022-08-31_135633BST.json
Normal file
27
src/tests/eddn_message/fcmaterials_capi/1/005_CAPI-fcmaterials-sell-order-single_market-2022-08-31_135633BST.json
Normal file
@ -0,0 +1,27 @@
|
||||
{
|
||||
"$schemaRef":"https://eddn.edcd.io/schemas/fcmaterials_capi/1",
|
||||
"header": {
|
||||
"uploaderID": "Athanasius Testing",
|
||||
"softwareName": "Ath Testing",
|
||||
"softwareVersion": "v0.0.1"
|
||||
},
|
||||
"message": {
|
||||
"timestamp": "2022-08-31T12:40:00Z",
|
||||
"event": "FCMaterials",
|
||||
"horizons": true,
|
||||
"odyssey": true,
|
||||
"MarketID": 3706433792,
|
||||
"CarrierID": "X3F-5NZ",
|
||||
"Items": {
|
||||
"sales": {
|
||||
"128961524": {
|
||||
"id": 128961524,
|
||||
"name": "aerogel",
|
||||
"price": 500,
|
||||
"stock": 5
|
||||
}
|
||||
},
|
||||
"purchases": []
|
||||
}
|
||||
}
|
||||
}
|
27
src/tests/eddn_message/fcmaterials_capi/1/006_CAPI-fcmaterials-sell-order-single-bought_market-2022-08-31_135725BST.json
Normal file
27
src/tests/eddn_message/fcmaterials_capi/1/006_CAPI-fcmaterials-sell-order-single-bought_market-2022-08-31_135725BST.json
Normal file
@ -0,0 +1,27 @@
|
||||
{
|
||||
"$schemaRef":"https://eddn.edcd.io/schemas/fcmaterials_capi/1",
|
||||
"header": {
|
||||
"uploaderID": "Athanasius Testing",
|
||||
"softwareName": "Ath Testing",
|
||||
"softwareVersion": "v0.0.1"
|
||||
},
|
||||
"message": {
|
||||
"timestamp": "2022-08-31T12:57:25Z",
|
||||
"event": "FCMaterials",
|
||||
"horizons": true,
|
||||
"odyssey": true,
|
||||
"MarketID": 3706433792,
|
||||
"CarrierID": "X3F-5NZ",
|
||||
"Items": {
|
||||
"sales": {
|
||||
"128961524": {
|
||||
"id": 128961524,
|
||||
"name": "aerogel",
|
||||
"price": 500,
|
||||
"stock": 0
|
||||
}
|
||||
},
|
||||
"purchases": []
|
||||
}
|
||||
}
|
||||
}
|
39
src/tests/eddn_message/fcmaterials_capi/1/007_CAPI-fcmaterials-sell-order-single_market-2022-08-31_135836BST.json
Normal file
39
src/tests/eddn_message/fcmaterials_capi/1/007_CAPI-fcmaterials-sell-order-single_market-2022-08-31_135836BST.json
Normal file
@ -0,0 +1,39 @@
|
||||
{
|
||||
"$schemaRef":"https://eddn.edcd.io/schemas/fcmaterials_capi/1",
|
||||
"header": {
|
||||
"uploaderID": "Athanasius Testing",
|
||||
"softwareName": "Ath Testing",
|
||||
"softwareVersion": "v0.0.1"
|
||||
},
|
||||
"message": {
|
||||
"timestamp": "2022-08-31T12:58:36Z",
|
||||
"event": "FCMaterials",
|
||||
"horizons": true,
|
||||
"odyssey": true,
|
||||
"MarketID": 3706433792,
|
||||
"CarrierID": "X3F-5NZ",
|
||||
"Items": {
|
||||
"sales": {
|
||||
"128961524": {
|
||||
"id": 128961524,
|
||||
"name": "aerogel",
|
||||
"price": 500,
|
||||
"stock": 0
|
||||
},
|
||||
"128972282": {
|
||||
"id": 128972282,
|
||||
"name": "accidentlogs",
|
||||
"price": 4000,
|
||||
"stock": 4
|
||||
},
|
||||
"128962598": {
|
||||
"id": 128962598,
|
||||
"name": "compactlibrary",
|
||||
"price": 10000,
|
||||
"stock": 9
|
||||
}
|
||||
},
|
||||
"purchases": []
|
||||
}
|
||||
}
|
||||
}
|
42
src/tests/eddn_message/fcmaterials_capi/1/008_CAPI-fcmaterials-sell-order-single-just-bought_market-2022-08-31_135917BST.json
Normal file
42
src/tests/eddn_message/fcmaterials_capi/1/008_CAPI-fcmaterials-sell-order-single-just-bought_market-2022-08-31_135917BST.json
Normal file
@ -0,0 +1,42 @@
|
||||
{
|
||||
"$schemaRef":"https://eddn.edcd.io/schemas/fcmaterials_capi/1",
|
||||
"header": {
|
||||
"uploaderID": "Athanasius Testing",
|
||||
"softwareName": "Ath Testing",
|
||||
"softwareVersion": "v0.0.1"
|
||||
},
|
||||
"message": {
|
||||
"timestamp": "2022-08-31T12:59:17Z",
|
||||
"event": "FCMaterials",
|
||||
"horizons": true,
|
||||
"odyssey": true,
|
||||
"MarketID": 3706433792,
|
||||
"CarrierID": "X3F-5NZ",
|
||||
"Items": {
|
||||
"sales": {
|
||||
"128961524": {
|
||||
"id": 128961524,
|
||||
"name": "aerogel",
|
||||
"locName": "Aerogel",
|
||||
"price": 500,
|
||||
"stock": 0
|
||||
},
|
||||
"128972282": {
|
||||
"id": 128972282,
|
||||
"name": "accidentlogs",
|
||||
"locName": "Accident Logs",
|
||||
"price": 4000,
|
||||
"stock": 0
|
||||
},
|
||||
"128962598": {
|
||||
"id": 128962598,
|
||||
"name": "compactlibrary",
|
||||
"locName": "Compact Library",
|
||||
"price": 10000,
|
||||
"stock": 0
|
||||
}
|
||||
},
|
||||
"purchases": []
|
||||
}
|
||||
}
|
||||
}
|
1
src/tests/eddn_message/fcmaterials_capi/1/100_CAPI-fcmaterials_odyssey_no-gameversion.json
Normal file
1
src/tests/eddn_message/fcmaterials_capi/1/100_CAPI-fcmaterials_odyssey_no-gameversion.json
Normal file
File diff suppressed because one or more lines are too long
1
src/tests/eddn_message/fcmaterials_capi/1/101_CAPI-fcmaterials_odyssey_with-gameversion.json
Normal file
1
src/tests/eddn_message/fcmaterials_capi/1/101_CAPI-fcmaterials_odyssey_with-gameversion.json
Normal file
File diff suppressed because one or more lines are too long
1
src/tests/eddn_message/fcmaterials_capi/1/old-raw/001_CAPI-fcmaterials-no-orders_fleetcarrier-2022-08-31_134001BST.json
Normal file
1
src/tests/eddn_message/fcmaterials_capi/1/old-raw/001_CAPI-fcmaterials-no-orders_fleetcarrier-2022-08-31_134001BST.json
Normal file
File diff suppressed because one or more lines are too long
1
src/tests/eddn_message/fcmaterials_capi/1/old-raw/001_CAPI-fcmaterials-no-orders_market-2022-08-31_134000BST.json
Normal file
1
src/tests/eddn_message/fcmaterials_capi/1/old-raw/001_CAPI-fcmaterials-no-orders_market-2022-08-31_134000BST.json
Normal file
@ -0,0 +1 @@
|
||||
{"id":3706433792,"name":"X3F-N5Z","outpostType":"fleetcarrier","imported":[],"exported":[],"services":{"commodities":"ok","carrierfuel":"ok","socialspace":"ok","refuel":"ok","repair":"ok","rearm":"ok","shipyard":"ok","outfitting":"ok","blackmarket":"ok","voucherredemption":"ok","exploration":"ok","bartender":"ok","vistagenomics":"unavailable","pioneersupplies":"unavailable","carriermanagement":"ok","stationmenu":"ok","dock":"ok","crewlounge":"ok","engineer":"ok","contacts":"ok","livery":"ok"},"economies":{"136":{"name":"Carrier","proportion":1}},"prohibited":{"128667728":"ImperialSlaves","128049243":"Slaves"},"orders":{"commodities":{"sales":[{"name":"gold","stock":"0","price":"47681","blackmarket":false},{"name":"silver","stock":"0","price":"37362","blackmarket":false},{"name":"cobalt","stock":"0","price":"17999","blackmarket":false},{"name":"performanceenhancers","stock":"0","price":"25600","blackmarket":false},{"name":"basicmedicines","stock":"5736","price":"2500","blackmarket":false},{"name":"advancedmedicines","stock":"558","price":"75","blackmarket":false},{"name":"survivalequipment","stock":"0","price":"2700","blackmarket":false},{"name":"ancientrelic","stock":"5","price":"24962","blackmarket":false},{"name":"agronomictreatment","stock":"0","price":"30000","blackmarket":false}],"purchases":[]},"onfootmicroresources":{"sales":[],"purchases":[]}},"commodities":[{"id":128682046,"name":"AdvancedMedicines","legality":"","buyPrice":75,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":558,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Advanced Medicines"},{"id":128049210,"name":"BasicMedicines","legality":"","buyPrice":2500,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5736,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Basic Medicines"},{"id":128066403,"categoryname":"NonMarketable","name":"Drones","stock":9999999,"buyPrice":101,"sellPrice":101,"demand":9999999,"legality":"","meanPrice":101,"demandBracket":2,"stockBracket":2,"locName":"Limpet"},{"id":128732183,"name":"AncientRelic","legality":"","buyPrice":24962,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5,"demand":0,"statusFlags":[],"categoryname":"Salvage","locName":"Guardian Relic"}]}
|
@ -0,0 +1,3 @@
|
||||
{ "timestamp":"2022-08-31T12:38:08Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
|
||||
|
||||
] }
|
1
src/tests/eddn_message/fcmaterials_capi/1/old-raw/002_CAPI-fcmaterials-buy-orders_fleetcarrier-2022-08-31_134247BST.json
Normal file
1
src/tests/eddn_message/fcmaterials_capi/1/old-raw/002_CAPI-fcmaterials-buy-orders_fleetcarrier-2022-08-31_134247BST.json
Normal file
File diff suppressed because one or more lines are too long
1
src/tests/eddn_message/fcmaterials_capi/1/old-raw/002_CAPI-fcmaterials-buy-orders_market-2022-08-31_134246BST.json
Normal file
1
src/tests/eddn_message/fcmaterials_capi/1/old-raw/002_CAPI-fcmaterials-buy-orders_market-2022-08-31_134246BST.json
Normal file
@ -0,0 +1 @@
|
||||
{"id":3706433792,"name":"X3F-N5Z","outpostType":"fleetcarrier","imported":[],"exported":[],"services":{"commodities":"ok","carrierfuel":"ok","socialspace":"ok","refuel":"ok","repair":"ok","rearm":"ok","shipyard":"ok","outfitting":"ok","blackmarket":"ok","voucherredemption":"ok","exploration":"ok","bartender":"ok","vistagenomics":"unavailable","pioneersupplies":"unavailable","carriermanagement":"ok","stationmenu":"ok","dock":"ok","crewlounge":"ok","engineer":"ok","contacts":"ok","livery":"ok"},"economies":{"136":{"name":"Carrier","proportion":1}},"prohibited":{"128667728":"ImperialSlaves","128049243":"Slaves"},"orders":{"commodities":{"sales":[{"name":"gold","stock":"0","price":"47681","blackmarket":false},{"name":"silver","stock":"0","price":"37362","blackmarket":false},{"name":"cobalt","stock":"0","price":"17999","blackmarket":false},{"name":"performanceenhancers","stock":"0","price":"25600","blackmarket":false},{"name":"basicmedicines","stock":"5736","price":"2500","blackmarket":false},{"name":"advancedmedicines","stock":"558","price":"75","blackmarket":false},{"name":"survivalequipment","stock":"0","price":"2700","blackmarket":false},{"name":"ancientrelic","stock":"5","price":"24962","blackmarket":false},{"name":"agronomictreatment","stock":"0","price":"30000","blackmarket":false}],"purchases":[]},"onfootmicroresources":{"sales":[],"purchases":[{"name":"aerogel","locName":"Aerogel","total":1,"outstanding":1,"price":500},{"name":"accidentlogs","locName":"Accident Logs","total":2,"outstanding":2,"price":4000},{"name":"compactlibrary","locName":"Compact Library","total":3,"outstanding":3,"price":10000}]}},"commodities":[{"id":128682046,"name":"AdvancedMedicines","legality":"","buyPrice":75,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":558,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Advanced Medicines"},{"id":128049210,"name":"BasicMedicines","legality":"","buyPrice":2500,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5736,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Basic Medicines"},{"id":128066403,"categoryname":"NonMarketable","name":"Drones","stock":9999999,"buyPrice":101,"sellPrice":101,"demand":9999999,"legality":"","meanPrice":101,"demandBracket":2,"stockBracket":2,"locName":"Limpet"},{"id":128732183,"name":"AncientRelic","legality":"","buyPrice":24962,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5,"demand":0,"statusFlags":[],"categoryname":"Salvage","locName":"Guardian Relic"}]}
|
@ -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 }
|
||||
] }
|
1
src/tests/eddn_message/fcmaterials_capi/1/old-raw/003_CAPI-fcmaterials-buy-order-single_fleetcarrier-2022-08-31_135005BST.json
Normal file
1
src/tests/eddn_message/fcmaterials_capi/1/old-raw/003_CAPI-fcmaterials-buy-order-single_fleetcarrier-2022-08-31_135005BST.json
Normal file
File diff suppressed because one or more lines are too long
1
src/tests/eddn_message/fcmaterials_capi/1/old-raw/003_CAPI-fcmaterials-buy-order-single_market-2022-08-31_135003BST.json
Normal file
1
src/tests/eddn_message/fcmaterials_capi/1/old-raw/003_CAPI-fcmaterials-buy-order-single_market-2022-08-31_135003BST.json
Normal file
@ -0,0 +1 @@
|
||||
{"id":3706433792,"name":"X3F-N5Z","outpostType":"fleetcarrier","imported":[],"exported":[],"services":{"commodities":"ok","carrierfuel":"ok","socialspace":"ok","refuel":"ok","repair":"ok","rearm":"ok","shipyard":"ok","outfitting":"ok","blackmarket":"ok","voucherredemption":"ok","exploration":"ok","bartender":"ok","vistagenomics":"unavailable","pioneersupplies":"unavailable","carriermanagement":"ok","stationmenu":"ok","dock":"ok","crewlounge":"ok","engineer":"ok","contacts":"ok","livery":"ok"},"economies":{"136":{"name":"Carrier","proportion":1}},"prohibited":{"128667728":"ImperialSlaves","128049243":"Slaves"},"orders":{"commodities":{"sales":[{"name":"gold","stock":"0","price":"47681","blackmarket":false},{"name":"silver","stock":"0","price":"37362","blackmarket":false},{"name":"cobalt","stock":"0","price":"17999","blackmarket":false},{"name":"performanceenhancers","stock":"0","price":"25600","blackmarket":false},{"name":"basicmedicines","stock":"5736","price":"2500","blackmarket":false},{"name":"advancedmedicines","stock":"558","price":"75","blackmarket":false},{"name":"survivalequipment","stock":"0","price":"2700","blackmarket":false},{"name":"ancientrelic","stock":"5","price":"24962","blackmarket":false},{"name":"agronomictreatment","stock":"0","price":"30000","blackmarket":false}],"purchases":[]},"onfootmicroresources":{"sales":[],"purchases":[{"name":"aerogel","locName":"Aerogel","total":4,"outstanding":4,"price":500}]}},"commodities":[{"id":128682046,"name":"AdvancedMedicines","legality":"","buyPrice":75,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":558,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Advanced Medicines"},{"id":128049210,"name":"BasicMedicines","legality":"","buyPrice":2500,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5736,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Basic Medicines"},{"id":128066403,"categoryname":"NonMarketable","name":"Drones","stock":9999999,"buyPrice":101,"sellPrice":101,"demand":9999999,"legality":"","meanPrice":101,"demandBracket":2,"stockBracket":2,"locName":"Limpet"},{"id":128732183,"name":"AncientRelic","legality":"","buyPrice":24962,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5,"demand":0,"statusFlags":[],"categoryname":"Salvage","locName":"Guardian Relic"}]}
|
@ -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"}]}
|
3
src/tests/eddn_message/fcmaterials_capi/1/old-raw/004_journal-buy-order-single-fulfilled.json
Normal file
3
src/tests/eddn_message/fcmaterials_capi/1/old-raw/004_journal-buy-order-single-fulfilled.json
Normal file
@ -0,0 +1,3 @@
|
||||
{ "timestamp":"2022-08-31T12:50:16Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
|
||||
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":0 }
|
||||
] }
|
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
1
src/tests/eddn_message/fcmaterials_capi/1/old-raw/005_CAPI-fcmaterials-sell-order-single_market-2022-08-31_135633BST.json
Normal file
1
src/tests/eddn_message/fcmaterials_capi/1/old-raw/005_CAPI-fcmaterials-sell-order-single_market-2022-08-31_135633BST.json
Normal file
@ -0,0 +1 @@
|
||||
{"id":3706433792,"name":"X3F-N5Z","outpostType":"fleetcarrier","imported":[],"exported":[],"services":{"commodities":"ok","carrierfuel":"ok","socialspace":"ok","refuel":"ok","repair":"ok","rearm":"ok","shipyard":"ok","outfitting":"ok","blackmarket":"ok","voucherredemption":"ok","exploration":"ok","bartender":"ok","vistagenomics":"unavailable","pioneersupplies":"unavailable","carriermanagement":"ok","stationmenu":"ok","dock":"ok","crewlounge":"ok","engineer":"ok","contacts":"ok","livery":"ok"},"economies":{"136":{"name":"Carrier","proportion":1}},"prohibited":{"128667728":"ImperialSlaves","128049243":"Slaves"},"orders":{"commodities":{"sales":[{"name":"gold","stock":"0","price":"47681","blackmarket":false},{"name":"silver","stock":"0","price":"37362","blackmarket":false},{"name":"cobalt","stock":"0","price":"17999","blackmarket":false},{"name":"performanceenhancers","stock":"0","price":"25600","blackmarket":false},{"name":"basicmedicines","stock":"5736","price":"2500","blackmarket":false},{"name":"advancedmedicines","stock":"558","price":"75","blackmarket":false},{"name":"survivalequipment","stock":"0","price":"2700","blackmarket":false},{"name":"ancientrelic","stock":"5","price":"24962","blackmarket":false},{"name":"agronomictreatment","stock":"0","price":"30000","blackmarket":false}],"purchases":[]},"onfootmicroresources":{"sales":{"128961524":{"id":128961524,"name":"aerogel","locName":"Aerogel","price":500,"stock":5}},"purchases":[]}},"commodities":[{"id":128682046,"name":"AdvancedMedicines","legality":"","buyPrice":75,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":558,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Advanced Medicines"},{"id":128049210,"name":"BasicMedicines","legality":"","buyPrice":2500,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5736,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Basic Medicines"},{"id":128066403,"categoryname":"NonMarketable","name":"Drones","stock":9999999,"buyPrice":101,"sellPrice":101,"demand":9999999,"legality":"","meanPrice":101,"demandBracket":2,"stockBracket":2,"locName":"Limpet"},{"id":128732183,"name":"AncientRelic","legality":"","buyPrice":24962,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5,"demand":0,"statusFlags":[],"categoryname":"Salvage","locName":"Guardian Relic"}]}
|
3
src/tests/eddn_message/fcmaterials_capi/1/old-raw/005_journal-sell-order-single-just-bought.json
Normal file
3
src/tests/eddn_message/fcmaterials_capi/1/old-raw/005_journal-sell-order-single-just-bought.json
Normal file
@ -0,0 +1,3 @@
|
||||
{ "timestamp":"2022-08-31T12:56:46Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
|
||||
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":0 }
|
||||
] }
|
@ -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
1
src/tests/eddn_message/fcmaterials_capi/1/old-raw/006_CAPI-fcmaterials-sell-order-single_market-2022-08-31_135836BST.json
Normal file
1
src/tests/eddn_message/fcmaterials_capi/1/old-raw/006_CAPI-fcmaterials-sell-order-single_market-2022-08-31_135836BST.json
Normal file
@ -0,0 +1 @@
|
||||
{"id":3706433792,"name":"X3F-N5Z","outpostType":"fleetcarrier","imported":[],"exported":[],"services":{"commodities":"ok","carrierfuel":"ok","socialspace":"ok","refuel":"ok","repair":"ok","rearm":"ok","shipyard":"ok","outfitting":"ok","blackmarket":"ok","voucherredemption":"ok","exploration":"ok","bartender":"ok","vistagenomics":"unavailable","pioneersupplies":"unavailable","carriermanagement":"ok","stationmenu":"ok","dock":"ok","crewlounge":"ok","engineer":"ok","contacts":"ok","livery":"ok"},"economies":{"136":{"name":"Carrier","proportion":1}},"prohibited":{"128667728":"ImperialSlaves","128049243":"Slaves"},"orders":{"commodities":{"sales":[{"name":"gold","stock":"0","price":"47681","blackmarket":false},{"name":"silver","stock":"0","price":"37362","blackmarket":false},{"name":"cobalt","stock":"0","price":"17999","blackmarket":false},{"name":"performanceenhancers","stock":"0","price":"25600","blackmarket":false},{"name":"basicmedicines","stock":"5736","price":"2500","blackmarket":false},{"name":"advancedmedicines","stock":"558","price":"75","blackmarket":false},{"name":"survivalequipment","stock":"0","price":"2700","blackmarket":false},{"name":"ancientrelic","stock":"5","price":"24962","blackmarket":false},{"name":"agronomictreatment","stock":"0","price":"30000","blackmarket":false}],"purchases":[]},"onfootmicroresources":{"sales":{"128961524":{"id":128961524,"name":"aerogel","locName":"Aerogel","price":500,"stock":0},"128972282":{"id":128972282,"name":"accidentlogs","locName":"Accident Logs","price":4000,"stock":4},"128962598":{"id":128962598,"name":"compactlibrary","locName":"Compact Library","price":10000,"stock":9}},"purchases":[]}},"commodities":[{"id":128682046,"name":"AdvancedMedicines","legality":"","buyPrice":75,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":558,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Advanced Medicines"},{"id":128049210,"name":"BasicMedicines","legality":"","buyPrice":2500,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5736,"demand":0,"statusFlags":[],"categoryname":"Medicines","locName":"Basic Medicines"},{"id":128066403,"categoryname":"NonMarketable","name":"Drones","stock":9999999,"buyPrice":101,"sellPrice":101,"demand":9999999,"legality":"","meanPrice":101,"demandBracket":2,"stockBracket":2,"locName":"Limpet"},{"id":128732183,"name":"AncientRelic","legality":"","buyPrice":24962,"sellPrice":0,"meanPrice":0,"demandBracket":"","stockBracket":2,"stock":5,"demand":0,"statusFlags":[],"categoryname":"Salvage","locName":"Guardian Relic"}]}
|
5
src/tests/eddn_message/fcmaterials_capi/1/old-raw/006_journal-sell-order-two-just-bought.json
Normal file
5
src/tests/eddn_message/fcmaterials_capi/1/old-raw/006_journal-sell-order-two-just-bought.json
Normal file
@ -0,0 +1,5 @@
|
||||
{ "timestamp":"2022-08-31T12:58:56Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
|
||||
{ "id":128962598, "Name":"$compactlibrary_name;", "Name_Localised":"Compact Library", "Price":10000, "Stock":0, "Demand":0 },
|
||||
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":0 },
|
||||
{ "id":128972282, "Name":"$accidentlogs_name;", "Name_Localised":"Accident Logs", "Price":4000, "Stock":0, "Demand":0 }
|
||||
] }
|
@ -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 }
|
||||
] }
|
5
src/tests/eddn_message/fcmaterials_capi/1/old-raw/102_journal-one-demand-each-category.json
Normal file
5
src/tests/eddn_message/fcmaterials_capi/1/old-raw/102_journal-one-demand-each-category.json
Normal file
@ -0,0 +1,5 @@
|
||||
{ "timestamp":"2022-08-30T15:55:25Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
|
||||
{ "id":128962598, "Name":"$compactlibrary_name;", "Name_Localised":"Compact Library", "Price":10000, "Stock":0, "Demand":1 },
|
||||
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":1 },
|
||||
{ "id":128972282, "Name":"$accidentlogs_name;", "Name_Localised":"Accident Logs", "Price":4000, "Stock":0, "Demand":1 }
|
||||
] }
|
5
src/tests/eddn_message/fcmaterials_capi/1/old-raw/103_journal-one-stock-each-category.json
Normal file
5
src/tests/eddn_message/fcmaterials_capi/1/old-raw/103_journal-one-stock-each-category.json
Normal file
@ -0,0 +1,5 @@
|
||||
{ "timestamp":"2022-08-30T15:58:30Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
|
||||
{ "id":128962598, "Name":"$compactlibrary_name;", "Name_Localised":"Compact Library", "Price":10000, "Stock":1, "Demand":0 },
|
||||
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":1, "Demand":0 },
|
||||
{ "id":128972282, "Name":"$accidentlogs_name;", "Name_Localised":"Accident Logs", "Price":4010, "Stock":1, "Demand":0 }
|
||||
] }
|
@ -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"}}
|
1
src/tests/eddn_message/fcmaterials_journal/1/002_horizons-odyssey_with-gameversion.json
Normal file
1
src/tests/eddn_message/fcmaterials_journal/1/002_horizons-odyssey_with-gameversion.json
Normal file
@ -0,0 +1 @@
|
||||
{"$schemaRef": "https://eddn.edcd.io/schemas/fcmaterials_journal/1", "header": {"gatewayTimestamp": "2022-11-14T00:09:18.497867Z", "softwareName": "E:D Market Connector [Windows]", "softwareVersion": "5.5.0", "gameversion": "4.0.0.1450", "gamebuild":"r286858/r0 ", "uploaderID": "967cb0e8bd3f177a54d320cdf7193bf7e39e158e"}, "message": {"CarrierID": "V9X-01W", "CarrierName": "The Netherlands", "Items": [{"Demand": 8, "Name": "$multimediaentertainment_name;", "Price": 3000, "Stock": 0, "id": 128972337}, {"Demand": 25, "Name": "$weaponschematic_name;", "Price": 35000, "Stock": 0, "id": 128962614}, {"Demand": 25, "Name": "$suitschematic_name;", "Price": 50000, "Stock": 0, "id": 128962609}, {"Demand": 5, "Name": "$financialprojections_name;", "Price": 6000, "Stock": 0, "id": 128972317}, {"Demand": 20, "Name": "$manufacturinginstructions_name;", "Price": 9000, "Stock": 0, "id": 128972331}, {"Demand": 37, "Name": "$ionisedgas_name;", "Price": 35000, "Stock": 0, "id": 128961570}, {"Demand": 8, "Name": "$classicentertainment_name;", "Price": 7000, "Stock": 0, "id": 128972298}, {"Demand": 8, "Name": "$catmedia_name;", "Price": 1000, "Stock": 0, "id": 128972291}, {"Demand": 8, "Name": "$settlementdefenceplans_name;", "Price": 220000, "Stock": 0, "id": 128972364}], "MarketID": 3705423872, "event": "FCMaterials", "horizons": true, "odyssey": true, "timestamp": "2022-11-14T00:09:17Z"}}
|
3
src/tests/eddn_message/fcmaterials_journal/1/raw/010_journal-no-orders_2022-09-02T154605Z.json
Normal file
3
src/tests/eddn_message/fcmaterials_journal/1/raw/010_journal-no-orders_2022-09-02T154605Z.json
Normal file
@ -0,0 +1,3 @@
|
||||
{ "timestamp":"2022-09-02T15:46:05Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
|
||||
|
||||
] }
|
3
src/tests/eddn_message/fcmaterials_journal/1/raw/011_journal-demand-single-item_2022-09-02T155344Z.json
Normal file
3
src/tests/eddn_message/fcmaterials_journal/1/raw/011_journal-demand-single-item_2022-09-02T155344Z.json
Normal file
@ -0,0 +1,3 @@
|
||||
{ "timestamp":"2022-09-02T15:53:44Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
|
||||
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":1 }
|
||||
] }
|
4
src/tests/eddn_message/fcmaterials_journal/1/raw/012_journal-demand-two-items_2022-09-02T155539Z.json
Normal file
4
src/tests/eddn_message/fcmaterials_journal/1/raw/012_journal-demand-two-items_2022-09-02T155539Z.json
Normal file
@ -0,0 +1,4 @@
|
||||
{ "timestamp":"2022-09-02T15:55:39Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
|
||||
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":1 },
|
||||
{ "id":128972282, "Name":"$accidentlogs_name;", "Name_Localised":"Accident Logs", "Price":4000, "Stock":0, "Demand":1 }
|
||||
] }
|
3
src/tests/eddn_message/fcmaterials_journal/1/raw/013_journal-supply-single-item_2022-09-02T155827Z.json
Normal file
3
src/tests/eddn_message/fcmaterials_journal/1/raw/013_journal-supply-single-item_2022-09-02T155827Z.json
Normal file
@ -0,0 +1,3 @@
|
||||
{ "timestamp":"2022-09-02T15:58:27Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
|
||||
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":1, "Demand":0 }
|
||||
] }
|
4
src/tests/eddn_message/fcmaterials_journal/1/raw/014_journal-supply-two-items_2022-09-02T15955Z.json
Normal file
4
src/tests/eddn_message/fcmaterials_journal/1/raw/014_journal-supply-two-items_2022-09-02T15955Z.json
Normal file
@ -0,0 +1,4 @@
|
||||
{ "timestamp":"2022-09-02T15:59:55Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
|
||||
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":1, "Demand":0 },
|
||||
{ "id":128972282, "Name":"$accidentlogs_name;", "Name_Localised":"Accident Logs", "Price":4000, "Stock":2, "Demand":0 }
|
||||
] }
|
4
src/tests/eddn_message/fcmaterials_journal/1/raw/015_journal-supply-sold-but-still-listed_2022-09-02T160138Z.json
Normal file
4
src/tests/eddn_message/fcmaterials_journal/1/raw/015_journal-supply-sold-but-still-listed_2022-09-02T160138Z.json
Normal file
@ -0,0 +1,4 @@
|
||||
{ "timestamp":"2022-09-02T16:01:38Z", "event":"FCMaterials", "MarketID":3706433792, "CarrierName":"WARD'S OLOGIES", "CarrierID":"X3F-N5Z", "Items":[
|
||||
{ "id":128961524, "Name":"$aerogel_name;", "Name_Localised":"Aerogel", "Price":500, "Stock":0, "Demand":0 },
|
||||
{ "id":128972282, "Name":"$accidentlogs_name;", "Name_Localised":"Accident Logs", "Price":4000, "Stock":0, "Demand":0 }
|
||||
] }
|
@ -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"}}
|
1
src/tests/eddn_message/fsssignaldiscovered/1/002_horizons-odyssey_with-gameversion.json
Normal file
1
src/tests/eddn_message/fsssignaldiscovered/1/002_horizons-odyssey_with-gameversion.json
Normal file
@ -0,0 +1 @@
|
||||
{"$schemaRef": "https://eddn.edcd.io/schemas/fsssignaldiscovered/1", "header": {"gatewayTimestamp": "2022-11-14T00:00:06.836870Z", "softwareName": "EDDiscovery", "softwareVersion": "15.1.4.0", "gameversion": "4.0.0.1450", "gamebuild":"r286858/r0 ", "uploaderID": "d52d70ee07b0758d761af437b3c5451b81ab58fb"}, "message": {"StarPos": [-34.46875, 2.3125, 13.96875], "StarSystem": "G 125-30", "SystemAddress": 670417626537, "event": "FSSSignalDiscovered", "horizons": true, "odyssey": true, "signals": [{"SignalName": "LHS 3549 II Aquarius-class Tanker", "timestamp": "2022-11-14T00:00:03Z"}, {"SignalName": "$MULTIPLAYER_SCENARIO77_TITLE;", "timestamp": "2022-11-14T00:00:03Z"}], "timestamp": "2022-11-14T00:00:03Z"}}
|
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