diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c2658d7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+node_modules/
diff --git a/assets/scripts/objects.js b/assets/scripts/objects.js
new file mode 100644
index 0000000..62b13ed
--- /dev/null
+++ b/assets/scripts/objects.js
@@ -0,0 +1,163 @@
+const objects = {
+ UserProfile: {
+ kind: 'Class',
+ fields: [
+ { name: 'uuid', type: 'String', description: "User's UUID" },
+ { name: 'nickname', type: 'String', description: "User's nickname" },
+ { name: 'roleType', type: 'Integer', description: "User's role type" },
+ { name: 'eloRate', type: 'Integer?', description: "User's Elo rate. It is null if the user hasn't finished placement matches." },
+ { name: 'eloRank', type: 'Integer?', description: "User's Elo rank" },
+ { name: 'country', type: 'String?', description: 'User\'s country code in lowercased ISO 3166-1 alpha-2 format.' },
+ ]
+ },
+ Achievement: {
+ kind: 'Class',
+ fields: [
+ { name: 'id', type: 'String', description: 'Achievement Identifier' },
+ { name: 'date', type: 'Date', description: 'Timestamp of when the achievement was earned' },
+ { name: 'data', type: 'String[]', description: 'Additional data array' },
+ { name: 'level', type: 'Integer', description: 'Level of achievement' },
+ { name: 'value', type: 'Integer?', description: "Contains the current player's progression of the achievement. It is null if the achievement is not a leveling one." },
+ { name: 'goal', type: 'Integer?', description: 'Next level goal of the achievement. It is null if the achievement is at max level or not a leveling one.' },
+ ]
+ },
+ MatchInfo: {
+ kind: 'Class',
+ note: 'Advanced parameters are only available with /matches/{match_id} endpoint.',
+ fields: [
+ { name: 'id', type: 'String' },
+ { name: 'type', type: 'MatchType' },
+ { name: 'season', type: 'Integer' },
+ { name: 'category', type: 'String?', description: 'Match completions category. Default is ANY' },
+ { name: 'date', type: 'Date' },
+ { name: 'players', type: 'UserProfile[]' },
+ { name: 'spectators', type: 'UserProfile[]' },
+ { name: 'seed', type: 'MatchSeed?', description: "Seed ID if it's a ranked filtered seed. This is not the seed number. It is null if the seed is not filtered." },
+ { name: 'result.uuid', type: 'String?', description: "Winner's UUID. It is null if the match was a draw." },
+ { name: 'result.time', type: 'Time' },
+ { name: 'forfeited', type: 'Boolean', description: 'Whether the match has no completions' },
+ { name: 'decayed', type: 'Boolean', description: 'Whether the match has decayed' },
+ { name: 'rank.season', type: 'Integer?', description: "Record rank of the match's season" },
+ { name: 'rank.allTime', type: 'Integer?', description: 'Record rank of all-time' },
+ { name: 'changes[].uuid', type: 'String', description: 'UUID of player' },
+ { name: 'changes[].change', type: 'Integer?', description: 'Amount of changed Elo rate. It is null if the match is a placement.' },
+ { name: 'changes[].eloRate', type: 'Integer?', description: 'Elo rate of the player. It is null if the match is a placement.' },
+ { name: 'tag', type: 'String?', description: 'Special tag of this match. Used to get matches by tag.' },
+ { name: 'beginner', type: 'Boolean', description: 'Whether beginner mode is enabled in the match.' },
+ { name: 'vod[].uuid', type: 'String', description: 'UUID of VOD owner. Only players with public stream activated will be included.' },
+ { name: 'vod[].url', type: 'String', description: 'VOD URL of this match' },
+ { name: 'vod[].startsAt', type: 'Date', description: 'VOD start date. You can get a timestamp with {date} - {vod[].startsAt}' },
+ { name: 'completions[].uuid', type: 'String', description: '(Advanced) Player uuid of completion' },
+ { name: 'completions[].time', type: 'Time', description: '(Advanced) Match time of completion' },
+ { name: 'timelines[].uuid', type: 'String', description: '(Advanced) Player uuid of timeline' },
+ { name: 'timelines[].time', type: 'Time', description: '(Advanced) Match time of timeline' },
+ { name: 'timelines[].type', type: 'String', description: '(Advanced) Identifier of timeline' },
+ { name: 'replayExist', type: 'Boolean', description: '(Advanced) Whether the match replay exists in the server' },
+ ]
+ },
+ MatchSeed: {
+ kind: 'Class',
+ fields: [
+ { name: 'id', type: 'String?', description: "Seed id if it's a ranked filtered seed. This is not the seed number. It is null if the seed is not filtered." },
+ { name: 'overworld', type: 'String?', description: 'Overworld structure type of the seed. It is null if the seed is not filtered.' },
+ { name: 'nether', type: 'String?', description: 'Bastion remnants type of the seed. It is null if the seed is not filtered.' },
+ { name: 'endTowers', type: 'Integer[]', description: 'The zero related tower heights of in The End dimension. It is an empty array if the seed is not filtered.' },
+ { name: 'variations', type: 'String[]', description: 'Noticeable variations of the seed. It is an empty array if the seed is not filtered.' },
+ ]
+ },
+ UserIdentifier: {
+ kind: 'String',
+ description: 'Identifier used when getting user information. You must use one of the formats below.',
+ variants: [
+ { type: 'UUID', description: 'UUID of User. You can also use it with dashes (-).', example: 'bbc886da1b024739b4b80f1542e9f61d' },
+ { type: 'Nickname', description: 'Nickname of User. It is not case-sensitive.', example: 'RED_LIME' },
+ { type: 'Discord ID', description: 'Linked Discord ID (Snowflake) of User. Must be discord.[ID] format.', example: 'discord.338669823167037440' },
+ ]
+ },
+ MatchType: {
+ kind: 'Integer',
+ values: [
+ { value: 1, description: 'Casual Match' },
+ { value: 2, description: 'Ranked Match' },
+ { value: 3, description: 'Private Room Match' },
+ { value: 4, description: 'Event Mode Match' },
+ ]
+ },
+ Date: {
+ kind: 'Integer',
+ description: 'Displays a specific date as an epoch time (timestamp) in seconds. (NOT milliseconds!)',
+ },
+ Time: {
+ kind: 'Integer',
+ description: 'Displays a specific duration in milliseconds.',
+ },
+};
+
+
+function buildObjectContainer(name, obj) {
+ const id = 'objects-' + name.toLowerCase();
+ const labelClass = obj.kind === 'Class' ? 'label-success' : 'label-primary';
+
+ if (!obj.fields && !obj.variants && !obj.values) {
+ // Simple type (Date, Time) — just title + description
+ return /*html*/ `
+
${obj.kind} ${name}
+ ${obj.description || ''}
+
+
`;
+ }
+
+ let bodyHtml = '';
+
+ if (obj.fields) {
+ // Class with fields table
+ const noteHtml = obj.note ? obj.note : '';
+ const rows = obj.fields.map(f =>
+ `| ${f.name} | ${f.type} | ${f.description || ''} |
`
+ ).join('');
+ bodyHtml = `
+ ${noteHtml}
+ | Parameter | Type | Description |
+ ${rows}
+
`;
+ } else if (obj.variants) {
+ // String type with variant formats (UserIdentifier)
+ const rows = obj.variants.map(v =>
+ `| ${v.type} | ${v.description} | ${v.example} |
`
+ ).join('');
+ bodyHtml = `
+ | Type | Description | Example |
+ ${rows}
+
`;
+ } else if (obj.values) {
+ // Integer enum (MatchType)
+ const rows = obj.values.map(v =>
+ `${v.value} | ${v.description} |
`
+ ).join('');
+ bodyHtml = `
+ | Value | Description |
+ ${rows}
+
`;
+ }
+
+ const descHtml = obj.description ? `${obj.description}
` : '';
+
+ return /*html*/ `
+
${obj.kind} ${name}
+ ${descHtml}
+
+
+
`;
+}
+
+function buildObjectSidebar(name, obj) {
+ const id = 'objects-' + name.toLowerCase();
+ const labelClass = obj.kind === 'Class' ? 'label-success' : 'label-primary';
+ return `${obj.kind} ${name}`;
+}
diff --git a/index.html b/index.html
index 5a1fe8b..ece123b 100644
--- a/index.html
+++ b/index.html
@@ -61,16 +61,7 @@
Objects
@@ -222,399 +213,8 @@ Sample Response
-
-
Class UserProfile
-
-
-
-
-
-
- | Parameter |
- Type |
- Description |
-
-
-
-
- | uuid |
- String |
- User's UUID |
-
-
- | nickname |
- String |
- User's nickname |
-
-
- | roleType |
- Integer |
- User's role type |
-
-
- | eloRate |
- Integer? |
- User's Elo rate. It is null if the user hasn't finished placement matches. |
-
-
- | eloRank |
- Integer? |
- User's Elo rank |
-
-
- | country |
- String? |
- User's country code in lowercased ISO 3166-1 alpha-2 format. |
-
-
-
-
-
-
-
-
-
-
Class Achievement
-
-
-
-
-
-
- | Parameter |
- Type |
- Description |
-
-
-
-
- | id |
- String |
- Achievement Identifier |
-
-
- | date |
- Date |
- Timestamp of when the achievement was earned |
-
-
- | data |
- String[] |
- Additional data array |
-
-
- | level |
- Integer |
- Level of achievement |
-
-
- | value |
- Integer? |
- Contains the current player's progression of the achievement. It is null if the achievement is not a leveling one. |
-
-
- | goal |
- Integer? |
- Next level goal of the achievement. It is null if the achievement is at max level or not a leveling one. |
-
-
-
-
-
-
-
-
-
-
Class MatchInfo
-
-
-
-
- Advanced parameters are only available with /matches/{match_id} endpoint.
-
-
- | Parameter |
- Type |
- Description |
-
-
-
-
- | id |
- String |
- |
-
-
- | type |
- MatchType |
- |
-
-
- | season |
- Integer |
- |
-
-
- | category |
- String? |
- Match completions category. Default is ANY |
-
-
- | date |
- Date |
- |
-
-
- | players |
- UserProfile[] |
- |
-
-
- | spectators |
- UserProfile[] |
- |
-
-
- | seed |
- MatchSeed? |
- Seed ID if it's a ranked filtered seed. This is not the seed number. It is null if the seed is not filtered. |
-
-
- | result.uuid |
- String? |
- Winner's UUID. It is null if the match was a draw. |
-
-
- | result.time |
- Time |
- |
-
-
- | forfeited |
- Boolean |
- Whether the match has no completions |
-
-
- | decayed |
- Boolean |
- Whether the match has decayed |
-
-
- | rank.season |
- Integer? |
- Record rank of the match's season |
-
-
- | rank.allTime |
- Integer? |
- Record rank of all-time |
-
-
- | changes[].uuid |
- String |
- UUID of player |
-
-
- | changes[].change |
- Integer? |
- Amount of changed Elo rate. It is null if the match is a placement. |
-
-
- | changes[].eloRate |
- Integer? |
- Elo rate of the player. It is null if the match is a placement. |
-
-
- | tag |
- String? |
- Special tag of this match. Used to get matches by tag. |
-
-
- | beginner |
- Boolean |
- Whether beginner mode is enabled in the match. |
-
-
- | vod[].uuid |
- String |
- UUID of VOD owner. Only players with public stream activated will be included. |
-
-
- | vod[].url |
- String |
- VOD URL of this match |
-
-
- | vod[].startsAt |
- Date |
- VOD start date. You can get a timestamp with {date} - {vod[].startsAt} |
-
-
- | completions[].uuid |
- String |
- (Advanced) Player uuid of completion |
-
-
- | completions[].time |
- Time |
- (Advanced) Match time of completion |
-
-
- | timelines[].uuid |
- String |
- (Advanced) Player uuid of timeline |
-
-
- | timelines[].time |
- Time |
- (Advanced) Match time of timeline |
-
-
- | timelines[].type |
- String |
- (Advanced) Identifier of timeline |
-
-
- | replayExist |
- Boolean |
- (Advanced) Whether the match replay exists in the server |
-
-
-
-
-
-
-
-
-
-
Class MatchSeed
-
-
-
-
-
-
- | Parameter |
- Type |
- Description |
-
-
-
-
- | id |
- String? |
- Seed id if it's a ranked filtered seed. This is not the seed number. It is null if the seed is not filtered. |
-
-
- | overworld |
- String? |
- Overworld structure type of the seed. It is null if the seed is not filtered. |
-
-
- | nether |
- String? |
- Bastion remnants type of the seed. It is null if the seed is not filtered. |
-
-
- | endTowers |
- Integer[] |
- The zero related tower heights of in The End dimension. It is an empty array if the seed is not filtered. |
-
-
- | variations |
- String[] |
- Noticeable variations of the seed. It is an empty array if the seed is not filtered. |
-
-
-
-
-
-
-
-
-
-
String UserIdentifier
-
Identifier used when getting user information. You must use one of the formats below.
-
-
-
-
-
-
- | Type |
- Description |
- Example |
-
-
-
-
- | UUID |
- UUID of User. You can also use it with dashes (-). |
- bbc886da1b024739b4b80f1542e9f61d |
-
-
- | Nickname |
- Nickname of User. It is not case-sensitive. |
- RED_LIME |
-
-
- | Discord ID |
- Linked Discord ID (Snowflake) of User. Must be discord.[ID] format. |
- discord.338669823167037440 |
-
-
-
-
-
-
-
-
-
-
Integer MatchType
-
-
-
-
-
-
- | Value |
- Description |
-
-
-
-
- 1 |
- Casual Match |
-
-
- 2 |
- Ranked Match |
-
-
- 3 |
- Private Room Match |
-
-
- 4 |
- Event Mode Match |
-
-
-
-
-
-
-
-
-
-
Integer Date
- Displays a specific date as an epoch time (timestamp) in seconds. (NOT milliseconds!)
-
-
-
-
Integer Time
- Displays a specific duration in milliseconds.
-
-
+
+
@@ -632,6 +232,7 @@ Displays a specific duration in milliseconds.
+