diff --git a/SQL/database_changelog.txt b/SQL/database_changelog.txt
index 55d1ed9c5eb..95e1e0f4c38 100644
--- a/SQL/database_changelog.txt
+++ b/SQL/database_changelog.txt
@@ -1,15 +1,46 @@
Any time you make a change to the schema files, remember to increment the database schema version. Generally increment the minor number, major should be reserved for significant changes to the schema. Both values go up to 255.
-The latest database version is 5.12; The query to update the schema revision table is:
+The latest database version is 5.13; The query to update the schema revision table is:
-INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 12);
+INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 13);
or
-INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 12);
+INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 13);
In any query remember to add a prefix to the table names if you use one.
-----------------------------------------------------
+Version 5.13, 9 March, 2021, by Useroth
+
+Implemented some features to help with running multiple servers on the same database and easily differentiate
+between servers when it comes to bans, statistical data, etc.
+
+You might also want to update the server_name column in older records in the tables, however it is not absolutely necessary.
+
+ALTER TABLE `ban`
+ ADD COLUMN `server_name` VARCHAR(32) DEFAULT NULL AFTER `bantime`,
+ ADD COLUMN `global_ban` TINYINT(1) UNSIGNED NOT NULL DEFAULT '1' AFTER `role`;
+
+UPDATE `ban`
+ SET `global_ban` = 1;
+
+ALTER TABLE `legacy_population`
+ ADD COLUMN `server_name` VARCHAR(32) DEFAULT NULL AFTER `time`;
+
+ALTER TABLE `connection_log`
+ ADD COLUMN `server_name` VARCHAR(32) DEFAULT NULL AFTER `datetime`;
+
+ALTER TABLE `death`
+ ADD COLUMN `server_name` VARCHAR(32) DEFAULT NULL AFTER `mapname`;
+
+ALTER TABLE `messages`
+ ADD COLUMN `server_name` VARCHAR(32) DEFAULT NULL AFTER `timestamp`;
+
+ALTER TABLE `round`
+ ADD COLUMN `server_name` VARCHAR(32) DEFAULT NULL AFTER `end_datetime`;
+
+-----------------------------------------------------
+
Version 5.12, 29 December 2020, by Missfox
Modified table `messages`, adding column `playtime` to show the user's playtime when the note was created.
diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql
index f33cde33ed7..b7596e7d2af 100644
--- a/SQL/tgstation_schema.sql
+++ b/SQL/tgstation_schema.sql
@@ -70,10 +70,12 @@ DROP TABLE IF EXISTS `ban`;
CREATE TABLE `ban` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`bantime` DATETIME NOT NULL,
+ `server_name` VARCHAR(32) DEFAULT NULL,
`server_ip` INT(10) UNSIGNED NOT NULL,
`server_port` SMALLINT(5) UNSIGNED NOT NULL,
`round_id` INT(11) UNSIGNED NOT NULL,
`role` VARCHAR(32) NULL DEFAULT NULL,
+ `global_ban` TINYINT(1) UNSIGNED NOT NULL DEFAULT '1',
`expiration_time` DATETIME NULL DEFAULT NULL,
`applies_to_admins` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
`reason` VARCHAR(2048) NOT NULL,
@@ -108,6 +110,7 @@ DROP TABLE IF EXISTS `connection_log`;
CREATE TABLE `connection_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime DEFAULT NULL,
+ `server_name` VARCHAR(32) DEFAULT NULL,
`server_ip` int(10) unsigned NOT NULL,
`server_port` smallint(5) unsigned NOT NULL,
`round_id` int(11) unsigned NOT NULL,
@@ -132,6 +135,7 @@ CREATE TABLE `death` (
`y_coord` smallint(5) unsigned NOT NULL,
`z_coord` smallint(5) unsigned NOT NULL,
`mapname` varchar(32) NOT NULL,
+ `server_name` varchar(32) DEFAULT NULL,
`server_ip` int(10) unsigned NOT NULL,
`server_port` smallint(5) unsigned NOT NULL,
`round_id` int(11) NOT NULL,
@@ -202,6 +206,7 @@ CREATE TABLE `legacy_population` (
`playercount` int(11) DEFAULT NULL,
`admincount` int(11) DEFAULT NULL,
`time` datetime NOT NULL,
+ `server_name` varchar(32) DEFAULT NULL,
`server_ip` int(10) unsigned NOT NULL,
`server_port` smallint(5) unsigned NOT NULL,
`round_id` int(11) unsigned NOT NULL,
@@ -248,6 +253,7 @@ CREATE TABLE `messages` (
`adminckey` varchar(32) NOT NULL,
`text` varchar(2048) NOT NULL,
`timestamp` datetime NOT NULL,
+ `server_name` varchar(32) DEFAULT NULL,
`server` varchar(32) DEFAULT NULL,
`server_ip` int(10) unsigned NOT NULL,
`server_port` smallint(5) unsigned NOT NULL,
@@ -437,6 +443,7 @@ CREATE TABLE `round` (
`start_datetime` DATETIME NULL,
`shutdown_datetime` DATETIME NULL,
`end_datetime` DATETIME NULL,
+ `server_name` VARCHAR(32) DEFAULT NULL,
`server_ip` INT(10) UNSIGNED NOT NULL,
`server_port` SMALLINT(5) UNSIGNED NOT NULL,
`commit_hash` CHAR(40) NULL,
diff --git a/SQL/tgstation_schema_prefixed.sql b/SQL/tgstation_schema_prefixed.sql
index b782e61bcd7..0e47e27ed1c 100644
--- a/SQL/tgstation_schema_prefixed.sql
+++ b/SQL/tgstation_schema_prefixed.sql
@@ -70,10 +70,12 @@ DROP TABLE IF EXISTS `SS13_ban`;
CREATE TABLE `SS13_ban` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`bantime` DATETIME NOT NULL,
+ `server_name` VARCHAR(32) DEFAULT NULL,
`server_ip` INT(10) UNSIGNED NOT NULL,
`server_port` SMALLINT(5) UNSIGNED NOT NULL,
`round_id` INT(11) UNSIGNED NOT NULL,
`role` VARCHAR(32) NULL DEFAULT NULL,
+ `global_ban` TINYINT(1) UNSIGNED NOT NULL DEFAULT '1',
`expiration_time` DATETIME NULL DEFAULT NULL,
`applies_to_admins` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
`reason` VARCHAR(2048) NOT NULL,
@@ -108,6 +110,7 @@ DROP TABLE IF EXISTS `SS13_connection_log`;
CREATE TABLE `SS13_connection_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime DEFAULT NULL,
+ `server_name` VARCHAR(32) DEFAULT NULL,
`server_ip` int(10) unsigned NOT NULL,
`server_port` smallint(5) unsigned NOT NULL,
`round_id` int(11) unsigned NOT NULL,
@@ -132,6 +135,7 @@ CREATE TABLE `SS13_death` (
`y_coord` smallint(5) unsigned NOT NULL,
`z_coord` smallint(5) unsigned NOT NULL,
`mapname` varchar(32) NOT NULL,
+ `server_name` varchar(32) DEFAULT NULL,
`server_ip` int(10) unsigned NOT NULL,
`server_port` smallint(5) unsigned NOT NULL,
`round_id` int(11) NOT NULL,
@@ -202,6 +206,7 @@ CREATE TABLE `SS13_legacy_population` (
`playercount` int(11) DEFAULT NULL,
`admincount` int(11) DEFAULT NULL,
`time` datetime NOT NULL,
+ `server_name` varchar(32) DEFAULT NULL,
`server_ip` int(10) unsigned NOT NULL,
`server_port` smallint(5) unsigned NOT NULL,
`round_id` int(11) unsigned NOT NULL,
@@ -248,6 +253,7 @@ CREATE TABLE `SS13_messages` (
`adminckey` varchar(32) NOT NULL,
`text` varchar(2048) NOT NULL,
`timestamp` datetime NOT NULL,
+ `server_name` varchar(32) DEFAULT NULL,
`server` varchar(32) DEFAULT NULL,
`server_ip` int(10) unsigned NOT NULL,
`server_port` smallint(5) unsigned NOT NULL,
@@ -437,6 +443,7 @@ CREATE TABLE `SS13_round` (
`start_datetime` DATETIME NULL,
`shutdown_datetime` DATETIME NULL,
`end_datetime` DATETIME NULL,
+ `server_name` VARCHAR(32) DEFAULT NULL,
`server_ip` INT(10) UNSIGNED NOT NULL,
`server_port` SMALLINT(5) UNSIGNED NOT NULL,
`commit_hash` CHAR(40) NULL,
diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm
index 6a8c815b9d0..84a2acfda15 100644
--- a/code/controllers/subsystem/blackbox.dm
+++ b/code/controllers/subsystem/blackbox.dm
@@ -42,13 +42,14 @@ SUBSYSTEM_DEF(blackbox)
return
var/playercount = LAZYLEN(GLOB.player_list)
var/admincount = GLOB.admins.len
- var/datum/db_query/query_record_playercount = SSdbcore.NewQuery({"
- INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time, server_ip, server_port, round_id)
- VALUES (:playercount, :admincount, :time, INET_ATON(:server_ip), :server_port, :round_id)
+ var/datum/db_query/query_record_playercount = SSdbcore.NewQuery(/* SKYRAT EDIT CHANGE - MULTISERVER */{"
+ INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time, server_name, server_ip, server_port, round_id)
+ VALUES (:playercount, :admincount, :time, :server_name, INET_ATON(:server_ip), :server_port, :round_id)
"}, list(
"playercount" = playercount,
"admincount" = admincount,
"time" = SQLtime(),
+ "server_name" = CONFIG_GET(string/serversqlname), // SKYRAT EDIT ADDITION - MULTISERVER
"server_ip" = world.internet_address || "0",
"server_port" = "[world.port]",
"round_id" = GLOB.round_id,
@@ -318,9 +319,9 @@ Versioning
if(!SSdbcore.Connect())
return
- var/datum/db_query/query_report_death = SSdbcore.NewQuery({"
- INSERT INTO [format_table_name("death")] (pod, x_coord, y_coord, z_coord, mapname, server_ip, server_port, round_id, tod, job, special, name, byondkey, laname, lakey, bruteloss, fireloss, brainloss, oxyloss, toxloss, cloneloss, staminaloss, last_words, suicide)
- VALUES (:pod, :x_coord, :y_coord, :z_coord, :map, INET_ATON(:internet_address), :port, :round_id, :time, :job, :special, :name, :key, :laname, :lakey, :brute, :fire, :brain, :oxy, :tox, :clone, :stamina, :last_words, :suicide)
+ var/datum/db_query/query_report_death = SSdbcore.NewQuery(/* SKYRAT EDIT CHANGE - MULTISERVER */{"
+ INSERT INTO [format_table_name("death")] (pod, x_coord, y_coord, z_coord, mapname, server_name, server_ip, server_port, round_id, tod, job, special, name, byondkey, laname, lakey, bruteloss, fireloss, brainloss, oxyloss, toxloss, cloneloss, staminaloss, last_words, suicide)
+ VALUES (:pod, :x_coord, :y_coord, :z_coord, :map, :server_name, INET_ATON(:internet_address), :port, :round_id, :time, :job, :special, :name, :key, :laname, :lakey, :brute, :fire, :brain, :oxy, :tox, :clone, :stamina, :last_words, :suicide)
"}, list(
"name" = L.real_name,
"key" = L.ckey,
@@ -342,6 +343,7 @@ Versioning
"last_words" = L.last_words,
"suicide" = L.suiciding,
"map" = SSmapping.config.map_name,
+ "server_name" = CONFIG_GET(string/serversqlname), // SKYRAT EDIT ADDITION - MULTISERVER
"internet_address" = world.internet_address || "0",
"port" = "[world.port]",
"round_id" = GLOB.round_id,
diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm
index 97220fe249f..5af9e02d6ec 100644
--- a/code/controllers/subsystem/dbcore.dm
+++ b/code/controllers/subsystem/dbcore.dm
@@ -125,9 +125,9 @@ SUBSYSTEM_DEF(dbcore)
/datum/controller/subsystem/dbcore/proc/SetRoundID()
if(!Connect())
return
- var/datum/db_query/query_round_initialize = SSdbcore.NewQuery(
- "INSERT INTO [format_table_name("round")] (initialize_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(:internet_address), :port)",
- list("internet_address" = world.internet_address || "0", "port" = "[world.port]")
+ var/datum/db_query/query_round_initialize = SSdbcore.NewQuery(/* SKYRAT EDIT CHANGE - MULTISERVER */
+ "INSERT INTO [format_table_name("round")] (initialize_datetime, server_name, server_ip, server_port) VALUES (Now(), :server_name, INET_ATON(:internet_address), :port)",
+ list("server_name" = CONFIG_GET(string/serversqlname), "internet_address" = world.internet_address || "0", "port" = "[world.port]") // SKYRAT EDIT CHANGE - MULTISERVER
)
query_round_initialize.Execute(async = FALSE)
GLOB.round_id = "[query_round_initialize.last_insert_id]"
diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm
index c70d50be86a..fd8799110ac 100644
--- a/code/modules/admin/IsBanned.dm
+++ b/code/modules/admin/IsBanned.dm
@@ -86,13 +86,17 @@
addclientmessage(ckey,"Admin [key] has been allowed to bypass a matching non-admin ban on [i["key"]] [i["ip"]]-[i["computerid"]].")
continue
var/expires = "This is a permanent ban."
+ var/global_ban = "This is a global ban from all of our servers." //SKYRAT EDIT ADDITION - MULTISERVER
if(i["expiration_time"])
expires = " The ban is for [DisplayTimeText(text2num(i["duration"]) MINUTES)] and expires on [i["expiration_time"]] (server time)."
- var/desc = {"You, or another user of this computer or connection ([i["key"]]) is banned from playing here.
+ if(!text2num(i["global_ban"])) //SKYRAT EDIT ADDITION - MULTISERVER
+ global_ban = "This is a single-server ban, and only applies to [i["server_name"]]." //SKYRAT EDIT ADDITION - MULTISERVER
+ var/desc = /* SKYRAT EDIT CHANGE - MULTISERVER */ {"You, or another user of this computer or connection ([i["key"]]) is banned from playing here.
The ban reason is: [i["reason"]]
This ban (BanID #[i["id"]]) was applied by [i["admin_key"]] on [i["bantime"]] during round ID [i["round_id"]].
+ [global_ban]
[expires]"}
- log_access("Failed Login: [key] [computer_id] [address] - Banned (#[i["id"]])")
+ log_access("Failed Login: [key] [computer_id] [address] - Banned (#[i["id"]]) [text2num(i["global_ban"]) ? "globally" : "locally"]") //SKYRAT EDIT CHANGE - MULTISERVER
return list("reason"="Banned","desc"="[desc]")
if (admin)
if (GLOB.directory[ckey])
diff --git a/code/modules/admin/sql_ban_system.dm b/code/modules/admin/sql_ban_system.dm
index 1a41102aed3..61caff93d6e 100644
--- a/code/modules/admin/sql_ban_system.dm
+++ b/code/modules/admin/sql_ban_system.dm
@@ -21,6 +21,12 @@
"player_ckey" = player_ckey,
"must_apply_to_admins" = !!(GLOB.admin_datums[player_ckey] || GLOB.deadmins[player_ckey]),
)
+ var/ssqlname = CONFIG_GET(string/serversqlname) // SKYRAT EDIT ADDITION BEGIN - MULTISERVER
+ var/server_check
+ if(CONFIG_GET(flag/respect_global_bans))
+ server_check = "(server_name = '[ssqlname]' OR global_ban = '1')"
+ else
+ server_check = "server_name = '[ssqlname]'" // SKYRAT EDIT ADDITION END - MULTISERVER
var/sql_roles
if(islist(roles))
var/list/sql_roles_list = list()
@@ -31,7 +37,7 @@
else
values["role"] = roles
sql_roles = ":role"
- var/datum/db_query/query_check_ban = SSdbcore.NewQuery({"
+ var/datum/db_query/query_check_ban = SSdbcore.NewQuery(/* SKYRAT EDIT CHANGE - MULTISERVER */{"
SELECT 1
FROM [format_table_name("ban")]
WHERE
@@ -39,6 +45,7 @@
role IN ([sql_roles]) AND
unbanned_datetime IS NULL AND
(expiration_time IS NULL OR expiration_time > NOW())
+ AND [server_check]
AND (NOT :must_apply_to_admins OR applies_to_admins = 1)
"}, values)
if(!query_check_ban.warn_execute())
@@ -54,7 +61,13 @@
/proc/is_banned_from_with_details(player_ckey, player_ip, player_cid, role)
if(!player_ckey && !player_ip && !player_cid)
return
- var/datum/db_query/query_check_ban = SSdbcore.NewQuery({"
+ var/ssqlname = CONFIG_GET(string/serversqlname) // SKYRAT EDIT ADDITION BEGIN - MULTISERVER
+ var/server_check
+ if(CONFIG_GET(flag/respect_global_bans))
+ server_check = "(server_name = '[ssqlname]' OR global_ban = '1')"
+ else
+ server_check = "server_name = '[ssqlname]'" // SKYRAT EDIT ADDITION END - MULTISERVER
+ var/datum/db_query/query_check_ban = SSdbcore.NewQuery(/* SKYRAT EDIT CHANGE - MULTISERVER */{"
SELECT
id,
bantime,
@@ -71,6 +84,7 @@
WHERE role = :role
AND (ckey = :ckey OR ip = INET_ATON(:ip) OR computerid = :computerid)
AND unbanned_datetime IS NULL
+ AND [server_check]
AND (expiration_time IS NULL OR expiration_time > NOW())
ORDER BY bantime DESC
"}, list("role" = role, "ckey" = player_ckey, "ip" = player_ip, "computerid" = player_cid))
@@ -90,8 +104,14 @@
var/is_admin = FALSE
if(GLOB.admin_datums[C.ckey] || GLOB.deadmins[C.ckey])
is_admin = TRUE
+ var/ssqlname = CONFIG_GET(string/serversqlname) // SKYRAT EDIT ADDITION BEGIN - MULTISERVER
+ var/server_check
+ if(CONFIG_GET(flag/respect_global_bans))
+ server_check = "(server_name = '[ssqlname]' OR global_ban = '1')"
+ else
+ server_check = "server_name = '[ssqlname]'" // SKYRAT EDIT ADDITION END - MULTISERVER
var/datum/db_query/query_build_ban_cache = SSdbcore.NewQuery(
- "SELECT role, applies_to_admins FROM [format_table_name("ban")] WHERE ckey = :ckey AND unbanned_datetime IS NULL AND (expiration_time IS NULL OR expiration_time > NOW())",
+ "SELECT role, applies_to_admins FROM [format_table_name("ban")] WHERE ckey = :ckey AND unbanned_datetime IS NULL AND (expiration_time IS NULL OR expiration_time > NOW()) AND [server_check]", // SKYRAT EDIT CHANGE - MULTISERVER
list("ckey" = C.ckey)
)
if(!query_build_ban_cache.warn_execute())
@@ -103,7 +123,7 @@
C.ban_cache[query_build_ban_cache.item[1]] = TRUE
qdel(query_build_ban_cache)
-/datum/admins/proc/ban_panel(player_key, player_ip, player_cid, role, duration = 1440, applies_to_admins, reason, edit_id, page, admin_key)
+/datum/admins/proc/ban_panel(player_key, player_ip, player_cid, role, duration = 1440, applies_to_admins, reason, edit_id, page, admin_key, global_ban) // SKYRAT EDIT CHANGE - MULTISERVER
var/panel_height = 620
if(edit_id)
panel_height = 240
@@ -171,7 +191,7 @@
-
+
+
+ Location
+
+
+
+
+
Reason
@@ -196,7 +227,7 @@
"}
if(edit_id)
- output += {"