gameServer/HWProtoInRoomState.hs
author alfadur
Mon, 12 Feb 2024 21:01:21 +0300
changeset 16016 b26c3497ea85
parent 15900 fc3cb23fd26f
child 15908 014f4edd0421
permissions -rw-r--r--
fix protocol parser life assurance
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10460
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
     1
{-
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
     2
 * Hedgewars, a free turn based strategy game
11046
47a8c19ecb60 more copyright fixes
sheepluva
parents: 10884
diff changeset
     3
 * Copyright (c) 2004-2015 Andrey Korotaev <unC0Rr@gmail.com>
10460
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
     4
 *
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
     6
 * it under the terms of the GNU General Public License as published by
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
     7
 * the Free Software Foundation; version 2 of the License
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
     8
 *
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
    12
 * GNU General Public License for more details.
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
    13
 *
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
    14
 * You should have received a copy of the GNU General Public License
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
    15
 * along with this program; if not, write to the Free Software
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
    16
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
    17
 \-}
8dcea9087d75 Added copyrights to gameServer directory
Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
parents: 10392
diff changeset
    18
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    19
{-# LANGUAGE OverloadedStrings #-}
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    20
module HWProtoInRoomState where
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    21
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    22
import qualified Data.Map as Map
7862
bd76ca40db68 Choose first unused color for added team (addresses issue 431) + other small changes
unc0rr
parents: 7775
diff changeset
    23
import Data.List as L
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    24
import Data.Maybe
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    25
import qualified Data.ByteString.Char8 as B
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    26
import Control.Monad
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    27
import Control.Monad.Reader
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    28
--------------------------------------
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    29
import CoreTypes
13509
f747c385b5ba Server: Replace hardcoded hog-related numbers with consts
Wuzzy <Wuzzy2@mail.ru>
parents: 13079
diff changeset
    30
import Consts
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    31
import Utils
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    32
import HandlerUtils
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    33
import RoomsAndClients
6068
e18713ecf1e0 Introduce EngineInteraction module
unc0rr
parents: 6012
diff changeset
    34
import EngineInteraction
10039
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
    35
import Votes
13515
9ba5e4594322 Refactor server chat command help, also add admin commands to help
Wuzzy <Wuzzy2@mail.ru>
parents: 13514
diff changeset
    36
import CommandHelp
9995
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    37
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    38
startGame :: Reader (ClientIndex, IRnC) [Action]
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    39
startGame = do
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    40
    (ci, rnc) <- ask
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    41
    cl <- thisClient
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    42
    rm <- thisRoom
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    43
    chans <- roomClientsChans
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    44
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    45
    let nicks = map (nick . client rnc) . roomClients rnc $ clientRoom rnc ci
10732
7c4f9e5e447c Get rid of teamownerId since rejoin feature makes it virtually useless, as you cannot rely on it anymore. Should fix recently experienced server crashes.
unc0rr
parents: 10730
diff changeset
    46
    let allPlayersRegistered = all isOwnerRegistered $ teams rm
9995
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    47
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    48
    if (playersIn rm == readyPlayers rm || clientProto cl > 43) && not (isJust $ gameInfo rm) then
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    49
        if enoughClans rm then
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    50
            return [
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    51
                ModifyRoom
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    52
                    (\r -> r{
10392
5012e1f9e893 - Support for pausing multiplayer games
alfadur
parents: 10217
diff changeset
    53
                        gameInfo = Just $ newGameInfo (teams rm) (length $ teams rm) allPlayersRegistered (mapParams rm) (params rm) False
9995
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    54
                        }
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    55
                    )
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    56
                , AnswerClients chans ["RUN_GAME"]
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    57
                , SendUpdateOnThisRoom
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    58
                , AnswerClients chans $ "CLIENT_FLAGS" : "+g" : nicks
11557
cf5d45444357 Oops, fix whose nick to compare to
unc0rr
parents: 11556
diff changeset
    59
                , ModifyRoomClients (\c -> c{isInGame = True, teamIndexes = map snd . filter (\(t, _) -> teamowner t == nick c) $ zip (teams rm) [0..]})
9995
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    60
                ]
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    61
            else
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
    62
            return [Warning $ loc "The game can't be started with less than two clans!"]
9995
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    63
        else
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    64
        return []
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    65
    where
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    66
        enoughClans = not . null . drop 1 . group . map teamcolor . teams
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    67
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    68
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
    69
4989
4771fed9272e - Write server config into .ini file on change
unc0rr
parents: 4986
diff changeset
    70
handleCmd_inRoom :: CmdHandler
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    71
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    72
handleCmd_inRoom ["CHAT", msg] = do
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    73
    n <- clientNick
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    74
    s <- roomOthersChans
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    75
    return [AnswerClients s ["CHAT", n, msg]]
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
    76
13673
1aa5e884326a Fix some string/translation inconsistencies in strings related to leaving
Wuzzy <Wuzzy2@mail.ru>
parents: 13516
diff changeset
    77
-- Leave room normally
1aa5e884326a Fix some string/translation inconsistencies in strings related to leaving
Wuzzy <Wuzzy2@mail.ru>
parents: 13516
diff changeset
    78
handleCmd_inRoom ["PART"] = return [MoveToLobby ""]
13867
d8e606cf8ff5 Simplify /quit chat command
Wuzzy <Wuzzy2@mail.ru>
parents: 13851
diff changeset
    79
handleCmd_inRoom ["PART", _] = return [MoveToLobby ""]
3531
66c403badff6 Reimplement room creating
unC0Rr@gmail.com
parents: 3500
diff changeset
    80
1811
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
    81
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    82
handleCmd_inRoom ("CFG" : paramName : paramStrs)
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
    83
    | null paramStrs = return [ProtocolError $ loc "Empty config entry."]
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    84
    | otherwise = do
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    85
        chans <- roomOthersChans
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    86
        cl <- thisClient
9770
5706b637bae2 - Restrict game config changes in special rooms
unc0rr
parents: 9753
diff changeset
    87
        rm <- thisRoom
5706b637bae2 - Restrict game config changes in special rooms
unc0rr
parents: 9753
diff changeset
    88
5706b637bae2 - Restrict game config changes in special rooms
unc0rr
parents: 9753
diff changeset
    89
        if isSpecial rm then
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
    90
            return [Warning $ loc "Access denied."]
9770
5706b637bae2 - Restrict game config changes in special rooms
unc0rr
parents: 9753
diff changeset
    91
        else if isMaster cl then
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    92
           return [
10730
eac6a4d53752 Server-side workaround for frontend's script parameter bug in .21
unc0rr
parents: 10511
diff changeset
    93
                ModifyRoom $ f (clientProto cl),
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    94
                AnswerClients chans ("CFG" : paramName : paramStrs)]
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
    95
            else
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
    96
            return [ProtocolError $ loc "You're not the room master!"]
4941
90572c338e60 Fix for my last commit (which was all nonsense)
unc0rr
parents: 4932
diff changeset
    97
    where
10730
eac6a4d53752 Server-side workaround for frontend's script parameter bug in .21
unc0rr
parents: 10511
diff changeset
    98
        f clproto r = if paramName `Map.member` (mapParams r) then
4941
90572c338e60 Fix for my last commit (which was all nonsense)
unc0rr
parents: 4932
diff changeset
    99
                r{mapParams = Map.insert paramName (head paramStrs) (mapParams r)}
90572c338e60 Fix for my last commit (which was all nonsense)
unc0rr
parents: 4932
diff changeset
   100
                else
10730
eac6a4d53752 Server-side workaround for frontend's script parameter bug in .21
unc0rr
parents: 10511
diff changeset
   101
                r{params = Map.insert paramName (fixedParamStr clproto) (params r)}
eac6a4d53752 Server-side workaround for frontend's script parameter bug in .21
unc0rr
parents: 10511
diff changeset
   102
        fixedParamStr clproto
eac6a4d53752 Server-side workaround for frontend's script parameter bug in .21
unc0rr
parents: 10511
diff changeset
   103
            | clproto /= 49 = paramStrs
eac6a4d53752 Server-side workaround for frontend's script parameter bug in .21
unc0rr
parents: 10511
diff changeset
   104
            | paramName /= "SCHEME" = paramStrs
eac6a4d53752 Server-side workaround for frontend's script parameter bug in .21
unc0rr
parents: 10511
diff changeset
   105
            | otherwise = L.init paramStrs ++ [B.replicate 50 'X' `B.append` L.last paramStrs]
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   106
9753
9579596cf471 - Special rooms which stay even when last player quits. Not useful for now, and can't be removed at all.
unc0rr
parents: 9715
diff changeset
   107
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4931
diff changeset
   108
handleCmd_inRoom ("ADD_TEAM" : tName : color : grave : fort : voicepack : flag : difStr : hhsInfo)
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
   109
    | length hhsInfo /= 16 = return [ProtocolError $ loc "Corrupted hedgehogs info!"]
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   110
    | otherwise = do
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4931
diff changeset
   111
        rm <- thisRoom
10732
7c4f9e5e447c Get rid of teamownerId since rejoin feature makes it virtually useless, as you cannot rely on it anymore. Should fix recently experienced server crashes.
unc0rr
parents: 10730
diff changeset
   112
        cl <- thisClient
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   113
        clNick <- clientNick
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   114
        clChan <- thisClientChans
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4931
diff changeset
   115
        othChans <- roomOthersChans
7862
bd76ca40db68 Choose first unused color for added team (addresses issue 431) + other small changes
unc0rr
parents: 7775
diff changeset
   116
        roomChans <- roomClientsChans
bd76ca40db68 Choose first unused color for added team (addresses issue 431) + other small changes
unc0rr
parents: 7775
diff changeset
   117
        teamColor <-
8924
13ac59499066 update 0.9.19 with dev branch
koda
parents: 8899
diff changeset
   118
            if clientProto cl < 42 then
7862
bd76ca40db68 Choose first unused color for added team (addresses issue 431) + other small changes
unc0rr
parents: 7775
diff changeset
   119
                return color
bd76ca40db68 Choose first unused color for added team (addresses issue 431) + other small changes
unc0rr
parents: 7775
diff changeset
   120
                else
bd76ca40db68 Choose first unused color for added team (addresses issue 431) + other small changes
unc0rr
parents: 7775
diff changeset
   121
                liftM (head . (L.\\) (map B.singleton ['0'..]) . map teamcolor . teams) thisRoom
8421
fc39fe044a4f Make number of hedgehogs restriction actually work in network game
unc0rr
parents: 8418
diff changeset
   122
        let roomTeams = teams rm
10786
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   123
        let hhNum = newTeamHHNum roomTeams $
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   124
                if not $ null roomTeams then
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   125
                    minimum [hhnum $ head roomTeams, canAddNumber roomTeams]
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   126
                else
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   127
                    defaultHedgehogsNumber rm
12114
cdadc1d487f1 Only registered players regain their teams on rejoin
unc0rr
parents: 11575
diff changeset
   128
        let newTeam = clNick `seq` TeamInfo clNick tName teamColor grave fort voicepack flag (isRegistered cl) dif hhNum (hhsList hhsInfo)
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   129
        return $
10884
7b76811fb689 Fix off-by-1 error
unC0Rr
parents: 10882
diff changeset
   130
            if not . null . drop (teamsNumberLimit rm - 1) $ roomTeams then
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
   131
                [Warning $ loc "Too many teams!"]
8421
fc39fe044a4f Make number of hedgehogs restriction actually work in network game
unc0rr
parents: 8418
diff changeset
   132
            else if canAddNumber roomTeams <= 0 then
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
   133
                [Warning $ loc "Too many hedgehogs!"]
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4931
diff changeset
   134
            else if isJust $ findTeam rm then
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
   135
                [Warning $ loc "There's already a team with same name in the list."]
5996
2c72fe81dd37 Convert boolean variable + a bunch of fields which make sense only while game is going on into Maybe + structure
unc0rr
parents: 5931
diff changeset
   136
            else if isJust $ gameInfo rm then
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
   137
                [Warning $ loc "Joining not possible: Round is in progress."]
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4931
diff changeset
   138
            else if isRestrictedTeams rm then
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
   139
                [Warning $ loc "This room currently does not allow adding new teams."]
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   140
            else
7986
53b1da5ee7f4 Maybe this caused server crashes? Add more strictness on team owner record field
unc0rr
parents: 7947
diff changeset
   141
                [ModifyRoom (\r -> r{teams = teams r ++ [newTeam]}),
7921
6b074de32bea Send ROOM UPD message when team is added/deleted from room, and when game starts or finishes
unc0rr
parents: 7862
diff changeset
   142
                SendUpdateOnThisRoom,
7862
bd76ca40db68 Choose first unused color for added team (addresses issue 431) + other small changes
unc0rr
parents: 7775
diff changeset
   143
                ModifyClient (\c -> c{teamsInGame = teamsInGame c + 1, clientClan = Just teamColor}),
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4931
diff changeset
   144
                AnswerClients clChan ["TEAM_ACCEPTED", tName],
8550
17378d33e62e This change from r0cd63b963330 caused more troubles than solved. Also fix some warnings.
unc0rr
parents: 8541
diff changeset
   145
                AnswerClients othChans $ teamToNet $ newTeam,
17378d33e62e This change from r0cd63b963330 caused more troubles than solved. Also fix some warnings.
unc0rr
parents: 8541
diff changeset
   146
                AnswerClients roomChans ["TEAM_COLOR", tName, teamColor],
8899
7493dde4ef51 This isn't necessary anymore
unc0rr
parents: 8897
diff changeset
   147
                AnswerClients roomChans ["HH_NUM", tName, showB $ hhnum newTeam]
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   148
                ]
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   149
        where
13509
f747c385b5ba Server: Replace hardcoded hog-related numbers with consts
Wuzzy <Wuzzy2@mail.ru>
parents: 13079
diff changeset
   150
        canAddNumber rt = (cMaxHHs) - (sum $ map hhnum rt)
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4931
diff changeset
   151
        findTeam = find (\t -> tName == teamname t) . teams
5030
42746c5d4a80 Changed the standard show function to Text.Show.ByteString, and misc.
EJ <eivind.jahren@gmail.com>
parents: 4989
diff changeset
   152
        dif = readInt_ difStr
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   153
        hhsList [] = []
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   154
        hhsList [_] = error "Hedgehogs list with odd elements number"
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   155
        hhsList (n:h:hhs) = HedgehogInfo n h : hhsList hhs
8421
fc39fe044a4f Make number of hedgehogs restriction actually work in network game
unc0rr
parents: 8418
diff changeset
   156
        newTeamHHNum rt p = min p (canAddNumber rt)
7321
57bd4f201401 - Try sending remove message in 'finally' as a last resort
unc0rr
parents: 7266
diff changeset
   157
        maxTeams r
5931
184057074257 - Allow 8 teams in game on 0.9.16-dev
unc0rr
parents: 5143
diff changeset
   158
            | roomProto r < 38 = 6
13509
f747c385b5ba Server: Replace hardcoded hog-related numbers with consts
Wuzzy <Wuzzy2@mail.ru>
parents: 13079
diff changeset
   159
            | otherwise = cMaxTeams
7321
57bd4f201401 - Try sending remove message in 'finally' as a last resort
unc0rr
parents: 7266
diff changeset
   160
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   161
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4931
diff changeset
   162
handleCmd_inRoom ["REMOVE_TEAM", tName] = do
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4931
diff changeset
   163
        (ci, _) <- ask
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   164
        r <- thisRoom
10732
7c4f9e5e447c Get rid of teamownerId since rejoin feature makes it virtually useless, as you cannot rely on it anymore. Should fix recently experienced server crashes.
unc0rr
parents: 10730
diff changeset
   165
        clNick <- clientNick
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   166
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   167
        let maybeTeam = findTeam r
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   168
        let team = fromJust maybeTeam
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   169
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   170
        return $
8428
73ab5a17ee55 Fix crashers
unc0rr
parents: 8422
diff changeset
   171
            if isNothing $ maybeTeam then
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
   172
                [Warning $ loc "Error: The team you tried to remove does not exist."]
10732
7c4f9e5e447c Get rid of teamownerId since rejoin feature makes it virtually useless, as you cannot rely on it anymore. Should fix recently experienced server crashes.
unc0rr
parents: 10730
diff changeset
   173
            else if clNick /= teamowner team then
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
   174
                [ProtocolError $ loc "You can't remove a team you don't own."]
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   175
            else
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4931
diff changeset
   176
                [RemoveTeam tName,
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   177
                ModifyClient
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   178
                    (\c -> c{
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   179
                        teamsInGame = teamsInGame c - 1,
11414
6f119783a1ad Remove CHECKPOINT 011 occurence, probably hiding some bug
unc0rr
parents: 11046
diff changeset
   180
                        clientClan = if teamsInGame c == 1 then Nothing else anotherTeamClan clNick team r
4989
4771fed9272e - Write server config into .ini file on change
unc0rr
parents: 4986
diff changeset
   181
                    })
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   182
                ]
4568
f85243bf890e Ok. This should pull 0.9.14.1 server into default
nemo
parents: 4337
diff changeset
   183
    where
11414
6f119783a1ad Remove CHECKPOINT 011 occurence, probably hiding some bug
unc0rr
parents: 11046
diff changeset
   184
        anotherTeamClan clNick team = liftM teamcolor . find (\t -> (teamowner t == clNick) && (t /= team)) . teams
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4931
diff changeset
   185
        findTeam = find (\t -> tName == teamname t) . teams
3561
7f8e07e4a4e3 Reimplement REMOVE_TEAM
unc0rr
parents: 3555
diff changeset
   186
3568
ae89cf0735dc A bunch of reimplemented commands
unc0rr
parents: 3566
diff changeset
   187
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   188
handleCmd_inRoom ["HH_NUM", teamName, numberStr] = do
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   189
    cl <- thisClient
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   190
    r <- thisRoom
8421
fc39fe044a4f Make number of hedgehogs restriction actually work in network game
unc0rr
parents: 8418
diff changeset
   191
    clChan <- thisClientChans
8477
330b0b8846cf Don't confirm hogs number to room admin when no constraint hit
unc0rr
parents: 8433
diff changeset
   192
    others <- roomOthersChans
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   193
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   194
    let maybeTeam = findTeam r
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   195
    let team = fromJust maybeTeam
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   196
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   197
    return $
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   198
        if not $ isMaster cl then
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
   199
            [ProtocolError $ loc "You're not the room master!"]
8429
f814a7c2a318 Oops, got too excited
unc0rr
parents: 8428
diff changeset
   200
        else if isNothing maybeTeam then
f814a7c2a318 Oops, got too excited
unc0rr
parents: 8428
diff changeset
   201
            []
13509
f747c385b5ba Server: Replace hardcoded hog-related numbers with consts
Wuzzy <Wuzzy2@mail.ru>
parents: 13079
diff changeset
   202
        else if hhNumber < 1 || hhNumber > cHogsPerTeam || hhNumber > canAddNumber r + hhnum team then
8421
fc39fe044a4f Make number of hedgehogs restriction actually work in network game
unc0rr
parents: 8418
diff changeset
   203
            [AnswerClients clChan ["HH_NUM", teamName, showB $ hhnum team]]
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   204
        else
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   205
            [ModifyRoom $ modifyTeam team{hhnum = hhNumber},
8477
330b0b8846cf Don't confirm hogs number to room admin when no constraint hit
unc0rr
parents: 8433
diff changeset
   206
            AnswerClients others ["HH_NUM", teamName, showB hhNumber]]
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2747
diff changeset
   207
    where
5030
42746c5d4a80 Changed the standard show function to Text.Show.ByteString, and misc.
EJ <eivind.jahren@gmail.com>
parents: 4989
diff changeset
   208
        hhNumber = readInt_ numberStr
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   209
        findTeam = find (\t -> teamName == teamname t) . teams
13509
f747c385b5ba Server: Replace hardcoded hog-related numbers with consts
Wuzzy <Wuzzy2@mail.ru>
parents: 13079
diff changeset
   210
        canAddNumber = (-) cMaxHHs . sum . map hhnum . teams
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   211
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   212
3568
ae89cf0735dc A bunch of reimplemented commands
unc0rr
parents: 3566
diff changeset
   213
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   214
handleCmd_inRoom ["TEAM_COLOR", teamName, newColor] = do
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   215
    cl <- thisClient
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   216
    others <- roomOthersChans
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   217
    r <- thisRoom
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   218
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   219
    let maybeTeam = findTeam r
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   220
    let team = fromJust maybeTeam
10732
7c4f9e5e447c Get rid of teamownerId since rejoin feature makes it virtually useless, as you cannot rely on it anymore. Should fix recently experienced server crashes.
unc0rr
parents: 10730
diff changeset
   221
    maybeClientId <- clientByNick $ teamowner team
7c4f9e5e447c Get rid of teamownerId since rejoin feature makes it virtually useless, as you cannot rely on it anymore. Should fix recently experienced server crashes.
unc0rr
parents: 10730
diff changeset
   222
    let teamOwnerId = fromJust maybeClientId
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   223
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   224
    return $
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   225
        if not $ isMaster cl then
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
   226
            [ProtocolError $ loc "You're not the room master!"]
10732
7c4f9e5e447c Get rid of teamownerId since rejoin feature makes it virtually useless, as you cannot rely on it anymore. Should fix recently experienced server crashes.
unc0rr
parents: 10730
diff changeset
   227
        else if isNothing maybeTeam || isNothing maybeClientId then
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   228
            []
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   229
        else
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   230
            [ModifyRoom $ modifyTeam team{teamcolor = newColor},
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   231
            AnswerClients others ["TEAM_COLOR", teamName, newColor],
10732
7c4f9e5e447c Get rid of teamownerId since rejoin feature makes it virtually useless, as you cannot rely on it anymore. Should fix recently experienced server crashes.
unc0rr
parents: 10730
diff changeset
   232
            ModifyClient2 teamOwnerId (\c -> c{clientClan = Just newColor})]
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2747
diff changeset
   233
    where
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   234
        findTeam = find (\t -> teamName == teamname t) . teams
3568
ae89cf0735dc A bunch of reimplemented commands
unc0rr
parents: 3566
diff changeset
   235
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   236
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   237
handleCmd_inRoom ["TOGGLE_READY"] = do
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   238
    cl <- thisClient
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4931
diff changeset
   239
    rm <- thisRoom
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   240
    chans <- roomClientsChans
7321
57bd4f201401 - Try sending remove message in 'finally' as a last resort
unc0rr
parents: 7266
diff changeset
   241
9995
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
   242
    (ci, rnc) <- ask
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
   243
    let ri = clientRoom rnc ci
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
   244
    let unreadyClients = filter (not . isReady) . map (client rnc) $ roomClients rnc ri
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
   245
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
   246
    gs <- if (not $ isReady cl) && (isSpecial rm) && (unreadyClients == [cl]) then startGame else return []
3577
0ef6f5182a75 START_GAME command
unc0rr
parents: 3568
diff changeset
   247
10017
de822cd3df3a fixwhitespace and dos2unix
koda
parents: 10015
diff changeset
   248
    return $
9995
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
   249
        ModifyRoom (\r -> r{readyPlayers = readyPlayers r + (if isReady cl then -1 else 1)})
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
   250
        : ModifyClient (\c -> c{isReady = not $ isReady cl})
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
   251
        : (AnswerClients chans $ if clientProto cl < 38 then
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
   252
                [if isReady cl then "NOT_READY" else "READY", nick cl]
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
   253
                else
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
   254
                ["CLIENT_FLAGS", if isReady cl then "-r" else "+r", nick cl])
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
   255
        : gs
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   256
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   257
10194
7025bd3c3131 Allow to save and delete room config in room
unc0rr
parents: 10095
diff changeset
   258
handleCmd_inRoom ["START_GAME"] = roomAdminOnly startGame
9995
8bf092ddc536 In special rooms game starts when all players are ready
unc0rr
parents: 9787
diff changeset
   259
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   260
handleCmd_inRoom ["EM", msg] = do
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   261
    cl <- thisClient
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4931
diff changeset
   262
    rm <- thisRoom
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   263
    chans <- roomOthersChans
4931
da43c36a6e92 Don't accept EM message when the game isn't started
unc0rr
parents: 4917
diff changeset
   264
11556
af9aa8d5863c Filter out hog speech messages with non-local team index (not tested)
unc0rr
parents: 11508
diff changeset
   265
    let (legalMsgs, nonEmptyMsgs, lastFTMsg) = checkNetCmd (teamIndexes cl) msg
af9aa8d5863c Filter out hog speech messages with non-local team index (not tested)
unc0rr
parents: 11508
diff changeset
   266
8484
99c14f14f788 New checker of engine messages which is aware of glued together messages
unc0rr
parents: 8477
diff changeset
   267
    if teamsInGame cl > 0 && (isJust $ gameInfo rm) && (not $ B.null legalMsgs) then
99c14f14f788 New checker of engine messages which is aware of glued together messages
unc0rr
parents: 8477
diff changeset
   268
        return $ AnswerClients chans ["EM", legalMsgs]
10017
de822cd3df3a fixwhitespace and dos2unix
koda
parents: 10015
diff changeset
   269
            : [ModifyRoom (\r -> r{gameInfo = liftM
9304
3f4c3fc146c2 Fix spectator desync in rare conditions (there was team which left during its turn, and last command with timestamp from it was '+')
unc0rr
parents: 9035
diff changeset
   270
                (\g -> g{
3f4c3fc146c2 Fix spectator desync in rare conditions (there was team which left during its turn, and last command with timestamp from it was '+')
unc0rr
parents: 9035
diff changeset
   271
                    roundMsgs = if B.null nonEmptyMsgs then roundMsgs g else nonEmptyMsgs : roundMsgs g
3f4c3fc146c2 Fix spectator desync in rare conditions (there was team which left during its turn, and last command with timestamp from it was '+')
unc0rr
parents: 9035
diff changeset
   272
                    , lastFilteredTimedMsg = fromMaybe (lastFilteredTimedMsg g) lastFTMsg})
10092
a92a4ba39a79 Fix build
unc0rr
parents: 10081
diff changeset
   273
                $ gameInfo r}), RegisterEvent EngineMessage]
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   274
        else
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   275
        return []
1804
4e78ad846fb6 New game server:
unc0rr
parents:
diff changeset
   276
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   277
8550
17378d33e62e This change from r0cd63b963330 caused more troubles than solved. Also fix some warnings.
unc0rr
parents: 8541
diff changeset
   278
handleCmd_inRoom ["ROUNDFINISHED", _] = do
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   279
    cl <- thisClient
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4931
diff changeset
   280
    rm <- thisRoom
7765
1e162c1d6dc7 'In game' client flag, both server and frontend support
unc0rr
parents: 7757
diff changeset
   281
    chans <- roomClientsChans
1e162c1d6dc7 'In game' client flag, both server and frontend support
unc0rr
parents: 7757
diff changeset
   282
6753
e95b1f62d0de Don't remove client's teams from teams list on "ROUNDFINISHED 0", just send team removal message to others.
unc0rr
parents: 6738
diff changeset
   283
    let clTeams = map teamname . filter (\t -> teamowner t == nick cl) . teams $ rm
7765
1e162c1d6dc7 'In game' client flag, both server and frontend support
unc0rr
parents: 7757
diff changeset
   284
    let unsetInGameState = [AnswerClients chans ["CLIENT_FLAGS", "-g", nick cl], ModifyClient (\c -> c{isInGame = False})]
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   285
7757
c20e6c80e249 Don't accept ROUNDFINISHED message twice. Fixes game hangs when half of teams quit game.
unc0rr
parents: 7537
diff changeset
   286
    if isInGame cl then
c20e6c80e249 Don't accept ROUNDFINISHED message twice. Fixes game hangs when half of teams quit game.
unc0rr
parents: 7537
diff changeset
   287
        if isJust $ gameInfo rm then
8422
ec41194d4444 Okay, let's try not trust even room admin on this
unc0rr
parents: 8421
diff changeset
   288
            return $ unsetInGameState ++ map SendTeamRemovalMessage clTeams
7757
c20e6c80e249 Don't accept ROUNDFINISHED message twice. Fixes game hangs when half of teams quit game.
unc0rr
parents: 7537
diff changeset
   289
            else
7765
1e162c1d6dc7 'In game' client flag, both server and frontend support
unc0rr
parents: 7757
diff changeset
   290
            return unsetInGameState
4295
1f5604cd99be This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents: 4242
diff changeset
   291
        else
7757
c20e6c80e249 Don't accept ROUNDFINISHED message twice. Fixes game hangs when half of teams quit game.
unc0rr
parents: 7537
diff changeset
   292
        return [] -- don't accept this message twice
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2747
diff changeset
   293
    where
8550
17378d33e62e This change from r0cd63b963330 caused more troubles than solved. Also fix some warnings.
unc0rr
parents: 8541
diff changeset
   294
--        isCorrect = correctly == "1"
1811
1b9e33623b7e Implement 'roundfinished' cmd on net server
unc0rr
parents: 1804
diff changeset
   295
4942
1c85a8e6e11c Okay, a compatibility layer for clients of 0.9.15 version (not sure about old versions, as I removed all compatibility hacks for older versions previously)
unc0rr
parents: 4941
diff changeset
   296
-- compatibility with clients with protocol < 38
1c85a8e6e11c Okay, a compatibility layer for clients of 0.9.15 version (not sure about old versions, as I removed all compatibility hacks for older versions previously)
unc0rr
parents: 4941
diff changeset
   297
handleCmd_inRoom ["ROUNDFINISHED"] =
1c85a8e6e11c Okay, a compatibility layer for clients of 0.9.15 version (not sure about old versions, as I removed all compatibility hacks for older versions previously)
unc0rr
parents: 4941
diff changeset
   298
    handleCmd_inRoom ["ROUNDFINISHED", "1"]
1c85a8e6e11c Okay, a compatibility layer for clients of 0.9.15 version (not sure about old versions, as I removed all compatibility hacks for older versions previously)
unc0rr
parents: 4941
diff changeset
   299
10194
7025bd3c3131 Allow to save and delete room config in room
unc0rr
parents: 10095
diff changeset
   300
handleCmd_inRoom ["TOGGLE_RESTRICT_JOINS"] = roomAdminOnly $
10511
c33b2f001730 This should work, can't test: room flags passed in room info message instead of just 'in-game' state, including 'in-game', 'restricted joins', 'registered only' and 'passworded' flags
unc0rr
parents: 10460
diff changeset
   301
    return [ModifyRoom (\r -> r{isRestrictedJoins = not $ isRestrictedJoins r}), SendUpdateOnThisRoom]
4568
f85243bf890e Ok. This should pull 0.9.14.1 server into default
nemo
parents: 4337
diff changeset
   302
1831
025348f05b9f Implement two more missing protocol commands
unc0rr
parents: 1818
diff changeset
   303
10194
7025bd3c3131 Allow to save and delete room config in room
unc0rr
parents: 10095
diff changeset
   304
handleCmd_inRoom ["TOGGLE_RESTRICT_TEAMS"] = roomAdminOnly $
7025bd3c3131 Allow to save and delete room config in room
unc0rr
parents: 10095
diff changeset
   305
    return [ModifyRoom (\r -> r{isRestrictedTeams = not $ isRestrictedTeams r})]
1879
bb114339eb4e Implement kick from room
unc0rr
parents: 1866
diff changeset
   306
1831
025348f05b9f Implement two more missing protocol commands
unc0rr
parents: 1818
diff changeset
   307
10194
7025bd3c3131 Allow to save and delete room config in room
unc0rr
parents: 10095
diff changeset
   308
handleCmd_inRoom ["TOGGLE_REGISTERED_ONLY"] = roomAdminOnly $
10511
c33b2f001730 This should work, can't test: room flags passed in room info message instead of just 'in-game' state, including 'in-game', 'restricted joins', 'registered only' and 'passworded' flags
unc0rr
parents: 10460
diff changeset
   309
    return [ModifyRoom (\r -> r{isRegisteredOnly = not $ isRegisteredOnly r}), SendUpdateOnThisRoom]
8232
fb5aa767a2a0 "Registered users only" room flag
unc0rr
parents: 8189
diff changeset
   310
8484
99c14f14f788 New checker of engine messages which is aware of glued together messages
unc0rr
parents: 8477
diff changeset
   311
10194
7025bd3c3131 Allow to save and delete room config in room
unc0rr
parents: 10095
diff changeset
   312
handleCmd_inRoom ["ROOM_NAME", newName] = roomAdminOnly $ do
5098
cb9cf41a208c Allow to rename room
unc0rr
parents: 5030
diff changeset
   313
    cl <- thisClient
cb9cf41a208c Allow to rename room
unc0rr
parents: 5030
diff changeset
   314
    rs <- allRoomInfos
6541
08ed346ed341 Send full room info on room add and update events. Less(?) traffic, but current frontend doesn't behave good with this change to server.
unc0rr
parents: 6403
diff changeset
   315
    rm <- thisRoom
15900
fc3cb23fd26f Allow to see rooms of incompatible versions in the lobby
S.D.
parents: 14862
diff changeset
   316
    chansProto <- allChansProto
fc3cb23fd26f Allow to see rooms of incompatible versions in the lobby
S.D.
parents: 14862
diff changeset
   317
    let thisRoomNameByProto = roomNameByProto (name rm) (roomProto rm)
7321
57bd4f201401 - Try sending remove message in 'finally' as a last resort
unc0rr
parents: 7266
diff changeset
   318
5098
cb9cf41a208c Allow to rename room
unc0rr
parents: 5030
diff changeset
   319
    return $
10017
de822cd3df3a fixwhitespace and dos2unix
koda
parents: 10015
diff changeset
   320
        if illegalName newName then
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
   321
            [Warning $ loc "Illegal room name! The room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}"]
9454
ac1874d56057 Fix bug 703
unc0rr
parents: 9304
diff changeset
   322
        else
9770
5706b637bae2 - Restrict game config changes in special rooms
unc0rr
parents: 9753
diff changeset
   323
        if isSpecial rm then
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
   324
            [Warning $ loc "Access denied."]
9753
9579596cf471 - Special rooms which stay even when last player quits. Not useful for now, and can't be removed at all.
unc0rr
parents: 9715
diff changeset
   325
        else
5098
cb9cf41a208c Allow to rename room
unc0rr
parents: 5030
diff changeset
   326
        if isJust $ find (\r -> newName == name r) rs then
13079
81c154fd4380 More user-friendly server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 12114
diff changeset
   327
            [Warning $ loc "A room with the same name already exists."]
5098
cb9cf41a208c Allow to rename room
unc0rr
parents: 5030
diff changeset
   328
        else
6541
08ed346ed341 Send full room info on room add and update events. Less(?) traffic, but current frontend doesn't behave good with this change to server.
unc0rr
parents: 6403
diff changeset
   329
            [ModifyRoom roomUpdate,
15900
fc3cb23fd26f Allow to see rooms of incompatible versions in the lobby
S.D.
parents: 14862
diff changeset
   330
            AnswerClientsByProto chansProto (\p -> "ROOM" : "UPD" : thisRoomNameByProto p : roomInfo p (nick cl) (roomUpdate rm)),
14862
111c4d750c6d Limit room name change rate
unc0rr
parents: 14468
diff changeset
   331
            RegisterEvent RoomNameUpdate]
6541
08ed346ed341 Send full room info on room add and update events. Less(?) traffic, but current frontend doesn't behave good with this change to server.
unc0rr
parents: 6403
diff changeset
   332
    where
08ed346ed341 Send full room info on room add and update events. Less(?) traffic, but current frontend doesn't behave good with this change to server.
unc0rr
parents: 6403
diff changeset
   333
        roomUpdate r = r{name = newName}
5098
cb9cf41a208c Allow to rename room
unc0rr
parents: 5030
diff changeset
   334
cb9cf41a208c Allow to rename room
unc0rr
parents: 5030
diff changeset
   335
10194
7025bd3c3131 Allow to save and delete room config in room
unc0rr
parents: 10095
diff changeset
   336
handleCmd_inRoom ["KICK", kickNick] = roomAdminOnly $ do
4614
26661bf28dd5 Reimplement some more protocol commands
unc0rr
parents: 4337
diff changeset
   337
    (thisClientId, rnc) <- ask
13697
7f174e7285e5 Add a few helpful error messages from server when kicking failed
Wuzzy <Wuzzy2@mail.ru>
parents: 13696
diff changeset
   338
    maybeKickId <- clientByNick kickNick
8513
cd85ab23f38b Disallow kicking the opponent in duel
unc0rr
parents: 8484
diff changeset
   339
    rm <- thisRoom
13697
7f174e7285e5 Add a few helpful error messages from server when kicking failed
Wuzzy <Wuzzy2@mail.ru>
parents: 13696
diff changeset
   340
    let kickId = fromJust maybeKickId
8513
cd85ab23f38b Disallow kicking the opponent in duel
unc0rr
parents: 8484
diff changeset
   341
    let kickCl = rnc `client` kickId
4932
f11d80bac7ed - Take into account hlint suggestions
unc0rr
parents: 4931
diff changeset
   342
    let sameRoom = clientRoom rnc thisClientId == clientRoom rnc kickId
8627
ea2d32a03ac9 Eh, two players condition seems to make more sense than two clans here
unc0rr
parents: 8550
diff changeset
   343
    let notOnly2Players = (length . group . sort . map teamowner . teams $ rm) > 2
13697
7f174e7285e5 Add a few helpful error messages from server when kicking failed
Wuzzy <Wuzzy2@mail.ru>
parents: 13696
diff changeset
   344
    return $
7f174e7285e5 Add a few helpful error messages from server when kicking failed
Wuzzy <Wuzzy2@mail.ru>
parents: 13696
diff changeset
   345
        -- Catch some error conditions
7f174e7285e5 Add a few helpful error messages from server when kicking failed
Wuzzy <Wuzzy2@mail.ru>
parents: 13696
diff changeset
   346
        if (isNothing maybeKickId) then
7f174e7285e5 Add a few helpful error messages from server when kicking failed
Wuzzy <Wuzzy2@mail.ru>
parents: 13696
diff changeset
   347
            [Warning $ loc "Player is not online."]
7f174e7285e5 Add a few helpful error messages from server when kicking failed
Wuzzy <Wuzzy2@mail.ru>
parents: 13696
diff changeset
   348
        else if (kickId == thisClientId) then
7f174e7285e5 Add a few helpful error messages from server when kicking failed
Wuzzy <Wuzzy2@mail.ru>
parents: 13696
diff changeset
   349
            [Warning $ loc "You can't kick yourself!"]
7f174e7285e5 Add a few helpful error messages from server when kicking failed
Wuzzy <Wuzzy2@mail.ru>
parents: 13696
diff changeset
   350
        else if (not ((isNothing $ gameInfo rm) || notOnly2Players || teamsInGame kickCl == 0)) then
7f174e7285e5 Add a few helpful error messages from server when kicking failed
Wuzzy <Wuzzy2@mail.ru>
parents: 13696
diff changeset
   351
            [Warning $ loc "You can't kick the only other player!"]
7f174e7285e5 Add a few helpful error messages from server when kicking failed
Wuzzy <Wuzzy2@mail.ru>
parents: 13696
diff changeset
   352
        else if (not sameRoom) then
13703
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   353
            [Warning $ loc "The player is not in your room."]
13697
7f174e7285e5 Add a few helpful error messages from server when kicking failed
Wuzzy <Wuzzy2@mail.ru>
parents: 13696
diff changeset
   354
        else if (hasSuperPower kickCl) then
7f174e7285e5 Add a few helpful error messages from server when kicking failed
Wuzzy <Wuzzy2@mail.ru>
parents: 13696
diff changeset
   355
            [Warning $ loc "This player is protected from being kicked."]
7f174e7285e5 Add a few helpful error messages from server when kicking failed
Wuzzy <Wuzzy2@mail.ru>
parents: 13696
diff changeset
   356
        else
7f174e7285e5 Add a few helpful error messages from server when kicking failed
Wuzzy <Wuzzy2@mail.ru>
parents: 13696
diff changeset
   357
            -- Kick!
7f174e7285e5 Add a few helpful error messages from server when kicking failed
Wuzzy <Wuzzy2@mail.ru>
parents: 13696
diff changeset
   358
            [KickRoomClient kickId]
1831
025348f05b9f Implement two more missing protocol commands
unc0rr
parents: 1818
diff changeset
   359
8247
d7cf4a9ce685 Command to delegate room to other player
unc0rr
parents: 8232
diff changeset
   360
handleCmd_inRoom ["DELEGATE", newAdmin] = do
d7cf4a9ce685 Command to delegate room to other player
unc0rr
parents: 8232
diff changeset
   361
    (thisClientId, rnc) <- ask
d7cf4a9ce685 Command to delegate room to other player
unc0rr
parents: 8232
diff changeset
   362
    maybeClientId <- clientByNick newAdmin
d7cf4a9ce685 Command to delegate room to other player
unc0rr
parents: 8232
diff changeset
   363
    master <- liftM isMaster thisClient
8403
fbc6e7602e05 - Allow server admins to use DELEGATE even when not room owner
unc0rr
parents: 8401
diff changeset
   364
    serverAdmin <- liftM isAdministrator thisClient
9715
30a303d226f9 Forbid /delegate to room admin
unc0rr
parents: 9702
diff changeset
   365
    thisRoomMasterId <- liftM masterID thisRoom
8247
d7cf4a9ce685 Command to delegate room to other player
unc0rr
parents: 8232
diff changeset
   366
    let newAdminId = fromJust maybeClientId
d7cf4a9ce685 Command to delegate room to other player
unc0rr
parents: 8232
diff changeset
   367
    let sameRoom = clientRoom rnc thisClientId == clientRoom rnc newAdminId
13703
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   368
    return $
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   369
        if (not (master || serverAdmin)) then
13714
e241c9efd217 Fix typo in gameServer
Wuzzy <Wuzzy2@mail.ru>
parents: 13706
diff changeset
   370
            [Warning $ loc "You're not the room master or a server admin!"]
13703
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   371
        else if (isNothing maybeClientId) then
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   372
            [Warning $ loc "Player is not online."]
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   373
        else if (Just newAdminId == thisRoomMasterId) then
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   374
            [Warning $ loc "You're already the room master."]
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   375
        else if (not sameRoom) then
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   376
            [Warning $ loc "The player is not in your room."]
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   377
        else
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   378
            [ChangeMaster (Just newAdminId)]
8247
d7cf4a9ce685 Command to delegate room to other player
unc0rr
parents: 8232
diff changeset
   379
4614
26661bf28dd5 Reimplement some more protocol commands
unc0rr
parents: 4337
diff changeset
   380
handleCmd_inRoom ["TEAMCHAT", msg] = do
26661bf28dd5 Reimplement some more protocol commands
unc0rr
parents: 4337
diff changeset
   381
    cl <- thisClient
26661bf28dd5 Reimplement some more protocol commands
unc0rr
parents: 4337
diff changeset
   382
    chans <- roomSameClanChans
26661bf28dd5 Reimplement some more protocol commands
unc0rr
parents: 4337
diff changeset
   383
    return [AnswerClients chans ["EM", engineMsg cl]]
2867
9be6693c78cb - Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents: 2747
diff changeset
   384
    where
13851
76a1d6275cd3 Teach engine to properly display clan message received from the net
Wuzzy <Wuzzy2@mail.ru>
parents: 13731
diff changeset
   385
        -- This is formatted in a way so it can parsed by engine to make it translatable
76a1d6275cd3 Teach engine to properly display clan message received from the net
Wuzzy <Wuzzy2@mail.ru>
parents: 13731
diff changeset
   386
        -- Format: b<PLAYER NAME>]<MESSAGE>
