1use 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
34pub const METADATA_URL: &str = "https://crates.io/api/v1/crates/why2"; pub const USER_CONFIG_DIR: &str = "{HOME}/.config"; pub const CONFIG_DIR: &str = "/WHY2"; pub const SERVER_CONFIG: &str = "/server.toml"; pub const CLIENT_CONFIG: &str = "/client.toml"; pub const SERVER_USERS_CONFIG: &str = "/server_users.toml"; pub const CONFIG_URL: &str = "https://git.satan.red/ENGO150/WHY2/-/raw/development/chat/config"; pub const SERVER_KEYS_CONFIG: &str = "/server_keys.toml"; pub const SERVER_KEYS_DIR: &str = "/server_keys"; pub const SERVER_SKEY: &str = "/private"; pub const SERVER_PKEY: &str = "/public"; pub const SERVER_PQ_SKEY: &str = "/private_pq"; pub const SERVER_PQ_PKEY: &str = "/public_pq"; pub const FETCH_TIMEOUT: u64 = 5000; pub const REKEY_INTERVAL: u64 = 600; pub const GRID_DIMENSIONS: (usize, usize) = (8, 8); pub type SharedKeys = (Zeroizing<Vec<i64>>, Zeroizing<Vec<u8>>);
60
61#[cfg(feature = "server")]
63static VOICE_CHAT: AtomicBool = AtomicBool::new(false);
64
65#[cfg(feature = "client")]
66static KEYS: LazyLock<RwLock<Option<SharedKeys>>> = LazyLock::new(|| {
68 RwLock::new(None)
69});
70
71#[cfg(feature = "client")]
72static ASKING_PASSWORD: AtomicBool = AtomicBool::new(false); #[cfg(feature = "client")]
75static EXTRA_SPACE: AtomicBool = AtomicBool::new(false); #[cfg(feature = "client")]
78static SENDING_MESSAGES: AtomicBool = AtomicBool::new(false); #[cfg(feature = "client")]
81pub static INPUT_READ: LazyLock<Arc<Mutex<Vec<char>>>> = LazyLock::new(|| {
83 Arc::new(Mutex::new(Vec::new()))
84});
85
86#[cfg(feature = "client")]
87static SEQ: AtomicUsize = AtomicUsize::new(0); #[cfg(feature = "client")]
90static SERVER_SEQ: AtomicUsize = AtomicUsize::new(0); #[cfg(feature = "client")]
93static SERVER_ADDRESS: OnceLock<String> = OnceLock::new();
94
95#[cfg(feature = "client")]
96static SOCKS5: AtomicBool = AtomicBool::new(false); #[cfg(feature = "server")]
101pub fn enable_voice_chat() {
103 VOICE_CHAT.store(true, Ordering::Relaxed);
104}
105
106#[cfg(feature = "server")]
107pub fn voice_chat_enabled() -> bool {
109 VOICE_CHAT.load(Ordering::Relaxed)
110}
111
112#[cfg(feature = "client")]
114pub fn set_keys(keys: SharedKeys) {
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> {
123 let shared_key = KEYS.read().unwrap();
124 shared_key.clone()
125}
126
127#[cfg(feature = "client")]
129pub fn set_asking_password(value: bool) {
131 ASKING_PASSWORD.store(value, Ordering::Relaxed);
132}
133
134#[cfg(feature = "client")]
135pub fn get_asking_password() -> bool {
137 ASKING_PASSWORD.load(Ordering::Relaxed)
138}
139
140#[cfg(feature = "client")]
142pub fn set_extra_space(value: bool) {
144 EXTRA_SPACE.store(value, Ordering::Relaxed);
145}
146
147#[cfg(feature = "client")]
148pub fn get_extra_space() -> bool {
150 EXTRA_SPACE.load(Ordering::Relaxed)
151}
152
153#[cfg(feature = "client")]
155pub fn get_sending_messages() -> bool {
157 SENDING_MESSAGES.load(Ordering::Relaxed)
158}
159
160#[cfg(feature = "client")]
161pub fn set_sending_messages(value: bool) {
163 SENDING_MESSAGES.store(value, Ordering::Relaxed);
164}
165
166#[cfg(feature = "client")]
167pub fn get_seq() -> usize {
169 SEQ.load(Ordering::Relaxed)
170}
171
172#[cfg(feature = "client")]
173pub fn set_seq(value: usize) {
175 SEQ.store(value, Ordering::Relaxed)
176}
177
178#[cfg(feature = "client")]
179pub fn get_server_seq() -> usize {
181 SERVER_SEQ.load(Ordering::Relaxed)
182}
183
184#[cfg(feature = "client")]
185pub fn set_server_seq(value: usize) {
187 SERVER_SEQ.store(value, Ordering::Relaxed)
188}
189
190#[cfg(feature = "client")]
192pub fn get_server_address() -> String {
194 SERVER_ADDRESS.get().unwrap().to_owned()
195}
196
197#[cfg(feature = "client")]
198pub fn set_server_address(address: &str) {
200 SERVER_ADDRESS.set(address.to_owned()).unwrap();
201}
202
203#[cfg(feature = "client")]
205pub fn enable_socks5() {
207 SOCKS5.store(true, Ordering::Relaxed);
208}
209
210#[cfg(feature = "client")]
211pub fn socks5_enabled() -> bool {
213 SOCKS5.load(Ordering::Relaxed)
214}