1 #include "../../common/command/command.qh"
7 #include "../cl_player.qh"
10 #include "../../common/util.qh"
12 // =====================================================
13 // Banning and kicking command code, written by Samual
14 // Last updated: December 29th, 2011
15 // =====================================================
17 void BanCommand_ban(float request, float argc, string command)
21 case CMD_REQUEST_COMMAND:
26 float reason_arg, bantime;
31 GET_BAN_ARG(bantime, autocvar_g_ban_default_bantime);
32 GET_BAN_REASON(reason, "No reason provided");
34 Ban_Insert(ip, bantime, reason, 1);
40 print("Incorrect parameters for ^2ban^7\n");
41 case CMD_REQUEST_USAGE:
43 print("\nUsage:^3 sv_cmd ban address [bantime] [reason]\n");
44 print(" 'address' is the IP address or range of the player to ban,\n");
45 print(" 'bantime' is the amount of time that the ban is active (default if not provided),\n");
46 print(" and 'reason' is the string to label the ban with as reason for banning.\n");
47 print("See also: ^2banlist, kickban, unban^7\n");
53 void BanCommand_banlist(float request)
57 case CMD_REQUEST_COMMAND:
64 case CMD_REQUEST_USAGE:
66 print("\nUsage:^3 sv_cmd banlist\n");
67 print(" No arguments required.\n");
68 print("See also: ^2ban, kickban, unban^7\n");
74 void BanCommand_kickban(float request, float argc, string command)
78 case CMD_REQUEST_COMMAND:
82 entity client = GetIndexedEntity(argc, 1);
83 float accepted = VerifyKickableEntity(client);
84 float reason_arg, bantime, masksize;
89 reason_arg = next_token;
91 GET_BAN_ARG(bantime, autocvar_g_ban_default_bantime);
92 GET_BAN_ARG(masksize, autocvar_g_ban_default_masksize);
93 GET_BAN_REASON(reason, "No reason provided");
95 Ban_KickBanClient(client, bantime, masksize, reason);
101 print("kickban: ", GetClientErrorString(accepted, argv(1)), ".\n");
107 print("Incorrect parameters for ^2kickban^7\n");
108 case CMD_REQUEST_USAGE:
110 print("\nUsage:^3 sv_cmd kickban client [bantime] [masksize] [reason]\n");
111 print(" 'client' is the entity number or name of the player to ban,\n");
112 print(" 'bantime' is the amount of time that the ban is active (default if not provided),\n");
113 print(" 'masksize' is the range of the IP address (1-thru-4, default if not provided),\n");
114 print(" and 'reason' is the string to label the ban with as reason for banning.\n");
115 print("See also: ^2ban, banlist, unban^7\n");
121 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
125 case CMD_REQUEST_COMMAND:
129 entity client = GetFilteredEntity(argv(1));
130 float accepted = VerifyClientEntity(client, true, false);
139 print("mute: ", GetClientErrorString(accepted, argv(1)), ".\n");
145 print("Incorrect parameters for ^2mute^7\n");
146 case CMD_REQUEST_USAGE:
148 print("\nUsage:^3 sv_cmd mute client\n");
149 print(" 'client' is the entity number or name of the player to mute.\n");
150 print("See also: ^2unmute^7\n");
156 void BanCommand_unban(float request, float argc)
160 case CMD_REQUEST_COMMAND:
164 float tmp_number = -1;
167 if(substring(argv(1), 0, 1) == "#")
169 tmp_string = substring(argv(1), 1, -1);
171 if(tmp_string != "") // is it all one token? like #1
173 tmp_number = stof(tmp_string);
175 else if(argc > 2) // no, it's two tokens? # 1
177 tmp_number = stof(argv(2));
182 else // maybe it's ONLY a number?
184 tmp_number = stof(argv(1));
186 if((tmp_number == 0) && (argv(1) != "0"))
192 Ban_Delete(tmp_number);
199 case CMD_REQUEST_USAGE:
201 print("\nUsage:^3 sv_cmd unban banid\n");
202 print(" Where 'banid' is the ID of the ban of which to remove.\n");
203 print("See also: ^2ban, banlist, kickban^7\n");
209 void BanCommand_unmute(float request, float argc)
213 case CMD_REQUEST_COMMAND:
217 entity client = GetFilteredEntity(argv(1));
218 float accepted = VerifyClientEntity(client, true, false);
222 client.muted = false;
227 print("unmute: ", GetClientErrorString(accepted, argv(1)), ".\n");
233 print("Incorrect parameters for ^2mute^7\n");
234 case CMD_REQUEST_USAGE:
236 print("\nUsage:^3 sv_cmd unmute client\n");
237 print(" 'client' is the entity number or name of the player to unmute.\n");
238 print("See also: ^2mute^7\n");
244 /* use this when creating a new command, making sure to place it in alphabetical order... also,
245 ** ADD ALL NEW COMMANDS TO commands.cfg WITH PROPER ALIASES IN THE SAME FASHION!
246 void BanCommand_(float request)
250 case CMD_REQUEST_COMMAND:
257 case CMD_REQUEST_USAGE:
259 print("\nUsage:^3 sv_cmd \n");
260 print(" No arguments required.\n");
268 // ==================================
269 // Macro system for server commands
270 // ==================================
272 // Do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;)
273 #define BAN_COMMANDS(request,arguments,command) \
274 BAN_COMMAND("ban", BanCommand_ban(request, arguments, command), "Ban an IP address or a range of addresses (like 1.2.3)") \
275 BAN_COMMAND("banlist", BanCommand_banlist(request), "List all existing bans") \
276 BAN_COMMAND("kickban", BanCommand_kickban(request, arguments, command), "Disconnect a client and ban it at the same time") \
277 BAN_COMMAND("mute", BanCommand_mute(request, arguments, command), "Disallow a client from talking by muting them") \
278 BAN_COMMAND("unban", BanCommand_unban(request, arguments), "Remove an existing ban") \
279 BAN_COMMAND("unmute", BanCommand_unmute(request, arguments), "Unmute a client") \
282 void BanCommand_macro_help()
284 #define BAN_COMMAND(name,function,description) \
285 { if(strtolower(description) != "") { print(" ^2", name, "^7: ", description, "\n"); } }
287 BAN_COMMANDS(0, 0, "");
293 float BanCommand_macro_command(float argc, string command)
295 #define BAN_COMMAND(name,function,description) \
296 { if(name == strtolower(argv(0))) { function; return true; } }
298 BAN_COMMANDS(CMD_REQUEST_COMMAND, argc, command);
304 float BanCommand_macro_usage(float argc)
306 #define BAN_COMMAND(name,function,description) \
307 { if(name == strtolower(argv(1))) { function; return true; } }
309 BAN_COMMANDS(CMD_REQUEST_USAGE, argc, "");
315 void BanCommand_macro_write_aliases(float fh)
317 #define BAN_COMMAND(name,function,description) \
318 { if(strtolower(description) != "") { CMD_Write_Alias("qc_cmd_sv", name, description); } }
320 BAN_COMMANDS(0, 0, "");
326 float BanCommand(string command)
328 float argc = tokenize_console(command);
330 // Guide for working with argc arguments by example:
331 // argc: 1 - 2 - 3 - 4
332 // argv: 0 - 1 - 2 - 3
333 // cmd vote - master - login - password
335 if(BanCommand_macro_command(argc, command)) // continue as usual and scan for normal commands
337 return true; // handled by one of the above GenericCommand_* functions