mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2026-08-30 08:07:03 +01:00
Update TGS DMAPI
This commit is contained in:
@@ -5,4 +5,5 @@ This folder contains all DMAPI code not directly involved in an API.
|
||||
- [_definitions.dm](./definitions.dm) contains defines needed across DMAPI internals.
|
||||
- [core.dm](./core.dm) contains the implementations of the `/world/proc/TgsXXX()` procs. Many map directly to the `/datum/tgs_api` functions. It also contains the /datum selection and setup code.
|
||||
- [datum.dm](./datum.dm) contains the `/datum/tgs_api` declarations that all APIs must implement.
|
||||
- [tgs_version.dm](./tgs_version.dm) contains the `/datum/tgs_version` definition
|
||||
- [tgs_version.dm](./tgs_version.dm) contains the `/datum/tgs_version` definition
|
||||
-
|
||||
|
||||
@@ -4,6 +4,8 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null)
|
||||
var/datum/tgs_version/version
|
||||
var/datum/tgs_event_handler/event_handler
|
||||
|
||||
var/list/warned_deprecated_command_runs
|
||||
|
||||
/datum/tgs_api/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version)
|
||||
. = ..()
|
||||
src.event_handler = event_handler
|
||||
|
||||
@@ -14,4 +14,5 @@
|
||||
#include "v5\_defines.dm"
|
||||
#include "v5\api.dm"
|
||||
#include "v5\commands.dm"
|
||||
#include "v5\serializers.dm"
|
||||
#include "v5\undefs.dm"
|
||||
|
||||
@@ -193,16 +193,19 @@
|
||||
/datum/tgs_api/v3210/ChatChannelInfo()
|
||||
return list() // :omegalul:
|
||||
|
||||
/datum/tgs_api/v3210/ChatBroadcast(message, list/channels)
|
||||
/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(message, admin_only)
|
||||
ExportService("[admin_only ? SERVICE_REQUEST_IRC_ADMIN_CHANNEL_MESSAGE : SERVICE_REQUEST_IRC_BROADCAST] [message]")
|
||||
/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()
|
||||
|
||||
@@ -49,4 +49,7 @@
|
||||
sender = "<@[sender]>"
|
||||
|
||||
user.mention = sender
|
||||
return stc.Run(user, params) || TRUE
|
||||
var/datum/tgs_message_content/result = stc.Run(user, params)
|
||||
result = UpgradeDeprecatedCommandResponse(result, command)
|
||||
|
||||
return result?.text || TRUE
|
||||
|
||||
@@ -256,33 +256,36 @@
|
||||
/datum/tgs_api/v4/Revision()
|
||||
return cached_revision
|
||||
|
||||
/datum/tgs_api/v4/ChatBroadcast(message, list/channels)
|
||||
/datum/tgs_api/v4/ChatBroadcast(datum/tgs_message_content/message, list/channels)
|
||||
var/list/ids
|
||||
if(length(channels))
|
||||
ids = list()
|
||||
for(var/I in channels)
|
||||
var/datum/tgs_chat_channel/channel = I
|
||||
ids += channel.id
|
||||
message = list("message" = message, "channelIds" = ids)
|
||||
message = UpgradeDeprecatedChatMessage(message)
|
||||
message = list("message" = message.text, "channelIds" = ids)
|
||||
if(intercepted_message_queue)
|
||||
intercepted_message_queue += list(message)
|
||||
else
|
||||
Export(TGS4_COMM_CHAT, message)
|
||||
|
||||
/datum/tgs_api/v4/ChatTargetedBroadcast(message, admin_only)
|
||||
/datum/tgs_api/v4/ChatTargetedBroadcast(datum/tgs_message_content/message, admin_only)
|
||||
var/list/channels = list()
|
||||
for(var/I in ChatChannelInfo())
|
||||
var/datum/tgs_chat_channel/channel = I
|
||||
if (!channel.is_private_channel && ((channel.is_admin_channel && admin_only) || (!channel.is_admin_channel && !admin_only)))
|
||||
channels += channel.id
|
||||
message = list("message" = message, "channelIds" = channels)
|
||||
message = UpgradeDeprecatedChatMessage(message)
|
||||
message = list("message" = message.text, "channelIds" = channels)
|
||||
if(intercepted_message_queue)
|
||||
intercepted_message_queue += list(message)
|
||||
else
|
||||
Export(TGS4_COMM_CHAT, message)
|
||||
|
||||
/datum/tgs_api/v4/ChatPrivateMessage(message, datum/tgs_chat_user/user)
|
||||
message = list("message" = message, "channelIds" = list(user.channel.id))
|
||||
/datum/tgs_api/v4/ChatPrivateMessage(datum/tgs_message_content/message, datum/tgs_chat_user/user)
|
||||
message = UpgradeDeprecatedChatMessage(message)
|
||||
message = list("message" = message.text, "channelIds" = list(user.channel.id))
|
||||
if(intercepted_message_queue)
|
||||
intercepted_message_queue += list(message)
|
||||
else
|
||||
|
||||
@@ -34,8 +34,8 @@
|
||||
|
||||
var/datum/tgs_chat_command/sc = custom_commands[command]
|
||||
if(sc)
|
||||
var/result = sc.Run(u, params)
|
||||
if(result == null)
|
||||
result = ""
|
||||
return result
|
||||
var/datum/tgs_message_content/result = sc.Run(u, params)
|
||||
result = UpgradeDeprecatedCommandResponse(result, command)
|
||||
|
||||
return result?.text
|
||||
return "Unknown command: [command]!"
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
|
||||
This DMAPI implements bridge requests using HTTP GET requests to TGS. It has no security restrictions.
|
||||
|
||||
- [__interop_version.dm](./__interop_version.dm) contains the version of the API used between the DMAPI and TGS.
|
||||
- [_defines.dm](./_defines.dm) contains constant definitions.
|
||||
- [api.dm](./api.dm) contains the bulk of the API code.
|
||||
- [commands.dm](./commands.dm) contains functions relating to `/datum/tgs_chat_command`s.
|
||||
- [serializers.dm](./serializers.dm) contains function to help convert interop `/datum`s into a JSON encodable `list()` format.
|
||||
- [undefs.dm](./undefs.dm) Undoes the work of `_defines.dm`.
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
"5.4.0"
|
||||
@@ -25,7 +25,6 @@
|
||||
#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"
|
||||
|
||||
#define DMAPI5_RUNTIME_INFORMATION_ACCESS_IDENTIFIER "accessIdentifier"
|
||||
@@ -75,6 +74,7 @@
|
||||
#define DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE "chatUpdate"
|
||||
#define DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION "newServerVersion"
|
||||
|
||||
#define DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE "commandResponse"
|
||||
#define DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE "commandResponseMessage"
|
||||
#define DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES "chatResponses"
|
||||
|
||||
@@ -93,6 +93,7 @@
|
||||
#define DMAPI5_CHAT_CHANNEL_IS_ADMIN_CHANNEL "isAdminChannel"
|
||||
#define DMAPI5_CHAT_CHANNEL_IS_PRIVATE_CHANNEL "isPrivateChannel"
|
||||
#define DMAPI5_CHAT_CHANNEL_TAG "tag"
|
||||
#define DMAPI5_CHAT_CHANNEL_EMBEDS_SUPPORTED "embedsSupported"
|
||||
|
||||
#define DMAPI5_CUSTOM_CHAT_COMMAND_NAME "name"
|
||||
#define DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT "helpText"
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
/datum/tgs_api/v5/ApiVersion()
|
||||
return new /datum/tgs_version(
|
||||
#include "interop_version.dm"
|
||||
#include "__interop_version.dm"
|
||||
)
|
||||
|
||||
/datum/tgs_api/v5/OnWorldNew(minimum_required_security_level)
|
||||
@@ -104,6 +104,7 @@
|
||||
return json_encode(response)
|
||||
|
||||
/datum/tgs_api/v5/OnTopic(T)
|
||||
RequireInitialBridgeResponse()
|
||||
var/list/params = params2list(T)
|
||||
var/json = params[DMAPI5_TOPIC_DATA]
|
||||
if(!json)
|
||||
@@ -297,7 +298,15 @@
|
||||
RequireInitialBridgeResponse()
|
||||
return revision
|
||||
|
||||
/datum/tgs_api/v5/ChatBroadcast(message, list/channels)
|
||||
// Common proc b/c it's used by the V3/V4 APIs
|
||||
/datum/tgs_api/proc/UpgradeDeprecatedChatMessage(datum/tgs_message_content/message)
|
||||
if(!istext(message))
|
||||
return message
|
||||
|
||||
TGS_WARNING_LOG("Received legacy string when a [/datum/tgs_message_content] was expected. Please audit all calls to TgsChatBroadcast, TgsChatTargetedBroadcast, and TgsChatPrivateMessage to ensure they use the new /datum.")
|
||||
return new /datum/tgs_message_content(message)
|
||||
|
||||
/datum/tgs_api/v5/ChatBroadcast(datum/tgs_message_content/message, list/channels)
|
||||
if(!length(channels))
|
||||
channels = ChatChannelInfo()
|
||||
|
||||
@@ -306,26 +315,33 @@
|
||||
var/datum/tgs_chat_channel/channel = I
|
||||
ids += channel.id
|
||||
|
||||
message = list(DMAPI5_CHAT_MESSAGE_TEXT = message, DMAPI5_CHAT_MESSAGE_CHANNEL_IDS = ids)
|
||||
message = UpgradeDeprecatedChatMessage(message)
|
||||
message = message._interop_serialize()
|
||||
message[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = ids
|
||||
if(intercepted_message_queue)
|
||||
intercepted_message_queue += list(message)
|
||||
else
|
||||
Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message))
|
||||
|
||||
/datum/tgs_api/v5/ChatTargetedBroadcast(message, admin_only)
|
||||
/datum/tgs_api/v5/ChatTargetedBroadcast(datum/tgs_message_content/message, admin_only)
|
||||
var/list/channels = list()
|
||||
for(var/I in ChatChannelInfo())
|
||||
var/datum/tgs_chat_channel/channel = I
|
||||
if (!channel.is_private_channel && ((channel.is_admin_channel && admin_only) || (!channel.is_admin_channel && !admin_only)))
|
||||
channels += channel.id
|
||||
message = list(DMAPI5_CHAT_MESSAGE_TEXT = message, DMAPI5_CHAT_MESSAGE_CHANNEL_IDS = channels)
|
||||
|
||||
message = UpgradeDeprecatedChatMessage(message)
|
||||
message = message._interop_serialize()
|
||||
message[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = channels
|
||||
if(intercepted_message_queue)
|
||||
intercepted_message_queue += list(message)
|
||||
else
|
||||
Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message))
|
||||
|
||||
/datum/tgs_api/v5/ChatPrivateMessage(message, datum/tgs_chat_user/user)
|
||||
message = list(DMAPI5_CHAT_MESSAGE_TEXT = message, DMAPI5_CHAT_MESSAGE_CHANNEL_IDS = list(user.channel.id))
|
||||
/datum/tgs_api/v5/ChatPrivateMessage(datum/tgs_message_content/message, datum/tgs_chat_user/user)
|
||||
message = UpgradeDeprecatedChatMessage(message)
|
||||
message = message._interop_serialize()
|
||||
message[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = list(user.channel.id)
|
||||
if(intercepted_message_queue)
|
||||
intercepted_message_queue += list(message)
|
||||
else
|
||||
@@ -354,6 +370,7 @@
|
||||
channel.is_admin_channel = channel_json[DMAPI5_CHAT_CHANNEL_IS_ADMIN_CHANNEL]
|
||||
channel.is_private_channel = channel_json[DMAPI5_CHAT_CHANNEL_IS_PRIVATE_CHANNEL]
|
||||
channel.custom_tag = channel_json[DMAPI5_CHAT_CHANNEL_TAG]
|
||||
channel.embeds_supported = channel_json[DMAPI5_CHAT_CHANNEL_EMBEDS_SUPPORTED]
|
||||
return channel
|
||||
|
||||
/datum/tgs_api/v5/SecurityLevel()
|
||||
|
||||
@@ -30,11 +30,28 @@
|
||||
|
||||
var/datum/tgs_chat_command/sc = custom_commands[command]
|
||||
if(sc)
|
||||
var/text_response = sc.Run(u, params)
|
||||
var/datum/tgs_message_content/response = sc.Run(u, params)
|
||||
response = UpgradeDeprecatedCommandResponse(response, command)
|
||||
|
||||
var/list/topic_response = list()
|
||||
if(!istext(text_response))
|
||||
TGS_ERROR_LOG("Custom command [command] should return a string! Got: \"[text_response]\"")
|
||||
text_response = null
|
||||
topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE] = text_response
|
||||
topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE] = response?.text
|
||||
topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE] = response?._interop_serialize()
|
||||
return json_encode(topic_response)
|
||||
return TopicResponse("Unknown custom chat command: [command]!")
|
||||
|
||||
// Common proc b/c it's used by the V3/V4 APIs
|
||||
/datum/tgs_api/proc/UpgradeDeprecatedCommandResponse(datum/tgs_message_content/response, command)
|
||||
// Backwards compatibility, used to return a string
|
||||
if(istext(response))
|
||||
warned_deprecated_command_runs = warned_deprecated_command_runs || list()
|
||||
if(!warned_deprecated_command_runs[command])
|
||||
TGS_WARNING_LOG("Custom chat command \"[command]\" is still returning a string. This behaviour is deprecated, please upgrade it to return a [/datum/tgs_message_content].")
|
||||
warned_deprecated_command_runs[command] = TRUE
|
||||
|
||||
return new /datum/tgs_message_content(response)
|
||||
|
||||
if(!istype(response))
|
||||
TGS_ERROR_LOG("Custom chat command \"[command]\" should return a [/datum/tgs_message_content]! Got: \"[response]\"")
|
||||
return null
|
||||
|
||||
return response
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
"5.3.0"
|
||||
@@ -0,0 +1,52 @@
|
||||
/datum/tgs_message_content/proc/_interop_serialize()
|
||||
return list("text" = text, "embed" = embed?._interop_serialize())
|
||||
|
||||
/datum/tgs_chat_embed/proc/_interop_serialize()
|
||||
CRASH("Base /proc/interop_serialize called on [type]!")
|
||||
|
||||
/datum/tgs_chat_embed/structure/_interop_serialize()
|
||||
var/list/serialized_fields
|
||||
if(islist(fields))
|
||||
serialized_fields = list()
|
||||
for(var/datum/tgs_chat_embed/field/field as anything in fields)
|
||||
serialized_fields += list(field._interop_serialize())
|
||||
return list(
|
||||
"title" = title,
|
||||
"description" = description,
|
||||
"url" = url,
|
||||
"timestamp" = timestamp,
|
||||
"colour" = colour,
|
||||
"image" = image?._interop_serialize(),
|
||||
"thumbnail" = thumbnail?._interop_serialize(),
|
||||
"video" = video?._interop_serialize(),
|
||||
"footer" = footer?._interop_serialize(),
|
||||
"provider" = provider?._interop_serialize(),
|
||||
"author" = author?._interop_serialize(),
|
||||
"fields" = serialized_fields
|
||||
)
|
||||
|
||||
/datum/tgs_chat_embed/media/_interop_serialize()
|
||||
return list(
|
||||
"url" = url,
|
||||
"width" = width,
|
||||
"height" = height,
|
||||
"proxyUrl" = proxy_url
|
||||
)
|
||||
|
||||
/datum/tgs_chat_embed/provider/_interop_serialize()
|
||||
return list(
|
||||
"url" = url,
|
||||
"name" = name
|
||||
)
|
||||
|
||||
/datum/tgs_chat_embed/provider/author/_interop_serialize()
|
||||
. = ..()
|
||||
.["iconUrl"] = icon_url
|
||||
.["proxyIconUrl"] = proxy_icon_url
|
||||
|
||||
/datum/tgs_chat_embed/field/_interop_serialize()
|
||||
return list(
|
||||
"name" = name,
|
||||
"value" = value,
|
||||
"isInline" = is_inline
|
||||
)
|
||||
@@ -25,7 +25,6 @@
|
||||
#undef DMAPI5_BRIDGE_RESPONSE_NEW_PORT
|
||||
#undef DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION
|
||||
|
||||
#undef DMAPI5_CHAT_MESSAGE_TEXT
|
||||
#undef DMAPI5_CHAT_MESSAGE_CHANNEL_IDS
|
||||
|
||||
#undef DMAPI5_RUNTIME_INFORMATION_ACCESS_IDENTIFIER
|
||||
@@ -75,6 +74,7 @@
|
||||
#undef DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE
|
||||
#undef DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION
|
||||
|
||||
#undef DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE
|
||||
#undef DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE
|
||||
#undef DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES
|
||||
|
||||
@@ -93,6 +93,7 @@
|
||||
#undef DMAPI5_CHAT_CHANNEL_IS_ADMIN_CHANNEL
|
||||
#undef DMAPI5_CHAT_CHANNEL_IS_PRIVATE_CHANNEL
|
||||
#undef DMAPI5_CHAT_CHANNEL_TAG
|
||||
#undef DMAPI5_CHAT_CHANNEL_EMBEDS_SUPPORTED
|
||||
|
||||
#undef DMAPI5_CUSTOM_CHAT_COMMAND_NAME
|
||||
#undef DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT
|
||||
|
||||
Reference in New Issue
Block a user