From acf1a53f3da6cf146d25c282d6995c8d5aa137e0 Mon Sep 17 00:00:00 2001
From: Samual <samual@xonotic.org>
Date: Sun, 6 Nov 2011 02:43:10 -0500
Subject: [PATCH] Also make clientcommands.qc use the same macro method for
 command listing

---
 qcsrc/server/clientcommands.qc | 143 ++++++++++++++++++---------------
 qcsrc/server/gamecommand.qc    |   1 +
 2 files changed, 79 insertions(+), 65 deletions(-)

diff --git a/qcsrc/server/clientcommands.qc b/qcsrc/server/clientcommands.qc
index 82d74bd3e3..00838a431b 100644
--- a/qcsrc/server/clientcommands.qc
+++ b/qcsrc/server/clientcommands.qc
@@ -1001,6 +1001,75 @@ void ClientCommand_(float request)
 */
 
 
+// ===========================
+//  Macro system for commands
+// ===========================
+
+// For now, the list has to be split up due to the suckage called fteqcc which limits macros to only 1024 characters
+// Do not hard code aliases for these, instead create them in defaultXonotic.cfg... also: keep in alphabetical order, please ;)
+#define CLIENT_COMMANDS_1(request,arguments) \
+	CLIENT_COMMAND("autoswitch", ClientCommand_autoswitch(request, arguments)) \
+	CLIENT_COMMAND("checkfail", ClientCommand_checkfail(request, command)) \
+	CLIENT_COMMAND("clientversion", ClientCommand_clientversion(request, arguments)) \
+	CLIENT_COMMAND("cvar_changes", ClientCommand_cvar_changes(request)) \
+	CLIENT_COMMAND("cvar_purechanges", ClientCommand_cvar_purechanges(request)) \
+	CLIENT_COMMAND("info", ClientCommand_info(request, arguments)) \
+	CLIENT_COMMAND("join", ClientCommand_join(request)) \
+	CLIENT_COMMAND("ladder", ClientCommand_ladder(request)) \
+	CLIENT_COMMAND("lsmaps", ClientCommand_lsmaps(request)) \
+	CLIENT_COMMAND("lsnewmaps", ClientCommand_lsnewmaps(request)) \
+	CLIENT_COMMAND("maplist", ClientCommand_maplist(request)) \
+	CLIENT_COMMAND("rankings", ClientCommand_rankings(request)) \
+	CLIENT_COMMAND("ready", ClientCommand_ready(request)) \
+	/* nothing */
+	
+#define CLIENT_COMMANDS_2(request,arguments) \
+	CLIENT_COMMAND("records", ClientCommand_records(request)) \
+	CLIENT_COMMAND("reportcvar", ClientCommand_reportcvar(request, arguments, command)) \
+	CLIENT_COMMAND("say", ClientCommand_say(request, arguments, command)) \
+	CLIENT_COMMAND("say_team", ClientCommand_say_team(request, arguments, command)) \
+	CLIENT_COMMAND("selectteam", ClientCommand_selectteam(request, arguments)) \
+	CLIENT_COMMAND("sentcvar", ClientCommand_sentcvar(request, arguments, command)) \
+	CLIENT_COMMAND("spectate", ClientCommand_spectate(request)) \
+	CLIENT_COMMAND("suggestmap", ClientCommand_suggestmap(request, arguments)) \
+	CLIENT_COMMAND("teamstatus", ClientCommand_teamstatus(request)) \
+	CLIENT_COMMAND("tell", ClientCommand_tell(request, arguments, command)) \
+	CLIENT_COMMAND("timein", ClientCommand_timein(request)) \
+	CLIENT_COMMAND("timeout", ClientCommand_timeout(request)) \
+	CLIENT_COMMAND("voice", ClientCommand_voice(request, arguments, command)) \
+	/* nothing */
+	
+void ClientCommand_macro_help()
+{
+	#define CLIENT_COMMAND(name,function) function;
+	CLIENT_COMMANDS_1(CC_REQUEST_HELP, 0)
+	CLIENT_COMMANDS_2(CC_REQUEST_HELP, 0)
+	#undef CLIENT_COMMAND
+	
+	return;
+}
+
+float ClientCommand_macro_command(float argc)
+{
+	#define CLIENT_COMMAND(name,function) if(name == strtolower(argv(0))) { function; return TRUE; } 
+	CLIENT_COMMANDS_1(CC_REQUEST_COMMAND, argc)
+	CLIENT_COMMANDS_2(CC_REQUEST_COMMAND, argc)
+	#undef CLIENT_COMMAND
+	
+	return FALSE;
+}
+
+float ClientCommand_macro_usage(float argc)
+{
+	#define CLIENT_COMMAND(name,function) if(name == strtolower(argv(1))) { function; return TRUE; }
+	CLIENT_COMMANDS_1(CC_REQUEST_USAGE, argc)
+	CLIENT_COMMANDS_2(CC_REQUEST_USAGE, argc)
+	#undef CLIENT_COMMAND
+	
+	return FALSE;
+}
+
+
 // ======================================
 //  Main Function Called By Engine (cmd)
 // ======================================
