Err(anyhow!("duplicate player nick {:?} in spec", &pspec.nick))?;
}
st.new = true;
+ let timezone = pspec.timezone.as_ref().or(
+ spec.timezone.as_ref()
+ ).cloned();
+ // ^ todo use client program timezone?
if !st.old {
- insns.push(MgmtGameInstruction::AddPlayer(PlayerState {
- nick: pspec.nick.clone()
+ insns.push(MgmtGameInstruction::AddPlayer(MgmtPlayerState {
+ timezone,
+ st: PlayerState {
+ nick: pspec.nick.clone(),
+ },
}));
}
}
}
Insn::AddPlayer(pl) => {
- if ig.gs.players.values().any(|p| p.nick == pl.nick) {
+ if ig.gs.players.values().any(|p| p.nick == pl.st.nick) {
Err(ME::AlreadyExists)?;
}
let logentry = LogEntry {
html: Html(format!("{} added a player: {}", &who,
- htmlescape::encode_minimal(&pl.nick))),
+ htmlescape::encode_minimal(&pl.st.nick))),
};
- let tz = Timezone::default_todo();
- let (player, logentry) = ig.player_new(pl, tz, logentry)?;
+ let timezone = pl.timezone.as_ref().map(String::as_str)
+ .unwrap_or("");
+ let tz = match Timezone::from_str(timezone) {
+ Ok(tz) => tz,
+ Err(x) => x, // x is of type !
+ };
+ let (player, logentry) = ig.player_new(pl.st, tz, logentry)?;
(U{ pcs: vec![],
log: vec![ logentry ],
raw: None },
AddPieces(PiecesSpec),
DeletePiece(PieceId),
- AddPlayer(PlayerState),
+ AddPlayer(MgmtPlayerState),
RemovePlayer(PlayerId),
ResetPlayerAccesses { players: Vec<PlayerId> },
ReportPlayerAccesses { players: Vec<PlayerId> },
SetFixedPlayerAccess { player: PlayerId, token: RawToken },
}
+#[derive(Debug,Serialize,Deserialize)]
+pub struct MgmtPlayerState {
+ pub timezone: Option<String>,
+ #[serde(flatten)] pub st: PlayerState,
+}
+
#[derive(Debug,Serialize,Deserialize)]
pub enum MgmtGameResponse {
Fine,
#[derive(Debug,Serialize,Deserialize)]
pub struct TableSpec {
pub players : Vec<PlayerSpec>,
+ pub timezone: Option<String>, // default for player timezones
}
#[derive(Debug,Serialize,Deserialize)]
pub struct PlayerSpec {
pub nick: String,
+ pub timezone: Option<String>,
#[serde(flatten)]
pub access: Option<Box<dyn PlayerAccessSpec>>,
}
#[derive(SerializeDisplay)]
#[derive(DeserializeFromStr)]
#[derive(Clone,Debug)]
-pub struct Timezone (Arc<ChronoTz>);
+pub struct Timezone (Arc<TzInfo>);
#[derive(Clone,Debug,Default)]
-struct ChronoTz {
+struct TzInfo {
name: String,
ctz: Option<chrono_tz::Tz>,
}
let name = name.to_string();
match chrono_tz::Tz::from_str(&name) {
Ok(ctz) => {
- Arc::new(ChronoTz { name, ctz: Some(ctz) })
+ Arc::new(TzInfo { name, ctz: Some(ctz) })
},
Err(emsg) => {
error!("Error loading timezone {:?}: {}, using UTC", name, emsg);
- Arc::new(ChronoTz { name, ctz: None })
+ Arc::new(TzInfo { name, ctz: None })
},
}
};
impl Default for Timezone {
fn default() -> Self {
- Timezone(Arc::new(ChronoTz { ctz: None, name: default() }))
+ Timezone(Arc::new(TzInfo { ctz: None, name: default() }))
}
}