From b90901b2c2597a72ff6fe2de92d72db51455e577 Mon Sep 17 00:00:00 2001 From: Jasper Van der Jeugt Date: Wed, 5 Aug 2020 15:48:27 +0200 Subject: Persistence with cookies --- server/lib/Cafp/Game.hs | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) (limited to 'server/lib/Cafp/Game.hs') diff --git a/server/lib/Cafp/Game.hs b/server/lib/Cafp/Game.hs index d4e1b4b..96b24dc 100644 --- a/server/lib/Cafp/Game.hs +++ b/server/lib/Cafp/Game.hs @@ -21,9 +21,9 @@ module Cafp.Game import Cafp.Messages import Control.Lens (Lens', at, iall, ifor_, imap, ix, - orOf, over, to, (%%=), (%=), - (%~), (&), (+=), (.=), (.~), - (^.), (^..), (^?), _1, _2, _3) + orOf, to, (%%=), (%=), (%~), (&), + (+=), (.=), (.~), (^.), (^..), + (^?), _1, _2, _3) import Control.Lens.TH (makeLenses, makePrisms) import Control.Monad (guard) import Control.Monad.State (State, execState, modify, @@ -60,7 +60,8 @@ data Table deriving (Show) data Player = Player - { _playerName :: !Text + { _playerId :: !PlayerId + , _playerName :: !Text , _playerHand :: !(V.Vector WhiteCard) , _playerAdmin :: !Bool , _playerPoints :: !Int @@ -134,17 +135,23 @@ assignAdmin game -- No players | otherwise = game -joinGame :: Game -> (PlayerId, Game) -joinGame = runState $ do - pid <- gameNextPlayerId %%= (\x -> (x, x + 1)) - let name = "Player " <> T.pack (show pid) - hand <- V.replicateM defaultHandSize popWhiteCard - gamePlayers %= HMS.insert pid (Player name hand False 0) +joinGame :: Maybe Player -> Game -> (PlayerId, Game) +joinGame mbPlayer = runState $ do + player <- case mbPlayer of + Nothing -> do + pid <- gameNextPlayerId %%= (\x -> (x, x + 1)) + let name = "Player " <> T.pack (show pid) + hand <- V.replicateM defaultHandSize popWhiteCard + pure $ Player pid name hand False 0 + Just p -> pure $ p & playerAdmin .~ False + gamePlayers %= HMS.insert (player ^. playerId) player modify assignAdmin - pure pid + pure $ player ^. playerId -leaveGame :: PlayerId -> Game -> Game -leaveGame pid = assignAdmin . over gamePlayers (HMS.delete pid) +leaveGame :: PlayerId -> Game -> (Maybe Player, Game) +leaveGame pid game = case game ^? gamePlayers . ix pid of + Nothing -> (Nothing, game) + Just p -> (Just p, assignAdmin $ game & gamePlayers %~ HMS.delete pid) blackCardBlanks :: Cards -> BlackCard -> Int blackCardBlanks cards (BlackCard c) = -- cgit v1.2.3