gameServer/HWProtoNEState.hs
author nemo
Sun, 03 May 2009 17:35:10 +0000
changeset 2023 41d3afaa20c7
parent 1879 bb114339eb4e
child 2150 45b695f3a7b9
permissions -rw-r--r--
Artillery mode, sniper rifle, speech bubble tweaks, fix of rope bug introduced by enabling hats in jump

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

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]]
		++ checkPassword
	where
		client = clients IntMap.! clID
		haveSameNick = isJust $ find (\cl -> newNick == nick cl) $ IntMap.elems clients
		checkPassword = if clientProto client /= 0 then [CheckRegistered] else []


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]]
		++ checkPassword
	where
		client = clients IntMap.! clID
		parsedProto = fromMaybe 0 (maybeRead protoNum :: Maybe Word16)
		checkPassword = if (not . null) (nick client) then [CheckRegistered] else []


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 = if isAdministrator client then [AnswerThisClient ["ADMIN_ACCESS"]] else []


handleCmd_NotEntered _ _ _ ["DUMP"] =
	[Dump]


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