diff -r 95efe37482e3 -r 4e78ad846fb6 gameServer/HWProtoNEState.hs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer/HWProtoNEState.hs Wed Feb 18 15:04:40 2009 +0000 @@ -0,0 +1,63 @@ +module HWProtoNEState where + +import qualified Data.IntMap as IntMap +import Maybe +import Data.List +import Data.Word +-------------------------------------- +import CoreTypes +import Actions +import Utils + +handleCmd_NotEntered :: CmdHandler + +onLoginFinished :: Int -> String -> Word16 -> Clients -> [Action] +onLoginFinished clID clientNick clProto clients = + if (null $ clientNick) || (clProto == 0) then + [] + else + (RoomAddThisClient 0) + : answerLobbyNicks + -- ++ (answerServerMessage client clients) + where + lobbyNicks = filter (\n -> (not (null n))) $ map nick $ IntMap.elems clients + answerLobbyNicks = if not $ null lobbyNicks then + [AnswerThisClient (["LOBBY:JOINED"] ++ lobbyNicks)] + else + [] + + +handleCmd_NotEntered clID clients _ ["NICK", newNick] = + if not . null $ nick client then + [ProtocolError "Nick already chosen"] + else if haveSameNick then + [AnswerThisClient ["WARNING", "Nick collision"]] + ++ [ByeClient ""] + else + [ModifyClient (\c -> c{nick = newNick}), + AnswerThisClient ["NICK", newNick]] + ++ (onLoginFinished clID newNick (clientProto client) clients) + where + client = clients IntMap.! clID + haveSameNick = isJust $ find (\cl -> newNick == nick cl) $ IntMap.elems clients + + +handleCmd_NotEntered clID clients _ ["PROTO", protoNum] = + if clientProto client > 0 then + [ProtocolError "Protocol already known"] + else if parsedProto == 0 then + [ProtocolError "Bad number"] + else + [ModifyClient (\c -> c{clientProto = parsedProto}), + AnswerThisClient ["PROTO", show parsedProto]] + ++ (onLoginFinished clID (nick client) parsedProto clients) + where + client = clients IntMap.! clID + parsedProto = fromMaybe 0 (maybeRead protoNum :: Maybe Word16) + + +handleCmd_NotEntered _ _ _ ["DUMP"] = + [Dump] + + +handleCmd_NotEntered clID _ _ _ = [ProtocolError "Incorrect command (state: not entered)"]