gameServer/CoreTypes.hs
author nemo
Sat, 05 Jun 2010 19:00:42 +0000
changeset 3497 9327fae93244
parent 3458 11cd56019f00
child 3500 af8390d807d6
permissions -rw-r--r--
Remove decrement of iterator health. Might fix weird health bug.

module CoreTypes where

import System.IO
import Control.Concurrent.Chan
import Control.Concurrent.STM
import Data.Word
import qualified Data.Map as Map
import qualified Data.IntSet as IntSet
import Data.Sequence(Seq, empty)
import Data.Time
import Network
import Data.Function

import RoomsAndClients

type ClientChan = Chan [String]

data ClientInfo =
    ClientInfo
    {
        sendChan :: ClientChan,
        clientHandle :: Handle,
        host :: String,
        connectTime :: UTCTime,
        nick :: String,
        webPassword :: String,
        logonPassed :: Bool,
        clientProto :: !Word16,
        roomID :: !Int,
        pingsQueue :: !Word,
        isMaster :: Bool,
        isReady :: Bool,
        isAdministrator :: Bool,
        clientClan :: String,
        teamsInGame :: Word
    }

instance Show ClientInfo where
    show ci = " nick: " ++ (nick ci) ++ " host: " ++ (host ci)

instance Eq ClientInfo where
    (==) = (==) `on` clientHandle

data HedgehogInfo =
    HedgehogInfo String String

data TeamInfo =
    TeamInfo
    {
        teamownerId :: !Int,
        teamowner :: String,
        teamname :: String,
        teamcolor :: String,
        teamgrave :: String,
        teamfort :: String,
        teamvoicepack :: String,
        teamflag :: String,
        difficulty :: Int,
        hhnum :: Int,
        hedgehogs :: [HedgehogInfo]
    }

instance Show TeamInfo where
    show ti = "owner: " ++ (teamowner ti)
            ++ "name: " ++ (teamname ti)
            ++ "color: " ++ (teamcolor ti)

data RoomInfo =
    RoomInfo
    {
        masterID :: !Int,
        name :: String,
        password :: String,
        roomProto :: Word16,
        teams :: [TeamInfo],
        gameinprogress :: Bool,
        playersIn :: !Int,
        readyPlayers :: !Int,
        playersIDs :: IntSet.IntSet,
        isRestrictedJoins :: Bool,
        isRestrictedTeams :: Bool,
        roundMsgs :: Seq String,
        leftTeams :: [String],
        teamsAtStart :: [TeamInfo],
        params :: Map.Map String [String]
    }

instance Show RoomInfo where
    show ri = ", players ids: " ++ show (IntSet.size $ playersIDs ri)
            ++ ", players: " ++ show (playersIn ri)
            ++ ", ready: " ++ show (readyPlayers ri)
            ++ ", teams: " ++ show (teams ri)

newRoom :: RoomInfo
newRoom = (
    RoomInfo
        0
        ""
        ""
        0
        []
        False
        0
        0
        IntSet.empty
        False
        False
        Data.Sequence.empty
        []
        []
        (Map.singleton "MAP" ["+rnd+"])
    )

data StatisticsInfo =
    StatisticsInfo
    {
        playersNumber :: Int,
        roomsNumber :: Int
    }

data ServerInfo =
    ServerInfo
    {
        isDedicated :: Bool,
        serverMessage :: String,
        serverMessageForOldVersions :: String,
        latestReleaseVersion :: Word16,
        listenPort :: PortNumber,
        nextRoomID :: Int,
        dbHost :: String,
        dbLogin :: String,
        dbPassword :: String,
        lastLogins :: [(String, UTCTime)],
        stats :: TMVar StatisticsInfo,
        coreChan :: Chan CoreMessage,
        dbQueries :: Chan DBQuery
    }

instance Show ServerInfo where
    show _ = "Server Info"

newServerInfo :: TMVar StatisticsInfo -> Chan CoreMessage -> Chan DBQuery -> ServerInfo
newServerInfo = (
    ServerInfo
        True
        "<h2><p align=center><a href=\"http://www.hedgewars.org/\">http://www.hedgewars.org/</a></p></h2>"
        "<font color=yellow><h3 align=center>Hedgewars 0.9.13 is out! Please update.</h3><p align=center><a href=http://hedgewars.org/download.html>Download page here</a></font>"
        31
        46631
        0
        ""
        ""
        ""
        []
    )

data AccountInfo =
    HasAccount String Bool
    | Guest
    | Admin
    deriving (Show, Read)

data DBQuery =
    CheckAccount ClientIndex String String
    | ClearCache
    | SendStats Int Int
    deriving (Show, Read)

data CoreMessage =
    Accept ClientInfo
    | ClientMessage (ClientIndex, [String])
    | ClientAccountInfo (ClientIndex, AccountInfo)
    | TimerAction Int
    | FreeClient ClientIndex

type MRnC = MRoomsAndClients RoomInfo ClientInfo
type IRnC = IRoomsAndClients RoomInfo ClientInfo