diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css index 62e557d..7266036 100644 --- a/docs/assets/highlight.css +++ b/docs/assets/highlight.css @@ -11,6 +11,10 @@ --dark-hl-4: #B5CEA8; --light-hl-5: #A31515; --dark-hl-5: #CE9178; + --light-hl-6: #0000FF; + --dark-hl-6: #569CD6; + --light-hl-7: #0070C1; + --dark-hl-7: #4FC1FF; --light-code-background: #FFFFFF; --dark-code-background: #1E1E1E; } @@ -22,6 +26,8 @@ --hl-3: var(--light-hl-3); --hl-4: var(--light-hl-4); --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); --code-background: var(--light-code-background); } } @@ -32,6 +38,8 @@ --hl-3: var(--dark-hl-3); --hl-4: var(--dark-hl-4); --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); --code-background: var(--dark-code-background); } } @@ -42,6 +50,8 @@ --hl-3: var(--light-hl-3); --hl-4: var(--light-hl-4); --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); --code-background: var(--light-code-background); } @@ -52,6 +62,8 @@ --hl-3: var(--dark-hl-3); --hl-4: var(--dark-hl-4); --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); --code-background: var(--dark-code-background); } @@ -61,4 +73,6 @@ .hl-3 { color: var(--hl-3); } .hl-4 { color: var(--hl-4); } .hl-5 { color: var(--hl-5); } +.hl-6 { color: var(--hl-6); } +.hl-7 { color: var(--hl-7); } pre, code { background: var(--code-background); } diff --git a/docs/assets/search.js b/docs/assets/search.js index ad48323..aa78b4b 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/classes/API.html b/docs/classes/API.html index 8ae6882..29fd6e3 100644 --- a/docs/classes/API.html +++ b/docs/classes/API.html @@ -1,5 +1,5 @@ API | osu-api-v2-js

You can create an API instance using its createAsync function!

-

Hierarchy

  • API

Constructors

Hierarchy

  • API

Constructors

  • Use the API's createAsync instead of the default constructor if you don't have at least an access_token! createAsync should always be your way of creating API instances!!

    -

    Parameters

    • Optional client: {
          id: number;
          secret: string;
      }
      • id: number
      • secret: string
    • Optional token_type: string
    • Optional expires: Date
    • Optional access_token: string
    • Optional scopes: Scope[]
    • Optional refresh_token: string
    • Optional user: number
    • verbose: "all" | "none" | "errors" = "none"
    • server: string = "https://osu.ppy.sh"

    Returns API

Properties

access_token: string
client: {
    id: number;
    secret: string;
}

Type declaration

  • id: number
  • secret: string
expires: Date
refresh_token?: string

Valid for an unknown amount of time, allows you to get a new token without going through the Authorization Code Grant! +

Parameters

  • Optional client: {
        id: number;
        secret: string;
    }
    • id: number
    • secret: string
  • Optional token_type: string
  • Optional expires: Date
  • Optional access_token: string
  • Optional scopes: Scope[]
  • Optional refresh_token: string
  • Optional user: number
  • verbose: "all" | "none" | "errors" = "none"
  • server: string = "https://osu.ppy.sh"

Returns API

Properties

access_token: string
client: {
    id: number;
    secret: string;
}

Type declaration

  • id: number
  • secret: string
expires: Date
refresh_token?: string

Valid for an unknown amount of time, allows you to get a new token without going through the Authorization Code Grant! Use the API's refreshToken function to do that

-
scopes: Scope[]
server: string

