import {z} from 'zod' export type GetApiApiChannelsChannelIdMessagesSearchArgs = {channel_id: string}; export type GetApiApiChannelsChannelIdMessagesSearchOptions = {baseUrl?: string | undefined, bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const messageType = z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(5), z.literal(6), z.literal(7), z.literal(8), z.literal(9), z.literal(10), z.literal(11), z.literal(12), z.literal(13), z.literal(14), z.literal(15), z.literal(16), z.literal(17), z.literal(18), z.literal(19), z.literal(20), z.literal(21), z.literal(22), z.literal(23), z.literal(24), z.literal(25), z.literal(26), z.literal(27), z.literal(28), z.literal(29), z.literal(30), z.literal(31), z.literal(32), z.literal(33), z.literal(34), z.literal(35), z.literal(36), z.literal(37), z.literal(38), z.literal(39), z.literal(40), z.literal(41), z.literal(42), z.literal(43), z.literal(44), z.literal(45), z.literal(46), z.literal(47), z.literal(48), z.literal(49), z.literal(50), z.literal(51), z.literal(52), z.literal(53), z.literal(54), z.literal(55), z.literal(56), z.literal(57), z.literal(58), z.literal(59), z.literal(60), z.literal(61), z.literal(62), z.literal(63), z.literal(255)]); export const avatarDecorationData = z.object({asset: z.string(), sku_id: z.string(), expires_at: z.string().nullable()}); export const displayNameStyle = z.object({font_id: z.number().int(), effect_id: z.number().int(), colors: z.array(z.number().int())}); export const nameplateData = z.object({asset: z.string(), sku_id: z.string(), label: z.string(), palette: z.string(), expires_at: z.number().int().nullable()}); export const collectibles = z.object({nameplate: nameplateData.nullable()}); export const primaryGuild = z.object({identity_enabled: z.boolean().nullable(), identity_guild_id: z.string().nullable(), tag: z.string().nullable(), badge: z.string().nullable()}); export const publicUser = z.object({id: z.string(), premium_since: z.string(), avatar: z.string().optional(), banner: z.string().optional(), bio: z.string(), theme_colors: z.array(z.number().int()).optional(), pronouns: z.string().optional(), username: z.string(), discriminator: z.string(), public_flags: z.number().int(), accent_color: z.number().int().optional(), bot: z.boolean(), premium_type: z.number().int(), badge_ids: z.array(z.string()).optional(), avatar_decoration_data: avatarDecorationData.optional(), display_name_styles: displayNameStyle.optional(), collectibles: collectibles.optional(), primary_guild: primaryGuild.optional()}); export const partialUser = z.object({id: z.string(), username: z.string(), discriminator: z.string(), global_name: z.string().nullable().optional(), avatar: z.string().nullable(), avatar_decoration_data: avatarDecorationData.nullable().optional(), collectibles: collectibles.nullable().optional(), display_name_styles: displayNameStyle.nullable().optional(), primary_guild: primaryGuild.nullable().optional(), bot: z.boolean().optional(), system: z.boolean().optional(), banner: z.string().nullable().optional(), accent_color: z.number().int().nullable().optional(), public_flags: z.number().int().optional()}); export const publicAttachment = z.object({filename: z.string(), size: z.number().int(), content_type: z.string().optional(), url: z.string(), proxy_url: z.string(), description: z.string().optional(), flags: z.union([z.literal(1), z.literal(128), z.literal(16), z.literal(2), z.literal(32), z.literal(4), z.literal(64), z.literal(8)]).optional(), height: z.number().int().optional(), width: z.number().int().optional(), content_scan_version: z.number().int().optional(), placeholder_version: z.number().int().optional(), placeholder: z.string().optional(), duration_secs: z.number().optional(), waveform: z.string().optional(), title: z.string().optional(), clip_created_at: z.string().optional(), clip_participants: z.array(partialUser).optional()}); export const embedImage = z.object({url: z.string().optional(), proxy_url: z.string().optional(), height: z.number().int().optional(), width: z.number().int().optional()}); export const embed = z.object({title: z.string().optional(), type: z.enum(["article", "gifv", "image", "link", "poll_result", "rich", "video"]).optional(), description: z.string().optional(), url: z.string().optional(), timestamp: z.string().optional(), color: z.number().int().optional(), footer: z.object({text: z.string(), icon_url: z.string().optional(), proxy_icon_url: z.string().optional()}).optional(), image: embedImage.optional(), thumbnail: embedImage.optional(), video: embedImage.optional(), provider: z.object({name: z.string().optional(), url: z.string().optional()}).optional(), author: z.object({name: z.string().optional(), url: z.string().optional(), icon_url: z.string().optional(), proxy_icon_url: z.string().optional()}).optional(), fields: z.array(z.object({name: z.string(), value: z.string(), inline: z.boolean().optional()})).optional()}); export const roleColors = z.object({primary_color: z.number().int(), secondary_color: z.number().int().optional(), tertiary_color: z.number().int().optional()}); export const roleTags = z.object({bot_id: z.string().optional(), integration_id: z.string().optional(), subscription_listing_id: z.string().optional(), premium_subscriber: z.boolean().nullable().optional(), available_for_purchase: z.boolean().nullable().optional(), guild_connections: z.boolean().nullable().optional()}); export const roleResponse = z.object({id: z.string(), name: z.string(), description: z.string().nullable(), color: z.number().int(), colors: roleColors, hoist: z.boolean(), icon: z.string().nullable().optional(), unicode_emoji: z.string().nullable().optional(), position: z.number().int(), permissions: z.string(), managed: z.boolean(), mentionable: z.boolean(), flags: z.number().int().optional(), tags: roleTags.optional()}); export const messageComponentTypeSection = z.literal(9); export const messageComponentTypeTextDisplay = z.literal(10); export const textDisplayComponent = z.object({type: messageComponentTypeTextDisplay, content: z.string(), id: z.number().int().optional()}); export const messageComponentTypeThumbnail = z.literal(11); export const unfurledMediaItem = z.object({id: z.string().optional(), url: z.string(), proxy_url: z.string().optional(), height: z.number().int().optional(), width: z.number().int().optional(), flags: z.number().int().optional(), content_type: z.string().optional(), content_scan_metadata: z.unknown(), placeholder_version: z.number().int().optional(), placeholder: z.string().optional(), loading_state: z.number().int().optional(), attachment_id: z.string().optional()}); export const thumbnailComponent = z.object({type: messageComponentTypeThumbnail, description: z.string().optional(), media: unfurledMediaItem, spoiler: z.boolean().optional(), id: z.number().int().optional()}); export const messageComponentTypeButton = z.literal(2); export const buttonStyle = z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(5), z.literal(6)]); export const buttonComponent = z.object({type: messageComponentTypeButton, style: buttonStyle, label: z.string().optional(), emoji: z.union([z.object({id: z.string().optional(), name: z.string(), animated: z.boolean().optional()}), z.object({id: z.string(), name: z.string().optional(), animated: z.boolean().optional()})]).optional(), custom_id: z.string().optional(), sku_id: z.string().optional(), url: z.string().optional(), disabled: z.boolean().optional(), id: z.number().int().optional()}); export const sectionComponent = z.object({type: messageComponentTypeSection, components: z.array(textDisplayComponent), accessory: z.union([thumbnailComponent, buttonComponent]), id: z.number().int().optional()}); export const messageComponentTypeMediaGallery = z.literal(12); export const mediaGalleryComponent = z.object({type: messageComponentTypeMediaGallery, items: z.array(z.object({media: unfurledMediaItem, description: z.string().optional(), spoiler: z.boolean().optional()})), id: z.number().int().optional()}); export const messageComponentTypeFile = z.literal(13); export const fileComponent = z.object({type: messageComponentTypeFile, file: unfurledMediaItem, spoiler: z.boolean(), name: z.string(), size: z.number().int(), id: z.number().int().optional()}); export const messageComponentTypeSeparator = z.literal(14); export const seperatorComponent = z.object({type: messageComponentTypeSeparator, divider: z.boolean().optional(), spacing: z.union([z.literal(1), z.literal(2)]).optional(), id: z.number().int().optional()}); export const messageComponentTypeActionRow = z.literal(1); export const selectMenuDefaultOption = z.object({id: z.string(), type: z.enum(["channel", "role", "user"])}); export const selectMenuComponent = z.object({type: z.union([z.literal(3), z.literal(5), z.literal(6), z.literal(7), z.literal(8)]), custom_id: z.string(), channel_types: z.array(z.number().int()).optional(), placeholder: z.string().optional(), default_values: z.array(selectMenuDefaultOption).optional(), min_values: z.number().int().optional(), max_values: z.number().int().optional(), disabled: z.boolean().optional(), id: z.number().int().optional()}); export const messageComponentTypeStringSelect = z.literal(3); export const selectMenuOption = z.object({label: z.string(), value: z.string(), description: z.string().optional(), emoji: z.union([z.object({id: z.string().optional(), name: z.string(), animated: z.boolean().optional()}), z.object({id: z.string(), name: z.string().optional(), animated: z.boolean().optional()})]).optional(), default: z.boolean().optional()}); export const stringSelectMenuComponent = z.object({type: messageComponentTypeStringSelect, options: z.array(selectMenuOption), custom_id: z.string(), channel_types: z.array(z.number().int()).optional(), placeholder: z.string().optional(), default_values: z.array(selectMenuDefaultOption).optional(), min_values: z.number().int().optional(), max_values: z.number().int().optional(), disabled: z.boolean().optional(), id: z.number().int().optional()}); export const messageComponentTypeTextInput = z.literal(4); export const textInputStyle = z.union([z.literal(1), z.literal(2)]); export const textInputComponent = z.object({type: messageComponentTypeTextInput, custom_id: z.string(), style: textInputStyle, label: z.string(), min_length: z.number().int().optional(), max_length: z.number().int().optional(), required: z.boolean().optional(), value: z.string().optional(), placeholder: z.string().optional(), id: z.number().int().optional()}); export const actionRowComponent = z.object({type: messageComponentTypeActionRow, components: z.array(z.union([buttonComponent, selectMenuComponent, stringSelectMenuComponent, textInputComponent])), id: z.number().int().optional()}); export const messageComponentTypeContainer = z.literal(17); export const containerComponent = z.object({type: messageComponentTypeContainer, components: z.array(z.union([sectionComponent, textDisplayComponent, mediaGalleryComponent, fileComponent, seperatorComponent, actionRowComponent])), accent_color: z.number().int().optional(), spoiler: z.boolean().optional(), id: z.number().int().optional()}); export const baseMessageComponents = z.union([sectionComponent, textDisplayComponent, mediaGalleryComponent, fileComponent, seperatorComponent, actionRowComponent, containerComponent]); export const pollMedia = z.object({text: z.string().optional(), emoji: z.union([z.object({id: z.string().optional(), name: z.string(), animated: z.boolean().optional()}), z.object({id: z.string(), name: z.string().optional(), animated: z.boolean().optional()})]).optional()}); export const pollAnswer = z.object({answer_id: z.number().int().optional(), poll_media: pollMedia}); export const pollAnswerCount = z.object({id: z.string(), count: z.number().int(), me_voted: z.boolean()}); export const pollResult = z.object({is_finalized: z.boolean(), answer_counts: z.array(pollAnswerCount)}); export const poll = z.object({question: pollMedia, answers: z.array(pollAnswer), expiry: z.string(), allow_multiselect: z.boolean(), results: pollResult.optional()}); export const guildMessagesSearchMessage = z.object({id: z.string(), type: messageType, content: z.string().optional(), channel_id: z.string(), author: publicUser, attachments: z.array(publicAttachment), embeds: z.array(embed), mentions: z.array(publicUser), mention_roles: z.array(roleResponse), pinned: z.boolean(), mention_everyone: z.boolean().optional(), tts: z.boolean(), timestamp: z.string(), edited_timestamp: z.string().nullable(), flags: z.number().int(), components: z.array(baseMessageComponents), poll: poll, hit: z.literal(true)}); export const guildMessagesSearchResponse = z.object({messages: z.array(guildMessagesSearchMessage), total_results: z.number().int()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * GET /api/channels/{channel_id}/messages/search/ */ export const getApiApiChannelsChannelIdMessagesSearch = async (args: GetApiApiChannelsChannelIdMessagesSearchArgs, options?: GetApiApiChannelsChannelIdMessagesSearchOptions) => { const {baseUrl = "https://api.rory.server.spacebar.chat", fetch: fetchFn = fetch, bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (bearer !== undefined) headers.set('authorization', `Bearer ${bearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/channels/${encodeURIComponent(String(args.channel_id))}/messages/search/${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(guildMessagesSearchResponse, await res.json()) };