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