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