feat: Add lobby messages and lobby invites (#5232)

* feat: Add lobby messages and lobby invites

* Update packages/bot/src/transformers/lobby.ts

Co-authored-by: Awesome Stickz <38146668+AwesomeStickz@users.noreply.github.com>
This commit is contained in:
Fleny
2026-07-29 17:13:11 +05:30
committed by GitHub
co-authored by Awesome Stickz
parent ccd23a5a8a
commit ce2272e359
11 changed files with 375 additions and 3 deletions
+21
View File
@@ -26,7 +26,9 @@ import type {
Invite,
InviteStageInstance,
Lobby,
LobbyInvite,
LobbyMember,
LobbyMessage,
MediaGalleryItem,
Member,
Message,
@@ -88,6 +90,8 @@ export interface TransformersObjects {
inviteStageInstance: InviteStageInstance;
lobby: Lobby;
lobbyMember: LobbyMember;
lobbyMessage: LobbyMessage;
lobbyInvite: LobbyInvite;
mediaGalleryItem: MediaGalleryItem;
member: Member;
message: Message;
@@ -874,6 +878,23 @@ export function createDesiredPropertiesObject<T extends RecursivePartial<Transfo
flags: defaultValue,
...desiredProperties.lobbyMember,
},
lobbyMessage: {
id: defaultValue,
content: defaultValue,
applicationId: defaultValue,
flags: defaultValue,
author: defaultValue,
channelId: defaultValue,
lobbyId: defaultValue,
metadata: defaultValue,
moderationMetadata: defaultValue,
type: defaultValue,
...desiredProperties.lobbyMessage,
},
lobbyInvite: {
code: defaultValue,
...desiredProperties.lobbyInvite,
},
} satisfies TransformersDesiredProperties as CompleteDesiredProperties<T, TDefault>;
}
+33
View File
@@ -24,6 +24,7 @@ import type {
CreateGuildStickerOptions,
CreateLobby,
CreateMessageOptions,
CreateOrJoinLobby,
CreateScheduledEvent,
CreateStageInstance,
CreateTemplate,
@@ -70,6 +71,7 @@ import type {
GetGuildAuditLog,
GetGuildPruneCountQuery,
GetInvite,
GetLobbyMessages,
GetMessagesOptions,
GetReactions,
GetScheduledEvents,
@@ -99,6 +101,7 @@ import type {
ModifyRolePositions,
ModifyWebhook,
SearchMembers,
SendLobbyMessage,
SendSoundboardSound,
StartThreadWithMessage,
StartThreadWithoutMessage,
@@ -126,7 +129,9 @@ import type {
InteractionCallbackResponse,
Invite,
Lobby,
LobbyInvite,
LobbyMember,
LobbyMessage,
Member,
Message,
MessagePin,
@@ -611,6 +616,9 @@ export function createBotHelpers<TProps extends TransformersDesiredProperties, T
createLobby: async (options) => {
return bot.transformers.lobby(bot, snakelize(await bot.rest.createLobby(options)));
},
createOrJoinLobby: async (options) => {
return bot.transformers.lobby(bot, snakelize(await bot.rest.createOrJoinLobby(options)));
},
getLobby: async (lobbyId) => {
return bot.transformers.lobby(bot, snakelize(await bot.rest.getLobby(lobbyId)));
},
@@ -632,6 +640,18 @@ export function createBotHelpers<TProps extends TransformersDesiredProperties, T
updateLobbyMessageModerationMetadata: async (lobbyId, messageId, options) => {
return await bot.rest.updateLobbyMessageModerationMetadata(lobbyId, messageId, options);
},
sendLobbyMessage: async (bearerToken, lobbyId, options) => {
return bot.transformers.lobbyMessage(bot, snakelize(await bot.rest.sendLobbyMessage(bearerToken, lobbyId, options)));
},
getLobbyMessages: async (bearerToken, lobbyId, options) => {
return (await bot.rest.getLobbyMessages(bearerToken, lobbyId, options)).map((res) => bot.transformers.lobbyMessage(bot, snakelize(res)));
},
createLobbyChannelInviteForSelf: async (bearerToken, lobbyId) => {
return bot.transformers.lobbyInvite(bot, snakelize(await bot.rest.createLobbyChannelInviteForSelf(bearerToken, lobbyId)));
},
createLobbyChannelInviteForUser: async (lobbyId, userId) => {
return bot.transformers.lobbyInvite(bot, snakelize(await bot.rest.createLobbyChannelInviteForUser(lobbyId, userId)));
},
getTargetUsers: async (inviteCode) => {
return await bot.rest.getTargetUsers(inviteCode);
},
@@ -1170,6 +1190,7 @@ export type BotHelpers<TProps extends TransformersDesiredProperties, TBehavior e
options: Camelize<DiscordApplicationRoleConnectionMetadata>[],
) => Promise<Camelize<DiscordApplicationRoleConnectionMetadata>[]>;
createLobby: (options: CreateLobby) => Promise<SetupDesiredProps<Lobby, TProps, TBehavior>>;
createOrJoinLobby: (options: CreateOrJoinLobby) => Promise<SetupDesiredProps<Lobby, TProps, TBehavior>>;
getLobby: (lobbyId: BigString) => Promise<SetupDesiredProps<Lobby, TProps, TBehavior>>;
modifyLobby: (lobbyId: BigString, options: ModifyLobby) => Promise<SetupDesiredProps<Lobby, TProps, TBehavior>>;
addMemberToLobby: (lobbyId: BigString, userId: BigString, options: AddLobbyMember) => Promise<SetupDesiredProps<LobbyMember, TProps, TBehavior>>;
@@ -1180,6 +1201,18 @@ export type BotHelpers<TProps extends TransformersDesiredProperties, TBehavior e
getTargetUsers: (inviteCode: string) => Promise<string>;
updateTargetUsers: (inviteCode: string, targetUsersFile: Blob) => Promise<void>;
getTargetUsersJobStatus: (inviteCode: string) => Promise<Camelize<DiscordTargetUsersJobStatus>>;
sendLobbyMessage: (
bearerToken: string,
lobbyId: BigString,
options: SendLobbyMessage,
) => Promise<SetupDesiredProps<LobbyMessage, TProps, TBehavior>>;
getLobbyMessages: (
bearerToken: string,
lobbyId: BigString,
options?: GetLobbyMessages,
) => Promise<SetupDesiredProps<LobbyMessage, TProps, TBehavior>[]>;
createLobbyChannelInviteForSelf: (bearerToken: string, lobbyId: BigString) => Promise<SetupDesiredProps<LobbyInvite, TProps, TBehavior>>;
createLobbyChannelInviteForUser: (lobbyId: BigString, userId: BigString) => Promise<SetupDesiredProps<LobbyInvite, TProps, TBehavior>>;
// functions return Void so dont need any special handling
addReaction: (channelId: BigString, messageId: BigString, reaction: string) => Promise<void>;
addReactions: (channelId: BigString, messageId: BigString, reactions: string[], ordered?: boolean) => Promise<void>;
+11 -1
View File
@@ -42,7 +42,9 @@ import type {
DiscordInviteMetadata,
DiscordInviteStageInstance,
DiscordLobby,
DiscordLobbyInvite,
DiscordLobbyMember,
DiscordLobbyMessage,
DiscordMediaGalleryItem,
DiscordMember,
DiscordMessage,
@@ -116,7 +118,7 @@ import {
transformInteractionResource,
} from './transformers/interaction.js';
import { transformInvite } from './transformers/invite.js';
import { transformLobby, transformLobbyMember } from './transformers/lobby.js';
import { transformLobby, transformLobbyInvite, transformLobbyMember, transformLobbyMessage } from './transformers/lobby.js';
import { transformMember } from './transformers/member.js';
import {
transformMessage,
@@ -195,7 +197,9 @@ import type {
Invite,
InviteStageInstance,
Lobby,
LobbyInvite,
LobbyMember,
LobbyMessage,
MediaGalleryItem,
Member,
Message,
@@ -289,6 +293,8 @@ export type TransformerFunctions<TProps extends TransformersDesiredProperties, T
inviteStageInstance: TransformerFunction<TProps, TBehavior, DiscordInviteStageInstance, InviteStageInstance, { guildId?: BigString }>;
lobby: TransformerFunction<TProps, TBehavior, DiscordLobby, Lobby>;
lobbyMember: TransformerFunction<TProps, TBehavior, DiscordLobbyMember, LobbyMember>;
lobbyMessage: TransformerFunction<TProps, TBehavior, DiscordLobbyMessage, LobbyMessage>;
lobbyInvite: TransformerFunction<TProps, TBehavior, DiscordLobbyInvite, LobbyInvite>;
mediaGalleryItem: TransformerFunction<TProps, TBehavior, DiscordMediaGalleryItem, MediaGalleryItem>;
member: TransformerFunction<TProps, TBehavior, DiscordMember, Member, { guildId?: BigString; userId?: BigString }>;
message: TransformerFunction<TProps, TBehavior, DiscordMessage, Message, { shardId?: number }>;
@@ -400,6 +406,8 @@ export function createTransformers<TProps extends TransformersDesiredProperties,
inviteStageInstance: _options.customizers?.inviteStageInstance ?? defaultCustomizer,
lobby: _options.customizers?.lobby ?? defaultCustomizer,
lobbyMember: _options.customizers?.lobbyMember ?? defaultCustomizer,
lobbyMessage: _options.customizers?.lobbyMessage ?? defaultCustomizer,
lobbyInvite: _options.customizers?.lobbyInvite ?? defaultCustomizer,
mediaGalleryItem: _options.customizers?.mediaGalleryItem ?? defaultCustomizer,
member: _options.customizers?.member ?? defaultCustomizer,
message: _options.customizers?.message ?? defaultCustomizer,
@@ -494,6 +502,8 @@ export function createTransformers<TProps extends TransformersDesiredProperties,
inviteStageInstance: _options.inviteStageInstance ?? transformInviteStageInstance,
lobby: _options.lobby ?? transformLobby,
lobbyMember: _options.lobbyMember ?? transformLobbyMember,
lobbyMessage: _options.lobbyMessage ?? transformLobbyMessage,
lobbyInvite: _options.lobbyInvite ?? transformLobbyInvite,
mediaGalleryItem: _options.mediaGalleryItem ?? transformMediaGalleryItem,
member: _options.member ?? transformMember,
message: _options.message ?? transformMessage,
+29 -2
View File
@@ -1,8 +1,8 @@
import type { DiscordLobby, DiscordLobbyMember } from '@discordeno/types';
import type { DiscordLobby, DiscordLobbyInvite, DiscordLobbyMember, DiscordLobbyMessage } from '@discordeno/types';
import type { Bot } from '../bot.js';
import type { DesiredPropertiesBehavior, SetupDesiredProps, TransformersDesiredProperties } from '../desiredProperties.js';
import { ToggleBitfield } from './toggles/ToggleBitfield.js';
import type { Lobby, LobbyMember } from './types.js';
import type { Lobby, LobbyInvite, LobbyMember, LobbyMessage } from './types.js';
export function transformLobby(bot: Bot, payload: DiscordLobby): Lobby {
const props = bot.transformers.desiredProperties.lobby;
@@ -27,3 +27,30 @@ export function transformLobbyMember(bot: Bot, payload: DiscordLobbyMember): Lob
return bot.transformers.customizers.lobbyMember(bot, payload, lobbyMember);
}
export function transformLobbyMessage(bot: Bot, payload: DiscordLobbyMessage): LobbyMessage {
const props = bot.transformers.desiredProperties.lobbyMessage;
const lobbyMessage = {} as SetupDesiredProps<LobbyMessage, TransformersDesiredProperties, DesiredPropertiesBehavior>;
if (props.id && payload.id) lobbyMessage.id = bot.transformers.snowflake(payload.id);
if (props.type) lobbyMessage.type = payload.type;
if (props.content && payload.content) lobbyMessage.content = payload.content;
if (props.lobbyId && payload.lobby_id) lobbyMessage.lobbyId = bot.transformers.snowflake(payload.lobby_id);
if (props.channelId && payload.channel_id) lobbyMessage.channelId = bot.transformers.snowflake(payload.channel_id);
if (props.author && payload.author) lobbyMessage.author = bot.transformers.user(bot, payload.author);
if (props.metadata && payload.metadata) lobbyMessage.metadata = payload.metadata;
if (props.moderationMetadata && payload.moderation_metadata) lobbyMessage.moderationMetadata = payload.moderation_metadata;
if (props.flags && payload.flags) lobbyMessage.flags = new ToggleBitfield(payload.flags);
if (props.applicationId && payload.application_id) lobbyMessage.applicationId = bot.transformers.snowflake(payload.application_id);
return bot.transformers.customizers.lobbyMessage(bot, payload, lobbyMessage);
}
export function transformLobbyInvite(bot: Bot, payload: DiscordLobbyInvite): LobbyInvite {
const props = bot.transformers.desiredProperties.lobbyInvite;
const lobbyInvite = {} as SetupDesiredProps<LobbyInvite, TransformersDesiredProperties, DesiredPropertiesBehavior>;
if (props.code && payload.code) lobbyInvite.code = payload.code;
return bot.transformers.customizers.lobbyInvite(bot, payload, lobbyInvite);
}
+34
View File
@@ -2091,3 +2091,37 @@ export interface LobbyMember {
/** lobby member flags combined as as bitfield */
flags?: ToggleBitfield;
}
/** https://docs.discord.com/developers/resources/lobby#lobby-message-object */
export interface LobbyMessage {
/** id of the message */
id: bigint;
/** Message type */
type: MessageTypes;
/** Message content */
content: string;
/** id of the lobby this message was sent to */
lobbyId: bigint;
/** Included for compatibility with the messages interface; equal to lobby_id */
channelId: bigint;
/** The user who sent the message */
author: User;
/** Dispatch-only metadata sent with the message */
metadata?: Record<string, string>;
/** Moderation metadata set via Update Lobby Message Moderation Metadata */
moderationMetadata?: Record<string, string>;
/**
* Message flags bitfield
*
* @see {@link MessageFlags}
*/
flags: ToggleBitfield;
/** The application that sent the message */
applicationId: bigint;
}
/** https://docs.discord.com/developers/resources/lobby#lobby-invite-object */
export interface LobbyInvite {
/** The invite code for the lobby's linked channel */
code: string;
}
+40
View File
@@ -35,7 +35,9 @@ import type {
DiscordListActiveThreads,
DiscordListArchivedThreads,
DiscordLobby,
DiscordLobbyInvite,
DiscordLobbyMember,
DiscordLobbyMessage,
DiscordMember,
DiscordMemberWithUser,
DiscordMessage,
@@ -1948,6 +1950,44 @@ export function createRestManager(options: CreateRestManagerOptions): RestManage
});
},
createOrJoinLobby(options) {
return rest.put<DiscordLobby>(rest.routes.lobby.create(), {
body: options,
});
},
sendLobbyMessage(bearerToken, lobbyId, options) {
return rest.post<DiscordLobbyMessage>(rest.routes.lobby.messages(lobbyId), {
body: options,
headers: {
authorization: `Bearer ${bearerToken}`,
},
unauthorized: true,
});
},
getLobbyMessages(bearerToken, lobbyId, options) {
return rest.get<DiscordLobbyMessage[]>(rest.routes.lobby.messages(lobbyId, options), {
headers: {
authorization: `Bearer ${bearerToken}`,
},
unauthorized: true,
});
},
createLobbyChannelInviteForSelf(bearerToken, lobbyId) {
return rest.post<DiscordLobbyInvite>(rest.routes.lobby.inviteSelf(lobbyId), {
headers: {
authorization: `Bearer ${bearerToken}`,
},
unauthorized: true,
});
},
createLobbyChannelInviteForUser(lobbyId, userId) {
return rest.post<DiscordLobbyInvite>(rest.routes.lobby.inviteUser(lobbyId, userId));
},
preferSnakeCase(enabled: boolean) {
const camelizer = enabled ? (x: any) => x : camelize;
+18
View File
@@ -702,6 +702,24 @@ export function createRoutes(disableURIEncode: boolean = false): RestRoutes {
moderationMetadata: (lobbyId, messageId) => {
return `/lobbies/${encode(lobbyId)}/messages/${encode(messageId)}/moderation-metadata`;
},
messages: (lobbyId, options) => {
let url = `/lobbies/${encode(lobbyId)}/messages?`;
if (options) {
if (options.limit) url += `limit=${encode(options.limit)}`;
}
return url;
},
inviteSelf: (lobbyId) => {
return `/lobbies/${encode(lobbyId)}/members/@me/invites`;
},
inviteUser: (lobbyId, userId) => {
return `/lobbies/${encode(lobbyId)}/members/${encode(userId)}/invites`;
},
},
applicationEmoji(applicationId, emojiId) {
+73
View File
@@ -25,6 +25,7 @@ import type {
CreateGuildStickerOptions,
CreateLobby,
CreateMessageOptions,
CreateOrJoinLobby,
CreateScheduledEvent,
CreateStageInstance,
CreateTemplate,
@@ -67,7 +68,9 @@ import type {
DiscordListActiveThreads,
DiscordListArchivedThreads,
DiscordLobby,
DiscordLobbyInvite,
DiscordLobbyMember,
DiscordLobbyMessage,
DiscordMember,
DiscordMemberWithUser,
DiscordMessage,
@@ -113,6 +116,7 @@ import type {
GetGuildAuditLog,
GetGuildPruneCountQuery,
GetInvite,
GetLobbyMessages,
GetMessagesOptions,
GetPollAnswerVotes,
GetReactions,
@@ -147,6 +151,7 @@ import type {
ScheduledEventEntityType,
ScheduledEventStatus,
SearchMembers,
SendLobbyMessage,
SendSoundboardSound,
StartThreadWithMessage,
StartThreadWithoutMessage,
@@ -3225,6 +3230,18 @@ export interface RestManager {
* @returns The created lobby
*/
createLobby: (options: CreateLobby) => Promise<Camelize<DiscordLobby>>;
/**
* Creates a new lobby for the application identified by a `secret`, or joins the calling user to the existing lobby with that secret if one already exists.
*
* Updates lobby metadata and the calling member's metadata on join.
*
* @param options - The options to create or join the lobby
* @returns - The created or joined lobby
*
* @remarks
* Uses `Bearer` token for authorization with the `sdk.social_layer` scope.
*/
createOrJoinLobby: (options: CreateOrJoinLobby) => Promise<Camelize<DiscordLobby>>;
/**
* Returns a lobby object for the specified lobby id, if it exists.
*
@@ -3331,6 +3348,62 @@ export interface RestManager {
* @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<string, string>) => Promise<void>;
/**
* Sends a message to the specified lobby. The calling user must be a member of the lobby.
*
* @param bearerToken - The access token of the user
* @param lobbyId - The ID of the lobby to send the message to
* @param options - The options to send the message
* @returns Returns the created lobby message object.
*
* @remarks
* Uses `Bearer` token for authorization with the `sdk.social_layer` scope.
*
* If the lobby has a linked channel, the message is also forwarded to that channel.
* If forwarding fails (for example, due to AutoMod), the lobby message is still delivered to other lobby members.
*/
sendLobbyMessage: (bearerToken: string, lobbyId: BigString, options: SendLobbyMessage) => Promise<Camelize<DiscordLobbyMessage>>;
/**
* Returns the most recent messages in the specified lobby. The calling user must be a member of the lobby.
*
* @param bearerToken - The access token of the user
* @param lobbyId - The ID of the lobby to get the messages from
* @param options - The options to get the messages
* @returns Returns an array of lobby message objects
*
* @remarks
* Uses `Bearer` token for authorization with the `sdk.social_layer` scope.
*/
getLobbyMessages: (bearerToken: string, lobbyId: BigString, options?: GetLobbyMessages) => Promise<Camelize<DiscordLobbyMessage>[]>;
/**
* Creates a single-use guild invite to the lobby's linked channel, targeted at the calling user.
*
*
* @param bearerToken - The access token of the user
* @param lobbyId - The ID of the lobby to create the invite for
* @returns The created invite object
*
* @remarks
* Uses `Bearer` token for authorization with the `sdk.social_layer` scope.
*
* The lobby must have a linked channel and the caller must be a member of the lobby.
* The invite expires after one hour.
*/
createLobbyChannelInviteForSelf: (bearerToken: string, lobbyId: BigString) => Promise<Camelize<DiscordLobbyInvite>>;
/**
* Creates a single-use guild invite to the lobby's linked channel on behalf of an application, targeted at the specified user.
*
* @param lobbyId - The ID of the lobby to create the invite for
* @param userId - The ID of the user to create the invite for
* @returns The created invite object
*
* @remarks
* Uses `Bot` token for authorization
*
* The lobby must have a linked channel.
* The invite expires after one hour.
*/
createLobbyChannelInviteForUser: (lobbyId: BigString, userId: BigString) => Promise<Camelize<DiscordLobbyInvite>>;
}
export type RequestMethods = 'GET' | 'POST' | 'DELETE' | 'PATCH' | 'PUT';
+7
View File
@@ -6,6 +6,7 @@ import type {
GetGuildAuditLog,
GetGuildPruneCountQuery,
GetInvite,
GetLobbyMessages,
GetMessagesOptions,
GetPollAnswerVotes,
GetReactions,
@@ -320,6 +321,12 @@ export interface RestRoutes {
membersBulk: (lobbyId: BigString) => string;
/** Route to set the lobby moderation metadata */
moderationMetadata: (lobbyId: BigString, messageId: BigString) => string;
/** Route to lobby messages */
messages: (lobbyId: BigString, options?: GetLobbyMessages) => string;
/** Route to invite self to the lobby's linked channel */
inviteSelf: (lobbyId: BigString) => string;
/** Route to invite a specific user to the lobby's linked channel */
inviteUser: (lobbyId: BigString, userId: BigString) => string;
};
/** Route to list / create an application emoji */
applicationEmojis: (applicationId: BigString) => string;
+36
View File
@@ -1,6 +1,8 @@
/** Types for: https://docs.discord.com/developers/resources/lobby */
import type { DiscordChannel } from './channel.js';
import type { MessageFlags, MessageTypes } from './message.js';
import type { DiscordUser } from './user.js';
/** https://docs.discord.com/developers/resources/lobby#lobby-object-lobby-structure */
export interface DiscordLobby {
@@ -31,3 +33,37 @@ export enum DiscordLobbyMemberFlags {
/** User can link a text channel to a lobby */
CanLinkLobby = 1 << 0,
}
/** https://docs.discord.com/developers/resources/lobby#lobby-message-object */
export interface DiscordLobbyMessage {
/** id of the message */
id: string;
/** Message type */
type: MessageTypes;
/** Message content */
content: string;
/** id of the lobby this message was sent to */
lobby_id: string;
/** Included for compatibility with the messages interface; equal to lobby_id */
channel_id: string;
/** The user who sent the message */
author: DiscordUser;
/** Dispatch-only metadata sent with the message */
metadata?: Record<string, string> | null;
/** Moderation metadata set via Update Lobby Message Moderation Metadata */
moderation_metadata?: Record<string, string> | null;
/**
* Message flags bitfield
*
* @see {@link MessageFlags}
*/
flags: number;
/** The application that sent the message */
application_id: string;
}
/** https://docs.discord.com/developers/resources/lobby#lobby-invite-object */
export interface DiscordLobbyInvite {
/** The invite code for the lobby's linked channel */
code: string;
}
+73
View File
@@ -13,6 +13,41 @@ export interface CreateLobby {
idleTimeoutSeconds?: number;
}
/** https://docs.discord.com/developers/resources/lobby#create-or-join-lobby */
export interface CreateOrJoinLobby {
/**
* Secret used to identify the lobby.
* If a lobby for this application already exists with this secret, the caller joins it; otherwise a new lobby is created.
*
* @remarks
* Max 250 characters
*/
secret: string;
/**
* Seconds to wait before shutting down a lobby after it becomes idle.
*
* @remarks
* Value can be between 5 and 604800 (7 days).
*/
idleTimeoutSeconds?: number;
/**
* Optional dictionary of string key/value pairs.
*
* @remarks
* The max total length is 1000.
*
* Overwrites any existing lobby metadata.
*/
lobbyMetadata?: Record<string, string> | null;
/**
* Optional dictionary of string key/value pairs to set on the calling users lobby member
*
* @remarks
* The max total length is 1000.
*/
memberMetadata?: Record<string, string> | null;
}
/** https://docs.discord.com/developers/resources/lobby#create-lobby */
export interface CreateLobbyMember {
/** Discord user id of the user to add to the lobby */
@@ -70,3 +105,41 @@ export interface LinkChannelToLobby {
/** The id of the channel to link to the lobby. If not provided, will unlink any currently linked channels from the lobby. */
channelId?: BigString;
}
/** https://docs.discord.com/developers/resources/lobby#send-lobby-message */
export interface SendLobbyMessage {
/**
* Message content
*
* @remarks
* Must be non-empty
*/
content: string;
/**
* Optional dictionary of string key/value pairs delivered alongside the message to active clients via the Social SDK.
*
* @remarks
* Not persisted on the linked channel message.
*/
metadata?: Record<string, string> | null;
/**
* Optional message flags combined as a bitfield.
*
* @remarks
* Only flags creatable by the Social SDK are accepted.
*/
flags?: number;
}
/** https://docs.discord.com/developers/resources/lobby#get-lobby-messages */
export interface GetLobbyMessages {
/**
* Max number of messages to return
*
* @remarks
* Must be between 1 and 200
*
* @default 50
*/
limit?: number;
}