gameServer/HWProtoCore.hs
author unc0rr
Thu, 05 Mar 2009 19:53:40 +0000
changeset 1862 7f303aa066da
parent 1841 fba7210b438b
child 1879 bb114339eb4e
permissions -rw-r--r--
Implement kick from server by administrator

module HWProtoCore where

import qualified Data.IntMap as IntMap
import Data.Foldable
import Maybe
--------------------------------------
import CoreTypes
import Actions
import Utils
import HWProtoNEState
import HWProtoLobbyState
import HWProtoInRoomState

handleCmd, handleCmd_loggedin :: CmdHandler

handleCmd clID _ _ ["PING"] = [AnswerThisClient ["PONG"]]

handleCmd clID clients rooms ("QUIT" : xs) =
	(if isMaster client then [RemoveRoom] else removeClientTeams)
	++ [ByeClient msg]
	where
		client = clients IntMap.! clID
		clientNick = nick client
		msg = if not $ null xs then head xs else ""
		room = rooms IntMap.! (roomID client)
		clientTeams = filter (\t -> teamowner t == nick client) $ teams room
		removeClientTeams = map (RemoveTeam . teamname) clientTeams


handleCmd clID clients rooms cmd =
	if not $ logonPassed client then
		handleCmd_NotEntered clID clients rooms cmd
	else
		handleCmd_loggedin clID clients rooms cmd
	where
		client = clients IntMap.! clID


handleCmd_loggedin clID clients rooms ["INFO", asknick] =
	if noSuchClient then
		[]
	else
		[AnswerThisClient
			["INFO",
			nick client,
			"[" ++ host client ++ "]",
			protoNumber2ver $ clientProto client,
			roomInfo]]
	where
		maybeClient = find (\cl -> asknick == nick cl) clients
		noSuchClient = isNothing maybeClient
		client = fromJust maybeClient
		room = rooms IntMap.! roomID client
		roomInfo = if roomID client /= 0 then "room " ++ (name room) else "lobby"


handleCmd_loggedin clID clients rooms cmd =
	if roomID client == 0 then
		handleCmd_lobby clID clients rooms cmd
	else
		handleCmd_inRoom clID clients rooms cmd
	where
		client = clients IntMap.! clID