gameServer/Actions.hs
author sheepluva
Sun, 06 Feb 2011 11:39:11 +0100
changeset 4929 3dca560e6510
parent 4923 c7829611c682
child 4932 f11d80bac7ed
permissions -rw-r--r--
I need this export in order to not have the wrapper.c fail to find Game() on linux From this point on compilation and usage of library should work on linux, at least does for me :P
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 Control.Concurrent.Chan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
     6
import qualified Data.IntSet as IntSet
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
     7
import qualified Data.Set as Set
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
     8
import qualified Data.Sequence as Seq
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
     9
import System.Log.Logger
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    10
import Control.Monad
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    11
import Data.Time
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    12
import Data.Maybe
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    13
import Control.Monad.Reader
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    14
import Control.Monad.State.Strict
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    15
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
    16
import Control.DeepSeq
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    17
import Data.Time
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    18
import Text.Printf
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
    19
import Data.Unique
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    20
-----------------------------
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    21
import CoreTypes
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    22
import Utils
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    23
import ClientIO
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    24
import ServerState
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    25
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    26
data Action =
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    27
    AnswerClients ![ClientChan] ![B.ByteString]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    28
    | SendServerMessage
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    29
    | SendServerVars
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    30
    | MoveToRoom RoomIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    31
    | MoveToLobby B.ByteString
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    32
    | RemoveTeam B.ByteString
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    33
    | RemoveRoom
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    34
    | UnreadyRoomClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    35
    | JoinLobby
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    36
    | ProtocolError B.ByteString
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    37
    | Warning B.ByteString
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    38
    | NoticeMessage Notice
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    39
    | ByeClient B.ByteString
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    40
    | KickClient ClientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    41
    | KickRoomClient ClientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    42
    | BanClient NominalDiffTime B.ByteString ClientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    43
    | ChangeMaster
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    44
    | RemoveClientTeams ClientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    45
    | ModifyClient (ClientInfo -> ClientInfo)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    46
    | ModifyClient2 ClientIndex (ClientInfo -> ClientInfo)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    47
    | ModifyRoom (RoomInfo -> RoomInfo)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    48
    | ModifyServerInfo (ServerInfo -> ServerInfo)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    49
    | AddRoom B.ByteString B.ByteString
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    50
    | CheckRegistered
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    51
    | ClearAccountsCache
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    52
    | ProcessAccountInfo AccountInfo
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    53
    | AddClient ClientInfo
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    54
    | DeleteClient ClientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    55
    | PingAll
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    56
    | StatsAction