14468
b444f100a625 Backed out changeset f791c46b47a4
Wuzzy <Wuzzy2@mail.ru>
parents: 14400
diff changeset
   387
        engineMsg cl = toEngineMsg $ B.concat ["b", nick cl, "]", msg, "\x20\x20"]
4568
f85243bf890e Ok. This should pull 0.9.14.1 server into default
nemo
parents: 4337
diff changeset
   388
8484
99c14f14f788 New checker of engine messages which is aware of glued together messages
unc0rr
parents: 8477
diff changeset
   389
7537
833a0c34fafc Room bans. They're more simple, than the global ones: if you ban someone, he is banned by ip in this room for the rest of the room lifetime. Not tested.
unc0rr
parents: 7321
diff changeset
   390
handleCmd_inRoom ["BAN", banNick] = do
8002
8113afd3858f More strictness on room bans
unc0rr
parents: 7986
diff changeset
   391
    (thisClientId, rnc) <- ask
7537
833a0c34fafc Room bans. They're more simple, than the global ones: if you ban someone, he is banned by ip in this room for the rest of the room lifetime. Not tested.
unc0rr
parents: 7321
diff changeset
   392
    maybeClientId <- clientByNick banNick
8002
8113afd3858f More strictness on room bans
unc0rr
parents: 7986
diff changeset
   393
    master <- liftM isMaster thisClient