@@ -1008,7 +1077,6 @@ void ClientCommand_(float request)
 
 void SV_ParseClientCommand(string command)
 {
-	float search_request_type;
 	float argc = tokenize_console(command);
 	
 	// for floodcheck
@@ -1035,37 +1103,14 @@ void SV_ParseClientCommand(string command)
 		if(argc == 1) 
 		{
 			sprint(self, "\nUsage:^3 cmd COMMAND...^7, where possible commands are:\n");
-			ClientCommand_autoswitch(CC_REQUEST_HELP, 0);
-			ClientCommand_checkfail(CC_REQUEST_HELP, "");
-			ClientCommand_clientversion(CC_REQUEST_HELP, 0);
-			ClientCommand_cvar_changes(CC_REQUEST_HELP);
-			ClientCommand_cvar_purechanges(CC_REQUEST_HELP);
-			ClientCommand_info(CC_REQUEST_HELP, 0);
-			ClientCommand_join(CC_REQUEST_HELP); 
-			ClientCommand_ladder(CC_REQUEST_HELP);
-			ClientCommand_lsmaps(CC_REQUEST_HELP);
-			ClientCommand_lsnewmaps(CC_REQUEST_HELP);
-			ClientCommand_maplist(CC_REQUEST_HELP);
-			ClientCommand_rankings(CC_REQUEST_HELP);
-			ClientCommand_ready(CC_REQUEST_HELP);
-			ClientCommand_records(CC_REQUEST_HELP);
-			ClientCommand_reportcvar(CC_REQUEST_HELP, 0, "");
-			ClientCommand_say(CC_REQUEST_HELP, 0, "");
-			ClientCommand_say_team(CC_REQUEST_HELP, 0, "");
-			ClientCommand_selectteam(CC_REQUEST_HELP, 0);
-			ClientCommand_sentcvar(CC_REQUEST_HELP, 0, "");
-			ClientCommand_spectate(CC_REQUEST_HELP);
-			ClientCommand_suggestmap(CC_REQUEST_HELP, 0);
-			ClientCommand_teamstatus(CC_REQUEST_HELP);
-			ClientCommand_tell(CC_REQUEST_HELP, 0, "");
-			ClientCommand_timein(CC_REQUEST_HELP);
-			ClientCommand_timeout(CC_REQUEST_HELP);
-			ClientCommand_voice(CC_REQUEST_HELP, 0, "");
+			ClientCommand_macro_help;
 			sprint(self, "For help about specific commands, type cmd help COMMAND\n");
 			return;
 		} 
-		else
-			search_request_type = CC_REQUEST_USAGE; // Instead of trying to call a command, we're going to see detailed information about it
+		else if(ClientCommand_macro_usage(argc)) // Instead of trying to call a command, we're going to see detailed information about it
+		{
+			return;
+		}
 	} 
 	else*/ if(MUTATOR_CALLHOOK(SV_ParseClientCommand))
 	{
@@ -1083,42 +1128,10 @@ void SV_ParseClientCommand(string command)
 	{
 		return; // handled by server/cheats.qc
 	}
-	else
-		search_request_type = CC_REQUEST_COMMAND; // continue as usual and scan for normal commands
-	
-	switch(strtolower((search_request_type == CC_REQUEST_USAGE) ? argv(1) : argv(0)))
+	else if(ClientCommand_macro_command(argc)) // continue as usual and scan for normal commands
 	{
-		// Do not hard code aliases for these, instead create them in defaultXonotic.cfg
-		// also: keep in alphabetical order, please ;)
-		
-		case "autoswitch": ClientCommand_autoswitch(search_request_type, argc); break;
-		case "checkfail": ClientCommand_checkfail(search_request_type, command); break;
-		case "clientversion": ClientCommand_clientversion(search_request_type, argc); break;
-		case "cvar_changes": ClientCommand_cvar_changes(search_request_type); break;
-		case "cvar_purechanges": ClientCommand_cvar_purechanges(search_request_type); break;
-		case "info": ClientCommand_info(search_request_type, argc); break;
-		case "join": ClientCommand_join(search_request_type); break;
-		case "ladder": ClientCommand_ladder(search_request_type); break;
-		case "lsmaps": ClientCommand_lsmaps(search_request_type); break;
-		case "lsnewmaps": ClientCommand_lsnewmaps(search_request_type); break;
-		case "maplist": ClientCommand_maplist(search_request_type); break;
-		case "rankings": ClientCommand_rankings(search_request_type); break;
-		case "ready": ClientCommand_ready(search_request_type); break;
-		case "records": ClientCommand_records(search_request_type); break;
-		case "reportcvar": ClientCommand_reportcvar(search_request_type, argc, command); break;
-		case "say": ClientCommand_say(search_request_type, argc, command); break;
-		case "say_team": ClientCommand_say_team(search_request_type, argc, command); break;
-		case "selectteam": ClientCommand_selectteam(search_request_type, argc); break;
-		case "sentcvar": ClientCommand_sentcvar(search_request_type, argc, command); break;
-		case "spectate": ClientCommand_spectate(search_request_type); break;
-		case "suggestmap": ClientCommand_suggestmap(search_request_type, argc); break;
-		case "teamstatus": ClientCommand_teamstatus(search_request_type); break;
-		case "tell": ClientCommand_tell(search_request_type, argc, command); break;
-		case "timein": ClientCommand_timein(search_request_type); break;
-		case "timeout": ClientCommand_timeout(search_request_type); break;
-		case "voice": ClientCommand_voice(search_request_type, argc, command); break;
-		
-		default:
-			clientcommand(self, command); //print("Invalid command. For a list of supported commands, try cmd help.\n");
+		return; // handled by one of the above GameCommand_* functions
 	}
+	else
+		clientcommand(self, command);
 }
\ No newline at end of file
diff --git a/qcsrc/server/gamecommand.qc b/qcsrc/server/gamecommand.qc
index c95cf276e3..91efa02164 100644
--- a/qcsrc/server/gamecommand.qc
+++ b/qcsrc/server/gamecommand.qc
@@ -1970,6 +1970,7 @@ void GameCommand_warp(float request, float argc)
 // ===========================
 
 // For now, the list has to be split up due to the suckage called fteqcc which limits macros to only 1024 characters
+// Do not hard code aliases for these, instead create them in defaultXonotic.cfg... also: keep in alphabetical order, please ;)
 #define SERVER_COMMANDS_1(request,arguments) \
 	SERVER_COMMAND("adminmsg", GameCommand_adminmsg(request, arguments)) \
 	SERVER_COMMAND("allready", GameCommand_allready(request)) \
-- 
2.39.5