(default https://osu.ppy.sh) The base url of the server where the requests should land

+
scopes: Scope[]
server: string

(default https://osu.ppy.sh) The base url of the server where the requests should land

Remarks

For tokens, requests will be sent to the oauth/token route, other requests will be sent to the api/v2 route

-
token_type: string

Should always be "Bearer"

-
user?: number

The osu! user id of the user who went through the Authorization Code Grant

-
verbose: "all" | "none" | "errors"

(default none) Which events should be logged

-

Methods

token_type: string

Should always be "Bearer"

+
user?: number

The osu! user id of the user who went through the Authorization Code Grant

+
verbose: "all" | "none" | "errors"

(default none) Which events should be logged

+

Methods

  • Get extensive beatmap data about whichever beatmap you want!

    Parameters

    • beatmap: Beatmap | {
          id: number;
      }

      An object with the id of the beatmap you're trying to get

      -

    Returns Promise<BeatmapExtended>

  • Get various data about the difficulty of a beatmap!

    +

Returns Promise<BeatmapExtended>

  • Get various data about the difficulty of a beatmap!

    Parameters

    • beatmap: Beatmap | {
          id: number;
      }

      The Beatmap in question

    • Optional mods: number | string[] | Mod[]

      Defaults to No Mod, can be a bitset of mods, an array of mod acronyms ("DT" for DoubleTime), or an array of Mods

    • Optional ruleset: Rulesets

      Defaults to the Ruleset the Beatmap was made for, useful to specify if you want a convert

      @@ -58,65 +59,93 @@

      Remarks

      Will ignore the customization of your mods

      Example

      await api.getBeatmapDifficultyAttributes({id: 811925}, ["HR", "HD"])
       
      -
  • Get data about a BeatmapPack using its tag!

    +
  • Get data about a BeatmapPack using its tag!

    Parameters

    • pack: BeatmapPack | {
          tag: string;
      }

      An object with the tag of the beatmappack you're trying to get

    Returns Promise<BeatmapPack>

    Remarks

    Currently in https://osu.ppy.sh/beatmaps/packs, when hovering a pack, its link with its tag should show up on your browser's bottom left

    -
  • Get an Array of up to 100 BeatmapPacks of a specific type!

    +
  • Get an Array of up to 100 BeatmapPacks of a specific type!

    Parameters

    • type: "standard" | "featured" | "tournament" | "loved" | "chart" | "theme" | "artist" = "standard"

      The type of the BeatmapPacks, defaults to "standard"

      -

    Returns Promise<BeatmapPack[]>

  • Get the score on a beatmap made by a specific user (with specific mods and on a specific ruleset if needed)

    +

Returns Promise<BeatmapPack[]>

Returns Promise<Score[]>

Returns Promise<BeatmapExtended[]>

Returns Promise<UserExtended>

Returns Promise<KudosuHistory[]>

Returns Promise<Score[]>

Returns Promise<User[]>

Generated using TypeDoc

\ No newline at end of file +

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/APIError.html b/docs/classes/APIError.html index 8fdaa35..b1019d2 100644 --- a/docs/classes/APIError.html +++ b/docs/classes/APIError.html @@ -1,5 +1,5 @@ APIError | osu-api-v2-js

Class APIError

If the API throws an error, it should always be an APIError!

-

Hierarchy

  • APIError

Constructors

Hierarchy

  • APIError

Constructors

Properties

endpoint message parameters @@ -8,4 +8,4 @@
  • server: string

    The server to which the request was sent

  • endpoint: string

    The type of resource that was requested from the server

  • parameters: string

    The filters that were used to specify what resource was wanted

    -
  • Returns APIError

    Properties

    endpoint: string
    message: string
    parameters: string
    server: string

    Generated using TypeDoc

    \ No newline at end of file +

    Returns APIError

    Properties

    endpoint: string
    message: string
    parameters: string
    server: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/enums/Rulesets.html b/docs/enums/Rulesets.html index ae41042..2909605 100644 --- a/docs/enums/Rulesets.html +++ b/docs/enums/Rulesets.html @@ -1,5 +1,5 @@ -Rulesets | osu-api-v2-js

    Enumeration Rulesets

    Enumeration Members

    fruits +Rulesets | osu-api-v2-js

    Enumeration Rulesets

    Enumeration Members

    Enumeration Members

    fruits: 2
    mania: 3
    osu: 0
    taiko: 1

    Generated using TypeDoc

    \ No newline at end of file +

    Enumeration Members

    fruits: 2
    mania: 3
    osu: 0
    taiko: 1

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/functions/generateAuthorizationURL.html b/docs/functions/generateAuthorizationURL.html index 81d4f87..28901e5 100644 --- a/docs/functions/generateAuthorizationURL.html +++ b/docs/functions/generateAuthorizationURL.html @@ -3,4 +3,4 @@
  • redirect_uri: string

    The specified Application Callback URL, aka where the user will be redirected upon clicking the button to authorize

  • scopes: Scope[]

    What you want to do with/as the user

  • Returns string

    The link people should click on

    -

    Generated using TypeDoc

    \ No newline at end of file +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 68520d1..d6103ac 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,3 +1,3 @@ osu-api-v2-js

    osu-api-v2-js

    osu-api-v2-js

    osu-api-v2-js is a JavaScript & TypeScript package that helps you interact with osu!api (v2).

    -

    It's currently extremely unstable as it's under heavy development, but be sure to come back soon so you can find it in a more stable state with documentation!!

    +

    While it is currently unstable as it's under pretty heavy development, documentation is available on osu-v2.taevas.xyz!

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/Beatmap.html b/docs/interfaces/Beatmap.html index c29ac26..1277546 100644 --- a/docs/interfaces/Beatmap.html +++ b/docs/interfaces/Beatmap.html @@ -1,4 +1,4 @@ -Beatmap | osu-api-v2-js

    Interface Beatmap

    Hierarchy

    Properties

    beatmapset? +Beatmap | osu-api-v2-js

    Interface Beatmap

    Hierarchy

    Properties

    beatmapset?: null | BeatmapsetExtended | Beatmapset

    Beatmapset for Beatmap object, BeatmapsetExtended for BeatmapExtended object, null if the beatmap doesn't have associated beatmapset (e.g. deleted)

    -
    beatmapset_id: number
    checksum?: string
    difficulty_rating: number
    failtimes?: Failtimes
    id: number
    max_combo?: number
    mode: string
    status: string
    total_length: number
    user_id: number
    version: string

    Generated using TypeDoc

    \ No newline at end of file +
    beatmapset_id: number
    checksum?: string
    difficulty_rating: number
    failtimes?: Failtimes
    id: number
    max_combo?: number
    mode: string
    status: string
    total_length: number
    user_id: number
    version: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapExtended.html b/docs/interfaces/BeatmapExtended.html index 071a2a6..b8780e9 100644 --- a/docs/interfaces/BeatmapExtended.html +++ b/docs/interfaces/BeatmapExtended.html @@ -1,4 +1,4 @@ -BeatmapExtended | osu-api-v2-js

    Interface BeatmapExtended

    Hierarchy

    Properties

    accuracy +BeatmapExtended | osu-api-v2-js

    Interface BeatmapExtended

    Hierarchy

    Properties

    Properties

    accuracy: number
    ar: number
    beatmapset?: null | BeatmapsetExtended | Beatmapset

    Beatmapset for Beatmap object, BeatmapsetExtended for BeatmapExtended object, null if the beatmap doesn't have associated beatmapset (e.g. deleted)

    -
    beatmapset_id: number
    bpm: null | number
    checksum?: string
    convert: boolean
    count_circles: number
    count_sliders: number
    count_spinners: number
    cs: number
    deleted_at: null | Date
    difficulty_rating: number
    drain: number
    failtimes?: Failtimes
    hit_length: number
    id: number
    is_scoreable: boolean
    last_updated: Date
    max_combo?: number
    mode: string
    mode_int: number
    passcount: number
    playcount: number
    ranked: RankStatus
    status: string
    total_length: number
    url: string
    user_id: number
    version: string

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    accuracy: number
    ar: number
    beatmapset?: null | BeatmapsetExtended | Beatmapset

    Beatmapset for Beatmap object, BeatmapsetExtended for BeatmapExtended object, null if the beatmap doesn't have associated beatmapset (e.g. deleted)

    +
    beatmapset_id: number
    bpm: null | number
    checksum?: string
    convert: boolean
    count_circles: number
    count_sliders: number
    count_spinners: number
    cs: number
    deleted_at: null | Date
    difficulty_rating: number
    drain: number
    failtimes?: Failtimes
    hit_length: number
    id: number
    is_scoreable: boolean
    last_updated: Date
    max_combo?: number
    mode: string
    mode_int: number
    passcount: number
    playcount: number
    ranked: RankStatus
    status: string
    total_length: number
    url: string
    user_id: number
    version: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapUserScore.html b/docs/interfaces/BeatmapUserScore.html index 4ddd264..c4732a5 100644 --- a/docs/interfaces/BeatmapUserScore.html +++ b/docs/interfaces/BeatmapUserScore.html @@ -1,4 +1,4 @@ -BeatmapUserScore | osu-api-v2-js

    Interface BeatmapUserScore

    Hierarchy

    • BeatmapUserScore

    Properties

    position +BeatmapUserScore | osu-api-v2-js

    Interface BeatmapUserScore

    Hierarchy

    • BeatmapUserScore

    Properties

    Properties

    position: number

    Value depends on the requested mode and mods!

    -
    score: Score

    Generated using TypeDoc

    \ No newline at end of file +
    score: Score

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/Beatmapset.html b/docs/interfaces/Beatmapset.html index 7519a32..28ad73c 100644 --- a/docs/interfaces/Beatmapset.html +++ b/docs/interfaces/Beatmapset.html @@ -1,4 +1,4 @@ -Beatmapset | osu-api-v2-js

    Interface Beatmapset

    Hierarchy

    Properties

    artist +Beatmapset | osu-api-v2-js

    Interface Beatmapset

    Hierarchy

    Properties

    artist: string
    artist_unicode: string
    beatmaps?: BeatmapExtended[]
    converts?: 0 | BeatmapExtended[]
    covers: {
        card: string;
        card@2x: string;
        cover: string;
        cover@2x: string;
        list: string;
        list@2x: string;
        slimcover: string;
        slimcover@2x: string;
    }

    Type declaration

    • card: string
    • card@2x: string
    • cover: string
    • cover@2x: string
    • list: string
    • list@2x: string
    • slimcover: string
    • slimcover@2x: string
    creator: string
    current_nominations?: {
        beatmapset_id: number;
        reset: boolean;
        rulesets: null | Rulesets[];
        user_id: number;
    }[]

    Type declaration

    • beatmapset_id: number
    • reset: boolean
    • rulesets: null | Rulesets[]
    • user_id: number
    current_user_attributes?: any
    description?: {
        description: string;
    }

    Type declaration

    • description: string
    discussions?: any
    events?: any
    favourite_count: number
    genre?: {
        id: number;
        name: string;
    }

    Type declaration

    • id: number
    • name: string
    has_favourited?: boolean
    id: number
    language?: {
        id: number;
        name: string;
    }

    Type declaration

    • id: number
    • name: string
    nominations?: any
    nsfw: boolean
    pack_tags?: string[]
    play_count: number
    preview_url: string
    ratings?: number[]
    recent_favourites?: User[]
    related_users?: User[]
    source: string
    status: string
    title: string
    title_unicode: string
    user?: User
    user_id: number
    video: boolean

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    artist: string
    artist_unicode: string
    beatmaps?: BeatmapExtended[]
    converts?: 0 | BeatmapExtended[]
    covers: {
        card: string;
        card@2x: string;
        cover: string;
        cover@2x: string;
        list: string;
        list@2x: string;
        slimcover: string;
        slimcover@2x: string;
    }

    Type declaration

    • card: string
    • card@2x: string
    • cover: string
    • cover@2x: string
    • list: string
    • list@2x: string
    • slimcover: string
    • slimcover@2x: string
    creator: string
    current_nominations?: {
        beatmapset_id: number;
        reset: boolean;
        rulesets: null | Rulesets[];
        user_id: number;
    }[]

    Type declaration

    • beatmapset_id: number
    • reset: boolean
    • rulesets: null | Rulesets[]
    • user_id: number
    current_user_attributes?: any
    description?: {
        description: string;
    }

    Type declaration

    • description: string
    discussions?: any
    events?: any
    favourite_count: number
    genre?: {
        id: number;
        name: string;
    }

    Type declaration

    • id: number
    • name: string
    has_favourited?: boolean
    id: number
    language?: {
        id: number;
        name: string;
    }

    Type declaration

    • id: number
    • name: string
    nominations?: any
    nsfw: boolean
    pack_tags?: string[]
    play_count: number
    preview_url: string
    ratings?: number[]
    recent_favourites?: User[]
    related_users?: User[]
    source: string
    status: string
    title: string
    title_unicode: string
    user?: User
    user_id: number
    video: boolean

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/BeatmapsetExtended.html b/docs/interfaces/BeatmapsetExtended.html index abb14c2..63cade1 100644 --- a/docs/interfaces/BeatmapsetExtended.html +++ b/docs/interfaces/BeatmapsetExtended.html @@ -1,4 +1,4 @@ -BeatmapsetExtended | osu-api-v2-js

    Interface BeatmapsetExtended

    Hierarchy

    Properties

    artist +BeatmapsetExtended | osu-api-v2-js

    Interface BeatmapsetExtended

    Hierarchy

    Properties

    artist: string
    artist_unicode: string
    availability: {
        download_disabled: boolean;
        more_information: null | string;
    }

    Type declaration

    • download_disabled: boolean
    • more_information: null | string
    beatmaps?: BeatmapExtended[]
    bpm: number
    can_be_hyped: boolean
    converts?: 0 | BeatmapExtended[]
    covers: {
        card: string;
        card@2x: string;
        cover: string;
        cover@2x: string;
        list: string;
        list@2x: string;
        slimcover: string;
        slimcover@2x: string;
    }

    Type declaration

    • card: string
    • card@2x: string
    • cover: string
    • cover@2x: string
    • list: string
    • list@2x: string
    • slimcover: string
    • slimcover@2x: string
    creator: string
    current_nominations?: {
        beatmapset_id: number;
        reset: boolean;
        rulesets: null | Rulesets[];
        user_id: number;
    }[]

    Type declaration

    • beatmapset_id: number
    • reset: boolean
    • rulesets: null | Rulesets[]
    • user_id: number
    current_user_attributes?: any
    deleted_at: null | string
    description?: {
        description: string;
    }

    Type declaration

    • description: string
    discussion_locked: boolean
    discussions?: any
    events?: any
    favourite_count: number
    genre?: {
        id: number;
        name: string;
    }

    Type declaration

    • id: number
    • name: string
    has_favourited?: any
    hype.current: number
    hype.required: number
    id: number
    is_scoreable: boolean
    language?: {
        id: number;
        name: string;
    }

    Type declaration

    • id: number
    • name: string
    last_updated: Date
    legacy_thread_url: null | string
    nominations: {
        current: number;
        required: number;
    }

    Type declaration

    • current: number
    • required: number
    nsfw: boolean
    pack_tags?: string[]
    play_count: number
    preview_url: string
    ranked: RankStatus
    ranked_date: null | Date
    ratings?: number[]
    recent_favourites?: User[]
    related_users?: User[]
    source: string
    status: string
    storyboard: boolean
    submitted_date: null | Date
    tags: string
    title: string
    title_unicode: string
    user?: User
    user_id: number
    video: boolean

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    artist: string
    artist_unicode: string
    availability: {
        download_disabled: boolean;
        more_information: null | string;
    }

    Type declaration

    • download_disabled: boolean
    • more_information: null | string
    beatmaps?: BeatmapExtended[]
    bpm: number
    can_be_hyped: boolean
    converts?: 0 | BeatmapExtended[]
    covers: {
        card: string;
        card@2x: string;
        cover: string;
        cover@2x: string;
        list: string;
        list@2x: string;
        slimcover: string;
        slimcover@2x: string;
    }

    Type declaration

    • card: string
    • card@2x: string
    • cover: string
    • cover@2x: string
    • list: string
    • list@2x: string
    • slimcover: string
    • slimcover@2x: string
    creator: string
    current_nominations?: {
        beatmapset_id: number;
        reset: boolean;
        rulesets: null | Rulesets[];
        user_id: number;
    }[]

    Type declaration

    • beatmapset_id: number
    • reset: boolean
    • rulesets: null | Rulesets[]
    • user_id: number
    current_user_attributes?: any
    deleted_at: null | string
    description?: {
        description: string;
    }

    Type declaration

    • description: string
    discussion_locked: boolean
    discussions?: any
    events?: any
    favourite_count: number
    genre?: {
        id: number;
        name: string;
    }

    Type declaration

    • id: number
    • name: string
    has_favourited?: any
    hype.current: number
    hype.required: number
    id: number
    is_scoreable: boolean
    language?: {
        id: number;
        name: string;
    }

    Type declaration

    • id: number
    • name: string
    last_updated: Date
    legacy_thread_url: null | string
    nominations: {
        current: number;
        required: number;
    }

    Type declaration

    • current: number
    • required: number
    nsfw: boolean
    pack_tags?: string[]
    play_count: number
    preview_url: string
    ranked: RankStatus
    ranked_date: null | Date
    ratings?: number[]
    recent_favourites?: User[]
    related_users?: User[]
    source: string
    status: string
    storyboard: boolean
    submitted_date: null | Date
    tags: string
    title: string
    title_unicode: string
    user?: User
    user_id: number
    video: boolean

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/ChangelogBuild.html b/docs/interfaces/ChangelogBuild.html index 0add962..c11719f 100644 --- a/docs/interfaces/ChangelogBuild.html +++ b/docs/interfaces/ChangelogBuild.html @@ -1,9 +1,18 @@ -ChangelogBuild | osu-api-v2-js

    Interface ChangelogBuild

    Hierarchy

    • ChangelogBuild

    Properties

    changelog_entries? +ChangelogBuild | osu-api-v2-js

    Interface ChangelogBuild

    Hierarchy

    • ChangelogBuild

    Properties

    changelog_entries?: {
        category: string;
        created_at: null | Date;
        github_pull_request_id: null | number;
        github_url: null | string;
        id: null | number;
        major: boolean;
        repository: null | string;
        title: null | string;
        type: string;
        url: null | string;
    }

    Type declaration

    • category: string
    • created_at: null | Date
    • github_pull_request_id: null | number
    • github_url: null | string
    • id: null | number
    • major: boolean
    • repository: null | string
    • title: null | string
    • type: string
    • url: null | string
    created_at: Date
    display_version: string
    id: number
    update_stream: null | UpdateStream
    users: number
    version: null | string
    versions?: {
        next: null | ChangelogBuild;
        previous: null | ChangelogBuild;
    }

    Type declaration

    Generated using TypeDoc

    \ No newline at end of file +youtube_id +

    Properties

    changelog_entries?: {
        category: string;
        created_at: null | Date;
        github_pull_request_id: null | number;
        github_url: null | string;
        github_user?: {
            display_name: string;
            github_url: null | string;
            github_username: null | string;
            id: null | number;
            osu_username: null | string;
            user_id: null | number;
            user_url: null | string;
        };
        id: null | number;
        major: boolean;
        message?: null | string;
        message_html?: null | string;
        repository: null | string;
        title: null | string;
        type: string;
        url: null | string;
    }

    Type declaration

    • category: string
    • created_at: null | Date

      Can be January 1st 1970!

      +
    • github_pull_request_id: null | number
    • github_url: null | string
    • Optional github_user?: {
          display_name: string;
          github_url: null | string;
          github_username: null | string;
          id: null | number;
          osu_username: null | string;
          user_id: null | number;
          user_url: null | string;
      }
      • display_name: string
      • github_url: null | string
      • github_username: null | string
      • id: null | number
      • osu_username: null | string
      • user_id: null | number
      • user_url: null | string
    • id: null | number
    • major: boolean
    • Optional message?: null | string

      Entry message in Markdown format, embedded HTML is allowed, exists only if Markdown was requested

      +
    • Optional message_html?: null | string

      Entry message in HTML format, exists only if HTML was requested

      +
    • repository: null | string
    • title: null | string
    • type: string
    • url: null | string
    created_at: Date
    display_version: string
    id: number
    update_stream: null | UpdateStream
    users: number

    How many users are playing on this version of the game? (if lazer/web, should be 0, lazer doesn't show such stats)

    +
    version: null | string

    The name of the version

    +
    versions?: {
        next: null | ChangelogBuild;
        previous: null | ChangelogBuild;
    }

    The ChangelogBuilds in versions will not have changelog_entries or versions, and users will be 0

    +

    Type declaration

    youtube_id: null | string

    If a video is showcased on the changelog

    +

    Remarks

    The ID of a Youtube video is whatever comes after /watch?v= in its url

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/KudosuHistory.html b/docs/interfaces/KudosuHistory.html index ed9b936..37e580b 100644 --- a/docs/interfaces/KudosuHistory.html +++ b/docs/interfaces/KudosuHistory.html @@ -1,8 +1,8 @@ -KudosuHistory | osu-api-v2-js

    Interface KudosuHistory

    Hierarchy

    • KudosuHistory

    Properties

    action +KudosuHistory | osu-api-v2-js

    Interface KudosuHistory

    Hierarchy

    • KudosuHistory

    Properties

    action: "reset" | "give" | "vote.give" | "vote.reset" | "revoke" | "vote.revoke"
    amount: number
    created_at: Date
    giver: null | {
        url: string;
        username: string;
    }

    Type declaration

    • url: string
    • username: string
    id: number
    model: string
    post: {
        title: string;
        url: null | string;
    }

    Type declaration

    • title: string
    • url: null | string

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    action: "reset" | "give" | "vote.give" | "vote.reset" | "revoke" | "vote.revoke"
    amount: number
    created_at: Date
    giver: null | {
        url: string;
        username: string;
    }

    Type declaration

    • url: string
    • username: string
    id: number
    model: string
    post: {
        title: string;
        url: null | string;
    }

    Type declaration

    • title: string
    • url: null | string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/Leader.html b/docs/interfaces/Leader.html index 359c6c1..9304d26 100644 --- a/docs/interfaces/Leader.html +++ b/docs/interfaces/Leader.html @@ -1,4 +1,4 @@ -Leader | osu-api-v2-js

    Interface Leader

    Hierarchy

    • Leader

    Properties

    accuracy +Leader | osu-api-v2-js

    Interface Leader

    Hierarchy

    • Leader

    Properties

    Properties

    accuracy: number
    attempts: number
    completed: number
    pp: number
    room_id: number
    total_score: number
    user: User
    user_id: number

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    accuracy: number
    attempts: number
    completed: number
    pp: number
    room_id: number
    total_score: number
    user: User
    user_id: number

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/MultiplayerScore.html b/docs/interfaces/MultiplayerScore.html index 0f6d8e0..5065dde 100644 --- a/docs/interfaces/MultiplayerScore.html +++ b/docs/interfaces/MultiplayerScore.html @@ -1,4 +1,4 @@ -MultiplayerScore | osu-api-v2-js

    Interface MultiplayerScore

    Hierarchy

    • MultiplayerScore

    Properties

    accuracy +MultiplayerScore | osu-api-v2-js

    Interface MultiplayerScore

    Hierarchy

    • MultiplayerScore

    Properties

    Properties

    accuracy: number
    beatmap_id: number
    ended_at?: Date
    id: number
    max_combo: number
    mods: Mod[]
    passed: boolean
    playlist_item_id: number
    position?: null | number
    rank: string
    room_id: number
    scores_around: {
        higher: MultiplayerScores;
        lower: MultiplayerScores;
    }

    Type declaration

    • higher: MultiplayerScores
    • lower: MultiplayerScores
    started_at?: Date
    statistics: any
    total_score: number
    user_id: number

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    accuracy: number
    beatmap_id: number
    ended_at?: Date
    id: number
    max_combo: number
    mods: Mod[]
    passed: boolean
    playlist_item_id: number
    position?: null | number
    rank: string
    room_id: number
    scores_around: {
        higher: MultiplayerScores;
        lower: MultiplayerScores;
    }

    Type declaration

    • higher: MultiplayerScores
    • lower: MultiplayerScores
    started_at?: Date
    statistics: any
    total_score: number
    user_id: number

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/PlaylistItem.html b/docs/interfaces/PlaylistItem.html index 83fe553..d23e1a8 100644 --- a/docs/interfaces/PlaylistItem.html +++ b/docs/interfaces/PlaylistItem.html @@ -1,6 +1,6 @@ PlaylistItem | osu-api-v2-js

    Interface PlaylistItem

    Remarks

    This is entirely absent from the official documentation even though it's essential to get scores, due to the playlist system

    -

    Hierarchy

    • PlaylistItem

    Properties

    Hierarchy

    • PlaylistItem

    Properties

    allowed_mods: Mod[]
    beatmap: Beatmap
    beatmap_id: number
    expired: boolean
    id: number
    owner_id: number
    played_at: Date
    playlist_order: number
    required_mods: Mod[]
    room_id: number
    ruleset_id: number

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    allowed_mods: Mod[]
    beatmap: Beatmap
    beatmap_id: number
    expired: boolean
    id: number
    owner_id: number
    played_at: Date
    playlist_order: number
    required_mods: Mod[]
    room_id: number
    ruleset_id: number

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/Room.html b/docs/interfaces/Room.html index 199d42e..e38a850 100644 --- a/docs/interfaces/Room.html +++ b/docs/interfaces/Room.html @@ -1,6 +1,6 @@ Room | osu-api-v2-js

    Interface Room

    Remarks

    This is entirely absent from the official documentation even though it's essential to get scores, due to the playlist system

    -

    Hierarchy

    • Room

    Properties

    Hierarchy

    • Room

    Properties

    Properties

    active: boolean
    auto_skip: boolean
    category: string
    channel_id: number
    current_user_score: {
        [k: string]: any;
    }

    Type declaration

    • [k: string]: any
    ends_at: null | Date
    has_password: boolean
    host: User
    id: number
    max_attempts: null | number
    name: string
    participant_count: number
    playlist: PlaylistItem[]
    queue_mode: string
    recent_participants: User[]
    starts_at: Date
    type: string
    user_id: number

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    active: boolean
    auto_skip: boolean
    category: string
    channel_id: number
    current_user_score: {
        [k: string]: any;
    }

    Type declaration

    • [k: string]: any
    ends_at: null | Date
    has_password: boolean
    host: User
    id: number
    max_attempts: null | number
    name: string
    participant_count: number
    playlist: PlaylistItem[]
    queue_mode: string
    recent_participants: User[]
    starts_at: Date
    type: string
    user_id: number

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/Score.html b/docs/interfaces/Score.html index 66491f5..a7ff022 100644 --- a/docs/interfaces/Score.html +++ b/docs/interfaces/Score.html @@ -1,4 +1,4 @@ -Score | osu-api-v2-js

    Interface Score

    Hierarchy

    • Score

    Properties

    accuracy +Score | osu-api-v2-js

    Interface Score

    Hierarchy

    • Score

    Properties

    Properties

    accuracy: number

    In a format where 96.40% would be 0.9640 (likely with some numbers after the zero)

    -
    beatmap?: Beatmap
    beatmapset?: Beatmapset
    best_id: number
    created_at: Date
    current_user_attributes?: {
        pin: null;
    }

    Type declaration

    • pin: null

      Remarks

      Seems to remain null even if the score is pinned on the user's profile

      +
    beatmap?: Beatmap
    beatmapset?: Beatmapset
    best_id: number
    created_at: Date
    current_user_attributes?: {
        pin: null;
    }

    Type declaration

    • pin: null

      Remarks

      Seems to remain null even if the score is pinned on the user's profile

    Remarks

    Not in the API's documentation, expect it to either be unreliable or disappear

    -
    id: number
    match?: any
    max_combo: number
    mode: string
    mode_int: Rulesets
    mods: 0 | string[]

    0 when NoMod

    -
    passed: boolean
    perfect: boolean
    pp: null | number

    null when Beatmap is Loved (for example)

    -
    rank: string
    rank_country?: any
    rank_global?: any
    replay: boolean
    score: number
    statistics: {
        count_100: number;
        count_300: number;
        count_50: number;
        count_geki: number;
        count_katu: number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: number
    • count_geki: number
    • count_katu: number
    • count_miss: number
    user?: any
    user_id: number

    The ID of the user who made the score

    -
    weight?: any

    Remarks

    Should only exist from the returned object of getUserScores if type is set to best

    -

    Generated using TypeDoc

    \ No newline at end of file +
    id: number
    match?: any
    max_combo: number
    mode: string
    mode_int: Rulesets
    mods: 0 | string[]

    0 when NoMod

    +
    passed: boolean
    perfect: boolean
    pp: null | number

    null when Beatmap is Loved (for example)

    +
    rank: string
    rank_country?: any
    rank_global?: any
    replay: boolean
    score: number
    statistics: {
        count_100: number;
        count_300: number;
        count_50: number;
        count_geki: number;
        count_katu: number;
        count_miss: number;
    }

    Type declaration

    • count_100: number
    • count_300: number
    • count_50: number
    • count_geki: number
    • count_katu: number
    • count_miss: number
    user?: any
    user_id: number

    The ID of the user who made the score

    +
    weight?: any

    Remarks

    Should only exist from the returned object of getUserScores if type is set to best

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/UpdateStream.html b/docs/interfaces/UpdateStream.html index d94055e..e1670f4 100644 --- a/docs/interfaces/UpdateStream.html +++ b/docs/interfaces/UpdateStream.html @@ -1,7 +1,8 @@ -UpdateStream | osu-api-v2-js

    Interface UpdateStream

    Hierarchy

    • UpdateStream

    Properties

    display_name +UpdateStream | osu-api-v2-js

    Interface UpdateStream

    Hierarchy

    • UpdateStream

    Properties

    display_name: null | string
    id: number
    is_featured: boolean
    latest_build: null | ChangelogBuild
    name: string
    user_count: number

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    display_name: null | string
    id: number
    is_featured: boolean
    latest_build: null | ChangelogBuild
    name: string
    user_count: number

    How many users are playing on this? (if lazer/web, should be 0, lazer doesn't show such stats)

    +

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/User.html b/docs/interfaces/User.html index b9e7009..9a57bdb 100644 --- a/docs/interfaces/User.html +++ b/docs/interfaces/User.html @@ -1,4 +1,4 @@ -User | osu-api-v2-js

    Interface User

    Hierarchy

    Properties

    account_history? +User | osu-api-v2-js

    Interface User

    Hierarchy

    Properties

    account_history?: 0 | {
        description: null | string;
        id: number;
        length: number;
        permanent: boolean;
        timestamp: Date;
        type: "note" | "restriction" | "silence";
    }[]
    active_tournament_banner?: null | ProfileBanner
    avatar_url: string
    badges?: 0 | UserBadge[]
    beatmap_playcounts_count?: number
    blocks?: any
    country?: {
        code: string;
        name: string;
    }

    Type declaration

    • code: string
    • name: string
    country_code: string
    cover?: {
        custom_url: null | string;
        id: null | string;
        url: string;
    }

    Type declaration

    • custom_url: null | string
    • id: null | string
    • url: string
    default_group: string
    favourite_beatmapset_count?: number
    follower_count?: number
    friends?: any
    graveyard_beatmapset_count?: number
    groups?: 0 | {
        colour: null | string;
        has_listing: boolean;
        has_playmodes: boolean;
        id: number;
        identifier: string;
        is_probationary: boolean;
        name: string;
        playmodes: null | string[];
        short_name: string;
    }[]
    id: number
    is_active: boolean
    is_bot: boolean
    is_deleted: boolean
    is_online: boolean
    is_restricted?: null | boolean
    is_supported: boolean
    last_visit: null | Date
    loved_beatmapset_count?: number
    monthly_playcounts?: {
        count: number;
        start_date: Date;
    }[]

    Type declaration

    • count: number
    • start_date: Date
    page?: {
        html: string;
        raw: string;
    }

    Type declaration

    • html: string
    • raw: string
    pending_beatmapset_count?: number
    pm_friends_only: boolean
    previous_usernames?: string[]
    profile_colour: null | string
    rank_highest?: null | {
        rank: number;
        updated_at: Date;
    }

    Type declaration

    • rank: number
    • updated_at: Date
    rank_history?: {
        data: number[];
        mode: string;
    }

    Type declaration

    • data: number[]
    • mode: string
    ranked_beatmapset_count?: number
    replays_watched_counts?: {
        count: number;
        start_date: Date;
    }[]

    Type declaration

    • count: number
    • start_date: Date
    scores_best_count?: number
    scores_recent_count?: number
    statistics?: UserStatistics
    statistics_rulesets?: {
        fruits: UserStatistics;
        mania: UserStatistics;
        osu: UserStatistics;
        taiko: UserStatistics;
    }

    Type declaration

    • fruits: UserStatistics
    • mania: UserStatistics
    • osu: UserStatistics
    • taiko: UserStatistics
    support_level?: number
    unread_pm_count?: number

    Remarks

    ...I actually don't know its type and have been unable to figure it out, I'm only presuming it is number

    -
    user_achievements?: {
        achieved_at: Date;
        achievement_id: number;
    }[]

    Type declaration

    • achieved_at: Date
    • achievement_id: number
    user_preferences?: any
    username: string

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    account_history?: 0 | {
        description: null | string;
        id: number;
        length: number;
        permanent: boolean;
        timestamp: Date;
        type: "note" | "restriction" | "silence";
    }[]
    active_tournament_banner?: null | ProfileBanner
    avatar_url: string
    badges?: 0 | UserBadge[]
    beatmap_playcounts_count?: number
    blocks?: any
    country?: {
        code: string;
        name: string;
    }

    Type declaration

    • code: string
    • name: string
    country_code: string
    cover?: {
        custom_url: null | string;
        id: null | string;
        url: string;
    }

    Type declaration

    • custom_url: null | string
    • id: null | string
    • url: string
    default_group: string
    favourite_beatmapset_count?: number
    follower_count?: number
    friends?: any
    graveyard_beatmapset_count?: number
    groups?: 0 | {
        colour: null | string;
        has_listing: boolean;
        has_playmodes: boolean;
        id: number;
        identifier: string;
        is_probationary: boolean;
        name: string;
        playmodes: null | string[];
        short_name: string;
    }[]
    id: number
    is_active: boolean
    is_bot: boolean
    is_deleted: boolean
    is_online: boolean
    is_restricted?: null | boolean
    is_supported: boolean
    kudosu?: {
        available: number;
        total: number;
    }

    Type declaration

    • available: number
    • total: number
    last_visit: null | Date
    loved_beatmapset_count?: number
    monthly_playcounts?: {
        count: number;
        start_date: Date;
    }[]

    Type declaration

    • count: number
    • start_date: Date
    page?: {
        html: string;
        raw: string;
    }

    Type declaration

    • html: string
    • raw: string
    pending_beatmapset_count?: number
    pm_friends_only: boolean
    previous_usernames?: string[]
    profile_colour: null | string
    rank_highest?: null | {
        rank: number;
        updated_at: Date;
    }

    Type declaration

    • rank: number
    • updated_at: Date
    rank_history?: {
        data: number[];
        mode: string;
    }

    Type declaration

    • data: number[]
    • mode: string
    ranked_beatmapset_count?: number
    replays_watched_counts?: {
        count: number;
        start_date: Date;
    }[]

    Type declaration

    • count: number
    • start_date: Date
    scores_best_count?: number
    scores_recent_count?: number
    statistics?: UserStatistics
    statistics_rulesets?: {
        fruits: UserStatistics;
        mania: UserStatistics;
        osu: UserStatistics;
        taiko: UserStatistics;
    }

    Type declaration

    • fruits: UserStatistics
    • mania: UserStatistics
    • osu: UserStatistics
    • taiko: UserStatistics
    support_level?: number
    unread_pm_count?: number

    Remarks

    ...I actually don't know its type and have been unable to figure it out, I'm only presuming it is number

    +
    user_achievements?: {
        achieved_at: Date;
        achievement_id: number;
    }[]

    Type declaration

    • achieved_at: Date
    • achievement_id: number
    user_preferences?: any
    username: string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/docs/interfaces/UserExtended.html b/docs/interfaces/UserExtended.html index 9f5bb60..5f72770 100644 --- a/docs/interfaces/UserExtended.html +++ b/docs/interfaces/UserExtended.html @@ -1,12 +1,12 @@ -UserExtended | osu-api-v2-js

    Interface UserExtended

    Hierarchy

    Properties

    account_history? +UserExtended | osu-api-v2-js

    Interface UserExtended

    Hierarchy

    Properties

    account_history?: 0 | {
        description: null | string;
        id: number;
        length: number;
        permanent: boolean;
        timestamp: Date;
        type: "note" | "restriction" | "silence";
    }[]
    active_tournament_banner?: null | ProfileBanner
    avatar_url: string
    badges?: 0 | UserBadge[]
    beatmap_playcounts_count?: number
    blocks?: any
    country?: {
        code: string;
        name: string;
    }

    Type declaration

    • code: string
    • name: string
    country_code: string
    cover?: {
        custom_url: null | string;
        id: null | string;
        url: string;
    }

    Type declaration

    • custom_url: null | string
    • id: null | string
    • url: string
    cover_url: string
    default_group: string
    discord: null | string
    favourite_beatmapset_count?: number
    follower_count?: number
    friends?: any
    graveyard_beatmapset_count?: number
    groups?: 0 | {
        colour: null | string;
        has_listing: boolean;
        has_playmodes: boolean;
        id: number;
        identifier: string;
        is_probationary: boolean;
        name: string;
        playmodes: null | string[];
        short_name: string;
    }[]
    has_supported: boolean
    id: number
    interests: null | string
    is_active: boolean
    is_bot: boolean
    is_deleted: boolean
    is_online: boolean
    is_restricted?: null | boolean
    is_supported: boolean
    join_date: Date
    kudosu: {
        available: number;
        total: number;
    }

    Type declaration

    • available: number
    • total: number
    last_visit: null | Date
    location: null | string
    loved_beatmapset_count?: number
    max_blocks: number
    max_friends: number
    monthly_playcounts?: {
        count: number;
        start_date: Date;
    }[]

    Type declaration

    • count: number
    • start_date: Date
    occupation: null | string
    page?: {
        html: string;
        raw: string;
    }

    Type declaration

    • html: string
    • raw: string
    pending_beatmapset_count?: number
    playmode: string
    playstyle: string[]
    pm_friends_only: boolean
    post_count: number
    previous_usernames?: string[]
    profile_colour: null | string
    profile_order: ProfilePage[]
    rank_highest?: null | {
        rank: number;
        updated_at: Date;
    }

    Type declaration

    • rank: number
    • updated_at: Date
    rank_history?: {
        data: number[];
        mode: string;
    }

    Type declaration

    • data: number[]
    • mode: string
    ranked_beatmapset_count?: number
    replays_watched_counts?: {
        count: number;
        start_date: Date;
    }[]

    Type declaration

    • count: number
    • start_date: Date
    scores_best_count?: number
    scores_recent_count?: number
    statistics?: UserStatistics
    statistics_rulesets?: {
        fruits: UserStatistics;
        mania: UserStatistics;
        osu: UserStatistics;
        taiko: UserStatistics;
    }

    Type declaration

    • fruits: UserStatistics
    • mania: UserStatistics
    • osu: UserStatistics
    • taiko: UserStatistics
    support_level?: number
    title: null | string
    title_url: null | string
    twitter: null | string
    unread_pm_count?: number

    Remarks

    ...I actually don't know its type and have been unable to figure it out, I'm only presuming it is number

    -
    user_achievements?: {
        achieved_at: Date;
        achievement_id: number;
    }[]

    Type declaration

    • achieved_at: Date
    • achievement_id: number
    user_preferences?: any
    username: string
    website: null | string

    Generated using TypeDoc

    \ No newline at end of file +

    Properties

    account_history?: 0 | {
        description: null | string;
        id: number;
        length: number;
        permanent: boolean;
        timestamp: Date;
        type: "note" | "restriction" | "silence";
    }[]
    active_tournament_banner?: null | ProfileBanner
    avatar_url: string
    badges?: 0 | UserBadge[]
    beatmap_playcounts_count?: number
    blocks?: any
    country: {
        code: string;
        name: string;
    }

    Type declaration

    • code: string
    • name: string
    country_code: string
    cover: {
        custom_url: null | string;
        id: null | string;
        url: string;
    }

    Type declaration

    • custom_url: null | string
    • id: null | string
    • url: string
    cover_url: string
    default_group: string
    discord: null | string
    favourite_beatmapset_count?: number
    follower_count?: number
    friends?: any
    graveyard_beatmapset_count?: number
    groups?: 0 | {
        colour: null | string;
        has_listing: boolean;
        has_playmodes: boolean;
        id: number;
        identifier: string;
        is_probationary: boolean;
        name: string;
        playmodes: null | string[];
        short_name: string;
    }[]
    has_supported: boolean
    id: number
    interests: null | string
    is_active: boolean
    is_bot: boolean
    is_deleted: boolean
    is_online: boolean
    is_restricted?: null | boolean
    is_supported: boolean
    join_date: Date
    kudosu: {
        available: number;
        total: number;
    }

    Type declaration

    • available: number
    • total: number
    last_visit: null | Date
    location: null | string
    loved_beatmapset_count?: number
    max_blocks: number
    max_friends: number
    monthly_playcounts?: {
        count: number;
        start_date: Date;
    }[]

    Type declaration

    • count: number
    • start_date: Date
    occupation: null | string
    page?: {
        html: string;
        raw: string;
    }

    Type declaration

    • html: string
    • raw: string
    pending_beatmapset_count?: number
    playmode: string
    playstyle: string[]
    pm_friends_only: boolean
    post_count: number
    previous_usernames?: string[]
    profile_colour: null | string
    profile_order: ProfilePage[]
    rank_highest?: null | {
        rank: number;
        updated_at: Date;
    }

    Type declaration

    • rank: number
    • updated_at: Date
    rank_history?: {
        data: number[];
        mode: string;
    }

    Type declaration

    • data: number[]
    • mode: string
    ranked_beatmapset_count?: number
    replays_watched_counts?: {
        count: number;
        start_date: Date;
    }[]

    Type declaration

    • count: number
    • start_date: Date
    scores_best_count?: number
    scores_recent_count?: number
    statistics?: UserStatistics
    statistics_rulesets?: {
        fruits: UserStatistics;
        mania: UserStatistics;
        osu: UserStatistics;
        taiko: UserStatistics;
    }

    Type declaration

    • fruits: UserStatistics
    • mania: UserStatistics
    • osu: UserStatistics
    • taiko: UserStatistics
    support_level?: number
    title: null | string
    title_url: null | string
    twitter: null | string
    unread_pm_count?: number

    Remarks

    ...I actually don't know its type and have been unable to figure it out, I'm only presuming it is number

    +
    user_achievements?: {
        achieved_at: Date;
        achievement_id: number;
    }[]

    Type declaration

    • achieved_at: Date
    • achievement_id: number
    user_preferences?: any
    username: string
    website: null | string

    Generated using TypeDoc

    \ No newline at end of file diff --git a/lib/index.ts b/lib/index.ts index cb5e053..5e6dff8 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -418,7 +418,7 @@ export class API { /** * Get extensive beatmapset data about whichever beatmapset you want! - * @param beatmap An object with the id of the beatmapset you're trying to get + * @param beatmapset An object with the id of the beatmapset you're trying to get */ async getBeatmapset(beatmapset: {id: number} | Beatmapset): Promise { const response = await this.request("get", `beatmapsets/${beatmapset.id}`) @@ -485,13 +485,18 @@ export class API { // MULTIPLAYER STUFF + /** + * Get data about a lazer multiplayer room (realtime or playlists)! + * @param room An object with the id of the room, is at the end of its URL (after `/multiplayer/rooms/`) + */ async getRoom(room: {id: number} | Room): Promise { const response = await this.request("get", `rooms/${room.id}`) return correctType(response) as Room } /** - * Get room data for each room fitting the given criterias + * Get rooms that are active, that have ended, that the user participated in, that the user made, or just simply any room! + * @param mode Self-explanatory enough, defaults to `active` * @scope public */ async getRooms(mode: "active" | "all" | "ended" | "participated" | "owned" = "active"): Promise { @@ -500,7 +505,8 @@ export class API { } /** - * Get the room stats of a user from the room, for each user of that room + * Get the room stats of all the users of that room! + * @param room An object with the id of the room in question * @scope public */ async getRoomLeaderboard(room: {id: number} | Room): Promise { @@ -509,8 +515,7 @@ export class API { } /** - * Get the scores on a specific item of a room - * @scope public + * Get the scores on a specific item of a room, for a maximum of 50! * @remarks (2023-11-10) Items are broken for multiplayer (real-time) rooms, not for playlists (like spotlights), that's an osu! bug * https://github.com/ppy/osu-web/issues/10725 */ @@ -520,7 +525,7 @@ export class API { } /** - * @remarks For multiplayer lobbies from the stable (non-lazer) client, with URLs having `community/matches` or `mp` + * Get data of a multiplayer lobby from the stable (non-lazer) client that have URLs with `community/matches` or `mp` * @param id Can be found at the end of the URL of said match */ async getMatch(id: number): Promise { @@ -529,8 +534,7 @@ export class API { } /** - * Gets the info of the 50 most recently created matches, descending order (most recent is at index 0) - * @remarks For multiplayer lobbies from the stable (non-lazer) client, with URLs having `community/matches` or `mp` + * Gets the info of the 50 most recently created stable (non-lazer) matches, descending order (most recent is at index 0) */ async getMatches(): Promise { const response = await this.request("get", "matches") diff --git a/lib/tests/test.ts b/lib/tests/test.ts index 1c73e07..755bec9 100644 --- a/lib/tests/test.ts +++ b/lib/tests/test.ts @@ -109,6 +109,25 @@ const testChangelogStuff = async (): Promise => { const testMultiplayerStuff = async (): Promise => { let okay = true + let d1 = await | false>>attempt("\ngetRoom (realtime): ", api.getRoom({id: 231069})) + if (!isOk(d1, !d1 || (d1.recent_participants.length === 4))) okay = false + let d2 = await | false>>attempt("getRoom (playlist): ", api.getRoom({id: 51693})) + if (!isOk(d2, !d2 || (d2.participant_count === 159))) okay = false + if (d1) { // can't bother getting and writing down the id of a playlist item + let d3 = await | false>>attempt( + "getPlaylistItemScores (realtime): ", api.getPlaylistItemScores({id: d1.playlist[0].id, room_id: d1.id})) + !isOk(d3, !d3 || (d3.length > 0)) ? console.log("Bug not fixed yet...") : console.log("Bug fixed!!! :partying_face:") + } + if (d2) { // still can't bother getting and writing down the id of a playlist item + let d4 = await | false>>attempt( + "getPlaylistItemScores (playlist): ", api.getPlaylistItemScores({id: d2.playlist[0].id, room_id: d2.id})) + if (!isOk(d4, !d4 || (d4.length >= 50))) okay = false + } + let d5 = await | false>>attempt("getMatch: ", api.getMatch(62006076)) + if (!isOk(d5, !d5 || (d5.match.name === "CWC2020: (Italy) vs (Indonesia)"))) okay = false + let d6 = await | false>>attempt("getMatches: ", api.getMatches()) + if (!isOk(d6, !d6 || (d6[0].id > 111250329))) okay = false + return okay } diff --git a/lib/tests/test_authorized.ts b/lib/tests/test_authorized.ts index d489cc2..0da07a2 100644 --- a/lib/tests/test_authorized.ts +++ b/lib/tests/test_authorized.ts @@ -22,10 +22,10 @@ async function test(id: string | undefined, secret: string | undefined, redirect let api = await osu.API.createAsync({id: Number(id), secret}, {code, redirect_uri}, "all") if (api) { - let d1 = await api.getRanking(osu.Rulesets.osu, "performance", 1, "friends") + let d1 = await api.getRoom({id: 231069}) if (d1) { - d1.ranking = [d1.ranking[0]] - console.log(d1) + let d2 = await api.getPlaylistItemScores({id: d1.playlist[0].id, room_id: 231069}) + console.log(d2) } } } diff --git a/package.json b/package.json index 4305268..198b8d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "osu-api-v2-js", - "version": "0.3.1", + "version": "0.3.2", "description": "Package to easily access osu!api version 2.0", "type": "module", "main": "dist/index.js",