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