mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-20 20:37:34 +01:00
Mirroring Bans
No more "New ban for every attempted dodge." Mirrored bans are linked to an associative table, and then checked against the referenced original ban. Cuts down on the amount of clutter that exists.
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
#define BAD_CKEY 1
|
||||
#define BAD_IP 2
|
||||
#define BAD_CID 4
|
||||
|
||||
/proc/handle_ban_mirroring(var/ckey, var/address, var/computer_id, var/ban_id)
|
||||
if (!ckey || !address || !computer_id || !ban_id)
|
||||
return
|
||||
|
||||
establish_db_connection()
|
||||
|
||||
if (!dbcon.IsConnected())
|
||||
error("Ban database connection failure while attempting to mirror. Key passed for mirror handling: [ckey].")
|
||||
log_misc("Ban database connection failure while attempting to mirror. Key passed for mirror handling: [ckey].")
|
||||
return
|
||||
|
||||
ckey = ckey(ckey)
|
||||
|
||||
var/bad_data = BAD_CKEY|BAD_IP|BAD_CID
|
||||
|
||||
var/DBQuery/original_ban = dbcon.NewQuery("SELECT ckey, ip, computerid FROM ss13_ban WHERE id = :ban_id")
|
||||
original_ban.Execute(list(":ban_id" = ban_id))
|
||||
|
||||
if (original_ban.NextRow())
|
||||
var/original_ckey = original_ban.item[1]
|
||||
var/original_address = original_ban.item[2]
|
||||
var/original_computerid = original_ban.item[3]
|
||||
if (original_ckey == ckey)
|
||||
bad_data &= ~BAD_CKEY
|
||||
if (original_address == address)
|
||||
bad_data &= ~BAD_IP
|
||||
if (original_computerid == computer_id)
|
||||
bad_data &= ~BAD_CID
|
||||
|
||||
if (bad_data)
|
||||
var/DBQuery/mirrored_bans = dbcon.NewQuery("SELECT player_ckey, ban_mirror_ip, ban_mirror_computerid FROM ss13_ban_mirrors WHERE ban_id = :ban_id")
|
||||
mirrored_bans.Execute(list(":ban_id" = ban_id))
|
||||
|
||||
while (mirrored_bans.NextRow())
|
||||
var/mirrored_ckey = mirrored_bans.item[1]
|
||||
var/mirrored_address = mirrored_bans.item[2]
|
||||
var/mirrored_computerid = mirrored_bans.item[3]
|
||||
|
||||
if ((bad_data & BAD_CKEY) && mirrored_ckey == ckey)
|
||||
bad_data &= ~BAD_CKEY
|
||||
if ((bad_data & BAD_IP) && mirrored_address == address)
|
||||
bad_data &= ~BAD_IP
|
||||
if ((bad_data & BAD_CID) && mirrored_computerid == computer_id)
|
||||
bad_data &= ~BAD_CID
|
||||
|
||||
if (bad_data)
|
||||
var/DBQuery/new_mirror = dbcon.NewQuery("INSERT INTO ss13_ban_mirrors (ban_id, player_ckey, ban_mirror_ip, ban_mirror_computerid, ban_mirror_datetime) VALUES (:ban_id, :ckey, :address, :computerid, NOW())")
|
||||
new_mirror.Execute(":ban_id" = ban_id, ":ckey" = ckey, ":address" = address, ":computerid" = computer_id)
|
||||
|
||||
log_misc("Mirrored ban #[ban_id] for player [ckey] from [address]-[computer_id].")
|
||||
|
||||
return
|
||||
|
||||
else
|
||||
error("No ban retreived while attempting to handle ban mirroring. Passed ban_id: [ban_id], ckey: [ckey].")
|
||||
log_misc("No ban retreived while attempting to handle ban mirroring. Passed ban_id: [ban_id], ckey: [ckey].")
|
||||
return
|
||||
|
||||
#undef BAD_CID
|
||||
#undef BAD_IP
|
||||
#undef BAD_CKEY
|
||||
@@ -473,6 +473,19 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
|
||||
output += "<tr bgcolor='[dcolor]'>"
|
||||
output += "<td align='center' colspan='5' bgcolor=''><b>EXPIRED at [expiration]</b></td>"
|
||||
output += "</tr>"
|
||||
if (bantype in list("PERMABAN", "TEMPBAN"))
|
||||
var/mirror_count = 0
|
||||
var/DBQuery/get_mirrors = dbcon.NewQuery("SELECT ban_mirror_id FROM ss13_ban_mirrors WHERE ban_id = :ban_id")
|
||||
get_mirrors.Execute(list(":ban_id" = text2num(banid)))
|
||||
|
||||
while (get_mirrors.NextRow())
|
||||
mirror_count++
|
||||
|
||||
if (mirror_count)
|
||||
output += "<tr bgcolor='[dcolor]'>"
|
||||
output += "<td align='center' colspan='5' bgcolor=''><b>Ban Mirrored [mirror_count] times!</b></td>"
|
||||
output += "</tr>"
|
||||
|
||||
output += "<tr>"
|
||||
output += "<td colspan='5' bgcolor='white'> </td>"
|
||||
output += "</tr>"
|
||||
|
||||
@@ -52,20 +52,37 @@ world/IsBanned(key,address,computer_id)
|
||||
failedcid = 0
|
||||
cidquery = " OR computerid = '[computer_id]' "
|
||||
|
||||
var/DBQuery/query = dbcon.NewQuery("SELECT ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM ss13_ban WHERE (ckey = '[ckeytext]' [ipquery] [cidquery]) AND (bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)")
|
||||
var/pulled_ban_id = null
|
||||
var/DBQuery/mirror_query = dbcon.NewQuery("SELECT ban_id FROM ss13_ban_mirrors WHERE player_ckey = '[ckeytext]' [address ? "OR ban_mirror_ip = '[address]'" : ""] [computer_id ? "OR ban_mirror_computerid = '[computer_id]'" : ""]")
|
||||
mirror_query.Execute()
|
||||
|
||||
if (mirror_query.NextRow())
|
||||
pulled_ban_id = text2num(mirror_query.item[1])
|
||||
|
||||
var/query_content = ""
|
||||
if (pulled_ban_id)
|
||||
query_content = "SELECT id, ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM ss13_ban WHERE id = '[pulled_ban_id]' AND (bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)"
|
||||
else
|
||||
query_content = "SELECT id, ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM ss13_ban WHERE (ckey = '[ckeytext]' [ipquery] [cidquery]) AND (bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)"
|
||||
|
||||
var/DBQuery/query = dbcon.NewQuery(query_content)
|
||||
|
||||
query.Execute()
|
||||
|
||||
while(query.NextRow())
|
||||
var/pckey = query.item[1]
|
||||
//var/pip = query.item[2]
|
||||
//var/pcid = query.item[3]
|
||||
var/ackey = query.item[4]
|
||||
var/reason = query.item[5]
|
||||
var/expiration = query.item[6]
|
||||
var/duration = query.item[7]
|
||||
var/bantime = query.item[8]
|
||||
var/bantype = query.item[9]
|
||||
var/ban_id = text2num(query.item[1])
|
||||
var/pckey = query.item[2]
|
||||
var/pip = query.item[3]
|
||||
var/pcid = query.item[4]
|
||||
var/ackey = query.item[5]
|
||||
var/reason = query.item[6]
|
||||
var/expiration = query.item[7]
|
||||
var/duration = query.item[8]
|
||||
var/bantime = query.item[9]
|
||||
var/bantype = query.item[10]
|
||||
|
||||
if (pckey != ckeytext || (address && pip != address) || (computer_id && pcid != computer_id))
|
||||
handle_ban_mirroring(key, address, computer_id, ban_id)
|
||||
|
||||
var/expires = ""
|
||||
if(text2num(duration) > 0)
|
||||
@@ -82,4 +99,3 @@ world/IsBanned(key,address,computer_id)
|
||||
return ..() //default pager ban stuff
|
||||
#endif
|
||||
#undef OVERRIDE_BAN_SYSTEM
|
||||
|
||||
|
||||
Reference in New Issue
Block a user