diff options
Diffstat (limited to 'server/src/main.rs')
-rw-r--r-- | server/src/main.rs | 58 |
1 files changed, 46 insertions, 12 deletions
diff --git a/server/src/main.rs b/server/src/main.rs index 38238b3..88ee4b6 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -22,10 +22,14 @@ use log::{debug, info, warn}; use network::ServerNetwork; use std::{ collections::{BTreeSet, HashMap, HashSet}, + fs::File, + io::{BufReader, BufWriter}, marker::PhantomData, net::{IpAddr, SocketAddr}, + path::PathBuf, }; use weareshared::{ + helper::ReadWrite, packets::{Data, Object, Packet, Resource}, resources::{Prefab, PrefabIndex}, store::ResourceStore, @@ -56,6 +60,13 @@ fn main() -> Result<()> { let net = ServerNetwork::new(SocketAddr::new(args.bind_addr, args.port))?; let mut state = State::new()?; + let pi_file = prefab_index_path(); + if pi_file.exists() { + let mut pi_file = BufReader::new(File::open(pi_file)?); + state.prefab_index = PrefabIndex::read(&mut pi_file)?; + info!("prefab index loaded (len={})", state.prefab_index.0.len()) + } + while let Ok((conn, packet)) = net.recv.recv() { if let Err(e) = state.handle_packet(conn, packet, &net) { warn!("state handler error: ({conn}) {e}"); @@ -118,13 +129,7 @@ impl State { { let resource = Resource(resource.0, PhantomData::<Prefab>); if let Some(prefab) = self.store.get(resource.clone())? { - if let Some(name) = prefab.name { - self.prefab_index.0.insert(name, resource); - net.broadcast( - Packet::PrefabIndex(self.store.set(&self.prefab_index)?), - true, - ); - } + self.add_prefab_to_index(resource, net, prefab)?; } } } @@ -164,11 +169,15 @@ impl State { } Packet::AnnouncePrefab(resource) => { if self.prefab_index_have.insert(resource.clone()) { - self.prefab_index_pending.insert(resource.clone()); - net.broadcast( - Packet::RequestResource(Resource(resource.0, PhantomData)), - true, - ); + if let Some(prefab) = self.store.get(resource.clone())? { + self.add_prefab_to_index(resource, net, prefab)?; + } else { + self.prefab_index_pending.insert(resource.clone()); + net.broadcast( + Packet::RequestResource(Resource(resource.0, PhantomData)), + true, + ); + } } } Packet::Chat(object, message) => { @@ -178,4 +187,29 @@ impl State { } Ok(()) } + + pub fn add_prefab_to_index( + &mut self, + resource: Resource<Prefab>, + net: &ServerNetwork, + prefab: Prefab, + ) -> Result<()> { + if let Some(name) = prefab.name { + self.prefab_index.0.insert(name, resource); + self.prefab_index + .write(&mut BufWriter::new(File::create(prefab_index_path())?))?; + net.broadcast( + Packet::PrefabIndex(self.store.set(&self.prefab_index)?), + true, + ); + } + Ok(()) + } +} + +pub fn prefab_index_path() -> PathBuf { + xdg::BaseDirectories::with_prefix("wearechat") + .unwrap() + .place_data_file("prefab_index") + .unwrap() } |