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 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(), timezone: 42, }
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 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(), timezone: 42, }
130 }
131}