gameServer/HWProtoNEState.hs
changeset 1804 4e78ad846fb6
child 1834 71cb978dc85f
equal deleted inserted replaced
1803:95efe37482e3 1804:4e78ad846fb6
       
     1 module HWProtoNEState where
       
     2 
       
     3 import qualified Data.IntMap as IntMap
       
     4 import Maybe
       
     5 import Data.List
       
     6 import Data.Word
       
     7 --------------------------------------
       
     8 import CoreTypes
       
     9 import Actions
       
    10 import Utils
       
    11 
       
    12 handleCmd_NotEntered :: CmdHandler
       
    13 
       
    14 onLoginFinished :: Int -> String -> Word16 -> Clients -> [Action]
       
    15 onLoginFinished clID clientNick clProto clients =
       
    16 	if (null $ clientNick) || (clProto == 0) then
       
    17 		[]
       
    18 	else
       
    19 		(RoomAddThisClient 0)
       
    20 		: answerLobbyNicks
       
    21 		-- ++ (answerServerMessage client clients)
       
    22 	where
       
    23 		lobbyNicks = filter (\n -> (not (null n))) $ map nick $ IntMap.elems clients
       
    24 		answerLobbyNicks = if not $ null lobbyNicks then
       
    25 					[AnswerThisClient (["LOBBY:JOINED"] ++ lobbyNicks)]
       
    26 				else
       
    27 					[]
       
    28 
       
    29 
       
    30 handleCmd_NotEntered clID clients _ ["NICK", newNick] =
       
    31 	if not . null $ nick client then
       
    32 		[ProtocolError "Nick already chosen"]
       
    33 	else if haveSameNick then
       
    34 		[AnswerThisClient ["WARNING", "Nick collision"]]
       
    35 		++ [ByeClient ""]
       
    36 	else
       
    37 		[ModifyClient (\c -> c{nick = newNick}),
       
    38 		AnswerThisClient ["NICK", newNick]]
       
    39 		++ (onLoginFinished clID newNick (clientProto client) clients)
       
    40 	where
       
    41 		client = clients IntMap.! clID
       
    42 		haveSameNick = isJust $ find (\cl -> newNick == nick cl) $ IntMap.elems clients
       
    43 
       
    44 
       
    45 handleCmd_NotEntered clID clients _ ["PROTO", protoNum] =
       
    46 	if clientProto client > 0 then
       
    47 		[ProtocolError "Protocol already known"]
       
    48 	else if parsedProto == 0 then
       
    49 		[ProtocolError "Bad number"]
       
    50 	else
       
    51 		[ModifyClient (\c -> c{clientProto = parsedProto}),
       
    52 		AnswerThisClient ["PROTO", show parsedProto]]
       
    53 		++ (onLoginFinished clID (nick client) parsedProto clients)
       
    54 	where
       
    55 		client = clients IntMap.! clID
       
    56 		parsedProto = fromMaybe 0 (maybeRead protoNum :: Maybe Word16)
       
    57 
       
    58 
       
    59 handleCmd_NotEntered _ _ _ ["DUMP"] =
       
    60 	[Dump]
       
    61 
       
    62 
       
    63 handleCmd_NotEntered clID _ _ _ = [ProtocolError "Incorrect command (state: not entered)"]