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}