datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = -1, var/reason, var/job = "", var/rounds = 0, var/banckey = null, var/autobanner = 0, var/autoip = null, var/autocid = null, var/mirrorid = null) if(!check_rights(R_MOD,0) && !check_rights(R_BAN) && !autobanner) return establish_db_connection() if(!dbcon.IsConnected()) return var/serverip = "[world.internet_address]:[world.port]" var/bantype_pass = 0 var/bantype_str switch(bantype) if(BANTYPE_PERMA) bantype_str = "PERMABAN" duration = -1 bantype_pass = 1 if(BANTYPE_TEMP) bantype_str = "TEMPBAN" bantype_pass = 1 if(BANTYPE_JOB_PERMA) bantype_str = "JOB_PERMABAN" duration = -1 bantype_pass = 1 if(BANTYPE_JOB_TEMP) bantype_str = "JOB_TEMPBAN" bantype_pass = 1 if( !bantype_pass ) return if( !istext(reason) ) return if( !isnum(duration) ) return var/ckey var/computerid var/ip if(ismob(banned_mob)) ckey = banned_mob.ckey if(banned_mob.client) computerid = banned_mob.client.computer_id ip = banned_mob.client.address else if(banckey) ckey = ckey(banckey) if(!autobanner) var/DBQuery/query = dbcon.NewQuery("SELECT id, ip, computerid FROM ss13_player WHERE ckey = '[ckey]'") query.Execute() var/validckey = 0 if(query.NextRow()) validckey = 1 if(!ip) ip = query.item[2] if(!computerid) computerid = query.item[3] if(!validckey) if(!banned_mob || (banned_mob && !IsGuestKey(banned_mob.key))) message_admins("[key_name_admin(usr)] attempted to ban [ckey], but [ckey] has not been seen yet. Please only ban actual players.",1) return var/a_ckey var/a_computerid var/a_ip if(src.owner && istype(src.owner, /client)) a_ckey = src.owner:ckey a_computerid = src.owner:computer_id a_ip = src.owner:address if(autobanner) a_ckey = "Adminbot" a_computerid = "" a_ip = "[world.internet_address]" computerid = autocid ip = autoip var/who for(var/client/C in clients) if(!who) who = "[C]" else who += ", [C]" var/adminwho for(var/client/C in admins) if(!adminwho) adminwho = "[C]" else adminwho += ", [C]" reason = sql_sanitize_text(reason) message_admins("Mirror ID: [mirrorid ? mirrorid : "NOT A MIRROR!"].") world.log << "Mirror ID: [mirrorid ? mirrorid : "NOT A MIRROR!"]." var/sql = "INSERT INTO ss13_ban (`id`,`mirrorid`,`bantime`,`serverip`,`bantype`,`reason`,`job`,`duration`,`rounds`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`,`edits`,`unbanned`,`unbanned_datetime`,`unbanned_ckey`,`unbanned_computerid`,`unbanned_ip`) VALUES (null, [mirrorid ? "'[mirrorid]'" : "null"], Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], [(rounds)?"[rounds]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', '[ip]', '[a_ckey]', '[a_computerid]', '[a_ip]', '[who]', '[adminwho]', '', null, null, null, null, null)" var/DBQuery/query_insert = dbcon.NewQuery(sql) query_insert.Execute() if (query_insert.ErrorMsg()) message_admins("ERROR: [query_insert.ErrorMsg()].") usr << "\blue Ban saved to database." message_admins("[autobanner ? "Adminbot" : key_name_admin(usr)] has added a [bantype_str] for [ckey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database.",1) datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "") if(!check_rights(R_BAN)) return var/bantype_str if(bantype) var/bantype_pass = 0 switch(bantype) if(BANTYPE_PERMA) bantype_str = "PERMABAN" bantype_pass = 1 if(BANTYPE_TEMP) bantype_str = "TEMPBAN" bantype_pass = 1 if(BANTYPE_JOB_PERMA) bantype_str = "JOB_PERMABAN" bantype_pass = 1 if(BANTYPE_JOB_TEMP) bantype_str = "JOB_TEMPBAN" bantype_pass = 1 if(BANTYPE_ANY_FULLBAN) bantype_str = "ANY" bantype_pass = 1 if( !bantype_pass ) return var/bantype_sql if(bantype_str == "ANY") bantype_sql = "(bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now() ) )" else bantype_sql = "bantype = '[bantype_str]'" var/sql = "SELECT id, mirrorid FROM ss13_ban WHERE ckey = '[ckey]' AND [bantype_sql] AND (unbanned is null OR unbanned = false)" if(job) sql += " AND job = '[job]'" establish_db_connection() if(!dbcon.IsConnected()) return var/ban_id var/mirrorid var/ban_number = 0 //failsafe var/DBQuery/query = dbcon.NewQuery(sql) query.Execute() while(query.NextRow()) ban_id = query.item[1] mirrorid = text2num(query.item[2]) ban_number++; if(ban_number == 0) usr << "\red Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin." return if(ban_number > 1) usr << "\red Database update failed due to multiple bans fitting the search criteria. Note down the ckey, job and current time and contact the database admin." return if(istext(ban_id)) ban_id = text2num(ban_id) if(!isnum(ban_id)) usr << "\red Database update failed due to a ban ID mismatch. Contact the database admin." return if (mirrorid) if (alert(usr, "This ban is mirrored from another ban. Do you wish to lift the original, or this one specifically?", "Original Ban?", "Lift The Original", "Lift This One") == "Lift The Original") ban_id = mirrorid var/mirrored = 0 var/DBQuery/mirrorquery = dbcon.NewQuery("SELECT id FROM ss13_ban WHERE mirrorid = '[ban_id]' AND (unbanned is null OR unbanned = false);") mirrorquery.Execute() if (mirrorquery.ErrorMsg()) message_admins("Error: [mirrorquery.ErrorMsg()].") while (mirrorquery.NextRow()) mirrored++ var/liftmirrored = 0 if (mirrored) if (alert(usr, "Do you wish to lift [mirrored] mirrored ban(s) tied to this one?", "Mirrored Bans", "Yes", "No") == "Yes") liftmirrored = 1 DB_ban_unban_by_id(ban_id, liftmirrored) datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) if(!check_rights(R_BAN)) return if(!isnum(banid) || !istext(param)) usr << "Cancelled" return var/DBQuery/query = dbcon.NewQuery("SELECT ckey, duration, reason FROM ss13_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 if(query.NextRow()) pckey = query.item[1] duration = query.item[2] reason = query.item[3] else usr << "Invalid ban id. Contact the database admin" return reason = sql_sanitize_text(reason) var/value switch(param) if("reason") if(!value) value = input("Insert the new reason for [pckey]'s ban", "New Reason", "[reason]", null) as null|text value = sql_sanitize_text(value) if(!value) usr << "Cancelled" return var/DBQuery/update_query = dbcon.NewQuery("UPDATE ss13_ban SET reason = '[value]', edits = CONCAT(edits,'- [eckey] changed ban reason from \\\"[reason]\\\" to \\\"[value]\\\"
') WHERE id = [banid]") update_query.Execute() message_admins("[key_name_admin(usr)] has edited a ban for [pckey]'s reason from [reason] to [value]",1) if("duration") if(!value) value = input("Insert the new duration (in minutes) for [pckey]'s ban", "New Duration", "[duration]", null) as null|num if(!isnum(value) || !value) usr << "Cancelled" return var/DBQuery/update_query = dbcon.NewQuery("UPDATE ss13_ban SET duration = [value], edits = CONCAT(edits,'- [eckey] changed ban duration from [duration] to [value]
'), expiration_time = DATE_ADD(bantime, INTERVAL [value] MINUTE) WHERE id = [banid]") message_admins("[key_name_admin(usr)] has edited a ban for [pckey]'s duration from [duration] to [value]",1) update_query.Execute() if("unban") if(alert("Unban [pckey]?", "Unban?", "Yes", "No") == "Yes") DB_ban_unban_by_id(banid) return else usr << "Cancelled" return else usr << "Cancelled" return datum/admins/proc/DB_ban_unban_by_id(var/id, var/liftmirrored = 0) if(!check_rights(R_BAN)) return var/sql = "SELECT ckey FROM ss13_ban WHERE id = [id]" establish_db_connection() if(!dbcon.IsConnected()) return var/ban_number = 0 //failsafe var/pckey var/DBQuery/query = dbcon.NewQuery(sql) query.Execute() while(query.NextRow()) pckey = query.item[1] ban_number++; if(ban_number == 0) usr << "\red Database update failed due to a ban id not being present in the database." return if(ban_number > 1) usr << "\red Database update failed due to multiple bans having the same ID. Contact the database admin." return if(!src.owner || !istype(src.owner, /client)) return var/unban_ckey = src.owner:ckey var/unban_computerid = src.owner:computer_id var/unban_ip = src.owner:address var/sql_update = "UPDATE ss13_ban SET unbanned = 1, unbanned_datetime = Now(), unbanned_ckey = '[unban_ckey]', unbanned_computerid = '[unban_computerid]', unbanned_ip = '[unban_ip]' WHERE id = [id]" message_admins("[key_name_admin(usr)] has lifted [pckey]'s ban.",1) var/DBQuery/query_update = dbcon.NewQuery(sql_update) query_update.Execute() if (liftmirrored) var/DBQuery/updatemirrored = dbcon.NewQuery("UPDATE ss13_ban SET unbanned = 1, unbanned_datetime = Now(), unbanned_ckey = '[unban_ckey]', unbanned_computerid = '[unban_computerid]', unbanned_ip = '[unban_ip]' WHERE mirrorid = [id];") updatemirrored.Execute() if (updatemirrored.ErrorMsg()) message_admins("Error: [updatemirrored.ErrorMsg()].") /client/proc/DB_ban_panel() set category = "Admin" set name = "Banning Panel" set desc = "Edit admin permissions" if(!holder) return holder.DB_ban_panel() /datum/admins/proc/DB_ban_panel(var/playerckey = null, var/adminckey = null) if(!usr.client) return if(!check_rights(R_BAN)) return establish_db_connection() if(!dbcon.IsConnected()) usr << "\red Failed to establish database connection" return var/output = "
" output += "" output += "" output += "" output += "
" output += "

Banning panel

" output += "
" output += "
Add custom ban: (ONLY use this if you can't ban through any other method)" output += "" output += "" output += "" output += "" output += "" output += "
Ban type:Ckey:
Duration: Job:
" output += "Reason:

" output += "" output += "
" output += "
" output += "
Search: " output += "" output += "Ckey: " output += "Admin ckey: " output += "" output += "
" output += "Please note that all jobban bans or unbans are in-effect the following round." if(adminckey || playerckey) var/blcolor = "#ffeeee" //banned light var/bdcolor = "#ffdddd" //banned dark var/ulcolor = "#eeffee" //unbanned light var/udcolor = "#ddffdd" //unbanned dark output += "" output += "" output += "" output += "" output += "" output += "" output += "" output += "" adminckey = ckey(adminckey) playerckey = ckey(playerckey) var/adminsearch = "" var/playersearch = "" if(adminckey) adminsearch = "AND a_ckey = '[adminckey]' " if(playerckey) playersearch = "AND ckey = '[playerckey]' " var/DBQuery/select_query = dbcon.NewQuery("SELECT id, bantime, bantype, reason, job, duration, expiration_time, ckey, a_ckey, unbanned, unbanned_ckey, unbanned_datetime, edits FROM ss13_ban WHERE 1 [playersearch] [adminsearch] ORDER BY bantime DESC") select_query.Execute() while(select_query.NextRow()) var/banid = select_query.item[1] var/bantime = select_query.item[2] var/bantype = select_query.item[3] var/reason = select_query.item[4] var/job = select_query.item[5] var/duration = select_query.item[6] var/expiration = select_query.item[7] var/ckey = select_query.item[8] var/ackey = select_query.item[9] var/unbanned = select_query.item[10] var/unbanckey = select_query.item[11] var/unbantime = select_query.item[12] var/edits = select_query.item[13] var/lcolor = blcolor var/dcolor = bdcolor if(unbanned) lcolor = ulcolor dcolor = udcolor var/typedesc ="" switch(bantype) if("PERMABAN") typedesc = "PERMABAN" if("TEMPBAN") typedesc = "TEMPBAN
([duration] minutes [(unbanned) ? "" : "(Edit))"]
Expires [expiration]
" if("JOB_PERMABAN") typedesc = "JOBBAN
([job])" if("JOB_TEMPBAN") typedesc = "TEMP JOBBAN
([job])
([duration] minutes
Expires [expiration]" output += "
" output += "" output += "" output += "" output += "" output += "" output += "" output += "" output += "" output += "" if(edits) output += "" output += "" output += "" output += "" output += "" output += "" if(unbanned) output += "" output += "" output += "" output += "" output += "" output += "" output += "
TYPECKEYTIME APPLIEDADMINOPTIONS
[typedesc][ckey][bantime][ackey][(unbanned) ? "" : "Unban"]
Reason: [(unbanned) ? "" : "(Edit)"] \"[reason]\"
EDITS
[edits]
UNBANNED by admin [unbanckey] on [unbantime]
 
" usr << browse(output,"window=lookupbans;size=900x500")