mirror of
https://github.com/natsukagami/youmubot.git
synced 2025-04-20 01:08:55 +00:00
Send announcements not as part of scanning
This commit is contained in:
parent
bc888e816b
commit
0fd5379446
2 changed files with 67 additions and 50 deletions
|
@ -40,10 +40,6 @@ impl youmubot_prelude::Announcer for Announcer {
|
||||||
let channels = &channels;
|
let channels = &channels;
|
||||||
let c = c.clone();
|
let c = c.clone();
|
||||||
async move {
|
async move {
|
||||||
let d = d.read().await;
|
|
||||||
let osu = d.get::<OsuClient>().unwrap();
|
|
||||||
let cache = d.get::<BeatmapMetaCache>().unwrap();
|
|
||||||
let oppai = d.get::<BeatmapCache>().unwrap();
|
|
||||||
let channels = channels.channels_of(c.clone(), user_id).await;
|
let channels = channels.channels_of(c.clone(), user_id).await;
|
||||||
if channels.is_empty() {
|
if channels.is_empty() {
|
||||||
return (user_id, osu_user); // We don't wanna update an user without any active server
|
return (user_id, osu_user); // We don't wanna update an user without any active server
|
||||||
|
@ -53,14 +49,11 @@ impl youmubot_prelude::Announcer for Announcer {
|
||||||
.map(|m| {
|
.map(|m| {
|
||||||
handle_user_mode(
|
handle_user_mode(
|
||||||
c.clone(),
|
c.clone(),
|
||||||
&osu,
|
|
||||||
&cache,
|
|
||||||
&oppai,
|
|
||||||
&osu_user,
|
&osu_user,
|
||||||
user_id,
|
user_id,
|
||||||
&channels[..],
|
channels.clone(),
|
||||||
*m,
|
*m,
|
||||||
&*d,
|
d.clone(),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.collect::<stream::FuturesOrdered<_>>()
|
.collect::<stream::FuturesOrdered<_>>()
|
||||||
|
@ -96,52 +89,73 @@ impl youmubot_prelude::Announcer for Announcer {
|
||||||
/// Handles an user/mode scan, announces all possible new scores, return the new pp value.
|
/// Handles an user/mode scan, announces all possible new scores, return the new pp value.
|
||||||
async fn handle_user_mode(
|
async fn handle_user_mode(
|
||||||
c: Arc<CacheAndHttp>,
|
c: Arc<CacheAndHttp>,
|
||||||
osu: &Osu,
|
|
||||||
cache: &BeatmapMetaCache,
|
|
||||||
oppai: &BeatmapCache,
|
|
||||||
osu_user: &OsuUser,
|
osu_user: &OsuUser,
|
||||||
user_id: UserId,
|
user_id: UserId,
|
||||||
channels: &[ChannelId],
|
channels: Vec<ChannelId>,
|
||||||
mode: Mode,
|
mode: Mode,
|
||||||
d: &TypeMap,
|
d: AppData,
|
||||||
) -> Result<Option<f64>, Error> {
|
) -> Result<Option<f64>, Error> {
|
||||||
let scores = scan_user(osu, osu_user, mode).await?;
|
let (scores, user) = {
|
||||||
let user = osu
|
let data = d.read().await;
|
||||||
.user(UserID::ID(osu_user.id), |f| f.mode(mode))
|
let osu = data.get::<OsuClient>().unwrap();
|
||||||
.await?
|
let scores = scan_user(osu, osu_user, mode).await?;
|
||||||
.ok_or(Error::msg("user not found"))?;
|
let user = osu
|
||||||
scores
|
.user(UserID::ID(osu_user.id), |f| f.mode(mode))
|
||||||
.into_iter()
|
.await?
|
||||||
.map(|(rank, score)| async move {
|
.ok_or(Error::msg("user not found"))?;
|
||||||
let beatmap = cache.get_beatmap_default(score.beatmap_id).await?;
|
(scores, user)
|
||||||
let content = oppai.get_beatmap(beatmap.beatmap_id).await?;
|
};
|
||||||
let r: Result<_> = Ok((rank, score, BeatmapWithMode(beatmap, mode), content));
|
let pp = user.pp;
|
||||||
r
|
spawn_future(async move {
|
||||||
})
|
scores
|
||||||
.collect::<stream::FuturesOrdered<_>>()
|
.into_iter()
|
||||||
.filter_map(|v| future::ready(v.ok()))
|
.map(|(rank, score)| {
|
||||||
.for_each(|(rank, score, beatmap, content)| {
|
let d = d.clone();
|
||||||
let c = c.clone();
|
async move {
|
||||||
let user = &user;
|
let data = d.read().await;
|
||||||
async move {
|
let cache = data.get::<BeatmapMetaCache>().unwrap();
|
||||||
for channel in (&channels).iter() {
|
let oppai = data.get::<BeatmapCache>().unwrap();
|
||||||
if let Err(e) = channel
|
let beatmap = cache.get_beatmap_default(score.beatmap_id).await?;
|
||||||
.send_message(c.http(), |c| {
|
let content = oppai.get_beatmap(beatmap.beatmap_id).await?;
|
||||||
c.content(format!("New top record from {}!", user_id.mention()))
|
let r: Result<_> = Ok((rank, score, BeatmapWithMode(beatmap, mode), content));
|
||||||
.embed(|e| {
|
r
|
||||||
score_embed(&score, &beatmap, &content, &user, Some(rank), e)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
.await
|
|
||||||
{
|
|
||||||
dbg!(e);
|
|
||||||
}
|
|
||||||
save_beatmap(d, *channel, &beatmap).ok();
|
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
})
|
.collect::<stream::FuturesOrdered<_>>()
|
||||||
.await;
|
.filter_map(|v| future::ready(v.ok()))
|
||||||
Ok(user.pp)
|
.for_each(move |(rank, score, beatmap, content)| {
|
||||||
|
let channels = channels.clone();
|
||||||
|
let d = d.clone();
|
||||||
|
let c = c.clone();
|
||||||
|
let user = user.clone();
|
||||||
|
async move {
|
||||||
|
let data = d.read().await;
|
||||||
|
for channel in (&channels).iter() {
|
||||||
|
if let Err(e) = channel
|
||||||
|
.send_message(c.http(), |c| {
|
||||||
|
c.content(format!("New top record from {}!", user_id.mention()))
|
||||||
|
.embed(|e| {
|
||||||
|
score_embed(
|
||||||
|
&score,
|
||||||
|
&beatmap,
|
||||||
|
&content,
|
||||||
|
&user,
|
||||||
|
Some(rank),
|
||||||
|
e,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
dbg!(e);
|
||||||
|
}
|
||||||
|
save_beatmap(&*data, *channel, &beatmap).ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.await;
|
||||||
|
});
|
||||||
|
Ok(pp)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn scan_user(osu: &Osu, u: &OsuUser, mode: Mode) -> Result<Vec<(u8, Score)>, Error> {
|
async fn scan_user(osu: &Osu, u: &OsuUser, mode: Mode) -> Result<Vec<(u8, Score)>, Error> {
|
||||||
|
|
|
@ -24,6 +24,9 @@ pub use anyhow::{Error, Result};
|
||||||
/// Re-export useful future and stream utils
|
/// Re-export useful future and stream utils
|
||||||
pub use futures_util::{future, stream, FutureExt, StreamExt, TryFutureExt, TryStreamExt};
|
pub use futures_util::{future, stream, FutureExt, StreamExt, TryFutureExt, TryStreamExt};
|
||||||
|
|
||||||
|
/// Re-export the spawn function
|
||||||
|
pub use tokio::spawn as spawn_future;
|
||||||
|
|
||||||
/// The global app data.
|
/// The global app data.
|
||||||
pub type AppData = Arc<RwLock<TypeMap>>;
|
pub type AppData = Arc<RwLock<TypeMap>>;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue