gameServer/HWProtoInRoomState.hs
author koda
Thu, 15 Oct 2009 15:54:48 +0000
changeset 2454 c8b1fb10003c
parent 2408 41ebdb5f1e6e
child 2747 7889a3a9724f
permissions -rw-r--r--
fix a potential bug when playing two sounds at the same time (or very near)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     1
module HWProtoInRoomState where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     2
1879
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
     3
import qualified Data.Foldable as Foldable
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     4
import qualified Data.IntMap as IntMap
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     5
import qualified Data.Map as Map
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     6
import Data.Sequence(Seq, (|>), (><), fromList, empty)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     7
import Data.List
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     8
import Maybe
2403
6c5d504af2ba - Proper /team command implementation
unc0rr
parents: 2381
diff changeset
     9
import qualified Codec.Binary.UTF8.String as UTF8
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    10
--------------------------------------
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    11
import CoreTypes
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    12
import Actions
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    13
import Utils
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    14
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    15
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    16
handleCmd_inRoom :: CmdHandler
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    17
1815
3d62cf9c350e Save some more bytes in protocol
unc0rr
parents: 1814
diff changeset
    18
handleCmd_inRoom clID clients _ ["CHAT", msg] =
3d62cf9c350e Save some more bytes in protocol
unc0rr
parents: 1814
diff changeset
    19
	[AnswerOthersInRoom ["CHAT", clientNick, msg]]
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    20
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    21
		clientNick = nick $ clients IntMap.! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    22
1811
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
    23
2207
aeea95909aba Make server accpet TEAM_CHAT protocol command, and act like on CHAT command for now
unc0rr
parents: 2126
diff changeset
    24
handleCmd_inRoom clID clients _ ["TEAM_CHAT", msg] =
aeea95909aba Make server accpet TEAM_CHAT protocol command, and act like on CHAT command for now
unc0rr
parents: 2126
diff changeset
    25
	[AnswerOthersInRoom ["TEAM_CHAT", clientNick, msg]]
aeea95909aba Make server accpet TEAM_CHAT protocol command, and act like on CHAT command for now
unc0rr
parents: 2126
diff changeset
    26
	where
aeea95909aba Make server accpet TEAM_CHAT protocol command, and act like on CHAT command for now
unc0rr
parents: 2126
diff changeset
    27
		clientNick = nick $ clients IntMap.! clID
aeea95909aba Make server accpet TEAM_CHAT protocol command, and act like on CHAT command for now
unc0rr
parents: 2126
diff changeset
    28
aeea95909aba Make server accpet TEAM_CHAT protocol command, and act like on CHAT command for now
unc0rr
parents: 2126
diff changeset
    29
1814
e5391d901cff - Remove client teams on exit
unc0rr
parents: 1813
diff changeset
    30
handleCmd_inRoom clID clients rooms ["PART"] =
2352
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    31
	[RoomRemoveThisClient "part"]
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    32
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    33
		client = clients IntMap.! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    34
1811
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
    35
2352
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    36
handleCmd_inRoom clID clients rooms ("CFG" : paramName : paramStrs)
2408
41ebdb5f1e6e Server provides more info in rooms list
unc0rr
parents: 2403
diff changeset
    37
	| null paramStrs = [ProtocolError "Empty config entry"]
