gameServer/Actions.hs
author unc0rr
Fri, 01 May 2009 09:01:44 +0000
changeset 2021 a591afb43768
parent 2001 d909152bdc21
child 2104 b2c50a7480ea
permissions -rw-r--r--
Some changes in try to fix issue when you enter room with painted map, but frontend shows generated one (most probably bug is triggered by template filters) Untested.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     1
module Actions where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     2
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     3
import Control.Concurrent.STM
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     4
import Control.Concurrent.Chan
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     5
import Data.IntMap
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     6
import qualified Data.IntSet as IntSet
1813
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
     7
import qualified Data.Sequence as Seq
1839
5dd4cb7fd7e5 Server now send ASKPASSWORD command to frontend when user has web account
unc0rr
parents: 1834
diff changeset
     8
import System.Log.Logger
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     9
import Monad
1926
cb46fbdcaa41 Add simple DoS protection mechanism (although better than previous server had)
unc0rr
parents: 1925
diff changeset
    10
import Data.Time
cb46fbdcaa41 Add simple DoS protection mechanism (although better than previous server had)
unc0rr
parents: 1925
diff changeset
    11
import Maybe
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    12
-----------------------------
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    13
import CoreTypes
1813
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
    14
import Utils
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    15
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    16
data Action =
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    17
	AnswerThisClient [String]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    18
	| AnswerAll [String]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    19
	| AnswerAllOthers [String]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    20
	| AnswerThisRoom [String]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    21
	| AnswerOthersInRoom [String]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    22
	| AnswerLobby [String]
1923
956b6b3529bc Send server message on join
unc0rr
parents: 1921
diff changeset
    23
	| SendServerMessage
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    24
	| RoomAddThisClient Int -- roomID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    25
	| RoomRemoveThisClient
1813
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
    26
	| RemoveTeam String
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    27
	| RemoveRoom
1811
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
    28
	| UnreadyRoomClients
1841
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
    29
	| MoveToLobby
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    30
	| ProtocolError String
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    31
	| Warning String
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    32
	| ByeClient String
1862
7f303aa066da Implement kick from server by administrator
unc0rr
parents: 1847
diff changeset
    33
	| KickClient Int -- clID
1879
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
    34
	| KickRoomClient Int -- clID
1921
2a09f7f786a0 - User from localhost is server admin
unc0rr
parents: 1879
diff changeset
    35
	| BanClient String -- nick
1879
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
    36
	| RemoveClientTeams Int -- clID
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    37
	| ModifyClient (ClientInfo -> ClientInfo)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    38
	| ModifyRoom (RoomInfo -> RoomInfo)
1925
ec923e56c444 Allow admin to set server's motd
unc0rr
parents: 1923
diff changeset
    39
	| ModifyServerInfo (ServerInfo -> ServerInfo)
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    40
	| AddRoom String String
1834
71cb978dc85f Add working check for www account existance
unc0rr
parents: 1827
diff changeset
    41
	| CheckRegistered
1839
5dd4cb7fd7e5 Server now send ASKPASSWORD command to frontend when user has web account
unc0rr
parents: 1834
diff changeset
    42
	| ProcessAccountInfo AccountInfo
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    43
	| Dump
1926
cb46fbdcaa41 Add simple DoS protection mechanism (although better than previous server had)
unc0rr
parents: 1925
diff changeset
    44
	| AddClient ClientInfo
1927
e2031906a347 Ping clients every 30 seconds. Disconnection due to ping timeout to be implemented.
unc0rr
parents: 1926
diff changeset
    45
	| PingAll
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    46
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    47
type CmdHandler = Int -> Clients -> Rooms -> [String] -> [Action]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    48
1862
7f303aa066da Implement kick from server by administrator
unc0rr
parents: 1847
diff changeset
    49