7537
833a0c34fafc Room bans. They're more simple, than the global ones: if you ban someone, he is banned by ip in this room for the rest of the room lifetime. Not tested.
unc0rr
parents: 7321
diff changeset
   394
    let banId = fromJust maybeClientId
8002
8113afd3858f More strictness on room bans
unc0rr
parents: 7986
diff changeset
   395
    let sameRoom = clientRoom rnc thisClientId == clientRoom rnc banId
8113afd3858f More strictness on room bans
unc0rr
parents: 7986
diff changeset
   396
    if master && isJust maybeClientId && (banId /= thisClientId) && sameRoom then
8113afd3858f More strictness on room bans
unc0rr
parents: 7986
diff changeset
   397
        return [
8189
328f429c3ecc - Disable in-room bans
unc0rr
parents: 8002
diff changeset
   398
--                ModifyRoom (\r -> r{roomBansList = let h = host $ rnc `client` banId in h `deepseq` h : roomBansList r})
328f429c3ecc - Disable in-room bans
unc0rr
parents: 8002
diff changeset
   399
                KickRoomClient banId
8002
8113afd3858f More strictness on room bans
unc0rr
parents: 7986
diff changeset
   400
            ]
8113afd3858f More strictness on room bans
unc0rr
parents: 7986
diff changeset
   401
        else
