]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/command/generic.qc
Merge branch 'master' into TimePath/deathtypes
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / command / generic.qc
index 2438c0173623c892ddfad2c75f54a0aadf237fa8..5412c22b4b8436bc07b36ac2c974a98ab29903b4 100644 (file)
@@ -1,3 +1,27 @@
+#include "all.qh"
+
+#include "markup.qh"
+#include "rpn.qh"
+
+#include "../mapinfo.qh"
+
+#ifndef MENUQC
+       #include "../notifications.qh"
+#endif
+
+#ifdef CSQC
+       #include "../../client/commands/cl_cmd.qh"
+#endif
+
+#ifdef SVQC
+       #include "../../server/command/banning.qh"
+       #include "../../server/command/cmd.qh"
+       #include "../../server/command/common.qh"
+       #include "../../server/command/sv_cmd.qh"
+       #include "../../common/turrets/config.qh"
+       #include "../../common/weapons/config.qh"
+#endif
+
 // =========================================================
 //  Generic program common command code, written by Samual
 //  Last updated: February 19th, 2012
@@ -18,17 +42,14 @@ string GetProgramCommandPrefix(void)
 }
 
 // used by curl command
-void Curl_URI_Get_Callback(float id, float status, string data)
+void Curl_URI_Get_Callback(int id, float status, string data)
 {
-       float i;
-       float do_exec;
-       string do_cvar;
-       i = id - URI_GET_CURL;
-       do_exec = curl_uri_get_exec[i];
-       do_cvar = curl_uri_get_cvar[i];
+       int i = id - URI_GET_CURL;
+       float do_exec = curl_uri_get_exec[i];
+       string do_cvar = curl_uri_get_cvar[i];
        if(status != 0)
        {
-               dprintf("error: status is %d\n", status);
+               LOG_TRACEF("error: status is %d\n", status);
                if(do_cvar)
                        strunzone(do_cvar);
                return;
@@ -42,7 +63,7 @@ void Curl_URI_Get_Callback(float id, float status, string data)
        }
        if(!do_exec)
                if (!do_cvar)
-                       print(data);
+                       LOG_INFO(data);
 }
 
 
@@ -56,8 +77,6 @@ void GenericCommand_addtolist(float request, float argc)
        {
                case CMD_REQUEST_COMMAND:
                {
-                       float i;
-
                        if(argc >= 2)
                        {
                                string original_cvar = argv(1);
@@ -70,7 +89,7 @@ void GenericCommand_addtolist(float request, float argc)
                                else // add it to the end of the list if the list doesn't already have it
                                {
                                        argc = tokenizebyseparator(cvar_string(original_cvar), " ");
-
+                                       int i;
                                        for(i = 0; i < argc; ++i)
                                                if(argv(i) == tmp_string)
                                                        return; // already in list
@@ -82,12 +101,12 @@ void GenericCommand_addtolist(float request, float argc)
                }
 
                default:
-                       print("Incorrect parameters for ^2addtolist^7\n");
+                       LOG_INFO("Incorrect parameters for ^2addtolist^7\n");
                case CMD_REQUEST_USAGE:
                {
-                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " addtolist variable value\n"));
-                       print("  Where 'variable' is what to add 'value' to.\n");
-                       print("See also: ^2removefromlist^7\n");
+                       LOG_INFO(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " addtolist variable value\n"));
+                       LOG_INFO("  Where 'variable' is what to add 'value' to.\n");
+                       LOG_INFO("See also: ^2removefromlist^7\n");
                        return;
                }
        }
