chiark / gitweb /
reorganisation
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 27 Jun 2020 22:03:20 +0000 (23:03 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 27 Jun 2020 22:03:20 +0000 (23:03 +0100)
src/bin/server.rs
src/gamestate.rs
src/global.rs
src/imports.rs

index b8b1fcbfc4c25763803efffbd21c23a505c2672c..4fcd6c845e7e48229aba91e61bab54dfe49010d6 100644 (file)
@@ -52,7 +52,7 @@ fn loading(token : InstanceAccess) -> Result<Template,RE> {
 
 #[derive(Serialize,Debug)]
 struct SessionRenderContext {
-  clientid : u64,
+  clientid : ClientId,
   player : PlayerId,
   defs : Vec<String>,
   uses : Vec<String>,
@@ -67,14 +67,15 @@ fn session(form : Json<SessionForm>) -> Result<Template,RE> {
   // make session in this game, log a message to other players
   let iad = lookup_token(&form.token).ok_or_else(|| anyhow!("unknown token"))?;
   let c = {
-    let mut g = iad.i.lock().map_err(|e| anyhow!("lock poison {:?}",&e))?;
-    let user = g.users.get_mut(iad.user).ok_or_else(|| anyhow!("user deleted"))?;
+    let mut ig = iad.i.lock().map_err(|e| anyhow!("lock poison {:?}",&e))?;
+    let _player = ig.gs.players.get_mut(iad.player)
+      .ok_or_else(|| anyhow!("player deleted"))?;
     let client = Client { };
-    let clientid : slotmap::KeyData = user.clients.insert(client).into();
+    let clientid = ig.clients[iad.player].insert(client);
 
     let mut uses = vec![];
     let mut defs = vec![];
-    for (gpid, pr) in &g.gs.pieces {
+    for (gpid, pr) in &ig.gs.pieces {
       let pri = PieceRenderInstructions {
         id : make_pieceid_visible(gpid),
         face : pr.face,
@@ -102,8 +103,8 @@ fn session(form : Json<SessionForm>) -> Result<Template,RE> {
     }
 
     SessionRenderContext {
-      clientid : clientid.as_ffi(),
-      player : iad.user,
+      clientid,
+      player : iad.player,
       defs,
       uses,
     }
@@ -132,7 +133,7 @@ fn api_grab(form : Json<ApiGrab>) -> impl response::Responder<'static> {
     let p = decode_visible_pieceid(form.p);
     let p = g.gs.pieces.get_mut(p).ok_or(OpError::PieceGone)?;
     if p.held != None { Err(OpError::PieceHeld)? };
-    p.held = Some(iad.user);
+    p.held = Some(iad.player);
     Ok(())
   })();
   eprintln!("API {:?} => {:?}", &form, &r);
@@ -200,9 +201,12 @@ fn updates(token : &RawStr, clientid : u64) -> impl response::Responder<'static>
   let clientid = slotmap::KeyData::from_ffi(clientid);
   let clientid = clientid.into();
   let _ = {
-    let mut g = iad.i.lock().map_err(|e| anyhow!("lock poison {:?}",&e))?;
-    let user = g.users.get_mut(iad.user).ok_or_else(|| anyhow!("user deleted"))?;
-    let _client = user.clients.get_mut(clientid).ok_or_else(|| anyhow!("client deleted"))?;
+    let mut ig = iad.i.lock().map_err(|e| anyhow!("lock poison {:?}",&e))?;
+    let g = &mut ig.gs;
+    let _player = g.players.get_mut(iad.player)
+      .ok_or_else(|| anyhow!("user deleted"))?;
+    let _client = ig.clients[iad.player].get_mut(clientid)
+      .ok_or_else(|| anyhow!("client deleted"))?;
   };
   let tc = TestCounterInner { next : 0 };
   let tc = BufReader::new(tc);
index 02199c4d1642fc89cd30db52ca529509c23c5748..a85cdbf23d238a7004521ea103ac34f9d9a42028 100644 (file)
@@ -51,6 +51,12 @@ pub struct PieceRecord {
 #[derive(Debug)]
 pub struct GameState {
   pub pieces : DenseSlotMap<PieceId,PieceRecord>,
+  pub players : DenseSlotMap<PlayerId,Player>,
+}
+
+#[derive(Debug)]
+pub struct Player {
+  pub nick : String,
 }
 
 pub fn xxx_gamestate_init() -> GameState {
@@ -63,5 +69,5 @@ pub fn xxx_gamestate_init() -> GameState {
     };
     pieces.insert(pr);
   }
-  GameState { pieces }
+  GameState { pieces, players : Default::default() }
 }
index 8a97b467a9d7f330d2de8b1ec332f2a1df211121..43689b97bd6b0024aa950bdbf40660e7fabdc8a2 100644 (file)
@@ -19,21 +19,16 @@ impl Borrow<str> for RawToken {
 pub struct Client {
 }
 
-pub struct Player {
-  pub nick : String,
-  pub clients : DenseSlotMap<ClientId,Client>,
-}
-
 pub struct Instance {
   /* game state goes here */
-  pub users : DenseSlotMap<PlayerId,Player>,
   pub gs : GameState,
+  pub clients : SecondarySlotMap<PlayerId,DenseSlotMap<ClientId,Client>>,
 }
 
 #[derive(Clone)]
 pub struct InstanceAccessDetails {
   pub i : Arc<Mutex<Instance>>,
-  pub user : PlayerId,
+  pub player : PlayerId,
 }
 
 #[derive(Clone)]
@@ -57,7 +52,7 @@ pub fn lookup_token(s : &str) -> Option<InstanceAccessDetails> {
   GLOBAL.tokens.read().unwrap().get(s).cloned()
 }
 
-const XXX_USERS_TOKENS : &[(&str, &str)] = &[
+const XXX_PLAYERS_TOKENS : &[(&str, &str)] = &[
   ("kmqAKPwK4TfReFjMor8MJhdRPBcwIBpe", "alice"),
   ("ccg9kzoTh758QrVE1xMY7BQWB36dNJTx", "bob"),
 ];
@@ -75,18 +70,18 @@ impl<'r> FromParam<'r> for InstanceAccess<'r> {
 
 pub fn xxx_global_setup() {
   let i = Instance {
-    users : Default::default(),
     gs : xxx_gamestate_init(),
+    clients : Default::default(),
   };
   let i = Arc::new(Mutex::new(i));
   let mut ig = i.lock().unwrap();
-  for (token, nick) in XXX_USERS_TOKENS {
+  for (token, nick) in XXX_PLAYERS_TOKENS {
     let nu = Player {
       nick : nick.to_string(),
-      clients : Default::default(),
     };
-    let user = ig.users.insert(nu);
-    let ia = InstanceAccessDetails { i : i.clone(), user };
+    let player = ig.gs.players.insert(nu);
+    ig.clients.insert(player, Default::default());
+    let ia = InstanceAccessDetails { i : i.clone(), player };
     GLOBAL.tokens.write().unwrap().insert(
       RawToken(token.to_string()), ia
     );
index 61070b8cc706df06ede77e6ece62e46433ff9334..f960998a851e06ea9778ec157b0c407e843716cb 100644 (file)
@@ -27,7 +27,8 @@ pub use rocket::request::{FromParam,FromRequest,FromFormValue,LenientForm};
 pub use rocket::response::NamedFile;
 pub use rocket::response;
 
-pub use slotmap::dense::{DenseSlotMap};
+pub use slotmap::dense::DenseSlotMap;
+pub type SecondarySlotMap<K,V> = slotmap::secondary::SecondaryMap<K,V>;
 pub use index_vec::{define_index_type,index_vec,IndexVec};
 
 pub use crate::global::*;