}
scope
}
+
+ pub fn default_nick(&self) -> String {
+ match self {
+ AS::Server => "*SERVER*".into(),
+ AS::Unix { user } => user.clone(),
+ }
+ }
}
impl Display for AccountName {
let mut insns = vec![];
for pspec in &spec.players {
- let st = nick2st.entry(pspec.nick.clone()).or_default();
+ let nick = pspec.unwrap_or(|| pspec.account.default_nick());
+ let st = nick2st.entry(nick.clone()).or_default();
if st.new {
- Err(anyhow!("duplicate player nick {:?} in spec", &pspec.nick))?;
+ Err(anyhow!("duplicate player nick {:?} in spec", &nick))?;
}
st.new = true;
let timezone = pspec.timezone.as_ref().or(
).cloned();
// ^ todo use client program timezone?
if !st.old {
- insns.push(MgmtGameInstruction::AddPlayer(MgmtPlayerState {
- timezone,
- st: PlayerState {
- nick: pspec.nick.clone(),
+ insns.push(MgmtGameInstruction::AddPlayer {
+ account,
+ MgmtPlayerDetails {
+ nick,
+ timezone,
},
- }));
+ });
}
}
#[derive(Debug,Serialize,Deserialize)]
pub struct TableSpec {
- pub players : Vec<AccountName>,
- pub acl : Acl<TablePermission>
+ #[serde(default)] pub players: Vec<TablePlayerSpec>,
+ #[serde(default)] pub acl: Acl<TablePermission>,
+ pub timezone: Option<String>,
+}
+
+#[derive(Debug,Serialize,Deserialize)]
+pub struct TablePlayerSpec {
+ account: AccountName,
+ nick: Option<String>,
+ timezone: Option<String>,
}
type RawAcl<Perm> = Vec<AclEntry<Perm>>;