@@ -99,18 +118,10 @@ void GenericCommand_qc_curl(float request, float argc)
        {
                case CMD_REQUEST_COMMAND:
                {
-                       float do_exec;
-                       string do_cvar;
-                       float key;
-                       float i, j;
-                       string url;
-                       float buf;
-                       float r;
-
-                       do_exec = FALSE;
-                       do_cvar = string_null;
-                       key = -1;
-
+                       bool do_exec = false;
+                       string do_cvar = string_null;
+                       float key = -1;
+                       int i;
                        for(i = 1; i+1 < argc; ++i)
                        {
                                if(argv(i) == "--cvar" && i+2 < argc)
@@ -121,7 +132,7 @@ void GenericCommand_qc_curl(float request, float argc)
                                }
                                if(argv(i) == "--exec")
                                {
-                                       do_exec = TRUE;
+                                       do_exec = true;
                                        continue;
                                }
                                if(argv(i) == "--key" && i+2 < argc)
@@ -135,15 +146,16 @@ void GenericCommand_qc_curl(float request, float argc)
 
                        // now, argv(i) is the URL
                        // following args may be POST parameters
-                       url = argv(i);
+                       string url = argv(i);
                        ++i;
-                       buf = buf_create();
-                       j = 0;
-                       for(; i+1 < argc; i += 2)
+                       float buf = buf_create();
+                       int j;
+                       for(j = 0; i+1 < argc; i += 2)
                                bufstr_set(buf, ++j, sprintf("%s=%s", uri_escape(argv(i)), uri_escape(argv(i+1))));
                        if(i < argc)
                                bufstr_set(buf, ++j, sprintf("submit=%s", uri_escape(argv(i))));
 
+                       float r;
                        if(j == 0) // no args: GET
                                r = crypto_uri_postbuf(url, URI_GET_CURL + curl_uri_get_pos, string_null, string_null, -1, key);
                        else // with args: POST
@@ -156,7 +168,7 @@ void GenericCommand_qc_curl(float request, float argc)
                                curl_uri_get_pos = (curl_uri_get_pos + 1) % (URI_GET_CURL_END - URI_GET_CURL + 1);
                        }
                        else
-                               print(_("error creating curl handle\n"));
+                               LOG_INFO(_("error creating curl handle\n"));
 
                        buf_del(buf);
 
@@ -166,13 +178,13 @@ void GenericCommand_qc_curl(float request, float argc)
                default:
                case CMD_REQUEST_USAGE:
                {
-                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " qc_curl [--key N] [--cvar] [--exec] URL [postargs...]"));
+                       LOG_INFO(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " qc_curl [--key N] [--cvar] [--exec] URL [postargs...]"));
                        return;
                }
        }
 }
 
-void GenericCommand_dumpcommands(float request)
+GENERIC_COMMAND(dumpcommands, "Dump all commands on the program to *_cmd_dump.txt")
 {
        switch(request)
        {
@@ -206,178 +218,22 @@ void GenericCommand_dumpcommands(float request)
                                CMD_Write("\ndump of generic commands:\n");
                                GenericCommand_macro_write_aliases(fh);
 
-                               print("Completed dump of aliases in ^2data/data/", GetProgramCommandPrefix(), "_dump.txt^7.\n");
+                               LOG_INFO("Completed dump of aliases in ^2data/data/", GetProgramCommandPrefix(), "_dump.txt^7.\n");
 
                                fclose(fh);
                        }
                        else
                        {
-                               print("^1Error: ^7Could not dump to file!\n");
-                       }
-                       return;
-               }
-
-               default:
-               case CMD_REQUEST_USAGE:
-               {
-                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " dumpcommands"));
-                       print("  No arguments required.\n");
-                       return;
-               }
-       }
-}
-
-void GenericCommand_dumpnotifs(float request)
-{
-       switch(request)
-       {
-               case CMD_REQUEST_COMMAND:
-               {
-                       #ifndef MENUQC
-                       float fh, alsoprint = FALSE;
-                       string filename = argv(1);
-
-                       if(filename == "")
-                       {
-                               filename = "notifications_dump.cfg";
-                               alsoprint = FALSE;
-                       }
-                       else if(filename == "-")
-                       {
-                               filename = "notifications_dump.cfg";
-                               alsoprint = TRUE;
-                       }
-                       fh = fopen(filename, FILE_WRITE);
-
-                       if(fh >= 0)
-                       {
-                               Dump_Notifications(fh, alsoprint);
-                               printf("Dumping notifications... File located in ^2data/data/%s^7.\n", filename);
-                               fclose(fh);
-                       }
-                       else
-                       {
-                               printf("^1Error: ^7Could not open file '%s'!\n", filename);
-                       }
-                       #else
-                       print(_("Notification dump command only works with cl_cmd and sv_cmd.\n"));
-                       #endif
-                       return;
-               }
-
-               default:
-               case CMD_REQUEST_USAGE:
-               {
-                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " dumpnotifs [filename]"));
-                       print("  Where 'filename' is the file to write (default is notifications_dump.cfg),\n");
-                       print("  if supplied with '-' output to console as well as default,\n");
-                       print("  if left blank, it will only write to default.\n");
-                       return;
-               }
-       }
-}
-
-void GenericCommand_dumpweapons(float request) // WEAPONTODO: make this work with other progs than just server
-{
-       switch(request)
-       {
-               case CMD_REQUEST_COMMAND:
-               {
-                       #ifdef SVQC
-                       wep_config_file = -1;
-                       wep_config_alsoprint = -1;
-                       string filename = argv(1);
-                       
-                       if(filename == "")
-                       {
-                               filename = "weapons_dump.cfg";
-                               wep_config_alsoprint = FALSE;
-                       }
-                       else if(filename == "-")
-                       {
-                               filename = "weapons_dump.cfg";
-                               wep_config_alsoprint = TRUE;
-                       }
-                       wep_config_file = fopen(filename, FILE_WRITE);
-                       
-                       if(wep_config_file >= 0)
-                       {
-                               Dump_Weapon_Settings();
-                               print(sprintf("Dumping weapons... File located in ^2data/data/%s^7.\n", filename));
-                               fclose(wep_config_file);
-                               wep_config_file = -1;
-                               wep_config_alsoprint = -1;
-                       }
-                       else
-                       {
-                               print(sprintf("^1Error: ^7Could not open file '%s'!\n", filename));
+                               LOG_INFO("^1Error: ^7Could not dump to file!\n");
                        }
-                       #else
-                       print(_("Weapons dump command only works with sv_cmd.\n"));
-                       #endif
-                       return;
-               }
-                       
-               default:
-               case CMD_REQUEST_USAGE:
-               {
-                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " dumpweapons [filename]"));
-                       print("  Where 'filename' is the file to write (default is weapons_dump.cfg),\n");
-                       print("  if supplied with '-' output to console as well as default,\n");
-                       print("  if left blank, it will only write to default.\n");
                        return;
                }
