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 cvar_set("g_banned_list", out);
32 float Ban_Delete(float i)
38 if(ban_expire[i] == 0)
51 for(i = 0; i < ban_count; ++i)
55 n = tokenize(cvar_string("g_banned_list"));
56 if(stof(argv(0)) == 1)
58 ban_count = (n - 1) / 2;
59 for(i = 0; i < ban_count; ++i)
61 ban_ip[i] = strzone(argv(2*i+1));
62 ban_expire[i] = time + stof(argv(2*i+2));
71 for(i = 0; i < ban_count; ++i)
73 if(time > ban_expire[i])
75 msg = strcat("#", ftos(i), ": ");
76 msg = strcat(msg, ban_ip[i], " is still banned for ");
77 msg = strcat(msg, ftos(ban_expire[i] - time), " seconds");
78 ServerConsoleEcho(msg, FALSE);
82 float Ban_GetClientIP(entity client)
85 n = tokenizebyseparator(client.netaddress, ".");
88 ban_ip1 = strcat1(argv(0));
89 ban_ip2 = strcat(ban_ip1, ".", argv(1));
90 ban_ip3 = strcat(ban_ip2, ".", argv(2));
91 ban_ip4 = strcat(ban_ip3, ".", argv(3));
95 float Ban_IsClientBanned(entity client)
100 if(!Ban_GetClientIP(client))
102 for(i = 0; i < ban_count; ++i)
105 if(time > ban_expire[i])
108 if(ban_ip1 == s) return TRUE;
109 if(ban_ip2 == s) return TRUE;
110 if(ban_ip3 == s) return TRUE;
111 if(ban_ip4 == s) return TRUE;
116 float Ban_Insert(string ip, float bantime)
122 for(i = 0; i < ban_count; ++i)
125 // do we have a free slot?
126 for(i = 0; i < ban_count; ++i)
127 if(time > ban_expire[i])
129 // no free slot? Then look for the one who would get unbanned next
133 bestscore = ban_expire[i];
134 for(j = 1; j < ban_count; ++j)
136 if(ban_expire[j] < bestscore)
139 bestscore = ban_expire[i];
143 // if we replace someone, will we be banned longer than him (so long-term
144 // bans never get overridden by short-term bans)
145 if(ban_expire[i] > time + bantime)
147 // okay, insert our new victim as i
149 ServerConsoleEcho(strcat(ip, " has been banned for ", ftos(bantime), " seconds"), FALSE);
150 ban_expire[i] = time + bantime;
151 ban_ip[i] = strzone(ip);
152 ban_count = max(ban_count, i + 1);
159 void Ban_KickBanClient(entity client, float bantime, float masksize)
161 if(!Ban_GetClientIP(client))
170 Ban_Insert(ban_ip1, bantime);
173 Ban_Insert(ban_ip2, bantime);
176 Ban_Insert(ban_ip3, bantime);
179 Ban_Insert(ban_ip4, bantime);
186 float GameCommand_Ban(string command)
194 argc = tokenize(command);
195 if(argv(0) == "help")
197 print(" kickban # n m p - kickban player n for m seconds, using mask size p (1 to 4)\n");
198 print(" ban ip m - ban an IP or range (incomplete IP, like 1.2.3) for m seconds\n");
199 print(" bans - list all existing bans\n");
200 print(" unban n - delete the entry #n from the bans list\n");
203 if(argv(0) == "kickban")
207 entno = stof(argv(2));
208 if(entno > maxclients || entno < 1)
210 for(client = world; entno > 0; --entno, client = nextent(client))
213 bantime = stof(argv(3));
215 bantime = cvar("g_ban_default_bantime");
217 masksize = stof(argv(4));
219 masksize = cvar("g_ban_default_masksize");
220 Ban_KickBanClient(client, bantime, masksize);
224 else if(argv(0) == "ban")
231 bantime = stof(argv(2));
233 bantime = cvar("g_ban_default_bantime");
234 Ban_Insert(ip, bantime);
238 else if(argv(0) == "bans")
243 else if(argv(0) == "unban")