diff --git a/youmubot-osu/src/lib.rs b/youmubot-osu/src/lib.rs index 7e944e4..b1ce920 100644 --- a/youmubot-osu/src/lib.rs +++ b/youmubot-osu/src/lib.rs @@ -30,7 +30,7 @@ impl Client { r: reqwest::RequestBuilder, ) -> Result { let v = r.query(&[("k", &self.key)]).build()?; - // println!("{}", v.url()); + dbg!(v.url()); Ok(c.execute(v)?) } diff --git a/youmubot/src/commands/osu/mod.rs b/youmubot/src/commands/osu/mod.rs index e68e656..bcf4fb6 100644 --- a/youmubot/src/commands/osu/mod.rs +++ b/youmubot/src/commands/osu/mod.rs @@ -1,11 +1,12 @@ use crate::commands::args::Duration; +use crate::db::{DBWriteGuard, OsuSavedUsers}; use crate::http; use chrono::Utc; use serenity::{ builder::CreateEmbed, framework::standard::{ macros::{command, group}, - Args, CommandResult, + Args, CommandError as Error, CommandResult, }, model::channel::Message, prelude::*, @@ -26,7 +27,7 @@ group!({ prefix: "osu", description: "osu! related commands.", }, - commands: [std, taiko, catch, mania], + commands: [std, taiko, catch, mania, save], }); #[command] @@ -65,9 +66,60 @@ pub fn mania(ctx: &mut Context, msg: &Message, args: Args) -> CommandResult { get_user(ctx, msg, args, Mode::Mania) } -fn get_user(ctx: &mut Context, msg: &Message, mut args: Args, mode: Mode) -> CommandResult { - let username = args.single::()?; - let data = ctx.data.write(); +#[command] +#[description = "Save the given username as your username."] +#[usage = "[username or user_id]"] +#[num_args(1)] +pub fn save(ctx: &mut Context, msg: &Message, mut args: Args) -> CommandResult { + let mut data = ctx.data.write(); + let reqwest = data.get::().unwrap(); + let osu = data.get::().unwrap(); + + let user = args.single::()?; + let user: Option = osu.user(reqwest, UserID::Auto(user), |f| f)?; + match user { + Some(u) => { + let mut db: DBWriteGuard<_> = data + .get_mut::() + .ok_or(Error::from("DB uninitialized"))? + .into(); + let mut db = db.borrow_mut()?; + + db.insert(msg.author.id, u.id); + msg.reply( + &ctx, + MessageBuilder::new() + .push("user has been set to ") + .push_mono_safe(u.username) + .build(), + )?; + } + None => { + msg.reply(&ctx, "user not found...")?; + } + } + Ok(()) +} + +fn get_user(ctx: &mut Context, msg: &Message, args: Args, mode: Mode) -> CommandResult { + let mut data = ctx.data.write(); + let username = match args.remains() { + Some(v) => v.to_owned(), + None => { + let db: DBWriteGuard<_> = data + .get_mut::() + .ok_or(Error::from("DB uninitialized"))? + .into(); + let db = db.borrow()?; + match db.get(&msg.author.id) { + Some(ref v) => v.to_string(), + None => { + msg.reply(&ctx, "You have not saved any account.")?; + return Ok(()); + } + } + } + }; let reqwest = data.get::().unwrap(); let osu = data.get::().unwrap(); let user = osu.user(reqwest, UserID::Auto(username), |f| f.mode(mode))?; diff --git a/youmubot/src/db/mod.rs b/youmubot/src/db/mod.rs index 34a2fbe..247af05 100644 --- a/youmubot/src/db/mod.rs +++ b/youmubot/src/db/mod.rs @@ -35,6 +35,9 @@ where /// A list of SoftBans for all servers. pub type SoftBans = DB>; +/// Save the user IDs. +pub type OsuSavedUsers = DB>; + /// Sets up all databases in the client. pub fn setup_db(client: &mut Client) -> Result<(), Error> { let path: PathBuf = var("DBPATH").map(|v| PathBuf::from(v)).unwrap_or_else(|e| { @@ -43,6 +46,7 @@ pub fn setup_db(client: &mut Client) -> Result<(), Error> { }); let mut data = client.data.write(); SoftBans::insert_into(&mut *data, &path.join("soft_bans.ron"))?; + OsuSavedUsers::insert_into(&mut *data, &path.join("osu_saved_users.ron"))?; Ok(()) }