8113afd3858f More strictness on room bans
unc0rr
parents: 7986
diff changeset
   402
        return []
7537
833a0c34fafc Room bans. They're more simple, than the global ones: if you ban someone, he is banned by ip in this room for the rest of the room lifetime. Not tested.
unc0rr
parents: 7321
diff changeset
   403
9035
e84d42a4311c '/rnd' command. Pass it a (possibly empty) list of items.
unc0rr
parents: 8983
diff changeset
   404
handleCmd_inRoom ("RND":rs) = do
e84d42a4311c '/rnd' command. Pass it a (possibly empty) list of items.
unc0rr
parents: 8983
diff changeset
   405
    n <- clientNick
e84d42a4311c '/rnd' command. Pass it a (possibly empty) list of items.
unc0rr
parents: 8983
diff changeset
   406
    s <- roomClientsChans
e84d42a4311c '/rnd' command. Pass it a (possibly empty) list of items.
unc0rr
parents: 8983
diff changeset
   407
    return [AnswerClients s ["CHAT", n, B.unwords $ "/rnd" : rs], Random s rs]
7537
833a0c34fafc Room bans. They're more simple, than the global ones: if you ban someone, he is banned by ip in this room for the rest of the room lifetime. Not tested.
unc0rr
parents: 7321
diff changeset
   408
