gameServer/HWProtoNEState.hs
author Henek
Sat, 29 Jan 2011 18:18:44 +0100
changeset 4881 35e6269227b6
parent 4862 899b4e3d350a
child 4904 0eab727d4717
permissions -rw-r--r--
still in developement take on adding structures, working hiding of hogs and ejecting them later. also some refactoring in uGears to evade "ambigous" variable names and, a little tweak to teleportation code that should not affect game but will help in for instance lua

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)"]