| Twinny |
08-12-2010 07:16 AM |
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; };
|