@zeepkist/combine v3.2.0
Zeepkist Leaderboard Combiner
Combines leaderboard data from the monthly Zeepkist Super League (ZSL) events into a single dataset per event.
How to use
Pre-requisites
Install the following system dependencies:
- Node.js (19.5.0 or newer)
Install the following Zeepkist plugins:
Configure the Leaderboard Logger plugin
Open the logger config file (Zeepkist/BepInEx/config/net.tnrd.zeepkist.leaderboardlogger.cfg) and set the options to:
[Formatting]
Filename = %Date:yyyyMMddTHHmmss%_%LevelUid%_Xw==_%Name%.csv
Entry = %SteamId%,%Username%,%Time%,%ZeepkistId%,%ColorId%,%HatId%Save the leaderboard data in Zeepkist
Run Zeepkist and use /start log at the start of each level in an online room to log the leaderboard data (you do not need to be host)
Log files are saved to %userprofile%\AppData\Roaming\Zeepkist\Leaderboard Logs
Install this app
npm install -g @zeepkist/combineRun this app
Create a new folder for the event and move the leaderboard logs into the folder. E.g %userprofile%\AppData\Roaming\Zeepkist\Leaderboard Logs\Example Event
Run the app with the following command:
super-league --input 'Example Event' --output 'Example Event Results'The app will output the combined leaderboard data to the Example Event Results folder.
Multiple Events (with Season Standings)
If you have multiple events in the same season, you can combine them all into a single season standings with individual results for each event by running the app on the parent folder. E.g %userprofile%\AppData\Roaming\Zeepkist\Leaderboard Logs\Season 1\Example Event
super-league --input 'Season 1' --output 'Season 1 Results'Multiple Seasons
If you have multiple seasons, you can generate all seasons at once by running the app on the parent folder. E.g %userprofile%\AppData\Roaming\Zeepkist\Leaderboard Logs\Seasons\Season 1\Example Event
super-league --input 'Seasons' --output 'Seasons Results'Input File Structure
Single Event
One or more CSV leaderboard logs in the input folder
Input Folder
├── 20221204T180734_18112022-104248521-AuthorName-481758454581-1683_Xw==_RoomName.csv
├── 2021-01-01T12:00:00_1234567890_Example Level 2.csv
└── 2021-01-01T12:00:00_1234567890_Example Level 3.csvMultiple Events (with Season Standings)
One or more folders in the input folder each containing one or more CSV leaderboard logs
Input Folder
├── Example Event 1
│ └── 20221204T180734_18112022-104248521-AuthorName-481758454581-1683_Xw==_RoomName.csv
└── Example Event 2
└── 20221204T180734_18112022-104248521-AuthorName-481758454581-1683_Xw==_RoomName.csvMultiple Seasons
One or more folders in the input folder each containing one or more events (see above)
Input Folder
├── Season 1
│ ├── Example Event 1
│ │ └── 20221204T180734_18112022-104248521-AuthorName-481758454581-1683_Xw==_RoomName.csv
│ └── Example Event 2
│ └── 20221204T180734_18112022-104248521-AuthorName-481758454581-1683_Xw==_RoomName.csv
└── Season 2
├── Example Event 1
│ └── 20221204T180734_18112022-104248521-AuthorName-481758454581-1683_Xw==_RoomName.csv
└── Example Event 2
└── 20221204T180734_18112022-104248521-AuthorName-481758454581-1683_Xw==_RoomName.csvOutput File Structure
Single Event
Output Folder
└── Output Folder.jsonMultiple Events (with Season Standings)
Output Folder
├── metadata.json
├── standings.json
├── Example Event 1.json
└── Example Event 2.jsonMultiple Seasons
Output Folder
├── metadata.json # auto-generated file containing metadata for all seasons
├── Season 1
│ ├── metadata.json
│ ├── standings.json
│ ├── Example Event 1.json
│ └── Example Event 2.json
└── Season 2
├── metadata.json
├── standings.json
├── Example Event 1.json
└── Example Event 2.jsonMetadata Files (Optional)
You can add metadata to events and seasons by creating a metadata.json file in the season folder.
Metadata allows you to:
- Add a custom name and workshop ID to each event of a season.
- Change the point system for a season
Given the input folder structure of multiple events:
Input Folder
├── metadata.json
├── 2023-01-01
│ └── *.csv
└── 2023-02-01
└── *.csvGiven the input folder structure of multiple seasons:
Input Folder
└── Season 1
├── metadata.json
├── 2023-01-01
│ └── *.csv
└── 2023-02-01
└── *.csvThe file should be structured as:
{
"events": {
"2023-01-01": {
"name": "Example Event 1",
"workshopId": "1234"
},
"2023-02-01": {
"name": "Example Event 2",
"workshopId": "5678"
}
},
"points": [10, 7, 5, 3], // 1st, 2nd, 3rd, 4th ... etc,
"finishPoints": 0 // points for finishing the level (any position not covered by the "points" array, e.g 5th or lower in example above)
}