gameServer/HWProtoCore.hs
author unc0rr
Sat, 29 Jan 2011 21:33:24 +0300
branchserver_refactor
changeset 4612 e82758d6f924
parent 4337 85e02b1a8e8f
child 4614 26661bf28dd5
permissions -rw-r--r--
- Reactivate pings timer, reimplement PING handler - Reimplement INFO

{-# LANGUAGE OverloadedStrings #-}
module HWProtoCore where

import Control.Monad.Reader
import Data.Maybe
import Data.List
import qualified Data.ByteString.Char8 as B
--------------------------------------
import CoreTypes
import Actions
import HWProtoNEState
import HWProtoLobbyState
import HWProtoInRoomState
import HandlerUtils
import RoomsAndClients
import Utils

handleCmd, handleCmd_loggedin :: CmdHandler


handleCmd ["PING"] = answerClient ["PONG"]


handleCmd ("QUIT" : xs) = return [ByeClient msg]
    where
        msg = if not $ null xs then head xs else "bye"


handleCmd ["PONG"] = do
    cl <- thisClient
    if pingsQueue cl == 0 then
        return [ProtocolError "Protocol violation"]
        else
        return [ModifyClient (\c -> c{pingsQueue = pingsQueue c - 1})]

handleCmd cmd = do
    (ci, irnc) <- ask
    if logonPassed (irnc `client` ci) then
        handleCmd_loggedin cmd
        else
        handleCmd_NotEntered cmd


handleCmd_loggedin ["INFO", asknick] = do
    (_, rnc) <- ask
    let allClientIDs = allClients rnc
    let maybeClientId = find (\clId -> asknick == nick (client rnc clId)) allClientIDs
    let noSuchClient = isNothing maybeClientId
    let clientId = fromJust maybeClientId
    let cl = rnc `client` fromJust maybeClientId
    let roomId = clientRoom rnc clientId
    let clRoom = room rnc roomId
    let roomMasterSign = if isMaster cl then "@" else ""
    let adminSign = if isAdministrator cl then "@" else ""
    let roomInfo = if roomId /= lobbyId then roomMasterSign `B.append` "room " `B.append` (name clRoom) else adminSign `B.append` "lobby"
    let roomStatus = if gameinprogress clRoom then
            if teamsInGame cl > 0 then "(playing)" else "(spectating)"
            else
            ""
    if noSuchClient then
        return []
        else
        answerClient [
            "INFO",
            nick cl,
            "[" `B.append` host cl `B.append` "]",
            protoNumber2ver $ clientProto cl,
            "[" `B.append` roomInfo `B.append` "]" `B.append` roomStatus
            ]


handleCmd_loggedin cmd = do
    (ci, rnc) <- ask
    if clientRoom rnc ci == lobbyId then
        handleCmd_lobby cmd
        else
        handleCmd_inRoom cmd