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
67pub 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}