import type { ActivityStore } from "./activity-log.js"; import { type DiscordClient, type ReactionUserPageOptions } from "./discord-client.js"; import { type OperationStore } from "./operation-store.js"; import type { ScopePolicy } from "./policy.js"; import type { DiscordReaction, RequestOptions } from "./types.js"; export declare const REACTION_MODERATION_SCOPES: readonly ["all", "emoji", "user"]; export type ReactionModerationScope = typeof REACTION_MODERATION_SCOPES[number]; declare const PRIVACY_OMITTED_FIELDS: readonly ["attachments", "author", "burstColors", "components", "content", "embeds", "memberProfiles", "rawPayloads", "userAvatars", "userGlobalNames", "userNames"]; export interface NormalizedReactionEmoji { id: string | null; key: string; kind: "custom" | "unicode"; name: string; routeToken: string; } export interface ReactionEmojiSummary { animated: boolean; id: string | null; kind: "custom" | "unicode"; name: string | null; routeToken: string | null; } export interface ReactionAggregate { burstCount: number; count: number; emoji: ReactionEmojiSummary; me: boolean; meBurst: boolean; normalCount: number; } export interface ReactionPrivacyProjection { omittedFields: typeof PRIVACY_OMITTED_FIELDS; persistence: "none"; profilesProjectedOut: true; rawPayloads: "omitted"; } export interface MessageReactionInventoryResult { channel: { id: string; parentId: string | null; type: number; }; guildId: string; message: { id: string; timestamp: string; type: number; url: string; }; privacy: ReactionPrivacyProjection; reactions: ReactionAggregate[]; schemaVersion: number; status: "ok"; } export interface ReactionUserPageResult { channelId: string; emoji: ReactionEmojiSummary; guildId: string; messageId: string; page: { nextAfter: string | null; requestedAfter: string | null; requestedLimit: number; returned: number; }; privacy: ReactionPrivacyProjection; reactionType: "burst" | "normal"; schemaVersion: number; status: "ok"; users: Array<{ bot: boolean; id: string; }>; } export interface ReactionModerationRequest { auditReason: string; channelId: string; emoji?: string; messageId: string; operationKey: string; scope: ReactionModerationScope; userId?: string; } export interface NormalizedReactionModerationRequest { auditReason: string; channelId: string; emoji: NormalizedReactionEmoji | null; messageId: string; operationKeyHash: string; scope: ReactionModerationScope; userId: string | null; } export interface ReactionModerationAccessEvidence { administrator: boolean; appliedRoleIds: string[]; canReadMessages: true; confidence: "complete"; connect: boolean | null; effectivePermissions: string; manageMessages: true; permissionSourceChannelId: string; privateThreadAccess: "lookup-succeeded" | "not-applicable"; readMessageHistory: true; viewChannel: true; } export interface ReactionModerationPlan { action: "none" | "remove"; applicationId: string; auditReason: string; botId: string; channel: { id: string; parentId: string | null; type: number; }; createdAt: string; digest: string; guild: { id: string; name: string; }; message: { id: string; timestamp: string; type: number; url: string; }; operationKeyHash: string; permission: ReactionModerationAccessEvidence; privacy: ReactionPrivacyProjection; reactions: ReactionAggregate[]; schemaVersion: number; status: "already-absent" | "planned"; target: { emoji: ReactionEmojiSummary | null; scope: ReactionModerationScope; userBot: boolean | null; userId: string | null; }; warnings: string[]; writeRequired: boolean; } export interface ReactionModerationResult { activityId: string | null; channelId: string; exactSnapshotMatched: boolean; guildId: string; messageId: string; operationKeyHash: string; planDigest: string; schemaVersion: number; status: "already-absent" | "completed" | "completed-with-drift"; targetAbsent: true; url: string; } export interface ReactionServiceClient extends Pick { } export interface ReactionServiceOptions { activityStore: ActivityStore; client: ReactionServiceClient; clock?: () => Date; operationStore: OperationStore; planKey?: Uint8Array; policy: ScopePolicy; randomId?: () => string; } export declare function normalizeReactionEmoji(value: string): NormalizedReactionEmoji; export declare function parseReactionAggregates(value: readonly DiscordReaction[] | undefined): ReactionAggregate[]; export declare function normalizeReactionModerationRequest(request: ReactionModerationRequest): NormalizedReactionModerationRequest; export declare class ReactionService { #private; constructor(options: ReactionServiceOptions); listMessageReactions(channelId: string, messageId: string, options?: RequestOptions): Promise; listReactionUsers(channelId: string, messageId: string, emoji: string, options?: ReactionUserPageOptions): Promise; plan(applicationId: string, botId: string, request: ReactionModerationRequest, options?: RequestOptions): Promise; execute(applicationId: string, botId: string, request: ReactionModerationRequest, expectedDigest: string, options?: RequestOptions): Promise; } export {}; //# sourceMappingURL=reaction-service.d.ts.map