use crate::error::Result;
use crate::v2::client::request::check::check_res;
use crate::v2::interface::beatmapsets::IBeatmapsets;
use crate::v2::model::beatmapset::structs::beatmapset::Beatmapset;
use crate::v2::model::oauth::structs::o_token::OToken;
use crate::v2::model::search::dtos::params::BeatmapsetsSearchParams;
use crate::v2::model::search::dtos::response::BeatmapsetsSearchResponse;
use tokio::io::AsyncWriteExt;
use std::sync::Arc;
use tokio::sync::RwLock;
#[derive(Clone)]
pub struct ReqwestBeatmapsets {
pub client: reqwest::Client,
pub o_token: Arc<RwLock<OToken>>,
}
impl IBeatmapsets for ReqwestBeatmapsets {
async fn search(&self, params: BeatmapsetsSearchParams) -> Result<BeatmapsetsSearchResponse> {
println!("ReqwestBeatmapsets search");
let access_token = {
let token = self.o_token.read().await;
token.access_token.clone()
};
let params = params.build_params();
let res = self
.client
.get("https://osu.ppy.sh/api/v2/beatmapsets/search")
.header("Accept", "application/json")
.header("Content-Type", "application/x-www-form-urlencoded")
.header("Authorization", format!("Bearer {}", access_token))
.query(¶ms)
.send()
.await?;
let response = check_res(res)?;
let beatmapsets_search_response: BeatmapsetsSearchResponse = response.json().await?;
Ok(beatmapsets_search_response)
}
async fn get_beatmapset(&self, beatmapset_id: u32) -> Result<Beatmapset> {
println!("ReqwestBeatmapsets get_beatmapset");
let access_token = {
let token = self.o_token.read().await;
token.access_token.clone()
};
let res = self
.client
.get(format!(
"https://osu.ppy.sh/api/v2/beatmapsets/{}",
beatmapset_id
))
.header("Accept", "application/json")
.header("Content-Type", "application/x-www-form-urlencoded")
.header("Authorization", format!("Bearer {}", access_token))
.send()
.await?;
let response = check_res(res)?;
let beatmapset: Beatmapset = response.json().await?;
Ok(beatmapset)
}
async fn download(&self, beatmapset_id: u32) -> Result<()> {
println!("ReqwestBeatmapsets download");
let access_token = {
let token = self.o_token.read().await;
token.access_token.clone()
};
let res = self
.client
.get(format!(
"https://osu.ppy.sh/api/v2/beatmapsets/{}/download",
beatmapset_id
))
.header("Accept", "application/json")
.header("Content-Type", "application/x-www-form-urlencoded")
.header("Authorization", format!("Bearer {}", access_token))
.send()
.await?;
let response = check_res(res)?;
let mut file = tokio::fs::File::create(format!("{}.osz", beatmapset_id)).await?;
let bytes = response.bytes().await?;
file.write_all(&bytes).await?;
Ok(())
}
}