]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/command/banning.qc
Merge branch 'master' into Mario/qc_updates
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / command / banning.qc
index 2fbdd27a050ffbbb6eeec2287ae19cf11b89d3fe..9091ae0b783b65953aa4abef156b4e3203ce8040 100644 (file)
@@ -1,3 +1,14 @@
+#if defined(CSQC)
+#elif defined(MENUQC)
+#elif defined(SVQC)
+       #include "../../dpdefs/dpextensions.qh"
+    #include "../../common/util.qh"
+    #include "../../common/command/shared_defs.qh"
+    #include "../autocvars.qh"
+    #include "common.qh"
+    #include "banning.qh"
+    #include "../ipban.qh"
+#endif
 // =====================================================
 //  Banning and kicking command code, written by Samual
 //  Last updated: December 29th, 2011
@@ -14,9 +25,9 @@ void BanCommand_ban(float request, float argc, string command)
                                string ip = argv(1);
                                float reason_arg, bantime;
                                string reason;
-                               
-                               reason_arg = 2; 
-                               
+
+                               reason_arg = 2;
+
                                GET_BAN_ARG(bantime, autocvar_g_ban_default_bantime);
                                GET_BAN_REASON(reason, "No reason provided");
 
@@ -24,7 +35,7 @@ void BanCommand_ban(float request, float argc, string command)
                                return;
                        }
                }
-                       
+
                default:
                        print("Incorrect parameters for ^2ban^7\n");
                case CMD_REQUEST_USAGE:
@@ -48,7 +59,7 @@ void BanCommand_banlist(float request)
                        Ban_View();
                        return;
                }
-                       
+
                default:
                case CMD_REQUEST_USAGE:
                {
@@ -69,29 +80,29 @@ void BanCommand_kickban(float request, float argc, string command)
                        if(argc >= 2)
                        {
                                entity client = GetIndexedEntity(argc, 1);
-                               float accepted = VerifyClientEntity(client, TRUE, FALSE);
+                               float accepted = VerifyKickableEntity(client);
                                float reason_arg, bantime, masksize;
                                string reason;
-                               
-                               if(accepted > 0) 
+
+                               if(accepted > 0)
                                {
-                                       reason_arg = next_token; 
+                                       reason_arg = next_token;
 
                                        GET_BAN_ARG(bantime, autocvar_g_ban_default_bantime);
                                        GET_BAN_ARG(masksize, autocvar_g_ban_default_masksize);
                                        GET_BAN_REASON(reason, "No reason provided");
 
                                        Ban_KickBanClient(client, bantime, masksize, reason);
-                                       
+
                                        return;
                                }
                                else
                                {
-                                       print("kickban: ", GetClientErrorString(accepted, argv(1)), ".\n"); 
+                                       print("kickban: ", GetClientErrorString(accepted, argv(1)), ".\n");
                                }
                        }
                }
-                       
+
                default:
                        print("Incorrect parameters for ^2kickban^7\n");
                case CMD_REQUEST_USAGE:
@@ -107,6 +118,41 @@ void BanCommand_kickban(float request, float argc, string command)
        }
 }
 
+void BanCommand_mute(float request, float argc, string command) // TODO: Add a sort of mute-"ban" which allows players to be muted based on IP/cryptokey
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argc >= 2)
+                       {
+                               entity client = GetFilteredEntity(argv(1));
+                               float accepted = VerifyClientEntity(client, true, false);
+
+                               if(accepted > 0)
+                               {
+                                       client.muted = true;
+                                       return;
+                               }
+                               else
+                               {
+                                       print("mute: ", GetClientErrorString(accepted, argv(1)), ".\n");
+                               }
+                       }
+               }
+
+               default:
+                       print("Incorrect parameters for ^2mute^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd mute client\n");
+                       print("  'client' is the entity number or name of the player to mute.\n");
+                       print("See also: ^2unmute^7\n");
+                       return;
+               }
+       }
+}
+
 void BanCommand_unban(float request, float argc)
 {
        switch(request)
@@ -115,11 +161,40 @@ void BanCommand_unban(float request, float argc)
                {
                        if(argv(1))
                        {
-                               Ban_Delete(stof(argv(1)));
-                               return;
+                               float tmp_number = -1;
+                               string tmp_string;
+
+                               if(substring(argv(1), 0, 1) == "#")
+                               {
+                                       tmp_string = substring(argv(1), 1, -1);
+
+                                       if(tmp_string != "") // is it all one token? like #1
+                                       {
+                                               tmp_number = stof(tmp_string);
+                                       }
+                                       else if(argc > 2) // no, it's two tokens? # 1
+                                       {
+                                               tmp_number = stof(argv(2));
+                                       }
+                                       else
+                                               tmp_number = -1;
+                               }
+                               else // maybe it's ONLY a number?
+                               {
+                                       tmp_number = stof(argv(1));
+
+                                       if((tmp_number == 0) && (argv(1) != "0"))
+                                               { tmp_number = -1; }
+                               }
+
+                               if(tmp_number >= 0)
+                               {
+                                       Ban_Delete(tmp_number);
+                                       return;
+                               }
                        }
                }
-                       
+
                default:
                case CMD_REQUEST_USAGE:
                {
@@ -131,6 +206,41 @@ void BanCommand_unban(float request, float argc)
        }
 }
 
