diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index c298460b2c..b6b750fbf4 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -202,25 +202,6 @@ SUBSYSTEM_DEF(dbcore) -/datum/controller/subsystem/dbcore/proc/QuerySelect(list/querys, warn = FALSE, qdel = FALSE) - if (!islist(querys)) - if (!istype(querys, /datum/DBQuery)) - CRASH("Invalid query passed to QuerySelect: [querys]") - querys = list(querys) - - for (var/thing in querys) - var/datum/DBQuery/query = thing - if (warn) - INVOKE_ASYNC(query, /datum/DBQuery.proc/warn_execute) - else - INVOKE_ASYNC(query, /datum/DBQuery.proc/Execute) - - for (var/thing in querys) - var/datum/DBQuery/query = thing - UNTIL(!query.in_progress) - if (qdel) - qdel(query) - /* Takes a list of rows (each row being an associated list of column => value) and inserts them via a single mass query. Rows missing columns present in other rows will resolve to SQL NULL diff --git a/code/controllers/subsystem/stickyban.dm b/code/controllers/subsystem/stickyban.dm index 0c71777bc0..c61ea9943e 100644 --- a/code/controllers/subsystem/stickyban.dm +++ b/code/controllers/subsystem/stickyban.dm @@ -60,15 +60,10 @@ SUBSYSTEM_DEF(stickyban) /datum/controller/subsystem/stickyban/proc/Populatedbcache() var/newdbcache = list() //so if we runtime or the db connection dies we don't kill the existing cache - // var/datum/db_query/query_stickybans = SSdbcore.NewQuery("SELECT ckey, reason, banning_admin, datetime FROM [format_table_name("stickyban")] ORDER BY ckey") - // var/datum/db_query/query_ckey_matches = SSdbcore.NewQuery("SELECT stickyban, matched_ckey, first_matched, last_matched, exempt FROM [format_table_name("stickyban_matched_ckey")] ORDER BY first_matched") - // var/datum/db_query/query_cid_matches = SSdbcore.NewQuery("SELECT stickyban, matched_cid, first_matched, last_matched FROM [format_table_name("stickyban_matched_cid")] ORDER BY first_matched") - // var/datum/db_query/query_ip_matches = SSdbcore.NewQuery("SELECT stickyban, INET_NTOA(matched_ip), first_matched, last_matched FROM [format_table_name("stickyban_matched_ip")] ORDER BY first_matched") - - var/datum/DBQuery/query_stickybans = SSdbcore.NewQuery("SELECT ckey, reason, banning_admin, datetime FROM [format_table_name("stickyban")] ORDER BY ckey") - var/datum/DBQuery/query_ckey_matches = SSdbcore.NewQuery("SELECT stickyban, matched_ckey, first_matched, last_matched, exempt FROM [format_table_name("stickyban_matched_ckey")] ORDER BY first_matched") - var/datum/DBQuery/query_cid_matches = SSdbcore.NewQuery("SELECT stickyban, matched_cid, first_matched, last_matched FROM [format_table_name("stickyban_matched_cid")] ORDER BY first_matched") - var/datum/DBQuery/query_ip_matches = SSdbcore.NewQuery("SELECT stickyban, INET_NTOA(matched_ip), first_matched, last_matched FROM [format_table_name("stickyban_matched_ip")] ORDER BY first_matched") + var/datum/db_query/query_stickybans = SSdbcore.NewQuery("SELECT ckey, reason, banning_admin, datetime FROM [format_table_name("stickyban")] ORDER BY ckey") + var/datum/db_query/query_ckey_matches = SSdbcore.NewQuery("SELECT stickyban, matched_ckey, first_matched, last_matched, exempt FROM [format_table_name("stickyban_matched_ckey")] ORDER BY first_matched") + var/datum/db_query/query_cid_matches = SSdbcore.NewQuery("SELECT stickyban, matched_cid, first_matched, last_matched FROM [format_table_name("stickyban_matched_cid")] ORDER BY first_matched") + var/datum/db_query/query_ip_matches = SSdbcore.NewQuery("SELECT stickyban, INET_NTOA(matched_ip), first_matched, last_matched FROM [format_table_name("stickyban_matched_ip")] ORDER BY first_matched") SSdbcore.QuerySelect(list(query_stickybans, query_ckey_matches, query_cid_matches, query_ip_matches)) @@ -161,25 +156,15 @@ SUBSYSTEM_DEF(stickyban) if (!ban["message"]) ban["message"] = "Evasion" - // TODO: USE NEW DB IMPLEMENTATION - var/datum/DBQuery/query_create_stickyban = SSdbcore.NewQuery( - "INSERT IGNORE INTO [format_table_name("stickyban")] (ckey, reason, banning_admin) VALUES ([ckey], [ban["message"]], ban["admin"]))" + var/datum/db_query/query_create_stickyban = SSdbcore.NewQuery( + "INSERT IGNORE INTO [format_table_name("stickyban")] (ckey, reason, banning_admin) VALUES (:ckey, :message, :admin)", + list("ckey" = ckey, "message" = ban["message"], "admin" = ban["admin"]) ) - - if (query_create_stickyban.warn_execute()) + if (!query_create_stickyban.warn_execute()) qdel(query_create_stickyban) return qdel(query_create_stickyban) - // var/datum/db_query/query_create_stickyban = SSdbcore.NewQuery( - // "INSERT IGNORE INTO [format_table_name("stickyban")] (ckey, reason, banning_admin) VALUES (:ckey, :message, :admin)", - // list("ckey" = ckey, "message" = ban["message"], "admin" = ban["admin"]) - // ) - // if (!query_create_stickyban.warn_execute()) - // qdel(query_create_stickyban) - // return - // qdel(query_create_stickyban) - var/list/sqlckeys = list() var/list/sqlcids = list() var/list/sqlips = list() diff --git a/code/modules/admin/stickyban.dm b/code/modules/admin/stickyban.dm index ef0bfe8e70..57487f3144 100644 --- a/code/modules/admin/stickyban.dm +++ b/code/modules/admin/stickyban.dm @@ -32,15 +32,11 @@ return ban["message"] = "[reason]" - if(SSdbcore.Connect()) // todo: second wave - // var/datum/db_query/query_create_stickyban = SSdbcore.NewQuery({" - // INSERT INTO [format_table_name("stickyban")] (ckey, reason, banning_admin) - // VALUES (:ckey, :message, :banning_admin) - // "}, list("ckey" = ckey, "message" = ban["message"], "banning_admin" = usr.ckey)) - var/datum/DBQuery/query_create_stickyban = SSdbcore.NewQuery({" + if(SSdbcore.Connect()) + var/datum/db_query/query_create_stickyban = SSdbcore.NewQuery({" INSERT INTO [format_table_name("stickyban")] (ckey, reason, banning_admin) - VALUES ([ckey], [ban["message"]], [usr.ckey]) - "}) + VALUES (:ckey, :message, :banning_admin) + "}, list("ckey" = ckey, "message" = ban["message"], "banning_admin" = usr.ckey)) if (query_create_stickyban.warn_execute()) ban["fromdb"] = TRUE qdel(query_create_stickyban) @@ -74,19 +70,14 @@ SSstickyban.cache -= ckey if (SSdbcore.Connect()) - // SSdbcore.QuerySelect(list( - // SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban")] WHERE ckey = :ckey", list("ckey" = ckey)), - // SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ckey")] WHERE stickyban = :ckey", list("ckey" = ckey)), - // SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_cid")] WHERE stickyban = :ckey", list("ckey" = ckey)), - // SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ip")] WHERE stickyban = :ckey", list("ckey" = ckey)) - // ), warn = TRUE, qdel = TRUE) SSdbcore.QuerySelect(list( - SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban")] WHERE ckey = [ckey]"), - SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ckey")] WHERE stickyban = [ckey]"), - SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_cid")] WHERE stickyban = [ckey]"), - SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ip")] WHERE stickyban = [ckey]") + SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban")] WHERE ckey = :ckey", list("ckey" = ckey)), + SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ckey")] WHERE stickyban = :ckey", list("ckey" = ckey)), + SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_cid")] WHERE stickyban = :ckey", list("ckey" = ckey)), + SSdbcore.NewQuery("DELETE FROM [format_table_name("stickyban_matched_ip")] WHERE stickyban = :ckey", list("ckey" = ckey)) ), warn = TRUE, qdel = TRUE) + log_admin_private("[key_name(usr)] removed [ckey]'s stickyban") message_admins("[key_name_admin(usr)] removed [ckey]'s stickyban") @@ -128,12 +119,9 @@ SSstickyban.cache[ckey] = ban if (SSdbcore.Connect()) - // var/datum/db_query/query_remove_stickyban_alt = SSdbcore.NewQuery( - // "DELETE FROM [format_table_name("stickyban_matched_ckey")] WHERE stickyban = :ckey AND matched_ckey = :alt", - // list("ckey" = ckey, "alt" = alt) - // ) - var/datum/DBQuery/query_remove_stickyban_alt = SSdbcore.NewQuery( - "DELETE FROM [format_table_name("stickyban_matched_ckey")] WHERE stickyban = [ckey] AND matched_ckey = [alt]" + var/datum/db_query/query_remove_stickyban_alt = SSdbcore.NewQuery( + "DELETE FROM [format_table_name("stickyban_matched_ckey")] WHERE stickyban = :ckey AND matched_ckey = :alt", + list("ckey" = ckey, "alt" = alt) ) query_remove_stickyban_alt.warn_execute() qdel(query_remove_stickyban_alt) @@ -165,12 +153,9 @@ SSstickyban.cache[ckey] = ban if (SSdbcore.Connect()) - // var/datum/db_query/query_edit_stickyban = SSdbcore.NewQuery( - // "UPDATE [format_table_name("stickyban")] SET reason = :reason WHERE ckey = :ckey", - // list("reason" = reason, "ckey" = ckey) - // ) - var/datum/DBQuery/query_edit_stickyban = SSdbcore.NewQuery( - "UPDATE [format_table_name("stickyban")] SET reason = [reason] WHERE ckey = [ckey]" + var/datum/db_query/query_edit_stickyban = SSdbcore.NewQuery( + "UPDATE [format_table_name("stickyban")] SET reason = :reason WHERE ckey = :ckey", + list("reason" = reason, "ckey" = ckey) ) query_edit_stickyban.warn_execute() qdel(query_edit_stickyban) @@ -218,12 +203,9 @@ SSstickyban.cache[ckey] = ban if (SSdbcore.Connect()) - // var/datum/db_query/query_exempt_stickyban_alt = SSdbcore.NewQuery( - // "UPDATE [format_table_name("stickyban_matched_ckey")] SET exempt = 1 WHERE stickyban = :ckey AND matched_ckey = :alt", - // list("ckey" = ckey, "alt" = alt) - // ) - var/datum/DBQuery/query_exempt_stickyban_alt = SSdbcore.NewQuery( - "UPDATE [format_table_name("stickyban_matched_ckey")] SET exempt = 1 WHERE stickyban = [ckey] AND matched_ckey = [alt]" + var/datum/db_query/query_exempt_stickyban_alt = SSdbcore.NewQuery( + "UPDATE [format_table_name("stickyban_matched_ckey")] SET exempt = 1 WHERE stickyban = :ckey AND matched_ckey = :alt", + list("ckey" = ckey, "alt" = alt) ) query_exempt_stickyban_alt.warn_execute() qdel(query_exempt_stickyban_alt) @@ -271,12 +253,9 @@ SSstickyban.cache[ckey] = ban if (SSdbcore.Connect()) - // var/datum/db_query/query_unexempt_stickyban_alt = SSdbcore.NewQuery( - // "UPDATE [format_table_name("stickyban_matched_ckey")] SET exempt = 0 WHERE stickyban = :ckey AND matched_ckey = :alt", - // list("ckey" = ckey, "alt" = alt) - // ) - var/datum/DBQuery/query_unexempt_stickyban_alt = SSdbcore.NewQuery( - "UPDATE [format_table_name("stickyban_matched_ckey")] SET exempt = 0 WHERE stickyban = [ckey] AND matched_ckey = [alt]" + var/datum/db_query/query_unexempt_stickyban_alt = SSdbcore.NewQuery( + "UPDATE [format_table_name("stickyban_matched_ckey")] SET exempt = 0 WHERE stickyban = :ckey AND matched_ckey = :alt", + list("ckey" = ckey, "alt" = alt) ) query_unexempt_stickyban_alt.warn_execute() qdel(query_unexempt_stickyban_alt) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 4afa7234f9..5040d4edf1 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -141,71 +141,76 @@ if(!client.set_db_player_flags()) message_admins("Blocked [src] from new player panel because age gate could not access player database flags.") return FALSE - else - var/dbflags = client.prefs.db_flags - if(dbflags & DB_FLAG_AGE_CONFIRMATION_INCOMPLETE) //they have not completed age gate - var/age_verification = age_gate() - if(age_verification != 1) - client.add_system_note("Automated-Age-Gate", "Failed automatic age gate process.") - //ban them and kick them - //parameters used by sql line, easier to read: - var/bantype_str = "ADMIN_PERMABAN" - var/reason = "SYSTEM BAN - Inputted date during join verification was under 18 years of age. Contact administration on discord for verification." - var/duration = -1 - var/sql_ckey = sanitizeSQL(client.ckey) - var/computerid = client.computer_id - if(!computerid) - computerid = "0" - var/sql_computerid = sanitizeSQL(computerid) - var/ip = client.address - if(!ip) - ip = "0.0.0.0" - var/sql_ip = sanitizeSQL(ip) + if(!(client.prefs.db_flags & DB_FLAG_AGE_CONFIRMATION_INCOMPLETE)) //completed? Skip + return TRUE - //parameter not used as there's no job but i want to fill out all parameters for the insert line - var/sql_job + var/age_verification = age_gate() + //ban them and kick them + if(age_verification != 1) + // this isn't code, this is paragraphs. + var/player_ckey = ckey(client.ckey) + // record all admins and non-admins online at the time + var/list/clients_online = GLOB.clients.Copy() + var/list/admins_online = GLOB.admins.Copy() //list() // remove the GLOB.admins.Copy() and the comments if you want the pure admins_online check + // for(var/client/C in clients_online) + // if(C.holder) //deadmins aren't included since they wouldn't show up on adminwho + // admins_online += C + var/who = clients_online.Join(", ") + var/adminwho = admins_online.Join(", ") - // these are typically the banning admin's, but it's the system so we leave them null, but they're still here for the sake of a full set of values - var/sql_a_ckey - var/sql_a_computerid - var/sql_a_ip + var/datum/db_query/query_add_ban = SSdbcore.NewQuery({" + INSERT INTO [format_table_name("ban")] + (bantime, server_ip, server_port , round_id, bantype, reason, job, duration, expiration_time, ckey, computerid, ip, a_ckey, a_computerid, a_ip, who, adminwho) + VALUES (Now(), INET_ATON(:server_ip), :server_port, :round_id, :bantype_str, :reason, :role, :duration, Now() + INTERVAL :duration MINUTE, :ckey, :computerid, INET_ATON(:ip), :a_ckey, :a_computerid, INET_ATON(:a_ip), :who, :adminwho)"}, + list( + // Server info + "server_ip" = world.internet_address || 0, + "server_port" = world.port, + "round_id" = GLOB.round_id, + // Client ban info + "bantype_str" = "ADMIN_PERMABAN", + "reason" = "SYSTEM BAN - Inputted date during join verification was under 18 years of age. Contact administration on discord for verification.", + "role" = null, + "duration" = -1, + "ckey" = player_ckey, + "ip" = client.address || null, + "computerid" = client.computer_id || null, + // Admin banning info + "a_ckey" = "SYSTEM (Automated-Age-Gate)", // the server + "a_ip" = null, //key_name + "a_computerid" = "0", + "who" = who, + "adminwho" = adminwho + )) - // record all admins and non-admins online at the time - var/who - for(var/client/C in GLOB.clients) - if(!who) - who = "[C]" - else - who += ", [C]" + client.add_system_note("Automated-Age-Gate", "Failed automatic age gate process.") + if(!query_add_ban.Execute()) + // this is the part where you should panic. + qdel(query_add_ban) + message_admins("WARNING! Failed to ban [ckey] for failing the automatic age gate.") + send2tgs_adminless_only("WARNING! Failed to ban [ckey] for failing the automatic age gate.") + qdel(client) + return FALSE + qdel(query_add_ban) - var/adminwho - for(var/client/C in GLOB.admins) - if(!adminwho) - adminwho = "[C]" - else - adminwho += ", [C]" + create_message("note", player_ckey, "SYSTEM (Automated-Age-Gate)", "SYSTEM BAN - Inputted date during join verification was under 18 years of age. Contact administration on discord for verification.", null, null, 0, 0, null, 0, "high") - var/sql = "INSERT INTO [format_table_name("ban")] (`bantime`,`server_ip`,`server_port`,`round_id`,`bantype`,`reason`,`job`,`duration`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]', '[GLOB.round_id]', '[bantype_str]', '[reason]', '[sql_job]', [(duration)?"[duration]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[sql_ckey]', '[sql_computerid]', INET_ATON('[sql_ip]'), '[sql_a_ckey]', '[sql_a_computerid]', INET_ATON('[sql_a_ip]'), '[who]', '[adminwho]')" - var/datum/DBQuery/query_add_ban = SSdbcore.NewQuery(sql) - qdel(query_add_ban) + // announce this + message_admins("[ckey] has been banned for failing the automatic age gate.") + send2tgs_adminless_only("[ckey] has been banned for failing the automatic age gate.") - // announce this - message_admins("[html_encode(client.ckey)] has been banned for failing the automatic age gate.") - send2irc("[html_encode(client.ckey)] has been banned for failing the automatic age gate.") + // removing the client disconnects them + qdel(client) - // removing the client disconnects them - qdel(client) + return FALSE + //they claim to be of age, so allow them to continue and update their flags + client.update_flag_db(DB_FLAG_AGE_CONFIRMATION_COMPLETE, TRUE) + client.update_flag_db(DB_FLAG_AGE_CONFIRMATION_INCOMPLETE, FALSE) + //log this + message_admins("[ckey] has joined through the automated age gate process.") - return FALSE - else - //they claim to be of age, so allow them to continue and update their flags - client.update_flag_db(DB_FLAG_AGE_CONFIRMATION_COMPLETE, TRUE) - client.update_flag_db(DB_FLAG_AGE_CONFIRMATION_INCOMPLETE, FALSE) - //log this - message_admins("[ckey] has joined through the automated age gate process.") - return TRUE return TRUE /mob/dead/new_player/Topic(href, href_list[])