essences/
mail.rs

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}