10882
ed7717f659ae - Fix ping timeouts after incorrect "/vote" commands (protocol violation)
unc0rr
parents: 10881
diff changeset
   409
13731
f4c8c6a174e8 Display error when using /maxteams if not room master
Wuzzy <Wuzzy2@mail.ru>
parents: 13714
diff changeset
   410
handleCmd_inRoom ["MAXTEAMS", n] = do
10882
ed7717f659ae - Fix ping timeouts after incorrect "/vote" commands (protocol violation)
unc0rr
parents: 10881
diff changeset
   411
    cl <- thisClient
ed7717f659ae - Fix ping timeouts after incorrect "/vote" commands (protocol violation)
unc0rr
parents: 10881
diff changeset
   412
    let m = readInt_ n
13731
f4c8c6a174e8 Display error when using /maxteams if not room master
Wuzzy <Wuzzy2@mail.ru>
parents: 13714
diff changeset
   413
    if not $ isMaster cl then
f4c8c6a174e8 Display error when using /maxteams if not room master
Wuzzy <Wuzzy2@mail.ru>
parents: 13714
diff changeset
   414
        return [Warning $ loc "You're not the room master!"]
f4c8c6a174e8 Display error when using /maxteams if not room master
Wuzzy <Wuzzy2@mail.ru>
parents: 13714
diff changeset
   415
    else if m < 2 || m > cMaxTeams then
