essences/
ratings.rs

1use crate::{characters, mail::MailTemplateId, prelude::*};
2use strum_macros::{Display, EnumIter, EnumString};
3
4#[declare]
5pub type RatingId = Uuid;
6
7#[derive(
8    Clone,
9    Debug,
10    Serialize,
11    Deserialize,
12    JsonSchema,
13    EnumString,
14    Display,
15    PartialEq,
16    Eq,
17    EnumIter,
18    Tsify,
19    Hash,
20)]
21pub enum RatingType {
22    Arena,
23    Power,
24    PvE,
25}
26
27impl CustomType for RatingType {
28    fn build(mut builder: TypeBuilder<Self>) {
29        builder
30            .with_name("RatingType")
31            .with_get("str", |qt: &mut RatingType| RatingType::to_string(qt));
32    }
33}
34
35#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash, JsonSchema, Tsify)]
36pub struct RatingRangeReward {
37    #[schemars(
38        title = "Id шаблона письма с наградой",
39        schema_with = "option_mail_id_schema"
40    )]
41    pub mail_template_id: Option<MailTemplateId>,
42
43    #[schemars(title = "Место, с которого начинается диапазон")]
44    pub diapason_start: i64,
45
46    #[schemars(
47        title = "Место, на котором заканчивается диапазон. Если отсутствует - значит от старта до конца"
48    )]
49    pub diapason_end: Option<i64>,
50}
51
52#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash, JsonSchema, Tsify)]
53pub struct RatingSettings {
54    #[schemars(schema_with = "id_schema")]
55    pub id: RatingId,
56
57    #[schemars(title = "Вид рейтинга")]
58    pub rating_type: RatingType,
59
60    #[schemars(
61        title = "Все места рейтинга c наградой",
62        description = "Набор позиций рейтинга, описывающий все места и награды"
63    )]
64    pub rating_range_rewards: Vec<RatingRangeReward>,
65}
66
67// TODO move to game config impl somewhere
68pub fn get_rating_ranges_by_type(
69    rating_type: RatingType,
70    ratings_settings: &Vec<RatingSettings>,
71) -> Vec<RatingRangeReward> {
72    for settings in ratings_settings {
73        if rating_type == settings.rating_type {
74            return settings.rating_range_rewards.clone();
75        }
76    }
77    vec![]
78}
79
80#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, Eq, PartialEq, JsonSchema, Tsify)]
81#[tsify(into_wasm_abi, from_wasm_abi)]
82pub struct RatingLeaderboardRequest {
83    pub character_id: uuid::Uuid,
84    pub rating_type: RatingType,
85    pub limit: i64,
86    pub offset: i64,
87}
88
89#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, JsonSchema, Tsify)]
90#[tsify(into_wasm_abi, from_wasm_abi)]
91pub enum RatingLeaderboardResponse {
92    Ok {
93        leaderboard: Vec<RatingRankingItem>,
94        character_ranking: Box<RatingRankingItem>,
95    },
96    Error {
97        code: String,
98        message: String,
99    },
100}
101
102#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, Tsify, CustomType)]
103pub struct RatingRankingItem {
104    pub user: crate::users::User,
105    pub character: characters::Character,
106    pub place: u64,
107}