Had issues with the script Jerret put on Classic iPhone so made my own adaptation which provided some error checking. Depending on jerrets next version, will either improve this or implement changes to his next version.
This is based on what Jerret created but ended up starting from scratch using his as a reference point while scripting with style I am used to. Made my version as a backend, allowing for a simple frontend to be created. Provided example of NPC commands (RC) but can be adapted to be done anywhere.
Ultimately should move the hasright checking to DBNPC itself but that's for the next version =]
PHP Code:
function onCreated() {
const ipbantick = 60;
setTimer(1);
}
function onTimeout() {
for (ip : this.ipban.getdynamicvarnames()) {
if (this.ipban.(@ip)[0] == "permanent")
continue;
this.ipban.(@ip)[0] -= ipbantick;
if (this.ipban.(@ip)[0] <= 0)
unIPBan(ip,"Released by the system","system");
}
setTimer(ipbantick);
}
/* Add/Modify an IP ban */
public function IPBan(ip, time, comment, admin, overwrite) {
/* Work out ban time */
temp.ban = banTime(time);
if (temp.ban[0] == 0)
return "Invalid time specified: "@time;
/* Check IP given */
temp.check = checkIP(ip);
if (temp.check[0] == 0)
return temp.check[1];
if (comment = "")
return "Must provide a reason for the IP ban";
//Checks done: lets ban an IP!
temp.ipstring = iptostring(ip);
if (this.ipban.(@ipstring).size() > 2)
{
if (!overwrite)
{
temp.ret = format("%s has already been banned. Set overwrite as true to overwrite this entry",ip);
return temp.ret;
}
else
temp.modified = true;
}
else
this.ipban.(@ipstring) = new[4];
/* set the ban */
this.ipban.(@ipstring) = {temp.ban[0], temp.comment, temp.admin, temp.ban[0]};
if (temp.modified)
temp.ret = format("%s modified the IP Ban for %s. Now banned for %s with reason: %s",
admin, ip, temp.ban[1], comment);
else
temp.ret = format("%s has IP banned %s for %s with reason: %s",
admin, ip, temp.ban[1], comment);
savelog2("ipbans.txt",temp.ret);
this.trigger("saveData","");
updateIPBans();
return temp.ret;
}
/* Remove an IP Ban */
public function unIPBan(ip, comment, admin) {
if (admin == "system")
temp.ipstring = ip;
else
temp.ipstring = iptostring(ip);
if (this.ipban.(@ipstring).size() < 1)
return "given IP address is not banned: "@ip;
if (comment == "")
return "Must provide a reason to unban ip";
this.ipban.(@ipstring).clear();
this.trigger("saveData","");
updateIPBans();
temp.ret = format("%s has unbanned the IP %s reason: %s",admin,ip,comment);
savelog2("ipbans.txt", temp.ret);
return temp.ret;
}
public function updateIPBans() {
temp.lines = {
"###################################",
"# Automatically generated IP Bans #",
"###################################",
};
for (ip : this.ipban.getdynamicvarnames()) {
if (this.ipban.(@ip).size() < 1)
continue;
temp.lines.add("# Ban Reason: "@this.ipban.(@ip)[1]);
temp.lines.add("# Banned for: "@this.ipban.(@ip)[3]);
temp.lines.add("# Banned by: "@this.ipban.(@ip)[2]);
temp.lines.add(stringtoip(ip));
temp.lines.add("");
}
temp.lines.savelines("levels/ipbanned.txt", 0);
return 1;
}
public function listBans() {
for (t : this.ipban.getdynamicvarnames()) {
if (this.ipban.(@t).size() < 1)
continue;
temp.list.add(stringtoip(t));
}
return temp.list;
}
/* Return with ban time*/
function banTime(time) {
switch (time) {
case "minute":
temp.bantime = 60;
temp.timereport = "a minute (testing)";
break;
case "hour":
temp.bantime = 3600;
temp.timereport = "an hour";
break;
case "day":
temp.bantime = 3600 * 24;
temp.timereport = "a day";
break;
case "week":
temp.bantime = 3600 * 24 * 7;
temp.timereport = "a week";
break;
case "month":
temp.bantime = 3600 * 24 * 30;
temp.timereport = "a month";
break;
case "year":
temp.bantime = 3600 * 24 * 365;
temp.timereport = "a year";
break;
case "permanent":
temp.bantime = "permanent";
temp.timereport = "a very long time";
break;
default:
temp.bantime = int(time);
if (temp.bantime > 0)
temp.timereport = "a custom time of " @time@" seconds";
else
temp.bantime = 0;
break;
}
temp.ret = {temp.bantime, temp.timereport};
return temp.ret;
}
/* Verify whether given IP address can be banned */
function checkIP(ip) {
temp.tokens = ip.tokenize(".");
// Check if IP address is private
temp.private = {"10", "127", "172.16", "192.168"};
for (t : temp.private) {
if (ip.starts(t)) {
temp.ret = {0, format("IP Ban Error: %s is in a private address class", ip)};
return temp.ret;
}
}
// Not enough octets: needs to be x.x.x.x
if (temp.tokens.size() != 4) {
temp.ret = {0, format("IP Ban Error: Invalid IP address given: %s. 4 octets expected (x.x.x.x)",ip)};
return temp.ret;
}
for (i=0; i<temp.tokens.size(); i++) {
if (temp.tokens[i] == "*")
continue;
if (temp.tokens[i] != int(temp.tokens[i])) {
temp.ret = {0, format("IP Ban Error: Invalid IP address given: %s. An IP address can only contain numbers!",ip)};
return temp.ret;
}
// An octet needs to be above 0 and less than 255
if (temp.tokens[i] > 255 || temp.tokens[i] < 0) {
temp.ret = {0, format("IP Ban Error: Invalid IP address given: %s. An octet value must be between 0 and 255",ip)};
return temp.ret;
}
}
return 1;
}
public function iptostring(ip) {
temp.toks = ip.tokenize(".");
temp.ipstring = toks[0] @"_"@ toks[1] @"_"@ toks[2] @"_"@ toks[3];
return temp.ipstring;
}
public function stringtoip(ip) {
temp.toks = ip.tokenize("_");
temp.ipstring = toks[0] @"."@ toks[1] @"."@ toks[2] @"."@ toks[3];
return temp.ipstring;
}
Example of my NC commands
PHP Code:
case "ipban": {
if (!player.hasright("rw", "levels/ipbanned.txt")) {
sendtorc("You do not have IP Ban rights, "@player.account);
return;
}
temp.ret = IPBans.ipBan(params[1], params[2], params[3], player.account, params[4]);
sendtorc(temp.ret);
break;
};
case "listipbans": {
if (!player.hasright("rw", "levels/ipbanned.txt")) {
sendtorc("You do not have IP Ban rights, "@player.account);
return;
}
temp.ret = IPBans.listBans();
sendtorc(temp.ret);
break;
};
case "unipban": {
if (!player.hasright("rw", "levels/ipbanned.txt")) {
sendtorc("You do not have IP Ban rights, "@player.account);
return;
}
temp.ret = IPBans.unIPBan(params[1],params[2],player.account);
sendtorc(temp.ret);
break;
};
case "rebuildipbanlist": {
if (!player.hasright("rw", "levels/ipbanned.txt")) {
sendtorc("You do not have IP Ban rights, "@player.account);
return;
}
temp.ret = IPBans.updateIPBans();
if (temp.ret)
sendtorc("IP Bans list has been regenerated");
else
sendtorc("Issues generating IP bans list");
break;
};