14138
d6915d15b6de GameServer: Turn some messages into warnings
Wuzzy <Wuzzy2@mail.ru>
parents: 14013
diff changeset
   416
        return [Warning $ loc "/maxteams: specify number from 2 to 8"]
10882
ed7717f659ae - Fix ping timeouts after incorrect "/vote" commands (protocol violation)
unc0rr
parents: 10881
diff changeset
   417
    else
ed7717f659ae - Fix ping timeouts after incorrect "/vote" commands (protocol violation)
unc0rr
parents: 10881
diff changeset
   418
        return [ModifyRoom (\r -> r{teamsNumberLimit = m})]
ed7717f659ae - Fix ping timeouts after incorrect "/vote" commands (protocol violation)
unc0rr
parents: 10881
diff changeset
   419
14139
589a752c01ca GameServer: Print syntax help if calling /maxteams without argument
Wuzzy <Wuzzy2@mail.ru>
parents: 14138
diff changeset
   420
handleCmd_inRoom ["MAXTEAMS"] = handleCmd_inRoom ["MAXTEAMS", ""]
589a752c01ca GameServer: Print syntax help if calling /maxteams without argument
Wuzzy <Wuzzy2@mail.ru>
parents: 14138
diff changeset
   421
10194
7025bd3c3131 Allow to save and delete room config in room
unc0rr
parents: 10095
diff changeset
   422
handleCmd_inRoom ["FIX"] = serverAdminOnly $
7025bd3c3131 Allow to save and delete room config in room
unc0rr
parents: 10095
diff changeset
   423
    return [ModifyRoom (\r -> r{isSpecial = True})]
9753
9579596cf471 - Special rooms which stay even when last player quits. Not useful for now, and can't be removed at all.
unc0rr
parents: 9715
diff changeset
   424
13703
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   425
handleCmd_inRoom ["UNFIX"] = serverAdminOnly $ do
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   426
    cl <- thisClient
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   427
    return $ if not $ isMaster cl then
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   428
                 [Warning $ loc "You're not the room master!"]
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   429
             else
2df519242d41 Add a couple of more useful server messages
Wuzzy <Wuzzy2@mail.ru>
parents: 13700
diff changeset
   430
                 [ModifyRoom (\r -> r{isSpecial = False})]
9770
5706b637bae2 - Restrict game config changes in special rooms
unc0rr
parents: 9753
diff changeset
   431
13514
da59012fbd7a Add /help command for lobby and rooms too
Wuzzy <Wuzzy2@mail.ru>
parents: 13509
diff changeset
   432
handleCmd_inRoom ["HELP"] = do
da59012fbd7a Add /help command for lobby and rooms too
Wuzzy <Wuzzy2@mail.ru>
parents: 13509
diff changeset
   433
    cl <- thisClient
13515
9ba5e4594322 Refactor server chat command help, also add admin commands to help
Wuzzy <Wuzzy2@mail.ru>
parents: 13514
diff changeset
   434
    if isAdministrator cl then
9ba5e4594322 Refactor server chat command help, also add admin commands to help
Wuzzy <Wuzzy2@mail.ru>
parents: 13514
diff changeset
   435
        return (cmdHelpActionList [sendChan cl] cmdHelpRoomAdmin)
9ba5e4594322 Refactor server chat command help, also add admin commands to help
Wuzzy <Wuzzy2@mail.ru>
parents: 13514
diff changeset
   436
    else
9ba5e4594322 Refactor server chat command help, also add admin commands to help
Wuzzy <Wuzzy2@mail.ru>
parents: 13514
diff changeset
   437
        return (cmdHelpActionList [sendChan cl] cmdHelpRoomPlayer)
13514
da59012fbd7a Add /help command for lobby and rooms too
Wuzzy <Wuzzy2@mail.ru>
parents: 13509
diff changeset
   438
9787
0da6ba2f1f93 - /greeting command for room greeting message
unc0rr
parents: 9770
diff changeset
   439
handleCmd_inRoom ["GREETING", msg] = do
0da6ba2f1f93 - /greeting command for room greeting message
unc0rr
parents: 9770
diff changeset
   440
    cl <- thisClient
0da6ba2f1f93 - /greeting command for room greeting message
unc0rr
parents: 9770
diff changeset
   441
    rm <- thisRoom
13704
54eb4c774ef5 /greeting chat commands now clears greeting if called w/o arguments
Wuzzy <Wuzzy2@mail.ru>
parents: 13703
diff changeset
   442
    return $ if (not (isAdministrator cl || (isMaster cl && (not $ isSpecial rm)))) then
54eb4c774ef5 /greeting chat commands now clears greeting if called w/o arguments
Wuzzy <Wuzzy2@mail.ru>
parents: 13703
diff changeset
   443
                 [Warning $ loc "You're not the room master or a server admin!"]
54eb4c774ef5 /greeting chat commands now clears greeting if called w/o arguments
Wuzzy <Wuzzy2@mail.ru>
parents: 13703
diff changeset
   444
             else
