import type { ActivityStore } from "./activity-log.js"; import type { DiscordClient, PollVoterPageOptions } from "./discord-client.js"; import { InteractionLimiter } from "./interaction-limiter.js"; import { type OperationStore } from "./operation-store.js"; import { type DiscordPermissionName } from "./permissions.js"; import type { ScopePolicy } from "./policy.js"; import type { DiscordMessage, RequestOptions } from "./types.js"; export interface PollAnswerInput { emoji?: string; text: string; } export interface PollCreationRequest { allowMultiselect?: boolean; answers: readonly PollAnswerInput[]; channelId: string; durationHours?: number; operationKey: string; question: string; } export interface NormalizedPollCreationRequest { allowMultiselect: boolean; answers: Array<{ emoji: string | null; text: string; }>; channelId: string; durationHours: number; operationKey: string; operationKeyHash: string; question: string; } export interface PollEndRequest { channelId: string; messageId: string; operationKey: string; } export interface NormalizedPollEndRequest extends PollEndRequest { operationKeyHash: string; } export interface NormalizedPollEmoji { animated: boolean | null; id: string | null; name: string; type: "custom" | "unicode"; } export interface NormalizedPollAnswer { answerId: number; count: number | null; emoji: NormalizedPollEmoji | null; meVoted: boolean | null; text: string; } export type PollResultState = "approximate" | "final" | "unknown"; export type PollLifecycleState = "active" | "ended" | "unknown"; export interface NormalizedPoll { allowMultiselect: boolean; answers: NormalizedPollAnswer[]; expiry: string | null; layoutType: 1; lifecycleState: PollLifecycleState; question: string; resultState: PollResultState; resultsFinalized: boolean | null; totalVotes: number | null; unknownFieldCount: number; } export interface PollReadResult { author: { bot: boolean; id: string; webhook: boolean; }; channelId: string; createdAt: string; editedAt: string | null; guildId: string; messageId: string; poll: NormalizedPoll; privacy: { persistence: "none"; rawPayloads: "omitted"; voterIdentities: "not-fetched"; }; schemaVersion: number; status: "ok"; url: string; } export interface PollVoterListResult { answerId: number; channelId: string; guildId: string; messageId: string; page: { after: string | null; nextAfter: string | null; requestedLimit: number; returned: number; }; privacy: { persistence: "none"; profileFields: "omitted"; }; schemaVersion: number; status: "ok"; voterUserIds: string[]; } export interface PollPermissionEvidence { administrator: boolean; confidence: "complete"; effectivePermissionNames: DiscordPermissionName[]; effectivePermissions: string; permissionSourceChannelId: string; requiredPermissionNames: DiscordPermissionName[]; } export interface PollCreationPlan { applicationId: string; botId: string; channel: { guildId: string; id: string; parentId: string | null; type: number; }; createdAt: string; digest: string; operationKeyHash: string; permission: PollPermissionEvidence; privacy: { persistence: "content-free-only"; rawPayloads: "omitted"; text: "transient"; voterIdentities: "not-fetched"; }; risks: string[]; schemaVersion: number; status: "planned"; target: { allowMultiselect: boolean; answers: Array<{ emoji: string | null; text: string; }>; durationHours: number; question: string; }; warnings: string[]; writeRequired: true; } export interface PollEndPlan { applicationId: string; botId: string; channel: { guildId: string; id: string; parentId: string | null; type: number; }; createdAt: string; digest: string; messageId: string; operationKeyHash: string; permission: PollPermissionEvidence; poll: NormalizedPoll; privacy: { persistence: "content-free-only"; rawPayloads: "omitted"; text: "transient"; voterIdentities: "not-fetched"; }; risks: string[]; schemaVersion: number; status: "already-ended" | "planned"; warnings: string[]; writeRequired: boolean; } export interface PollCreationResult { activityId: string; channelId: string; expiryMatched: boolean; guildId: string; messageId: string; operationKeyHash: string; planDigest: string; readbackMatched: boolean; responseMatched: boolean; schemaVersion: number; status: "completed" | "completed-with-drift"; url: string; verification: "drift" | "match"; } export interface PollEndResult { activityId: string | null; channelId: string; finalization: "final" | "pending" | "not-required"; guildId: string; messageId: string; operationKeyHash: string; planDigest: string; readbackMatched: boolean; responseMatched: boolean; schemaVersion: number; status: "already-ended" | "completed" | "completed-with-drift"; url: string; verification: "drift" | "match" | "not-required"; } export interface PollServiceOptions { activityStore: ActivityStore; client: Pick; clock?: () => Date; limiter: InteractionLimiter; operationStore: OperationStore; planKey?: Uint8Array; policy: Pick; randomId?: () => string; } export declare function normalizePollCreationRequest(request: PollCreationRequest): NormalizedPollCreationRequest; export declare function normalizePollEndRequest(request: PollEndRequest): NormalizedPollEndRequest; export declare function normalizeDiscordPollMessage(message: DiscordMessage, channelId: string, guildId: string, messageId: string, clock: Date): PollReadResult; export declare function pollNonce(channelId: string, operationKey: string): string; export declare class PollService { #private; constructor(options: PollServiceOptions); get(channelId: string, messageId: string, options?: RequestOptions): Promise; listAnswerVoters(channelId: string, messageId: string, answerId: number, options?: PollVoterPageOptions): Promise; planCreation(applicationId: string, botId: string, request: PollCreationRequest, options?: RequestOptions): Promise; executeCreation(applicationId: string, botId: string, request: PollCreationRequest, expectedDigest: string, options?: RequestOptions): Promise; planEnd(applicationId: string, botId: string, request: PollEndRequest, options?: RequestOptions): Promise; executeEnd(applicationId: string, botId: string, request: PollEndRequest, expectedDigest: string, options?: RequestOptions): Promise; } //# sourceMappingURL=poll-service.d.ts.map