diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000000..a9cfa17448
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,6 @@
+[*.dm]
+indent_style = tab
+indent_size = 4
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
diff --git a/src/DMAPI/tgs/v5/_defines.dm b/src/DMAPI/tgs/v5/_defines.dm
index f08e78c091..1d704d7cf8 100644
--- a/src/DMAPI/tgs/v5/_defines.dm
+++ b/src/DMAPI/tgs/v5/_defines.dm
@@ -1,9 +1,11 @@
-#define DMAPI5_PARAM_RUNTIME_INFORMATION_FILE "tgs_json"
+#define DMAPI5_PARAM_SERVER_PORT "tgs_port"
+#define DMAPI5_PARAM_ACCESS_IDENTIFIER "tgs_key"
+
#define DMAPI5_BRIDGE_DATA "data"
#define DMAPI5_TOPIC_DATA "tgs_data"
#define DMAPI5_BRIDGE_COMMAND_PORT_UPDATE 0
-#define DMAPI5_BRIDGE_COMMAND_VALIDATE 1
+#define DMAPI5_BRIDGE_COMMAND_STARTUP 1
#define DMAPI5_BRIDGE_COMMAND_PRIME 2
#define DMAPI5_BRIDGE_COMMAND_REBOOT 3
#define DMAPI5_BRIDGE_COMMAND_KILL 4
@@ -19,6 +21,7 @@
#define DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL "minimumSecurityLevel"
#define DMAPI5_BRIDGE_RESPONSE_NEW_PORT "newPort"
+#define DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION "runtimeInformation"
#define DMAPI5_CHAT_MESSAGE_TEXT "text"
#define DMAPI5_CHAT_MESSAGE_CHANNEL_IDS "channelIds"
@@ -31,8 +34,8 @@
#define DMAPI5_RUNTIME_INFORMATION_REVISION "revision"
#define DMAPI5_RUNTIME_INFORMATION_TEST_MERGES "testMerges"
#define DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL "securityLevel"
-#define DMAPI5_RUNTIME_INFORMATION_CHAT_COMMANDS_JSON "chatCommandsJson"
-#define DMAPI5_RUNTIME_INFORMATION_CHAT_CHANNELS_JSON "chatChannelsJson"
+
+#define DMAPI5_CHAT_UPDATE_CHANNELS "channels"
#define DMAPI5_TEST_MERGE_TIME_MERGED "timeMerged"
#define DMAPI5_TEST_MERGE_REVISION "revision"
@@ -56,6 +59,8 @@
#define DMAPI5_TOPIC_COMMAND_CHANGE_PORT 2
#define DMAPI5_TOPIC_COMMAND_CHANGE_REBOOT_STATE 3
#define DMAPI5_TOPIC_COMMAND_INSTANCE_RENAMED 4
+#define DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE 4
+#define DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE 5
#define DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE "commandType"
#define DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND "chatCommand"
@@ -63,6 +68,7 @@
#define DMAPI5_TOPIC_PARAMETER_NEW_PORT "newPort"
#define DMAPI5_TOPIC_PARAMETER_NEW_REBOOT_STATE "newRebootState"
#define DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME "newInstanceName"
+#define DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE "chatUpdate"
#define DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE "commandResponseMessage"
#define DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES "chatResponses"
diff --git a/src/DMAPI/tgs/v5/api.dm b/src/DMAPI/tgs/v5/api.dm
index 95513228d4..c1fc5aec7c 100644
--- a/src/DMAPI/tgs/v5/api.dm
+++ b/src/DMAPI/tgs/v5/api.dm
@@ -1,83 +1,84 @@
/datum/tgs_api/v5
- var/access_identifier
- var/instance_name
- var/json_path
- var/chat_channels_json_path
- var/chat_commands_json_path
- var/reboot_mode = TGS_REBOOT_MODE_NORMAL
- var/security_level
var/server_port
+ var/access_identifier
+
+ var/instance_name
+ var/security_level
+
+ var/reboot_mode = TGS_REBOOT_MODE_NORMAL
var/list/intercepted_message_queue
var/list/custom_commands
- var/list/cached_test_merges
- var/datum/tgs_revision_information/cached_revision
+ var/list/test_merges
+ var/datum/tgs_revision_information/revision
+ var/list/chat_channels
var/datum/tgs_event_handler/event_handler
- var/export_lock = FALSE
-
/datum/tgs_api/v5/ApiVersion()
return "5.0.0"
/datum/tgs_api/v5/OnWorldNew(datum/tgs_event_handler/event_handler, minimum_required_security_level)
- json_path = world.params[DMAPI5_PARAM_RUNTIME_INFORMATION_FILE]
- if(!json_path)
- TGS_ERROR_LOG("Missing [DMAPI5_PARAM_RUNTIME_INFORMATION_FILE] world parameter!")
- return
- var/json_file = file2text(json_path)
- if(!json_file)
- TGS_ERROR_LOG("Missing specified json file: [json_path]")
- return
- var/cached_json = json_decode(json_file)
- if(!cached_json)
- TGS_ERROR_LOG("Failed to decode info json: [json_file]")
- return
+ src.event_handler = event_handler
- access_identifier = cached_json[DMAPI5_RUNTIME_INFORMATION_ACCESS_IDENTIFIER]
- server_port = cached_json[DMAPI5_RUNTIME_INFORMATION_SERVER_PORT]
+ server_port = world.params[DMAPI5_PARAM_SERVER_PORT]
+ access_identifier = world.params[DMAPI5_PARAM_ACCESS_IDENTIFIER]
- if(cached_json[DMAPI5_RUNTIME_INFORMATION_API_VALIDATE_ONLY])
- TGS_INFO_LOG("Validating DMAPI and exiting...")
- Bridge(DMAPI5_BRIDGE_COMMAND_VALIDATE, list(DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL = minimum_required_security_level, DMAPI5_BRIDGE_PARAMETER_VERSION = ApiVersion()))
+ var/list/bridge_response = Bridge(DMAPI5_BRIDGE_COMMAND_STARTUP, list(DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL = minimum_required_security_level, DMAPI5_BRIDGE_PARAMETER_VERSION = ApiVersion(), DMAPI5_BRIDGE_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands()))
+ if(!istype(bridge_response))
+ TGS_ERROR_LOG("Failed initial bridge request!")
+ return FALSE
+
+ var/list/runtime_information = bridge_response[DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION]
+ if(!istype(runtime_information)
+ TGS_ERROR_LOG("Failed to decode runtime information from bridge response: [json_encode(bridge_response)]!")
+ return FALSE
+
+ if(runtime_information[DMAPI5_RUNTIME_INFORMATION_API_VALIDATE_ONLY])
+ TGS_INFO_LOG("DMAPI validation, exiting...")
del(world)
- security_level = cached_json[DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL]
- chat_channels_json_path = cached_json[DMAPI5_RUNTIME_INFORMATION_CHAT_CHANNELS_JSON]
- chat_commands_json_path = cached_json[DMAPI5_RUNTIME_INFORMATION_CHAT_COMMANDS_JSON]
- src.event_handler = event_handler
- instance_name = cached_json[DMAPI5_RUNTIME_INFORMATION_INSTANCE_NAME]
+ security_level = runtime_information[DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL]
+ instance_name = runtime_information[DMAPI5_RUNTIME_INFORMATION_INSTANCE_NAME]
- ListCustomCommands()
+ var/list/revisionData = runtime_information[DMAPI5_RUNTIME_INFORMATION_REVISION]
+ if(istype(revisionData))
+ revision = new
+ revision.commit = revisionData[DMAPI5_REVISION_INFORMATION_COMMIT_SHA]
+ revision.origin_commit = revisionData[DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA]
+ else
+ TGS_ERROR_LOG("Failed to decode [DMAPI5_RUNTIME_INFORMATION_REVISION] from runtime information!")
- var/list/revisionData = cached_json[DMAPI5_RUNTIME_INFORMATION_REVISION]
- if(revisionData)
- cached_revision = new
- cached_revision.commit = revisionData[DMAPI5_REVISION_INFORMATION_COMMIT_SHA]
- cached_revision.origin_commit = revisionData[DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA]
+ test_merges = list()
+ var/list/test_merge_json = runtime_information[DMAPI5_RUNTIME_INFORMATION_TEST_MERGES]
+ if(istype(test_merge_json))
+ for(var/entry in json)
+ var/datum/tgs_revision_information/test_merge/tm = new
+ tm.number = entry[DMAPI5_TEST_MERGE_NUMBER]
- cached_test_merges = list()
- var/list/json = cached_json[DMAPI5_RUNTIME_INFORMATION_TEST_MERGES]
- for(var/entry in json)
- var/datum/tgs_revision_information/test_merge/tm = new
- tm.time_merged = text2num(entry[DMAPI5_TEST_MERGE_TIME_MERGED])
+ var/list/revInfo = entry[DMAPI5_TEST_MERGE_REVISION]
+ if(revInfo)
+ tm.commit = revisionData[DMAPI5_REVISION_INFORMATION_COMMIT_SHA]
+ tm.origin_commit = revisionData[DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA]
+ else
+ TGS_ERROR_LOG("Failed to decode [DMAPI5_TEST_MERGE_REVISION] from test merge #[tm.number]!")
- var/list/revInfo = entry[DMAPI5_TEST_MERGE_REVISION]
- if(revInfo)
- tm.commit = revisionData[DMAPI5_REVISION_INFORMATION_COMMIT_SHA]
- tm.origin_commit = revisionData[DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA]
+ tm.time_merged = text2num(entry[DMAPI5_TEST_MERGE_TIME_MERGED])
+ tm.title = entry[DMAPI5_TEST_MERGE_TITLE_AT_MERGE]
+ tm.body = entry[DMAPI5_TEST_MERGE_BODY_AT_MERGE]
+ tm.url = entry[DMAPI5_TEST_MERGE_URL]
+ tm.author = entry[DMAPI5_TEST_MERGE_AUTHOR]
+ tm.pull_request_commit = entry[DMAPI5_TEST_MERGE_PULL_REQUEST_REVISION]
+ tm.comment = entry[DMAPI5_TEST_MERGE_COMMENT]
- tm.title = entry[DMAPI5_TEST_MERGE_TITLE_AT_MERGE]
- tm.body = entry[DMAPI5_TEST_MERGE_BODY_AT_MERGE]
- tm.url = entry[DMAPI5_TEST_MERGE_URL]
- tm.author = entry[DMAPI5_TEST_MERGE_AUTHOR]
- tm.number = entry[DMAPI5_TEST_MERGE_NUMBER]
- tm.pull_request_commit = entry[DMAPI5_TEST_MERGE_PULL_REQUEST_REVISION]
- tm.comment = entry[DMAPI5_TEST_MERGE_COMMENT]
+ test_merges += tm
+ else
+ TGS_ERROR_LOG("Failed to decode [DMAPI5_RUNTIME_INFORMATION_TEST_MERGES] from runtime information!")
- cached_test_merges += tm
+ chat_channels = list()
+ DecodeChannels(runtime_information)
return TRUE
@@ -91,8 +92,12 @@
if(world.sleep_offline == tgs4_secret_sleep_offline_sauce) //if not someone changed it
world.sleep_offline = old_sleep_offline
-/datum/tgs_api/v5/proc/TopicError(message)
- return json_encode(list(DMAPI5_RESPONSE_ERROR_MESSAGE = message))
+/datum/tgs_api/v5/proc/TopicResponse(error_message = null)
+ var/list/response = list()
+ if(error_message)
+ response[DMAPI5_RESPONSE_ERROR_MESSAGE] = error_message
+
+ return json_encode(response)
/datum/tgs_api/v5/OnTopic(T)
var/list/params = params2list(T)
@@ -102,27 +107,37 @@
var/list/topic_parameters = json_decode(json)
if(!topic_parameters)
- return TopicError("Invalid topic parameters json!");
+ return TopicResponse("Invalid topic parameters json!");
var/their_sCK = topic_parameters[DMAPI5_PARAMETER_ACCESS_IDENTIFIER]
if(their_sCK != access_identifier)
- return TopicError("Invalid access identifier!");
+ return TopicResponse("Failed to decode [[DMAPI5_PARAMETER_ACCESS_IDENTIFIER]] from: [json]!");
var/command = topic_parameters[DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE]
- if(command == null)
- return TopicError("No command type!")
+ if(!isnum(command))
+ return TopicResponse("Failed to decode [[DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE]] from: [json]!")
switch(command)
if(DMAPI5_TOPIC_COMMAND_CHAT_COMMAND)
var/result = HandleCustomCommand(topic_parameters[DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND])
if(!result)
- result = TopicError("Error running chat command!")
+ result = TopicResponse("Error running chat command!")
return result
if(DMAPI5_TOPIC_COMMAND_EVENT_NOTIFICATION)
intercepted_message_queue = list()
var/list/event_notification = topic_parameters[DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION]
+ if(!istype(event_notification))
+ return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION]!")
+
+ var/event_type = event_notification[DMAPI5_EVENT_NOTIFICATION_TYPE]
+ if(!isnum(event_type))
+ return TopicResponse("Invalid or missing [DMAPI5_EVENT_NOTIFICATION_TYPE]!")
+
var/list/event_parameters = event_notification[DMAPI5_EVENT_NOTIFICATION_PARAMETERS]
- var/list/event_call = list(event_notification[DMAPI5_EVENT_NOTIFICATION_TYPE])
+ if(!istype(event_parameters))
+ return TopicResponse("Invalid or missing [DMAPI5_EVENT_NOTIFICATION_PARAMETERS]!")
+
+ var/list/event_call = list(event_type)
if(event_parameters)
event_call += event_parameters
@@ -135,31 +150,52 @@
intercepted_message_queue = null
return json_encode(response)
if(DMAPI5_TOPIC_COMMAND_CHANGE_PORT)
- var/new_port = text2num(topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT])
- if (!(new_port > 0))
- return TopicError("Invalid port: [new_port]")
+ var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT]
+ if (!isnum(new_port) || !(new_port > 0))
+ return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]")
- //the topic still completes, miraculously
- //I honestly didn't believe byond could do it
if(event_handler != null)
event_handler.HandleEvent(TGS_EVENT_PORT_SWAP, new_port)
+
+ //the topic still completes, miraculously
+ //I honestly didn't believe byond could do it without exploding
if(!world.OpenPort(new_port))
- return TopicError("Port change failed!")
- return json_encode(list())
+ return TopicResponse("Port change failed!")
+
+ return TopicResponse()
if(DMAPI5_TOPIC_COMMAND_CHANGE_REBOOT_STATE)
- var/new_reboot_mode = text2num(topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_REBOOT_STATE])
+ var/new_reboot_mode = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_REBOOT_STATE]
+ if(!isnum(new_reboot_mode))
+ return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_REBOOT_STATE]!")
+
if(event_handler != null)
event_handler.HandleEvent(TGS_EVENT_REBOOT_MODE_CHANGE, reboot_mode, new_reboot_mode)
+
reboot_mode = new_reboot_mode
- return json_encode(list())
+ return TopicResponse()
if(DMAPI5_TOPIC_COMMAND_INSTANCE_RENAMED)
var/new_instance_name = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME]
- if(!new_instance_name)
- return TopicError("Missing new instance name!")
- instance_name = new_instance_name
- return json_encode(list())
+ if(!istext(new_instance_name))
+ return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME]!")
- return TopicError("Unknown command: [command]")
+ instance_name = new_instance_name
+ return TopicResponse()
+ if(DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE)
+ var/list/chat_update_json = topic_parameters[DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE]
+ if(!istype(chat_update_json))
+ return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE]!")
+
+ DecodeChannels(chat_channels_json)
+ return TopicResponse()
+ if(DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE)
+ var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT]
+ if (!isnum(new_port) || !(new_port > 0))
+ return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]")
+
+ server_port = new_port
+ return TopicResponse()
+
+ return TopicResponse("Unknown command: [command]")
/datum/tgs_api/v5/proc/Bridge(command, list/data)
if(command == null)
@@ -220,13 +256,13 @@
return instance_name
/datum/tgs_api/v5/TestMerges()
- return cached_test_merges
+ return test_merges
/datum/tgs_api/v5/EndProcess()
Bridge(DMAPI5_BRIDGE_COMMAND_KILL)
/datum/tgs_api/v5/Revision()
- return cached_revision
+ return revision
/datum/tgs_api/v5/ChatBroadcast(message, list/channels)
var/list/ids
@@ -261,11 +297,18 @@
Bridge(TGS4_COMM_CHAT, message)
/datum/tgs_api/v5/ChatChannelInfo()
- . = list()
- //no caching cause tgs may change this
- var/list/json = json_decode(file2text(chat_channels_json_path))
- for(var/I in json)
- . += DecodeChannel(I)
+ return chat_channels
+
+/datum/tgs_api/v5/proc/DecodeChannels(chat_update_json)
+ var/list/chat_channels_json = runtime_information[DMAPI5_CHAT_UPDATE_CHANNELS]
+ if(istype(chat_channels_json))
+ chat_channels.Cut()
+ for(var/channel_json in chat_channels_json)
+ var/datum/tgs_chat_channel/channel = DecodeChannel(channel_json)
+ if(channel)
+ chat_channels += channel
+ else
+ TGS_ERROR_LOG("Failed to decode [DMAPI5_CHAT_UPDATE_CHANNELS] from channel update!")
/datum/tgs_api/v5/proc/DecodeChannel(channel_json)
var/datum/tgs_chat_channel/channel = new
diff --git a/src/DMAPI/tgs/v5/commands.dm b/src/DMAPI/tgs/v5/commands.dm
index a59840ba95..9f33c423aa 100644
--- a/src/DMAPI/tgs/v5/commands.dm
+++ b/src/DMAPI/tgs/v5/commands.dm
@@ -1,6 +1,5 @@
/datum/tgs_api/v5/proc/ListCustomCommands()
var/results = list()
- custom_commands = list()
for(var/I in typesof(/datum/tgs_chat_command) - /datum/tgs_chat_command)
var/datum/tgs_chat_command/stc = new I
var/command_name = stc.name
@@ -15,10 +14,7 @@
results += list(list(DMAPI5_CUSTOM_CHAT_COMMAND_NAME = command_name, DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT = stc.help_text, DMAPI5_CUSTOM_CHAT_COMMAND_ADMIN_ONLY = stc.admin_only))
custom_commands[command_name] = stc
- var/commands_file = chat_commands_json_path
- if(!commands_file)
- return
- text2file(json_encode(results), commands_file)
+ return results
/datum/tgs_api/v5/proc/HandleCustomCommand(list/command_json)
var/command = command_json[DMAPI5_CHAT_COMMAND_NAME]
diff --git a/src/DMAPI/tgs/v5/undef.dm b/src/DMAPI/tgs/v5/undef.dm
index a16ad00e38..e7beaae875 100644
--- a/src/DMAPI/tgs/v5/undef.dm
+++ b/src/DMAPI/tgs/v5/undef.dm
@@ -1,9 +1,11 @@
-#undef DMAPI5_PARAM_RUNTIME_INFORMATION_FILE
+#undef DMAPI5_PARAM_SERVER_PORT
+#undef DMAPI5_PARAM_ACCESS_IDENTIFIER
+
#undef DMAPI5_BRIDGE_DATA
#undef DMAPI5_TOPIC_DATA
#undef DMAPI5_BRIDGE_COMMAND_PORT_UPDATE
-#undef DMAPI5_BRIDGE_COMMAND_VALIDATE
+#undef DMAPI5_BRIDGE_COMMAND_STARTUP
#undef DMAPI5_BRIDGE_COMMAND_PRIME
#undef DMAPI5_BRIDGE_COMMAND_REBOOT
#undef DMAPI5_BRIDGE_COMMAND_KILL
@@ -19,6 +21,7 @@
#undef DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL
#undef DMAPI5_BRIDGE_RESPONSE_NEW_PORT
+#undef DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION
#undef DMAPI5_CHAT_MESSAGE_TEXT
#undef DMAPI5_CHAT_MESSAGE_CHANNEL_IDS
@@ -31,8 +34,8 @@
#undef DMAPI5_RUNTIME_INFORMATION_REVISION
#undef DMAPI5_RUNTIME_INFORMATION_TEST_MERGES
#undef DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL
-#undef DMAPI5_RUNTIME_INFORMATION_CHAT_COMMANDS_JSON
-#undef DMAPI5_RUNTIME_INFORMATION_CHAT_CHANNELS_JSON
+
+#undef DMAPI5_CHAT_UPDATE_CHANNELS
#undef DMAPI5_TEST_MERGE_TIME_MERGED
#undef DMAPI5_TEST_MERGE_REVISION
@@ -56,6 +59,8 @@
#undef DMAPI5_TOPIC_COMMAND_CHANGE_PORT
#undef DMAPI5_TOPIC_COMMAND_CHANGE_REBOOT_STATE
#undef DMAPI5_TOPIC_COMMAND_INSTANCE_RENAMED
+#undef DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE
+#undef DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE
#undef DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE
#undef DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND
@@ -63,6 +68,7 @@
#undef DMAPI5_TOPIC_PARAMETER_NEW_PORT
#undef DMAPI5_TOPIC_PARAMETER_NEW_REBOOT_STATE
#undef DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME
+#undef DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE
#undef DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE
#undef DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES
diff --git a/src/Tgstation.Server.Host/Components/Chat/ChannelRepresentation.cs b/src/Tgstation.Server.Host/Components/Chat/ChannelRepresentation.cs
index d9acbbbf16..10716ea21e 100644
--- a/src/Tgstation.Server.Host/Components/Chat/ChannelRepresentation.cs
+++ b/src/Tgstation.Server.Host/Components/Chat/ChannelRepresentation.cs
@@ -18,7 +18,7 @@ namespace Tgstation.Server.Host.Components.Chat
///
/// The channel Id.
///
- /// remaps this to an internal id using
+ /// remaps this to an internal id using . Not sent over the DMAPI.
[JsonIgnore]
public ulong RealId
{
diff --git a/src/Tgstation.Server.Host/Components/Interop/ChatChannelsUpdate.cs b/src/Tgstation.Server.Host/Components/Interop/ChatUpdate.cs
similarity index 100%
rename from src/Tgstation.Server.Host/Components/Interop/ChatChannelsUpdate.cs
rename to src/Tgstation.Server.Host/Components/Interop/ChatUpdate.cs
diff --git a/src/Tgstation.Server.Host/Components/Interop/Topic/TopicParameters.cs b/src/Tgstation.Server.Host/Components/Interop/Topic/TopicParameters.cs
index 926222acb9..6628734122 100644
--- a/src/Tgstation.Server.Host/Components/Interop/Topic/TopicParameters.cs
+++ b/src/Tgstation.Server.Host/Components/Interop/Topic/TopicParameters.cs
@@ -39,9 +39,9 @@ namespace Tgstation.Server.Host.Components.Interop.Topic
public string NewInstanceName { get; }
///
- /// The for requests.
+ /// The for requests.
///
- public ChatChannelsUpdate ChannelsUpdate { get; }
+ public ChatUpdate ChatUpdate { get; }
///
/// Initializes a new instance of the .
@@ -106,11 +106,11 @@ namespace Tgstation.Server.Host.Components.Interop.Topic
///
/// Initializes a new instance of the .
///
- /// The value of .
- public TopicParameters(ChatChannelsUpdate channelsUpdate)
+ /// The value of .
+ public TopicParameters(ChatUpdate channelsUpdate)
: this(TopicCommandType.ChatChannelsUpdate)
{
- ChannelsUpdate = channelsUpdate ?? throw new ArgumentNullException(nameof(channelsUpdate));
+ ChatUpdate = channelsUpdate ?? throw new ArgumentNullException(nameof(channelsUpdate));
}
}
}
diff --git a/src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs b/src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs
index 5d084a3614..193ceef691 100644
--- a/src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs
+++ b/src/Tgstation.Server.Host/Components/Watchdog/SessionController.cs
@@ -620,7 +620,7 @@ namespace Tgstation.Server.Host.Components.Watchdog
public Task UpdateChannels(IEnumerable newChannels, CancellationToken cancellationToken)
=> SendCommand(
new TopicParameters(
- new ChatChannelsUpdate(newChannels)),
+ new ChatUpdate(newChannels)),
cancellationToken);
}
}
diff --git a/src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs b/src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs
index bcff6f4291..809938ecea 100644
--- a/src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs
+++ b/src/Tgstation.Server.Host/Components/Watchdog/SessionControllerFactory.cs
@@ -192,20 +192,22 @@ namespace Tgstation.Server.Host.Components.Watchdog
if (launchParameters.SecurityLevel == DreamDaemonSecurity.Trusted)
await byondLock.TrustDmbPath(ioManager.ConcatPath(basePath, dmbProvider.DmbName), cancellationToken).ConfigureAwait(false);
+ var runtimeInformation = CreateRuntimeInformation(dmbProvider, chatTrackingContext, launchParameters.SecurityLevel.Value);
+
// set command line options
// more sanitization here cause it uses the same scheme
- var parameters = $"{DMApiConstants.ParamApiVersion}={byondTopicSender.SanitizeString(DMApiConstants.Version.Semver())}&{byondTopicSender.SanitizeString(DMApiConstants.ParamServerPort)}={serverPortProvider.HttpApiPort}";
+ var parameters = $"{DMApiConstants.ParamApiVersion}={byondTopicSender.SanitizeString(DMApiConstants.Version.Semver())}&{byondTopicSender.SanitizeString(DMApiConstants.ParamServerPort)}={serverPortProvider.HttpApiPort}&{byondTopicSender.SanitizeString(DMApiConstants.ParamAccessIdentifier)}={runtimeInformation.AccessIdentifier}";
var visibility = apiValidate ? "invisible" : "public";
// important to run on all ports to allow port changing
- var arguments = String.Format(CultureInfo.InvariantCulture, "{0} -port {1} -ports 1-65535 {2}-close -{3} -{5} -public -params \"{4}\"",
+ var arguments = String.Format(CultureInfo.InvariantCulture, "{0} -port {1} -ports 1-65535 {2}-close -{3} -{4} -public -params \"{5}\"",
dmbProvider.DmbName,
primaryPort ? launchParameters.PrimaryPort : launchParameters.SecondaryPort,
launchParameters.AllowWebClient.Value ? "-webclient " : String.Empty,
SecurityWord(launchParameters.SecurityLevel.Value),
- parameters,
- visibility);
+ visibility,
+ parameters);
// See https://github.com/tgstation/tgstation-server/issues/719
var noShellExecute = !platformIdentifier.IsWindows;
@@ -215,7 +217,6 @@ namespace Tgstation.Server.Host.Components.Watchdog
try
{
networkPromptReaper.RegisterProcess(process);
- var runtimeInformation = CreateRuntimeInformation(dmbProvider, chatTrackingContext, launchParameters.SecurityLevel.Value);
// return the session controller for it
var reattachInformation = new ReattachInformation(