+void BanCommand_unmute(float request, float argc)
+{
+       switch(request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if(argc >= 2)
+                       {
+                               entity client = GetFilteredEntity(argv(1));
+                               float accepted = VerifyClientEntity(client, true, false);
+
+                               if(accepted > 0)
+                               {
+                                       client.muted = false;
+                                       return;
+                               }
+                               else
+                               {
+                                       print("unmute: ", GetClientErrorString(accepted, argv(1)), ".\n");
+                               }
+                       }
+               }
+
+               default:
+                       print("Incorrect parameters for ^2mute^7\n");
+               case CMD_REQUEST_USAGE:
+               {
+                       print("\nUsage:^3 sv_cmd unmute client\n");
+                       print("  'client' is the entity number or name of the player to unmute.\n");
+                       print("See also: ^2mute^7\n");
+                       return;
+               }
+       }
+}
+
 /* use this when creating a new command, making sure to place it in alphabetical order... also,
 ** ADD ALL NEW COMMANDS TO commands.cfg WITH PROPER ALIASES IN THE SAME FASHION!
 void BanCommand_(float request)
@@ -139,10 +249,10 @@ void BanCommand_(float request)
        {
                case CMD_REQUEST_COMMAND:
                {
-                       
+
                        return;
                }
-                       
+
                default:
                case CMD_REQUEST_USAGE:
                {
@@ -164,66 +274,68 @@ void BanCommand_(float request)
        BAN_COMMAND("ban", BanCommand_ban(request, arguments, command), "Ban an IP address or a range of addresses (like 1.2.3)") \
        BAN_COMMAND("banlist", BanCommand_banlist(request), "List all existing bans") \
        BAN_COMMAND("kickban", BanCommand_kickban(request, arguments, command), "Disconnect a client and ban it at the same time") \
+       BAN_COMMAND("mute", BanCommand_mute(request, arguments, command), "Disallow a client from talking by muting them") \
        BAN_COMMAND("unban", BanCommand_unban(request, arguments), "Remove an existing ban") \
+       BAN_COMMAND("unmute", BanCommand_unmute(request, arguments), "Unmute a client") \
        /* nothing */
 
 void BanCommand_macro_help()
 {
        #define BAN_COMMAND(name,function,description) \
-               { print("  ^2", name, "^7: ", description, "\n"); }
-               
-       BAN_COMMANDS(0, 0, "")
+               { if(strtolower(description) != "") { print("  ^2", name, "^7: ", description, "\n"); } }
+
+       BAN_COMMANDS(0, 0, "");
        #undef BAN_COMMAND
-       
+
        return;
 }
 
 float BanCommand_macro_command(float argc, string command)
 {
        #define BAN_COMMAND(name,function,description) \
-               { if(name == strtolower(argv(0))) { function; return TRUE; } }
-               
-       BAN_COMMANDS(CMD_REQUEST_COMMAND, argc, command)
+               { if(name == strtolower(argv(0))) { function; return true; } }
+
+       BAN_COMMANDS(CMD_REQUEST_COMMAND, argc, command);
        #undef BAN_COMMAND
-       
-       return FALSE;
+
+       return false;
 }
 
 float BanCommand_macro_usage(float argc)
 {
        #define BAN_COMMAND(name,function,description) \
-               { if(name == strtolower(argv(1))) { function; return TRUE; } }
-               
-       BAN_COMMANDS(CMD_REQUEST_USAGE, argc, "")
+               { if(name == strtolower(argv(1))) { function; return true; } }
+
+       BAN_COMMANDS(CMD_REQUEST_USAGE, argc, "");
        #undef BAN_COMMAND
-       
-       return FALSE;
+
+       return false;
 }
 
 void BanCommand_macro_write_aliases(float fh)
 {
        #define BAN_COMMAND(name,function,description) \
-               { CMD_Write_Alias("qc_cmd_sv", name, description); }
-       
-       BAN_COMMANDS(0, 0, "")
+               { if(strtolower(description) != "") { CMD_Write_Alias("qc_cmd_sv", name, description); } }
+
+       BAN_COMMANDS(0, 0, "");
        #undef BAN_COMMAND
-       
+
        return;
 }
 
 float BanCommand(string command)
 {
        float argc = tokenize_console(command);
-       
+
        // Guide for working with argc arguments by example:
        // argc:   1    - 2      - 3     - 4
-       // argv:   0    - 1      - 2     - 3 
+       // argv:   0    - 1      - 2     - 3
        // cmd     vote - master - login - password
 
        if(BanCommand_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
        }
-       
-       return FALSE;
-}
\ No newline at end of file
+
+       return false;
+}