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(