-       }
-}
 
-void GenericCommand_dumpturrets(float request)
-{
-       switch(request)
-       {
-               case CMD_REQUEST_COMMAND:
-               {
-                       #ifdef SVQC
-                       tur_config_file = -1;
-                       tur_config_alsoprint = -1;
-                       string filename = argv(1);
-                       
-                       if(filename == "")
-                       {
-                               filename = "turrets_dump.cfg";
-                               tur_config_alsoprint = FALSE;
-                       }
-                       else if(filename == "-")
-                       {
-                               filename = "turrets_dump.cfg";
-                               tur_config_alsoprint = TRUE;
-                       }
-                       tur_config_file = fopen(filename, FILE_WRITE);
-                       
-                       if(tur_config_file >= 0)
-                       {
-                               Dump_Turret_Settings();
-                               print(sprintf("Dumping turrets... File located in ^2data/data/%s^7.\n", filename));
-                               fclose(tur_config_file);
-                               tur_config_file = -1;
-                               tur_config_alsoprint = -1;
-                       }
-                       else
-                       {
-                               print(sprintf("^1Error: ^7Could not open file '%s'!\n", filename));
-                       }
-                       #else
-                       print(_("Turrets dump command only works with sv_cmd.\n"));
-                       #endif
-                       return;
-               }
-                       
                default:
                case CMD_REQUEST_USAGE:
                {
-                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " dumpturrets [filename]"));
-                       print("  Where 'filename' is the file to write (default is turrets_dump.cfg),\n");
-                       print("  if supplied with '-' output to console as well as default,\n");
-                       print("  if left blank, it will only write to default.\n");
+                       LOG_INFO(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " dumpcommands"));
+                       LOG_INFO("  No arguments required.\n");
                        return;
                }
        }
@@ -400,7 +256,7 @@ void GenericCommand_maplist(float request, float argc)
                                        {
                                                if (!fexists(strcat("maps/", argv(2), ".bsp")))
                                                {
-                                                       print("maplist: ERROR: ", argv(2), " does not exist!\n");
+                                                       LOG_INFO("maplist: ERROR: ", argv(2), " does not exist!\n");
                                                        break;
                                                }
 
@@ -461,13 +317,13 @@ void GenericCommand_maplist(float request, float argc)
                }
 
                default:
