From af0a4df520993e7280ebef7b6d9a3034673adb80 Mon Sep 17 00:00:00 2001 From: Werner Date: Sat, 22 Dec 2018 22:42:47 +0100 Subject: [PATCH] Better antag tracking (#5816) This PR moves the tracking of the antagonists from the char spawn to the assignment and removal of the antag status. It should properly account for all antags that are added/removed via the add_antagonist / remove_antagonist verbs --- SQL/migrate/V034__better_antag_stats.sql | 23 +++++++++++ code/game/antagonist/antagonist.dm | 1 + code/game/antagonist/antagonist_add.dm | 49 +++++++++++++++++++++++- code/modules/client/preferences.dm | 4 +- 4 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 SQL/migrate/V034__better_antag_stats.sql diff --git a/SQL/migrate/V034__better_antag_stats.sql b/SQL/migrate/V034__better_antag_stats.sql new file mode 100644 index 00000000000..d62e00a41a3 --- /dev/null +++ b/SQL/migrate/V034__better_antag_stats.sql @@ -0,0 +1,23 @@ +-- +-- Adds a new table specifically for tracking antagonist assignments +-- + +ALTER TABLE `ss13_characters_log` + DROP COLUMN `special_role`; + +CREATE TABLE `ss13_antag_log` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `ckey` VARCHAR(32) NOT NULL, + `char_id` INT(11) NULL DEFAULT NULL, + `game_id` VARCHAR(50) NOT NULL, + `char_name` VARCHAR(50) NOT NULL, + `datetime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `special_role_name` VARCHAR(50) NOT NULL, + `special_role_added` TIME NOT NULL, + `special_role_removed` TIME NULL DEFAULT NULL, + PRIMARY KEY (`id`), + INDEX `FK_ss13_antag_log_ss13_characters` (`char_id`), + CONSTRAINT `FK_ss13_antag_log_ss13_characters` FOREIGN KEY (`char_id`) REFERENCES `ss13_characters` (`id`) ON UPDATE CASCADE ON DELETE CASCADE +) +COLLATE='utf8_general_ci' +ENGINE=InnoDB; \ No newline at end of file diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm index 4815abe27f1..d3a0f0151a6 100644 --- a/code/game/antagonist/antagonist.dm +++ b/code/game/antagonist/antagonist.dm @@ -50,6 +50,7 @@ var/bantype = "Syndicate" // Ban to check when spawning this antag. var/suspicion_chance = 50 // Prob of being on the initial Command report var/flags = 0 // Various runtime options. + var/db_log_id = null // ID of the db entry used to track that antagonist // Used for setting appearance. var/list/valid_species = list("Unathi","Tajara","Skrell","Human") diff --git a/code/game/antagonist/antagonist_add.dm b/code/game/antagonist/antagonist_add.dm index 26c38f93dd3..6e567886132 100644 --- a/code/game/antagonist/antagonist_add.dm +++ b/code/game/antagonist/antagonist_add.dm @@ -48,6 +48,9 @@ if(nonstandard_role_msg) player.current << "[nonstandard_role_msg]" update_icons_added(player) + + // Log it + log_antagonist_add(player) return 1 /datum/antagonist/proc/remove_antagonist(var/datum/mind/player, var/show_message = TRUE, var/implanted) @@ -58,6 +61,7 @@ player.current.verbs -= faction_verb if(player in current_antagonists) + log_antagonist_remove() if (show_message) player.current << "You are no longer a [role_text]!" current_antagonists -= player @@ -68,10 +72,53 @@ if (!is_special_character(player) && !check_rights(R_ADMIN|R_MOD|R_CCIAA, 0, player.current)) player.current.client.verbs -= /client/proc/aooc - return 1 if(!is_special_character(player)) player.current.verbs -= /mob/living/proc/write_ambition player.ambitions = "" + return 1 return 0 + + +/datum/antagonist/proc/log_antagonist_add(var/datum/mind/player) + if(!config.sql_enabled) + return + + if(!establish_db_connection(dbcon)) + log_debug("AntagLog: SQL ERROR - Failed to connect.") + return + + //Try to get the char id + var/char_id = null + if(player.current.character_id) //To make sure char_id is null and not 0 + char_id = player.current.character_id + + //Run the query to insert the antagonist into the db + var/DBQuery/new_log = dbcon.NewQuery("INSERT INTO ss13_antag_log ( ckey, char_id, game_id, char_name, special_role_name, special_role_added) VALUES ( :ckey:, :char_id:, :game_id:, :char_name:, :special_role_name:, :special_role_added:)") + new_log.Execute(list("ckey" = ckey(player.key) , "char_id" = char_id, "game_id" = game_id, "char_name" = player.current.name, "special_role_name"=role_text,"special_role_added" = "[get_round_duration_formatted()]:00")) + + //Run the query to get the inserted id + var/DBQuery/log_id = dbcon.NewQuery("SELECT LAST_INSERT_ID() AS log_id") + log_id.Execute() + + //Save the inserted it to the antagonist datum + if (log_id.NextRow()) + db_log_id = text2num(log_id.item[1]) + + return + +/datum/antagonist/proc/log_antagonist_remove(var/datum/mind/player) + if(!config.sql_enabled) + return + + if(!establish_db_connection(dbcon)) + log_debug("AntagLog: SQL ERROR - Failed to connect.") + return + + if(!db_log_id) + return + + //Run the query to update the db entry with the removal time + var/DBQuery/update_query = dbcon.NewQuery("UPDATE ss13_antag_log SET special_role_removed = :special_role_removed: WHERE id = :id:") + update_query.Execute(list("id"=db_log_id,"special_role_removed"="[get_round_duration_formatted()]:00")) \ No newline at end of file diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 50570215101..3b1bd2abea6 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -461,8 +461,8 @@ datum/preferences if(!H.mind.assigned_role) log_debug("Char-Log: Char [current_character] - [H.name] has joined with mind.assigned_role set to NULL") - var/DBQuery/query = dbcon.NewQuery("INSERT INTO ss13_characters_log (char_id, game_id, datetime, job_name, special_role, alt_title) VALUES (:char_id:, :game_id:, NOW(), :job:, :special_role:, :alt_title:)") - query.Execute(list("char_id" = current_character, "game_id" = game_id, "job" = H.mind.assigned_role, "special_role" = H.mind.special_role, "alt_title" = H.mind.role_alt_title)) + var/DBQuery/query = dbcon.NewQuery("INSERT INTO ss13_characters_log (char_id, game_id, datetime, job_name, alt_title) VALUES (:char_id:, :game_id:, NOW(), :job:, :special_role:, :alt_title:)") + query.Execute(list("char_id" = current_character, "game_id" = game_id, "job" = H.mind.assigned_role, "alt_title" = H.mind.role_alt_title)) // Turned into a proc so we could reuse it for SQL shenanigans. /datum/preferences/proc/new_setup(var/re_initialize = 0)