Nomyx-0.1.0: src/Types.hs
{-# LANGUAGE DeriveDataTypeable, TypeSynonymInstances, FlexibleInstances, TypeFamilies,
NamedFieldPuns #-}
module Types where
import Language.Nomyx.Expression
import Data.Typeable
import Data.List
import Data.Function
import Language.Haskell.Interpreter.Server (ServerHandle)
import Text.Blaze.Html5 hiding (map, label)
import Text.Reform
import Happstack.Server
import Text.Reform.Happstack()
import Network.BSD
import Data.Time
type PlayerPassword = String
type Port = Int
data Network = Network {host :: HostName, port :: Port}
defaultNetwork = Network "" 0
data PlayerMulti = PlayerMulti { mPlayerNumber :: PlayerNumber,
mPlayerName :: PlayerName,
mPassword :: PlayerPassword,
mMail :: MailSettings,
inGame :: Maybe GameName,
lastRule :: Maybe SubmitRule}
deriving (Eq, Show, Read, Typeable)
--- | A structure to hold the active games and players
data Multi = Multi { games :: [Game],
mPlayers :: [PlayerMulti],
logs :: Log,
sh :: ServerHandle,
net :: Network,
mCurrentTime :: UTCTime}
deriving (Typeable)
instance Show Multi where
show Multi{games, mPlayers} = "Games: " ++ show (sort games) ++ "\n" ++
"Players: " ++ show (sort mPlayers) ++ "\n"
defaultMulti :: ServerHandle -> FilePath -> Network -> UTCTime -> Multi
defaultMulti sh fp net t = Multi [] [] (defaultLog fp) sh net t
data Log = Log { logEvents :: [TimedEvent],
logFilePath :: FilePath } deriving (Eq)
defaultLog :: FilePath ->Log
defaultLog fp = Log [] fp
data SubmitRule = SubmitRule RuleName String RuleCode deriving (Show, Read, Eq)
data TimedEvent = TE UTCTime MultiEvent deriving (Show, Read, Eq)
data MultiEvent = MultiNewPlayer PlayerMulti
| MultiNewGame GameName String PlayerNumber
| MultiJoinGame GameName PlayerNumber
| MultiLeaveGame PlayerNumber
| MultiSubscribeGame GameName PlayerNumber
| MultiUnsubscribeGame GameName PlayerNumber
| MultiSubmitRule SubmitRule PlayerNumber
| MultiInputChoiceResult EventNumber Int PlayerNumber
| MultiInputStringResult String String PlayerNumber
| MultiInputUpload PlayerNumber FilePath String
| MultiTimeEvent UTCTime
| MultiMailSettings MailSettings PlayerNumber
deriving (Show, Read, Eq)
instance Ord PlayerMulti where
(<=) = (<=) `on` mPlayerNumber
type NomyxForm a = Form (ServerPartT IO) [Input] String Html () a
data MailSettings = MailSettings { mailTo :: String,
mailNewInput :: Bool,
mailNewRule :: Bool,
mailNewOutput :: Bool,
mailConfirmed :: Bool } deriving (Eq, Show, Read)
defaultMailSettings :: MailSettings
defaultMailSettings = MailSettings "" False False False False
instance FormError String where
type ErrorInputType String = [Input]
commonFormError _ = "common error"