/datum/admins/proc/stickyban(action,data) if(!check_rights(R_BAN)) return switch(action) if("show") stickyban_show() return if("add") var/list/ban = list() var/ckey ban["admin"] = usr.key ban["type"] = list("sticky") ban["reason"] = "(InGameBan)([usr.key])" //this will be displayed in dd only if(data["ckey"]) ckey = ckey(data["ckey"]) else ckey = input(usr,"Ckey","Ckey","") as text|null if(!ckey) return ckey = ckey(ckey) if(get_stickyban_from_ckey(ckey)) to_chat(usr, "Error: Can not add a stickyban: User already has a current sticky ban") if(data["reason"]) ban["message"] = data["reason"] else var/reason = input(usr,"Reason","Reason","Ban Evasion") as text|null if(!reason) return ban["message"] = "[reason]" world.SetConfig("ban", ckey, list2stickyban(ban)) log_admin("[key_name(usr)] has stickybanned [ckey].\nReason: [ban["message"]]") message_admins("[key_name_admin(usr)] has stickybanned [ckey].\nReason: [ban["message"]]") if("remove") if(!data["ckey"]) return var/ckey = data["ckey"] var/ban = get_stickyban_from_ckey(ckey) if(!ban) to_chat(usr, "Error: No sticky ban for [ckey] found!") return if(alert("Are you sure you want to remove the sticky ban on [ckey]?","Are you sure","Yes","No") == "No") return if(!get_stickyban_from_ckey(ckey)) to_chat(usr, "Error: The ban disappeared.") return world.SetConfig("ban", ckey, null) log_admin("[key_name(usr)] removed [ckey]'s stickyban") message_admins("[key_name_admin(usr)] removed [ckey]'s stickyban") if("remove_alt") if(!data["ckey"]) return var/ckey = data["ckey"] if(!data["alt"]) return var/alt = ckey(data["alt"]) var/ban = get_stickyban_from_ckey(ckey) if(!ban) to_chat(usr, "Error: No sticky ban for [ckey] found!") return var/found = 0 //we have to do it this way because byond keeps the case in its sticky ban matches WHY!!! for(var/key in ban["keys"]) if(ckey(key) == alt) found = 1 break if(!found) to_chat(usr, "Error: [alt] is not linked to [ckey]'s sticky ban!") return if(alert("Are you sure you want to disassociate [alt] from [ckey]'s sticky ban? \nNote: Nothing stops byond from re-linking them","Are you sure","Yes","No") == "No") return //we have to do this again incase something changes ban = get_stickyban_from_ckey(ckey) if(!ban) to_chat(usr, "Error: The ban disappeared.") return found = 0 for(var/key in ban["keys"]) if(ckey(key) == alt) ban["keys"] -= key found = 1 break if(!found) to_chat(usr, "Error: [alt] link to [ckey]'s sticky ban disappeared.") return world.SetConfig("ban",ckey,list2stickyban(ban)) log_admin("[key_name(usr)] has disassociated [alt] from [ckey]'s sticky ban") message_admins("[key_name_admin(usr)] has disassociated [alt] from [ckey]'s sticky ban") if("edit") if(!data["ckey"]) return var/ckey = data["ckey"] var/ban = get_stickyban_from_ckey(ckey) if(!ban) to_chat(usr, "Error: No sticky ban for [ckey] found!") return var/oldreason = ban["message"] var/reason = input(usr,"Reason","Reason","[ban["message"]]") as text|null if(!reason || reason == oldreason) return //we have to do this again incase something changed while we waited for input ban = get_stickyban_from_ckey(ckey) if(!ban) to_chat(usr, "Error: The ban disappeared.") return ban["message"] = "[reason]" world.SetConfig("ban",ckey,list2stickyban(ban)) log_admin("[key_name(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]") message_admins("[key_name_admin(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]") spawn(10) stickyban_show() /datum/admins/proc/stickyban_gethtml(ckey, ban) . = "\[-\][ckey]
" . += "[ban["message"]] \[Edit\]
" if(ban["admin"]) . += "[ban["admin"]]
" else . += "LEGACY
" . += "Caught keys
\n
    " for(var/key in ban["keys"]) if(ckey(key) == ckey) continue . += "
  1. \[-\][key]
  2. " . += "
\n" /datum/admins/proc/stickyban_show() if(!check_rights(R_BAN)) return var/list/bans = sortList(world.GetConfig("ban")) var/banhtml = "" for(var/key in bans) var/ckey = ckey(key) var/ban = stickyban2list(world.GetConfig("ban",key)) banhtml += "

\n" banhtml += stickyban_gethtml(ckey,ban) var/html = {" Sticky Bans

All Sticky Bans:

\[+\]
[banhtml] "} usr << browse(html,"window=stickybans;size=700x400") /proc/get_stickyban_from_ckey(var/ckey) if(!ckey) return null ckey = ckey(ckey) . = null for(var/key in world.GetConfig("ban")) if(ckey(key) == ckey) . = stickyban2list(world.GetConfig("ban",key)) break /proc/stickyban2list(var/ban) if(!ban) return null . = params2list(ban) .["keys"] = splittext(.["keys"], ",") .["type"] = splittext(.["type"], ",") .["IP"] = splittext(.["IP"], ",") .["computer_id"] = splittext(.["computer_id"], ",") /proc/list2stickyban(var/list/ban) if(!ban || !islist(ban)) return null . = ban.Copy() if(.["keys"]) .["keys"] = jointext(.["keys"], ",") if(.["type"]) .["type"] = jointext(.["type"], ",") if(.["IP"]) .["IP"] = jointext(.["IP"], ",") if(.["computer_id"]) .["computer_id"] = jointext(.["computer_id"], ",") . = list2params(.) /client/proc/stickybanpanel() set name = "Sticky Ban Panel" set category = "Admin" if(!check_rights(R_BAN)) return holder.stickyban_show()