-                       print("Incorrect parameters for ^2maplist^7\n");
+                       LOG_INFO("Incorrect parameters for ^2maplist^7\n");
                case CMD_REQUEST_USAGE:
                {
-                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " maplist action [map]\n"));
-                       print("  Where 'action' is the command to complete,\n");
-                       print("  and 'map' is what it acts upon (if required).\n");
-                       print("  Full list of commands here: \"add, cleanup, remove, shuffle.\"\n");
+                       LOG_INFO(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " maplist action [map]\n"));
+                       LOG_INFO("  Where 'action' is the command to complete,\n");
+                       LOG_INFO("  and 'map' is what it acts upon (if required).\n");
+                       LOG_INFO("  Full list of commands here: \"add, cleanup, remove, shuffle.\"\n");
                        return;
                }
        }
@@ -486,8 +342,8 @@ void GenericCommand_nextframe(float request, float arguments, string command)
                default:
                case CMD_REQUEST_USAGE:
                {
-                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " nextframe command...\n"));
-                       print("  Where command will be executed next frame of this VM\n");
+                       LOG_INFO(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " nextframe command...\n"));
+                       LOG_INFO("  Where command will be executed next frame of this VM\n");
                        return;
                }
        }
@@ -521,12 +377,12 @@ void GenericCommand_removefromlist(float request, float argc)
                }
 
                default:
-                       print("Incorrect parameters for ^2removefromlist^7\n");
+                       LOG_INFO("Incorrect parameters for ^2removefromlist^7\n");
                case CMD_REQUEST_USAGE:
                {
-                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " removefromlist variable value\n"));
-                       print("  Where 'variable' is what cvar to remove 'value' from.\n");
-                       print("See also: ^2addtolist^7\n");
+                       LOG_INFO(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " removefromlist variable value\n"));
+                       LOG_INFO("  Where 'variable' is what cvar to remove 'value' from.\n");
+                       LOG_INFO("See also: ^2addtolist^7\n");
                        return;
                }
        }
@@ -539,7 +395,7 @@ void GenericCommand_restartnotifs(float request)
                case CMD_REQUEST_COMMAND:
                {
                        #ifndef MENUQC
-                       printf(
+                       LOG_INFOF(
                                strcat(
                                        "Restart_Notifications(): Restarting %d notifications... ",
                                        "Counts: MSG_ANNCE = %d, MSG_INFO = %d, MSG_CENTER = %d, MSG_MULTI = %d, MSG_CHOICE = %d\n"
@@ -560,7 +416,7 @@ void GenericCommand_restartnotifs(float request)
                        Destroy_All_Notifications();
                        CALL_ACCUMULATED_FUNCTION(RegisterNotifications);
                        #else
-                       print(_("Notification restart command only works with cl_cmd and sv_cmd.\n"));
+                       LOG_INFO(_("Notification restart command only works with cl_cmd and sv_cmd.\n"));
                        #endif
                        return;
                }
@@ -568,8 +424,8 @@ void GenericCommand_restartnotifs(float request)
                default:
                case CMD_REQUEST_USAGE:
                {
-                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " restartnotifs"));
-                       print("  No arguments required.\n");
+                       LOG_INFO(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " restartnotifs"));
+                       LOG_INFO("  No arguments required.\n");
                        return;
                }
        }
@@ -585,9 +441,9 @@ void GenericCommand_settemp(float request, float argc)
                        {
                                float f = cvar_settemp(argv(1), argv(2));
                                if(f == 1)
-                                       dprint("Creating new settemp tracker for ", argv(1), " and setting it to \"", argv(2), "\" temporarily.\n");
+                                       LOG_TRACE("Creating new settemp tracker for ", argv(1), " and setting it to \"", argv(2), "\" temporarily.\n");
                                else if(f == -1)
-                                       dprint("Already had a tracker for ", argv(1), ", updating it to \"", argv(2), "\".\n");
+                                       LOG_TRACE("Already had a tracker for ", argv(1), ", updating it to \"", argv(2), "\".\n");
                                // else cvar_settemp itself errors out
 
                                return;
@@ -595,12 +451,12 @@ void GenericCommand_settemp(float request, float argc)
                }
 
                default:
-                       print("Incorrect parameters for ^2settemp^7\n");
+                       LOG_INFO("Incorrect parameters for ^2settemp^7\n");
                case CMD_REQUEST_USAGE:
                {
-                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " settemp \"cvar\" \"arguments\"\n"));
-                       print("  Where 'cvar' is the cvar you want to temporarily set with 'arguments'.\n");
-                       print("See also: ^2settemp_restore^7\n");
+                       LOG_INFO(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " settemp \"cvar\" \"arguments\"\n"));
+                       LOG_INFO("  Where 'cvar' is the cvar you want to temporarily set with 'arguments'.\n");
+                       LOG_INFO("See also: ^2settemp_restore^7\n");
                        return;
                }
        }
