Construct rosu api

This commit is contained in:
Natsu Kagami 2024-02-01 21:30:03 +01:00
parent 96ac66d84c
commit 2bc9412f86
Signed by: nki
GPG key ID: 55A032EB38B49ADB
3 changed files with 33 additions and 10 deletions

View file

@ -53,7 +53,7 @@ impl TypeMapKey for OsuClient {
/// - Commands on the "osu" prefix /// - Commands on the "osu" prefix
/// - Hooks. Hooks are completely opt-in. /// - Hooks. Hooks are completely opt-in.
/// ///
pub fn setup( pub async fn setup(
_path: &std::path::Path, _path: &std::path::Path,
data: &mut TypeMap, data: &mut TypeMap,
announcers: &mut AnnouncerHandler, announcers: &mut AnnouncerHandler,
@ -71,13 +71,23 @@ pub fn setup(
// API client // API client
let http_client = data.get::<HTTPClient>().unwrap().clone(); let http_client = data.get::<HTTPClient>().unwrap().clone();
let mk_osu_client = || { let mk_osu_client = || async {
Arc::new(OsuHttpClient::new( Arc::new(
std::env::var("OSU_API_KEY").expect("Please set OSU_API_KEY as osu! api key."), OsuHttpClient::new(
http_client.clone(), std::env::var("OSU_API_KEY").expect("Please set OSU_API_KEY as osu! api key."),
)) http_client.clone(),
std::env::var("OSU_API_CLIENT_ID")
.expect("Please set OSU_API_CLIENT_ID as osu! api v2 client ID.")
.parse()
.expect("client_id should be u64"),
std::env::var("OSU_API_CLIENT_SECRET")
.expect("Please set OSU_API_CLIENT_SECRET as osu! api v2 client secret."),
)
.await
.expect("osu! should be initialized"),
)
}; };
let osu_client = mk_osu_client(); let osu_client = mk_osu_client().await;
data.insert::<OsuClient>(osu_client.clone()); data.insert::<OsuClient>(osu_client.clone());
data.insert::<oppai_cache::BeatmapCache>(oppai_cache::BeatmapCache::new( data.insert::<oppai_cache::BeatmapCache>(oppai_cache::BeatmapCache::new(
http_client.clone(), http_client.clone(),
@ -89,7 +99,7 @@ pub fn setup(
)); ));
// Announcer // Announcer
let osu_client = mk_osu_client(); let osu_client = mk_osu_client().await;
announcers.add( announcers.add(
announcer::ANNOUNCER_KEY, announcer::ANNOUNCER_KEY,
announcer::Announcer::new(osu_client), announcer::Announcer::new(osu_client),

View file

@ -19,6 +19,8 @@ const REQUESTS_PER_MINUTE: usize = 100;
pub struct Client { pub struct Client {
client: Ratelimit<HTTPClient>, client: Ratelimit<HTTPClient>,
key: String, key: String,
rosu: rosu_v2::Osu,
} }
fn vec_try_into<U, T: std::convert::TryFrom<U>>(v: Vec<U>) -> Result<Vec<T>, T::Error> { fn vec_try_into<U, T: std::convert::TryFrom<U>>(v: Vec<U>) -> Result<Vec<T>, T::Error> {
@ -33,13 +35,23 @@ fn vec_try_into<U, T: std::convert::TryFrom<U>>(v: Vec<U>) -> Result<Vec<T>, T::
impl Client { impl Client {
/// Create a new client from the given API key. /// Create a new client from the given API key.
pub fn new(key: String, client: HTTPClient) -> Client { pub async fn new(
key: String,
client: HTTPClient,
client_id: u64,
client_secret: impl Into<String>,
) -> Result<Client> {
let client = Ratelimit::new( let client = Ratelimit::new(
client, client,
REQUESTS_PER_MINUTE, REQUESTS_PER_MINUTE,
std::time::Duration::from_secs(60), std::time::Duration::from_secs(60),
); );
Client { client, key } let rosu = rosu_v2::OsuBuilder::new()
.client_id(client_id)
.client_secret(client_secret)
.build()
.await?;
Ok(Client { client, key, rosu })
} }
pub(crate) async fn build_request(&self, url: &str) -> Result<reqwest::RequestBuilder> { pub(crate) async fn build_request(&self, url: &str) -> Result<reqwest::RequestBuilder> {

View file

@ -135,6 +135,7 @@ async fn main() {
// osu! // osu!
#[cfg(feature = "osu")] #[cfg(feature = "osu")]
youmubot_osu::discord::setup(&db_path, &mut data, &mut announcers) youmubot_osu::discord::setup(&db_path, &mut data, &mut announcers)
.await
.expect("osu! is initialized"); .expect("osu! is initialized");
// codeforces // codeforces
#[cfg(feature = "codeforces")] #[cfg(feature = "codeforces")]