Repo containing the sentinels tracker back end setup, including AWS CDK deployment, lambdas, api gateway, and dynamodb setups.
This backend controls all the analysis, loading, and retrieval of statistics data through an API.
In general, users should never need to use this repo - this is around for developer access and backup.
The following assumptions are made when data is inputted into the dataset.
- Definitive Edition Heroes and Villains can mix in a game entry, but unless otherwise specified a given name is always considered to be Enhanced Edition
- i.e. Baron Blade is Enhanced. Baron Blade, Definitive is Definitive. Baron Blade, Mad Bomber is Enhanced. Baron Blade, Definitive Mad Bomber is Definitive.
- Removing GameMode.MIXED from the results will remove these mixed rule-set games.
- Advanced and/or Challenge mode applies to the entire Villain Team - not individually
- Adamant Sentinels are always considered "As a group" - Not tracking individually if a given Southwest Sentinel is Adamant or not.
- While the Scions, Shield, and Rewards are all recorded for OblivAeon games, only Shield is used as a sorting factor for statistics at this time
- likewise the order of environments destroyed, additional heroes played by player slot are recorded, but not taken into account (beyond the starting team of Heroes and starting Environment)
The api end point is queried with the following structure:
[type]/[name]/[alternate_tag]/[keyword]/[name]/[alternate_tag] ... ect
The Type in the first field sets the nature for the following keywords. It can be:
- hero/
- villain/
- environment/
The name field is just the base character name - absolute_zero or baron_blade or insula_primalis
The alternate_tag is how to focus in on a single alt version. If left blank, the Enhanced Edition base character is used.
- like:
freedom_sixormad_bomber definitivewill select the characters base definitive version- if a character has an alternate that has the same name in both EE and Definitive, the prefixing the name with definitive will indicate it should be used:
baron_blade/definitive_mad_bomber
- in/ - The name immediately following this must be an environment name.
- you can follow this with
/definitivefor the definitive version.
- you can follow this with
- with/ - Pairs the name following it with the first proceeding it. All characters of the same type (hero or villain) need to be chained together.
absolute_zero/with/legacyabsolute_zero/freedom_six/with/tachyon/freedom_six
- versus/ - This keyword switches types and the name that follows it must be the opposite type of the ones before it.
absolute_zero/versus/baron_blade- with/ can be on both sides of the
versustag at the same time, for use with team villains. - `absolute_zero/with/legacy/versus/baron_blade/team_villain/plague_rat/team_villain.
- from/ this keyword narrows the results down to a single (case sensitive) user name.
These can all be combined in any order as long as the rules of all the heroes and all the villains are on opposite sides of the versus. note: currently environment cannot start a chain - you can do just environment/insula_primalis but cannot chain any further than that - further needs of refinement need to use the in keyword
hero/absolute_zero/with_legacy/in/insula_primalus/versus/baron_blade/from/Lynkfox
Enable All keyword
hero/absolute_zero/all- gets all versions of Absolute Zero not just his base form
Enable OR keyword
hero/absolute_zero/or/legacy/in/insula_primalis- gets all the games with either AZ and Legacy in Insula Primalis
Enable BETWEEN/BEFORE/AFTER keywords
hero/absolute_zero/after/2022-01-01- only looks at the stats with a given dateframe.
Enable sending pseudo query language in body as part of a json structure
-
Similar in idea to JSON-Logic but with less ambiguity and more sugar for friendliness
- something like - for a generic query
{ "hero": { "name": "absolute_zero" "with": [("legacy", "americas_greatest")] } }or for something far more specific
{ "hero": { "name": "absolute_zero", "where": { "incapped": "yes", "number_of_players": { "greater_than": 2 } } } }basically, each Key in a given object is either a Keyword (Hero, Where, In, Greater Than, With) or an attribute in the table to compare the keyword with. note for self: if key != dict, recursive parse as an instruction, else is a value
See /Documentation/Setup and Organization.md for more details.