3 string ban_ip[BAN_MAX];
4 float ban_expire[BAN_MAX];
22 for(i = 0; i < ban_count; ++i)
24 if(time > ban_expire[i])
26 out = strcat(out, " ", ban_ip[i]);
27 out = strcat(out, " ", ftos(ban_expire[i] - time));
29 if(strlen(out) <= 1) // no real entries
30 cvar_set("g_banned_list", "");
32 cvar_set("g_banned_list", out);
35 float Ban_Delete(float i)
41 if(ban_expire[i] == 0)
54 for(i = 0; i < ban_count; ++i)
58 n = tokenize(cvar_string("g_banned_list"));
59 if(stof(argv(0)) == 1)
61 ban_count = (n - 1) / 2;
62 for(i = 0; i < ban_count; ++i)
64 ban_ip[i] = strzone(argv(2*i+1));
65 ban_expire[i] = time + stof(argv(2*i+2));
74 for(i = 0; i < ban_count; ++i)
76 if(time > ban_expire[i])
78 msg = strcat("#", ftos(i), ": ");
79 msg = strcat(msg, ban_ip[i], " is still banned for ");
80 msg = strcat(msg, ftos(ban_expire[i] - time), " seconds");
81 ServerConsoleEcho(msg, FALSE);
85 float Ban_GetClientIP(entity client)
88 n = tokenizebyseparator(client.netaddress, ".");
91 ban_ip1 = strcat1(argv(0));
92 ban_ip2 = strcat(ban_ip1, ".", argv(1));
93 ban_ip3 = strcat(ban_ip2, ".", argv(2));
94 ban_ip4 = strcat(ban_ip3, ".", argv(3));
98 float Ban_IsClientBanned(entity client)
103 if(!Ban_GetClientIP(client))
105 for(i = 0; i < ban_count; ++i)
108 if(time > ban_expire[i])
111 if(ban_ip1 == s) return TRUE;
112 if(ban_ip2 == s) return TRUE;
113 if(ban_ip3 == s) return TRUE;
114 if(ban_ip4 == s) return TRUE;
119 float Ban_Insert(string ip, float bantime)
125 for(i = 0; i < ban_count; ++i)
128 // do we have a free slot?
129 for(i = 0; i < ban_count; ++i)
130 if(time > ban_expire[i])
132 // no free slot? Then look for the one who would get unbanned next
136 bestscore = ban_expire[i];
137 for(j = 1; j < ban_count; ++j)
139 if(ban_expire[j] < bestscore)
142 bestscore = ban_expire[i];
146 // if we replace someone, will we be banned longer than him (so long-term
147 // bans never get overridden by short-term bans)
148 if(ban_expire[i] > time + bantime)
150 // okay, insert our new victim as i
152 ServerConsoleEcho(strcat(ip, " has been banned for ", ftos(bantime), " seconds"), FALSE);
153 ban_expire[i] = time + bantime;
154 ban_ip[i] = strzone(ip);
155 ban_count = max(ban_count, i + 1);
162 void Ban_KickBanClient(entity client, float bantime, float masksize)
164 if(!Ban_GetClientIP(client))
173 Ban_Insert(ban_ip1, bantime);
176 Ban_Insert(ban_ip2, bantime);
179 Ban_Insert(ban_ip3, bantime);
182 Ban_Insert(ban_ip4, bantime);
189 float GameCommand_Ban(string command)
197 argc = tokenize(command);
198 if(argv(0) == "help")
200 print(" kickban # n m p - kickban player n for m seconds, using mask size p (1 to 4)\n");
201 print(" ban ip m - ban an IP or range (incomplete IP, like 1.2.3) for m seconds\n");
202 print(" bans - list all existing bans\n");
203 print(" unban n - delete the entry #n from the bans list\n");
206 if(argv(0) == "kickban")
210 entno = stof(argv(2));
211 if(entno > maxclients || entno < 1)
213 client = edict_num(entno);
215 bantime = stof(argv(3));
217 bantime = cvar("g_ban_default_bantime");
219 masksize = stof(argv(4));
221 masksize = cvar("g_ban_default_masksize");
222 Ban_KickBanClient(client, bantime, masksize);
226 else if(argv(0) == "ban")
233 bantime = stof(argv(2));
235 bantime = cvar("g_ban_default_bantime");
236 Ban_Insert(ip, bantime);
240 else if(argv(0) == "bans")
245 else if(argv(0) == "unban")