essences/
offers.rs

1use crate::{bundles::BundleId, prelude::*};
2use chrono::Utc;
3
4use crate::currency::CurrencyUnit;
5use std::collections::BTreeMap;
6
7#[declare]
8pub type OfferTemplateId = Uuid;
9
10#[declare]
11pub type OfferId = Uuid;
12
13#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, Tsify)]
14pub enum PaymentType {
15    RealMoney,
16    InGameCurrency(Vec<CurrencyUnit>),
17    Ad,
18    Free,
19}
20
21#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash, JsonSchema, Tsify)]
22pub enum ShopTab {
23    DailyDeals,
24    Diamonds,
25    Resources,
26    ProgressPass,
27}
28
29#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, Tsify, i18n::Translate)]
30pub struct ShopTabConfig {
31    #[schemars(title = "Вкладка магазина")]
32    pub tab: ShopTab,
33
34    #[schemars(title = "Название вкладки (i18n)")]
35    #[translate]
36    pub name: i18n::I18nString,
37}
38
39#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema, Tsify, i18n::Translate)]
40pub struct OfferTemplate {
41    #[schemars(schema_with = "id_schema")]
42    pub id: OfferTemplateId,
43
44    #[schemars(
45        title = "Техническое название оффера",
46        description = "Техническое название, которое используется в ProductId оффера - \"package_name.alias\". Может содержать 0-9, a-z, _ и ."
47    )]
48    pub alias: String,
49
50    #[schemars(title = "Название оффера")]
51    #[translate]
52    pub title: i18n::I18nString,
53
54    #[schemars(title = "Иконка", schema_with = "asset_offer_icon_schema")]
55    pub icon_path: String,
56
57    #[schemars(
58        title = "Id бандла награды",
59        description = "None для офферов, чья награда — не бандл (например, покупка премиума progress pass).",
60        schema_with = "option_bundle_id_schema"
61    )]
62    pub reward_bundle_id: Option<BundleId>,
63
64    #[schemars(title = "Способ оплаты лота. InGameCurrency содержит стоимость в валюте")]
65    pub payment_type: PaymentType,
66
67    #[schemars(title = "Максимальное кол-во покупок оффера. None - без ограничений")]
68    pub limit_of_buys: Option<i64>,
69
70    #[schemars(
71        title = "Период сброса лимита покупок в секундах",
72        description = "Null - лимит на всё время жизни оффера (без сброса)"
73    )]
74    pub buys_reset_seconds: Option<u64>,
75
76    #[schemars(title = "Текст для Unity, описывающий частоту сброса лимита")]
77    #[translate]
78    pub limit_buy_text: Option<i18n::I18nString>,
79
80    #[schemars(title = "Подписка на эвенты")]
81    pub events_subscribe: Vec<String>,
82
83    #[schemars(title = "Вкладка магазина, в которой отображается лот")]
84    pub shop_tab: ShopTab,
85
86    #[schemars(title = "Статус лота. Disabled лоты не отображаются в магазине")]
87    pub enabled: bool,
88
89    #[schemars(title = "Флаг NEW на карточке лота")]
90    pub flag_new: bool,
91
92    #[schemars(
93        title = "Флаг SALE на карточке лота",
94        description = "None - нет скидки. Some(0) - показывать SALE без процента. Some(x) - показывать X% OFF"
95    )]
96    pub flag_sale: Option<u32>,
97
98    #[schemars(title = "Значение ценности лота, отображаемое на карточке")]
99    pub value: Option<u32>,
100
101    #[schemars(title = "Приоритет отображения лота внутри вкладки. Выше - левее/выше")]
102    pub priority: u32,
103}
104
105#[derive(
106    Default, Clone, Debug, Eq, PartialEq, Deserialize, Serialize, PartialOrd, Ord, JsonSchema, Tsify,
107)]
108pub struct Offer {
109    pub id: OfferId,
110    pub template_id: OfferTemplateId,
111    pub created_at: chrono::DateTime<Utc>,
112}
113
114#[derive(Default, Clone, Debug, Eq, PartialEq, Deserialize, Serialize, JsonSchema, Tsify)]
115pub struct OffersInfo {
116    pub active_offers: Vec<Offer>,
117    pub offer_buy_counts: BTreeMap<OfferTemplateId, u32>,
118}