# HG changeset patch # User Wuzzy # Date 1531920954 -7200 # Node ID 9ba5e45943221e6229705c291f1b772e72fb005c # Parent da59012fbd7ae57947a7074f186ebe45162365c0 Refactor server chat command help, also add admin commands to help diff -r da59012fbd7a -r 9ba5e4594322 gameServer/CommandHelp.hs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer/CommandHelp.hs Wed Jul 18 15:35:54 2018 +0200 @@ -0,0 +1,105 @@ +{- + * Hedgewars, a free turn based strategy game + * Copyright (c) 2004-2015 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + \-} + +{-# LANGUAGE OverloadedStrings #-} +module CommandHelp where + +import qualified Data.ByteString.Char8 as B + +import CoreTypes +import Utils + +-- List and documentation of chat commands + +cmdHelpSharedPlayer :: [B.ByteString] +cmdHelpSharedPlayer = [ + loc "/info : Show info about player", + loc "/me : Chat action, e.g. '/me eats pizza' becomes '* Player eats pizza'", + loc "/rnd: Flip a virtual coin and reply with 'heads' or 'tails'", + loc "/rnd [A] [B] [C] [...]: Reply with a random word from the given list", + loc "/watch : Watch a demo stored on the server with the given ID", + loc "/help: Show chat command help" + ] + +cmdHelpRoomOnlyPlayer :: [B.ByteString] +cmdHelpRoomOnlyPlayer = [ + -- For everyone + loc "/callvote [arguments]: Start a vote", + loc "/vote : Vote 'yes' or 'no' for active vote", + -- For room master only + loc "/greeting : Set greeting message to be shown to players who join the room", + loc "/delegate : Surrender room control to player", + loc "/maxteams : Limit maximum number of teams to N" + ] + +cmdHelpSharedAdmin :: [B.ByteString] +cmdHelpSharedAdmin = [ + loc "/global : Send global chat message which can be seen by everyone on the server", + loc "/registered_only: Toggle 'registered only' state. If enabled, only registered players can join server", + loc "/super_power: Activate your super power. With it you can enter any room and are protected from kicking. Expires when you leave server", + -- TODO: Add help for /save + loc "/save " + -- TODO: Add /restart_server? This command seems broken at the moment + ] + +cmdHelpLobbyOnlyAdmin :: [B.ByteString] +cmdHelpLobbyOnlyAdmin = [ + loc "/stats: Query server stats" + ] + +cmdHelpRoomOnlyAdmin :: [B.ByteString] +cmdHelpRoomOnlyAdmin = [ + loc "/force : Force vote result for active vote", + loc "/fix: Force this room to stay open when it is empty", + loc "/unfix: Undo the /fix command", + loc "/saveroom : Save room configuration into a file", + loc "/loadroom : Load room configuration from a file", + -- TODO: Add help for /delete + loc "/delete " + ] + +cmdHelpHeaderLobby :: [B.ByteString] +cmdHelpHeaderLobby = [ loc "List of lobby chat commands:" ] + +cmdHelpHeaderRoom :: [B.ByteString] +cmdHelpHeaderRoom = [ loc "List of room chat commands:" ] + +cmdHelpHeaderAdmin :: [B.ByteString] +cmdHelpHeaderAdmin = [ loc "Commands for server admins only:" ] + +-- Put it all together +-- Lobby commands +cmdHelpLobbyPlayer :: [B.ByteString] +cmdHelpLobbyPlayer = cmdHelpHeaderLobby ++ cmdHelpSharedPlayer + +cmdHelpLobbyAdmin :: [B.ByteString] +cmdHelpLobbyAdmin = cmdHelpLobbyPlayer ++ cmdHelpHeaderAdmin ++ cmdHelpLobbyOnlyAdmin ++ cmdHelpSharedAdmin + +-- Room commands +cmdHelpRoomPlayer :: [B.ByteString] +cmdHelpRoomPlayer = cmdHelpHeaderRoom ++ cmdHelpRoomOnlyPlayer ++ cmdHelpSharedPlayer + +cmdHelpRoomAdmin :: [B.ByteString] +cmdHelpRoomAdmin = cmdHelpRoomPlayer ++ cmdHelpHeaderAdmin ++ cmdHelpRoomOnlyAdmin ++ cmdHelpSharedAdmin + +-- Helper functions for chat command handler +cmdHelpActionEntry :: [ClientChan] -> B.ByteString -> Action +cmdHelpActionEntry chan msg = AnswerClients chan [ "CHAT", "[server]", B.concat [ " ", msg ] ] + +cmdHelpActionList :: [ClientChan] -> [B.ByteString] -> [Action] +cmdHelpActionList chan list = map (cmdHelpActionEntry chan) list diff -r da59012fbd7a -r 9ba5e4594322 gameServer/HWProtoInRoomState.hs --- a/gameServer/HWProtoInRoomState.hs Wed Jul 18 03:55:02 2018 +0200 +++ b/gameServer/HWProtoInRoomState.hs Wed Jul 18 15:35:54 2018 +0200 @@ -33,6 +33,7 @@ import RoomsAndClients import EngineInteraction import Votes +import CommandHelp startGame :: Reader (ClientIndex, IRnC) [Action] startGame = do @@ -407,18 +408,10 @@ handleCmd_inRoom ["HELP"] = do cl <- thisClient - return [ - AnswerClients [sendChan cl] ["CHAT", "[server]", loc "List of chat command for rooms:"], - AnswerClients [sendChan cl] ["CHAT", "[server]", loc " /greeting: Set greeting message to be shown to players who join the room"], - AnswerClients [sendChan cl] ["CHAT", "[server]", loc " /delegate : Surrender room control to player"], - AnswerClients [sendChan cl] ["CHAT", "[server]", loc " /maxteams : Limit maximum number of teams to N"], - AnswerClients [sendChan cl] ["CHAT", "[server]", loc " /callvote [arguments]: Start a vote"], - AnswerClients [sendChan cl] ["CHAT", "[server]", loc " /vote : Vote 'yes' or 'no' for active vote"], - AnswerClients [sendChan cl] ["CHAT", "[server]", loc " /info : Show info about player"], - AnswerClients [sendChan cl] ["CHAT", "[server]", loc " /me : Chat action, e.g. '/me eats piza' becomes '* Player eats pizza'"], - AnswerClients [sendChan cl] ["CHAT", "[server]", loc " /rnd: Flip a virtual coin and write 'heads' or 'tails' in chat"], - AnswerClients [sendChan cl] ["CHAT", "[server]", loc " /rnd [A] [B] [C] [...]: Randomly select a word and write it in chat"], - AnswerClients [sendChan cl] ["CHAT", "[server]", loc " /help: Show command help"] ] + if isAdministrator cl then + return (cmdHelpActionList [sendChan cl] cmdHelpRoomAdmin) + else + return (cmdHelpActionList [sendChan cl] cmdHelpRoomPlayer) handleCmd_inRoom ["GREETING", msg] = do cl <- thisClient diff -r da59012fbd7a -r 9ba5e4594322 gameServer/HWProtoLobbyState.hs --- a/gameServer/HWProtoLobbyState.hs Wed Jul 18 03:55:02 2018 +0200 +++ b/gameServer/HWProtoLobbyState.hs Wed Jul 18 15:35:54 2018 +0200 @@ -29,6 +29,7 @@ import HandlerUtils import RoomsAndClients import EngineInteraction +import CommandHelp handleCmd_lobby :: CmdHandler @@ -168,13 +169,10 @@ handleCmd_lobby ["HELP"] = do cl <- thisClient - return [ - AnswerClients [sendChan cl] ["CHAT", "[server]", loc "List of chat commands for lobby:" ], - AnswerClients [sendChan cl] ["CHAT", "[server]", loc " /info : Show info about player"], - AnswerClients [sendChan cl] ["CHAT", "[server]", loc " /me : Chat action, e.g. '/me eats piza' becomes '* Player eats pizza'"], - AnswerClients [sendChan cl] ["CHAT", "[server]", loc " /rnd: Flip a virtual coin and write 'heads' or 'tails' in chat"], - AnswerClients [sendChan cl] ["CHAT", "[server]", loc " /rnd [A] [B] [C] [...]: Randomly select a word and write it in chat"], - AnswerClients [sendChan cl] ["CHAT", "[server]", loc " /help: Show command help"] ] + if isAdministrator cl then + return (cmdHelpActionList [sendChan cl] cmdHelpLobbyAdmin) + else + return (cmdHelpActionList [sendChan cl] cmdHelpLobbyPlayer) --------------------------- -- Administrator's stuff --