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, 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(
137 Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, Tsify, i18n::Translate,
138)]
139pub struct MailTemplate {
140 #[schemars(schema_with = "id_schema")]
141 pub id: MailTemplateId,
142
143 #[schemars(title = "Заголовок письма")]
144 #[translate]
145 pub title: i18n::I18nString,
146
147 #[schemars(title = "Текст письма")]
148 #[translate]
149 pub message: i18n::I18nString,
150
151 #[schemars(
152 title = "Бандл награды",
153 description = "ID бандла с наградами письма",
154 schema_with = "option_bundle_id_schema"
155 )]
156 pub bundle_id: Option<BundleId>,
157
158 #[schemars(
159 title = "Время жизни в секундах",
160 description = "Через сколько секунд письмо истекает"
161 )]
162 pub lifetime_secs: i64,
163
164 #[schemars(
165 title = "Тип отправки",
166 description = "Send now - отправка сразу всем подходящим игрокам. Schedule - отложенная отправка с возможностью повторений"
167 )]
168 pub send_type: MailSendType,
169
170 #[schemars(title = "Автоматическая отправка")]
171 pub is_auto_send: bool,
172
173 #[schemars(title = "Ограничения", description = "Ограничения на получение письма")]
174 pub restrictions: Option<MailRestrictions>,
175}