gameServer/HWProtoNEState.hs
author nemo
Mon, 20 Jun 2011 12:57:44 -0400
changeset 5268 eedc0f8ed38b
parent 5090 2922455e606e
child 8371 0551b5c3de9a
permissions -rw-r--r--
Small stub web view that I'm hoping to use in conjunction with ~/.hedgewars/Data - I'd like to link to a page on hedgewars.org, intercept linkClicked, fetch zip files, then unpack the structure under Data. Just checking this in so it doesn't clutter up project. Also tidied up the .pro a bit, even though we aren't really using it for much anymore. Should in theory be able to do a build now.

{-# LANGUAGE OverloadedStrings #-}
module HWProtoNEState where

import Control.Monad.Reader
import qualified Data.ByteString.Char8 as B
--------------------------------------
import CoreTypes
import Actions
import Utils
import RoomsAndClients

handleCmd_NotEntered :: CmdHandler

handleCmd_NotEntered ["NICK", newNick] = do
    (ci, irnc) <- ask
    let cl = irnc `client` ci
    if not . B.null $ nick cl then return [ProtocolError "Nickname already chosen"]
        else
        if illegalName newNick then return [ByeClient "Illegal nickname"]
            else
            return $
                ModifyClient (\c -> c{nick = newNick}) :
                AnswerClients [sendChan cl] ["NICK", newNick] :
                [CheckRegistered | clientProto cl /= 0]

handleCmd_NotEntered ["PROTO", protoNum] = do
    (ci, irnc) <- ask
    let cl = irnc `client` ci
    if clientProto cl > 0 then return [ProtocolError "Protocol already known"]
        else
        if parsedProto == 0 then return [ProtocolError "Bad number"]
            else
            return $
                ModifyClient (\c -> c{clientProto = parsedProto}) :
                AnswerClients [sendChan cl] ["PROTO", showB parsedProto] :
                [CheckRegistered | not . B.null $ nick cl]
    where
        parsedProto = readInt_ protoNum


handleCmd_NotEntered ["PASSWORD", passwd] = do
    (ci, irnc) <- ask
    let cl = irnc `client` ci

    if passwd == webPassword cl then
        return $ JoinLobby : [AnswerClients [sendChan cl] ["ADMIN_ACCESS"] | isAdministrator cl]
        else
        return [ByeClient "Authentication failed"]


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