54eb4c774ef5 /greeting chat commands now clears greeting if called w/o arguments
Wuzzy <Wuzzy2@mail.ru>
parents: 13703
diff changeset
   445
                 [ModifyRoom (\r -> r{greeting = msg}),
54eb4c774ef5 /greeting chat commands now clears greeting if called w/o arguments
Wuzzy <Wuzzy2@mail.ru>
parents: 13703
diff changeset
   446
                  AnswerClients [sendChan cl]
54eb4c774ef5 /greeting chat commands now clears greeting if called w/o arguments
Wuzzy <Wuzzy2@mail.ru>
parents: 13703
diff changeset
   447
                      ["CHAT", nickServer,
13705
aa1d71ca6c19 Change empty string check in gameServer
Wuzzy <Wuzzy2@mail.ru>
parents: 13704
diff changeset
   448
                          if B.null msg then
13704
54eb4c774ef5 /greeting chat commands now clears greeting if called w/o arguments
Wuzzy <Wuzzy2@mail.ru>
parents: 13703
diff changeset
   449
                              loc "Greeting message cleared."
54eb4c774ef5 /greeting chat commands now clears greeting if called w/o arguments
Wuzzy <Wuzzy2@mail.ru>
parents: 13703
diff changeset
   450
                          else
54eb4c774ef5 /greeting chat commands now clears greeting if called w/o arguments
Wuzzy <Wuzzy2@mail.ru>
parents: 13703
diff changeset
   451
                              loc "Greeting message set."
54eb4c774ef5 /greeting chat commands now clears greeting if called w/o arguments
Wuzzy <Wuzzy2@mail.ru>
parents: 13703
diff changeset
   452
                      ]]
10039
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   453
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   454
handleCmd_inRoom ["CALLVOTE"] = do
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   455
    cl <- thisClient
10786
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   456
    return [AnswerClients [sendChan cl]
14400
b33127bc2424 Fix incomplete syntax help of /callvote
Wuzzy <Wuzzy2@mail.ru>
parents: 14139
diff changeset
   457
        ["CHAT", nickServer, loc "Available callvote commands: hedgehogs <number>, pause, newseed, map <name>, kick <player>"]
10786
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   458
        ]
10039
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   459
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   460
handleCmd_inRoom ["CALLVOTE", "KICK"] = do
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   461
    cl <- thisClient
14012
4ae01eabf611 Tweak error messages of /callvote kick
Wuzzy <Wuzzy2@mail.ru>
parents: 13991
diff changeset
   462
    rm <- thisRoom
4ae01eabf611 Tweak error messages of /callvote kick
Wuzzy <Wuzzy2@mail.ru>
parents: 13991
diff changeset
   463
    return
14138
d6915d15b6de GameServer: Turn some messages into warnings
Wuzzy <Wuzzy2@mail.ru>
parents: 14013
diff changeset
   464
        [Warning $
14012
4ae01eabf611 Tweak error messages of /callvote kick
Wuzzy <Wuzzy2@mail.ru>
parents: 13991
diff changeset
   465
        if isJust $ masterID rm then
4ae01eabf611 Tweak error messages of /callvote kick
Wuzzy <Wuzzy2@mail.ru>
parents: 13991
diff changeset
   466
            loc "/callvote kick: This is only allowed in rooms without a room master."
4ae01eabf611 Tweak error messages of /callvote kick
Wuzzy <Wuzzy2@mail.ru>
parents: 13991
diff changeset
   467
        else
4ae01eabf611 Tweak error messages of /callvote kick
Wuzzy <Wuzzy2@mail.ru>
parents: 13991
diff changeset
   468
            loc "/callvote kick: You need to specify a nickname."
14138
d6915d15b6de GameServer: Turn some messages into warnings
Wuzzy <Wuzzy2@mail.ru>
parents: 14013
diff changeset
   469
        ]
10039
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   470
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   471
handleCmd_inRoom ["CALLVOTE", "KICK", nickname] = do
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   472
    (thisClientId, rnc) <- ask
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   473
    cl <- thisClient
10058
4ed428389c4e - Implement /callvote
unc0rr
parents: 10057
diff changeset
   474
    rm <- thisRoom
10039
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   475
    maybeClientId <- clientByNick nickname
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   476
    let kickId = fromJust maybeClientId
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   477
    let sameRoom = clientRoom rnc thisClientId == clientRoom rnc kickId
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   478
10217
1a1da2342c5b Fix condition
unc0rr
parents: 10215
diff changeset
   479
    if isJust $ masterID rm then
14138
d6915d15b6de GameServer: Turn some messages into warnings
Wuzzy <Wuzzy2@mail.ru>
parents: 14013
diff changeset
   480
        return [Warning $ loc "/callvote kick: This is only allowed in rooms without a room master."]
10039
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   481
        else
10058
4ed428389c4e - Implement /callvote
unc0rr
parents: 10057
diff changeset
   482
        if isJust maybeClientId && sameRoom then
4ed428389c4e - Implement /callvote
unc0rr
parents: 10057
diff changeset
   483
            startVote $ VoteKick nickname
4ed428389c4e - Implement /callvote
unc0rr
parents: 10057
diff changeset
   484
            else
14138
d6915d15b6de GameServer: Turn some messages into warnings
Wuzzy <Wuzzy2@mail.ru>
parents: 14013
diff changeset
   485
            return [Warning $ loc "/callvote kick: No such user!"]
10039
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   486
10195
d1c23bb73346 - Room save/load into/from file
unc0rr
parents: 10194
diff changeset
   487
10212
5fb3bb2de9d2 Some fixes to voting + small refactoring
unc0rr
parents: 10195
diff changeset
   488
handleCmd_inRoom ["CALLVOTE", "MAP"] = do
13700
feda0d1da62c Add error message for /callvote map if no maps are available
Wuzzy <Wuzzy2@mail.ru>
parents: 13697
diff changeset
   489
    -- Display list of available maps for voting
10212
5fb3bb2de9d2 Some fixes to voting + small refactoring
unc0rr
parents: 10195
diff changeset
   490
    cl <- thisClient
5fb3bb2de9d2 Some fixes to voting + small refactoring
unc0rr
parents: 10195
diff changeset
   491
    s <- liftM (Map.keys . roomSaves) thisRoom
13700
feda0d1da62c Add error message for /callvote map if no maps are available
Wuzzy <Wuzzy2@mail.ru>
parents: 13697
diff changeset
   492
    return [AnswerClients [sendChan cl]
feda0d1da62c Add error message for /callvote map if no maps are available
Wuzzy <Wuzzy2@mail.ru>
parents: 13697
diff changeset
   493
        ["CHAT", nickServer,
feda0d1da62c Add error message for /callvote map if no maps are available
Wuzzy <Wuzzy2@mail.ru>
parents: 13697
diff changeset
   494
            if (not $ null s) then
feda0d1da62c Add error message for /callvote map if no maps are available
Wuzzy <Wuzzy2@mail.ru>
parents: 13697
diff changeset
   495
                (B.concat ["/callvote map: ", B.intercalate ", " s])
feda0d1da62c Add error message for /callvote map if no maps are available
Wuzzy <Wuzzy2@mail.ru>
parents: 13697
diff changeset
   496
            else
feda0d1da62c Add error message for /callvote map if no maps are available
Wuzzy <Wuzzy2@mail.ru>
parents: 13697
diff changeset
   497
                loc "/callvote map: No maps available."
feda0d1da62c Add error message for /callvote map if no maps are available
Wuzzy <Wuzzy2@mail.ru>
parents: 13697
diff changeset
   498
        ]]
10212
5fb3bb2de9d2 Some fixes to voting + small refactoring
unc0rr
parents: 10195
diff changeset
   499
5fb3bb2de9d2 Some fixes to voting + small refactoring
unc0rr
parents: 10195
diff changeset
   500
10195
d1c23bb73346 - Room save/load into/from file
unc0rr
parents: 10194
diff changeset
   501
handleCmd_inRoom ["CALLVOTE", "MAP", roomSave] = do
d1c23bb73346 - Room save/load into/from file
unc0rr
parents: 10194
diff changeset
   502
    cl <- thisClient
d1c23bb73346 - Room save/load into/from file
unc0rr
parents: 10194
diff changeset
   503
    rm <- thisRoom
d1c23bb73346 - Room save/load into/from file
unc0rr
parents: 10194
diff changeset
   504
d1c23bb73346 - Room save/load into/from file
unc0rr
parents: 10194
diff changeset
   505
    if Map.member roomSave $ roomSaves rm then
d1c23bb73346 - Room save/load into/from file
unc0rr
parents: 10194
diff changeset
   506
        startVote $ VoteMap roomSave
d1c23bb73346 - Room save/load into/from file
unc0rr
parents: 10194
diff changeset
   507
        else
14138
d6915d15b6de GameServer: Turn some messages into warnings
Wuzzy <Wuzzy2@mail.ru>
parents: 14013
diff changeset
   508
        return [Warning $ loc "/callvote map: No such map!"]
10786
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   509
10195
d1c23bb73346 - Room save/load into/from file
unc0rr
parents: 10194
diff changeset
   510
10392
5012e1f9e893 - Support for pausing multiplayer games
alfadur
parents: 10217
diff changeset
   511
