1 float Ban_Insert(string ip, float bantime, string reason);
3 void OnlineBanList_SendBan(string ip, float bantime, string reason)
6 // fill in your ban list syncing here
9 void OnlineBanList_Think()
12 // fill in your ban list syncing here
17 string ban_ip[BAN_MAX];
18 float ban_expire[BAN_MAX];
36 for(i = 0; i < ban_count; ++i)
38 if(time > ban_expire[i])
40 out = strcat(out, " ", ban_ip[i]);
41 out = strcat(out, " ", ftos(ban_expire[i] - time));
43 if(strlen(out) <= 1) // no real entries
44 cvar_set("g_banned_list", "");
46 cvar_set("g_banned_list", out);
49 float Ban_Delete(float i)
55 if(ban_expire[i] == 0)
68 for(i = 0; i < ban_count; ++i)
72 n = tokenize_sane(cvar_string("g_banned_list"));
73 if(stof(argv(0)) == 1)
75 ban_count = (n - 1) / 2;
76 for(i = 0; i < ban_count; ++i)
78 ban_ip[i] = strzone(argv(2*i+1));
79 ban_expire[i] = time + stof(argv(2*i+2));
85 e.classname = "bansyncer";
86 e.think = OnlineBanList_Think;
87 e.nextthink = time + 1;
94 for(i = 0; i < ban_count; ++i)
96 if(time > ban_expire[i])
98 msg = strcat("#", ftos(i), ": ");
99 msg = strcat(msg, ban_ip[i], " is still banned for ");
100 msg = strcat(msg, ftos(ban_expire[i] - time), " seconds");
105 float Ban_GetClientIP(entity client)
108 n = tokenizebyseparator(client.netaddress, ".");
111 ban_ip1 = strcat1(argv(0));
112 ban_ip2 = strcat(ban_ip1, ".", argv(1));
113 ban_ip3 = strcat(ban_ip2, ".", argv(2));
114 ban_ip4 = strcat(ban_ip3, ".", argv(3));
118 float Ban_IsClientBanned(entity client)
123 if(!Ban_GetClientIP(client))
125 for(i = 0; i < ban_count; ++i)
128 if(time > ban_expire[i])
131 if(ban_ip1 == s) return TRUE;
132 if(ban_ip2 == s) return TRUE;
133 if(ban_ip3 == s) return TRUE;
134 if(ban_ip4 == s) return TRUE;
139 float Ban_MaybeEnforceBan(entity client)
141 if(Ban_IsClientBanned(client))
144 s = strcat("^1NOTE:^7 banned client ", client.netaddress, " just tried to enter\n");
152 float Ban_Insert(string ip, float bantime, string reason)
159 OnlineBanList_SendBan(ip, bantime, reason);
162 for(i = 0; i < ban_count; ++i)
166 if(time + bantime > ban_expire[i])
167 ban_expire[i] = time + bantime;
171 // do we have a free slot?
172 for(i = 0; i < ban_count; ++i)
173 if(time > ban_expire[i])
175 // no free slot? Then look for the one who would get unbanned next
179 bestscore = ban_expire[i];
180 for(j = 1; j < ban_count; ++j)
182 if(ban_expire[j] < bestscore)
185 bestscore = ban_expire[i];
189 // if we replace someone, will we be banned longer than him (so long-term
190 // bans never get overridden by short-term bans)
191 if(ban_expire[i] > time + bantime)
193 // okay, insert our new victim as i
195 print(ip, " has been banned for ", ftos(bantime), " seconds\n");
196 ban_expire[i] = time + bantime;
197 ban_ip[i] = strzone(ip);
198 ban_count = max(ban_count, i + 1);
205 void Ban_KickBanClient(entity client, float bantime, float masksize, string reason)
207 if(!Ban_GetClientIP(client))
216 Ban_Insert(ban_ip1, bantime, reason);
219 Ban_Insert(ban_ip2, bantime, reason);
222 Ban_Insert(ban_ip3, bantime, reason);
225 Ban_Insert(ban_ip4, bantime, reason);
232 float GameCommand_Ban(string command)
241 argc = tokenize_sane(command);
242 if(argv(0) == "help")
244 print(" kickban # n m p - kickban player n for m seconds, using mask size p (1 to 4)\n");
245 print(" ban ip m - ban an IP or range (incomplete IP, like 1.2.3) for m seconds\n");
246 print(" bans - list all existing bans\n");
247 print(" unban n - delete the entry #n from the bans list\n");
250 if(argv(0) == "kickban")
254 entno = stof(argv(2));
255 if(entno > maxclients || entno < 1)
257 client = edict_num(entno);
259 bantime = stof(argv(3));
261 bantime = cvar("g_ban_default_bantime");
263 masksize = stof(argv(4));
265 masksize = cvar("g_ban_default_masksize");
267 reason = substring(command, argv_start_index(5), strlen(command) - argv_start_index(5));
270 Ban_KickBanClient(client, bantime, masksize, reason);
274 else if(argv(0) == "ban")
281 bantime = stof(argv(2));
283 bantime = cvar("g_ban_default_bantime");
285 reason = substring(command, argv_start_index(3), strlen(command) - argv_start_index(3));
288 Ban_Insert(ip, bantime, reason);
292 else if(argv(0) == "bans")
297 else if(argv(0) == "unban")