gameServer/HWProtoNEState.hs
author mikade
Mon, 24 Jan 2011 23:48:44 +0200
changeset 4872 6b2fb9f0054a
parent 4862 899b4e3d350a
child 4904 0eab727d4717
permissions -rw-r--r--
Two new gameplay modes: Tumbler and Racer. Knock hedgehogs with Tumber. Race against your friends with Racer. Both modes could still use more development.

module HWProtoNEState where

import qualified Data.IntMap as IntMap
import Data.Maybe
import Data.List
import Data.Word
--------------------------------------
import CoreTypes
import Actions
import Utils

handleCmd_NotEntered :: CmdHandler

handleCmd_NotEntered clID clients _ ["NICK", newNick]
    | not . null $ nick client = [ProtocolError "Nickname already chosen"]
    | haveSameNick = [AnswerThisClient ["WARNING", "Nickname already in use"], ByeClient "Nickname already in use"]
    | illegalName newNick = [ByeClient "Illegal nickname"]
    | otherwise =
        ModifyClient (\c -> c{nick = newNick}) :
        AnswerThisClient ["NICK", newNick] :
        [CheckRegistered | clientProto client /= 0]
    where
        client = clients IntMap.! clID
        haveSameNick = isJust $ find (\cl -> newNick == nick cl) $ IntMap.elems clients


handleCmd_NotEntered clID clients _ ["PROTO", protoNum]
    | clientProto client > 0 = [ProtocolError "Protocol already known"]
    | parsedProto == 0 = [ProtocolError "Bad number"]
    | otherwise =
        ModifyClient (\c -> c{clientProto = parsedProto}) :
        AnswerThisClient ["PROTO", show parsedProto] :
        [CheckRegistered | (not . null) (nick client)]
    where
        client = clients IntMap.! clID
        parsedProto = fromMaybe 0 (maybeRead protoNum :: Maybe Word16)


handleCmd_NotEntered clID clients _ ["PASSWORD", passwd] =
    if passwd == webPassword client then
        [ModifyClient (\cl -> cl{logonPassed = True}),
        MoveToLobby] ++ adminNotice
    else
        [ByeClient "Authentication failed"]
    where
        client = clients IntMap.! clID
        adminNotice = [AnswerThisClient ["ADMIN_ACCESS"] | isAdministrator client]


handleCmd_NotEntered clID clients _ ["DUMP"] =
    if isAdministrator (clients IntMap.! clID) then [Dump] else []


handleCmd_NotEntered clID _ _ _ = [ProtocolError "Incorrect command (state: not entered)"]