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