mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-21 23:52:12 +00:00
Current jobban system: Jobbans stored as plain text and require a for loop to go through and search for specific ones. Fiddly as shit, because, again, stored as plain text and not quickly break-up-able. butts No temporary jobbans on the old file system. No centralized API to handle jobbanning. Jobbans have to be ran through separate procs in case of the MySQL system being used. New jobban system: Associated lists to store bans. This allows key based accessing and validation of a ban. Much faster than for-looping twice to compare text. Associated lists saved to the ban file. Pretty good stuff that this works. Temporary jobbans for file system. Bans which are expired are removed right as they're checked. Binding of the MySQL procs with the old jobban API. More centralized design. (Less, "Oh god, I forgot to save this to the DB!") Instant effect on unbans. As opposed to waiting 1 round for it to take effect. Removal of dormant code.
230 lines
6.3 KiB
Plaintext
230 lines
6.3 KiB
Plaintext
var/CMinutes = null
|
|
var/savefile/Banlist
|
|
|
|
|
|
/proc/CheckBan(var/ckey, var/id, var/address)
|
|
if(!Banlist) // if Banlist cannot be located for some reason
|
|
LoadBans() // try to load the bans
|
|
if(!Banlist) // uh oh, can't find bans!
|
|
return 0 // ABORT ABORT ABORT
|
|
|
|
. = list()
|
|
var/appeal
|
|
if(config && config.banappeals)
|
|
appeal = "\nFor more information on your ban, or to appeal, head to <a href='[config.banappeals]'>[config.banappeals]</a>"
|
|
Banlist.cd = "/base"
|
|
if( "[ckey][id]" in Banlist.dir )
|
|
Banlist.cd = "[ckey][id]"
|
|
if (Banlist["temp"])
|
|
if (!GetExp(Banlist["minutes"]))
|
|
ClearTempbans()
|
|
return 0
|
|
else
|
|
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: [GetExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]"
|
|
else
|
|
Banlist.cd = "/base/[ckey][id]"
|
|
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: <B>PERMENANT</B>\nBy: [Banlist["bannedby"]][appeal]"
|
|
.["reason"] = "ckey/id"
|
|
return .
|
|
else
|
|
for (var/A in Banlist.dir)
|
|
Banlist.cd = "/base/[A]"
|
|
var/matches
|
|
if( ckey == Banlist["key"] )
|
|
matches += "ckey"
|
|
if( id == Banlist["id"] )
|
|
if(matches)
|
|
matches += "/"
|
|
matches += "id"
|
|
if( address == Banlist["ip"] )
|
|
if(matches)
|
|
matches += "/"
|
|
matches += "ip"
|
|
|
|
if(matches)
|
|
if(Banlist["temp"])
|
|
if (!GetExp(Banlist["minutes"]))
|
|
ClearTempbans()
|
|
return 0
|
|
else
|
|
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: [GetExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]"
|
|
else
|
|
.["desc"] = "\nReason: [Banlist["reason"]]\nExpires: <B>PERMENANT</B>\nBy: [Banlist["bannedby"]][appeal]"
|
|
.["reason"] = matches
|
|
return .
|
|
return 0
|
|
|
|
/proc/UpdateTime() //No idea why i made this a proc.
|
|
CMinutes = (world.realtime / 10) / 60
|
|
return 1
|
|
|
|
/hook/startup/proc/loadBans()
|
|
return LoadBans()
|
|
|
|
/proc/LoadBans()
|
|
|
|
Banlist = new("data/banlist.bdb")
|
|
log_admin("Loading Banlist")
|
|
|
|
if (!length(Banlist.dir)) log_admin("Banlist is empty.")
|
|
|
|
if (!Banlist.dir.Find("base"))
|
|
log_admin("Banlist missing base dir.")
|
|
Banlist.dir.Add("base")
|
|
Banlist.cd = "/base"
|
|
else if (Banlist.dir.Find("base"))
|
|
Banlist.cd = "/base"
|
|
|
|
ClearTempbans()
|
|
return 1
|
|
|
|
/proc/ClearTempbans()
|
|
UpdateTime()
|
|
|
|
Banlist.cd = "/base"
|
|
for (var/A in Banlist.dir)
|
|
Banlist.cd = "/base/[A]"
|
|
if (!Banlist["key"] || !Banlist["id"])
|
|
RemoveBan(A)
|
|
log_admin("Invalid Ban.")
|
|
message_admins("Invalid Ban.")
|
|
continue
|
|
|
|
if (!Banlist["temp"]) continue
|
|
if (CMinutes >= Banlist["minutes"]) RemoveBan(A)
|
|
|
|
return 1
|
|
|
|
|
|
/proc/AddBan(ckey, computerid, reason, bannedby, temp, minutes, address)
|
|
|
|
var/bantimestamp
|
|
|
|
if (temp)
|
|
UpdateTime()
|
|
bantimestamp = CMinutes + minutes
|
|
|
|
Banlist.cd = "/base"
|
|
if ( Banlist.dir.Find("[ckey][computerid]") )
|
|
usr << text("<span class='warning'>Ban already exists.</span>")
|
|
return 0
|
|
else
|
|
Banlist.dir.Add("[ckey][computerid]")
|
|
Banlist.cd = "/base/[ckey][computerid]"
|
|
Banlist["key"] << ckey
|
|
Banlist["id"] << computerid
|
|
Banlist["ip"] << address
|
|
Banlist["reason"] << reason
|
|
Banlist["bannedby"] << bannedby
|
|
Banlist["temp"] << temp
|
|
if (temp)
|
|
Banlist["minutes"] << bantimestamp
|
|
return 1
|
|
|
|
/proc/RemoveBan(foldername)
|
|
var/key
|
|
var/id
|
|
|
|
Banlist.cd = "/base/[foldername]"
|
|
Banlist["key"] >> key
|
|
Banlist["id"] >> id
|
|
Banlist.cd = "/base"
|
|
|
|
if (!Banlist.dir.Remove(foldername)) return 0
|
|
|
|
if(!usr)
|
|
log_admin("Ban Expired: [key]",ckey=key)
|
|
message_admins("Ban Expired: [key]")
|
|
else
|
|
ban_unban_log_save("[key_name_admin(usr)] unbanned [key]")
|
|
log_admin("[key_name_admin(usr)] unbanned [key]",admin_key=key_name(usr),ckey=key)
|
|
message_admins("[key_name_admin(usr)] unbanned: [key]")
|
|
feedback_inc("ban_unban",1)
|
|
DB_ban_unban( ckey(key), BANTYPE_ANY_FULLBAN)
|
|
for (var/A in Banlist.dir)
|
|
Banlist.cd = "/base/[A]"
|
|
if (key == Banlist["key"] /*|| id == Banlist["id"]*/)
|
|
Banlist.cd = "/base"
|
|
Banlist.dir.Remove(A)
|
|
continue
|
|
|
|
return 1
|
|
|
|
/proc/GetExp(minutes as num)
|
|
UpdateTime()
|
|
var/exp = minutes - CMinutes
|
|
if (exp <= 0)
|
|
return 0
|
|
else
|
|
var/timeleftstring
|
|
if (exp >= 1440) //1440 = 1 day in minutes
|
|
timeleftstring = "[round(exp / 1440, 0.1)] Days"
|
|
else if (exp >= 60) //60 = 1 hour in minutes
|
|
timeleftstring = "[round(exp / 60, 0.1)] Hours"
|
|
else
|
|
timeleftstring = "[exp] Minutes"
|
|
return timeleftstring
|
|
|
|
/datum/admins/proc/unbanpanel()
|
|
var/count = 0
|
|
var/dat
|
|
//var/dat = "<HR><B>Unban Player:</B> \blue(U) = Unban , (E) = Edit Ban\green (Total<HR><table border=1 rules=all frame=void cellspacing=0 cellpadding=3 >"
|
|
Banlist.cd = "/base"
|
|
for (var/A in Banlist.dir)
|
|
count++
|
|
Banlist.cd = "/base/[A]"
|
|
var/ref = "\ref[src]"
|
|
var/key = Banlist["key"]
|
|
var/id = Banlist["id"]
|
|
var/ip = Banlist["ip"]
|
|
var/reason = Banlist["reason"]
|
|
var/by = Banlist["bannedby"]
|
|
var/expiry
|
|
if(Banlist["temp"])
|
|
expiry = GetExp(Banlist["minutes"])
|
|
if(!expiry) expiry = "Removal Pending"
|
|
else expiry = "Permaban"
|
|
|
|
dat += text("<tr><td><A href='?src=[ref];unbanf=[key][id]'>(U)</A><A href='?src=[ref];unbane=[key][id]'>(E)</A> Key: <B>[key]</B></td><td>ComputerID: <B>[id]</B></td><td>IP: <B>[ip]</B></td><td> [expiry]</td><td>(By: [by])</td><td>(Reason: [reason])</td></tr>")
|
|
|
|
dat += "</table>"
|
|
dat = "<HR><B>Bans:</B> <FONT COLOR=blue>(U) = Unban , (E) = Edit Ban</FONT> - <FONT COLOR=green>([count] Bans)</FONT><HR><table border=1 rules=all frame=void cellspacing=0 cellpadding=3 >[dat]"
|
|
usr << browse(dat, "window=unbanp;size=875x400")
|
|
|
|
//////////////////////////////////// DEBUG ////////////////////////////////////
|
|
|
|
/proc/CreateBans()
|
|
|
|
UpdateTime()
|
|
|
|
var/i
|
|
var/last
|
|
|
|
for(i=0, i<1001, i++)
|
|
var/a = pick(1,0)
|
|
var/b = pick(1,0)
|
|
if(b)
|
|
Banlist.cd = "/base"
|
|
Banlist.dir.Add("trash[i]trashid[i]")
|
|
Banlist.cd = "/base/trash[i]trashid[i]"
|
|
Banlist["key"] << "trash[i]"
|
|
else
|
|
Banlist.cd = "/base"
|
|
Banlist.dir.Add("[last]trashid[i]")
|
|
Banlist.cd = "/base/[last]trashid[i]"
|
|
Banlist["key"] << last
|
|
Banlist["id"] << "trashid[i]"
|
|
Banlist["reason"] << "Trashban[i]."
|
|
Banlist["temp"] << a
|
|
Banlist["minutes"] << CMinutes + rand(1,2000)
|
|
Banlist["bannedby"] << "trashmin"
|
|
last = "trash[i]"
|
|
|
|
Banlist.cd = "/base"
|
|
|
|
/proc/ClearAllBans()
|
|
Banlist.cd = "/base"
|
|
for (var/A in Banlist.dir)
|
|
RemoveBan(A)
|
|
|