Save pp in local db

This commit is contained in:
Natsu Kagami 2020-02-07 13:06:24 -05:00
parent 2913d92682
commit 22668fe654
Signed by: nki
GPG key ID: 73376E117CD20735
3 changed files with 18 additions and 20 deletions

View file

@ -28,25 +28,20 @@ impl Announcer for OsuAnnouncer {
let osu = d.get_cloned::<OsuClient>(); let osu = d.get_cloned::<OsuClient>();
// For each user... // For each user...
let mut data = OsuSavedUsers::open(&*d.read()).borrow()?.clone(); let mut data = OsuSavedUsers::open(&*d.read()).borrow()?.clone();
for (user_id, osu_user) in data.iter_mut() { 'user_loop: for (user_id, osu_user) in data.iter_mut() {
let mut user = None; let mut pp_values = vec![]; // Store the pp values here...
for mode in &[Mode::Std, Mode::Taiko, Mode::Mania, Mode::Catch] { for mode in &[Mode::Std, Mode::Taiko, Mode::Mania, Mode::Catch] {
let scores = OsuAnnouncer::scan_user(&osu, osu_user, *mode)?; let scores = OsuAnnouncer::scan_user(&osu, osu_user, *mode)?;
if scores.is_empty() { if scores.is_empty() && !osu_user.pp.is_empty() {
// Nothing to update: no new scores and pp is there.
pp_values.push(osu_user.pp[*mode as usize]);
continue; continue;
} }
let user = { let user = match osu.user(UserID::ID(osu_user.id), |f| f.mode(*mode)) {
let user = &mut user; Ok(Some(u)) => u,
if let None = user { _ => continue 'user_loop,
match osu.user(UserID::ID(osu_user.id), |f| f.mode(*mode)) {
Ok(u) => {
*user = u;
}
Err(_) => continue,
}
};
user.as_ref().unwrap()
}; };
pp_values.push(user.pp);
scores scores
.into_par_iter() .into_par_iter()
.filter_map(|(rank, score)| { .filter_map(|(rank, score)| {
@ -74,6 +69,8 @@ impl Announcer for OsuAnnouncer {
}); });
} }
osu_user.last_update = chrono::Utc::now(); osu_user.last_update = chrono::Utc::now();
osu_user.pp = pp_values;
dbg!(&osu_user);
} }
// Update users // Update users
*OsuSavedUsers::open(&*d.read()).borrow_mut()? = data; *OsuSavedUsers::open(&*d.read()).borrow_mut()? = data;

View file

@ -1,12 +1,10 @@
use chrono::{DateTime, Utc}; use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serenity::{
model::id::{ChannelId, UserId},
};
use std::collections::HashMap;
use youmubot_db::{DB};
use crate::models::{Beatmap, Mode}; use crate::models::{Beatmap, Mode};
use serde::{Deserialize, Serialize};
use serenity::model::id::{ChannelId, UserId};
use std::collections::HashMap;
use youmubot_db::DB;
/// Save the user IDs. /// Save the user IDs.
pub type OsuSavedUsers = DB<HashMap<UserId, OsuUser>>; pub type OsuSavedUsers = DB<HashMap<UserId, OsuUser>>;
@ -19,4 +17,6 @@ pub type OsuLastBeatmap = DB<HashMap<ChannelId, (Beatmap, Mode)>>;
pub struct OsuUser { pub struct OsuUser {
pub id: u64, pub id: u64,
pub last_update: DateTime<Utc>, pub last_update: DateTime<Utc>,
#[serde(default)]
pub pp: Vec<Option<f64>>,
} }

View file

@ -145,6 +145,7 @@ pub fn save(ctx: &mut Context, msg: &Message, mut args: Args) -> CommandResult {
OsuUser { OsuUser {
id: u.id, id: u.id,
last_update: chrono::Utc::now(), last_update: chrono::Utc::now(),
pp: vec![],
}, },
); );
msg.reply( msg.reply(