use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
use super::{
beatmap::RankStatus,
serde_,
user_::{Medal, Username},
GameMode, Grade,
};
#[cfg(feature = "rkyv")]
use rkyv::{Archive, Deserialize as RkyvDeserialize, Serialize as RkyvSerialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "rkyv", derive(Archive, RkyvDeserialize, RkyvSerialize))]
pub struct RecentEvent {
#[serde(with = "serde_::datetime")]
#[cfg_attr(feature = "rkyv", with(super::rkyv_impls::DateTimeWrapper))]
pub created_at: OffsetDateTime,
#[serde(rename = "id")]
pub event_id: u32,
#[serde(flatten)]
pub event_type: EventType,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "rkyv", derive(Archive, RkyvDeserialize, RkyvSerialize))]
pub struct EventBeatmap {
pub title: String,
pub url: String,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "rkyv", derive(Archive, RkyvDeserialize, RkyvSerialize))]
pub struct EventBeatmapset {
pub title: String,
pub url: String,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "rkyv", derive(Archive, RkyvDeserialize, RkyvSerialize))]
#[serde(rename_all = "camelCase", tag = "type")]
pub enum EventType {
BeatmapPlaycount { beatmap: EventBeatmap, count: u32 },
BeatmapsetApprove {
approval: RankStatus,
beatmapset: EventBeatmapset,
user: EventUser,
},
BeatmapsetDelete { beatmapset: EventBeatmapset },
BeatmapsetRevive {
beatmapset: EventBeatmapset,
user: EventUser,
},
BeatmapsetUpdate {
beatmapset: EventBeatmapset,
user: EventUser,
},
BeatmapsetUpload {
beatmapset: EventBeatmapset,
user: EventUser,
},
#[serde(rename = "achievement")]
Medal {
#[serde(rename = "achievement")]
medal: Medal,
user: EventUser,
},
Rank {
#[serde(rename = "scoreRank")]
grade: Grade,
rank: u32,
mode: GameMode,
beatmap: EventBeatmap,
user: EventUser,
},
RankLost {
mode: GameMode,
beatmap: EventBeatmap,
user: EventUser,
},
#[serde(rename = "userSupportAgain")]
SupportAgain { user: EventUser },
#[serde(rename = "userSupportFirst")]
SupportFirst { user: EventUser },
#[serde(rename = "userSupportGift")]
SupportGift {
user: EventUser,
},
UsernameChange {
user: EventUser,
},
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(feature = "rkyv", derive(Archive, RkyvDeserialize, RkyvSerialize))]
pub struct EventUser {
#[cfg_attr(feature = "rkyv", with(super::rkyv_impls::UsernameWrapper))]
pub username: Username,
pub url: String,
#[serde(
default,
rename = "previousUsername",
skip_serializing_if = "Option::is_none"
)]
#[cfg_attr(feature = "rkyv", with(super::rkyv_impls::UsernameMap))]
pub previous_username: Option<Username>,
}