1use chrono::{DateTime, Utc};
2use strum_macros::{Display, EnumIter, EnumString};
3use tsify_next::Tsify;
4
5use crate::bundles::{BundleId, BundleStepGeneric};
6use crate::prelude::*;
7
8#[declare]
9pub type MailId = Uuid;
10
11#[declare]
12pub type MailTemplateId = Uuid;
13
14#[derive(
15 Debug,
16 Clone,
17 Copy,
18 EnumString,
19 Display,
20 Deserialize,
21 Serialize,
22 Hash,
23 Eq,
24 PartialEq,
25 EnumIter,
26 Default,
27 JsonSchema,
28 Tsify,
29)]
30#[tsify(namespace)]
31pub enum MailRepeatType {
32 #[default]
33 Daily,
34 Weekly,
35 Monthly,
36 Yearly,
37}
38
39#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, Tsify)]
40pub struct MailSendType {
41 #[schemars(
42 title = "Время отправки",
43 description = "Если None — отправить сразу. Формат: YYYY-MM-DD-HH-MM-SS"
44 )]
45 pub scheduled_at: Option<String>,
46
47 #[schemars(
48 title = "Повторение",
49 description = "Если задано — повторять по указанному интервалу"
50 )]
51 pub repeat: Option<MailRepeatType>,
52}
53
54#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, CustomType, JsonSchema, Tsify)]
55pub struct Mail {
56 pub id: MailId,
57 pub template_id: MailTemplateId,
58 pub bundle: Option<BundleStepGeneric>,
59 pub title: i18n::I18nString,
60 pub message: i18n::I18nString,
61 pub created_at: DateTime<Utc>,
62 pub expires_at: DateTime<Utc>,
63 pub is_read: bool,
64 pub is_claimed: Option<bool>,
65 pub is_deleted: bool,
66}
67
68#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, Tsify)]
69pub struct ArenaRatingRestriction {
70 #[schemars(
71 title = "Минимальный рейтинг арены",
72 description = "Минимальный рейтинг арены для получения письма"
73 )]
74 pub min_rating: Option<i64>,
75
76 #[schemars(
77 title = "Максимальный рейтинг арены",
78 description = "Максимальный рейтинг арены для получения письма"
79 )]
80 pub max_rating: Option<i64>,
81}
82
83#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, Tsify)]
84pub struct PowerRestriction {
85 #[schemars(
86 title = "Минимальная сила",
87 description = "Минимальная сила персонажа для получения письма"
88 )]
89 pub min_power: Option<i64>,
90
91 #[schemars(
92 title = "Максимальная сила",
93 description = "Максимальная сила персонажа для получения письма"
94 )]
95 pub max_power: Option<i64>,
96}
97
98#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, Tsify)]
99pub struct ArenaPlaceRestriction {
100 #[schemars(
101 title = "Минимальное место в арене",
102 description = "Минимальное место в арене для получения письма"
103 )]
104 pub min_place: Option<i64>,
105
106 #[schemars(
107 title = "Максимальное место в арене",
108 description = "Максимальное место в арене для получения письма"
109 )]
110 pub max_place: Option<i64>,
111}
112
113#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, Tsify)]
114pub struct PVEProgressRestriction {
115 #[schemars(
116 title = "Минимальный прогресс PVE",
117 description = "Минимальный прогресс PVE для получения письма"
118 )]
119 pub min_progress: Option<i64>,
120
121 #[schemars(
122 title = "Максимальный прогресс PVE",
123 description = "Максимальный прогресс PVE для получения письма"
124 )]
125 pub max_progress: Option<i64>,
126}
127
128#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, Tsify)]
129pub struct MailRestrictions {
130 pub arena_rating: Option<ArenaRatingRestriction>,
131 pub power: Option<PowerRestriction>,
132 pub arena_place: Option<ArenaPlaceRestriction>,
133 pub pve_progress: Option<PVEProgressRestriction>,
134}
135
136#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, Tsify)]
137pub struct MailTemplate {
138 #[schemars(schema_with = "id_schema")]
139 pub id: MailTemplateId,
140
141 #[schemars(title = "Заголовок письма")]
142 pub title: i18n::I18nString,
143
144 #[schemars(title = "Текст письма")]
145 pub message: i18n::I18nString,
146
147 #[schemars(
148 title = "Бандл награды",
149 description = "ID бандла с наградами письма",
150 schema_with = "option_bundle_id_schema"
151 )]
152 pub bundle_id: Option<BundleId>,
153
154 #[schemars(
155 title = "Время жизни в секундах",
156 description = "Через сколько секунд письмо истекает"
157 )]
158 pub lifetime_secs: i64,
159
160 #[schemars(
161 title = "Тип отправки",
162 description = "Send now - отправка сразу всем подходящим игрокам. Schedule - отложенная отправка с возможностью повторений"
163 )]
164 pub send_type: MailSendType,
165
166 #[schemars(title = "Автоматическая отправка")]
167 pub is_auto_send: bool,
168
169 #[schemars(title = "Ограничения", description = "Ограничения на получение письма")]
170 pub restrictions: Option<MailRestrictions>,
171}