why2_chat/
options.rs

1/*
2This is part of WHY2
3Copyright (C) 2022-2026 Václav Šmejkal
4
5This program is free software: you can redistribute it and/or modify
6it under the terms of the GNU General Public License as published by
7the Free Software Foundation, either version 3 of the License, or
8(at your option) any later version.
9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program.  If not, see <https://www.gnu.org/licenses/>.
17*/
18
19use zeroize::Zeroizing;
20
21use std::sync::atomic::{ AtomicBool, Ordering };
22
23#[cfg(feature = "client")]
24use std::sync::
25{
26    Arc,
27    Mutex,
28    RwLock,
29    LazyLock,
30    OnceLock,
31    atomic::AtomicUsize,
32};
33
34//CONSTS
35pub const METADATA_URL: &str        = "https://crates.io/api/v1/crates/why2";                             //URL FOR PROJECT METADATA
36
37pub const USER_CONFIG_DIR: &str     = "{HOME}/.config";                                                   //USER CONFIG DIRECTORY
38pub const CONFIG_DIR: &str          = "/WHY2";                                                            //DIRECTORY FOR CONFIG FILES
39pub const SERVER_CONFIG: &str       = "/server.toml";                                                     //SERVER CONFIG FILE
40pub const CLIENT_CONFIG: &str       = "/client.toml";                                                     //CLIENT CONFIG FILE
41pub const SERVER_USERS_CONFIG: &str = "/server_users.toml";                                               //SERVER USERS CONFIG FILE
42pub const CONFIG_URL: &str          = "https://git.satan.red/ENGO150/WHY2/-/raw/development/chat/config"; //CONFIG FILE DOWNLOAD URL
43
44pub const SERVER_KEYS_CONFIG: &str  = "/server_keys.toml";                                                //SERVER PUBKEY CONFIG FILE
45pub const SERVER_KEYS_DIR: &str     = "/server_keys";                                                     //SERVER KEYS DIRECTORY
46pub const SERVER_SKEY: &str         = "/private";                                                         //SERVER PRIVATE KEY FILE
47pub const SERVER_PKEY: &str         = "/public";                                                          //SERVER PUBLIC KEY FILE
48pub const SERVER_PQ_SKEY: &str      = "/private_pq";                                                      //SERVER POST-QUANTUM PRIVATE KEY FILE
49pub const SERVER_PQ_PKEY: &str      = "/public_pq";                                                       //SERVER POST-QUANTUM PUBLIC KEY FILE
50
51pub const FETCH_TIMEOUT: u64        = 5000;                                                               //TIMOUT FOR FETCHING DATA (MS)
52
53pub const REKEY_INTERVAL: u64       = 600;                                                                //INTERVAL FOR RE-REKEYING (SECS)
54
55//DO NOT CHANGE CONST BELOW UNLESS YOU ARE ABSOLUTELY SURE WHAT ARE YOU DOING
56pub const GRID_DIMENSIONS: (usize, usize) = (8, 8);                                                       //DIMENSIONS OF REX GRID
57
58//TYPES
59pub type SharedKeys = (Zeroizing<Vec<i64>>, Zeroizing<Vec<u8>>);
60
61//SETTINGS
62#[cfg(feature = "server")]
63static VOICE_CHAT: AtomicBool = AtomicBool::new(false);
64
65#[cfg(feature = "client")]
66static KEYS: LazyLock<RwLock<Option<SharedKeys>>> = LazyLock::new(|| //SHARED SYMMETRIC KEY
67{
68    RwLock::new(None)
69});
70
71#[cfg(feature = "client")]
72static ASKING_PASSWORD: AtomicBool = AtomicBool::new(false); //CLIENT IS SENDING PASSWORD (DISABLE ECHO)
73
74#[cfg(feature = "client")]
75static EXTRA_SPACE: AtomicBool = AtomicBool::new(false); //CLIENT DISPLAYED SOME MENU (/help ETC.), ADD EXTRA SPACE ON NEXT MESSAGE
76
77#[cfg(feature = "client")]
78static SENDING_MESSAGES: AtomicBool = AtomicBool::new(false); //SENDING MESSAGES BOOL (CONDITION FOR ADDING MESSAGES TO HISTORY)
79
80#[cfg(feature = "client")]
81pub static INPUT_READ: LazyLock<Arc<Mutex<Vec<char>>>> = LazyLock::new(|| //INPUT READ FROM CLIENT
82{
83    Arc::new(Mutex::new(Vec::new()))
84});
85
86#[cfg(feature = "client")]
87static SEQ: AtomicUsize = AtomicUsize::new(0); //PACKET SEQUENCE NUMBER (CLIENT -> SERVER)
88
89#[cfg(feature = "client")]
90static SERVER_SEQ: AtomicUsize = AtomicUsize::new(0); //PACKET SEQUENCE NUMBER (SERVER -> CLIENT)
91
92#[cfg(feature = "client")]
93static SERVER_ADDRESS: OnceLock<String> = OnceLock::new();
94
95#[cfg(feature = "client")]
96static SOCKS5: AtomicBool = AtomicBool::new(false); //USE SOCKS5 (TOR)
97
98//FUNCTIONS
99//VOICE CHAT
100#[cfg(feature = "server")]
101pub fn enable_voice_chat() //SET VOICE CHAT TO TRUE
102{
103    VOICE_CHAT.store(true, Ordering::Relaxed);
104}
105
106#[cfg(feature = "server")]
107pub fn voice_chat_enabled() -> bool //GET VOICE CHAT
108{
109    VOICE_CHAT.load(Ordering::Relaxed)
110}
111
112//SHARED KEYS
113#[cfg(feature = "client")]
114pub fn set_keys(keys: SharedKeys) //SET KEY
115{
116    let mut shared_key = KEYS.write().unwrap();
117    *shared_key = Some(keys);
118}
119
120#[cfg(feature = "client")]
121pub fn get_keys() -> Option<SharedKeys> //RETURN KEY
122{
123    let shared_key = KEYS.read().unwrap();
124    shared_key.clone()
125}
126
127//ASKING PASSWORD
128#[cfg(feature = "client")]
129pub fn set_asking_password(value: bool) //SET ASKING_PASSWORD
130{
131    ASKING_PASSWORD.store(value, Ordering::Relaxed);
132}
133
134#[cfg(feature = "client")]
135pub fn get_asking_password() -> bool //GET ASKING_PASSWORD
136{
137    ASKING_PASSWORD.load(Ordering::Relaxed)
138}
139
140//ADD EXTRA SPACE
141#[cfg(feature = "client")]
142pub fn set_extra_space(value: bool) //SET EXTRA_SPACE
143{
144    EXTRA_SPACE.store(value, Ordering::Relaxed);
145}
146
147#[cfg(feature = "client")]
148pub fn get_extra_space() -> bool //GET EXTRA_SPACE
149{
150    EXTRA_SPACE.load(Ordering::Relaxed)
151}
152
153//SENDING MESSAGES
154#[cfg(feature = "client")]
155pub fn get_sending_messages() -> bool //GET SENDING_MESSAGES
156{
157    SENDING_MESSAGES.load(Ordering::Relaxed)
158}
159
160#[cfg(feature = "client")]
161pub fn set_sending_messages(value: bool) //SET SENDING_MESSAGES
162{
163    SENDING_MESSAGES.store(value, Ordering::Relaxed);
164}
165
166#[cfg(feature = "client")]
167pub fn get_seq() -> usize //GET SEQUENCE NUMBER
168{
169    SEQ.load(Ordering::Relaxed)
170}
171
172#[cfg(feature = "client")]
173pub fn set_seq(value: usize) //SET SEQUENCE NUMBER
174{
175    SEQ.store(value, Ordering::Relaxed)
176}
177
178#[cfg(feature = "client")]
179pub fn get_server_seq() -> usize //GET SERVER SEQUENCE NUMBER
180{
181    SERVER_SEQ.load(Ordering::Relaxed)
182}
183
184#[cfg(feature = "client")]
185pub fn set_server_seq(value: usize) //SET SERVER SEQUENCE NUMBER
186{
187    SERVER_SEQ.store(value, Ordering::Relaxed)
188}
189
190//SERVER ADDRESS
191#[cfg(feature = "client")]
192pub fn get_server_address() -> String //GET SERVER ADDRESS
193{
194    SERVER_ADDRESS.get().unwrap().to_owned()
195}
196
197#[cfg(feature = "client")]
198pub fn set_server_address(address: &str) //SET SERVER ADDRESS
199{
200    SERVER_ADDRESS.set(address.to_owned()).unwrap();
201}
202
203//SOCKS5
204#[cfg(feature = "client")]
205pub fn enable_socks5() //SET SOCKS5 TO TRUE
206{
207    SOCKS5.store(true, Ordering::Relaxed);
208}
209
210#[cfg(feature = "client")]
211pub fn socks5_enabled() -> bool //GET SOCKS5
212{
213    SOCKS5.load(Ordering::Relaxed)
214}