#define REBOOT_MODE_NORMAL 0 #define REBOOT_MODE_HARD 1 #define REBOOT_MODE_SHUTDOWN 2 #define SERVICE_WORLD_PARAM "server_service" #define SERVICE_INSTANCE_PARAM "server_instance" #define SERVICE_PR_TEST_JSON "prtestjob.json" #define SERVICE_INTERFACE_DLL "TGDreamDaemonBridge.dll" #define SERVICE_INTERFACE_FUNCTION "DDEntryPoint" #define SERVICE_CMD_HARD_REBOOT "hard_reboot" #define SERVICE_CMD_GRACEFUL_SHUTDOWN "graceful_shutdown" #define SERVICE_CMD_WORLD_ANNOUNCE "world_announce" #define SERVICE_CMD_LIST_CUSTOM "list_custom_commands" #define SERVICE_CMD_API_COMPATIBLE "api_compat" #define SERVICE_CMD_PLAYER_COUNT "client_count" #define SERVICE_CMD_PARAM_KEY "serviceCommsKey" #define SERVICE_CMD_PARAM_COMMAND "command" #define SERVICE_CMD_PARAM_SENDER "sender" #define SERVICE_CMD_PARAM_CUSTOM "custom" #define SERVICE_REQUEST_KILL_PROCESS "killme" #define SERVICE_REQUEST_IRC_BROADCAST "irc" #define SERVICE_REQUEST_IRC_ADMIN_CHANNEL_MESSAGE "send2irc" #define SERVICE_REQUEST_WORLD_REBOOT "worldreboot" #define SERVICE_REQUEST_API_VERSION "api_ver" #define SERVICE_RETURN_SUCCESS "SUCCESS" #define TGS_FILE2LIST(filename) (splittext(trim_left(trim_right(file2text(filename))), "\n")) /datum/tgs_api/v3210 var/reboot_mode = REBOOT_MODE_NORMAL var/comms_key var/instance_name var/originmastercommit var/commit var/list/cached_custom_tgs_chat_commands var/warned_revison = FALSE var/warned_custom_commands = FALSE /datum/tgs_api/v3210/ApiVersion() return new /datum/tgs_version("3.2.1.3") /datum/tgs_api/v3210/proc/trim_left(text) for (var/i = 1 to length(text)) if (text2ascii(text, i) > 32) return copytext(text, i) return "" /datum/tgs_api/v3210/proc/trim_right(text) for (var/i = length(text), i > 0, i--) if (text2ascii(text, i) > 32) return copytext(text, 1, i + 1) return "" /datum/tgs_api/v3210/OnWorldNew(minimum_required_security_level) . = FALSE comms_key = world.params[SERVICE_WORLD_PARAM] instance_name = world.params[SERVICE_INSTANCE_PARAM] if(!instance_name) instance_name = "TG Station Server" //maybe just upgraded var/list/logs = TGS_FILE2LIST(".git/logs/HEAD") if(logs.len) logs = splittext(logs[logs.len], " ") if (logs.len >= 2) commit = logs[2] else TGS_ERROR_LOG("Error parsing commit logs") logs = TGS_FILE2LIST(".git/logs/refs/remotes/origin/master") if(logs.len) logs = splittext(logs[logs.len], " ") if (logs.len >= 2) originmastercommit = logs[2] else TGS_ERROR_LOG("Error parsing origin commmit logs") if(world.system_type != MS_WINDOWS) TGS_ERROR_LOG("This API version is only supported on Windows. Not running on Windows. Aborting initialization!") return ListServiceCustomCommands(TRUE) var/datum/tgs_version/api_version = ApiVersion() ExportService("[SERVICE_REQUEST_API_VERSION] [api_version.deprefixed_parameter]", TRUE) return TRUE //nothing to do for v3 /datum/tgs_api/v3210/OnInitializationComplete() return /datum/tgs_api/v3210/InstanceName() return world.params[SERVICE_INSTANCE_PARAM] /datum/tgs_api/v3210/proc/ExportService(command, skip_compat_check = FALSE) . = FALSE if(skip_compat_check && !fexists(SERVICE_INTERFACE_DLL)) TGS_ERROR_LOG("Service parameter present but no interface DLL detected. This is symptomatic of running a service less than version 3.1! Please upgrade.") return #if DM_VERSION >= 515 call_ext(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance_name, command) //trust no retval #else call(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance_name, command) //trust no retval #endif return TRUE /datum/tgs_api/v3210/OnTopic(T) var/list/params = params2list(T) var/their_sCK = params[SERVICE_CMD_PARAM_KEY] if(!their_sCK) return FALSE //continue world/Topic if(their_sCK != comms_key) return "Invalid comms key!"; var/command = params[SERVICE_CMD_PARAM_COMMAND] if(!command) return "No command!" switch(command) if(SERVICE_CMD_API_COMPATIBLE) return SERVICE_RETURN_SUCCESS if(SERVICE_CMD_HARD_REBOOT) if(reboot_mode != REBOOT_MODE_HARD) reboot_mode = REBOOT_MODE_HARD TGS_INFO_LOG("Hard reboot requested by service") TGS_NOTIFY_ADMINS("The world will hard reboot at the end of the game. Requested by TGS.") if(SERVICE_CMD_GRACEFUL_SHUTDOWN) if(reboot_mode != REBOOT_MODE_SHUTDOWN) reboot_mode = REBOOT_MODE_SHUTDOWN TGS_INFO_LOG("Shutdown requested by service") TGS_NOTIFY_ADMINS("The world will shutdown at the end of the game. Requested by TGS.") if(SERVICE_CMD_WORLD_ANNOUNCE) var/msg = params["message"] if(!istext(msg) || !msg) return "No message set!" TGS_WORLD_ANNOUNCE(msg) return SERVICE_RETURN_SUCCESS if(SERVICE_CMD_PLAYER_COUNT) return "[TGS_CLIENT_COUNT]" if(SERVICE_CMD_LIST_CUSTOM) return json_encode(ListServiceCustomCommands(FALSE)) else var/custom_command_result = HandleServiceCustomCommand(lowertext(command), params[SERVICE_CMD_PARAM_SENDER], params[SERVICE_CMD_PARAM_CUSTOM]) if(custom_command_result) return istext(custom_command_result) ? custom_command_result : SERVICE_RETURN_SUCCESS return "Unknown command: [command]" /datum/tgs_api/v3210/OnReboot() switch(reboot_mode) if(REBOOT_MODE_HARD) TGS_WORLD_ANNOUNCE("Hard reboot triggered, you will automatically reconnect...") EndProcess() if(REBOOT_MODE_SHUTDOWN) TGS_WORLD_ANNOUNCE("The server is shutting down...") EndProcess() else ExportService(SERVICE_REQUEST_WORLD_REBOOT) //just let em know /datum/tgs_api/v3210/TestMerges() //do the best we can here as the datum can't be completed using the v3 api . = list() if(!fexists(SERVICE_PR_TEST_JSON)) return var/list/json = json_decode(file2text(SERVICE_PR_TEST_JSON)) if(!json) return for(var/I in json) var/datum/tgs_revision_information/test_merge/tm = new tm.number = text2num(I) var/list/entry = json[I] tm.head_commit = entry["commit"] tm.author = entry["author"] tm.title = entry["title"] . += tm /datum/tgs_api/v3210/Revision() if(!warned_revison) var/datum/tgs_version/api_version = ApiVersion() TGS_WARNING_LOG("Use of TgsRevision on [api_version.deprefixed_parameter] origin_commit only points to master!") warned_revison = TRUE var/datum/tgs_revision_information/ri = new ri.commit = commit ri.origin_commit = originmastercommit return ri /datum/tgs_api/v3210/EndProcess() sleep(world.tick_lag) //flush the buffers ExportService(SERVICE_REQUEST_KILL_PROCESS) /datum/tgs_api/v3210/ChatChannelInfo() return list() // :omegalul: /datum/tgs_api/v3210/ChatBroadcast(datum/tgs_message_content/message, list/channels) if(channels) return TGS_UNIMPLEMENTED message = UpgradeDeprecatedChatMessage(message) ChatTargetedBroadcast(message, TRUE) ChatTargetedBroadcast(message, FALSE) /datum/tgs_api/v3210/ChatTargetedBroadcast(datum/tgs_message_content/message, admin_only) message = UpgradeDeprecatedChatMessage(message) ExportService("[admin_only ? SERVICE_REQUEST_IRC_ADMIN_CHANNEL_MESSAGE : SERVICE_REQUEST_IRC_BROADCAST] [message.text]") /datum/tgs_api/v3210/ChatPrivateMessage(message, datum/tgs_chat_user/user) UpgradeDeprecatedChatMessage(message) return TGS_UNIMPLEMENTED /datum/tgs_api/v3210/SecurityLevel() return TGS_SECURITY_TRUSTED #undef REBOOT_MODE_NORMAL #undef REBOOT_MODE_HARD #undef REBOOT_MODE_SHUTDOWN #undef SERVICE_WORLD_PARAM #undef SERVICE_INSTANCE_PARAM #undef SERVICE_PR_TEST_JSON #undef SERVICE_INTERFACE_DLL #undef SERVICE_INTERFACE_FUNCTION #undef SERVICE_CMD_HARD_REBOOT #undef SERVICE_CMD_GRACEFUL_SHUTDOWN #undef SERVICE_CMD_WORLD_ANNOUNCE #undef SERVICE_CMD_LIST_CUSTOM #undef SERVICE_CMD_API_COMPATIBLE #undef SERVICE_CMD_PLAYER_COUNT #undef SERVICE_CMD_PARAM_KEY #undef SERVICE_CMD_PARAM_COMMAND #undef SERVICE_CMD_PARAM_SENDER #undef SERVICE_CMD_PARAM_CUSTOM #undef SERVICE_REQUEST_KILL_PROCESS #undef SERVICE_REQUEST_IRC_BROADCAST #undef SERVICE_REQUEST_IRC_ADMIN_CHANNEL_MESSAGE #undef SERVICE_REQUEST_WORLD_REBOOT #undef SERVICE_REQUEST_API_VERSION #undef SERVICE_RETURN_SUCCESS #undef TGS_FILE2LIST