2352
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    38
	| isMaster client =
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    39
		[ModifyRoom (\r -> r{params = Map.insert paramName paramStrs (params r)}),
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    40
		AnswerOthersInRoom ("CFG" : paramName : paramStrs)]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    41
	| otherwise = [ProtocolError "Not room master"]
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    42
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    43
		client = clients IntMap.! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    44
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    45
handleCmd_inRoom clID clients rooms ("ADD_TEAM" : name : color : grave : fort : voicepack : difStr : hhsInfo)
2352
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    46
	| length hhsInfo /= 16 = []
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    47
	| length (teams room) == 6 = [Warning "too many teams"]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    48
	| canAddNumber <= 0 = [Warning "too many hedgehogs"]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    49
	| isJust findTeam = [Warning "There's already a team with same name in the list"]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    50
	| gameinprogress room = [Warning "round in progress"]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    51
	| isRestrictedTeams room = [Warning "restricted"]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    52
	| otherwise =
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    53
		[ModifyRoom (\r -> r{teams = teams r ++ [newTeam]}),
2403
6c5d504af2ba - Proper /team command implementation
unc0rr
parents: 2381
diff changeset
    54
		ModifyClient (\c -> c{teamsInGame = teamsInGame c + 1, clientClan = color}),
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    55
		AnswerThisClient ["TEAM_ACCEPTED", name],
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    56
		AnswerOthersInRoom $ teamToNet newTeam,
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    57
		AnswerOthersInRoom ["TEAM_COLOR", name, color]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    58
		]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    59
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    60
		client = clients IntMap.! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    61
		room = rooms IntMap.! (roomID client)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    62
		canAddNumber = 48 - (sum . map hhnum $ teams room)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    63
		findTeam = find (\t -> name == teamname t) $ teams room
2403
6c5d504af2ba - Proper /team command implementation
unc0rr
parents: 2381
diff changeset
    64
		newTeam = (TeamInfo clID (nick client) name color grave fort voicepack difficulty newTeamHHNum (hhsList hhsInfo))
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    65
		difficulty = fromMaybe 0 (maybeRead difStr :: Maybe Int)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    66
		hhsList [] = []
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    67
		hhsList (n:h:hhs) = HedgehogInfo n h : hhsList hhs
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    68
		newTeamHHNum = min 4 canAddNumber
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    69
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    70
2352
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    71
handleCmd_inRoom clID clients rooms ["REMOVE_TEAM", teamName]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    72
	| noSuchTeam = [Warning "REMOVE_TEAM: no such team"]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    73
	| nick client /= teamowner team = [ProtocolError "Not team owner!"]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    74
	| otherwise =
2245
c011aecc95e5 unc0rr's patch from issue #144 - prevent spectators from ruining the game
nemo
parents: 2207
diff changeset
    75
			[RemoveTeam teamName,
2352
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    76
			ModifyClient (\c -> c{teamsInGame = teamsInGame c - 1})
2245
c011aecc95e5 unc0rr's patch from issue #144 - prevent spectators from ruining the game
nemo
parents: 2207
diff changeset
    77
			]
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    78
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    79
		client = clients IntMap.! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    80
		room = rooms IntMap.! (roomID client)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    81
		noSuchTeam = isNothing findTeam
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    82
		team = fromJust findTeam
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    83
		findTeam = find (\t -> teamName == teamname t) $ teams room
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    84
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    85
2352
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    86
handleCmd_inRoom clID clients rooms ["HH_NUM", teamName, numberStr]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    87
	| not $ isMaster client = [ProtocolError "Not room master"]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    88
	| hhNumber < 1 || hhNumber > 8 || noSuchTeam || hhNumber > (canAddNumber + (hhnum team)) = []
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    89
	| otherwise =
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    90
		[ModifyRoom $ modifyTeam team{hhnum = hhNumber},
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
    91
		AnswerOthersInRoom ["HH_NUM", teamName, show hhNumber]]
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    92
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    93
		client = clients IntMap.! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    94
		room = rooms IntMap.! (roomID client)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    95
		hhNumber = fromMaybe 0 (maybeRead numberStr :: Maybe Int)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    96
		noSuchTeam = isNothing findTeam
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    97
		team = fromJust findTeam
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    98
		findTeam = find (\t -> teamName == teamname t) $ teams room
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    99
		canAddNumber = 48 - (sum . map hhnum $ teams room)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   100
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   101
2352
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
   102
