import type { ActivityStore } from "./activity-log.js"; import { type DiscordClient, type DiscordVoiceRegion } from "./discord-client.js"; import { type OperationStore } from "./operation-store.js"; import { type DiscordPermissionName } from "./permissions.js"; import type { ScopePolicy } from "./policy.js"; import type { RequestOptions } from "./types.js"; export declare const CHANNEL_METADATA_FIELD_NAMES: readonly ["bitrate", "defaultAutoArchiveDuration", "defaultThreadRateLimitPerUser", "name", "nsfw", "rateLimitPerUser", "rtcRegion", "topic", "userLimit", "videoQualityMode"]; export type ChannelMetadataFieldName = typeof CHANNEL_METADATA_FIELD_NAMES[number]; export declare const CHANNEL_METADATA_VIDEO_QUALITY_MODES: readonly ["automatic", "full"]; export type ChannelMetadataVideoQualityMode = typeof CHANNEL_METADATA_VIDEO_QUALITY_MODES[number]; declare const CHANNEL_METADATA_LOCAL_LIMITS: Readonly<{ bitrateMinimum: 8000; defaultAutoArchiveDurations: (60 | 1440 | 4320 | 10080)[]; nameCharacters: 100; rateLimitSeconds: 21600; stageBitrateMaximum: 64000; stageUserLimit: 10000; standardTopicCharacters: 1024; forumAndMediaTopicCharacters: 4096; videoQualityModes: ("automatic" | "full")[]; voiceBitrateMaximum: 384000; voiceUserLimit: 99; }>; export interface ChannelMetadataChangeRequest { auditReason: string; bitrate?: number; channelId: string; defaultAutoArchiveDuration?: number; defaultThreadRateLimitPerUser?: number; guildId: string; name?: string; nsfw?: boolean; operationKey: string; rateLimitPerUser?: number; rtcRegion?: string | null; topic?: string | null; userLimit?: number; videoQualityMode?: ChannelMetadataVideoQualityMode; } export interface NormalizedChannelMetadataChangeRequest extends ChannelMetadataChangeRequest { operationKeyHash: string; requestedFields: ChannelMetadataFieldName[]; } export interface ChannelMetadataView { applicableFields: ChannelMetadataFieldName[]; bitrate: number | null; defaultAutoArchiveDuration: number | null; defaultThreadRateLimitPerUser: number | null; guildId: string; id: string; name: string; nsfw: boolean | null; parentId: string | null; permissionOverwriteCount: number; position: number; rateLimitPerUser: number | null; rtcRegion: string | null; topic: string | null; type: number; unknownFieldCount: number; userLimit: number | null; videoQualityMode: ChannelMetadataVideoQualityMode | null; } export interface ChannelMetadataReadResult { metadata: ChannelMetadataView; privacy: { persistence: "none"; rawPayloads: "omitted"; text: "included"; unknownFields: "counts-only"; }; schemaVersion: number; status: "ok"; } export interface ChannelMetadataAccessEvidence { appliedRoleIds: string[]; authorizedForChange: true; botAdministrator: boolean; botGuildOwner: boolean; connect: true | null; effectivePermissionNames: DiscordPermissionName[]; effectivePermissions: string; manageChannels: true; requiredChangePermissions: DiscordPermissionName[]; unknownPermissionBits: string; viewChannel: true; } export type ChannelMetadataRtcRegionValidation = { kind: "not-requested"; } | { kind: "automatic"; } | { inventoryCount: number; inventoryDigest: string; kind: "available"; selected: DiscordVoiceRegion; }; export interface ChannelMetadataVoiceSettingsEvidence { bitrateMaximum: number; guildPremiumTier: number; guildVipRegions: boolean; rtcRegionValidation: ChannelMetadataRtcRegionValidation; userLimitMaximum: number; } export interface ChannelMetadataChange { after: boolean | number | string | null; before: boolean | number | string | null; field: ChannelMetadataFieldName; } export interface ChannelMetadataChangePlan { access: ChannelMetadataAccessEvidence; applicationId: string; auditReason: string; botId: string; changedFields: ChannelMetadataFieldName[]; changes: ChannelMetadataChange[]; createdAt: string; current: ChannelMetadataView; desired: ChannelMetadataView; digest: string; guild: { id: string; name: string; }; localLimits: typeof CHANNEL_METADATA_LOCAL_LIMITS; operationKeyHash: string; privacy: ChannelMetadataReadResult["privacy"]; requestedFields: ChannelMetadataFieldName[]; risks: string[]; schemaVersion: number; status: "already-current" | "planned"; warnings: string[]; voiceSettings: ChannelMetadataVoiceSettingsEvidence | null; writeRequired: boolean; } export interface ChannelMetadataChangeResult { activityId: string | null; channelId: string; guildId: string; observed: ChannelMetadataView; operationKeyHash: string; planDigest: string; readbackMatched: boolean; responseMatched: boolean; schemaVersion: number; status: "already-current" | "completed" | "completed-with-drift"; verification: "drift" | "match" | "not-required"; } export interface ChannelMetadataServiceClient extends Pick { } export interface ChannelMetadataServiceOptions { activityStore: ActivityStore; client: ChannelMetadataServiceClient; clock?: () => Date; operationStore: OperationStore; planKey?: Uint8Array; policy: Pick; randomId?: () => string; } export declare function assertChannelMetadataChannelId(channelId: string): void; export declare function normalizeChannelMetadataChangeRequest(request: ChannelMetadataChangeRequest): NormalizedChannelMetadataChangeRequest; export declare class ChannelMetadataService { #private; constructor(options: ChannelMetadataServiceOptions); get(channelId: string, options?: RequestOptions): Promise; plan(applicationId: string, botId: string, request: ChannelMetadataChangeRequest, options?: RequestOptions): Promise; reconcilePlan(applicationId: string, botId: string, request: ChannelMetadataChangeRequest, options?: RequestOptions): Promise; execute(applicationId: string, botId: string, request: ChannelMetadataChangeRequest, expectedDigest: string, options?: RequestOptions): Promise; } export {}; //# sourceMappingURL=channel-metadata-service.d.ts.map