import type { ActivityStore } from "./activity-log.js"; import { type ForumTagAction } from "./constants.js"; import { type DiscordClient } 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"; declare const LOCAL_LIMITS: Readonly<{ customEmojiIntroduction: false; forumTags: 20; mediaChannels: false; nameCharacters: 20; reorder: false; }>; interface ForumTagChangeBase { action: ForumTagAction; auditReason: string; channelId: string; guildId: string; operationKey: string; } export interface CreateForumTagRequest extends ForumTagChangeBase { action: "create"; moderated?: boolean; name: string; unicodeEmoji?: string | null; } export interface UpdateForumTagRequest extends ForumTagChangeBase { action: "update-metadata"; moderated?: boolean; name?: string; tagId: string; unicodeEmoji?: string | null; } export interface DeleteForumTagRequest extends ForumTagChangeBase { action: "delete"; tagId: string; } export type ForumTagChangeRequest = CreateForumTagRequest | DeleteForumTagRequest | UpdateForumTagRequest; interface NormalizedForumTagChangeBase { action: ForumTagAction; auditReason: string; channelId: string; guildId: string; operationKeyHash: string; } export interface NormalizedCreateForumTagRequest extends NormalizedForumTagChangeBase { action: "create"; moderated: boolean; name: string; unicodeEmoji: string | null; } export interface NormalizedUpdateForumTagRequest extends NormalizedForumTagChangeBase { action: "update-metadata"; moderated?: boolean; name?: string; requestedFields: Array<"moderated" | "name" | "unicodeEmoji">; tagId: string; unicodeEmoji?: string | null; } export interface NormalizedDeleteForumTagRequest extends NormalizedForumTagChangeBase { action: "delete"; tagId: string; } export type NormalizedForumTagChangeRequest = NormalizedCreateForumTagRequest | NormalizedDeleteForumTagRequest | NormalizedUpdateForumTagRequest; export type ForumTagEmojiView = { emojiId: string; kind: "custom"; } | { kind: "none"; } | { kind: "unicode"; unicodeEmoji: string; }; export interface ForumTagView { emoji: ForumTagEmojiView; id: string; moderated: boolean; name: string; position: number; unknownFieldCount: number; } export interface PlannedForumTagView { emoji: ForumTagEmojiView; id: string | null; moderated: boolean; name: string; position: number; unknownFieldCount: number; } export interface ForumTagAccessEvidence { appliedRoleIds: string[]; authorizedForChange: boolean; botAdministrator: boolean; botGuildOwner: boolean; complete: true; effectivePermissionNames: DiscordPermissionName[]; effectivePermissions: string; manageChannels: boolean; requiredPermissions: DiscordPermissionName[]; unknownPermissionBits: string; viewChannel: true; } export interface ForumTagInventoryView { returned: number; safetyLimit: number; unknownTagFields: number; } export interface ForumTagPrivacyProjection { persistence: "content-free-activity-only"; rawPayloads: "omitted"; tagText: "included-in-transient-results"; unknownFields: "counts-only"; } export interface ForumTagObservedState { channel: { flags: number; guildId: string; id: string; permissionOverwriteUnknownFieldCount: number; type: number; unknownFieldCount: number; }; inventory: ForumTagInventoryView; tags: ForumTagView[]; } export interface ForumTagAuditResult extends ForumTagObservedState { access: ForumTagAccessEvidence; applicationId: string; botId: string; limitations: string[]; privacy: ForumTagPrivacyProjection; schemaVersion: number; status: "ok"; } export interface ForumTagChangePlan { access: ForumTagAccessEvidence; action: ForumTagAction; applicationId: string; auditReason: string; botId: string; channel: ForumTagObservedState["channel"]; createdAt: string; currentInventory: ForumTagInventoryView; currentTags: ForumTagView[]; desiredInventory: ForumTagInventoryView; desiredTags: PlannedForumTagView[]; digest: string; guild: { id: string; }; impact: { activeThreadsEnumerated: false; tagUsage: "not-applicable" | "unknown-unavailable"; }; localLimits: typeof LOCAL_LIMITS; mutation: "create" | "delete" | "none" | "update-metadata"; operationKeyHash: string; privacy: ForumTagPrivacyProjection; risks: string[]; schemaVersion: number; status: "already-current" | "planned"; target: ForumTagView | null; warnings: string[]; writeRequired: boolean; } export interface ForumTagChangeResult { action: ForumTagAction; activityId: string | null; channelId: string; guildId: string; observed: ForumTagObservedState; operationKeyHash: string; planDigest: string; readbackMatched: boolean; responseMatched: boolean; schemaVersion: number; status: "already-current" | "completed"; tagId: string; verification: "match" | "not-required"; } export interface ForumTagServiceClient extends Pick { } export interface ForumTagServiceOptions { activityStore: ActivityStore; client: ForumTagServiceClient; clock?: () => Date; operationStore: OperationStore; planKey?: Uint8Array; policy: Pick; randomId?: () => string; } export declare function assertForumTagChannelId(channelId: string): void; export declare function isForumTagUnicodeEmoji(value: string): boolean; export declare function normalizeForumTagChangeRequest(request: ForumTagChangeRequest): NormalizedForumTagChangeRequest; export declare class ForumTagService { #private; constructor(options: ForumTagServiceOptions); audit(applicationId: string, botId: string, channelId: string, options?: RequestOptions): Promise; plan(applicationId: string, botId: string, request: ForumTagChangeRequest, options?: RequestOptions): Promise; execute(applicationId: string, botId: string, request: ForumTagChangeRequest, expectedDigest: string, options?: RequestOptions): Promise; } export {}; //# sourceMappingURL=forum-tag-service.d.ts.map