crates.io docs

rosu-v2

rosu-v2 is a wrapper for the osu!api v2. As such, it provides a bunch of additional endpoints and data over rosu which wraps the osu!api v1.

However, osu!'s api v2 is still very much a WIP and also weakly documented. Hence, there is a chance that some things might break either because of changes in the api or because the response is not being parsed properly.

Feel free to open an issue when things don't work as expected.

Authentication

Unlike api v1, api v2 does not require an api key by users. Instead, it requires a client id and a client secret.

To get those, you must register an application here. Unless you're interested in logging into the API through an osu! account, the callback URL here does not matter and can be left blank.

If you went through the OAuth process for a user, you can provide the callback URL and received code when creating the client in order to make requests on behalf of the authenticated user.

Endpoints

The following endpoints are currently supported:

The api itself provides a bunch more endpoints which are not yet implemented because they're really niche and/or missing any documentation.

If you find an endpoint on the api page that you want to use but is missing in rosu-v2, feel free to open an issue.

Usage

```rust // For convenience sake, all types can be found in the prelude module use rosu_v2::prelude::*;

[tokio::main]

async fn main() { // Initialize the client let clientid: u64 = 0; let clientsecret: String = String::from(""); let osu: Osu = match Osu::new(clientid, clientsecret).await { Ok(client) => client, Err(why) => panic!( "Failed to create client or make initial osu!api interaction: {}", why ), };

// Get peppy's top 10-15 scores in osu!standard.
// Note that the username here can only be used because of the `cache` feature.
// If you are fine with just providing user ids, consider disabling this feature.
let scores: Vec<Score> = osu.user_scores("peppy")
    .mode(GameMode::STD)
    .best() // top scores; alternatively .recent(), .pinned(), or .firsts()
    .offset(10)
    .limit(5)
    .await
    .unwrap_or_else(|why| panic!("Failed to get scores: {}", why));

// Search non-nsfw loved mania maps matching the given query.
// Note that the order of called methods doesn't matter for any endpoint.
let search_result: BeatmapsetSearchResult = osu.beatmapset_search()
    .nsfw(false)
    .status(RankStatus::Loved)
    .mode(GameMode::MNA)
    .query("blue army stars>3")
    .await
    .unwrap_or_else(|why| panic!("Failed to search mapsets: {}", why));

// Get the german wiki page on hit objects
let wiki_page: WikiPage = osu.wiki("de")
    .page("Hit_object")
    .await
    .unwrap_or_else(|why| panic!("Failed to get wiki page: {}", why));

} ```

Features

| Flag | Description | deps |-----|-----|-----| | default | Enable the cache feature | | cache | Cache username-user_id pairs so that usernames can be used on all user endpoints instead of only user ids | dashmap | metrics | Provide a count of all request types the client makes with the function Osu::metrics returning a prometheus::IntCounterVec | prometheus | rkyv | Implement rkyv's Archive, Deserialize, and Serialize for most types, allowing for insanely fast (de)serializing. | rkyv