chiark / gitweb /
wip new account etc.
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 17 Oct 2020 17:47:57 +0000 (18:47 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 17 Oct 2020 17:47:57 +0000 (18:47 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/accounts.rs
src/commands.rs
src/gamestate.rs
src/global.rs
src/spec.rs

index 5e1201c60d7585b4ba828963f110e0952c3a71d9..49a15b32f6ae8d5f670bfc4750cb24c1795738db 100644 (file)
@@ -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,
index 6666c82b89c9f2989b12cda6c9dbae2e781e76de..ea347effa08a553f2bd7e79604f443c628014788 100644 (file)
@@ -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<PlayerId> },
-  ReportPlayerAccesses { players: Vec<PlayerId> },
+  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<MgmtGamePieceInfo>),
 
   AddPlayer(PlayerId),
-  PlayerAccessTokens(Vec<Vec<RawToken>>),
+  PlayerAccessToken(Option<AccessTokenReport>),
+}
+
+#[derive(Debug,Serialize,Deserialize)]
+pub struct AccessTokenReport {
+  pub url: String,
 }
 
 #[derive(Debug,Clone,Serialize,Deserialize)]
index 69589cd96b9f93c4fbfe1819c493c31cfff9e401..5d8009982a2ca18edb5521b37d692e947a03aee1 100644 (file)
@@ -46,7 +46,7 @@ pub struct GameState {
   pub gen : Generation,
   pub log : VecDeque<(Generation, Arc<CommittedLogEntry>)>,
   pub max_z : ZCoord,
-  pub players : DenseSlotMap<PlayerId, AccountName>>,
+  pub players : DenseSlotMap<PlayerId, AccountName>,
 }
 
 #[derive(Debug,Serialize,Deserialize)]
index bdf91e73d6df8071baf62097036f43ee5f1bb662..a415481de662d939dc090b6b3732e639a5c1a697 100644 (file)
@@ -49,6 +49,7 @@ pub struct PlayerState {
   pub account: AccountName,
   pub nick: String,
   pub tz: Timezone,
+  pub tokens_revealed: Vec<String>,
 }
 
 #[derive(Debug,Serialize,Deserialize)]
index 7c93727a2dc43c9f63363c73ba25ef0dec53c11d..cae19522ad08fac52e05a709a0baf0af95d73cb6 100644 (file)
@@ -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<ScopedName>,
+  pub players : Vec<AccountName>,
   pub acl : Acl<TablePermission>
 }
 
@@ -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<MgmtGameInstruction> {
+    fn client_mgi(&self, _player: &PlayerId) -> Option<MgmtGameInstruction> {
       None
     }
-    fn deliver_tokens(&self, ps: &PlayerSpec, tokens: &[RawToken])
-                      -> Result<(),AE>;
+    fn server_deliver(&self, ps: &PlayerState, token: &AccessTokenReport)
+                      -> Result<Option<&AccessTokenReport>, 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<MgmtGameInstruction> {
+    fn client_mgi(&self, player: PlayerId) -> Option<MgmtGameInstruction> {
       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<MgmtGameInstruction> {
+      Some(Insn::ReportPlayerAccesses(player))
+    }
+    fn server_deliver(&self, ps: &PlayerState, token: &AccessTokenReport)
+                      -> Result<Option<&AccessTokenReport>, AE> {
+      Some(token)
+    }
+    fn client_deliver(&self, ps: &PlayerState, token: &AccessTokenReport) {
+      println!("access account={} nick={:?} url:\n{}",
+               &ps.account, &ps.nick, token.url);
     }
   }