essences/
init_params.rs

1use crate::generation::{self, PhotoGenerationSettings, UsernameGenerationSettings};
2use crate::types::CustomValuesMap;
3use crate::{characters::CharacterBuilder, generation::UsersGeneratingSettings};
4
5use super::{characters, currency, users};
6
7use crate::prelude::*;
8
9#[derive(
10    PartialEq, Eq, Serialize, Deserialize, Default, Debug, Clone, JsonSchema, Tsify, CustomType,
11)]
12pub struct InitParams {
13    pub user: users::User,
14    pub character: characters::Character,
15    pub arena_tickets_unit: currency::CurrencyUnit,
16    pub locale: String,
17    pub timezone: i64,
18}
19
20pub struct BaseParams {
21    pub arena_rating: u64,
22    pub arena_tickets_unit: currency::CurrencyUnit,
23    pub custom_values: CustomValuesMap,
24    pub class: uuid::Uuid,
25}
26
27fn generate_username(username_generation_settings: &UsernameGenerationSettings) -> String {
28    match generation::generate_username(username_generation_settings) {
29        Ok(username) => username,
30        Err(err) => {
31            tracing::error!("Error generating new username: {err:?}");
32            "".to_string()
33        }
34    }
35}
36
37fn generate_photo_url(photo_generation_settings: &PhotoGenerationSettings) -> Option<String> {
38    match generation::generate_photo_url(photo_generation_settings) {
39        Ok(photo) => Some(photo),
40        Err(err) => {
41            tracing::error!("Error generating new photo: {err:?}");
42            None
43        }
44    }
45}
46
47impl InitParams {
48    // TODO duplicate functions
49    pub fn from_init_data(
50        tma_init_data: tma::InitData,
51        base_params: BaseParams,
52        users_generation: &UsersGeneratingSettings,
53    ) -> Self {
54        let user_id = uuid::Uuid::now_v7();
55        let character_id = uuid::Uuid::now_v7();
56
57        Self {
58            user: users::User {
59                id: user_id,
60                active_character_id: character_id,
61                tg_id: Some(tma_init_data.user.id),
62                firebase_id: None,
63                photo_url: match tma_init_data.user.photo_url {
64                    Some(x) => Some(x),
65                    None => generate_photo_url(&users_generation.photo_generation_settings),
66                },
67                is_premium: tma_init_data.user.is_premium,
68                is_deleted: false,
69                first_name: Some(tma_init_data.user.first_name),
70                last_name: tma_init_data.user.last_name,
71                username: match tma_init_data.user.username {
72                    Some(x) => x,
73                    None => generate_username(&users_generation.username_generation_settings),
74                },
75                username_discriminator: None,
76                last_username_change_at: None,
77                language_code: tma_init_data.user.language_code.unwrap_or("en".to_string()),
78                allows_write_to_pm: tma_init_data.user.allows_write_to_pm,
79            },
80            character: CharacterBuilder::new()
81                .with_id(character_id)
82                .with_user_id(user_id)
83                .with_class(base_params.class)
84                .with_custom_values(base_params.custom_values)
85                .with_arena_rating(base_params.arena_rating as i64)
86                .build(),
87            arena_tickets_unit: base_params.arena_tickets_unit,
88            locale: "en".to_string(), // TODO: Get it from frontend
89            timezone: 42,             // TODO: this too
90        }
91    }
92
93    pub fn from_firebase_claims(
94        firebase_user_id: String,
95        base_params: BaseParams,
96        users_generation: &UsersGeneratingSettings,
97    ) -> Self {
98        let user_id = uuid::Uuid::now_v7();
99        let character_id = uuid::Uuid::now_v7();
100
101        Self {
102            user: users::User {
103                id: user_id,
104                active_character_id: character_id,
105                tg_id: None,
106                firebase_id: Some(firebase_user_id),
107                photo_url: generate_photo_url(&users_generation.photo_generation_settings),
108                is_premium: None,
109                is_deleted: false,
110                first_name: None,
111                last_name: None,
112                username: generate_username(&users_generation.username_generation_settings),
113                username_discriminator: None,
114                last_username_change_at: None,
115                language_code: "en".to_string(),
116                allows_write_to_pm: None,
117            },
118            // TODO generate power from script, if 1 is a bad balue
119            character: CharacterBuilder::new()
120                .with_id(character_id)
121                .with_user_id(user_id)
122                .with_class(base_params.class)
123                .with_custom_values(base_params.custom_values)
124                .with_arena_rating(base_params.arena_rating as i64)
125                .build(),
126            arena_tickets_unit: base_params.arena_tickets_unit,
127            locale: "en".to_string(), // TODO: Get it from frontend
128            timezone: 42,             // TODO: this too
129        }
130    }
131}