4914
5c33bb53c1e5 Stub for server restart command
unc0rr
parents: 4909
diff changeset
    57
    | RestartServer Bool
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    58
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    59
type CmdHandler = [B.ByteString] -> Reader (ClientIndex, IRnC) [Action]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    60
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    61
instance NFData Action where
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    62
    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
    63
    rnf a = a `seq` ()
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    64
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    65
instance NFData B.ByteString
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    66
instance NFData (Chan a)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    67
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    68
othersChans = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    69
    cl <- client's id
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    70
    ri <- clientRoomA
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    71
    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
    72
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    73
processAction :: Action -> StateT ServerState IO ()
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    74
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    75
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    76
processAction (AnswerClients chans msg) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    77
    io $ mapM_ (flip writeChan (msg `deepseq` msg)) (chans `deepseq` chans)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    78
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    79
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    80
processAction SendServerMessage = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    81
    chan <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    82
    protonum <- client's clientProto
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    83
    si <- liftM serverInfo get
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    84
    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
    85
            serverMessageForOldVersions si
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    86
            else
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    87
            serverMessage si
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    88
    processAction $ AnswerClients [chan] ["SERVER_MESSAGE", message]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    89
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    90
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    91
processAction SendServerVars = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    92
    chan <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    93
    si <- gets serverInfo
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    94
    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
    95
    where
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    96
        vars si = [
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    97
            "MOTD_NEW", serverMessage si,
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    98
            "MOTD_OLD", serverMessageForOldVersions si,
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
    99
            "LATEST_PROTO", B.pack . show $ latestReleaseVersion si
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   100
            ]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   101
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   102
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   103
processAction (ProtocolError msg) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   104
    chan <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   105
    processAction $ AnswerClients [chan] ["ERROR", msg]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   106
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
processAction (Warning msg) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   109
    chan <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   110
    processAction $ AnswerClients [chan] ["WARNING", msg]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   111
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   112
processAction (NoticeMessage n) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   113
    chan <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   114
    processAction $ AnswerClients [chan] ["NOTICE", B.pack . show . fromEnum $ n]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   115
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   116
processAction (ByeClient msg) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   117
    (Just ci) <- gets clientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   118
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   119
    ri <- clientRoomA
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   120
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   121
    chan <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   122
    clNick <- client's nick
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   123
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   124
    when (ri /= lobbyId) $ do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   125
        processAction $ MoveToLobby ("quit: " `B.append` msg)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   126
        return ()
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   127
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   128
    clientsChans <- liftM (Prelude.map sendChan . Prelude.filter logonPassed) $! allClientsS
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   129
    io $ do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   130
        infoM "Clients" (show ci ++ " quits: " ++ (B.unpack msg))
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   131
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   132
    processAction $ AnswerClients [chan] ["BYE", msg]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   133
    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
   134
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   135
    s <- get
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   136
    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
   137
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   138
processAction (DeleteClient ci) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   139
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   140
    io $ removeClient rnc ci
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   141
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   142
    s <- get
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   143
    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
   144
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   145
processAction (ModifyClient f) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   146
    (Just ci) <- gets clientIndex
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 $ modifyClient rnc f ci
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   149
    return ()
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   150
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   151
processAction (ModifyClient2 ci f) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   152
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   153
    io $ modifyClient rnc f ci
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   154
    return ()
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   155
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   156
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   157
processAction (ModifyRoom f) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   158
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   159
    ri <- clientRoomA
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   160
    io $ modifyRoom rnc f ri
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   161
    return ()
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   162
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
processAction (ModifyServerInfo f) =
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   165
    modify (\s -> s{serverInfo = f $ serverInfo s})
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   166
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   167
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   168
processAction (MoveToRoom ri) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   169
    (Just ci) <- gets clientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   170
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   171
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   172
    io $ do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   173
        modifyClient rnc (\cl -> cl{teamsInGame = 0, isReady = False, isMaster = False}) ci
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   174
        modifyRoom rnc (\r -> r{playersIn = (playersIn r) + 1}) ri
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   175
        moveClientToRoom rnc ri ci
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
    chans <- liftM (map sendChan) $ roomClientsS ri
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   178
    clNick <- client's nick
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   179
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   180
    processAction $ AnswerClients chans ["JOINED", clNick]
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
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   183
processAction (MoveToLobby msg) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   184
    (Just ci) <- gets clientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   185
    ri <- clientRoomA
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   186
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   187
    (gameProgress, playersNum) <- io $ room'sM rnc (\r -> (gameinprogress r, playersIn r)) ri
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   188
    ready <- client's isReady
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   189
    master <- client's isMaster
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   190
--    client <- client's id
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   191
    clNick <- client's nick
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   192
    chans <- othersChans
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   193
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   194
    if master then
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   195
        if gameProgress && playersNum > 1 then
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   196
            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
   197
            else
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   198
            processAction RemoveRoom
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   199
        else
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   200
        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
   201
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   202
    io $ do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   203
            modifyRoom rnc (\r -> r{
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   204
                    playersIn = (playersIn r) - 1,
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   205
                    readyPlayers = if ready then readyPlayers r - 1 else readyPlayers r
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   206
                    }) ri
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   207
            moveClientToLobby rnc ci
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   208
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   209
processAction ChangeMaster = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   210
    ri <- clientRoomA
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   211
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   212
    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
   213
    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
   214
    let newRoomName = nick newMaster
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   215
    mapM_ processAction [
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   216
        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
   217
        ModifyClient2 newMasterId (\c -> c{isMaster = True}),
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   218
        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
   219
        ]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   220
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   221
processAction (AddRoom roomName roomPassword) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   222
    Just clId <- gets clientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   223
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   224
    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
   225
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   226
    let room = newRoom{
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   227
            masterID = clId,
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   228
            name = roomName,
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   229
            password = roomPassword,
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   230
            roomProto = proto
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   231
            }
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   232
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   233
    rId <- io $ addRoom rnc room
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   234
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   235
    processAction $ MoveToRoom rId
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   236
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   237
    chans <- liftM (map sendChan) $! roomClientsS lobbyId
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   238
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   239
    mapM_ processAction [
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   240
        AnswerClients chans ["ROOM", "ADD", roomName]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   241
        , ModifyClient (\cl -> cl{isMaster = True})
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   242
        ]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   243
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 RemoveRoom = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   246
    Just clId <- gets clientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   247
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   248
    ri <- io $ clientRoomM rnc clId
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   249
    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
   250
    others <- othersChans
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   251
    lobbyChans <- liftM (map sendChan) $! roomClientsS lobbyId
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
    mapM_ processAction [
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   254
            AnswerClients lobbyChans ["ROOM", "DEL", roomName],
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   255
            AnswerClients others ["ROOMABANDONED", roomName]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   256
        ]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   257
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   258
    io $ removeRoom rnc ri
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   259
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   260
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   261
processAction (UnreadyRoomClients) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   262
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   263
    ri <- clientRoomA
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   264
    roomPlayers <- roomClientsS ri
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   265
    roomClIDs <- io $ roomClientsIndicesM rnc ri
