From 918ed392bd7cf717bb6394f146396e8e8f1f2d82 Mon Sep 17 00:00:00 2001 From: Krausus Date: Sat, 9 Jul 2016 06:05:07 -0400 Subject: [PATCH] Job ban refactors/fixes --- code/modules/admin/DB ban/functions.dm | 18 +- code/modules/admin/banjob.dm | 108 ++++++---- code/modules/admin/newbanjob.dm | 274 ------------------------- paradise.dme | 1 - 4 files changed, 85 insertions(+), 316 deletions(-) delete mode 100644 code/modules/admin/newbanjob.dm diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm index 1c5365a6b96..3027864ace6 100644 --- a/code/modules/admin/DB ban/functions.dm +++ b/code/modules/admin/DB ban/functions.dm @@ -17,6 +17,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = var/kickbannedckey //Defines whether this proc should kick the banned person, if they are connected (if banned_mob is defined). //some ban types kick players after this proc passes (tempban, permaban), but some are specific to db_ban, so //they should kick within this proc. + var/isjobban // For job bans, which need to be inserted into the job ban lists switch(bantype) if(BANTYPE_PERMA) bantype_str = "PERMABAN" @@ -31,9 +32,11 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = bantype_str = "JOB_PERMABAN" duration = -1 bantype_pass = 1 + isjobban = 1 if(BANTYPE_JOB_TEMP) bantype_str = "JOB_TEMPBAN" bantype_pass = 1 + isjobban = 1 if(BANTYPE_APPEARANCE) bantype_str = "APPEARANCE_BAN" duration = -1 @@ -134,11 +137,15 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = if(banned_mob && banned_mob.client && banned_mob.client.ckey == banckey) del(banned_mob.client) + if(isjobban) + jobban_client_fullban(ckey, job) + datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "") if(!check_rights(R_BAN)) return var/bantype_str + var/isjobban // For job bans, which need to be removed from the job ban lists if(bantype) var/bantype_pass = 0 switch(bantype) @@ -151,9 +158,11 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "") if(BANTYPE_JOB_PERMA) bantype_str = "JOB_PERMABAN" bantype_pass = 1 + isjobban = 1 if(BANTYPE_JOB_TEMP) bantype_str = "JOB_TEMPBAN" bantype_pass = 1 + isjobban = 1 if(BANTYPE_APPEARANCE) bantype_str = "APPEARANCE_BAN" bantype_pass = 1 @@ -206,6 +215,8 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "") return DB_ban_unban_by_id(ban_id) + if(isjobban) + jobban_unban_client(ckey, job) datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) @@ -215,18 +226,20 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) to_chat(usr, "Cancelled") return - var/DBQuery/query = dbcon.NewQuery("SELECT ckey, duration, reason FROM [format_table_name("ban")] WHERE id = [banid]") + var/DBQuery/query = dbcon.NewQuery("SELECT ckey, duration, reason, job FROM [format_table_name("ban")] WHERE id = [banid]") query.Execute() var/eckey = usr.ckey //Editing admin ckey var/pckey //(banned) Player ckey var/duration //Old duration var/reason //Old reason + var/job //Old job if(query.NextRow()) pckey = query.item[1] duration = query.item[2] reason = query.item[3] + job = query.item[4] else to_chat(usr, "Invalid ban id. Contact the database admin") return @@ -259,6 +272,8 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) if("unban") if(alert("Unban [pckey]?", "Unban?", "Yes", "No") == "Yes") DB_ban_unban_by_id(banid) + if(job && length(job)) + jobban_unban_client(pckey, job) return else to_chat(usr, "Cancelled") @@ -396,7 +411,6 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) output += "

