An experiment with increasing number of caves by selecting a few potential non-cave maps and adding to the cave map array. Ones selected here might not actually be that playable as caves.
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 "Nickname already chosen"]
else if haveSameNick then
[AnswerThisClient ["WARNING", "Nickname collision"]]
++ [ByeClient ""]
else if illegalName newNick then
[ByeClient "Illegal nickname"]
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)"]