4917
8ff92bdc9f98 Convert READY and NOT_READY messages to CLIENT_FLAGS message
unc0rr
parents: 4914
diff changeset
   266
    processAction $ AnswerClients (map sendChan roomPlayers) ("CLIENT_FLAGS" : "-r" : map nick roomPlayers)
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   267
    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
   268
    processAction $ ModifyRoom (\r -> r{readyPlayers = 0})
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 (RemoveTeam teamName) = 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
    cl <- client's id
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   274
    ri <- clientRoomA
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   275
    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
   276
    chans <- othersChans
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   277
    if inGame then
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   278
            mapM_ processAction [
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   279
                AnswerClients chans ["REMOVE_TEAM", teamName],
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   280
                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
   281
                ]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   282
        else
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   283
            mapM_ processAction [
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   284
                AnswerClients chans ["EM", rmTeamMsg],
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   285
                ModifyRoom (\r -> r{
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   286
                    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
   287
                    leftTeams = teamName : leftTeams r,
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   288
                    roundMsgs = roundMsgs r Seq.|> rmTeamMsg
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   289
                    })
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   290
                ]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   291
    where
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   292
        rmTeamMsg = toEngineMsg $ (B.singleton 'F') `B.append` teamName
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
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   295
processAction (RemoveClientTeams clId) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   296
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   297
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   298
    removeTeamActions <- io $ do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   299
        clNick <- client'sM rnc nick clId
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   300
        rId <- clientRoomM rnc clId
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   301
        roomTeams <- room'sM rnc teams rId
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   302
        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
   303
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   304
    mapM_ processAction removeTeamActions
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
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   308
processAction CheckRegistered = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   309
    (Just ci) <- gets clientIndex
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   310
    n <- client's nick
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   311
    h <- client's host
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
   312
    uid <- client's clUID
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   313
    db <- gets (dbQueries . serverInfo)
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
   314
    io $ writeChan db $ CheckAccount ci (hashUnique uid) n h
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   315
    return ()
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   316
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
processAction ClearAccountsCache = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   319
    dbq <- gets (dbQueries . serverInfo)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   320
    io $ writeChan dbq ClearCache
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   321
    return ()
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   322
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   323
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   324
processAction (ProcessAccountInfo info) =
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   325
    case info of
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   326
        HasAccount passwd isAdmin -> do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   327
            chan <- client's sendChan
4923
c7829611c682 Fix admin stuff :D
unc0rr
parents: 4922
diff changeset
   328
            mapM_ processAction [AnswerClients [chan] ["ASKPASSWORD"], ModifyClient (\c -> c{webPassword = passwd, isAdministrator = isAdmin})]
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   329
        Guest -> do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   330
            processAction JoinLobby
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   331
        Admin -> do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   332
            mapM processAction [ModifyClient (\cl -> cl{isAdministrator = True}), JoinLobby]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   333
            chan <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   334
            processAction $ AnswerClients [chan] ["ADMIN_ACCESS"]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   335
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   336
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   337
processAction JoinLobby = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   338
    chan <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   339
    clientNick <- client's nick
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   340
    (lobbyNicks, clientsChans) <- liftM (unzip . Prelude.map (\c -> (nick c, sendChan c)) . Prelude.filter logonPassed) $! allClientsS
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   341
    mapM_ processAction $
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   342
        (AnswerClients clientsChans ["LOBBY:JOINED", clientNick])
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   343
        : [AnswerClients [chan] ("LOBBY:JOINED" : clientNick : lobbyNicks)]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   344
        ++ [ModifyClient (\cl -> cl{logonPassed = True}), SendServerMessage]
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 (clID, serverInfo, rnc) (RoomAddThisClient rID) =
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   348
    processAction (
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   349
        clID,
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   350
        serverInfo,
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   351
        adjust (\cl -> cl{roomID = rID, teamsInGame = if rID == 0 then teamsInGame cl else 0}) clID clients,
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   352
        adjust (\r -> r{playersIDs = IntSet.insert clID (playersIDs r), playersIn = (playersIn r) + 1}) rID $
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   353
            adjust (\r -> r{playersIDs = IntSet.delete clID (playersIDs r)}) 0 rooms
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   354
        ) joinMsg
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   355
    where
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   356
        client = clients ! clID
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   357
        joinMsg = if rID == 0 then
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   358
                AnswerAllOthers ["LOBBY:JOINED", nick client]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   359
            else
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   360
                AnswerThisRoom ["JOINED", nick client]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   361
                -}
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   362
processAction (KickClient kickId) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   363
    modify (\s -> s{clientIndex = Just kickId})
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   364
    processAction $ ByeClient "Kicked"
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   365
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   366
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   367
processAction (BanClient seconds reason banId) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   368
    modify (\s -> s{clientIndex = Just banId})
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   369
    clHost <- client's host
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   370
    currentTime <- io $ getCurrentTime
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   371
    let msg = "Ban for " `B.append` (B.pack . show $ seconds) `B.append` "seconds (" `B.append` msg` B.append` ")"
