]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/command/banning.qc
Merge branch 'LegendaryGuard/avoid_spam_map_custom_fields' into 'master'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / command / banning.qc
index a73b09646f983467c7d5efa59d1ebc7896db5d1b..52c7e9c431d9ce75872fb8695d28a85636b8675d 100644 (file)
@@ -119,7 +119,7 @@ void BanCommand_kickban(int request, int argc, string command)
        }
 }
 
-void BanCommand_mute(int request, int argc, string command)  // TODO: Add a sort of mute-"ban" which allows players to be muted based on IP/cryptokey
+void BanCommand_mute(int request, int argc, string command)
 {
        switch (request)
        {
@@ -127,12 +127,20 @@ void BanCommand_mute(int request, int argc, string command)  // TODO: Add a sort
                {
                        if (argc >= 2)
                        {
-                               entity client = GetFilteredEntity(argv(1));
+                               entity client = GetIndexedEntity(argc, 1);
                                float accepted = VerifyClientEntity(client, true, false);
 
                                if (accepted > 0)
                                {
+                                       string theid = "";
+                                       if(!PlayerInIPList(client, autocvar_g_muteban_list))
+                                               theid = cons(theid, client.netaddress);
+                                       if(!PlayerInIDList(client, autocvar_g_muteban_list))
+                                               theid = cons(theid, client.crypto_idfp);
                                        CS(client).muted = true;
+                                       LOG_INFO(strcat("Mute-banning player ", GetCallerName(client), " (", argv(1), ")."));
+                                       cvar_set("g_muteban_list", cons(autocvar_g_muteban_list, theid));
+
                                        return;
                                }
                                else
@@ -148,7 +156,51 @@ void BanCommand_mute(int request, int argc, string command)  // TODO: Add a sort
                {
                        LOG_HELP("Usage:^3 sv_cmd mute <client>");
                        LOG_HELP("  <client> is the entity number or name of the player to mute.");
-                       LOG_HELP("See also: ^2unmute^7");
+                       LOG_HELP("See also: ^2unmute, g_muteban_list^7");
+                       return;
+               }
+       }
+}
+
+void BanCommand_playban(int request, int argc, string command)
+{
+       switch (request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if (argc >= 2)
+                       {
+                               entity client = GetIndexedEntity(argc, 1);
+                               float accepted = VerifyClientEntity(client, true, false);
+
+                               if (accepted > 0)
+                               {
+                                       string theid = "";
+                                       if(!PlayerInIPList(client, autocvar_g_playban_list))
+                                               theid = cons(theid, client.netaddress);
+                                       if(!PlayerInIDList(client, autocvar_g_playban_list))
+                                               theid = cons(theid, client.crypto_idfp);
+
+                                       LOG_INFO(strcat("Play-banning player ", GetCallerName(client), " (", argv(1), ")."));
+                                       PutObserverInServer(client, true, true);
+                                       cvar_set("g_playban_list", cons(autocvar_g_playban_list, theid));
+
+                                       return;
+                               }
+                               else
+                               {
+                                       LOG_INFO("playban: ", GetClientErrorString(accepted, argv(1)), ".");
+                               }
+                       }
+               }
+
+               default:
+                       LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0));
+               case CMD_REQUEST_USAGE:
+               {
+                       LOG_HELP("Usage:^3 sv_cmd playban <client>");
+                       LOG_HELP("  <client> is the entity number or name of the player to ban being forced to spectate permanently,");
+                       LOG_HELP("See also: ^2g_playban_list, unplayban^7");
                        return;
                }
        }
