chiark / gitweb /
wip links - does not compile
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 3 Jan 2021 02:01:14 +0000 (02:01 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 3 Jan 2021 10:47:27 +0000 (10:47 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Cargo.lock.example
Cargo.toml
daemon/session.rs
src/bin/otter.rs
src/commands.rs
src/global.rs
src/imports.rs
src/spec.rs
templates/landscape.tera
templates/session.tera

index 4c2a6d1ba3cfe923a046eb282397ba401c30e634..8d78b0414f8d7d1243a6f354dc7253373b968df7 100644 (file)
@@ -100,6 +100,12 @@ version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3f8ebf5827e4ac4fd5946560e6a99776ea73b596d80898f357007317a7141e47"
 
+[[package]]
+name = "array-macro"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06e97b4e522f9e55523001238ac59d13a8603af57f69980de5d8de4bbbe8ada6"
+
 [[package]]
 name = "arrayvec"
 version = "0.5.2"
@@ -496,6 +502,28 @@ dependencies = [
  "cfg-if 1.0.0",
 ]
 
+[[package]]
+name = "enum-map"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4187999839f4ae8be35cf185d1381aa8dc32d2f5951349cc37ae49ebc4781855"
+dependencies = [
+ "array-macro",
+ "enum-map-derive",
+ "serde",
+]
+
+[[package]]
+name = "enum-map-derive"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5c450cf304c9e18d45db562025a14fb1ca0f5c769b6f609309f81d4c31de455"
+dependencies = [
+ "proc-macro2 1.0.24",
+ "quote 1.0.8",
+ "syn 1.0.57",
+]
+
 [[package]]
 name = "env_logger"
 version = "0.8.2"
@@ -1556,6 +1584,7 @@ dependencies = [
  "delegate 0.5.0",
  "derive_more",
  "either",
+ "enum-map",
  "failure",
  "fehler",
  "flexi_logger",
index 18f41a943c7b3cd45b4a6a7a66af167c9d00f0e2..25383485c26dd1c12e5d204802f431e1f888abfc 100644 (file)
@@ -26,6 +26,7 @@ chrono-tz = "0.5"
 delegate = "0.5"
 derive_more = "0.99"
 either = "1"
+enum-map = { version = "0.6", features = [ "serde" ] }
 failure = "0.1.8" # for pwd
 fehler = "1"
 flexi_logger = { version = "0.16", features = [ "specfile" ] }
index 9cd70ce9d74021deb06a2dc4c75621e54b312dc8..fabce96aed3f62ff6bdbd42e6ffcfce2405e7249 100644 (file)
@@ -18,6 +18,7 @@ struct SessionRenderContext {
   load: String,
   log: Vec<SessionFormattedLogEntry>,
   sse_url_prefix: String,
+  links: Vec<(LinkKind, Html)>,
 }
 
 #[derive(Debug,Serialize)]
@@ -186,6 +187,7 @@ fn session_inner(form : Json<SessionForm>,
       nick : gpl.nick.clone(),
       sse_url_prefix,
       ptoken: form.ptoken.clone(),
+      links: ig.links.iter().map(|(k,v)| (k.clone(), v.clone())).collect(),
       load : serde_json::to_string(&DataLoad {
         players: load_players,
         last_log_ts: timestamp_abbrev.unwrap_or_default(),
index ccac6d445657dca76a64f6f92b3104cd859c2ecc..814c05ba81405ba09eaa6ec7bda3b0efaef1f851 100644 (file)
@@ -630,7 +630,7 @@ const PLAYER_DEFAULT_PERMS : &[TablePermission] = &[
 
 #[throws(AE)]
 fn setup_table(_ma: &MainOpts, spec: &TableSpec) -> Vec<MGI> {
-  let TableSpec { players, player_perms, acl } = spec;
+  let TableSpec { players, player_perms, acl, links } = spec;
   let mut player_perms = player_perms.clone()
     .unwrap_or(PLAYER_DEFAULT_PERMS.iter().cloned().collect());
   player_perms.extend(PLAYER_ALWAYS_PERMS.iter());
@@ -831,6 +831,46 @@ mod reset_game {
   )}
 }
 
+//---------- set-link ----------
+
+mod set_link {
+
+  use super::*;
+
+  #[derive(Default,Debug)]
+  struct Args {
+    table_name: String,
+    kind: LinkKind,
+    url: Option<String>,
+  }
+
+  fn subargs(sa: &mut Args) -> ArgumentParser {
+    use argparse::*;
+    let mut ap = ArgumentParser::new();
+    ap.refer(&mut sa.table_name).required()
+      .add_argument("TABLE-NAME",Store,"table name");
+    ap.refer(&mut sa.kind).required()
+      .add_argument("LINK-KIND",Store,"link kind");
+    ap.refer(&mut sa.url)
+      .add_argument("URL",Store,"url (or empty for none)");
+    ap
+  }
+
+  fn call(_sc: &Subcommand, ma: MainOpts, args: Vec<String>) ->Result<(),AE> {
+    let args = parse_args::<Args,_>(args, &subargs, &ok_id, None);
+    let mut chan = access_game(&ma, &args.table_name)?;
+
+    let mut insns = vec![];
+    
+  }
+
+  inventory::submit!{Subcommand(
+    "set-link",
+    "Set one of the info links visible from within the game",
+    call,
+  )}
+}
+
 //---------- join-game ----------
 
 mod join_game {
index 8216001120e912a572d4b428dd97acfbc75f3e36..3570ce55c23a1f5c8570fad3029b1a13fbc29844 100644 (file)
@@ -86,6 +86,10 @@ pub enum MgmtGameInstruction {
   UpdatePlayer { player: PlayerId, details: MgmtPlayerDetails },
   LeaveGame(PlayerId),
 
+  SetLinks(HashMap<LinkKind,String>),
+  RemoveLink { kind: LinkKind, url: String },
+  SetLink { kind: LinkKind, url: String },
+
   ClearLog,
   SetACL { acl: Acl<TablePermission> },
   // RemovePlayer { player: PlayerId },  todo, does a special setacl
@@ -122,6 +126,7 @@ pub struct AccessTokenReport { pub lines: Vec<String> }
 pub struct MgmtGameResponseGameInfo {
   pub table_size: Pos,
   pub players: SecondarySlotMap<PlayerId, MgmtPlayerInfo>,
+  pub links: Vec<(LinkKind, String>),
 }
 
 #[derive(Debug,Clone,Serialize,Deserialize)]
index b83674bc68d8cf1402303ac1ab7715eeae6b5649..696e7921ac8ac0d2233af750640a1f1ba376217c 100644 (file)
@@ -38,7 +38,7 @@ pub struct InstanceName {
 #[derive(Debug,Clone)]
 pub struct InstanceRef (Arc<Mutex<InstanceContainer>>);
 
-type LinksTable = HashMap<LinkKind, Html>;
+pub type LinksTable = EnumMap<LinkKind, Option<Html>>;
 
 pub struct Instance {
   pub name: Arc<InstanceName>,
@@ -52,13 +52,6 @@ pub struct Instance {
   pub links: LinksTable,
 }
 
-#[derive(Copy,Clone,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]
-#[derive(Serialize,Deserialize)]
-pub enum LinkKind {
-  Voice,
-  Info,
-}
-
 pub struct PlayerRecord {
   pub u: PlayerUpdates,
   pub ipl: IPlayerState,
index 394f3659d0f0f930ae05fc96da26485ae9224da9..ff078e8d3f3f5ebcea0050f50b18733c39322527 100644 (file)
@@ -46,6 +46,7 @@ pub use arrayvec::ArrayVec;
 pub use boolinator::Boolinator as _;
 pub use delegate::delegate;
 pub use either::{Either, Left, Right};
+pub use enum_map::{Enum, EnumMap};
 pub use fehler::{throw, throws};
 pub use flexi_logger::{self, LogSpecification};
 pub use fs2::FileExt;
index ec8ab6a7d1c1eba1e68f20e0a5943755891e2d26..6baab355a20542ebeffd6e1e053594e3207ca28f 100644 (file)
@@ -4,10 +4,12 @@
 
 // game specs
 
+use std::collections::hash_map::HashMap;
 use std::collections::hash_set::HashSet;
 use std::fmt::Debug;
 use std::hash::Hash;
 
+use enum_map::Enum;
 use fehler::throws;
 use index_vec::{define_index_type, IndexVec};
 use num_derive::{FromPrimitive, ToPrimitive};
@@ -71,6 +73,7 @@ pub struct TableSpec {
   #[serde(default)] pub players: Vec<TablePlayerSpec>,
   pub player_perms: Option<HashSet<TablePermission>>,
   #[serde(default)] pub acl: Acl<TablePermission>,
+  #[serde(default)] pub links: HashMap<LinkKind, String>,
 }
 
 #[derive(Debug,Serialize,Deserialize)]
@@ -110,6 +113,13 @@ pub enum TablePermission {
   Super,
 }
 
+#[derive(Copy,Clone,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]
+#[derive(Enum,Serialize,Deserialize)]
+pub enum LinkKind {
+  Voice,
+  Info,
+}
+
 //---------- player accesses, should perhaps be in commands.rs ----------
 
 #[derive(Debug,Serialize,Deserialize)]
index b97a8319bf27f9f3f8b4451091b57e29c7e0a518..288fc39187d0bdb4d97c66e739c84ead3e4f9756 100644 (file)
     <div>
       {{ m::nick() }} |
       {{ m::status() }}<br/>
-    </div><div>
+    </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 -%}
+    <div>
       <a href="/p?{{ ptoken }}">switch to portrait view</a> |
       {{ m::zoom() }}
     </div><div>
index b3cd770f3b2322ed2651aba2c3c8e5fe59f198f8..dc0a7e1fa70d93c84c0b57029890609f743c9a40 100644 (file)
@@ -32,7 +32,7 @@
 <div class="upper">
 {{ m::nick() }}
 |
-{{ m::wresting() }}
+g{{ m::wresting() }}
 |
 {{ m::status() }}
 |