summaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'server/src')
-rw-r--r--server/src/main.rs58
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()
}