replaceID a (b, c, d, e) = (a, c, d, e)
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    50
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    51
processAction :: (Int, ServerInfo, Clients, Rooms) -> Action -> IO (Int, ServerInfo, Clients, Rooms)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    52
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    53
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    54
processAction (clID, serverInfo, clients, rooms) (AnswerThisClient msg) = do
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    55
	writeChan (sendChan $ clients ! clID) msg
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    56
	return (clID, serverInfo, clients, rooms)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    57
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    58
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    59
processAction (clID, serverInfo, clients, rooms) (AnswerAll msg) = do
1927
e2031906a347 Ping clients every 30 seconds. Disconnection due to ping timeout to be implemented.
unc0rr
parents: 1926
diff changeset
    60
	mapM_ (\cl -> writeChan (sendChan cl) msg) (elems clients)
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    61
	return (clID, serverInfo, clients, rooms)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    62
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    63
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    64
processAction (clID, serverInfo, clients, rooms) (AnswerAllOthers msg) = do
1879
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
    65
	mapM_ (\id -> writeChan (sendChan $ clients ! id) msg) $
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
    66
		Prelude.filter (\id' -> (id' /= clID) && (logonPassed $ clients ! id')) (keys clients)
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    67
	return (clID, serverInfo, clients, rooms)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    68
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    69
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    70
processAction (clID, serverInfo, clients, rooms) (AnswerThisRoom msg) = do
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    71
	mapM_ (\id -> writeChan (sendChan $ clients ! id) msg) roomClients
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    72
	return (clID, serverInfo, clients, rooms)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    73
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    74
		roomClients = IntSet.elems $ playersIDs room
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    75
		room = rooms ! rID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    76
		rID = roomID client
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    77
		client = clients ! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    78
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    79
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    80
processAction (clID, serverInfo, clients, rooms) (AnswerOthersInRoom msg) = do
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    81
	mapM_ (\id -> writeChan (sendChan $ clients ! id) msg) $ Prelude.filter (/= clID) roomClients
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    82
	return (clID, serverInfo, clients, rooms)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    83
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    84
		roomClients = IntSet.elems $ playersIDs room
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    85
		room = rooms ! rID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    86
		rID = roomID client
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    87
		client = clients ! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    88
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    89
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    90
processAction (clID, serverInfo, clients, rooms) (AnswerLobby msg) = do
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    91
	mapM_ (\id -> writeChan (sendChan $ clients ! id) msg) roomClients
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    92
	return (clID, serverInfo, clients, rooms)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    93
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    94
		roomClients = IntSet.elems $ playersIDs room
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    95
		room = rooms ! 0
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    96
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    97
1923
956b6b3529bc Send server message on join
unc0rr
parents: 1921
diff changeset
    98
processAction (clID, serverInfo, clients, rooms) SendServerMessage = do
1953
fd9c8e3c734d Add a special message for old hedgewars versions
unc0rr
parents: 1931
diff changeset
    99
	writeChan (sendChan $ clients ! clID) $ ["SERVER_MESSAGE", message serverInfo]
1923
956b6b3529bc Send server message on join
unc0rr
parents: 1921
diff changeset
   100
	return (clID, serverInfo, clients, rooms)
1953
fd9c8e3c734d Add a special message for old hedgewars versions
unc0rr
parents: 1931
diff changeset
   101
	where
fd9c8e3c734d Add a special message for old hedgewars versions
unc0rr
parents: 1931
diff changeset
   102
		client = clients ! clID
fd9c8e3c734d Add a special message for old hedgewars versions
unc0rr
parents: 1931
diff changeset
   103
		message = if clientProto client < 25 then
fd9c8e3c734d Add a special message for old hedgewars versions
unc0rr
parents: 1931
diff changeset
   104
			serverMessageForOldVersions
fd9c8e3c734d Add a special message for old hedgewars versions
unc0rr
parents: 1931
diff changeset
   105
			else
1994
990f341a2332 Fix message being sent to users of 0.9.10
unc0rr
parents: 1977
diff changeset
   106
			serverMessage
1923
956b6b3529bc Send server message on join
unc0rr
parents: 1921
diff changeset
   107
956b6b3529bc Send server message on join
unc0rr
parents: 1921
diff changeset
   108
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   109
processAction (clID, serverInfo, clients, rooms) (ProtocolError msg) = do
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   110
	writeChan (sendChan $ clients ! clID) ["ERROR", msg]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   111
	return (clID, serverInfo, clients, rooms)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   112
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   113
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   114
processAction (clID, serverInfo, clients, rooms) (Warning msg) = do
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   115
	writeChan (sendChan $ clients ! clID) ["WARNING", msg]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   116
	return (clID, serverInfo, clients, rooms)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   117
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   118
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   119
processAction (clID, serverInfo, clients, rooms) (ByeClient msg) = do
2001
d909152bdc21 - More verbose output
unc0rr
parents: 1994
diff changeset
   120
	infoM "Clients" ((show $ clientUID client) ++ " quits: " ++ msg)
1929
7e6cc8da1c58 - Fix bug with kicking players
unc0rr
parents: 1928
diff changeset
   121
	(_, _, newClients, newRooms) <-
1930
e71c24f11483 Fix server crash (properly follow client's state)
unc0rr
parents: 1929
diff changeset
   122
			if roomID client /= 0 then
e71c24f11483 Fix server crash (properly follow client's state)
unc0rr
parents: 1929
diff changeset
   123
				processAction  (clID, serverInfo, clients, rooms)
1929
7e6cc8da1c58 - Fix bug with kicking players
unc0rr
parents: 1928
diff changeset
   124
					(if isMaster client then RemoveRoom else RemoveClientTeams clID)
1930
e71c24f11483 Fix server crash (properly follow client's state)
unc0rr
parents: 1929
diff changeset
   125
				else
e71c24f11483 Fix server crash (properly follow client's state)
unc0rr
parents: 1929
diff changeset
   126
					return (clID, serverInfo, clients, rooms)
1929
7e6cc8da1c58 - Fix bug with kicking players
unc0rr
parents: 1928
diff changeset
   127
7e6cc8da1c58 - Fix bug with kicking players
unc0rr
parents: 1928
diff changeset
   128
	mapM_ (processAction (clID, serverInfo, newClients, newRooms)) $ answerOthersQuit ++ answerInformRoom
1926
cb46fbdcaa41 Add simple DoS protection mechanism (although better than previous server had)
unc0rr
parents: 1925
diff changeset
   129
	writeChan (sendChan $ clients ! clID) ["BYE", msg]
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   130
	return (
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   131
			0,
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   132
			serverInfo,
1929
7e6cc8da1c58 - Fix bug with kicking players
unc0rr
parents: 1928
diff changeset
   133
			delete clID newClients,
1823
1938ef375350 Fix ready players accounting
unc0rr
parents: 1813
diff changeset
   134
			adjust (\r -> r{
1938ef375350 Fix ready players accounting
unc0rr
parents: 1813
diff changeset
   135
					playersIDs = IntSet.delete clID (playersIDs r),
1938ef375350 Fix ready players accounting
unc0rr
parents: 1813
diff changeset
   136
					playersIn = (playersIn r) - 1,
1938ef375350 Fix ready players accounting
unc0rr
parents: 1813
diff changeset
   137
					readyPlayers = if isReady client then readyPlayers r - 1 else readyPlayers r
1930
e71c24f11483 Fix server crash (properly follow client's state)
unc0rr
parents: 1929
diff changeset
   138
					}) (roomID $ newClients ! clID) newRooms
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   139
			)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   140
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   141
		client = clients ! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   142
		clientNick = nick client
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   143
		answerInformRoom =
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   144
			if roomID client /= 0 then
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   145
				if not $ Prelude.null msg then
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   146
					[AnswerThisRoom ["LEFT", clientNick, msg]]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   147
				else
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   148
					[AnswerThisRoom ["LEFT", clientNick]]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   149
			else
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   150
				[]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   151
		answerOthersQuit =
1846
24d0074d4eed Small optimization in net server
unc0rr
parents: 1841
diff changeset
   152
			if logonPassed client then
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   153
				if not $ Prelude.null msg then
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   154
					[AnswerAll ["LOBBY:LEFT", clientNick, msg]]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   155
				else
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   156
					[AnswerAll ["LOBBY:LEFT", clientNick]]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   157
			else
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   158
				[]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   159
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   160
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   161
processAction (clID, serverInfo, clients, rooms) (ModifyClient func) = do
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   162
	return (clID, serverInfo, adjust func clID clients, rooms)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   163
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   164
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   165
processAction (clID, serverInfo, clients, rooms) (ModifyRoom func) = do
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   166
	return (clID, serverInfo, clients, adjust func rID rooms)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   167
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   168
		rID = roomID $ clients ! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   169
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   170
1925
ec923e56c444 Allow admin to set server's motd
unc0rr
parents: 1923
diff changeset
   171
processAction (clID, serverInfo, clients, rooms) (ModifyServerInfo func) = do
ec923e56c444 Allow admin to set server's motd
unc0rr
parents: 1923
diff changeset
   172
	return (clID, func serverInfo, clients, rooms)
ec923e56c444 Allow admin to set server's motd
unc0rr
parents: 1923
diff changeset
   173
ec923e56c444 Allow admin to set server's motd
unc0rr
parents: 1923
diff changeset
   174
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   175
processAction (clID, serverInfo, clients, rooms) (RoomAddThisClient rID) = do
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   176
	processAction (
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   177
		clID,
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   178
		serverInfo,
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   179
		adjust (\cl -> cl{roomID = rID}) clID clients,
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   180
		adjust (\r -> r{playersIDs = IntSet.insert clID (playersIDs r), playersIn = (playersIn r) + 1}) rID $
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   181
			adjust (\r -> r{playersIDs = IntSet.delete clID (playersIDs r)}) 0 rooms
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   182
		) joinMsg
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   183
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   184
		client = clients ! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   185
		joinMsg = if rID == 0 then
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   186
				AnswerAllOthers ["LOBBY:JOINED", nick client]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   187
			else
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   188
				AnswerThisRoom ["JOINED", nick client]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   189
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   190
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   191
processAction (clID, serverInfo, clients, rooms) (RoomRemoveThisClient) = do
1977
2284d7fefe4f Some polishing
unc0rr
parents: 1972
diff changeset
   192
	(_, _, newClients, newRooms) <-
2284d7fefe4f Some polishing
unc0rr
parents: 1972
diff changeset
   193
			if roomID client /= 0 then
2284d7fefe4f Some polishing
unc0rr
parents: 1972
diff changeset
   194
				foldM
2284d7fefe4f Some polishing
unc0rr
parents: 1972
diff changeset
   195
					processAction
2284d7fefe4f Some polishing
unc0rr
parents: 1972
diff changeset
   196
						(clID, serverInfo, clients, rooms)
2284d7fefe4f Some polishing
unc0rr
parents: 1972
diff changeset
   197
						[AnswerOthersInRoom ["LEFT", nick client, "part"],
2284d7fefe4f Some polishing
unc0rr
parents: 1972
diff changeset
   198
						RemoveClientTeams clID]
2284d7fefe4f Some polishing
unc0rr
parents: 1972
diff changeset
   199
				else
2284d7fefe4f Some polishing
unc0rr
parents: 1972
diff changeset
   200
					return (clID, serverInfo, clients, rooms)
2284d7fefe4f Some polishing
unc0rr
parents: 1972
diff changeset
   201
	
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   202
	return (
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   203
		clID,
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   204
		serverInfo,
1977
2284d7fefe4f Some polishing
unc0rr
parents: 1972
diff changeset
   205
		adjust (\cl -> cl{roomID = 0, isMaster = False, isReady = False}) clID newClients,
1823
1938ef375350 Fix ready players accounting
unc0rr
parents: 1813
diff changeset
   206
		adjust (\r -> r{
1938ef375350 Fix ready players accounting
unc0rr
parents: 1813
diff changeset
   207
				playersIDs = IntSet.delete clID (playersIDs r),
1938ef375350 Fix ready players accounting
unc0rr
parents: 1813
diff changeset
   208
				playersIn = (playersIn r) - 1,
1827
3bb5e22b7f9a Fix ready players number after a round
unc0rr
parents: 1823
diff changeset
   209
				readyPlayers = if isReady client then (readyPlayers r) - 1 else readyPlayers r
1823
1938ef375350 Fix ready players accounting
unc0rr
parents: 1813
diff changeset
   210
				}) rID $
1977
2284d7fefe4f Some polishing
unc0rr
parents: 1972
diff changeset
   211
			adjust (\r -> r{playersIDs = IntSet.insert clID (playersIDs r)}) 0 newRooms
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   212
		)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   213
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   214
		rID = roomID client
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   215
		client = clients ! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   216
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   217
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   218
processAction (clID, serverInfo, clients, rooms) (AddRoom roomName roomPassword) = do
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   219
	let newServerInfo = serverInfo {nextRoomID = newID}
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   220
	let room = newRoom{
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   221
			roomUID = newID,
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   222
			name = roomName,
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   223
			password = roomPassword,
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   224
			roomProto = (clientProto client)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   225
			}
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   226
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   227
	processAction (clID, serverInfo, clients, rooms) $ AnswerLobby ["ROOM", "ADD", roomName]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   228
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   229
	processAction (
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   230
		clID,
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   231
		newServerInfo,
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   232
		adjust (\cl -> cl{isMaster = True}) clID clients,
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   233
		insert newID room rooms
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   234
		) $ RoomAddThisClient newID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   235
	where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   236
		newID = (nextRoomID serverInfo) - 1
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   237
		client = clients ! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   238
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   239
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   240
processAction (clID, serverInfo, clients, rooms) (RemoveRoom) = do
1811
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   241
	processAction (clID, serverInfo, clients, rooms) $ AnswerLobby ["ROOM", "DEL", name room]
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   242
	processAction (clID, serverInfo, clients, rooms) $ AnswerOthersInRoom ["ROOMABANDONED", name room]
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   243
	return (clID,
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   244
		serverInfo,
1827
3bb5e22b7f9a Fix ready players number after a round
unc0rr
parents: 1823
diff changeset
   245
		Data.IntMap.map (\cl -> if roomID cl == rID then cl{roomID = 0, isMaster = False, isReady = False} else cl) clients,
1811
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   246
		delete rID $ adjust (\r -> r{playersIDs = IntSet.union (playersIDs room) (playersIDs r)}) 0 rooms
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   247
		)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   248
	where
1811
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   249
		room = rooms ! rID
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   250
		rID = roomID client
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   251
		client = clients ! clID
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   252
1813
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   253
1811
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   254
processAction (clID, serverInfo, clients, rooms) (UnreadyRoomClients) = do
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   255
	processAction (clID, serverInfo, clients, rooms) $ AnswerThisRoom ("NOT_READY" : roomPlayers)
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   256
	return (clID,
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   257
		serverInfo,
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   258
		Data.IntMap.map (\cl -> if roomID cl == rID then cl{isReady = False} else cl) clients,
1827
3bb5e22b7f9a Fix ready players number after a round
unc0rr
parents: 1823
diff changeset
   259
		adjust (\r -> r{readyPlayers = 0}) rID rooms)
1811
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   260
	where
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   261
		room = rooms ! rID
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   262
		rID = roomID client
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   263
		client = clients ! clID
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   264
		roomPlayers = Prelude.map (nick . (clients !)) roomPlayersIDs
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   265
		roomPlayersIDs = IntSet.elems $ playersIDs room
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   266
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   267
1813
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   268
processAction (clID, serverInfo, clients, rooms) (RemoveTeam teamName) = do
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   269
	newRooms <-	if not $ gameinprogress room then
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   270
			do
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   271
			processAction (clID, serverInfo, clients, rooms) $ AnswerOthersInRoom ["REMOVE_TEAM", teamName]
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   272
			return $
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   273
				adjust (\r -> r{teams = Prelude.filter (\t -> teamName /= teamname t) $ teams r}) rID rooms
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   274
		else
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   275
			do
1866
36aa0ca6e8af Cut the length of most used net packet
unc0rr
parents: 1862
diff changeset
   276
			processAction (clID, serverInfo, clients, rooms) $ AnswerOthersInRoom ["EM", rmTeamMsg]
1813
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   277
			return $
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   278
				adjust (\r -> r{
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   279
				teams = Prelude.filter (\t -> teamName /= teamname t) $ teams r,
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   280
				leftTeams = teamName : leftTeams r,
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   281
				roundMsgs = roundMsgs r Seq.|> rmTeamMsg
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   282
				}) rID rooms
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   283
	return (clID, serverInfo, clients, newRooms)
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   284
	where
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   285
		room = rooms ! rID
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   286
		rID = roomID client
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   287
		client = clients ! clID
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   288
		rmTeamMsg = toEngineMsg $ 'F' : teamName
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   289
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   290
1834
71cb978dc85f Add working check for www account existance
unc0rr
parents: 1827
diff changeset
   291
processAction (clID, serverInfo, clients, rooms) (CheckRegistered) = do
1921
2a09f7f786a0 - User from localhost is server admin
unc0rr
parents: 1879
diff changeset
   292
	writeChan (dbQueries serverInfo) $ CheckAccount client
1834
71cb978dc85f Add working check for www account existance
unc0rr
parents: 1827
diff changeset
   293
	return (clID, serverInfo, clients, rooms)
71cb978dc85f Add working check for www account existance
unc0rr
parents: 1827
diff changeset
   294
	where
71cb978dc85f Add working check for www account existance
unc0rr
parents: 1827
diff changeset
   295
		client = clients ! clID
71cb978dc85f Add working check for www account existance
unc0rr
parents: 1827
diff changeset
   296
1841
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   297
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   298
processAction (clID, serverInfo, clients, rooms) (Dump) = do
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   299
	writeChan (sendChan $ clients ! clID) ["DUMP", show serverInfo, showTree clients, showTree rooms]
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   300
	return (clID, serverInfo, clients, rooms)
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   301
1841
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   302
1839
5dd4cb7fd7e5 Server now send ASKPASSWORD command to frontend when user has web account
unc0rr
parents: 1834
diff changeset
   303
processAction (clID, serverInfo, clients, rooms) (ProcessAccountInfo info) = do
1923
956b6b3529bc Send server message on join
unc0rr
parents: 1921
diff changeset
   304
	processAction (clID, serverInfo, clients, rooms) SendServerMessage
1839
5dd4cb7fd7e5 Server now send ASKPASSWORD command to frontend when user has web account
unc0rr
parents: 1834
diff changeset
   305
	case info of
1847
2178c0fc838c Set admin flag and send admin notification to users with rid equal to 3
unc0rr
parents: 1846
diff changeset
   306
		HasAccount passwd isAdmin -> do
1839
5dd4cb7fd7e5 Server now send ASKPASSWORD command to frontend when user has web account
unc0rr
parents: 1834
diff changeset
   307
			infoM "Clients" $ show clID ++ " has account"
5dd4cb7fd7e5 Server now send ASKPASSWORD command to frontend when user has web account
unc0rr
parents: 1834
diff changeset
   308
			writeChan (sendChan $ clients ! clID) ["ASKPASSWORD"]
1847
2178c0fc838c Set admin flag and send admin notification to users with rid equal to 3
unc0rr
parents: 1846
diff changeset
   309
			return (clID, serverInfo, adjust (\cl -> cl{webPassword = passwd, isAdministrator = isAdmin}) clID clients, rooms)
1839
5dd4cb7fd7e5 Server now send ASKPASSWORD command to frontend when user has web account
unc0rr
parents: 1834
diff changeset
   310
		Guest -> do
5dd4cb7fd7e5 Server now send ASKPASSWORD command to frontend when user has web account
unc0rr
parents: 1834
diff changeset
   311
			infoM "Clients" $ show clID ++ " is guest"
1841
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   312
			processAction (clID, serverInfo, adjust (\cl -> cl{logonPassed = True}) clID clients, rooms) MoveToLobby
1921
2a09f7f786a0 - User from localhost is server admin
unc0rr
parents: 1879
diff changeset
   313
		Admin -> do
2a09f7f786a0 - User from localhost is server admin
unc0rr
parents: 1879
diff changeset
   314
			infoM "Clients" $ show clID ++ " is admin"
2a09f7f786a0 - User from localhost is server admin
unc0rr
parents: 1879
diff changeset
   315
			foldM processAction (clID, serverInfo, adjust (\cl -> cl{logonPassed = True, isAdministrator = True}) clID clients, rooms) [MoveToLobby, AnswerThisClient ["ADMIN_ACCESS"]]
1841
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   316
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   317
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   318
processAction (clID, serverInfo, clients, rooms) (MoveToLobby) = do
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   319
	foldM processAction (clID, serverInfo, clients, rooms) $
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   320
		(RoomAddThisClient 0)
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   321
		: answerLobbyNicks
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   322
		-- ++ (answerServerMessage client clients)
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   323
	where
1846
24d0074d4eed Small optimization in net server
unc0rr
parents: 1841
diff changeset
   324
		lobbyNicks = Prelude.map nick $ Prelude.filter logonPassed $ elems clients
1841
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   325
		answerLobbyNicks = if not $ Prelude.null lobbyNicks then
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   326
					[AnswerThisClient (["LOBBY:JOINED"] ++ lobbyNicks)]
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   327
				else
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   328
					[]
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   329
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   330
1862
7f303aa066da Implement kick from server by administrator
unc0rr
parents: 1847
diff changeset
   331
processAction (clID, serverInfo, clients, rooms) (KickClient kickID) = do
1879
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   332
	liftM2 replaceID (return clID) (processAction (kickID, serverInfo, clients, rooms) $ ByeClient "Kicked")
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   333
1926
cb46fbdcaa41 Add simple DoS protection mechanism (although better than previous server had)
unc0rr
parents: 1925
diff changeset
   334
1921
2a09f7f786a0 - User from localhost is server admin
unc0rr
parents: 1879
diff changeset
   335
processAction (clID, serverInfo, clients, rooms) (BanClient banNick) = do
2a09f7f786a0 - User from localhost is server admin
unc0rr
parents: 1879
diff changeset
   336
	return (clID, serverInfo, clients, rooms)
2a09f7f786a0 - User from localhost is server admin
unc0rr
parents: 1879
diff changeset
   337
1879
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   338
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   339
processAction (clID, serverInfo, clients, rooms) (KickRoomClient kickID) = do
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   340
	writeChan (sendChan $ clients ! kickID) ["KICKED"]
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   341
	liftM2 replaceID (return clID) (processAction (kickID, serverInfo, clients, rooms) $ RoomRemoveThisClient)
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   342
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   343
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   344
processAction (clID, serverInfo, clients, rooms) (RemoveClientTeams teamsClID) = do
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   345
	liftM2 replaceID (return clID) $
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   346
		foldM processAction (teamsClID, serverInfo, clients, rooms) $ removeTeamsActions
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   347
	where
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   348
		client = clients ! teamsClID
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   349
		room = rooms ! (roomID client)
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   350
		teamsToRemove = Prelude.filter (\t -> teamowner t == nick client) $ teams room
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   351
		removeTeamsActions = Prelude.map (RemoveTeam . teamname) teamsToRemove
1926
cb46fbdcaa41 Add simple DoS protection mechanism (although better than previous server had)
unc0rr
parents: 1925
diff changeset
   352
cb46fbdcaa41 Add simple DoS protection mechanism (although better than previous server had)
unc0rr
parents: 1925
diff changeset
   353
cb46fbdcaa41 Add simple DoS protection mechanism (although better than previous server had)
unc0rr
parents: 1925
diff changeset
   354
processAction (clID, serverInfo, clients, rooms) (AddClient client) = do
cb46fbdcaa41 Add simple DoS protection mechanism (although better than previous server had)
unc0rr
parents: 1925
diff changeset
   355
	let updatedClients = insert (clientUID client) client clients
1927
e2031906a347 Ping clients every 30 seconds. Disconnection due to ping timeout to be implemented.
unc0rr
parents: 1926
diff changeset
   356
	infoM "Clients" ((show $ clientUID client) ++ ": New client. Time: " ++ (show $ connectTime client))
1926
cb46fbdcaa41 Add simple DoS protection mechanism (although better than previous server had)
unc0rr
parents: 1925
diff changeset
   357
	writeChan (sendChan $ client) ["CONNECTED", "Hedgewars server http://www.hedgewars.org/"]
cb46fbdcaa41 Add simple DoS protection mechanism (although better than previous server had)
unc0rr
parents: 1925
diff changeset
   358
1977
2284d7fefe4f Some polishing
unc0rr
parents: 1972
diff changeset
   359
	let newLogins = takeWhile (\(_ , time) -> (connectTime client) `diffUTCTime` time <= 11) $ lastLogins serverInfo
1926
cb46fbdcaa41 Add simple DoS protection mechanism (although better than previous server had)
unc0rr
parents: 1925
diff changeset
   360
1931
ffe420e9e61a Ooops.. enable back DoS protection
unc0rr
parents: 1930
diff changeset
   361
	if isJust $ host client `Prelude.lookup` newLogins then
ffe420e9e61a Ooops.. enable back DoS protection
unc0rr
parents: 1930
diff changeset
   362
		processAction (clID, serverInfo{lastLogins = newLogins}, updatedClients, rooms) $ ByeClient "Reconnected too fast"
ffe420e9e61a Ooops.. enable back DoS protection
unc0rr
parents: 1930
diff changeset
   363
		else
ffe420e9e61a Ooops.. enable back DoS protection
unc0rr
parents: 1930
diff changeset
   364
		return (clID, serverInfo{lastLogins = (host client, connectTime client) : newLogins}, updatedClients, rooms)
1927
e2031906a347 Ping clients every 30 seconds. Disconnection due to ping timeout to be implemented.
unc0rr
parents: 1926
diff changeset
   365
e2031906a347 Ping clients every 30 seconds. Disconnection due to ping timeout to be implemented.
unc0rr
parents: 1926
diff changeset
   366
e2031906a347 Ping clients every 30 seconds. Disconnection due to ping timeout to be implemented.
unc0rr
parents: 1926
diff changeset
   367
processAction (clID, serverInfo, clients, rooms) PingAll = do
1928
9bf8f4f30d6b - Implement ping timeout
unc0rr
parents: 1927
diff changeset
   368
	(_, _, newClients, newRooms) <- foldM kickTimeouted (clID, serverInfo, clients, rooms) $ elems clients
1927
e2031906a347 Ping clients every 30 seconds. Disconnection due to ping timeout to be implemented.
unc0rr
parents: 1926
diff changeset
   369
	processAction (clID,
e2031906a347 Ping clients every 30 seconds. Disconnection due to ping timeout to be implemented.
unc0rr
parents: 1926
diff changeset
   370
		serverInfo,
1928
9bf8f4f30d6b - Implement ping timeout
unc0rr
parents: 1927
diff changeset
   371
		Data.IntMap.map (\cl -> cl{pingsQueue = pingsQueue cl + 1}) newClients,
9bf8f4f30d6b - Implement ping timeout
unc0rr
parents: 1927
diff changeset
   372
		newRooms) $ AnswerAll ["PING"]
9bf8f4f30d6b - Implement ping timeout
unc0rr
parents: 1927
diff changeset
   373
	where
9bf8f4f30d6b - Implement ping timeout
unc0rr
parents: 1927
diff changeset
   374
		kickTimeouted (clID, serverInfo, clients, rooms) client =
9bf8f4f30d6b - Implement ping timeout
unc0rr
parents: 1927
diff changeset
   375
			if pingsQueue client > 0 then
9bf8f4f30d6b - Implement ping timeout
unc0rr
parents: 1927
diff changeset
   376
				processAction (clientUID client, serverInfo, clients, rooms) $ ByeClient "Ping timeout"
9bf8f4f30d6b - Implement ping timeout
unc0rr
parents: 1927
diff changeset
   377
				else
9bf8f4f30d6b - Implement ping timeout
unc0rr
parents: 1927
diff changeset
   378
				return (clID, serverInfo, clients, rooms)