handleCmd_inRoom clID clients rooms ["TEAM_COLOR", teamName, newColor]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
   103
	| not $ isMaster client = [ProtocolError "Not room master"]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
   104
	| noSuchTeam = []
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
   105
	| otherwise = [ModifyRoom $ modifyTeam team{teamcolor = newColor},
2403
6c5d504af2ba - Proper /team command implementation
unc0rr
parents: 2381
diff changeset
   106
			AnswerOthersInRoom ["TEAM_COLOR", teamName, newColor],
6c5d504af2ba - Proper /team command implementation
unc0rr
parents: 2381
diff changeset
   107
			ModifyClient2 (teamownerId team) (\c -> c{clientClan = newColor})]
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   108
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   109
		noSuchTeam = isNothing findTeam
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   110
		team = fromJust findTeam
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   111
		findTeam = find (\t -> teamName == teamname t) $ teams room
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   112
		client = clients IntMap.! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   113
		room = rooms IntMap.! (roomID client)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   114
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   115
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   116
handleCmd_inRoom clID clients rooms ["TOGGLE_READY"] =
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   117
	[ModifyClient (\c -> c{isReady = not $ isReady client}),
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   118
	ModifyRoom (\r -> r{readyPlayers = readyPlayers r + (if isReady client then -1 else 1)}),
2352
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
   119
	AnswerThisRoom [if isReady client then "NOT_READY" else "READY", nick client]]
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   120
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   121
		client = clients IntMap.! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   122
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   123
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   124
handleCmd_inRoom clID clients rooms ["START_GAME"] =
2352
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
   125
	if isMaster client && (playersIn room == readyPlayers room) && (not . gameinprogress) room then
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   126
		if enoughClans then
1811
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   127
			[ModifyRoom
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   128
					(\r -> r{
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   129
						gameinprogress = True,
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   130
						roundMsgs = empty,
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   131
						leftTeams = [],
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   132
						teamsAtStart = teams r}
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   133
					),
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   134
			AnswerThisRoom ["RUN_GAME"]]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   135
		else
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   136
			[Warning "Less than two clans!"]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   137
	else
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   138
		[]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   139
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   140
		client = clients IntMap.! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   141
		room = rooms IntMap.! (roomID client)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   142
		enoughClans = not $ null $ drop 1 $ group $ map teamcolor $ teams room
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   143
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   144
2245
c011aecc95e5 unc0rr's patch from issue #144 - prevent spectators from ruining the game
nemo
parents: 2207
diff changeset
   145
handleCmd_inRoom clID clients rooms ["EM", msg] =
2381
959da8402cac Don't store keepalive messages in game server spectators buffer
unc0rr
parents: 2352
diff changeset
   146
	if (teamsInGame client > 0) && isLegal then
959da8402cac Don't store keepalive messages in game server spectators buffer
unc0rr
parents: 2352
diff changeset
   147
		(AnswerOthersInRoom ["EM", msg]) : [ModifyRoom (\r -> r{roundMsgs = roundMsgs r |> msg}) | not isKeepAlive]
2245
c011aecc95e5 unc0rr's patch from issue #144 - prevent spectators from ruining the game
nemo
parents: 2207
diff changeset
   148
	else
c011aecc95e5 unc0rr's patch from issue #144 - prevent spectators from ruining the game
nemo
parents: 2207
diff changeset
   149
		[]
c011aecc95e5 unc0rr's patch from issue #144 - prevent spectators from ruining the game
nemo
parents: 2207
diff changeset
   150
	where
c011aecc95e5 unc0rr's patch from issue #144 - prevent spectators from ruining the game
nemo
parents: 2207
diff changeset
   151
		client = clients IntMap.! clID
2381
959da8402cac Don't store keepalive messages in game server spectators buffer
unc0rr
parents: 2352
diff changeset
   152
		(isLegal, isKeepAlive) = checkNetCmd msg
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   153
1811
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   154
handleCmd_inRoom clID clients rooms ["ROUNDFINISHED"] =
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   155
	if isMaster client then
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   156
		[ModifyRoom
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   157
				(\r -> r{
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   158
					gameinprogress = False,
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   159
					readyPlayers = 0,
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   160
					roundMsgs = empty,
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   161
					leftTeams = [],
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   162
					teamsAtStart = []}
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   163
				),
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   164
		UnreadyRoomClients
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   165
		] ++ answerRemovedTeams
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   166
	else
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   167
		[]
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   168
	where
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   169
		client = clients IntMap.! clID
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   170
		room = rooms IntMap.! (roomID client)
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   171
		answerRemovedTeams = map (\t -> AnswerThisRoom ["REMOVE_TEAM", t]) $ leftTeams room
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   172
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   173
2352
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
   174
