Add a session module to save and restore the playerID sent by the server (and make hannah persistent accross her reboots)

This commit is contained in:
Tissevert 2019-11-20 18:30:59 +01:00
parent 064606ae83
commit 4529d19301
3 changed files with 50 additions and 0 deletions

View File

@ -21,15 +21,19 @@ executable hannah
other-modules: AI
, Automaton
, Config
, Session
-- other-extensions:
build-depends: aeson
, base >=4.9 && <4.13
, bytestring
, containers
, directory
, filepath
, hanafuda
, hanafuda-APILanguage
, mtl
, text
, websockets
hs-source-dirs: src
ghc-options: -Wall
default-language: Haskell2010

View File

@ -1,5 +1,6 @@
module Config (
host
, libDir
, path
, port
) where
@ -7,6 +8,9 @@ module Config (
host :: String
host = "koikoi.menf.in"
libDir :: FilePath
libDir = "/var/lib/hannah"
path :: String
path = "/play/"

42
src/Session.hs Normal file
View File

@ -0,0 +1,42 @@
{-# LANGUAGE NamedFieldPuns #-}
module Session (
State(..)
, initial
, store
) where
import Config (libDir)
import Data.Map (Map)
import qualified Data.Map as Map (empty)
import Hanafuda.KoiKoi (PlayerID)
import qualified Hanafuda.Message as Message (PublicGame)
import System.Directory (createDirectoryIfMissing, doesFileExist)
import System.FilePath ((</>))
data State =
New
| Connected {
playerID :: PlayerID
, games :: Map PlayerID Message.PublicGame
}
deriving Show
stateFile :: FilePath
stateFile = libDir </> "state"
ifM :: IO Bool -> IO a -> IO a -> IO a
ifM condition caseTrue caseFalse =
condition >>= (\b -> if b then caseTrue else caseFalse)
initial :: IO State
initial = do
createDirectoryIfMissing True libDir
ifM (doesFileExist stateFile)
(do
playerID <- read <$> readFile stateFile
return $ Connected {playerID, games = Map.empty}
)
(return New)
store :: PlayerID -> IO ()
store = writeFile stateFile . show