rosu
rosu is a rust wrapper for osu!.
The wrapper provides access to the osu!api's
beatmap, user, score, user-best, user-recent, and match endpoints.
Note: Only v1 of the osu!api is supported.
An API key can be generated here.
Simply initialize an Osu
client with the api key, call any of its get_*
methods
and await its result.
Examples
use chrono::{offset::TimeZone, DateTime, Utc};
use rosu::{
model::*,
Osu, OsuResult,
};
#[tokio::main]
async fn main() -> OsuResult<()> {
let osu = Osu::new("osu_api_key");
let request = osu.top_scores("Badewanne3")
.mode(GameMode::MNA)
.limit(4);
let mut scores: Vec<Score> = request.await?;
match scores.pop() {
Some(score) => {
let user = score.get_user(&osu).mode(GameMode::STD).await?;
}
None => println!("No top scores found"),
}
let since_date: DateTime<Utc> = Utc
.datetime_from_str("2018-11-13 23:01:28", "%Y-%m-%d %H:%M:%S")
.unwrap();
let request = osu.beatmaps()
.mode(GameMode::MNA)
.limit(3)
.since(since_date)
.mapset_id(945496);
let mut maps: Vec<Beatmap> = request.await?;
if let Some(map) = maps.pop() {
let leaderboard: Vec<Score> = map.get_global_leaderboard(&osu).limit(13).await?;
}
let user: Option<User> = osu.user("Badewanne3").await?;
let osu_match: Match = osu.osu_match(58494587).await?;
Ok(())
}
Features
Flag |
Description |
deps |
serialize |
Provides serialization for all structs in the models dir |
serde-repr |
metrics |
Make the client count each request type and enable a method on the client to get a prometheus::IntCounterVec |
prometheus |
cache |
Cache API results through a redis connection for a given duration |
darkredis, serialize |
Error handling
OsuError
s are nested through their source errors. To read them, one can use a small unwind macro such as:
#[macro_export]
macro_rules! unwind_error {
($log:ident, $err:ident, $($arg:tt)+) => {
{
$log!($($arg)+, $err);
let mut err: &dyn ::std::error::Error = &$err;
while let Some(source) = err.source() {
$log!(" - caused by: {}", source);
err = source;
}
}
};
}
use rosu::{Osu, OsuResult, model::GameMode};
#[tokio::main]
async fn main() {
let osu = Osu::new("osu_api_key");
let mode = GameMode::STD;
if let Err(why) = osu.user("badewanne3").mode(mode).await {
unwind_error!(println, why, "Error while retrieving user for mode {}: {}", mode);
}
}