4909
dc6482438674 - Implement BAN protocol command
unc0rr
parents: 4907
diff changeset
   372
    mapM_ processAction [
dc6482438674 - Implement BAN protocol command
unc0rr
parents: 4907
diff changeset
   373
        ModifyServerInfo (\s -> s{lastLogins = (clHost, (addUTCTime seconds $ currentTime, msg)) : lastLogins s})
dc6482438674 - Implement BAN protocol command
unc0rr
parents: 4907
diff changeset
   374
        , KickClient banId
dc6482438674 - Implement BAN protocol command
unc0rr
parents: 4907
diff changeset
   375
        ]
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   376
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   377
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   378
processAction (KickRoomClient kickId) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   379
    modify (\s -> s{clientIndex = Just kickId})
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   380
    ch <- client's sendChan
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   381
    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
   382
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   383
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   384
processAction (AddClient cl) = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   385
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   386
    si <- gets serverInfo
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   387
    newClId <- io $ do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   388
        ci <- addClient rnc cl
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   389
        t <- forkIO $ clientRecvLoop (clientSocket cl) (coreChan si) ci
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   390
        forkIO $ clientSendLoop (clientSocket cl) t (coreChan si) (sendChan cl) ci
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
        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
   393
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   394
        return ci
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   395
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   396
    modify (\s -> s{clientIndex = Just newClId})
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   397
    processAction $ AnswerClients [sendChan cl] ["CONNECTED", "Hedgewars server http://www.hedgewars.org/"]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   398
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   399
    si <- gets serverInfo
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   400
    let newLogins = takeWhile (\(_ , (time, _)) -> (connectTime cl) `diffUTCTime` time <= 0) $ lastLogins si
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   401
    let info = host cl `Prelude.lookup` newLogins
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   402
    if isJust info then
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   403
        mapM_ processAction [ModifyServerInfo (\s -> s{lastLogins = newLogins}), ByeClient (snd .  fromJust $ info)]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   404
        else
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   405
        processAction $ ModifyServerInfo (\s -> s{lastLogins = (host cl, (addUTCTime 10 $ connectTime cl, "Reconnected too fast")) : newLogins})
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   406
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   407
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   408
processAction PingAll = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   409
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   410
    io (allClientsM rnc) >>= mapM_ (kickTimeouted rnc)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   411
    cis <- io $ allClientsM rnc
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   412
    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
   413
    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
   414
    processAction $ AnswerClients chans ["PING"]
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   415
    where
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   416
        kickTimeouted rnc ci = do
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   417
            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
   418
            when (pq > 0) $
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   419
                withStateT (\as -> as{clientIndex = Just ci}) $
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   420
                    processAction (ByeClient "Ping timeout")
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   421
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   422
4914
5c33bb53c1e5 Stub for server restart command
unc0rr
parents: 4909
diff changeset
   423
processAction StatsAction = do
4907
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   424
    rnc <- gets roomsClients
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   425
    si <- gets serverInfo
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   426
    (roomsNum, clientsNum) <- io $ withRoomsAndClients rnc stats
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   427
    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
   428
    where
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   429
          stats irnc = (length $ allRooms irnc, length $ allClients irnc)
8bf14795a528 KICK and BAN actions (ban has no protocol command for it yet)
unc0rr
parents: 4905
diff changeset
   430
4914
5c33bb53c1e5 Stub for server restart command
unc0rr
parents: 4909
diff changeset
   431
processAction (RestartServer useForce) = do
5c33bb53c1e5 Stub for server restart command
unc0rr
parents: 4909
diff changeset
   432
    return ()