@@ -208,12 +260,24 @@ void BanCommand_unmute(int request, int argc)
                {
                        if (argc >= 2)
                        {
-                               entity client = GetFilteredEntity(argv(1));
+                               entity client = GetIndexedEntity(argc, 1);
                                float accepted = VerifyClientEntity(client, true, false);
+                               string original_arg = argv(1);
 
                                if (accepted > 0)
                                {
+                                       string tmp_string = "";
+                                       FOREACH_WORD(autocvar_g_muteban_list, it != client.netaddress,
+                                       {
+                                               if(client.crypto_idfp && it == substring(client.crypto_idfp, 0, strlen(it)))
+                                                       continue;
+                                               tmp_string = cons(tmp_string, it);
+                                       });
+
+                                       cvar_set("g_muteban_list", tmp_string);
+                                       LOG_INFO(strcat("Unmuting player ", GetCallerName(client), " (", original_arg, ")."));
                                        CS(client).muted = false;
+
                                        return;
                                }
                                else
@@ -229,7 +293,140 @@ void BanCommand_unmute(int request, int argc)
                {
                        LOG_HELP("Usage:^3 sv_cmd unmute <client>");
                        LOG_HELP("  <client> is the entity number or name of the player to unmute.");
-                       LOG_HELP("See also: ^2mute^7");
+                       LOG_HELP("See also: ^2mute, g_muteban_list^7");
+                       return;
+               }
+       }
+}
+
+void BanCommand_unplayban(int request, int argc)
+{
+       switch (request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if (argv(1))
+                       {
+                               entity client = GetIndexedEntity(argc, 1);
+                               float accepted = VerifyClientEntity(client, true, false);
+                               string original_arg = argv(1);
+
+                               if (accepted > 0)
+                               {
+                                       string tmp_string = "";
+                                       FOREACH_WORD(autocvar_g_playban_list, it != client.netaddress,
+                                       {
+                                               if(client.crypto_idfp && it == substring(client.crypto_idfp, 0, strlen(it)))
+                                                       continue;
+                                               tmp_string = cons(tmp_string, it);
+                                       });
+
+                                       cvar_set("g_playban_list", tmp_string);
+                                       LOG_INFO(strcat("Releasing forced to spectate player ", GetCallerName(client), " (", original_arg, ")."));
+
+                                       return;
+                               }
+                               else
+                               {
+                                       LOG_INFO("unplayban: ", GetClientErrorString(accepted, argv(1)), ".");
+                               }
+                       }
+               }
+
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       LOG_HELP("Usage:^3 sv_cmd unplayban <banid>");
+                       LOG_HELP("  Where <banid> is the ID of the forced to spectate ban of which to remove.");
+                       LOG_HELP("See also: ^2playban, g_playban_list^7");
+                       return;
+               }
+       }
+}
+
+void BanCommand_unvoteban(int request, int argc)
+{
+       switch (request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if (argv(1))
+                       {
+                               entity client = GetIndexedEntity(argc, 1);
+                               float accepted = VerifyClientEntity(client, true, false);
+                               string original_arg = argv(1);
+
+                               if (accepted > 0)
+                               {
+                                       string tmp_string = "";
+                                       FOREACH_WORD(autocvar_g_voteban_list, it != client.netaddress,
+                                       {
+                                               if(client.crypto_idfp && it == substring(client.crypto_idfp, 0, strlen(it)))
+                                                       continue;
+                                               tmp_string = cons(tmp_string, it);
+                                       });
+
+                                       cvar_set("g_voteban_list", tmp_string);
+                                       LOG_INFO(strcat("Unvote-banning player ", GetCallerName(client), " (", original_arg, ")."));
+
+                                       return;
+                               }
+                               else
+                               {
+                                       LOG_INFO("unvoteban: ", GetClientErrorString(accepted, argv(1)), ".");
+                               }
+                       }
+               }
+
+               default:
+               case CMD_REQUEST_USAGE:
+               {
+                       LOG_HELP("Usage:^3 sv_cmd unvoteban <banid>");
+                       LOG_HELP("  Where <banid> is the ID of the ban from voting of which to remove.");
+                       LOG_HELP("See also: ^2voteban, g_voteban_list^7");
+                       return;
+               }
+       }
+}
+
+void BanCommand_voteban(int request, int argc, string command)
+{
+       switch (request)
+       {
+               case CMD_REQUEST_COMMAND:
+               {
+                       if (argc >= 2)
+                       {
+                               entity client = GetIndexedEntity(argc, 1);
+                               float accepted = VerifyClientEntity(client, true, false);
+
+                               if (accepted > 0)
+                               {
+                                       string theid = "";
+                                       if(!PlayerInIPList(client, autocvar_g_voteban_list))
+                                               theid = cons(theid, client.netaddress);
+                                       if(!PlayerInIDList(client, autocvar_g_voteban_list))
+                                               theid = cons(theid, client.crypto_idfp);
+
+                                       LOG_INFO(strcat("Vote-banning player ", GetCallerName(client), " (", argv(1), ")."));
+                                       cvar_set("g_voteban_list", cons(autocvar_g_voteban_list, theid));
+
+                                       return;
+                               }
+                               else
+                               {
+                                       LOG_INFO("voteban: ", GetClientErrorString(accepted, argv(1)), ".");
+                               }
+                       }
+               }
+
+               default:
+                       LOG_INFOF("Incorrect parameters for ^2%s^7", argv(0));
+               case CMD_REQUEST_USAGE:
+               {
+                       LOG_HELP("Usage:^3 sv_cmd voteban <client>");
+                       LOG_HELP("  <client> is the entity number or name of the player to ban from voting,");
+                       LOG_HELP("See also: ^2g_voteban_list, unvoteban^7");
                        return;
                }
        }
@@ -269,8 +466,12 @@ void BanCommand_(int request)
        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("playban", BanCommand_playban(request, arguments, command), "Force to spectate a client permanently") \
        BAN_COMMAND("unban", BanCommand_unban(request, arguments), "Remove an existing ban") \
        BAN_COMMAND("unmute", BanCommand_unmute(request, arguments), "Unmute a client") \
+       BAN_COMMAND("unvoteban", BanCommand_unvoteban(request, arguments), "Remove an existing voting ban") \
+       BAN_COMMAND("unplayban", BanCommand_unplayban(request, arguments), "Remove an existing forced to spectate ban") \
+       BAN_COMMAND("voteban", BanCommand_voteban(request, arguments, command), "Disallow a client from voting") \
        /* nothing */
 
 void BanCommand_macro_help()