BeatLeader_Players.js

const { beatleader } = require('../api_urls.json').urls
const { parseSearchOptions } = require('./utility/parseSearchOptions')

/**
 * Interact with the BeatLeader Players API endpoints
 * @namespace BeatLeader.Players
 * @memberof BeatLeader
 */

/**
 * Retrieves a list of players based on filters
 * @function get 
 * @memberof BeatLeader.Players
 * @param {object} playerSearchOptions Optional filters to help narrow search. See table below for valid parameters.
 * | Parameter           | Type                    | Description                          | Valid Values                                                                                       |
 * |---------------------|-------------------------|--------------------------------------|-----------------------------------------------------------------------------------------------------|
 * | sortBy              | PlayerSortBy            | (Optional) Sorting criteria          | `0`, `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `10`, `11`, `12`, `13`, `14`, `15`, `16`, `17`, `"pp"`, `"topPp"`, `"name"`, `"rank"`, `"acc"`, `"weightedAcc"`, `"top1Count"`, `"top1Score"`, `"weightedRank"`, `"topAcc"`, `"hmd"`, `"playCount"`, `"score"`, `"lastplay"`, `"maxStreak"`, `"replaysWatched"`, `"dailyImprovements"`, `"timing"` |
 * | page                | number                  | (Optional) Page number               | N/A                                                                                                 |
 * | count               | number                  | (Optional) Number of items per page  | N/A                                                                                                 |
 * | search              | string                  | (Optional) Search query              | N/A                                                                                                 |
 * | order               | Order                   | (Optional) Sorting order             | `"asc"`, `"desc"`                                                                                       |
 * | countries           | Array<string>           | (Optional) List of country codes     | N/A                                                                                                 |
 * | mapsType            | MapsType                | (Optional) Map type                  | `0`, `1`, `2`, `"ranked"`, `"unranked"`, `"all"`                                                                |
 * | ppType              | PpType                  | (Optional) PP type                   | N/A                                                                                                 |
 * | leaderboardContext  | LeaderboardContexts     | (Optional) Context of the leaderboard | `0`, `2`, `4`, `8`, `16`, `32`, `64`, `128`, `"none"`, `"general"`, `"noMods"`, `"noPause"`, `"golf"`, `"sCPM"`, `"speedrun"`, `"speedrunBackup"` |
 * | friends             | boolean                 | (Optional) Filter by friends         | N/A                                                                                                 |
 * | pp_range            | Array<string>           | (Optional) PP range                  | N/A                                                                                                 |
 * | score_range         | Array<string>           | (Optional) Score range               | N/A                                                                                                 |
 * | platform            | Array<string>           | (Optional) Platform filter           | N/A                                                                                                 |
 * | role                | Array<string>           | (Optional) Role filter               | N/A                                                                                                 |
 * | hmd                 | Array<string>           | (Optional) HMD filter                | `0`, `1`, `2`, `4`, `8`, `16`, `32`, `33`, `34`, `35`, `36`, `37`, `38`, `39`, `40`, `41`, `42`, `43`, `44`, `45`, `46`, `47`, `48`, `49`, `50`, `51`, `52`, `53`, `54`, `55`, `56`, `57`, `58`, `59`, `60`, `61`, `62`, `63`, `64`, `65`, `66`, `67`, `68`, `69`, `128`, `256`, `512`, `"unknown"`, `"rift"`, `"vive"`, `"vivePro"`, `"wmr"`, `"riftS"`, `"quest"`, `"picoNeo3"`, `"picoNeo2"`, `"vivePro2"`, `"viveElite"`, `"miramar"`, `"pimax8k"`, `"pimax5k"`, `"pimaxArtisan"`, `"hpReverb"`, `"samsungWmr"`, `"qiyuDream"`, `"disco"`, `"lenovoExplorer"`, `"acerWmr"`, `"viveFocus"`, `"arpara"`, `"dellVisor"`, `"e3"`, `"viveDvt"`, `"glasses20"`, `"hedy"`, `"vaporeon"`, `"huaweivr"`, `"asusWmr"`, `"cloudxr"`, `"vridge"`, `"medion"`, `"picoNeo4"`, `"questPro"`, `"pimaxCrystal"`, `"e4"`, `"index"`, `"controllable"`, `"bigscreenbeyond"`, `"nolosonic"`, `"hypereal"`, `"varjoaero"`, `"viveCosmos"`, `"quest2"`, `"quest3"` |
 * | clans               | Array<string>           | (Optional) Clan filter               | N/A                                                                                                 |
 * | activityPeriod      | number                  | (Optional) Activity period           | N/A                                                                                                 |
 * | banned              | boolean                 | (Optional) Ban filter                | N/A                                                                                                 |
 * @returns {Promise} Returns a promise with a list of players
 */
async function get(playerSearchOptions = {}) {
    try {
        let route = new URL(beatleader + 'players')
        let parsedSearchOptions = parseSearchOptions(playerSearchOptions)
        route += parsedSearchOptions
        let res = await fetch(encodeURI(route))

        if (res.status == 400)
            return Promise.reject(new Error("Invalid request parameters"))
        if (res.status == 404)
            return Promise.reject(new Error("Players not found"))
        if (res.status != 200)
            return Promise.reject(new Error("Undocumented error: " + res.status))

        return res.json()
    } catch (error) {
        throw new Error(error)
    }
}

exports.BeatLeaderGetAllPlayers = get