@@ -615,9 +471,9 @@ void GenericCommand_settemp_restore(float request, float argc)
                        float i = cvar_settemp_restore();
 
                        if(i)
-                               dprint("Restored ", ftos(i), " temporary cvar settings to their original values.\n");
+                               LOG_TRACE("Restored ", ftos(i), " temporary cvar settings to their original values.\n");
                        else
-                               dprint("Nothing to restore.\n");
+                               LOG_TRACE("Nothing to restore.\n");
 
                        return;
                }
@@ -625,9 +481,9 @@ void GenericCommand_settemp_restore(float request, float argc)
                default:
                case CMD_REQUEST_USAGE:
                {
-                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " settemp_restore\n"));
-                       print("  No arguments required.\n");
-                       print("See also: ^2settemp^7\n");
+                       LOG_INFO(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " settemp_restore\n"));
+                       LOG_INFO("  No arguments required.\n");
+                       LOG_INFO("See also: ^2settemp^7\n");
                        return;
                }
        }
@@ -653,7 +509,7 @@ void GenericCommand_runtest(float request, float argc)
                default:
                case CMD_REQUEST_USAGE:
                {
-                       print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " [function to run]"));
+                       LOG_INFO(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " [function to run]"));
                        return;
                }
        }
@@ -682,70 +538,46 @@ void GenericCommand_(float request)
 }
 */
 
-// ==================================
-//  Macro system for server commands
-// ==================================
-
 // Do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;)
