use std::sync::
{
OnceLock,
atomic::{ AtomicBool, Ordering },
};
#[cfg(feature = "client")]
use std::
{
collections::HashSet,
sync::
{
Arc,
Mutex,
RwLock,
LazyLock,
atomic::AtomicUsize,
},
};
#[cfg(feature = "client")]
use crate::consts::SharedKeys;
static SERVER_USERNAME: OnceLock<String> = OnceLock::new();
#[cfg(feature = "server")]
static VOICE_CHAT: AtomicBool = AtomicBool::new(false);
#[cfg(feature = "client")]
static KEYS: LazyLock<RwLock<Option<SharedKeys>>> = LazyLock::new(|| {
RwLock::new(None)
});
#[cfg(feature = "client")]
static ASKING_PASSWORD: AtomicBool = AtomicBool::new(false);
#[cfg(feature = "client")]
static EXTRA_SPACE: AtomicBool = AtomicBool::new(false);
#[cfg(feature = "client")]
static SENDING_MESSAGES: AtomicBool = AtomicBool::new(false);
#[cfg(feature = "client")]
pub static INPUT_READ: LazyLock<Arc<Mutex<Vec<char>>>> = LazyLock::new(|| {
Arc::new(Mutex::new(Vec::new()))
});
#[cfg(feature = "client")]
static SEQ: AtomicUsize = AtomicUsize::new(0);
#[cfg(feature = "client")]
static SERVER_SEQ: AtomicUsize = AtomicUsize::new(0);
#[cfg(feature = "client")]
static SERVER_ADDRESS: OnceLock<String> = OnceLock::new();
#[cfg(feature = "client")]
static MUTE: AtomicBool = AtomicBool::new(false); #[cfg(feature = "client")]
static MUTED: LazyLock<Mutex<HashSet<usize>>> = LazyLock::new(|| Mutex::new(HashSet::new()));
#[cfg(feature = "client")]
static SOCKS5: AtomicBool = AtomicBool::new(false);
pub fn get_server_username() -> String {
SERVER_USERNAME.get().unwrap().to_owned()
}
pub fn set_server_username(username: &str) {
SERVER_USERNAME.set(username.to_owned()).unwrap();
}
#[cfg(feature = "server")]
pub fn enable_voice_chat() {
VOICE_CHAT.store(true, Ordering::Relaxed);
}
#[cfg(feature = "server")]
pub fn voice_chat_enabled() -> bool {
VOICE_CHAT.load(Ordering::Relaxed)
}
#[cfg(feature = "client")]
pub fn set_keys(keys: SharedKeys) {
let mut shared_key = KEYS.write().unwrap();
*shared_key = Some(keys);
}
#[cfg(feature = "client")]
pub fn get_keys() -> Option<SharedKeys> {
let shared_key = KEYS.read().unwrap();
shared_key.clone()
}
#[cfg(feature = "client")]
pub fn set_asking_password(value: bool) {
ASKING_PASSWORD.store(value, Ordering::Relaxed);
}
#[cfg(feature = "client")]
pub fn get_asking_password() -> bool {
ASKING_PASSWORD.load(Ordering::Relaxed)
}
#[cfg(feature = "client")]
pub fn set_extra_space(value: bool) {
EXTRA_SPACE.store(value, Ordering::Relaxed);
}
#[cfg(feature = "client")]
pub fn get_extra_space() -> bool {
EXTRA_SPACE.load(Ordering::Relaxed)
}
#[cfg(feature = "client")]
pub fn get_sending_messages() -> bool {
SENDING_MESSAGES.load(Ordering::Relaxed)
}
#[cfg(feature = "client")]
pub fn set_sending_messages(value: bool) {
SENDING_MESSAGES.store(value, Ordering::Relaxed);
}
#[cfg(feature = "client")]
pub fn get_seq() -> usize {
SEQ.load(Ordering::Relaxed)
}
#[cfg(feature = "client")]
pub fn set_seq(value: usize) {
SEQ.store(value, Ordering::Relaxed)
}
#[cfg(feature = "client")]
pub fn get_server_seq() -> usize {
SERVER_SEQ.load(Ordering::Relaxed)
}
#[cfg(feature = "client")]
pub fn set_server_seq(value: usize) {
SERVER_SEQ.store(value, Ordering::Relaxed)
}
#[cfg(feature = "client")]
pub fn get_server_address() -> String {
SERVER_ADDRESS.get().unwrap().to_owned()
}
#[cfg(feature = "client")]
pub fn set_server_address(address: &str) {
SERVER_ADDRESS.set(address.to_owned()).unwrap();
}
#[cfg(feature = "client")]
pub fn toggle_mute(id: Option<usize>) -> bool {
if let Some(id) = id {
let mut muted = MUTED.lock().unwrap();
if muted.remove(&id)
{
false
} else
{
muted.insert(id);
true
}
} else {
!MUTE.fetch_xor(true, Ordering::Relaxed)
}
}
#[cfg(feature = "client")]
pub fn is_muted(id: Option<usize>) -> bool {
if let Some(id) = id
{
MUTED.lock().unwrap().contains(&id)
} else
{
MUTE.load(Ordering::Relaxed)
}
}
#[cfg(feature = "client")]
pub fn enable_socks5() {
SOCKS5.store(true, Ordering::Relaxed);
}
#[cfg(feature = "client")]
pub fn socks5_enabled() -> bool {
SOCKS5.load(Ordering::Relaxed)
}