handleCmd_inRoom ["CALLVOTE", "PAUSE"] = do
5012e1f9e893 - Support for pausing multiplayer games
alfadur
parents: 10217
diff changeset
   512
    cl <- thisClient
5012e1f9e893 - Support for pausing multiplayer games
alfadur
parents: 10217
diff changeset
   513
    rm <- thisRoom
5012e1f9e893 - Support for pausing multiplayer games
alfadur
parents: 10217
diff changeset
   514
5012e1f9e893 - Support for pausing multiplayer games
alfadur
parents: 10217
diff changeset
   515
    if isJust $ gameInfo rm then
10786
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   516
        startVote VotePause
10392
5012e1f9e893 - Support for pausing multiplayer games
alfadur
parents: 10217
diff changeset
   517
        else 
14138
d6915d15b6de GameServer: Turn some messages into warnings
Wuzzy <Wuzzy2@mail.ru>
parents: 14013
diff changeset
   518
        return [Warning $ loc "/callvote pause: No game in progress!"]
10786
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   519
14013
863604736cf5 GameServer: Fix protocol error when receiving CALLVOTE cmd with incorrect mode
Wuzzy <Wuzzy2@mail.ru>
parents: 14012
diff changeset
   520
handleCmd_inRoom ["CALLVOTE", "PAUSE", _] = handleCmd_inRoom ["CALLVOTE", "PAUSE"]
10786
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   521
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   522
handleCmd_inRoom ["CALLVOTE", "NEWSEED"] = do
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   523
    startVote VoteNewSeed
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   524
14013
863604736cf5 GameServer: Fix protocol error when receiving CALLVOTE cmd with incorrect mode
Wuzzy <Wuzzy2@mail.ru>
parents: 14012
diff changeset
   525
handleCmd_inRoom ["CALLVOTE", "NEWSEED", _] = handleCmd_inRoom ["CALLVOTE", "NEWSEED"]
10786
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   526
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   527
handleCmd_inRoom ["CALLVOTE", "HEDGEHOGS"] = do
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   528
    cl <- thisClient
14138
d6915d15b6de GameServer: Turn some messages into warnings
Wuzzy <Wuzzy2@mail.ru>
parents: 14013
diff changeset
   529
    return [Warning $ loc "/callvote hedgehogs: Specify number from 1 to 8."]
10786
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   530
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   531
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   532
handleCmd_inRoom ["CALLVOTE", "HEDGEHOGS", hhs] = do
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   533
    cl <- thisClient
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   534
    let h = readInt_ hhs
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   535
13509
f747c385b5ba Server: Replace hardcoded hog-related numbers with consts
Wuzzy <Wuzzy2@mail.ru>
parents: 13079
diff changeset
   536
    if h > 0 && h <= cHogsPerTeam then
10786
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   537
        startVote $ VoteHedgehogsPerTeam h
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   538
        else
14138
d6915d15b6de GameServer: Turn some messages into warnings
Wuzzy <Wuzzy2@mail.ru>
parents: 14013
diff changeset
   539
        return [Warning $ loc "/callvote hedgehogs: Specify number from 1 to 8."]
10786
712283ed86e0 Implement /newseed and /hedgehogs commands. Only tested for building.
unc0rr
parents: 10732
diff changeset
   540
14013
863604736cf5 GameServer: Fix protocol error when receiving CALLVOTE cmd with incorrect mode
Wuzzy <Wuzzy2@mail.ru>
parents: 14012
diff changeset
   541
handleCmd_inRoom ["CALLVOTE", _] = handleCmd_inRoom ["CALLVOTE"]
863604736cf5 GameServer: Fix protocol error when receiving CALLVOTE cmd with incorrect mode
Wuzzy <Wuzzy2@mail.ru>
parents: 14012
diff changeset
   542
handleCmd_inRoom ["CALLVOTE", _, _] = handleCmd_inRoom ["CALLVOTE"]
10195
d1c23bb73346 - Room save/load into/from file
unc0rr
parents: 10194
diff changeset
   543
10881
941b5ab9e5a6 "/force" command for server admin to force voting result
unc0rr
parents: 10786
diff changeset
   544
handleCmd_inRoom ("VOTE" : m : p) = do
10039
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   545
    cl <- thisClient
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   546
    let b = if m == "YES" then Just True else if m == "NO" then Just False else Nothing
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   547
    if isJust b then
10881
941b5ab9e5a6 "/force" command for server admin to force voting result
unc0rr
parents: 10786
diff changeset
   548
        voted (p == ["FORCE"]) (fromJust b)
13516
60bcc20e6ab0 Improve some replies for chat commands on server
Wuzzy <Wuzzy2@mail.ru>
parents: 13515
diff changeset
   549
    else
14138
d6915d15b6de GameServer: Turn some messages into warnings
Wuzzy <Wuzzy2@mail.ru>
parents: 14013
diff changeset
   550
        return [Warning $
13516
60bcc20e6ab0 Improve some replies for chat commands on server
Wuzzy <Wuzzy2@mail.ru>
parents: 13515
diff changeset
   551
            if (p == ["FORCE"]) then
60bcc20e6ab0 Improve some replies for chat commands on server
Wuzzy <Wuzzy2@mail.ru>
parents: 13515
diff changeset
   552
                loc "/force: Please use 'yes' or 'no'."
60bcc20e6ab0 Improve some replies for chat commands on server
Wuzzy <Wuzzy2@mail.ru>
parents: 13515
diff changeset
   553
            else
60bcc20e6ab0 Improve some replies for chat commands on server
Wuzzy <Wuzzy2@mail.ru>
parents: 13515
diff changeset
   554
                loc "/vote: Please use 'yes' or 'no'."
14138
d6915d15b6de GameServer: Turn some messages into warnings
Wuzzy <Wuzzy2@mail.ru>
parents: 14013
diff changeset
   555
        ]
10039
58cf89284115 Halfplement voting
unc0rr
parents: 9995
diff changeset
   556
10194
7025bd3c3131 Allow to save and delete room config in room
unc0rr
parents: 10095
diff changeset
   557
11575
db7743e2fad1 More work on best time ghost feature
unc0rr
parents: 11557
diff changeset
   558
handleCmd_inRoom ["SAVE", stateName, location] = serverAdminOnly $ do
db7743e2fad1 More work on best time ghost feature
unc0rr
parents: 11557
diff changeset
   559
    return [ModifyRoom $ \r -> r{roomSaves = Map.insert stateName (location, mapParams r, params r) (roomSaves r)}]
10194
7025bd3c3131 Allow to save and delete room config in room
unc0rr
parents: 10095
diff changeset
   560
7025bd3c3131 Allow to save and delete room config in room
unc0rr
parents: 10095
diff changeset
   561
handleCmd_inRoom ["DELETE", stateName] = serverAdminOnly $ do
7025bd3c3131 Allow to save and delete room config in room
unc0rr
parents: 10095
diff changeset
   562
    return [ModifyRoom $ \r -> r{roomSaves = Map.delete stateName (roomSaves r)}]
7025bd3c3131 Allow to save and delete room config in room
unc0rr
parents: 10095
diff changeset
   563
10195
d1c23bb73346 - Room save/load into/from file
unc0rr
parents: 10194
diff changeset
   564
handleCmd_inRoom ["SAVEROOM", fileName] = serverAdminOnly $ do
d1c23bb73346 - Room save/load into/from file
unc0rr
parents: 10194
diff changeset
   565
    return [SaveRoom fileName]
10194
7025bd3c3131 Allow to save and delete room config in room
unc0rr
parents: 10095
diff changeset
   566
10195
d1c23bb73346 - Room save/load into/from file
unc0rr
parents: 10194
diff changeset
   567
handleCmd_inRoom ["LOADROOM", fileName] = serverAdminOnly $ do
d1c23bb73346 - Room save/load into/from file
unc0rr
parents: 10194
diff changeset
   568
    return [LoadRoom fileName]
d1c23bb73346 - Room save/load into/from file
unc0rr
parents: 10194
diff changeset
   569
6912
831416764d2d Allow LIST command while in room to not annoy old frontends (0.9.17 or less) with warnings
unc0rr
parents: 6815
diff changeset
   570
handleCmd_inRoom ["LIST"] = return [] -- for old clients (<= 0.9.17)
831416764d2d Allow LIST command while in room to not annoy old frontends (0.9.17 or less) with warnings
unc0rr
parents: 6815
diff changeset
   571
6721
7dbf8a0c1f5d - Register HWTeam metatype so HWTeam objects could be passed via queued connections
unc0rr
parents: 6690
diff changeset
   572
handleCmd_inRoom (s:_) = return [ProtocolError $ "Incorrect command '" `B.append` s `B.append` "' (state: in room)"]
7dbf8a0c1f5d - Register HWTeam metatype so HWTeam objects could be passed via queued connections
unc0rr
parents: 6690
diff changeset
   573
7dbf8a0c1f5d - Register HWTeam metatype so HWTeam objects could be passed via queued connections
unc0rr
parents: 6690
diff changeset
   574
handleCmd_inRoom [] = return [ProtocolError "Empty command (state: in room)"]