From 3bdc792c258a7bcbbeb2886ba6b920c38efa251a Mon Sep 17 00:00:00 2001 From: Fleny Date: Wed, 29 Jul 2026 07:54:17 +0200 Subject: [PATCH] feat: server-side lobby message moderation metadata API (#5191) --- packages/bot/src/helpers.ts | 4 ++++ packages/rest/src/manager.ts | 6 ++++++ packages/rest/src/routes.ts | 4 ++++ packages/rest/src/types.ts | 15 +++++++++++++++ packages/rest/src/typings/routes.ts | 2 ++ 5 files changed, 31 insertions(+) diff --git a/packages/bot/src/helpers.ts b/packages/bot/src/helpers.ts index 09baf0791..e6d6a9a76 100644 --- a/packages/bot/src/helpers.ts +++ b/packages/bot/src/helpers.ts @@ -625,6 +625,9 @@ export function createBotHelpers { return bot.transformers.lobby(bot, snakelize(await bot.rest.unlinkChannelToLobby(lobbyId, bearerToken))); }, + updateLobbyMessageModerationMetadata: async (lobbyId, messageId, options) => { + return await bot.rest.updateLobbyMessageModerationMetadata(lobbyId, messageId, options); + }, getTargetUsers: async (inviteCode) => { return await bot.rest.getTargetUsers(inviteCode); }, @@ -1164,6 +1167,7 @@ export type BotHelpers Promise>; linkChannelToLobby: (lobbyId: BigString, bearerToken: string, options: LinkChannelToLobby) => Promise>; unlinkChannelToLobby: (lobbyId: BigString, bearerToken: string) => Promise>; + updateLobbyMessageModerationMetadata: (lobbyId: BigString, messageId: BigString, options: Record) => Promise; getTargetUsers: (inviteCode: string) => Promise; updateTargetUsers: (inviteCode: string, targetUsersFile: Blob) => Promise; getTargetUsersJobStatus: (inviteCode: string) => Promise>; diff --git a/packages/rest/src/manager.ts b/packages/rest/src/manager.ts index 89eb01307..e2d076884 100644 --- a/packages/rest/src/manager.ts +++ b/packages/rest/src/manager.ts @@ -1927,6 +1927,12 @@ export function createRestManager(options: CreateRestManagerOptions): RestManage }); }, + async updateLobbyMessageModerationMetadata(lobbyId, messageId, options) { + await rest.put(rest.routes.lobby.moderationMetadata(lobbyId, messageId), { + body: options, + }); + }, + preferSnakeCase(enabled: boolean) { const camelizer = enabled ? (x: any) => x : camelize; diff --git a/packages/rest/src/routes.ts b/packages/rest/src/routes.ts index 528cd0c6a..825b5059d 100644 --- a/packages/rest/src/routes.ts +++ b/packages/rest/src/routes.ts @@ -694,6 +694,10 @@ export function createRoutes(disableURIEncode: boolean = false): RestRoutes { link: (lobbyId) => { return `/lobbies/${encode(lobbyId)}/channel-linking`; }, + + moderationMetadata: (lobbyId, messageId) => { + return `/lobbies/${encode(lobbyId)}/messages/${encode(messageId)}/moderation-metadata`; + }, }, applicationEmoji(applicationId, emojiId) { diff --git a/packages/rest/src/types.ts b/packages/rest/src/types.ts index e4ab662e3..7a0bebafe 100644 --- a/packages/rest/src/types.ts +++ b/packages/rest/src/types.ts @@ -3287,6 +3287,21 @@ export interface RestManager { * Uses bearer token for authorization and the user must be a lobby member with the CanLinkLobby lobby member flag. */ unlinkChannelToLobby: (lobbyId: BigString, bearerToken: string) => Promise>; + /** + * Sets the moderation metadata for a lobby message. The metadata is app-scoped and delivered to active game clients via the Social SDK as a realtime message update. + * + * @param lobbyId - The ID of the lobby to set the moderation metadata + * @param messageId - The ID of the message to set the moderation metadata + * @param options - The moderation metadata to set + * + * @remarks + * Uses `Bot` token for authorization. + * + * For the options: Free-form key–value pairs describing the moderation decision. Up to 5 keys; key length <= 1024 characters; value length <= 2000 characters + * + * @see {@link https://discord.com/developers/docs/game-sdk/social-sdk/chat-moderation#server-side-chat-moderation} for the full moderation flow. + */ + updateLobbyMessageModerationMetadata: (lobbyId: BigString, messageId: BigString, options: Record) => Promise; } export type RequestMethods = 'GET' | 'POST' | 'DELETE' | 'PATCH' | 'PUT'; diff --git a/packages/rest/src/typings/routes.ts b/packages/rest/src/typings/routes.ts index 0990b2092..5a38990e7 100644 --- a/packages/rest/src/typings/routes.ts +++ b/packages/rest/src/typings/routes.ts @@ -316,6 +316,8 @@ export interface RestRoutes { leave: (lobbyId: BigString) => string; /** Route to link a lobby */ link: (lobbyId: BigString) => string; + /** Route to set the lobby moderation metadata */ + moderationMetadata: (lobbyId: BigString, messageId: BigString) => string; }; /** Route to list / create an application emoji */ applicationEmojis: (applicationId: BigString) => string;