From 2dde68a3fa3c7ad285c4fb7d57609fb5041b8c9c Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 17 Oct 2020 18:47:57 +0100 Subject: [PATCH] wip new account etc. Signed-off-by: Ian Jackson --- src/accounts.rs | 4 +++- src/commands.rs | 24 ++++++++------------- src/gamestate.rs | 2 +- src/global.rs | 1 + src/spec.rs | 56 +++++++++++++++++++++++++++++++++++++----------- 5 files changed, 58 insertions(+), 29 deletions(-) diff --git a/src/accounts.rs b/src/accounts.rs index 5e1201c6..49a15b32 100644 --- a/src/accounts.rs +++ b/src/accounts.rs @@ -6,6 +6,8 @@ use crate::imports::*; use parking_lot::{RwLock, const_rwlock}; +pub type AccountName = ScopedName; + #[derive(Debug,Clone,Deserialize,Serialize)] #[derive(Eq,PartialEq,Ord,PartialOrd,Hash)] pub enum AccountScope { @@ -73,7 +75,7 @@ impl FromStr for ScopedName { } } -#[deerive(Serialize,Deserialize)] +#[derive(Serialize,Deserialize)] pub struct AccountRecord { pub nick: String, pub timezone: String, diff --git a/src/commands.rs b/src/commands.rs index 6666c82b..ea347eff 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -50,18 +50,6 @@ pub struct AccountDetails { // GameRunnerResetToken, //} -#[derive(Debug,Serialize,Deserialize)] -struct FixedToken { token: RawToken } - -#[derive(Debug,Serialize,Deserialize)] -struct TokenOnStdout; - -//#[derive(Debug,Serialize,Deserialize)] -//struct TokenByEmail { email: String }; -// xxx ^ implement this -// xxx ^ - - #[derive(Debug,Serialize,Deserialize)] pub enum MgmtResponse { @@ -82,9 +70,10 @@ pub enum MgmtGameInstruction { AddPieces(PiecesSpec), DeletePiece(PieceId), - ResetPlayerAccesses { players: Vec }, - ReportPlayerAccesses { players: Vec }, + ResetPlayerAccess(PlayerId), + RedeliverPlayerAccess(PlayerId), SetFixedPlayerAccess { player: PlayerId, token: RawToken }, + // xxx ^ immpl should check that PlayerState mentions Fixed AddPlayer(MgmtPlayerDetails), UpdatePlayer(MgmtPlayerDetails), @@ -109,7 +98,12 @@ pub enum MgmtGameResponse { Pieces(Vec), AddPlayer(PlayerId), - PlayerAccessTokens(Vec>), + PlayerAccessToken(Option), +} + +#[derive(Debug,Serialize,Deserialize)] +pub struct AccessTokenReport { + pub url: String, } #[derive(Debug,Clone,Serialize,Deserialize)] diff --git a/src/gamestate.rs b/src/gamestate.rs index 69589cd9..5d800998 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -46,7 +46,7 @@ pub struct GameState { pub gen : Generation, pub log : VecDeque<(Generation, Arc)>, pub max_z : ZCoord, - pub players : DenseSlotMap>, + pub players : DenseSlotMap, } #[derive(Debug,Serialize,Deserialize)] diff --git a/src/global.rs b/src/global.rs index bdf91e73..a415481d 100644 --- a/src/global.rs +++ b/src/global.rs @@ -49,6 +49,7 @@ pub struct PlayerState { pub account: AccountName, pub nick: String, pub tz: Timezone, + pub tokens_revealed: Vec, } #[derive(Debug,Serialize,Deserialize)] diff --git a/src/spec.rs b/src/spec.rs index 7c93727a..cae19522 100644 --- a/src/spec.rs +++ b/src/spec.rs @@ -9,9 +9,11 @@ use fehler::throws; use index_vec::{define_index_type,IndexVec}; use crate::gamestate::PieceSpec; use std::fmt::Debug; +use std::collections::hash_set::HashSet; use implementation::PlayerAccessSpec; use thiserror::Error; use crate::error::display_as_debug; +use crate::accounts::AccountName; //---------- common types ---------- @@ -55,7 +57,7 @@ display_as_debug!{SpecError} #[derive(Debug,Serialize,Deserialize)] pub struct TableSpec { - pub players : Vec, + pub players : Vec, pub acl : Acl } @@ -76,6 +78,22 @@ enum TablePermission { ChangeACL, } +//---------- player accesses, should perhaps be in commands.rs ---------- + +#[derive(Debug,Serialize,Deserialize)] +pub struct PlayerAccessUnset; + +#[derive(Debug,Serialize,Deserialize)] +struct FixedToken { token: RawToken } + +#[derive(Debug,Serialize,Deserialize)] +struct UrlOnStdout; + +//#[derive(Debug,Serialize,Deserialize)] +//struct TokenByEmail { email: String }; +// xxx ^ implement this +// xxx ^ + //---------- Game TOML file ---------- #[derive(Debug,Serialize,Deserialize)] @@ -216,32 +234,46 @@ pub mod implementation { #[typetag::serde(tag="access")] pub trait PlayerAccessSpec : Debug { - fn token_mgi(&self, _player: PlayerId) -> Option { + fn client_mgi(&self, _player: &PlayerId) -> Option { None } - fn deliver_tokens(&self, ps: &PlayerSpec, tokens: &[RawToken]) - -> Result<(),AE>; + fn server_deliver(&self, ps: &PlayerState, token: &AccessTokenReport) + -> Result, AE> { + Ok(None) + } + fn client_deliver(&self, ps: &PlayerState, token: &AccessTokenReport) + -> Result<(),AE> { + panic!() + } + } + + #[typetag::serde] + impl PlayerAccessSpec for PlayerAccessUnset { } #[typetag::serde] impl PlayerAccessSpec for FixedToken { - fn token_mgi(&self, player: PlayerId) -> Option { + fn client_mgi(&self, player: PlayerId) -> Option { Some(Insn::SetFixedPlayerAccess { player, token: self.token.clone(), }) } - #[throws(AE)] - fn deliver_tokens(&self, _ps: &PlayerSpec, _tokens: &[RawToken]) { } } #[typetag::serde] - impl PlayerAccessSpec for TokenOnStdout { + impl PlayerAccessSpec for UrlOnStdout { #[throws(AE)] - fn deliver_tokens(&self, ps: &PlayerSpec, tokens: &[RawToken]) { - for token in tokens { - println!("access nick={:?} token={}", &ps.nick, token.0); - } + fn client_mgi(&self, player: PlayerId) -> Option { + Some(Insn::ReportPlayerAccesses(player)) + } + fn server_deliver(&self, ps: &PlayerState, token: &AccessTokenReport) + -> Result, AE> { + Some(token) + } + fn client_deliver(&self, ps: &PlayerState, token: &AccessTokenReport) { + println!("access account={} nick={:?} url:\n{}", + &ps.account, &ps.nick, token.url); } } -- 2.30.2