mirror of
https://github.com/natsukagami/youmubot.git
synced 2025-05-24 09:10:49 +00:00
Make OsuClient clone-able
This commit is contained in:
parent
177c714172
commit
8c34c7a3ba
5 changed files with 70 additions and 81 deletions
|
@ -10,11 +10,14 @@ use request::builders::*;
|
|||
use request::*;
|
||||
use reqwest::blocking::{Client as HTTPClient, RequestBuilder, Response};
|
||||
use serenity::framework::standard::CommandError as Error;
|
||||
use std::convert::TryInto;
|
||||
use std::{convert::TryInto, sync::Arc};
|
||||
|
||||
/// Client is the client that will perform calls to the osu! api server.
|
||||
/// It's cheap to clone, so do it.
|
||||
#[derive(Clone)]
|
||||
pub struct Client {
|
||||
key: String,
|
||||
key: Arc<String>,
|
||||
client: HTTPClient,
|
||||
}
|
||||
|
||||
fn vec_try_into<U, T: std::convert::TryFrom<U>>(v: Vec<U>) -> Result<Vec<T>, T::Error> {
|
||||
|
@ -29,52 +32,50 @@ fn vec_try_into<U, T: std::convert::TryFrom<U>>(v: Vec<U>) -> Result<Vec<T>, T::
|
|||
|
||||
impl Client {
|
||||
/// Create a new client from the given API key.
|
||||
pub fn new(key: impl AsRef<str>) -> Client {
|
||||
pub fn new(http_client: HTTPClient, key: String) -> Client {
|
||||
Client {
|
||||
key: key.as_ref().to_string(),
|
||||
key: Arc::new(key),
|
||||
client: http_client,
|
||||
}
|
||||
}
|
||||
|
||||
fn build_request(&self, c: &HTTPClient, r: RequestBuilder) -> Result<Response, Error> {
|
||||
let v = r.query(&[("k", &self.key)]).build()?;
|
||||
fn build_request(&self, r: RequestBuilder) -> Result<Response, Error> {
|
||||
let v = r.query(&[("k", &*self.key)]).build()?;
|
||||
dbg!(v.url());
|
||||
Ok(c.execute(v)?)
|
||||
Ok(self.client.execute(v)?)
|
||||
}
|
||||
|
||||
pub fn beatmaps(
|
||||
&self,
|
||||
client: &HTTPClient,
|
||||
kind: BeatmapRequestKind,
|
||||
f: impl FnOnce(&mut BeatmapRequestBuilder) -> &mut BeatmapRequestBuilder,
|
||||
) -> Result<Vec<Beatmap>, Error> {
|
||||
let mut r = BeatmapRequestBuilder::new(kind);
|
||||
f(&mut r);
|
||||
let res: Vec<raw::Beatmap> = self.build_request(client, r.build(client))?.json()?;
|
||||
let res: Vec<raw::Beatmap> = self.build_request(r.build(&self.client))?.json()?;
|
||||
Ok(vec_try_into(res)?)
|
||||
}
|
||||
|
||||
pub fn user(
|
||||
&self,
|
||||
client: &HTTPClient,
|
||||
user: UserID,
|
||||
f: impl FnOnce(&mut UserRequestBuilder) -> &mut UserRequestBuilder,
|
||||
) -> Result<Option<User>, Error> {
|
||||
let mut r = UserRequestBuilder::new(user);
|
||||
f(&mut r);
|
||||
let res: Vec<raw::User> = self.build_request(client, r.build(client))?.json()?;
|
||||
let res: Vec<raw::User> = self.build_request(r.build(&self.client))?.json()?;
|
||||
let res = vec_try_into(res)?;
|
||||
Ok(res.into_iter().next())
|
||||
}
|
||||
|
||||
pub fn scores(
|
||||
&self,
|
||||
client: &HTTPClient,
|
||||
beatmap_id: u64,
|
||||
f: impl FnOnce(&mut ScoreRequestBuilder) -> &mut ScoreRequestBuilder,
|
||||
) -> Result<Vec<Score>, Error> {
|
||||
let mut r = ScoreRequestBuilder::new(beatmap_id);
|
||||
f(&mut r);
|
||||
let res: Vec<raw::Score> = self.build_request(client, r.build(client))?.json()?;
|
||||
let res: Vec<raw::Score> = self.build_request(r.build(&self.client))?.json()?;
|
||||
let mut res: Vec<Score> = vec_try_into(res)?;
|
||||
|
||||
// with a scores request you need to fill the beatmap ids yourself
|
||||
|
@ -86,32 +87,29 @@ impl Client {
|
|||
|
||||
pub fn user_best(
|
||||
&self,
|
||||
client: &HTTPClient,
|
||||
user: UserID,
|
||||
f: impl FnOnce(&mut UserScoreRequestBuilder) -> &mut UserScoreRequestBuilder,
|
||||
) -> Result<Vec<Score>, Error> {
|
||||
self.user_scores(UserScoreType::Best, client, user, f)
|
||||
self.user_scores(UserScoreType::Best, user, f)
|
||||
}
|
||||
|
||||
pub fn user_recent(
|
||||
&self,
|
||||
client: &HTTPClient,
|
||||
user: UserID,
|
||||
f: impl FnOnce(&mut UserScoreRequestBuilder) -> &mut UserScoreRequestBuilder,
|
||||
) -> Result<Vec<Score>, Error> {
|
||||
self.user_scores(UserScoreType::Recent, client, user, f)
|
||||
self.user_scores(UserScoreType::Recent, user, f)
|
||||
}
|
||||
|
||||
fn user_scores(
|
||||
&self,
|
||||
u: UserScoreType,
|
||||
client: &HTTPClient,
|
||||
user: UserID,
|
||||
f: impl FnOnce(&mut UserScoreRequestBuilder) -> &mut UserScoreRequestBuilder,
|
||||
) -> Result<Vec<Score>, Error> {
|
||||
let mut r = UserScoreRequestBuilder::new(u, user);
|
||||
f(&mut r);
|
||||
let res: Vec<raw::Score> = self.build_request(client, r.build(client))?.json()?;
|
||||
let res: Vec<raw::Score> = self.build_request(r.build(&self.client))?.json()?;
|
||||
let res = vec_try_into(res)?;
|
||||
Ok(res)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue