gameServer/Actions.hs
author koda
Mon, 11 Oct 2010 03:28:15 +0200
changeset 3952 d6412423da45
parent 3947 709fdb89f76c
child 4242 5e3c5fe2cb14
permissions -rw-r--r--
moved some utilities to a separate column with round buttons some improvements to rotation handling, overlay appears later so device shouldn't be stressed removed some code and autoset to default only when textfield is empty (for weaps and schemes)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3500
af8390d807d6 Use sockets instead of handles, use bytestrings instead of strings
unc0rr
parents: 3458
diff changeset
     1
{-# LANGUAGE OverloadedStrings #-}
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     2
module Actions where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     3
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
     4
import Control.Concurrent
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     5
import Control.Concurrent.Chan
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
     6
import qualified Data.IntSet as IntSet
3566
772a46ef8288 Properly handle client exit
unc0rr
parents: 3531
diff changeset
     7
import qualified Data.Set as Set
1813
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
     8
import qualified Data.Sequence as Seq
1839
5dd4cb7fd7e5 Server now send ASKPASSWORD command to frontend when user has web account
unc0rr
parents: 1834
diff changeset
     9
import System.Log.Logger
3671
a94d1dc4a8d9 - burp's patch cleaning up module dependancies + cabal file
unc0rr
parents: 3658
diff changeset
    10
import Control.Monad
1926
cb46fbdcaa41 Add simple DoS protection mechanism (although better than previous server had)
unc0rr
parents: 1925
diff changeset
    11
import Data.Time
3671
a94d1dc4a8d9 - burp's patch cleaning up module dependancies + cabal file
unc0rr
parents: 3658
diff changeset
    12
import Data.Maybe
3435
4e4f88a7bdf2 Some more steps in refactoring
unc0rr
parents: 3425
diff changeset
    13
import Control.Monad.Reader
3741
73246d25dfe1 Add some more strictness, use unsafeThaw and unsafeFreeze functions which work at O(1)
unc0rr
parents: 3673
diff changeset
    14
import Control.Monad.State.Strict
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
    15
import qualified Data.ByteString.Char8 as B
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    16
-----------------------------
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    17
import CoreTypes
1813
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
    18
import Utils
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
    19
import ClientIO
3458
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
    20
import ServerState
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    21
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    22
data Action =
3566
772a46ef8288 Properly handle client exit
unc0rr
parents: 3531
diff changeset
    23
    AnswerClients ![ClientChan] ![B.ByteString]
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
    24
    | SendServerMessage
3283
18ee933a5864 Some stuff for game server administration task
unc0rr
parents: 2948
diff changeset
    25
    | SendServerVars
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
    26
    | MoveToRoom RoomIndex
3531
66c403badff6 Reimplement room creating
unC0Rr@gmail.com
parents: 3502
diff changeset
    27
    | MoveToLobby B.ByteString
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
    28
    | RemoveTeam B.ByteString
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
    29
    | RemoveRoom
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
    30
    | UnreadyRoomClients
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
    31
    | JoinLobby
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
    32
    | ProtocolError B.ByteString
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
    33
    | Warning B.ByteString
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
    34
    | ByeClient B.ByteString
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
    35
    | KickClient ClientIndex
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
    36
    | KickRoomClient ClientIndex
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
    37
    | BanClient B.ByteString -- nick
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
    38
    | RemoveClientTeams ClientIndex
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
    39
    | ModifyClient (ClientInfo -> ClientInfo)
3458
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
    40
    | ModifyClient2 ClientIndex (ClientInfo -> ClientInfo)
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
    41
    | ModifyRoom (RoomInfo -> RoomInfo)
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
    42
    | ModifyServerInfo (ServerInfo -> ServerInfo)
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
    43
    | AddRoom B.ByteString B.ByteString
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
    44
    | CheckRegistered
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
    45
    | ClearAccountsCache
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
    46
    | ProcessAccountInfo AccountInfo
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
    47
    | Dump
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
    48
    | AddClient ClientInfo
3566
772a46ef8288 Properly handle client exit
unc0rr
parents: 3531
diff changeset
    49
    | DeleteClient ClientIndex
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
    50
    | PingAll
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
    51
    | StatsAction
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    52
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
    53
type CmdHandler = [B.ByteString] -> Reader (ClientIndex, IRnC) [Action]
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    54
3451
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
    55
3458
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
    56
processAction :: Action -> StateT ServerState IO ()
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    57
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    58
3673
45778b16b224 Some comments on the reason of the bug, leave bug not fixed yet
unc0rr
parents: 3671
diff changeset
    59
processAction (AnswerClients chans msg) = do
3741
73246d25dfe1 Add some more strictness, use unsafeThaw and unsafeFreeze functions which work at O(1)
unc0rr
parents: 3673
diff changeset
    60
    liftIO $ map (flip seq ()) chans `seq` map (flip seq ()) msg `seq` mapM_ (flip writeChan msg) chans
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    61
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    62
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
    63
processAction SendServerMessage = do
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
    64
    chan <- client's sendChan
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
    65
    protonum <- client's clientProto
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
    66
    si <- liftM serverInfo get
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
    67
    let message = if protonum < latestReleaseVersion si then
3283
18ee933a5864 Some stuff for game server administration task
unc0rr
parents: 2948
diff changeset
    68
            serverMessageForOldVersions si
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
    69
            else
3283
18ee933a5864 Some stuff for game server administration task
unc0rr
parents: 2948
diff changeset
    70
            serverMessage si
3673
45778b16b224 Some comments on the reason of the bug, leave bug not fixed yet
unc0rr
parents: 3671
diff changeset
    71
    processAction $ AnswerClients [chan] ["SERVER_MESSAGE", message]
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
    72
{-
3283
18ee933a5864 Some stuff for game server administration task
unc0rr
parents: 2948
diff changeset
    73
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
    74
processAction (clID, serverInfo, rnc) SendServerVars = do
3283
18ee933a5864 Some stuff for game server administration task
unc0rr
parents: 2948
diff changeset
    75
    writeChan (sendChan $ clients ! clID) ("SERVER_VARS" : vars)
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
    76
    return (clID, serverInfo, rnc)
3283
18ee933a5864 Some stuff for game server administration task
unc0rr
parents: 2948
diff changeset
    77
    where
18ee933a5864 Some stuff for game server administration task
unc0rr
parents: 2948
diff changeset
    78
        client = clients ! clID
18ee933a5864 Some stuff for game server administration task
unc0rr
parents: 2948
diff changeset
    79
        vars = [
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
    80
            "MOTD_NEW", serverMessage serverInfo,
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
    81
            "MOTD_OLD", serverMessageForOldVersions serverInfo,
3283
18ee933a5864 Some stuff for game server administration task
unc0rr
parents: 2948
diff changeset
    82
            "LATEST_PROTO", show $ latestReleaseVersion serverInfo
18ee933a5864 Some stuff for game server administration task
unc0rr
parents: 2948
diff changeset
    83
            ]
1923
956b6b3529bc Send server message on join
unc0rr
parents: 1921
diff changeset
    84
956b6b3529bc Send server message on join
unc0rr
parents: 1921
diff changeset
    85
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
    86
-}
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
    87
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
    88
processAction (ProtocolError msg) = do
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
    89
    chan <- client's sendChan
3673
45778b16b224 Some comments on the reason of the bug, leave bug not fixed yet
unc0rr
parents: 3671
diff changeset
    90
    processAction $ AnswerClients [chan] ["ERROR", msg]
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    91
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    92
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
    93
processAction (Warning msg) = do
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
    94
    chan <- client's sendChan
3673
45778b16b224 Some comments on the reason of the bug, leave bug not fixed yet
unc0rr
parents: 3671
diff changeset
    95
    processAction $ AnswerClients [chan] ["WARNING", msg]
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    96
3451
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
    97
processAction (ByeClient msg) = do
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
    98
    (Just ci) <- gets clientIndex
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
    99
    rnc <- gets roomsClients
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   100
    ri <- clientRoomA
1929
7e6cc8da1c58 - Fix bug with kicking players
unc0rr
parents: 1928
diff changeset
   101
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
   102
    chan <- client's sendChan
3566
772a46ef8288 Properly handle client exit
unc0rr
parents: 3531
diff changeset
   103
    ready <- client's isReady
3458
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   104
3947
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   105
    when (ri /= lobbyId) $ do
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   106
        processAction $ MoveToLobby ("quit: " `B.append` msg)
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   107
        liftIO $ modifyRoom rnc (\r -> r{
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   108
                        --playersIDs = IntSet.delete ci (playersIDs r)
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   109
                        playersIn = (playersIn r) - 1,
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   110
                        readyPlayers = if ready then readyPlayers r - 1 else readyPlayers r
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   111
                        }) ri
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   112
        return ()
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   113
3451
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   114
    liftIO $ do
3500
af8390d807d6 Use sockets instead of handles, use bytestrings instead of strings
unc0rr
parents: 3458
diff changeset
   115
        infoM "Clients" (show ci ++ " quits: " ++ (B.unpack msg))
3451
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   116
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   117
        --mapM_ (processAction (ci, serverInfo, rnc)) $ answerOthersQuit ++ answerInformRoom
3566
772a46ef8288 Properly handle client exit
unc0rr
parents: 3531
diff changeset
   118
3673
45778b16b224 Some comments on the reason of the bug, leave bug not fixed yet
unc0rr
parents: 3671
diff changeset
   119
    processAction $ AnswerClients [chan] ["BYE", msg]
3947
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   120
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   121
    s <- get
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   122
    put $! s{removedClients = ci `Set.insert` removedClients s}
3566
772a46ef8288 Properly handle client exit
unc0rr
parents: 3531
diff changeset
   123
772a46ef8288 Properly handle client exit
unc0rr
parents: 3531
diff changeset
   124
processAction (DeleteClient ci) = do
3671
a94d1dc4a8d9 - burp's patch cleaning up module dependancies + cabal file
unc0rr
parents: 3658
diff changeset
   125
    rnc <- gets roomsClients
a94d1dc4a8d9 - burp's patch cleaning up module dependancies + cabal file
unc0rr
parents: 3658
diff changeset
   126
    liftIO $ removeClient rnc ci
3947
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   127
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   128
    s <- get
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   129
    put $! s{removedClients = ci `Set.delete` removedClients s}
3566
772a46ef8288 Properly handle client exit
unc0rr
parents: 3531
diff changeset
   130
3436
288fcbdb77b6 Make server build again (it's still useless though)
unc0rr
parents: 3435
diff changeset
   131
{-
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   132
    where
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   133
        client = clients ! clID
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   134
        clientNick = nick client
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   135
        answerInformRoom =
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   136
            if roomID client /= 0 then
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   137
                if not $ Prelude.null msg then
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   138
                    [AnswerThisRoom ["LEFT", clientNick, msg]]
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   139
                else
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   140
                    [AnswerThisRoom ["LEFT", clientNick]]
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   141
            else
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   142
                []
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   143
        answerOthersQuit =
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   144
            if logonPassed client then
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   145
                if not $ Prelude.null msg then
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   146
                    [AnswerAll ["LOBBY:LEFT", clientNick, msg]]
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   147
                else
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   148
                    [AnswerAll ["LOBBY:LEFT", clientNick]]
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   149
            else
3436
288fcbdb77b6 Make server build again (it's still useless though)
unc0rr
parents: 3435
diff changeset
   150
            [] 
288fcbdb77b6 Make server build again (it's still useless though)
unc0rr
parents: 3435
diff changeset
   151
-}
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   152
3458
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   153
processAction (ModifyClient f) = do
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   154
    (Just ci) <- gets clientIndex
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   155
    rnc <- gets roomsClients
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   156
    liftIO $ modifyClient rnc f ci
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   157
    return ()
3568
ae89cf0735dc A bunch of reimplemented commands
unc0rr
parents: 3566
diff changeset
   158
ae89cf0735dc A bunch of reimplemented commands
unc0rr
parents: 3566
diff changeset
   159
processAction (ModifyClient2 ci f) = do
ae89cf0735dc A bunch of reimplemented commands
unc0rr
parents: 3566
diff changeset
   160
    rnc <- gets roomsClients
ae89cf0735dc A bunch of reimplemented commands
unc0rr
parents: 3566
diff changeset
   161
    liftIO $ modifyClient rnc f ci
ae89cf0735dc A bunch of reimplemented commands
unc0rr
parents: 3566
diff changeset
   162
    return ()
ae89cf0735dc A bunch of reimplemented commands
unc0rr
parents: 3566
diff changeset
   163
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   164
3458
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   165
processAction (ModifyRoom f) = do
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   166
    rnc <- gets roomsClients
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   167
    ri <- clientRoomA
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   168
    liftIO $ modifyRoom rnc f ri
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   169
    return ()
2403
6c5d504af2ba - Proper /team command implementation
unc0rr
parents: 2352
diff changeset
   170
3458
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   171
{-
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   172
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   173
processAction (clID, serverInfo, rnc) (ModifyServerInfo func) =
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   174
    return (clID, func serverInfo, rnc)
1925
ec923e56c444 Allow admin to set server's motd
unc0rr
parents: 1923
diff changeset
   175
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   176
-}
1925
ec923e56c444 Allow admin to set server's motd
unc0rr
parents: 1923
diff changeset
   177
3531
66c403badff6 Reimplement room creating
unC0Rr@gmail.com
parents: 3502
diff changeset
   178
processAction (MoveToRoom ri) = do
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   179
    (Just ci) <- gets clientIndex
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   180
    rnc <- gets roomsClients
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   181
    liftIO $ do
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   182
        modifyClient rnc (\cl -> cl{teamsInGame = 0}) ci
3531
66c403badff6 Reimplement room creating
unC0Rr@gmail.com
parents: 3502
diff changeset
   183
        modifyRoom rnc (\r -> r{playersIn = (playersIn r) + 1}) ri
66c403badff6 Reimplement room creating
unC0Rr@gmail.com
parents: 3502
diff changeset
   184
66c403badff6 Reimplement room creating
unC0Rr@gmail.com
parents: 3502
diff changeset
   185
    liftIO $ moveClientToRoom rnc ri ci
66c403badff6 Reimplement room creating
unC0Rr@gmail.com
parents: 3502
diff changeset
   186
66c403badff6 Reimplement room creating
unC0Rr@gmail.com
parents: 3502
diff changeset
   187
    chans <- liftM (map sendChan) $ roomClientsS ri
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   188
    clNick <- client's nick
3645
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   189
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   190
    processAction $ AnswerClients chans ["JOINED", clNick]
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   191
3531
66c403badff6 Reimplement room creating
unC0Rr@gmail.com
parents: 3502
diff changeset
   192
processAction (MoveToLobby msg) = do
66c403badff6 Reimplement room creating
unC0Rr@gmail.com
parents: 3502
diff changeset
   193
    (Just ci) <- gets clientIndex
66c403badff6 Reimplement room creating
unC0Rr@gmail.com
parents: 3502
diff changeset
   194
    --ri <- clientRoomA
66c403badff6 Reimplement room creating
unC0Rr@gmail.com
parents: 3502
diff changeset
   195
    rnc <- gets roomsClients
66c403badff6 Reimplement room creating
unC0Rr@gmail.com
parents: 3502
diff changeset
   196
66c403badff6 Reimplement room creating
unC0Rr@gmail.com
parents: 3502
diff changeset
   197
    liftIO $ moveClientToLobby rnc ci
66c403badff6 Reimplement room creating
unC0Rr@gmail.com
parents: 3502
diff changeset
   198
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   199
{-
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   200
    (_, _, newClients, newRooms) <-
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   201
            if isMaster client then
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   202
                if (gameinprogress room) && (playersIn room > 1) then
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   203
                    (changeMaster >>= (\state -> foldM processAction state
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   204
                        [AnswerOthersInRoom ["LEFT", nick client, msg],
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   205
                        AnswerOthersInRoom ["WARNING", "Admin left the room"],
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   206
                        RemoveClientTeams clID]))
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   207
                else -- not in game
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   208
                    processAction (clID, serverInfo, rnc) RemoveRoom
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   209
            else -- not master
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   210
                foldM
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   211
                    processAction
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   212
                        (clID, serverInfo, rnc)
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   213
                        [AnswerOthersInRoom ["LEFT", nick client, msg],
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   214
                        RemoveClientTeams clID]
3531
66c403badff6 Reimplement room creating
unC0Rr@gmail.com
parents: 3502
diff changeset
   215
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   216
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   217
    return (
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   218
        clID,
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   219
        serverInfo,
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   220
        adjust resetClientFlags clID newClients,
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   221
        adjust removeClientFromRoom rID $ adjust insertClientToRoom 0 newRooms
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   222
        )
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   223
    where
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   224
        rID = roomID client
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   225
        client = clients ! clID
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   226
        room = rooms ! rID
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   227
        resetClientFlags cl = cl{roomID = 0, isMaster = False, isReady = False, teamsInGame = undefined}
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   228
        removeClientFromRoom r = r{
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   229
                playersIDs = otherPlayersSet,
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   230
                playersIn = (playersIn r) - 1,
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   231
                readyPlayers = if isReady client then (readyPlayers r) - 1 else readyPlayers r
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   232
                }
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   233
        insertClientToRoom r = r{playersIDs = IntSet.insert clID (playersIDs r)}
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   234
        changeMaster = do
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   235
            processAction (newMasterId, serverInfo, rnc) $ AnswerThisClient ["ROOM_CONTROL_ACCESS", "1"]
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   236
            return (
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   237
                clID,
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   238
                serverInfo,
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   239
                adjust (\cl -> cl{isMaster = True}) newMasterId clients,
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   240
                adjust (\r -> r{masterID = newMasterId, name = newRoomName}) rID rooms
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   241
                )
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   242
        newRoomName = nick newMasterClient
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   243
        otherPlayersSet = IntSet.delete clID (playersIDs room)
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   244
        newMasterId = IntSet.findMin otherPlayersSet
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   245
        newMasterClient = clients ! newMasterId
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   246
-}
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   247
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   248
processAction (AddRoom roomName roomPassword) = do
3566
772a46ef8288 Properly handle client exit
unc0rr
parents: 3531
diff changeset
   249
    Just clId <- gets clientIndex
772a46ef8288 Properly handle client exit
unc0rr
parents: 3531
diff changeset
   250
    rnc <- gets roomsClients
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   251
    proto <- liftIO $ client'sM rnc clientProto clId
3645
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   252
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   253
    let room = newRoom{
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   254
            masterID = clId,
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   255
            name = roomName,
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   256
            password = roomPassword,
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   257
            roomProto = proto
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   258
            }
3645
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   259
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   260
    rId <- liftIO $ addRoom rnc room
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   261
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   262
    processAction $ MoveToRoom rId
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   263
3947
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   264
    chans <- liftM (map sendChan) $! roomClientsS lobbyId
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   265
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   266
    mapM_ processAction [
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   267
        AnswerClients chans ["ROOM", "ADD", roomName]
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   268
        , ModifyClient (\cl -> cl{isMaster = True})
3645
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   269
        ]
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   270
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   271
{-
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   272
processAction (clID, serverInfo, rnc) (RemoveRoom) = do
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   273
    processAction (clID, serverInfo, rnc) $ AnswerLobby ["ROOM", "DEL", name room]
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   274
    processAction (clID, serverInfo, rnc) $ AnswerOthersInRoom ["ROOMABANDONED", name room]
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   275
    return (clID,
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   276
        serverInfo,
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   277
        Data.IntMap.map (\cl -> if roomID cl == rID then cl{roomID = 0, isMaster = False, isReady = False, teamsInGame = undefined} else cl) clients,
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   278
        delete rID $ adjust (\r -> r{playersIDs = IntSet.union (playersIDs room) (playersIDs r)}) 0 rooms
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   279
        )
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   280
    where
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   281
        room = rooms ! rID
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   282
        rID = roomID client
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   283
        client = clients ! clID
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   284
3656
c74a4a407146 Make ROUNDFINISHED work correctly
unc0rr
parents: 3654
diff changeset
   285
-}
c74a4a407146 Make ROUNDFINISHED work correctly
unc0rr
parents: 3654
diff changeset
   286
processAction (UnreadyRoomClients) = do
c74a4a407146 Make ROUNDFINISHED work correctly
unc0rr
parents: 3654
diff changeset
   287
    rnc <- gets roomsClients
c74a4a407146 Make ROUNDFINISHED work correctly
unc0rr
parents: 3654
diff changeset
   288
    ri <- clientRoomA
c74a4a407146 Make ROUNDFINISHED work correctly
unc0rr
parents: 3654
diff changeset
   289
    roomPlayers <- roomClientsS ri
c74a4a407146 Make ROUNDFINISHED work correctly
unc0rr
parents: 3654
diff changeset
   290
    roomClIDs <- liftIO $ roomClientsIndicesM rnc ri
c74a4a407146 Make ROUNDFINISHED work correctly
unc0rr
parents: 3654
diff changeset
   291
    processAction $ AnswerClients (map sendChan roomPlayers) ("NOT_READY" : map nick roomPlayers)
c74a4a407146 Make ROUNDFINISHED work correctly
unc0rr
parents: 3654
diff changeset
   292
    liftIO $ mapM_ (modifyClient rnc (\cl -> cl{isReady = False})) roomClIDs
c74a4a407146 Make ROUNDFINISHED work correctly
unc0rr
parents: 3654
diff changeset
   293
    processAction $ ModifyRoom (\r -> r{readyPlayers = 0})
1813
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   294
1811
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   295
3645
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   296
processAction (RemoveTeam teamName) = do
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   297
    rnc <- gets roomsClients
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   298
    cl <- client's id
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   299
    ri <- clientRoomA
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   300
    inGame <- liftIO $ room'sM rnc gameinprogress ri
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   301
    chans <- liftM (map sendChan . filter (/= cl)) $ roomClientsS ri
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   302
    if inGame then
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   303
            mapM_ processAction [
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   304
                AnswerClients chans ["REMOVE_TEAM", teamName],
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   305
                ModifyRoom (\r -> r{teams = Prelude.filter (\t -> teamName /= teamname t) $ teams r})
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   306
                ]
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   307
        else
3645
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   308
            mapM_ processAction [
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   309
                AnswerClients chans ["EM", rmTeamMsg],
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   310
                ModifyRoom (\r -> r{
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   311
                    teams = Prelude.filter (\t -> teamName /= teamname t) $ teams r,
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   312
                    leftTeams = teamName : leftTeams r,
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   313
                    roundMsgs = roundMsgs r Seq.|> rmTeamMsg
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   314
                    })
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   315
                ]
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   316
    where
3645
c0b3f1bb9316 Reimplement REMOVE_TEAM
unc0rr
parents: 3568
diff changeset
   317
        rmTeamMsg = toEngineMsg $ (B.singleton 'F') `B.append` teamName
1813
cfe1481e0247 Removeteam action
unc0rr
parents: 1811
diff changeset
   318
3458
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   319
processAction CheckRegistered = do
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   320
    (Just ci) <- gets clientIndex
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
   321
    n <- client's nick
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
   322
    h <- client's host
3458
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   323
    db <- gets (dbQueries . serverInfo)
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   324
    liftIO $ writeChan db $ CheckAccount ci n h
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   325
    return ()
1834
71cb978dc85f Add working check for www account existance
unc0rr
parents: 1827
diff changeset
   326
3458
11cd56019f00 Make some more protocol commands work
unc0rr
parents: 3452
diff changeset
   327
{-
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   328
processAction (clID, serverInfo, rnc) (ClearAccountsCache) = do
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   329
    writeChan (dbQueries serverInfo) ClearCache
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   330
    return (clID, serverInfo, rnc)
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   331
    where
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   332
        client = clients ! clID
2155
d897222d3339 Implement ability for server admin to clear accounts cache
unc0rr
parents: 2126
diff changeset
   333
d897222d3339 Implement ability for server admin to clear accounts cache
unc0rr
parents: 2126
diff changeset
   334
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   335
processAction (clID, serverInfo, rnc) (Dump) = do
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   336
    writeChan (sendChan $ clients ! clID) ["DUMP", show serverInfo, showTree clients, showTree rooms]
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   337
    return (clID, serverInfo, rnc)
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
   338
-}
1841
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   339
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
   340
processAction (ProcessAccountInfo info) =
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   341
    case info of
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   342
        HasAccount passwd isAdmin -> do
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
   343
            chan <- client's sendChan
3673
45778b16b224 Some comments on the reason of the bug, leave bug not fixed yet
unc0rr
parents: 3671
diff changeset
   344
            processAction $ AnswerClients [chan] ["ASKPASSWORD"]
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   345
        Guest -> do
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   346
            processAction JoinLobby
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   347
        Admin -> do
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   348
            mapM processAction [ModifyClient (\cl -> cl{isAdministrator = True}), JoinLobby]
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
   349
            chan <- client's sendChan
3673
45778b16b224 Some comments on the reason of the bug, leave bug not fixed yet
unc0rr
parents: 3671
diff changeset
   350
            processAction $ AnswerClients [chan] ["ADMIN_ACCESS"]
1841
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   351
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   352
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   353
processAction JoinLobby = do
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
   354
    chan <- client's sendChan
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   355
    clientNick <- client's nick
3566
772a46ef8288 Properly handle client exit
unc0rr
parents: 3531
diff changeset
   356
    (lobbyNicks, clientsChans) <- liftM (unzip . Prelude.map (\c -> (nick c, sendChan c)) . Prelude.filter logonPassed) $! allClientsS
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
   357
    mapM_ processAction $
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   358
        (AnswerClients clientsChans ["LOBBY:JOINED", clientNick])
3566
772a46ef8288 Properly handle client exit
unc0rr
parents: 3531
diff changeset
   359
        : [AnswerClients [chan] ("LOBBY:JOINED" : clientNick : lobbyNicks)]
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   360
        ++ [ModifyClient (\cl -> cl{logonPassed = True}), SendServerMessage]
2118
0ebcc98ebc1a Send server message after nicks info (more chance for it to be seen)
unc0rr
parents: 2116
diff changeset
   361
3501
a3159a410e5c Reimplement more core actions
unc0rr
parents: 3500
diff changeset
   362
{-
3502
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   363
processAction (clID, serverInfo, rnc) (RoomAddThisClient rID) =
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   364
    processAction (
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   365
        clID,
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   366
        serverInfo,
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   367
        adjust (\cl -> cl{roomID = rID, teamsInGame = if rID == 0 then teamsInGame cl else 0}) clID clients,
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   368
        adjust (\r -> r{playersIDs = IntSet.insert clID (playersIDs r), playersIn = (playersIn r) + 1}) rID $
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   369
            adjust (\r -> r{playersIDs = IntSet.delete clID (playersIDs r)}) 0 rooms
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   370
        ) joinMsg
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   371
    where
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   372
        client = clients ! clID
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   373
        joinMsg = if rID == 0 then
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   374
                AnswerAllOthers ["LOBBY:JOINED", nick client]
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   375
            else
ad38c653b7d9 Some more progress
unc0rr
parents: 3501
diff changeset
   376
                AnswerThisRoom ["JOINED", nick client]
1841
fba7210b438b Retrieve client password from web database and ask for it
unc0rr
parents: 1839
diff changeset
   377
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   378
processAction (clID, serverInfo, rnc) (KickClient kickID) =
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   379
    liftM2 replaceID (return clID) (processAction (kickID, serverInfo, rnc) $ ByeClient "Kicked")
1879
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   380
1926
cb46fbdcaa41 Add simple DoS protection mechanism (although better than previous server had)
unc0rr
parents: 1925
diff changeset
   381
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   382
processAction (clID, serverInfo, rnc) (BanClient banNick) =
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   383
    return (clID, serverInfo, rnc)
1921
2a09f7f786a0 - User from localhost is server admin
unc0rr
parents: 1879
diff changeset
   384
1879
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   385
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   386
processAction (clID, serverInfo, rnc) (KickRoomClient kickID) = do
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   387
    writeChan (sendChan $ clients ! kickID) ["KICKED"]
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   388
    liftM2 replaceID (return clID) (processAction (kickID, serverInfo, rnc) $ RoomRemoveThisClient "kicked")
1879
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   389
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   390
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   391
processAction (clID, serverInfo, rnc) (RemoveClientTeams teamsClID) =
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   392
    liftM2 replaceID (return clID) $
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   393
        foldM processAction (teamsClID, serverInfo, rnc) removeTeamsActions
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   394
    where
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   395
        client = clients ! teamsClID
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   396
        room = rooms ! (roomID client)
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   397
        teamsToRemove = Prelude.filter (\t -> teamowner t == nick client) $ teams room
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   398
        removeTeamsActions = Prelude.map (RemoveTeam . teamname) teamsToRemove
3435
4e4f88a7bdf2 Some more steps in refactoring
unc0rr
parents: 3425
diff changeset
   399
-}
1926
cb46fbdcaa41 Add simple DoS protection mechanism (although better than previous server had)
unc0rr
parents: 1925
diff changeset
   400
3451
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   401
processAction (AddClient client) = do
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   402
    rnc <- gets roomsClients
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   403
    si <- gets serverInfo
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   404
    liftIO $ do
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   405
        ci <- addClient rnc client
3500
af8390d807d6 Use sockets instead of handles, use bytestrings instead of strings
unc0rr
parents: 3458
diff changeset
   406
        forkIO $ clientRecvLoop (clientSocket client) (coreChan si) ci
3947
709fdb89f76c Some screwing around in try to fix space leak. No luck yet.
unc0rr
parents: 3741
diff changeset
   407
        forkIO $ clientSendLoop (clientSocket client) (sendChan client) ci
3451
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   408
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   409
        infoM "Clients" (show ci ++ ": New client. Time: " ++ show (connectTime client))
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   410
3673
45778b16b224 Some comments on the reason of the bug, leave bug not fixed yet
unc0rr
parents: 3671
diff changeset
   411
    processAction $ AnswerClients [sendChan client] ["CONNECTED", "Hedgewars server http://www.hedgewars.org/"]
3451
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   412
{-        let newLogins = takeWhile (\(_ , time) -> (connectTime client) `diffUTCTime` time <= 11) $ lastLogins serverInfo
1926
cb46fbdcaa41 Add simple DoS protection mechanism (although better than previous server had)
unc0rr
parents: 1925
diff changeset
   413
3451
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   414
        if False && (isJust $ host client `Prelude.lookup` newLogins) then
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   415
            processAction (ci, serverInfo{lastLogins = newLogins}, rnc) $ ByeClient "Reconnected too fast"
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   416
            else
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   417
            return (ci, serverInfo)
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   418
-}
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   419
62089ccec75c Uses StateT monad instead of manually maintaining the state
unc0rr
parents: 3436
diff changeset
   420
1927
e2031906a347 Ping clients every 30 seconds. Disconnection due to ping timeout to be implemented.
unc0rr
parents: 1926
diff changeset
   421
3654
18189fbc7530 Reimplement ping timeout
unc0rr
parents: 3653
diff changeset
   422
processAction PingAll = do
18189fbc7530 Reimplement ping timeout
unc0rr
parents: 3653
diff changeset
   423
    rnc <- gets roomsClients
3658
113cb9345be1 Make server stay alive when some clients get kicked
unc0rr
parents: 3656
diff changeset
   424
    liftIO (allClientsM rnc) >>= mapM_ (kickTimeouted rnc)
3654
18189fbc7530 Reimplement ping timeout
unc0rr
parents: 3653
diff changeset
   425
    cis <- liftIO $ allClientsM rnc
18189fbc7530 Reimplement ping timeout
unc0rr
parents: 3653
diff changeset
   426
    chans <- liftIO $ mapM (client'sM rnc sendChan) cis
18189fbc7530 Reimplement ping timeout
unc0rr
parents: 3653
diff changeset
   427
    liftIO $ mapM_ (modifyClient rnc (\cl -> cl{pingsQueue = pingsQueue cl + 1})) cis
18189fbc7530 Reimplement ping timeout
unc0rr
parents: 3653
diff changeset
   428
    processAction $ AnswerClients chans ["PING"]
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2662
diff changeset
   429
    where
3654
18189fbc7530 Reimplement ping timeout
unc0rr
parents: 3653
diff changeset
   430
        kickTimeouted rnc ci = do
18189fbc7530 Reimplement ping timeout
unc0rr
parents: 3653
diff changeset
   431
            pq <- liftIO $ client'sM rnc pingsQueue ci
18189fbc7530 Reimplement ping timeout
unc0rr
parents: 3653
diff changeset
   432
            when (pq > 0) $
18189fbc7530 Reimplement ping timeout
unc0rr
parents: 3653
diff changeset
   433
                withStateT (\as -> as{clientIndex = Just ci}) $
18189fbc7530 Reimplement ping timeout
unc0rr
parents: 3653
diff changeset
   434
                    processAction (ByeClient "Ping timeout")
2172
80d34c0b9dfe Implement sending gameserver stats to webserver
unc0rr
parents: 2155
diff changeset
   435
80d34c0b9dfe Implement sending gameserver stats to webserver
unc0rr
parents: 2155
diff changeset
   436
3653
c0d94fedbd86 Reimplement statistics
unc0rr
parents: 3645
diff changeset
   437
processAction (StatsAction) = do
c0d94fedbd86 Reimplement statistics
unc0rr
parents: 3645
diff changeset
   438
    rnc <- gets roomsClients
c0d94fedbd86 Reimplement statistics
unc0rr
parents: 3645
diff changeset
   439
    si <- gets serverInfo
c0d94fedbd86 Reimplement statistics
unc0rr
parents: 3645
diff changeset
   440
    (roomsNum, clientsNum) <- liftIO $ withRoomsAndClients rnc stats
c0d94fedbd86 Reimplement statistics
unc0rr
parents: 3645
diff changeset
   441
    liftIO $ writeChan (dbQueries si) $ SendStats clientsNum (roomsNum - 1)
c0d94fedbd86 Reimplement statistics
unc0rr
parents: 3645
diff changeset
   442
    where
c0d94fedbd86 Reimplement statistics
unc0rr
parents: 3645
diff changeset
   443
          stats irnc = (length $ allRooms irnc, length $ allClients irnc)
3425
ead2ed20dfd4 Start the server refactoring
unc0rr
parents: 3283
diff changeset
   444