]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/command/banning.qc
Fix many various things, including *ACTUALLY* fixing GetIndexedEntity
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / command / banning.qc
1 // =====================================================
2 //  Banning and kicking command code, written by Samual
3 //  Last updated: December 29th, 2011
4 // =====================================================
5
6 void BanCommand_ban(float request, float argc, string command)
7 {
8         switch(request)
9         {
10                 case CMD_REQUEST_COMMAND:
11                 {
12                         if(argc >= 2)
13                         {
14                                 string ip = argv(1);
15                                 float reason_arg, bantime;
16                                 string reason;
17                                 
18                                 reason_arg = 2; 
19                                 
20                                 GET_BAN_ARG(bantime, autocvar_g_ban_default_bantime);
21                                 GET_BAN_REASON(reason, "No reason provided.");
22
23                                 Ban_Insert(ip, bantime, reason, 1);
24                                 return;
25                         }
26                 }
27                         
28                 default:
29                         print("Incorrect parameters for ^2ban^7\n");
30                 case CMD_REQUEST_USAGE:
31                 {
32                         print("\nUsage:^3 sv_cmd ban address [time] reason\n");
33                         print("  No arguments required.\n");
34                         return;
35                 }
36         }
37 }
38
39 void BanCommand_banlist(float request)
40 {
41         switch(request)
42         {
43                 case CMD_REQUEST_COMMAND:
44                 {
45                         Ban_View();
46                         return;
47                 }
48                         
49                 default:
50                 case CMD_REQUEST_USAGE:
51                 {
52                         print("\nUsage:^3 sv_cmd banlist\n");
53                         print("  No arguments required.\n");
54                         return;
55                 }
56         }
57 }
58
59 void BanCommand_kickban(float request, float argc, string command)
60 {
61         switch(request)
62         {
63                 case CMD_REQUEST_COMMAND:
64                 {
65                         if(argc >= 2)
66                         {
67                                 entity client = GetIndexedEntity(argc, 1);
68                                 float accepted = VerifyClientEntity(client, TRUE, FALSE);
69                                 float reason_arg, bantime, masksize;
70                                 string reason;
71                                 
72                                 if(accepted > 0) 
73                                 {
74                                         reason_arg = next_token; 
75
76                                         GET_BAN_ARG(bantime, autocvar_g_ban_default_bantime);
77                                         GET_BAN_ARG(masksize, autocvar_g_ban_default_masksize);
78                                         GET_BAN_REASON(reason, "No reason provided");
79
80                                         Ban_KickBanClient(client, bantime, masksize, reason);
81                                         
82                                         return;
83                                 }
84                                 else
85                                 {
86                                         print("kickban: ", GetClientErrorString(accepted, argv(1)), ".\n"); 
87                                 }
88                         }
89                 }
90                         
91                 default:
92                         print("Incorrect parameters for ^2kickban^7\n");
93                 case CMD_REQUEST_USAGE:
94                 {
95                         print("\nUsage:^3 sv_cmd kickban client [bantime masksize reason]\n");
96                         print("  No arguments required. todo\n");
97                         return;
98                 }
99         }
100 }
101
102 void BanCommand_unban(float request, float argc)
103 {
104         switch(request)
105         {
106                 case CMD_REQUEST_COMMAND:
107                 {
108                         if(argc >= 2)
109                         {
110                                 float who;
111                                 who = stof(argv(1));
112                                 Ban_Delete(who);
113                                 return;
114                         }
115                 }
116                         
117                 default:
118                 case CMD_REQUEST_USAGE:
119                 {
120                         print("\nUsage:^3 sv_cmd unban banid\n");
121                         print("  Where 'banid' is the ID of the ban of which to remove.\n");
122                         return;
123                 }
124         }
125 }
126
127 /* use this when creating a new command, making sure to place it in alphabetical order... also,
128 ** ADD ALL NEW COMMANDS TO commands.cfg WITH PROPER ALIASES IN THE SAME FASHION!
129 void BanCommand_(float request)
130 {
131         switch(request)
132         {
133                 case CMD_REQUEST_COMMAND:
134                 {
135                         
136                         return;
137                 }
138                         
139                 default:
140                 case CMD_REQUEST_USAGE:
141                 {
142                         print("\nUsage:^3 sv_cmd \n");
143                         print("  No arguments required.\n");
144                         return;
145                 }
146         }
147 }
148 */
149
150
151 // ==================================
152 //  Macro system for server commands
153 // ==================================
154
155 // Do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;)
156 #define BAN_COMMANDS(request,arguments,command) \
157         BAN_COMMAND("ban", BanCommand_ban(request, arguments, command), "Ban an IP address or a range of addresses (like 1.2.3)") \
158         BAN_COMMAND("banlist", BanCommand_banlist(request), "List all existing bans") \
159         BAN_COMMAND("kickban", BanCommand_kickban(request, arguments, command), "Disconnect a client and ban it at the same time") \
160         BAN_COMMAND("unban", BanCommand_unban(request, arguments), "Remove an existing ban") \
161         /* nothing */
162
163 void BanCommand_macro_help()
164 {
165         #define BAN_COMMAND(name,function,description) \
166                 { print("  ^2", name, "^7: ", description, "\n"); }
167                 
168         BAN_COMMANDS(0, 0, "")
169         #undef BAN_COMMAND
170         
171         return;
172 }
173
174 float BanCommand_macro_command(float argc, string command)
175 {
176         #define BAN_COMMAND(name,function,description) \
177                 { if(name == strtolower(argv(0))) { function; return TRUE; } }
178                 
179         BAN_COMMANDS(CMD_REQUEST_COMMAND, argc, command)
180         #undef BAN_COMMAND
181         
182         return FALSE;
183 }
184
185 float BanCommand_macro_usage(float argc)
186 {
187         #define BAN_COMMAND(name,function,description) \
188                 { if(name == strtolower(argv(1))) { function; return TRUE; } }
189                 
190         BAN_COMMANDS(CMD_REQUEST_USAGE, argc, "")
191         #undef BAN_COMMAND
192         
193         return FALSE;
194 }
195
196 void BanCommand_macro_write_aliases(float fh)
197 {
198         #define BAN_COMMAND(name,function,description) \
199                 { CMD_Write_Alias("qc_cmd_sv", name, description); }
200         
201         BAN_COMMANDS(0, 0, "")
202         #undef BAN_COMMAND
203         
204         return;
205 }
206
207 float BanCommand(string command)
208 {
209         float argc = tokenize_console(command);
210         
211         // Guide for working with argc arguments by example:
212         // argc:   1    - 2      - 3     - 4
213         // argv:   0    - 1      - 2     - 3 
214         // cmd     vote - master - login - password
215
216         if(BanCommand_macro_command(argc, command)) // continue as usual and scan for normal commands
217         {
218                 return TRUE; // handled by one of the above GenericCommand_* functions
219         }
220         
221         return FALSE;
222 }