handleCmd_inRoom clID clients _ ["TOGGLE_RESTRICT_JOINS"]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
   175
	| isMaster client = [ModifyRoom (\r -> r{isRestrictedJoins = not $ isRestrictedJoins r})]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
   176
	| otherwise = [ProtocolError "Not room master"]
1831
025348f05b9f Implement two more missing protocol commands
unc0rr
parents: 1818
diff changeset
   177
	where
025348f05b9f Implement two more missing protocol commands
unc0rr
parents: 1818
diff changeset
   178
		client = clients IntMap.! clID
025348f05b9f Implement two more missing protocol commands
unc0rr
parents: 1818
diff changeset
   179
025348f05b9f Implement two more missing protocol commands
unc0rr
parents: 1818
diff changeset
   180
2352
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
   181
handleCmd_inRoom clID clients _ ["TOGGLE_RESTRICT_TEAMS"]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
   182
	| isMaster client = [ModifyRoom (\r -> r{isRestrictedTeams = not $ isRestrictedTeams r})]
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
   183
	| otherwise = [ProtocolError "Not room master"]
1831
025348f05b9f Implement two more missing protocol commands
unc0rr
parents: 1818
diff changeset
   184
	where
025348f05b9f Implement two more missing protocol commands
unc0rr
parents: 1818
diff changeset
   185
		client = clients IntMap.! clID
025348f05b9f Implement two more missing protocol commands
unc0rr
parents: 1818
diff changeset
   186
1879
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   187
handleCmd_inRoom clID clients rooms ["KICK", kickNick] =
2352
7eaf82cf0890 Fixes suggested by hlint tool
unc0rr
parents: 2337
diff changeset
   188
	[KickRoomClient kickID | isMaster client && not noSuchClient && (kickID /= clID) && (roomID client == roomID kickClient)]
1879
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   189
	where
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   190
		client = clients IntMap.! clID
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   191
		maybeClient = Foldable.find (\cl -> kickNick == nick cl) clients
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   192
		noSuchClient = isNothing maybeClient
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   193
		kickClient = fromJust maybeClient
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   194
		kickID = clientUID kickClient
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   195
1831
025348f05b9f Implement two more missing protocol commands
unc0rr
parents: 1818
diff changeset
   196
2403
6c5d504af2ba - Proper /team command implementation
unc0rr
parents: 2381
diff changeset
   197
handleCmd_inRoom clID clients _ ["TEAMCHAT", msg] =
6c5d504af2ba - Proper /team command implementation
unc0rr
parents: 2381
diff changeset
   198
	if (teamsInGame client > 0) then
6c5d504af2ba - Proper /team command implementation
unc0rr
parents: 2381
diff changeset
   199
		[AnswerSameClan ["EM", engineMsg]]
6c5d504af2ba - Proper /team command implementation
unc0rr
parents: 2381
diff changeset
   200
	else
6c5d504af2ba - Proper /team command implementation
unc0rr
parents: 2381
diff changeset
   201
		[]
6c5d504af2ba - Proper /team command implementation
unc0rr
parents: 2381
diff changeset
   202
	where
6c5d504af2ba - Proper /team command implementation
unc0rr
parents: 2381
diff changeset
   203
		client = clients IntMap.! clID
6c5d504af2ba - Proper /team command implementation
unc0rr
parents: 2381
diff changeset
   204
		engineMsg = toEngineMsg $ 'b' : (nick client ++ "(team): " ++ decodedMsg ++ "\x20\x20")
6c5d504af2ba - Proper /team command implementation
unc0rr
parents: 2381
diff changeset
   205
		decodedMsg = UTF8.decodeString msg
6c5d504af2ba - Proper /team command implementation
unc0rr
parents: 2381
diff changeset
   206
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   207
handleCmd_inRoom clID _ _ _ = [ProtocolError "Incorrect command (state: in room)"]