diff --git a/SQL/migrate/V053__DB_Enhancements.sql b/SQL/migrate/V053__DB_Enhancements.sql
new file mode 100644
index 00000000000..5cc33fc77ad
--- /dev/null
+++ b/SQL/migrate/V053__DB_Enhancements.sql
@@ -0,0 +1,87 @@
+--
+-- Adds foreign keys to a few tables and add gameid to notes/warnings/bans
+--
+
+ALTER TABLE `ss13_poll_option`
+ ADD CONSTRAINT `FK_ss13_poll_option_ss13_poll_question` FOREIGN KEY (`pollid`) REFERENCES `ss13_poll_question` (`id`) ON UPDATE CASCADE ON DELETE CASCADE;
+
+ALTER TABLE `ss13_poll_textreply`
+ ADD CONSTRAINT `FK_ss13_poll_textreply_ss13_poll_question` FOREIGN KEY (`pollid`) REFERENCES `ss13_poll_question` (`id`) ON UPDATE CASCADE ON DELETE CASCADE;
+
+ALTER TABLE `ss13_poll_vote`
+ ADD CONSTRAINT `FK_ss13_poll_vote_ss13_poll_question` FOREIGN KEY (`pollid`) REFERENCES `ss13_poll_question` (`id`) ON UPDATE CASCADE ON DELETE CASCADE;
+
+ALTER TABLE `ss13_poll_vote`
+ ADD CONSTRAINT `FK_ss13_poll_vote_ss13_poll_option` FOREIGN KEY (`optionid`) REFERENCES `ss13_poll_option` (`id`) ON UPDATE CASCADE ON DELETE CASCADE;
+
+
+UPDATE `ss13_death` SET `byondkey` = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(`byondkey`),' ',''),'_',''),'-',''),'.',''),'@','');
+UPDATE `ss13_death` SET `lakey` = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(LOWER(`lakey`),' ',''),'_',''),'-',''),'.',''),'@','');
+
+ALTER TABLE `ss13_death`
+ CHANGE COLUMN `pod` `pod` VARCHAR(255) NULL DEFAULT NULL COMMENT 'Place of death' COLLATE 'utf8mb4_unicode_ci' AFTER `id`,
+ CHANGE COLUMN `coord` `coord` VARCHAR(255) NULL DEFAULT NULL COMMENT 'X, Y, Z POD' COLLATE 'utf8mb4_unicode_ci' AFTER `pod`,
+ CHANGE COLUMN `job` `job` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci' AFTER `tod`,
+ CHANGE COLUMN `special` `special` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci' AFTER `job`,
+ CHANGE COLUMN `name` `name` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci' AFTER `special`,
+ CHANGE COLUMN `byondkey` `ckey` VARCHAR(32) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci' AFTER `name`,
+ CHANGE COLUMN `laname` `laname` VARCHAR(255) NULL DEFAULT NULL COMMENT 'Last attacker name' COLLATE 'utf8mb4_unicode_ci' AFTER `ckey`,
+ CHANGE COLUMN `lakey` `lackey` VARCHAR(32) NULL DEFAULT NULL COMMENT 'Last attacker key' COLLATE 'utf8mb4_unicode_ci' AFTER `laname`,
+ CHANGE COLUMN `gender` `gender` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci' AFTER `lackey`;
+
+UPDATE ss13_death SET pod = NULL WHERE pod = '';
+UPDATE ss13_death SET coord = NULL WHERE coord = '';
+UPDATE ss13_death SET job = NULL WHERE job = '';
+UPDATE ss13_death SET special = NULL WHERE special = '';
+UPDATE ss13_death SET name = NULL WHERE name = '';
+UPDATE ss13_death SET ckey = NULL WHERE ckey = '';
+UPDATE ss13_death SET laname = NULL WHERE laname = '';
+UPDATE ss13_death SET lackey = NULL WHERE lackey = '';
+UPDATE ss13_death SET gender = NULL WHERE gender = '';
+
+ALTER TABLE `ss13_death`
+ ADD COLUMN `char_id` INT NULL DEFAULT NULL AFTER `ckey`;
+
+ALTER TABLE `ss13_death`
+ ADD CONSTRAINT `FK_ss13_death_ss13_player` FOREIGN KEY (`ckey`) REFERENCES `ss13_player` (`ckey`) ON UPDATE CASCADE ON DELETE CASCADE;
+
+ALTER TABLE `ss13_death`
+ ADD CONSTRAINT `FK_ss13_death_ss13_player_lackey` FOREIGN KEY (`lackey`) REFERENCES `ss13_player` (`ckey`) ON UPDATE CASCADE ON DELETE SET NULL;
+
+ALTER TABLE `ss13_death`
+ ADD CONSTRAINT `FK_ss13_death_ss13_characters` FOREIGN KEY (`char_id`) REFERENCES `ss13_characters` (`id`) ON UPDATE CASCADE ON DELETE SET NULL;
+
+
+ALTER TABLE `ss13_ban`
+ CHANGE COLUMN `id` `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT FIRST;
+
+ALTER TABLE `ss13_ban_mirrors`
+ ADD CONSTRAINT `FK_ss13_ban_mirrors_ss13_ban` FOREIGN KEY (`ban_id`) REFERENCES `ss13_ban` (`id`) ON UPDATE CASCADE ON DELETE CASCADE;
+
+
+ALTER TABLE `ss13_stickyban_matched_cid`
+ ADD CONSTRAINT `FK_ss13_stickyban_matched_cid_ss13_stickyban` FOREIGN KEY (`stickyban`) REFERENCES `ss13_stickyban` (`ckey`) ON UPDATE CASCADE ON DELETE CASCADE;
+
+ALTER TABLE `ss13_stickyban_matched_ckey`
+ ADD CONSTRAINT `FK_ss13_stickyban_matched_ckey_ss13_stickyban` FOREIGN KEY (`stickyban`) REFERENCES `ss13_stickyban` (`ckey`) ON UPDATE CASCADE ON DELETE CASCADE;
+
+ALTER TABLE `ss13_stickyban_matched_ip`
+ ADD CONSTRAINT `FK_ss13_stickyban_matched_ip_ss13_stickyban` FOREIGN KEY (`stickyban`) REFERENCES `ss13_stickyban` (`ckey`) ON UPDATE CASCADE ON DELETE CASCADE;
+
+
+ALTER TABLE `ss13_character_incidents`
+ ADD CONSTRAINT `FK_ss13_character_incidents_ss13_characters` FOREIGN KEY (`char_id`) REFERENCES `ss13_characters` (`id`) ON UPDATE CASCADE ON DELETE CASCADE;
+
+
+ALTER TABLE `ss13_player_notifications`
+ ADD CONSTRAINT `FK_ss13_player_notifications_ss13_player_2` FOREIGN KEY (`created_by`) REFERENCES `ss13_player` (`ckey`) ON UPDATE CASCADE;
+
+
+ALTER TABLE `ss13_ban`
+ ADD COLUMN `game_id` VARCHAR(32) NULL DEFAULT NULL AFTER `serverip`;
+
+ALTER TABLE `ss13_notes`
+ ADD COLUMN `game_id` VARCHAR(50) NULL DEFAULT NULL AFTER `adddate`;
+
+ALTER TABLE `ss13_warnings`
+ ADD COLUMN `game_id` VARCHAR(50) NULL DEFAULT NULL AFTER `time`;
diff --git a/code/controllers/subsystems/statistics.dm b/code/controllers/subsystems/statistics.dm
index 825a4383084..465726ab597 100644
--- a/code/controllers/subsystems/statistics.dm
+++ b/code/controllers/subsystems/statistics.dm
@@ -237,68 +237,42 @@
FV.add_details(details)
-/proc/sql_report_death(var/mob/living/carbon/human/H)
+/proc/sql_report_death(var/mob/living/H)
if(!config.sql_enabled || !config.sql_stats)
return
if(!H)
return
+ if(!istype(H, /mob/living/carbon/human) && !istype(H, /mob/living/silicon/robot))
+ return
if(!H.key || !H.mind)
return
var/area/placeofdeath = get_area(H)
var/podname = placeofdeath ? "[placeofdeath]" : "Unknown area"
- var/sqlname = sanitizeSQL(H.real_name)
- var/sqlkey = sanitizeSQL(H.key)
- var/sqlpod = sanitizeSQL(podname)
- var/sqlspecial = sanitizeSQL(H.mind.special_role)
- var/sqljob = sanitizeSQL(H.mind.assigned_role)
- var/laname
- var/lakey
- if(H.lastattacker)
- laname = sanitizeSQL(H.lastattacker:real_name)
- lakey = sanitizeSQL(H.lastattacker:key)
- var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
- var/coord = "[H.x], [H.y], [H.z]"
establish_db_connection(dbcon)
if(!dbcon.IsConnected())
log_game("SQL ERROR during death reporting. Failed to connect.")
else
- var/DBQuery/query = dbcon.NewQuery("INSERT INTO ss13_death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, coord) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.getBruteLoss()], [H.getFireLoss()], [H.getBrainLoss()], [H.getOxyLoss()], '[coord]')")
- if(!query.Execute())
- var/err = query.ErrorMsg()
- log_game("SQL ERROR during death reporting. Error : \[[err]\]\n")
-
-
-/proc/sql_report_cyborg_death(var/mob/living/silicon/robot/H)
- if(!config.sql_enabled || !config.sql_stats)
- return
- if(!H)
- return
- if(!H.key || !H.mind)
- return
-
- var/area/placeofdeath = get_area(H)
- var/podname = placeofdeath ? "[placeofdeath]" : "Unknown area"
-
- var/sqlname = sanitizeSQL(H.real_name)
- var/sqlkey = sanitizeSQL(H.key)
- var/sqlpod = sanitizeSQL(podname)
- var/sqlspecial = sanitizeSQL(H.mind.special_role)
- var/sqljob = sanitizeSQL(H.mind.assigned_role)
- var/laname
- var/lakey
- if(H.lastattacker)
- laname = sanitizeSQL(H.lastattacker:real_name)
- lakey = sanitizeSQL(H.lastattacker:key)
- var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
- var/coord = "[H.x], [H.y], [H.z]"
- establish_db_connection(dbcon)
- if(!dbcon.IsConnected())
- log_game("SQL ERROR during death reporting. Failed to connect.")
- else
- var/DBQuery/query = dbcon.NewQuery("INSERT INTO ss13_death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, coord) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.getBruteLoss()], [H.getFireLoss()], [H.getBrainLoss()], [H.getOxyLoss()], '[coord]')")
- if(!query.Execute())
+ var/DBQuery/query = dbcon.NewQuery("INSERT INTO ss13_death (name, ckey, char_id, job, special, pod, tod, laname, lackey, gender, bruteloss, fireloss, brainloss, oxyloss, coord) VALUES \
+ (:name:, :ckey:, :char_id:, :job:, :special:, :pod:, :tod:, :laname:, :lackey:, :gender:, :bruteloss:, :fireloss:, :brainloss:, :oxyloss:, :coord:')")
+ if(!query.Execute(list(
+ "name"=H.real_name,
+ "ckey"=H.ckey,
+ "char_id"=H.character_id,
+ "job"=H?.mind.assigned_role,
+ "special"=H?.mind.special_role,
+ "pod"=podname,
+ "tod"=time2text(world.realtime, "YYYY-MM-DD hh:mm:ss"),
+ "laname"=H?.lastattacker.real_name,
+ "lackey"=H?.lastattacker.ckey,
+ "gender"=H.gender,
+ "bruteloss"=H.getBruteLoss(),
+ "fireloss"=H.getFireLoss(),
+ "brainloss"=H.getBrainLoss(),
+ "oxyloss"=H.getOxyLoss(),
+ "coord"="[H.x], [H.y], [H.z]")
+ ))
var/err = query.ErrorMsg()
log_game("SQL ERROR during death reporting. Error : \[[err]\]\n")
diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm
index 9657a5e6b22..cc3b66f9e3b 100644
--- a/code/modules/admin/DB ban/functions.dm
+++ b/code/modules/admin/DB ban/functions.dm
@@ -98,7 +98,7 @@
reason = sql_sanitize_text(reason)
- var/sql = "INSERT INTO ss13_ban (`id`,`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, 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/sql = "INSERT INTO ss13_ban (`id`,`bantime`,`serverip`,`game_id`,`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, Now(), '[serverip]', '[game_id]','[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()
to_chat(usr, "Ban saved to database.")
diff --git a/code/modules/admin/admin_attack_log.dm b/code/modules/admin/admin_attack_log.dm
index 89c390811ee..3c5d560a3cc 100644
--- a/code/modules/admin/admin_attack_log.dm
+++ b/code/modules/admin/admin_attack_log.dm
@@ -1,5 +1,5 @@
-/mob/var/lastattacker = null
-/mob/var/lastattacked = null
+/mob/var/mob/lastattacker = null
+/mob/var/mob/lastattacked = null
/mob/var/attack_log = list()
proc/log_and_message_admins(var/message as text, var/mob/user = usr, var/turf/location)
diff --git a/code/modules/admin/player_notes_sql.dm b/code/modules/admin/player_notes_sql.dm
index f5df8d8f929..dbf4d690ef2 100644
--- a/code/modules/admin/player_notes_sql.dm
+++ b/code/modules/admin/player_notes_sql.dm
@@ -5,7 +5,7 @@
if(!player_ckey || !note)
return
- var/list/query_details = list("ckey" = player_ckey, "address" = player_address ? player_address : null, "computer_id" = player_computerid ? player_computerid : null, "a_ckey" = null, "note" = note)
+ var/list/query_details = list("game_id" = game_id, "ckey" = player_ckey, "address" = player_address ? player_address : null, "computer_id" = player_computerid ? player_computerid : null, "a_ckey" = null, "note" = note)
if (!user)
query_details["a_ckey"] = "Adminbot"
@@ -26,7 +26,7 @@
if (!query_details["computer_id"])
query_details["computer_id"] = init_query.item[2]
- var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO ss13_notes (id, adddate, ckey, ip, computerid, a_ckey, content) VALUES (null, Now(), :ckey:, :address:, :computer_id:, :a_ckey:, :note:)")
+ var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO ss13_notes (id, adddate, game_id, ckey, ip, computerid, a_ckey, content) VALUES (null, Now(), :game_id:, :ckey:, :address:, :computer_id:, :a_ckey:, :note:)")
insert_query.Execute(query_details)
message_admins("[key_name_admin(user)] has edited [player_ckey]'s notes.")
@@ -221,81 +221,3 @@
content += notes
content += "```"
return content
-
-/*/proc/notes_transfer()
- msg_scopes("Locating master list.")
- var/savefile/note_list = new("data/player_notes.sav")
- var/list/note_keys
- note_list >> note_keys
-
- msg_scopes("Establishing DB connection!")
- establish_db_connection(dbcon)
- if(!dbcon.IsConnected())
- msg_scopes("No DB connection!")
- return
-
- for(var/t in note_keys)
- var/IP = null
- var/CID = null
- var/DBQuery/query = dbcon.NewQuery("SELECT ip, computerid FROM ss13_player WHERE ckey = '[t]'")
- query.Execute()
- if(query.NextRow())
- IP = query.item[1]
- CID = query.item[2]
-
- var/savefile/info = new("data/player_saves/[copytext(t, 1, 2)]/[t]/info.sav")
- var/list/infos
- info >> infos
-
- for(var/datum/player_info/I in infos)
- var/a_ckey = sanitizeSQL(I.author)
- var/timeY = copytext(I.timestamp, findtext(I.timestamp, "of") + 3)
- var/timeM
- var/timeD = copytext(I.timestamp, findtext(I.timestamp, " ", 6) + 1, findtext(I.timestamp, " ", 6) + 3)
- if(findtext(timeD, "s") || findtext(timeD, "n") || findtext(timeD, "r") || findtext(timeD, "t"))
- timeD = "0[copytext(timeD, 1, 2)]"
-
-// msg_scopes("Timestamp: [I.timestamp].")
- var/temp = copytext(I.timestamp, 6, findtext(I.timestamp, " ", 6))
-// msg_scopes("The day? [timeD].")
-// msg_scopes("The month? [temp].")
-// msg_scopes("The year? [timeY].")
- switch(temp)
- if("January")
- timeM = "01"
- if("February")
- timeM = "02"
- if("March")
- timeM = "03"
- if("April")
- timeM = "04"
- if("May")
- timeM = "05"
- if("June")
- timeM = "06"
- if("July")
- timeM = "07"
- if("August")
- timeM = "08"
- if("September")
- timeM = "09"
- if("October")
- timeM = "10"
- if("November")
- timeM = "11"
- if("December")
- timeM = "12"
-
- var/DTG = "[timeY]-[timeM]-[timeD] 00:00:00"
-// msg_scopes("Full DTG: [DTG]")
- var/insertionstuff
- if(IP && CID)
- insertionstuff = "INSERT INTO ss13_notes (id, adddate, ckey, ip, computerid, a_ckey, content) VALUES (null, '[DTG]', '[t]', '[IP]', '[CID]', '[a_ckey]', '[I.content]')"
- else
- insertionstuff = "INSERT INTO ss13_notes (id, adddate, ckey, ip, computerid, a_ckey, content) VALUES (null, '[DTG]', '[t]', null, null, '[a_ckey]', '[I.content]')"
- var/DBQuery/insertquery = dbcon.NewQuery(insertionstuff)
- insertquery.Execute()
- if(insertquery.ErrorMsg())
- msg_scopes(insertquery.ErrorMsg())
- else
- msg_scopes("Transfer successful.")*/
diff --git a/code/modules/admin/verbs/warning.dm b/code/modules/admin/verbs/warning.dm
index ff27552845b..ea405565e0b 100644
--- a/code/modules/admin/verbs/warning.dm
+++ b/code/modules/admin/verbs/warning.dm
@@ -43,8 +43,8 @@
warned_ip = lookup_query.item[1]
warned_computerid = lookup_query.item[2]
- var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO ss13_warnings (id, time, severity, reason, notes, ckey, computerid, ip, a_ckey, a_ip, a_computerid) VALUES (null, Now(), :warning_severity:, :warning_reason:, :warning_notes:, :warned_ckey:, :warned_computerid:, :warned_ip:, :a_ckey:, :a_ip:, :a_computerid:)")
- insert_query.Execute(list("warning_severity" = warning_severity, "warning_reason" = warning_reason, "warning_notes" = warning_notes, "warned_ckey" = warned_ckey, "warned_computerid" = warned_computerid, "warned_ip" = warned_ip, "a_ckey" = ckey, "a_ip" = address, "a_computerid" = computer_id))
+ var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO ss13_warnings (id, time, game_id, severity, reason, notes, ckey, computerid, ip, a_ckey, a_ip, a_computerid) VALUES (null, Now(), :game_id:, :warning_severity:, :warning_reason:, :warning_notes:, :warned_ckey:, :warned_computerid:, :warned_ip:, :a_ckey:, :a_ip:, :a_computerid:)")
+ insert_query.Execute(list("game_id" = game_id,"warning_severity" = warning_severity, "warning_reason" = warning_reason, "warning_notes" = warning_notes, "warned_ckey" = warned_ckey, "warned_computerid" = warned_computerid, "warned_ip" = warned_ip, "a_ckey" = ckey, "a_ip" = address, "a_computerid" = computer_id))
notes_add_sql(warned_ckey, "Warning added by [ckey], for: [warning_reason]. || Notes regarding the warning: [warning_notes].", src, warned_ip, warned_computerid)
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index 439f647e761..12081a8d561 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -12,5 +12,5 @@
if(G)
G.drop_item()
remove_robot_verbs()
- sql_report_cyborg_death(src)
- ..(gibbed,"shudders violently for a moment, then becomes motionless, its eyes slowly darkening.")
\ No newline at end of file
+ sql_report_death(src)
+ ..(gibbed,"shudders violently for a moment, then becomes motionless, its eyes slowly darkening.")