summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml1
-rw-r--r--src/main.rs22
2 files changed, 20 insertions, 3 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 3fdd538..7c9776e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -15,3 +15,4 @@ specs = { version = "0.16", features = ["specs-derive"] }
rand = "0.7"
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }
+ctrlc = { version = "3.1", features = ["termination"] }
diff --git a/src/main.rs b/src/main.rs
index 1322801..6a2d863 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,6 +4,8 @@ use std::time::Duration;
use std::path::Path;
use std::path::PathBuf;
use std::str::FromStr;
+use std::sync::atomic::{AtomicBool, Ordering};
+use std::sync::Arc;
mod server;
mod gameserver;
@@ -79,12 +81,23 @@ fn main() -> Result<()>{
let mut world = World::new(default_encyclopedia(), loader, Box::new(storage), RoomId::from_str("room"));
+ let mut message_cache = MessageCache::default();
+
+ // close handler
+ // todo: don't let the closing wait on sleep (using a timer thread or recv_timeout)
+ let running = Arc::new(AtomicBool::new(true));
+ let r = running.clone();
+ ctrlc::set_handler(move || {
+ println!("shutting down");
+ r.store(false, Ordering::SeqCst);
+ }).expect("can't set close handler");
+
+
println!("asciifarm started");
- let mut message_cache = MessageCache::default();
let mut count = 0;
- loop {
+ while running.load(Ordering::SeqCst) {
let actions = gameserver.update();
for action in actions {
match action {
@@ -109,13 +122,16 @@ fn main() -> Result<()>{
if message.is_empty(){
continue;
}
- //println!("c {}", message.to_json());
let _ = gameserver.send(&player, message.to_json());
}
count += 1;
sleep(Duration::from_millis(100));
}
+ println!("saving world");
+ world.save();
+ println!("world saved");
+ Ok(())
}