chiark / gitweb /
wip links
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 3 Jan 2021 22:54:48 +0000 (22:54 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 3 Jan 2021 22:54:48 +0000 (22:54 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/cmdlistener.rs
daemon/session.rs
src/global.rs
src/sse.rs
src/updates.rs
templates/landscape.tera
templates/session.tera

index d018d107eca706fae1b1258b89d72ae3a42c152a..30debbef41292ca87492bdf1b011586b0b67eba4 100644 (file)
@@ -441,22 +441,23 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
       Ok(Resp::Info(info))
     })?,
 
-    Insn::SetLinks(spec_links) =>  {
+    Insn::SetLinks(mut spec_links) =>  {
       let ig = cs.check_acl(ag, ig, PCH::Instance, &[TP::SetLinks])?.0;
       let mut new_links : LinksTable = default();
       for (k,v) in spec_links.drain() {
         let url : Url = (&v).try_into()?;
         new_links[k] = Some(url.into_string());
       }
-      ig.links = new_links;
+      let new_links = Arc::new(new_links);
+      ig.links = new_links.clone();
       let log = vec![LogEntry {
         html: Html(format!("{} set the links to off-server game resources",
                            &who.0)),
       }];
       (U{ log,
           pcs: vec![],
-          raw: vec![ PreparedUpdateEntry::SetLinks ]},
-       Fine, eg)
+          raw: Some(vec![ PreparedUpdateEntry::SetLinks(new_links) ])},
+       Fine, ig)
     }
 
     ResetPlayerAccess(player) => {
index 3f7406515e64b600bdd9219f7ea3f22726af81ed..e52bf99ac5fbfde7c08bff803333aabdc424e899 100644 (file)
@@ -18,7 +18,7 @@ struct SessionRenderContext {
   load: String,
   log: Vec<SessionFormattedLogEntry>,
   sse_url_prefix: String,
-  links: Vec<(LinkKind, Html)>,
+  links: Html,
 }
 
 #[derive(Debug,Serialize)]
@@ -187,8 +187,7 @@ fn session_inner(form : Json<SessionForm>,
       nick : gpl.nick.clone(),
       sse_url_prefix,
       ptoken: form.ptoken.clone(),
-      links: ig.links.iter()
-        .filter_map(|(k,v)| Some((k.clone(), v.clone()?))).collect(),
+      links: (&*ig.links).into(),
       load : serde_json::to_string(&DataLoad {
         players: load_players,
         last_log_ts: timestamp_abbrev.unwrap_or_default(),
index c9288eb0b52290d90c27a059a1392866125b455d..10f13bd434767aaf1ce525d96f2483e0c968450a 100644 (file)
@@ -51,7 +51,7 @@ pub struct Instance {
   pub tokens_players: TokenRegistry<PlayerId>,
   pub tokens_clients: TokenRegistry<ClientId>,
   pub acl: LoadedAcl<TablePermission>,
-  pub links: LinksTable,
+  pub links: Arc<LinksTable>,
 }
 
 pub struct PlayerRecord {
@@ -218,7 +218,7 @@ struct InstanceSaveAccesses<RawTokenStr, PiecesLoadedRef> {
   tokens_players: Vec<(RawTokenStr, PlayerId)>,
   aplayers: SecondarySlotMap<PlayerId, IPlayerState>,
   acl: Acl<TablePermission>,
-  #[serde(default)] pub links: LinksTable,
+  #[serde(default)] pub links: Arc<LinksTable>,
 }
 
 display_as_debug!{InstanceLockError}
@@ -459,6 +459,9 @@ impl Deref for LinksTable {
   type Target = EnumMap<LinkKind, Option<String>>;
   fn deref(&self) -> &Self::Target { &self.0 }
 }
+impl DerefMut for LinksTable {
+  fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 }
+}
 
 impl From<&LinksTable> for Html {
   fn from(links: &LinksTable) -> Html {
index 01482159968b2af10b365992cab88534abc1dcd9..497171a25490d9431056bbc920073eb5febe5127 100644 (file)
@@ -92,7 +92,6 @@ impl Read for UpdateReader {
     }
 
     let g = &mut *ig;
-    let for_json_len = InstanceForJsonLen { links: &g.links };
     let iplayer = &mut match g.iplayers.get_mut(self.player) {
       Some(x) => x,
       None => {
@@ -133,7 +132,7 @@ impl Read for UpdateReader {
           break
         }
       };
-      let next_len = UPDATE_MAX_FRAMING_SIZE + next.json_len(&for_json_len);
+      let next_len = UPDATE_MAX_FRAMING_SIZE + next.json_len();
       if next_len > buf.len() {
         if buf.len() != orig_wanted { break }
 
index a979c0852846211c4d9d713ee4bc7ed6586f7a05..4c38a6465df4fa84851a9ee2e41739bb4c5e09b4 100644 (file)
@@ -48,7 +48,7 @@ pub enum PreparedUpdateEntry {
   },
   SetTableSize(Pos),
   SetTableColour(Colour),
-  SetLinks, // we use whatever the most recent is
+  SetLinks(Arc<LinksTable>),
   AddPlayer { player: PlayerId, data: DataLoadPlayer },
   RemovePlayer { player: PlayerId },
   Log (Arc<CommittedLogEntry>),
@@ -147,10 +147,6 @@ impl PlayerUpdatesBuildContext {
   }
 }
 
-pub struct InstanceForJsonLen<'i> {
-  links: &'i LinksTable,
-}
-
 impl PlayerUpdates {
   pub fn new_begin(gs: &GameState) -> PlayerUpdatesBuildContext {
     let u1 = Arc::new(PreparedUpdate {
@@ -187,13 +183,13 @@ impl PlayerUpdates {
 }
 
 impl PreparedUpdate {
-  pub fn json_len(&self, ig: &InstanceForJsonLen) -> usize {
-    self.us.iter().map(|u| 20 + u.json_len(ig)).sum()
+  pub fn json_len(&self) -> usize {
+    self.us.iter().map(|u| 20 + u.json_len()).sum()
   }
 }
 
 impl PreparedUpdateEntry {
-  pub fn json_len(&self, ig: &InstanceForJsonLen) -> usize {
+  pub fn json_len(&self) -> usize {
     use PreparedUpdateEntry::*;
     match self {
       Piece { ref op, .. } => {
@@ -209,8 +205,8 @@ impl PreparedUpdateEntry {
       SetTableColour(colour) => {
         colour.0.as_bytes().len() + 50
       }
-      SetLinks => {
-        ig.links.iter().filter_map(
+      SetLinks(links) => {
+        links.iter().filter_map(
           |(_k,v)| Some(50 + v.as_ref()?.len())
         ).sum::<usize>() + 50
       }
@@ -563,8 +559,8 @@ impl PreparedUpdate {
             continue
           }
         }
-        PUE::SetLinks => {
-          
+        PUE::SetLinks(links) => {
+          TUE::SetLinks((&**links).into())
         }
       };
       ents.push(ue);
index 288fc39187d0bdb4d97c66e739c84ead3e4f9756..676163d7acbaa05653f3e52a0ffc9d24d5d38478 100644 (file)
       {{ m::nick() }} |
       {{ m::status() }}<br/>
     </div>
-{%- for l in links -%}
-{%-  if l.first -%}
-    <div>
-{%-  else -%}
-|
-{%-  endif -%}
-<a href="{{ l.1 }}">{{ l.0 }}</a>
-xxx core should be in some other .tera file so we can reuse it on update
-{%-  if l.last -%}
-    </div>
-{%-  endif -%}
-{%- endfor -%}
+{%- if links != "" -%}
+    <div id="links">{{ links }}</div>
+{%- endif -%}
     <div>
       <a href="/p?{{ ptoken }}">switch to portrait view</a> |
       {{ m::zoom() }}
index dc0a7e1fa70d93c84c0b57029890609f743c9a40..33218232b523e9f7b25dbff32fb7e372a0f1b686 100644 (file)
@@ -37,6 +37,9 @@ g{{ m::wresting() }}
 {{ m::status() }}
 |
 <a href="/l?{{ ptoken }}">switch to landscape view</a> |
+{%- if links != "" -%}
+<span id="links">| {{ links }}</span>
+{%- endif -%}
 {{ m::zoom() }}
 {{ m::errors() }}