diff --git a/src/Automaton.hs b/src/Automaton.hs index 7083a31..b0fad58 100644 --- a/src/Automaton.hs +++ b/src/Automaton.hs @@ -14,7 +14,7 @@ import qualified Data.Map as Map (delete, empty, member) import Control.Monad.Reader (ReaderT, ask) import Control.Monad.Trans (lift) import Hanafuda.KoiKoi (Step(..)) -import Hanafuda.Message (T(..), FromClient(..)) +import Hanafuda.Message (Coordinates(..), FromClient(..), T(..), orderCoordinates) import qualified Hanafuda.Message as Message ( T(..), FromClient, PublicGame(..), PublicState(..) ) @@ -82,6 +82,22 @@ answer state (Error {error}) = do debug $ "Received error from server : " `append` pack error return state +answer state@(Connected {games}) (Relay {from, message = Sync {latestKnown}}) + | not $ Map.member from games = + send (Yield {onGameID = gameID latestKnown, to = from}) >> return state + | otherwise = + case orderCoordinates latestKnownHere latestKnown of + Just LT -> send $ Yield {onGameID = gameID latestKnown, to = from} + Just GT -> send $ Share {gameSave = game} + _ -> return () + >> return state + where + game = games ! from + latestKnownHere = Message.coordinates $ Message.public game + +answer state@(Connected {games}) (Relay {from, message = Yield {}}) = + send (Share {gameSave = games ! from}) >> return state + {- - Ignore -}