" output += " Match(min. 3 characters to search by key or ip, and 7 to search by cid)
" output += "" - output += "Please note that all jobban bans or unbans are in-effect the following round.
" output += "This search shows only last 100 bans." if(adminckey || playerckey || playerip || playercid || dbbantype) diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm index 73d6bf40fba..1f385093683 100644 --- a/code/modules/admin/banjob.dm +++ b/code/modules/admin/banjob.dm @@ -1,38 +1,48 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 var/jobban_runonce // Updates legacy bans with new info -var/jobban_keylist[0] //to store the keys & ranks +var/jobban_keylist[0] // Linear list of jobban strings, kept around for the legacy system +var/jobban_assoclist[0] // Associative list, for efficiency + +// Matches string-based jobbans into ckey, rank, and reason groups +var/regex/jobban_regex = regex("(\[\\S]+) - (\[^#]+\[^# ])(?: ## (.+))?") + +/proc/jobban_assoc_insert(ckey, rank, reason) + if(!ckey || !rank) + return + if(!jobban_assoclist[ckey]) + jobban_assoclist[ckey] = list() + jobban_assoclist[ckey][rank] = reason || "Reason Unspecified" /proc/jobban_fullban(mob/M, rank, reason) - if(!M || !M.key) return + if(!M || !M.key) + return jobban_keylist.Add(text("[M.ckey] - [rank] ## [reason]")) - jobban_savebanfile() + jobban_assoc_insert(M.ckey, rank, reason) + if(config.ban_legacy_system) + jobban_savebanfile() /proc/jobban_client_fullban(ckey, rank) - if(!ckey || !rank) return + if(!ckey || !rank) + return jobban_keylist.Add(text("[ckey] - [rank]")) - jobban_savebanfile() + jobban_assoc_insert(ckey, rank) + if(config.ban_legacy_system) + jobban_savebanfile() //returns a reason if M is banned from rank, returns 0 otherwise /proc/jobban_isbanned(mob/M, rank) - if(M && rank) + if(!M || !rank) + return 0 - //if(_jobban_isbanned(M, rank)) return "Reason Unspecified" //for old jobban - if(guest_jobbans(rank)) - if(config.guest_jobban && IsGuestKey(M.key)) - return "Guest Job-ban" -// if(config.usewhitelist && !check_whitelist(M)) -// return "Karma Job" + if(config.guest_jobban && guest_jobbans(rank)) + if(IsGuestKey(M.key)) + return "Guest Job-ban" - for(var/s in jobban_keylist) - if( findtext(s,"[M.ckey] - [rank]") == 1 ) - var/startpos = findtext(s, "## ")+3 - if(startpos && startpos Now()") + tempbans.Execute() - while(query.NextRow()) - var/ckey = query.item[1] - var/job = query.item[2] - - jobban_keylist.Add("[ckey] - [job]") - - //Job tempbans - var/DBQuery/query1 = dbcon.NewQuery("SELECT ckey, job FROM [format_table_name("ban")] WHERE bantype = 'JOB_TEMPBAN' AND isnull(unbanned) AND expiration_time > Now()") - query1.Execute() - - while(query1.NextRow()) - var/ckey = query1.item[1] - var/job = query1.item[2] + while(TRUE) + var/ckey + var/job + if(permabans.NextRow()) + ckey = permabans.item[1] + job = permabans.item[2] + else if(tempbans.NextRow()) + ckey = tempbans.item[1] + job = tempbans.item[2] + else + break jobban_keylist.Add("[ckey] - [job]") + jobban_assoc_insert(ckey, job) /proc/jobban_savebanfile() var/savefile/S=new("data/job_full.ban") - to_chat(S["keys[0]"], jobban_keylist) + S["keys[0]"] << jobban_keylist /proc/jobban_unban(mob/M, rank) jobban_remove("[M.ckey] - [rank]") - jobban_savebanfile() +/proc/jobban_unban_client(ckey, rank) + jobban_remove("[ckey] - [rank]") /proc/ban_unban_log_save(var/formatted_log) text2file(formatted_log,"data/ban_unban_log.txt") @@ -106,7 +125,18 @@ DEBUG /proc/jobban_remove(X) for(var/i = 1; i <= length(jobban_keylist); i++) if( findtext(jobban_keylist[i], "[X]") ) + // This need to be here, instead of jobban_unban, due to direct calls to jobban_remove + if(jobban_regex.Find(X)) + var/ckey = jobban_regex.group[1] + var/rank = jobban_regex.group[2] + if(jobban_assoclist[ckey] && jobban_assoclist[ckey][rank]) + jobban_assoclist[ckey] -= rank + else + log_debug("Attempted to remove non-existent job ban: [X]") + else + log_debug("Failed to remove malformed job ban from associative list: [X]") jobban_keylist.Remove(jobban_keylist[i]) - jobban_savebanfile() + if(config.ban_legacy_system) + jobban_savebanfile() return 1 return 0 diff --git a/code/modules/admin/newbanjob.dm b/code/modules/admin/newbanjob.dm deleted file mode 100644 index 1fea0fbea3d..00000000000 --- a/code/modules/admin/newbanjob.dm +++ /dev/null @@ -1,274 +0,0 @@ -var/savefile/Banlistjob - - -/proc/_jobban_isbanned(var/client/clientvar, var/rank) - if(!clientvar) return 1 - ClearTempbansjob() - var/id = clientvar.computer_id - var/key = clientvar.ckey - if(guest_jobbans(rank)) - if(config.guest_jobban && IsGuestKey(key)) - return 1 - Banlistjob.cd = "/base" - if(Banlistjob.dir.Find("[key][id][rank]")) - return 1 - - Banlistjob.cd = "/base" - for(var/A in Banlistjob.dir) - Banlistjob.cd = "/base/[A]" - if((id == Banlistjob["id"] || key == Banlistjob["key"]) && rank == Banlistjob["rank"]) - return 1 - return 0 - -/proc/LoadBansjob() - - Banlistjob = new("data/job_fullnew.bdb") - log_admin("Loading Banlistjob") - - if(!length(Banlistjob.dir)) log_admin("Banlistjob is empty.") - - if(!Banlistjob.dir.Find("base")) - log_admin("Banlistjob missing base dir.") - Banlistjob.dir.Add("base") - Banlistjob.cd = "/base" - else if(Banlistjob.dir.Find("base")) - Banlistjob.cd = "/base" - - ClearTempbansjob() - return 1 - -/proc/ClearTempbansjob() - UpdateTime() - - Banlistjob.cd = "/base" - for(var/A in Banlistjob.dir) - Banlistjob.cd = "/base/[A]" - //if(!Banlistjob["key"] || !Banlistjob["id"]) - // RemoveBanjob(A, "full") - // log_admin("Invalid Ban.") - // message_admins("Invalid Ban.") - // continue - - if(!Banlistjob["temp"]) continue - if(CMinutes >= Banlistjob["minutes"]) RemoveBanjob(A) - - return 1 - - -/proc/AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, rank) - UpdateTime() - var/bantimestamp - if(temp) - UpdateTime() - bantimestamp = CMinutes + minutes - if(rank == "Heads") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Personnel") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Captain") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Security") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer") - return 1 - if(rank == "Security") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Security") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Warden") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Detective") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Security Officer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Cyborg") - return 1 - if(rank == "Engineering") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Station Engineer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Life Support Specialist") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Cyborg") - return 1 - if(rank == "Research") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Scientist") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Geneticist") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director") - return 1 - if(rank == "Medical") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Geneticist") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Medical Doctor") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chemist") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Cyborg") - return 1 - if(rank == "CE_Station_Engineer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Station Engineer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer") - return 1 - if(rank == "CE_Atmospheric_Tech") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Life Support Specialist") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer") - return 1 - if(rank == "CE_Shaft_Miner") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Shaft Miner") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer") - return 1 - if(rank == "Chemist_RD_CMO") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chemist") - return 1 - if(rank == "Geneticist_RD_CMO") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Geneticist") - return 1 - if(rank == "MD_CMO") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Medical Doctor") - return 1 - if(rank == "Scientist_RD") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Scientist") - return 1 - if(rank == "AI_Cyborg") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Cyborg") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "AI") - return 1 - if(rank == "Detective_HoS") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Detective") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Security") - return 1 - if(rank == "Virologist_RD_CMO") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Virologist") - return 1 - - Banlistjob.cd = "/base" - if( Banlistjob.dir.Find("[ckey][computerid][rank]") ) - to_chat(usr, text("\red Banjob already exists.")) - return 0 - else - Banlistjob.dir.Add("[ckey][computerid][rank]") - Banlistjob.cd = "/base/[ckey][computerid][rank]" - to_chat(Banlistjob["key"], ckey) - to_chat(Banlistjob["id"], computerid) - to_chat(Banlistjob["rank"], rank) - to_chat(Banlistjob["reason"], reason) - to_chat(Banlistjob["bannedby"], bannedby) - to_chat(Banlistjob["temp"], temp) - if(temp) - to_chat(Banlistjob["minutes"], bantimestamp) - - return 1 - -/proc/RemoveBanjob(foldername) - var/key - var/id - var/rank - Banlistjob.cd = "/base/[foldername]" - Banlistjob["key"] >> key - Banlistjob["id"] >> id - Banlistjob["rank"] >> rank - Banlistjob.cd = "/base" - - if(!Banlistjob.dir.Remove(foldername)) return 0 - - if(!usr) - log_admin("Banjob Expired: [key]") - message_admins("Banjob Expired: [key]") - else - log_admin("[key_name_admin(usr)] unjobbanned [key] from [rank]") - message_admins("[key_name_admin(usr)] unjobbanned:[key] from [rank]") - ban_unban_log_save("[key_name_admin(usr)] unjobbanned [key] from [rank]") - feedback_inc("ban_job_unban",1) - feedback_add_details("ban_job_unban","- [rank]") - - for(var/A in Banlistjob.dir) - Banlistjob.cd = "/base/[A]" - if((key == Banlistjob["key"] || id == Banlistjob["id"]) && (rank == Banlistjob["rank"])) - Banlistjob.cd = "/base" - Banlistjob.dir.Remove(A) - continue - - return 1 - -/proc/GetBanExpjob(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/unjobbanpanel() - var/count = 0 - var/dat - //var/dat = "
Unban Player: \blue(U) = Unban , (E) = Edit Ban\green (Total
" - Banlistjob.cd = "/base" - for(var/A in Banlistjob.dir) - count++ - Banlistjob.cd = "/base/[A]" - dat += text("") - - dat += "
(U) Key: [Banlistjob["key"]] Rank: [Banlistjob["rank"]] ([Banlistjob["temp"] ? "[GetBanExpjob(Banlistjob["minutes"]) ? GetBanExpjob(Banlistjob["minutes"]) : "Removal pending" ]" : "Permaban"])(By: [Banlistjob["bannedby"]])(Reason: [Banlistjob["reason"]])
" - dat = "
Bans: (U) = Unban , - ([count] Bans)
[dat]" - usr << browse(dat, "window=unbanp;size=875x400") - -/*/datum/admins/proc/permjobban(ckey, computerid, reason, bannedby, temp, minutes, rank) - if(AddBanjob(ckey, computerid, reason, usr.ckey, 0, 0, job)) - to_chat(M, "\redYou have been banned from [job] by [usr.client.ckey].\nReason: [reason].") - to_chat(M, "\red This is a permanent ban.") - if(config.banappeals) - to_chat(M, "\red To try to resolve this matter head to [config.banappeals]") - else - to_chat(M, "\red No ban appeals URL has been set.") - log_admin("[usr.client.ckey] has banned from [job] [ckey].\nReason: [reason]\nThis is a permanent ban.") - message_admins("\blue[usr.client.ckey] has banned from [job] [ckey].\nReason: [reason]\nThis is a permanent ban.") -/datum/admins/proc/timejobban(ckey, computerid, reason, bannedby, temp, minutes, rank) - if(AddBanjob(ckey, computerid, reason, usr.ckey, 1, mins, job)) - to_chat(M, "\redYou have been jobbanned from [job] by [usr.client.ckey].\nReason: [reason].") - to_chat(M, "\red This is a temporary ban, it will be removed in [mins] minutes.") - if(config.banappeals) - to_chat(M, "\red To try to resolve this matter head to [config.banappeals]") - else - to_chat(M, "\red No ban appeals URL has been set.") - log_admin("[usr.client.ckey] has jobbanned from [job] [ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") - message_admins("\blue[usr.client.ckey] has banned from [job] [ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")*/ -//////////////////////////////////// DEBUG //////////////////////////////////// - -/proc/CreateBansjob() - - UpdateTime() - - var/i - var/last - - for(i=0, i<1001, i++) - var/a = pick(1,0) - var/b = pick(1,0) - if(b) - Banlistjob.cd = "/base" - Banlistjob.dir.Add("trash[i]trashid[i]") - Banlistjob.cd = "/base/trash[i]trashid[i]" - to_chat(Banlistjob["key"], "trash[i]") - else - Banlistjob.cd = "/base" - Banlistjob.dir.Add("[last]trashid[i]") - Banlistjob.cd = "/base/[last]trashid[i]" - to_chat(Banlistjob["key"], last) - to_chat(Banlistjob["id"], "trashid[i]") - to_chat(Banlistjob["reason"], "Trashban[i].") - to_chat(Banlistjob["temp"], a) - to_chat(Banlistjob["minutes"], CMinutes + rand(1,2000)) - to_chat(Banlistjob["bannedby"], "trashmin") - last = "trash[i]" - - Banlistjob.cd = "/base" - -/proc/ClearAllBansjob() - Banlistjob.cd = "/base" - for(var/A in Banlistjob.dir) - RemoveBanjob(A, "full") diff --git a/paradise.dme b/paradise.dme index 3f06e7152d2..4e8f65efe4d 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1007,7 +1007,6 @@ #include "code\modules\admin\IsBanned.dm" #include "code\modules\admin\machine_upgrade.dm" #include "code\modules\admin\NewBan.dm" -#include "code\modules\admin\newbanjob.dm" #include "code\modules\admin\player_panel.dm" #include "code\modules\admin\secrets.dm" #include "code\modules\admin\sql_notes.dm"