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 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(), timezone: 42, }
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 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(), timezone: 42, }
128 }
129}