{"id":51151165,"url":"https://github.com/zeepkist/combine","last_synced_at":"2026-06-26T06:03:24.047Z","repository":{"id":65553825,"uuid":"594571330","full_name":"zeepkist/combine","owner":"zeepkist","description":"Converts Zeepkist Logger files into aggregated leaderboards and season standings","archived":false,"fork":false,"pushed_at":"2026-06-17T19:03:46.000Z","size":8206,"stargazers_count":3,"open_issues_count":9,"forks_count":0,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2026-06-17T21:05:43.734Z","etag":null,"topics":["cli","csv","nodejs","npm","npm-module","npm-package","typescript","typescript-library","zeepkist"],"latest_commit_sha":null,"homepage":"https://npmjs.com/package/@zeepkist/combine","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zeepkist.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"wopian","ko_fi":"wopian","custom":"https://paypal.me/wopian"}},"created_at":"2023-01-29T00:20:58.000Z","updated_at":"2026-05-23T21:11:31.000Z","dependencies_parsed_at":"2026-03-01T13:02:58.129Z","dependency_job_id":null,"html_url":"https://github.com/zeepkist/combine","commit_stats":{"total_commits":50,"total_committers":2,"mean_commits":25.0,"dds":"0.45999999999999996","last_synced_commit":"0a238e86f8f98687e5c5d1e128958baa14d719bc"},"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/zeepkist/combine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zeepkist%2Fcombine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zeepkist%2Fcombine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zeepkist%2Fcombine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zeepkist%2Fcombine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zeepkist","download_url":"https://codeload.github.com/zeepkist/combine/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zeepkist%2Fcombine/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34805089,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-26T02:00:06.560Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","csv","nodejs","npm","npm-module","npm-package","typescript","typescript-library","zeepkist"],"created_at":"2026-06-26T06:03:23.256Z","updated_at":"2026-06-26T06:03:24.022Z","avatar_url":"https://github.com/zeepkist.png","language":"TypeScript","funding_links":["https://github.com/sponsors/wopian","https://ko-fi.com/wopian","https://paypal.me/wopian"],"categories":[],"sub_categories":[],"readme":"# Zeepkist Leaderboard Combiner\n\nCombines leaderboard data from the monthly Zeepkist Super League (ZSL) events into a single dataset per event.\n\n## How to use\n\n### Pre-requisites\n\nInstall the following system dependencies:\n\n- [Node.js](https://nodejs.org/en/) (19.5.0 or newer)\n\nInstall the following Zeepkist plugins:\n\n- [Leaderboard Logger](https://zeepkist.old.mod.io/leaderboard-logger)\n\n### Configure the Leaderboard Logger plugin\n\nOpen the logger config file (`Zeepkist/BepInEx/config/net.tnrd.zeepkist.leaderboardlogger.cfg`) and set the options to:\n\n```conf\n[Formatting]\nFilename = %Date:yyyyMMddTHHmmss%_%LevelUid%_Xw==_%Name%.csv\nEntry = %SteamId%,%Username%,%Time%,%ZeepkistId%,%ColorId%,%HatId%\n```\n\n### Save the leaderboard data in Zeepkist\n\nRun 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)\n\nLog files are saved to `%userprofile%\\AppData\\Roaming\\Zeepkist\\Leaderboard Logs`\n\n### Install this app\n\n```bash\nnpm install -g @zeepkist/combine\n```\n\n### Run this app\n\nCreate a new folder for the event and move the leaderboard logs into the folder. E.g `%userprofile%\\AppData\\Roaming\\Zeepkist\\Leaderboard Logs\\Example Event`\n\nRun the app with the following command:\n\n```bash\nsuper-league --input 'Example Event' --output 'Example Event Results'\n```\n\nThe app will output the combined leaderboard data to the `Example Event Results` folder.\n\n#### Multiple Events (with Season Standings)\n\nIf 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`\n\n```bash\nsuper-league --input 'Season 1' --output 'Season 1 Results'\n```\n\n#### Multiple Seasons\n\nIf 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`\n\n```bash\nsuper-league --input 'Seasons' --output 'Seasons Results'\n```\n\n## Input File Structure\n\n### Single Event\n\nOne or more CSV leaderboard logs in the `input` folder\n\n```text\nInput Folder\n ├── 20221204T180734_18112022-104248521-AuthorName-481758454581-1683_Xw==_RoomName.csv\n ├── 2021-01-01T12:00:00_1234567890_Example Level 2.csv\n └── 2021-01-01T12:00:00_1234567890_Example Level 3.csv\n```\n\n### Multiple Events (with Season Standings)\n\nOne or more folders in the `input` folder each containing one or more CSV leaderboard logs\n\n```text\nInput Folder\n   ├── Example Event 1\n   │   └── 20221204T180734_18112022-104248521-AuthorName-481758454581-1683_Xw==_RoomName.csv\n   └── Example Event 2\n      └── 20221204T180734_18112022-104248521-AuthorName-481758454581-1683_Xw==_RoomName.csv\n```\n\n### Multiple Seasons\n\nOne or more folders in the `input` folder each containing one or more events (see above)\n\n```text\nInput Folder\n   ├── Season 1\n   │   ├── Example Event 1\n   │   │   └── 20221204T180734_18112022-104248521-AuthorName-481758454581-1683_Xw==_RoomName.csv\n   │   └── Example Event 2\n   │      └── 20221204T180734_18112022-104248521-AuthorName-481758454581-1683_Xw==_RoomName.csv\n   └── Season 2\n      ├── Example Event 1\n      │   └── 20221204T180734_18112022-104248521-AuthorName-481758454581-1683_Xw==_RoomName.csv\n      └── Example Event 2\n         └── 20221204T180734_18112022-104248521-AuthorName-481758454581-1683_Xw==_RoomName.csv\n```\n\n## Output File Structure\n\n### Single Event\n\n```text\nOutput Folder\n └── Output Folder.json\n```\n\n### Multiple Events (with Season Standings)\n\n```text\nOutput Folder\n ├── metadata.json\n ├── standings.json\n ├── Example Event 1.json\n └── Example Event 2.json\n```\n\n### Multiple Seasons\n\n```text\nOutput Folder\n ├── metadata.json # auto-generated file containing metadata for all seasons\n ├── Season 1\n │   ├── metadata.json\n │   ├── standings.json\n │   ├── Example Event 1.json\n │   └── Example Event 2.json\n └── Season 2\n     ├── metadata.json\n     ├── standings.json\n     ├── Example Event 1.json\n     └── Example Event 2.json\n```\n\n## Metadata Files (Optional)\n\nYou can add metadata to events and seasons by creating a `metadata.json` file in the season folder.\n\nMetadata allows you to:\n\n- Add a custom name and workshop ID to each event of a season.\n- Change the point system for a season\n\n#### Given the `input` folder structure of multiple events:\n\n```text\nInput Folder\n   ├── metadata.json\n   ├── 2023-01-01\n   │   └── *.csv\n   └── 2023-02-01\n      └── *.csv\n```\n\n#### Given the `input` folder structure of multiple seasons:\n\n```text\nInput Folder\n   └── Season 1\n       ├── metadata.json\n       ├── 2023-01-01\n       │   └── *.csv\n       └── 2023-02-01\n          └── *.csv\n```\n\nThe file should be structured as:\n\n```json\n{\n  \"events\": {\n    \"2023-01-01\": {\n      \"name\": \"Example Event 1\",\n      \"workshopId\": \"1234\"\n    },\n    \"2023-02-01\": {\n      \"name\": \"Example Event 2\",\n      \"workshopId\": \"5678\"\n    }\n  },\n  \"points\": [10, 7, 5, 3], // 1st, 2nd, 3rd, 4th ... etc,\n  \"finishPoints\": 0 // points for finishing the level (any position not covered by the \"points\" array, e.g 5th or lower in example above)\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzeepkist%2Fcombine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzeepkist%2Fcombine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzeepkist%2Fcombine/lists"}