]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/command/banning.qc
Header police
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / command / banning.qc
1 #include "banning.qh"
2 #include <common/command/command.qh>
3 #include "banning.qh"
4
5 #include "common.qh"
6
7 #include "../cl_player.qh"
8 #include "../ipban.qh"
9
10 #include <common/util.qh>
11
12 // =====================================================
13 //  Banning and kicking command code, written by Samual
14 //  Last updated: December 29th, 2011
15 // =====================================================
16
17 void BanCommand_ban(float request, float argc, string command)
18 {
19         switch (request)
20         {
21                 case CMD_REQUEST_COMMAND:
22                 {
23                         if (argc >= 2)
24                         {
25                                 string ip = argv(1);
26                                 float reason_arg, bantime;
27                                 string reason;
28
29                                 reason_arg = 2;
30
31                                 GET_BAN_ARG(bantime, autocvar_g_ban_default_bantime);
32                                 GET_BAN_REASON(reason, "No reason provided");
33
34                                 Ban_Insert(ip, bantime, reason, 1);
35                                 return;
36                         }
37                 }
38
39                 default:
40                         LOG_INFO("Incorrect parameters for ^2ban^7\n");
41                 case CMD_REQUEST_USAGE:
42                 {
43                         LOG_INFO("\nUsage:^3 sv_cmd ban address [bantime] [reason]\n");
44                         LOG_INFO("  'address' is the IP address or range of the player to ban,\n");
45                         LOG_INFO("  'bantime' is the amount of time that the ban is active (default if not provided),\n");
46                         LOG_INFO("  and 'reason' is the string to label the ban with as reason for banning.\n");
47                         LOG_INFO("See also: ^2banlist, kickban, unban^7\n");
48                         return;
49                 }
50         }
51 }
52
53 void BanCommand_banlist(float request)
54 {
55         switch (request)
56         {
57                 case CMD_REQUEST_COMMAND:
58                 {
59                         Ban_View();
60                         return;
61                 }
62
63                 default:
64                 case CMD_REQUEST_USAGE:
65                 {
66                         LOG_INFO("\nUsage:^3 sv_cmd banlist\n");
67                         LOG_INFO("  No arguments required.\n");
68                         LOG_INFO("See also: ^2ban, kickban, unban^7\n");
69                         return;
70                 }
71         }
72 }
73
74 void BanCommand_kickban(float request, float argc, string command)
75 {
76         switch (request)
77         {
78                 case CMD_REQUEST_COMMAND:
79                 {
80                         if (argc >= 2)
81                         {
82                                 entity client = GetIndexedEntity(argc, 1);
83                                 float accepted = VerifyKickableEntity(client);
84                                 float reason_arg, bantime, masksize;
85                                 string reason;
86
87                                 if (accepted > 0)
88                                 {
89                                         reason_arg = next_token;
90
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");
94
95                                         Ban_KickBanClient(client, bantime, masksize, reason);
96
97                                         return;
98                                 }
99                                 else
100                                 {
101                                         LOG_INFO("kickban: ", GetClientErrorString(accepted, argv(1)), ".\n");
102                                 }
103                         }
104                 }
105
106                 default:
107                         LOG_INFO("Incorrect parameters for ^2kickban^7\n");
108                 case CMD_REQUEST_USAGE:
109                 {
110                         LOG_INFO("\nUsage:^3 sv_cmd kickban client [bantime] [masksize] [reason]\n");
111                         LOG_INFO("  'client' is the entity number or name of the player to ban,\n");
112                         LOG_INFO("  'bantime' is the amount of time that the ban is active (default if not provided),\n");
113                         LOG_INFO("  'masksize' is the range of the IP address (1-thru-4, default if not provided),\n");
114                         LOG_INFO("  and 'reason' is the string to label the ban with as reason for banning.\n");
115                         LOG_INFO("See also: ^2ban, banlist, unban^7\n");
116                         return;
117                 }
118         }
119 }
120
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
122 {
123         switch (request)
124         {
125                 case CMD_REQUEST_COMMAND:
126                 {
127                         if (argc >= 2)
128                         {
129                                 entity client = GetFilteredEntity(argv(1));
130                                 float accepted = VerifyClientEntity(client, true, false);
131
132                                 if (accepted > 0)
133                                 {
134                                         client.muted = true;
135                                         return;
136                                 }
137                                 else
138                                 {
139                                         LOG_INFO("mute: ", GetClientErrorString(accepted, argv(1)), ".\n");
140                                 }
141                         }
142                 }
143
144                 default:
145                         LOG_INFO("Incorrect parameters for ^2mute^7\n");
146                 case CMD_REQUEST_USAGE:
147                 {
148                         LOG_INFO("\nUsage:^3 sv_cmd mute client\n");
149                         LOG_INFO("  'client' is the entity number or name of the player to mute.\n");
150                         LOG_INFO("See also: ^2unmute^7\n");
151                         return;
152                 }
153         }
154 }
155
156 void BanCommand_unban(float request, float argc)
157 {
158         switch (request)
159         {
160                 case CMD_REQUEST_COMMAND:
161                 {
162                         if (argv(1))
163                         {
164                                 float tmp_number = -1;
165                                 string tmp_string;
166
167                                 if (substring(argv(1), 0, 1) == "#")
168                                 {
169                                         tmp_string = substring(argv(1), 1, -1);
170
171                                         if (tmp_string != "") // is it all one token? like #1
172                                                 tmp_number = stof(tmp_string);
173                                         else if (argc > 2)    // no, it's two tokens? # 1
174                                                 tmp_number = stof(argv(2));
175                                         else tmp_number = -1;
176                                 }
177                                 else  // maybe it's ONLY a number?
178                                 {
179                                         tmp_number = stof(argv(1));
180
181                                         if ((tmp_number == 0) && (argv(1) != "0")) tmp_number = -1; }
182
183                                 if (tmp_number >= 0)
184                                 {
185                                         Ban_Delete(tmp_number);
186                                         return;
187                                 }
188                         }
189                 }
190
191                 default:
192                 case CMD_REQUEST_USAGE:
193                 {
194                         LOG_INFO("\nUsage:^3 sv_cmd unban banid\n");
195                         LOG_INFO("  Where 'banid' is the ID of the ban of which to remove.\n");
196                         LOG_INFO("See also: ^2ban, banlist, kickban^7\n");
197                         return;
198                 }
199         }
200 }
201
202 void BanCommand_unmute(float request, float argc)
203 {
204         switch (request)
205         {
206                 case CMD_REQUEST_COMMAND:
207                 {
208                         if (argc >= 2)
209                         {
210                                 entity client = GetFilteredEntity(argv(1));
211                                 float accepted = VerifyClientEntity(client, true, false);
212
213                                 if (accepted > 0)
214                                 {
215                                         client.muted = false;
216                                         return;
217                                 }
218                                 else
219                                 {
220                                         LOG_INFO("unmute: ", GetClientErrorString(accepted, argv(1)), ".\n");
221                                 }
222                         }
223                 }
224
225                 default:
226                         LOG_INFO("Incorrect parameters for ^2mute^7\n");
227                 case CMD_REQUEST_USAGE:
228                 {
229                         LOG_INFO("\nUsage:^3 sv_cmd unmute client\n");
230                         LOG_INFO("  'client' is the entity number or name of the player to unmute.\n");
231                         LOG_INFO("See also: ^2mute^7\n");
232                         return;
233                 }
234         }
235 }
236
237 /* use this when creating a new command, making sure to place it in alphabetical order... also,
238 ** ADD ALL NEW COMMANDS TO commands.cfg WITH PROPER ALIASES IN THE SAME FASHION!
239 void BanCommand_(float request)
240 {
241     switch(request)
242     {
243         case CMD_REQUEST_COMMAND:
244         {
245
246             return;
247         }
248
249         default:
250         case CMD_REQUEST_USAGE:
251         {
252             print("\nUsage:^3 sv_cmd \n");
253             print("  No arguments required.\n");
254             return;
255         }
256     }
257 }
258 */
259
260
261 // ==================================
262 //  Macro system for server commands
263 // ==================================
264
265 // Do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;)
266 #define BAN_COMMANDS(request, arguments, command) \
267         BAN_COMMAND("ban", BanCommand_ban(request, arguments, command), "Ban an IP address or a range of addresses (like 1.2.3)") \
268         BAN_COMMAND("banlist", BanCommand_banlist(request), "List all existing bans") \
269         BAN_COMMAND("kickban", BanCommand_kickban(request, arguments, command), "Disconnect a client and ban it at the same time") \
270         BAN_COMMAND("mute", BanCommand_mute(request, arguments, command), "Disallow a client from talking by muting them") \
271         BAN_COMMAND("unban", BanCommand_unban(request, arguments), "Remove an existing ban") \
272         BAN_COMMAND("unmute", BanCommand_unmute(request, arguments), "Unmute a client") \
273         /* nothing */
274
275 void BanCommand_macro_help()
276 {
277         #define BAN_COMMAND(name, function, description) \
278                 { if (strtolower(description) != "") { LOG_INFO("  ^2", name, "^7: ", description, "\n"); } }
279
280         BAN_COMMANDS(0, 0, "");
281 #undef BAN_COMMAND
282 }
283
284 float BanCommand_macro_command(float argc, string command)
285 {
286         #define BAN_COMMAND(name, function, description) \
287                 { if (name == strtolower(argv(0))) { function; return true; } }
288
289         BAN_COMMANDS(CMD_REQUEST_COMMAND, argc, command);
290 #undef BAN_COMMAND
291
292         return false;
293 }
294
295 float BanCommand_macro_usage(float argc)
296 {
297         #define BAN_COMMAND(name, function, description) \
298                 { if (name == strtolower(argv(1))) { function; return true; } }
299
300         BAN_COMMANDS(CMD_REQUEST_USAGE, argc, "");
301 #undef BAN_COMMAND
302
303         return false;
304 }
305
306 void BanCommand_macro_write_aliases(float fh)
307 {
308         #define BAN_COMMAND(name, function, description) \
309                 { if (strtolower(description) != "") { CMD_Write_Alias("qc_cmd_sv", name, description); } }
310
311         BAN_COMMANDS(0, 0, "");
312 #undef BAN_COMMAND
313 }
314
315 float BanCommand(string command)
316 {
317         float argc = tokenize_console(command);
318
319         // Guide for working with argc arguments by example:
320         // argc:   1    - 2      - 3     - 4
321         // argv:   0    - 1      - 2     - 3
322         // cmd     vote - master - login - password
323
324         if (BanCommand_macro_command(argc, command)) // continue as usual and scan for normal commands
325                 return true;                             // handled by one of the above GenericCommand_* functions
326
327         return false;
328 }