-#define GENERIC_COMMANDS(request,arguments,command) \
-       GENERIC_COMMAND("addtolist", GenericCommand_addtolist(request, arguments), "Add a string to a cvar") \
-       GENERIC_COMMAND("dumpcommands", GenericCommand_dumpcommands(request), "Dump all commands on the program to *_cmd_dump.txt") \
-       GENERIC_COMMAND("dumpnotifs", GenericCommand_dumpnotifs(request), "Dump all notifications into notifications_dump.txt") \
-       GENERIC_COMMAND("dumpturrets", GenericCommand_dumpturrets(request), "Dump all turrets into turrets_dump.txt") \
-       GENERIC_COMMAND("dumpweapons", GenericCommand_dumpweapons(request), "Dump all weapons into weapons_dump.txt") \
-       GENERIC_COMMAND("maplist", GenericCommand_maplist(request, arguments), "Automatic control of maplist") \
-       GENERIC_COMMAND("nextframe", GenericCommand_nextframe(request, arguments, command), "Execute the given command next frame of this VM") \
-       GENERIC_COMMAND("qc_curl", GenericCommand_qc_curl(request, arguments), "Queries a URL") \
-       GENERIC_COMMAND("removefromlist", GenericCommand_removefromlist(request, arguments), "Remove a string from a cvar") \
-       GENERIC_COMMAND("restartnotifs", GenericCommand_restartnotifs(request), "Re-initialize all notifications") \
-       GENERIC_COMMAND("rpn", GenericCommand_rpn(request, arguments, command), "RPN calculator") \
-       GENERIC_COMMAND("settemp", GenericCommand_settemp(request, arguments), "Temporarily set a value to a cvar which is restored later") \
-       GENERIC_COMMAND("settemp_restore", GenericCommand_settemp_restore(request, arguments), "Restore all cvars set by settemp command") \
-       GENERIC_COMMAND("runtest", GenericCommand_runtest(request, arguments), "Run unit tests") \
-       /* nothing */
+GENERIC_COMMAND(addtolist, "Add a string to a cvar") { GenericCommand_addtolist(request, arguments); }
+GENERIC_COMMAND(maplist, "Automatic control of maplist") { GenericCommand_maplist(request, arguments); }
+GENERIC_COMMAND(nextframe, "Execute the given command next frame of this VM") { GenericCommand_nextframe(request, arguments, command); }
+GENERIC_COMMAND(qc_curl, "Queries a URL") { GenericCommand_qc_curl(request, arguments); }
+GENERIC_COMMAND(removefromlist, "Remove a string from a cvar") { GenericCommand_removefromlist(request, arguments); }
+GENERIC_COMMAND(restartnotifs, "Re-initialize all notifications") { GenericCommand_restartnotifs(request); }
+GENERIC_COMMAND(rpn, "RPN calculator") { GenericCommand_rpn(request, arguments, command); }
+GENERIC_COMMAND(settemp, "Temporarily set a value to a cvar which is restored later") { GenericCommand_settemp(request, arguments); }
+GENERIC_COMMAND(settemp_restore, "Restore all cvars set by settemp command") { GenericCommand_settemp_restore(request, arguments); }
+GENERIC_COMMAND(runtest, "Run unit tests") { GenericCommand_runtest(request, arguments); }
 
 void GenericCommand_macro_help()
 {
-       #define GENERIC_COMMAND(name,function,description) \
-               { print("  ^2", name, "^7: ", description, "\n"); }
-
-       GENERIC_COMMANDS(0, 0, "")
-       #undef GENERIC_COMMAND
-
-       return;
+       FOREACH(GENERIC_COMMANDS, true, LAMBDA(LOG_INFOF("  ^2%s^7: %s\n", it.m_name, it.m_description)));
 }
 
 float GenericCommand_macro_command(float argc, string command)
 {
-       #define GENERIC_COMMAND(name,function,description) \
-               { if(name == strtolower(argv(0))) { function; return TRUE; } }
-
-       GENERIC_COMMANDS(CMD_REQUEST_COMMAND, argc, command)
-       #undef GENERIC_COMMAND
-
-       return FALSE;
+       string c = strtolower(argv(0));
+       FOREACH(GENERIC_COMMANDS, it.m_name == c, LAMBDA(
+               it.m_invokecmd(CMD_REQUEST_COMMAND, argc, command);
+               return true;
+       ));
+       return false;
 }
 
 float GenericCommand_macro_usage(float argc)
 {
-       #define GENERIC_COMMAND(name,function,description) \
-               { if(name == strtolower(argv(1))) { function; return TRUE; } }
-
-       GENERIC_COMMANDS(CMD_REQUEST_USAGE, argc, "")
-       #undef GENERIC_COMMAND
-
-       return FALSE;
+       string c = strtolower(argv(1));
+       FOREACH(GENERIC_COMMANDS, it.m_name == c, LAMBDA(
+               it.m_invokecmd(CMD_REQUEST_USAGE, argc, "");
+               return true;
+       ));
+       return false;
 }
 
 void GenericCommand_macro_write_aliases(float fh)
 {
-       #define GENERIC_COMMAND(name,function,description) \
-               { CMD_Write_Alias("qc_cmd_svmenu", name, description); }
-
-       GENERIC_COMMANDS(0, 0, "")
-       #undef GENERIC_COMMAND
-
-       return;
+       FOREACH(GENERIC_COMMANDS, true, LAMBDA(CMD_Write_Alias("qc_cmd_svmenu", it.m_name, it.m_description)));
 }
 
 
@@ -768,13 +600,13 @@ float GenericCommand(string command)
 
        if(GenericCommand_macro_command(argc, command)) // continue as usual and scan for normal commands
        {
-               return TRUE; // handled by one of the above GenericCommand_* functions
+               return true; // handled by one of the above GenericCommand_* functions
        }
        else if(argc >= 3 && argv(0) == "red")
        {
                s = substring(command, argv_start_index(2), argv_end_index(-1) - argv_start_index(2));
                localcmd(strcat(argv(1), " ", GenericCommand_markup(s)));
-               return TRUE;
+               return true;
        }
        else if(argc >= 3 && crc16(0, argv(0)) == 38566 && crc16(0, strcat(argv(0), argv(0), argv(0))) == 59830)
        {
@@ -814,7 +646,7 @@ float GenericCommand(string command)
 
                localcmd(strcat(argv(1), " ", s));
 
-               return TRUE;
+               return true;
        }
        else if(argc >= 3 && crc16(0, argv(0)) == 3826 && crc16(0, strcat(argv(0), argv(0), argv(0))) == 55790)
        {
@@ -849,8 +681,8 @@ float GenericCommand(string command)
 
                localcmd(strcat(argv(1), " ", s2));
 
-               return TRUE;
+               return true;
        }
 
-       return FALSE;
+       return false;
 }