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}