gameServer/Actions.hs
author koda
Thu, 24 Mar 2011 17:28:36 +0100
changeset 5046 fc6639d56799
parent 5030 42746c5d4a80
child 5059 68a5415ca8ea
permissions -rw-r--r--
this brings compatibility up with SDL HEAD (5504), but maybe breaks compatibility with sdl 1.2 so please test! still has problems with keyboard input and rendered ttf textures
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
     1
{-# LANGUAGE OverloadedStrings #-}
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
     2
module Actions where
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
     3
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
     4
import Control.Concurrent
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
     5
import qualified Data.Set as Set
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
     6
import qualified Data.Sequence as Seq
5007
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
     7
import qualified Data.List as L
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
     8
import System.Log.Logger
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
     9
import Control.Monad
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    10
import Data.Time
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    11
import Data.Maybe
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    12
import Control.Monad.Reader
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    13
import Control.Monad.State.Strict
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    14
import qualified Data.ByteString.Char8 as B
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    15
import Control.DeepSeq
4918
c6d3aec73f93 Add Unique field to Client structure, and use it to check for matching recieved account status with client
unc0rr
parents: 4917
diff changeset
    16
import Data.Unique
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
    17
import Control.Arrow
4959
09f4978b4fb0 ShutdownException for server shutdown
unc0rr
parents: 4955
diff changeset
    18
import Control.Exception
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    19
-----------------------------
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    20
import CoreTypes
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    21
import Utils
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    22
import ClientIO
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    23
import ServerState
4973
53411a26df7e Add server version (which is separate from protocol version) and a check in frontend for a new enough server (currently only qWarning)
unc0rr
parents: 4962
diff changeset
    24
import Consts
4989
4771fed9272e - Write server config into .ini file on change
unc0rr
parents: 4975
diff changeset
    25
import ConfigFile
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    26
4989
4771fed9272e - Write server config into .ini file on change
unc0rr
parents: 4975
diff changeset
    27
data Action =
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    28
    AnswerClients ![ClientChan] ![B.ByteString]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    29
    | SendServerMessage
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    30
    | SendServerVars
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    31
    | MoveToRoom RoomIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    32
    | MoveToLobby B.ByteString
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    33
    | RemoveTeam B.ByteString
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    34
    | RemoveRoom
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    35
    | UnreadyRoomClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    36
    | JoinLobby
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    37
    | ProtocolError B.ByteString
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    38
    | Warning B.ByteString
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    39
    | NoticeMessage Notice
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    40
    | ByeClient B.ByteString
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    41
    | KickClient ClientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    42
    | KickRoomClient ClientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    43
    | BanClient NominalDiffTime B.ByteString ClientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    44
    | ChangeMaster
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    45
    | RemoveClientTeams ClientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    46
    | ModifyClient (ClientInfo -> ClientInfo)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    47
    | ModifyClient2 ClientIndex (ClientInfo -> ClientInfo)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    48
    | ModifyRoom (RoomInfo -> RoomInfo)
4989
4771fed9272e - Write server config into .ini file on change
unc0rr
parents: 4975
diff changeset
    49
    | ModifyServerInfo (ServerInfo -> ServerInfo)
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    50
    | AddRoom B.ByteString B.ByteString
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    51
    | CheckRegistered
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    52
    | ClearAccountsCache
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    53
    | ProcessAccountInfo AccountInfo
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    54
    | AddClient ClientInfo
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    55
    | DeleteClient ClientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    56
    | PingAll
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    57
    | StatsAction
4914
5c33bb53c1e5 Stub for server restart command
unc0rr
parents: 4909
diff changeset
    58
    | RestartServer Bool
5007
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
    59
    | AddNick2Bans B.ByteString B.ByteString UTCTime
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
    60
    | AddIP2Bans B.ByteString B.ByteString UTCTime
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
    61
    | CheckBanned
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    62
4955
84543ecae8c3 Don't forkIO main loop
unc0rr
parents: 4942
diff changeset
    63
4989
4771fed9272e - Write server config into .ini file on change
unc0rr
parents: 4975
diff changeset
    64
type CmdHandler = [B.ByteString] -> Reader (ClientIndex, IRnC) [Action]
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    65
4989
4771fed9272e - Write server config into .ini file on change
unc0rr
parents: 4975
diff changeset
    66
instance NFData Action where
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    67
    rnf (AnswerClients chans msg) = chans `deepseq` msg `deepseq` ()
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    68
    rnf a = a `seq` ()
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    69
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    70
instance NFData B.ByteString
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    71
instance NFData (Chan a)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    72
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
    73
4989
4771fed9272e - Write server config into .ini file on change
unc0rr
parents: 4975
diff changeset
    74
othersChans :: StateT ServerState IO [ClientChan]
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    75
othersChans = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    76
    cl <- client's id
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    77
    ri <- clientRoomA
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    78
    liftM (map sendChan . filter (/= cl)) $ roomClientsS ri
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    79
4989
4771fed9272e - Write server config into .ini file on change
unc0rr
parents: 4975
diff changeset
    80
processAction :: Action -> StateT ServerState IO ()
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    81
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    82
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
    83
processAction (AnswerClients chans msg) =
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
    84
    io $ mapM_ (`writeChan` (msg `deepseq` msg)) (chans `deepseq` chans)
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    85
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    86
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    87
processAction SendServerMessage = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    88
    chan <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    89
    protonum <- client's clientProto
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    90
    si <- liftM serverInfo get
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    91
    let message = if protonum < latestReleaseVersion si then
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    92
            serverMessageForOldVersions si
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    93
            else
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    94
            serverMessage si
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    95
    processAction $ AnswerClients [chan] ["SERVER_MESSAGE", message]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    96
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    97
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    98
processAction SendServerVars = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    99
    chan <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   100
    si <- gets serverInfo
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   101
    io $ writeChan chan ("SERVER_VARS" : vars si)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   102
    where
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   103
        vars si = [
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   104
            "MOTD_NEW", serverMessage si,
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   105
            "MOTD_OLD", serverMessageForOldVersions si,
5030
42746c5d4a80 Changed the standard show function to Text.Show.ByteString, and misc.
EJ <eivind.jahren@gmail.com>
parents: 5008
diff changeset
   106
            "LATEST_PROTO", showB $ latestReleaseVersion si
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   107
            ]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   108
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   109
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   110
processAction (ProtocolError msg) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   111
    chan <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   112
    processAction $ AnswerClients [chan] ["ERROR", msg]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   113
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   114
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   115
processAction (Warning msg) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   116
    chan <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   117
    processAction $ AnswerClients [chan] ["WARNING", msg]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   118
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   119
processAction (NoticeMessage n) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   120
    chan <- client's sendChan
5030
42746c5d4a80 Changed the standard show function to Text.Show.ByteString, and misc.
EJ <eivind.jahren@gmail.com>
parents: 5008
diff changeset
   121
    processAction $ AnswerClients [chan] ["NOTICE", showB . fromEnum $ n]
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   122
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   123
processAction (ByeClient msg) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   124
    (Just ci) <- gets clientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   125
    ri <- clientRoomA
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   126
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   127
    chan <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   128
    clNick <- client's nick
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   129
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   130
    when (ri /= lobbyId) $ do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   131
        processAction $ MoveToLobby ("quit: " `B.append` msg)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   132
        return ()
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   133
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   134
    clientsChans <- liftM (Prelude.map sendChan . Prelude.filter logonPassed) $! allClientsS
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
   135
    io $
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
   136
        infoM "Clients" (show ci ++ " quits: " ++ B.unpack msg)
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   137
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   138
    processAction $ AnswerClients [chan] ["BYE", msg]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   139
    processAction $ AnswerClients clientsChans ["LOBBY:LEFT", clNick, msg]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   140
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   141
    s <- get
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   142
    put $! s{removedClients = ci `Set.insert` removedClients s}
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   143
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   144
processAction (DeleteClient ci) = do
4998
cdcdf37e5532 Send QUIT on exception too. This leads to double QUIT for a usual disconnection, yet is safe. Should fix crashes.
unc0rr
parents: 4991
diff changeset
   145
    io $ debugM "Clients"  $ "DeleteClient: " ++ show ci
cdcdf37e5532 Send QUIT on exception too. This leads to double QUIT for a usual disconnection, yet is safe. Should fix crashes.
unc0rr
parents: 4991
diff changeset
   146
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   147
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   148
    io $ removeClient rnc ci
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   149
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   150
    s <- get
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   151
    put $! s{removedClients = ci `Set.delete` removedClients s}
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   152
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   153
processAction (ModifyClient f) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   154
    (Just ci) <- gets clientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   155
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   156
    io $ modifyClient rnc f ci
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   157
    return ()
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   158
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   159
processAction (ModifyClient2 ci f) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   160
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   161
    io $ modifyClient rnc f ci
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   162
    return ()
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   163
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   164
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   165
processAction (ModifyRoom f) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   166
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   167
    ri <- clientRoomA
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   168
    io $ modifyRoom rnc f ri
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   169
    return ()
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   170
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   171
4989
4771fed9272e - Write server config into .ini file on change
unc0rr
parents: 4975
diff changeset
   172
processAction (ModifyServerInfo f) = do
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   173
    modify (\s -> s{serverInfo = f $ serverInfo s})
4989
4771fed9272e - Write server config into .ini file on change
unc0rr
parents: 4975
diff changeset
   174
    si <- gets serverInfo
4771fed9272e - Write server config into .ini file on change
unc0rr
parents: 4975
diff changeset
   175
    io $ writeServerConfig si
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   176
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   177
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   178
processAction (MoveToRoom ri) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   179
    (Just ci) <- gets clientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   180
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   181
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   182
    io $ do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   183
        modifyClient rnc (\cl -> cl{teamsInGame = 0, isReady = False, isMaster = False}) ci
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
   184
        modifyRoom rnc (\r -> r{playersIn = playersIn r + 1}) ri
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   185
        moveClientToRoom rnc ri ci
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   186
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   187
    chans <- liftM (map sendChan) $ roomClientsS ri
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   188
    clNick <- client's nick
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   189
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   190
    processAction $ AnswerClients chans ["JOINED", clNick]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   191
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   192
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   193
processAction (MoveToLobby msg) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   194
    (Just ci) <- gets clientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   195
    ri <- clientRoomA
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   196
    rnc <- gets roomsClients
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
   197
    (gameProgress, playersNum) <- io $ room'sM rnc (gameinprogress &&& playersIn) ri
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   198
    ready <- client's isReady
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   199
    master <- client's isMaster
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   200
--    client <- client's id
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   201
    clNick <- client's nick
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   202
    chans <- othersChans
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   203
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   204
    if master then
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   205
        if gameProgress && playersNum > 1 then
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   206
            mapM_ processAction [ChangeMaster, AnswerClients chans ["LEFT", clNick, msg], NoticeMessage AdminLeft, RemoveClientTeams ci]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   207
            else
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   208
            processAction RemoveRoom
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   209
        else
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   210
        mapM_ processAction [AnswerClients chans ["LEFT", clNick, msg], RemoveClientTeams ci]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   211
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   212
    io $ do
4999
a3a09b107652 - Fix a problem with ghost teams (missing 'not')
unc0rr
parents: 4998
diff changeset
   213
        modifyRoom rnc (\r -> r{
a3a09b107652 - Fix a problem with ghost teams (missing 'not')
unc0rr
parents: 4998
diff changeset
   214
                playersIn = playersIn r - 1,
a3a09b107652 - Fix a problem with ghost teams (missing 'not')
unc0rr
parents: 4998
diff changeset
   215
                readyPlayers = if ready then readyPlayers r - 1 else readyPlayers r
a3a09b107652 - Fix a problem with ghost teams (missing 'not')
unc0rr
parents: 4998
diff changeset
   216
                }) ri
a3a09b107652 - Fix a problem with ghost teams (missing 'not')
unc0rr
parents: 4998
diff changeset
   217
        moveClientToLobby rnc ci
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   218
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   219
processAction ChangeMaster = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   220
    ri <- clientRoomA
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   221
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   222
    newMasterId <- liftM head . io $ roomClientsIndicesM rnc ri
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   223
    newMaster <- io $ client'sM rnc id newMasterId
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   224
    let newRoomName = nick newMaster
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   225
    mapM_ processAction [
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   226
        ModifyRoom (\r -> r{masterID = newMasterId, name = newRoomName}),
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   227
        ModifyClient2 newMasterId (\c -> c{isMaster = True}),
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   228
        AnswerClients [sendChan newMaster] ["ROOM_CONTROL_ACCESS", "1"]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   229
        ]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   230
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   231
processAction (AddRoom roomName roomPassword) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   232
    Just clId <- gets clientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   233
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   234
    proto <- io $ client'sM rnc clientProto clId
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   235
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
   236
    let rm = newRoom{
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   237
            masterID = clId,
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   238
            name = roomName,
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   239
            password = roomPassword,
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   240
            roomProto = proto
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   241
            }
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   242
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
   243
    rId <- io $ addRoom rnc rm
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   244
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   245
    processAction $ MoveToRoom rId
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   246
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   247
    chans <- liftM (map sendChan) $! roomClientsS lobbyId
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   248
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   249
    mapM_ processAction [
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   250
        AnswerClients chans ["ROOM", "ADD", roomName]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   251
        , ModifyClient (\cl -> cl{isMaster = True})
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   252
        ]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   253
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   254
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   255
processAction RemoveRoom = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   256
    Just clId <- gets clientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   257
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   258
    ri <- io $ clientRoomM rnc clId
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   259
    roomName <- io $ room'sM rnc name ri
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   260
    others <- othersChans
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   261
    lobbyChans <- liftM (map sendChan) $! roomClientsS lobbyId
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   262
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   263
    mapM_ processAction [
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   264
            AnswerClients lobbyChans ["ROOM", "DEL", roomName],
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   265
            AnswerClients others ["ROOMABANDONED", roomName]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   266
        ]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   267
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   268
    io $ removeRoom rnc ri
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   269
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   270
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   271
processAction (UnreadyRoomClients) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   272
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   273
    ri <- clientRoomA
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   274
    roomPlayers <- roomClientsS ri
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   275
    roomClIDs <- io $ roomClientsIndicesM rnc ri
4942
1c85a8e6e11c Okay, a compatibility layer for clients of 0.9.15 version (not sure about old versions, as I removed all compatibility hacks for older versions previously)
unc0rr
parents: 4932
diff changeset
   276
    pr <- client's clientProto
1c85a8e6e11c Okay, a compatibility layer for clients of 0.9.15 version (not sure about old versions, as I removed all compatibility hacks for older versions previously)
unc0rr
parents: 4932
diff changeset
   277
    processAction $ AnswerClients (map sendChan roomPlayers) $ notReadyMessage pr (map nick roomPlayers)
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   278
    io $ mapM_ (modifyClient rnc (\cl -> cl{isReady = False})) roomClIDs
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   279
    processAction $ ModifyRoom (\r -> r{readyPlayers = 0})
4942
1c85a8e6e11c Okay, a compatibility layer for clients of 0.9.15 version (not sure about old versions, as I removed all compatibility hacks for older versions previously)
unc0rr
parents: 4932
diff changeset
   280
    where
1c85a8e6e11c Okay, a compatibility layer for clients of 0.9.15 version (not sure about old versions, as I removed all compatibility hacks for older versions previously)
unc0rr
parents: 4932
diff changeset
   281
        notReadyMessage p nicks = if p < 38 then "NOT_READY" : nicks else "CLIENT_FLAGS" : "-r" : nicks
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   282
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   283
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   284
processAction (RemoveTeam teamName) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   285
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   286
    ri <- clientRoomA
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   287
    inGame <- io $ room'sM rnc gameinprogress ri
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   288
    chans <- othersChans
4999
a3a09b107652 - Fix a problem with ghost teams (missing 'not')
unc0rr
parents: 4998
diff changeset
   289
    if not $ inGame then
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   290
            mapM_ processAction [
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   291
                AnswerClients chans ["REMOVE_TEAM", teamName],
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   292
                ModifyRoom (\r -> r{teams = Prelude.filter (\t -> teamName /= teamname t) $ teams r})
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   293
                ]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   294
        else
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   295
            mapM_ processAction [
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   296
                AnswerClients chans ["EM", rmTeamMsg],
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   297
                ModifyRoom (\r -> r{
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   298
                    teams = Prelude.filter (\t -> teamName /= teamname t) $ teams r,
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   299
                    leftTeams = teamName : leftTeams r,
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   300
                    roundMsgs = roundMsgs r Seq.|> rmTeamMsg
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   301
                    })
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   302
                ]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   303
    where
5030
42746c5d4a80 Changed the standard show function to Text.Show.ByteString, and misc.
EJ <eivind.jahren@gmail.com>
parents: 5008
diff changeset
   304
        rmTeamMsg = toEngineMsg $ 'F' `B.cons` teamName
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   305
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   306
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   307
processAction (RemoveClientTeams clId) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   308
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   309
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   310
    removeTeamActions <- io $ do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   311
        clNick <- client'sM rnc nick clId
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   312
        rId <- clientRoomM rnc clId
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   313
        roomTeams <- room'sM rnc teams rId
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   314
        return . Prelude.map (RemoveTeam . teamname) . Prelude.filter (\t -> teamowner t == clNick) $ roomTeams
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   315
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   316
    mapM_ processAction removeTeamActions
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   317
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   318
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   319
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   320
processAction CheckRegistered = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   321
    (Just ci) <- gets clientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   322
    n <- client's nick
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   323
    h <- client's host
4991
90d1fb9fc2e1 Fix check for duplicated nickname
unc0rr
parents: 4989
diff changeset
   324
    p <- client's clientProto
4918
c6d3aec73f93 Add Unique field to Client structure, and use it to check for matching recieved account status with client
unc0rr
parents: 4917
diff changeset
   325
    uid <- client's clUID
4991
90d1fb9fc2e1 Fix check for duplicated nickname
unc0rr
parents: 4989
diff changeset
   326
    haveSameNick <- liftM (not . null . tail . filter (\c -> nick c == n)) allClientsS
90d1fb9fc2e1 Fix check for duplicated nickname
unc0rr
parents: 4989
diff changeset
   327
    if haveSameNick then
90d1fb9fc2e1 Fix check for duplicated nickname
unc0rr
parents: 4989
diff changeset
   328
        if p < 38 then
90d1fb9fc2e1 Fix check for duplicated nickname
unc0rr
parents: 4989
diff changeset
   329
            mapM_ processAction [ByeClient "Nickname is already in use", removeNick]
90d1fb9fc2e1 Fix check for duplicated nickname
unc0rr
parents: 4989
diff changeset
   330
            else
90d1fb9fc2e1 Fix check for duplicated nickname
unc0rr
parents: 4989
diff changeset
   331
            mapM_ processAction [NoticeMessage NickAlreadyInUse, removeNick]
90d1fb9fc2e1 Fix check for duplicated nickname
unc0rr
parents: 4989
diff changeset
   332
        else
90d1fb9fc2e1 Fix check for duplicated nickname
unc0rr
parents: 4989
diff changeset
   333
        do
90d1fb9fc2e1 Fix check for duplicated nickname
unc0rr
parents: 4989
diff changeset
   334
        db <- gets (dbQueries . serverInfo)
90d1fb9fc2e1 Fix check for duplicated nickname
unc0rr
parents: 4989
diff changeset
   335
        io $ writeChan db $ CheckAccount ci (hashUnique uid) n h
90d1fb9fc2e1 Fix check for duplicated nickname
unc0rr
parents: 4989
diff changeset
   336
        return ()
90d1fb9fc2e1 Fix check for duplicated nickname
unc0rr
parents: 4989
diff changeset
   337
   where
90d1fb9fc2e1 Fix check for duplicated nickname
unc0rr
parents: 4989
diff changeset
   338
       removeNick = ModifyClient (\c -> c{nick = ""})
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   339
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   340
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   341
processAction ClearAccountsCache = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   342
    dbq <- gets (dbQueries . serverInfo)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   343
    io $ writeChan dbq ClearCache
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   344
    return ()
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   345
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   346
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   347
processAction (ProcessAccountInfo info) =
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   348
    case info of
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   349
        HasAccount passwd isAdmin -> do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   350
            chan <- client's sendChan
4923
c7829611c682 Fix admin stuff :D
unc0rr
parents: 4922
diff changeset
   351
            mapM_ processAction [AnswerClients [chan] ["ASKPASSWORD"], ModifyClient (\c -> c{webPassword = passwd, isAdministrator = isAdmin})]
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
   352
        Guest ->
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   353
            processAction JoinLobby
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   354
        Admin -> do
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
   355
            mapM_ processAction [ModifyClient (\cl -> cl{isAdministrator = True}), JoinLobby]
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   356
            chan <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   357
            processAction $ AnswerClients [chan] ["ADMIN_ACCESS"]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   358
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   359
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   360
processAction JoinLobby = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   361
    chan <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   362
    clientNick <- client's nick
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
   363
    (lobbyNicks, clientsChans) <- liftM (unzip . Prelude.map (nick &&& sendChan) . Prelude.filter logonPassed) $! allClientsS
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   364
    mapM_ processAction $
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
   365
        AnswerClients clientsChans ["LOBBY:JOINED", clientNick]
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
   366
        : AnswerClients [chan] ("LOBBY:JOINED" : clientNick : lobbyNicks)
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
   367
        : [ModifyClient (\cl -> cl{logonPassed = True}), SendServerMessage]
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   368
4942
1c85a8e6e11c Okay, a compatibility layer for clients of 0.9.15 version (not sure about old versions, as I removed all compatibility hacks for older versions previously)
unc0rr
parents: 4932
diff changeset
   369
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   370
processAction (KickClient kickId) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   371
    modify (\s -> s{clientIndex = Just kickId})
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   372
    processAction $ ByeClient "Kicked"
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   373
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   374
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   375
processAction (BanClient seconds reason banId) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   376
    modify (\s -> s{clientIndex = Just banId})
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   377
    clHost <- client's host
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
   378
    currentTime <- io getCurrentTime
5030
42746c5d4a80 Changed the standard show function to Text.Show.ByteString, and misc.
EJ <eivind.jahren@gmail.com>
parents: 5008
diff changeset
   379
    let msg = B.concat ["Ban for ", B.pack . show $ seconds, "seconds (", reason, ")"]
4909
dc6482438674 - Implement BAN protocol command
unc0rr
parents: 4907
diff changeset
   380
    mapM_ processAction [
5007
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   381
        AddIP2Bans clHost msg (addUTCTime seconds currentTime)
4909
dc6482438674 - Implement BAN protocol command
unc0rr
parents: 4907
diff changeset
   382
        , KickClient banId
dc6482438674 - Implement BAN protocol command
unc0rr
parents: 4907
diff changeset
   383
        ]
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   384
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   385
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   386
processAction (KickRoomClient kickId) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   387
    modify (\s -> s{clientIndex = Just kickId})
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   388
    ch <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   389
    mapM_ processAction [AnswerClients [ch] ["KICKED"], MoveToLobby "kicked"]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   390
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   391
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   392
processAction (AddClient cl) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   393
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   394
    si <- gets serverInfo
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   395
    newClId <- io $ do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   396
        ci <- addClient rnc cl
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   397
        t <- forkIO $ clientRecvLoop (clientSocket cl) (coreChan si) ci
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
   398
        _ <- forkIO $ clientSendLoop (clientSocket cl) t (coreChan si) (sendChan cl) ci
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   399
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   400
        infoM "Clients" (show ci ++ ": New client. Time: " ++ show (connectTime cl))
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   401
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   402
        return ci
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   403
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   404
    modify (\s -> s{clientIndex = Just newClId})
5007
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   405
    mapM_ processAction
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   406
        [
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   407
            AnswerClients [sendChan cl] ["CONNECTED", "Hedgewars server http://www.hedgewars.org/", serverVersion]
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   408
            , CheckBanned
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   409
            , AddIP2Bans (host cl) "Reconnected too fast" (addUTCTime 10 $ connectTime cl)
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   410
        ]
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   411
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   412
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   413
processAction (AddNick2Bans n reason expiring) = do
5008
af9e4a66111b Don't add ip ban with new timestamp when user gets kicked due to ban
unc0rr
parents: 5007
diff changeset
   414
    processAction $ ModifyServerInfo (\s -> s{bans = BanByNick n reason expiring : bans s})
5007
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   415
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   416
processAction (AddIP2Bans ip reason expiring) = do
5008
af9e4a66111b Don't add ip ban with new timestamp when user gets kicked due to ban
unc0rr
parents: 5007
diff changeset
   417
    (Just ci) <- gets clientIndex
af9e4a66111b Don't add ip ban with new timestamp when user gets kicked due to ban
unc0rr
parents: 5007
diff changeset
   418
    rc <- gets removedClients
af9e4a66111b Don't add ip ban with new timestamp when user gets kicked due to ban
unc0rr
parents: 5007
diff changeset
   419
    when (not $ ci `Set.member` rc)
af9e4a66111b Don't add ip ban with new timestamp when user gets kicked due to ban
unc0rr
parents: 5007
diff changeset
   420
        $ processAction $ ModifyServerInfo (\s -> s{bans = BanByIP ip reason expiring : bans s})
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   421
5007
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   422
processAction CheckBanned = do
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   423
    clTime <- client's connectTime
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   424
    clNick <- client's nick
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   425
    clHost <- client's host
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   426
    si <- gets serverInfo
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   427
    let validBans = filter (checkNotExpired clTime) $ bans si
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   428
    let ban = L.find (checkBan clHost clNick) $ validBans
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   429
    when (isJust ban) $
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   430
        mapM_ processAction [
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   431
        ModifyServerInfo (\s -> s{bans = validBans})
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   432
        , ByeClient (getBanReason $ fromJust ban)
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   433
        ]
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   434
    where
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   435
        checkNotExpired testTime (BanByIP _ _ time) = testTime `diffUTCTime` time <= 0
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   436
        checkNotExpired testTime (BanByNick _ _ time) = testTime `diffUTCTime` time <= 0
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   437
        checkBan ip _ (BanByIP bip _ _) = bip == ip
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   438
        checkBan _ n (BanByNick bn _ _) = bn == n
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   439
        getBanReason (BanByIP _ msg _) = msg
c401891fe5e0 Get rid of lastLogins, implement bans system
unc0rr
parents: 5005
diff changeset
   440
        getBanReason (BanByNick _ msg _) = msg
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   441
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   442
processAction PingAll = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   443
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   444
    io (allClientsM rnc) >>= mapM_ (kickTimeouted rnc)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   445
    cis <- io $ allClientsM rnc
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   446
    chans <- io $ mapM (client'sM rnc sendChan) cis
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   447
    io $ mapM_ (modifyClient rnc (\cl -> cl{pingsQueue = pingsQueue cl + 1})) cis
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   448
    processAction $ AnswerClients chans ["PING"]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   449
    where
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   450
        kickTimeouted rnc ci = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   451
            pq <- io $ client'sM rnc pingsQueue ci
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   452
            when (pq > 0) $
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   453
                withStateT (\as -> as{clientIndex = Just ci}) $
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   454
                    processAction (ByeClient "Ping timeout")
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   455
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   456
4914
5c33bb53c1e5 Stub for server restart command
unc0rr
parents: 4909
diff changeset
   457
processAction StatsAction = do
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   458
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   459
    si <- gets serverInfo
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
   460
    (roomsNum, clientsNum) <- io $ withRoomsAndClients rnc st
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   461
    io $ writeChan (dbQueries si) $ SendStats clientsNum (roomsNum - 1)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   462
    where
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4923
diff changeset
   463
          st irnc = (length $ allRooms irnc, length $ allClients irnc)
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   464
4955
84543ecae8c3 Don't forkIO main loop
unc0rr
parents: 4942
diff changeset
   465
processAction (RestartServer force) = do
84543ecae8c3 Don't forkIO main loop
unc0rr
parents: 4942
diff changeset
   466
    if force then do
4962
705c6186ad9d Start new server on RestartException
unc0rr
parents: 4960
diff changeset
   467
        throw RestartException
4955
84543ecae8c3 Don't forkIO main loop
unc0rr
parents: 4942
diff changeset
   468
        else
84543ecae8c3 Don't forkIO main loop
unc0rr
parents: 4942
diff changeset
   469
        processAction $ ModifyServerInfo (\s -> s{restartPending=True})