# HG changeset patch # User unc0rr # Date 1358024528 -14400 # Node ID 3c193ec03e0943624602d068375de66fa963ac7e # Parent 0551b5c3de9a1e50ed2b2d441855bba573966c35 Logon procedure for checkers, introduce invisible clients diff -r 0551b5c3de9a -r 3c193ec03e09 gameServer/Actions.hs --- a/gameServer/Actions.hs Sat Jan 12 01:18:50 2013 +0400 +++ b/gameServer/Actions.hs Sun Jan 13 01:02:08 2013 +0400 @@ -142,13 +142,13 @@ chan <- client's sendChan clNick <- client's nick - loggedIn <- client's logonPassed + loggedIn <- client's isVisible when (ri /= lobbyId) $ do processAction $ MoveToLobby ("quit: " `B.append` msg) return () - clientsChans <- liftM (Prelude.map sendChan . Prelude.filter logonPassed) $! allClientsS + clientsChans <- liftM (Prelude.map sendChan . Prelude.filter isVisible) $! allClientsS io $ infoM "Clients" (show ci ++ " quits: " ++ B.unpack msg) @@ -157,7 +157,7 @@ mapM_ processAction [ AnswerClients [chan] ["BYE", msg] - , ModifyClient (\c -> c{nick = "", logonPassed = False}) -- this will effectively hide client from others while he isn't deleted from list + , ModifyClient (\c -> c{nick = "", isVisible = False}) -- this will effectively hide client from others while he isn't deleted from list ] s <- get @@ -445,9 +445,8 @@ case info of HasAccount passwd isAdmin -> do b <- isBanned - when (not b) $ do - chan <- client's sendChan - mapM_ processAction [AnswerClients [chan] ["ASKPASSWORD"], ModifyClient (\c -> c{webPassword = passwd, isAdministrator = isAdmin})] + c <- client's isChecker + when (not b) $ (if c then checkerLogin else playerLogin) passwd isAdmin Guest -> do b <- isBanned when (not b) $ @@ -460,14 +459,21 @@ isBanned = do processAction $ CheckBanned False liftM B.null $ client's nick - + checkerLogin p False = processAction $ ByeClient "No checker rights" + checkerLogin p True = do + wp <- client's webPassword + processAction $ + if wp == p then ModifyClient $ \c -> c{logonPassed = True} else ByeClient "Authentication failed" + playerLogin p a = do + chan <- client's sendChan + mapM_ processAction [AnswerClients [chan] ["ASKPASSWORD"], ModifyClient (\c -> c{webPassword = p, isAdministrator = a})] processAction JoinLobby = do chan <- client's sendChan clientNick <- client's nick isAuthenticated <- liftM (not . B.null) $ client's webPassword isAdmin <- client's isAdministrator - loggedInClients <- liftM (Prelude.filter logonPassed) $! allClientsS + loggedInClients <- liftM (Prelude.filter isVisible) $! allClientsS let (lobbyNicks, clientsChans) = unzip . L.map (nick &&& sendChan) $ loggedInClients let authenticatedNicks = L.map nick . L.filter (not . B.null . webPassword) $ loggedInClients let adminsNicks = L.map nick . L.filter isAdministrator $ loggedInClients @@ -478,7 +484,7 @@ , [AnswerClients [chan] ("CLIENT_FLAGS" : "+u" : authenticatedNicks) | not $ null authenticatedNicks] , [AnswerClients [chan] ("CLIENT_FLAGS" : "+a" : adminsNicks) | not $ null adminsNicks] , [AnswerClients (chan : clientsChans) ["CLIENT_FLAGS", B.concat["+" , clFlags], clientNick] | not $ B.null clFlags] - , [ModifyClient (\cl -> cl{logonPassed = True})] + , [ModifyClient (\cl -> cl{logonPassed = True, isVisible = True})] , [SendServerMessage] ] diff -r 0551b5c3de9a -r 3c193ec03e09 gameServer/CoreTypes.hs --- a/gameServer/CoreTypes.hs Sat Jan 12 01:18:50 2013 +0400 +++ b/gameServer/CoreTypes.hs Sun Jan 13 01:02:08 2013 +0400 @@ -28,6 +28,7 @@ nick :: B.ByteString, webPassword :: B.ByteString, logonPassed :: Bool, + isVisible :: Bool, clientProto :: !Word16, roomID :: RoomIndex, pingsQueue :: !Word, diff -r 0551b5c3de9a -r 3c193ec03e09 gameServer/HWProtoNEState.hs --- a/gameServer/HWProtoNEState.hs Sat Jan 12 01:18:50 2013 +0400 +++ b/gameServer/HWProtoNEState.hs Sun Jan 13 01:02:08 2013 +0400 @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings, CPP #-} module HWProtoNEState where import Control.Monad.Reader @@ -48,6 +48,7 @@ return [ByeClient "Authentication failed"] +#if defined(OFFICIAL_SERVER) handleCmd_NotEntered ["CHECKER", protoNum, newNick, password] = do (ci, irnc) <- ask let cl = irnc `client` ci @@ -59,6 +60,6 @@ , CheckRegistered] where parsedProto = readInt_ protoNum - +#endif handleCmd_NotEntered _ = return [ProtocolError "Incorrect command (state: not entered)"] diff -r 0551b5c3de9a -r 3c193ec03e09 gameServer/NetRoutines.hs --- a/gameServer/NetRoutines.hs Sat Jan 12 01:18:50 2013 +0400 +++ b/gameServer/NetRoutines.hs Sun Jan 13 01:02:08 2013 +0400 @@ -34,6 +34,7 @@ "" "" False + False 0 lobbyId 0