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) => {
load: String,
log: Vec<SessionFormattedLogEntry>,
sse_url_prefix: String,
- links: Vec<(LinkKind, Html)>,
+ links: Html,
}
#[derive(Debug,Serialize)]
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(),
pub tokens_players: TokenRegistry<PlayerId>,
pub tokens_clients: TokenRegistry<ClientId>,
pub acl: LoadedAcl<TablePermission>,
- pub links: LinksTable,
+ pub links: Arc<LinksTable>,
}
pub struct PlayerRecord {
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}
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 {
}
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 => {
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 }
},
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>),
}
}
-pub struct InstanceForJsonLen<'i> {
- links: &'i LinksTable,
-}
-
impl PlayerUpdates {
pub fn new_begin(gs: &GameState) -> PlayerUpdatesBuildContext {
let u1 = Arc::new(PreparedUpdate {
}
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, .. } => {
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
}
continue
}
}
- PUE::SetLinks => {
-
+ PUE::SetLinks(links) => {
+ TUE::SetLinks((&**links).into())
}
};
ents.push(ue);
{{ 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() }}
{{ m::status() }}
|
<a href="/l?{{ ptoken }}">switch to landscape view</a> |
+{%- if links != "" -%}
+<span id="links">| {{ links }}</span>
+{%- endif -%}
{{ m::zoom() }}
{{ m::errors() }}