chiark / gitweb /
logentry
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 6 Jul 2020 14:59:20 +0000 (15:59 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 6 Jul 2020 14:59:20 +0000 (15:59 +0100)
src/bin/server.rs
src/gamestate.rs
src/global.rs
src/sse.rs

index 0f21f7dd62710c59c4b122681dfe79584659d64e..3edfcb742cb14132796470a5871db00a80d406c7 100644 (file)
@@ -134,6 +134,7 @@ fn api_grab(form : Json<ApiGrab>) -> impl response::Responder<'static> {
   let g_updates = &mut g.updates;
   let gs_pieces = &mut g.gs.pieces;
   let gs_gen = &mut g.gs.gen;
+  let gs_log = &mut g.gs.log;
   let r : Result<(),GameError> = (||{
     let piece = decode_visible_pieceid(form.piece);
     let p = gs_pieces.byid_mut(piece)?;
@@ -155,6 +156,14 @@ fn api_grab(form : Json<ApiGrab>) -> impl response::Responder<'static> {
       id : vpiece, 
       face : p.face,
     };
+    let logentry = Arc::new(LogEntry {
+      msg : format!("{} grasped {}",
+                    &htmlescape::encode_minimal(&pl.nick),
+                    p.describe_html(&pri)),
+                    // split view: pri should be global
+                    // (currently log is one global view)
+    });
+    gs_log.push((gen,logentry.clone()));
     let op = PieceUpdateOp::Modify(p.prep_piecestate(&pri));
     let update = PreparedUpdate {
       gen,
@@ -165,14 +174,9 @@ fn api_grab(form : Json<ApiGrab>) -> impl response::Responder<'static> {
           piece : vpiece,
           op,
         },
-        PreparedUpdateEntry::Log {
-          msg : Arc::new(format!("{} grasped {}",
-                                 &htmlescape::encode_minimal(&pl.nick),
-                                 p.describe_html(&pri)
-                                 // split view: pri should be global
-                                 // (currently log is one global view)
-          )),
-        },
+        PreparedUpdateEntry::Log (
+          logentry,
+        ),
       ],
     };
     let update = Arc::new(update);
index 5e7704b943ba822b8c982f3cb47be7a1b8356a64..faa3afe838ec570f7259aec4d7f90a7c512fc618 100644 (file)
@@ -104,6 +104,7 @@ pub struct GameState {
   pub pieces : DenseSlotMap<PieceId,PieceRecord>,
   pub players : DenseSlotMap<PlayerId,Player>,
   pub gen : Generation,
+  pub log : Vec<(Generation, Arc<LogEntry>)>,
 }
 
 #[derive(Debug)]
@@ -111,6 +112,11 @@ pub struct Player {
   pub nick : String,
 }
 
+#[derive(Debug,Serialize)]
+pub struct LogEntry {
+  pub msg : String,
+}
+
 pub fn xxx_gamestate_init() -> GameState {
   let mut pieces = DenseSlotMap::with_key();
   for (pos, p) in xxx_make_pieces() {
@@ -124,5 +130,6 @@ pub fn xxx_gamestate_init() -> GameState {
     };
     pieces.insert(pr);
   }
-  GameState { pieces, gen : Generation(1), players : Default::default(),  }
+  GameState { pieces, gen : Generation(1), players : Default::default(),
+              log : Default::default(), }
 }
index a049b9681fa31abb3a094d6eac96b2a6bed3d437..18895a4ec6c9c3d46121dd4cc003b37e4f2f075d 100644 (file)
@@ -31,9 +31,7 @@ pub enum PreparedUpdateEntry {
     piece : VisiblePieceId,
     op : PieceUpdateOp<PreparedPieceState>,
   },
-  Log {
-    msg : Arc<String>,
-  },
+  Log (Arc<LogEntry>),
 }
 impl PreparedUpdateEntry {
   pub fn json_len(&self) -> usize {
@@ -43,8 +41,8 @@ impl PreparedUpdateEntry {
         50 +
         op.new_state().map(|x| x.svg.len()).unwrap_or(0)
       },
-      Log { msg } => {
-        msg.as_bytes().len() * 3
+      Log(logent) => {
+        logent.msg.as_bytes().len() * 3
       }
     }
   }
index 936f041a94da5ffb1346f05ab7768e9ae652ff5b..bf5e45cf158b51c95ad2b006d802db4e6e7d93d6 100644 (file)
@@ -56,9 +56,7 @@ enum TransmitUpdate<'u> {
     piece : VisiblePieceId,
     op : &'u PieceUpdateOp<PreparedPieceState>,
   },
-  Log {
-    msg : &'u str,
-  },
+  Log (&'u LogEntry),
 }
 
 #[derive(Error,Debug)]
@@ -103,8 +101,8 @@ impl Read for UpdateReader {
           &PreparedUpdateEntry::Piece { piece, ref op, .. } => {
             TransmitUpdate::Piece { piece, op }
           },
-          PreparedUpdateEntry::Log { msg } => {
-            TransmitUpdate::Log { msg }
+          PreparedUpdateEntry::Log(logent) => {
+            TransmitUpdate::Log(&*logent)
           },
         };
         serde_json::to_writer(&mut buf, &tu)?;