use std::{net::SocketAddr, sync::Arc}; use dashmap::DashMap; use itertools::Itertools; use uuid::Uuid; use super::{ config::Config, event::{Listener, PacketHandler}, player::context::ClientContext, }; // Контекст сервера // Должен быть обернут в Arc для передачи между потоками pub struct ServerContext { pub config: Arc, pub clients: DashMap>, listeners: Vec>, handlers: Vec>, } impl ServerContext { pub fn new(config: Arc) -> ServerContext { ServerContext { config, listeners: Vec::new(), handlers: Vec::new(), clients: DashMap::new(), } } pub fn get_player_by_uuid(self: &Arc, uuid: Uuid) -> Option> { self.clients .iter() .find(|o| { let info = o.player_info(); if let Some(info) = info { info.uuid == uuid } else { false } }) .map(|o| o.clone()) } pub fn get_player_by_name(self: &Arc, name: &str) -> Option> { self.clients .iter() .find(|o| { let info = o.player_info(); if let Some(info) = info { info.name == name } else { false } }) .map(|o| o.clone()) } pub fn players(self: &Arc) -> Vec> { self.clients .iter() .filter(|o| o.player_info().is_some()) .map(|o| o.clone()) .collect() } pub fn add_packet_handler(&mut self, handler: Box) { self.handlers.push(handler); } pub fn add_listener(&mut self, listener: Box) { self.listeners.push(listener); } pub fn packet_handlers(self: &Arc, sort_by: F) -> Vec<&Box> where K: Ord, F: FnMut(&&Box) -> K, { self.handlers.iter().sorted_by_key(sort_by).collect_vec() } pub fn listeners(self: &Arc, sort_by: F) -> Vec<&Box> where K: Ord, F: FnMut(&&Box) -> K, { self.listeners.iter().sorted_by_key(sort_by).collect_vec() } }