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}