givify
Version:
A Advance Discord Giveaway System
319 lines (292 loc) • 11.5 kB
TypeScript
import type { EventEmitter } from 'node:events';
import type {
ActionRowBuilder,
APIActionRowComponent,
APIButtonComponent,
APIEmbed,
APIMessageActionRowComponent,
APIModalActionRowComponent,
Awaitable,
ButtonComponent,
Client,
Collection,
ColorResolvable,
EmbedBuilder,
EmojiIdentifierResolvable,
GuildMember,
GuildTextBasedChannel,
JSONEncodable,
Message,
MessageActionRowComponentBuilder,
MessageMentionOptions,
MessageReaction,
PermissionResolvable,
Snowflake,
User
} from 'discord.js';
export const version: string;
export class GiveawaysManager<ExtraData = any> extends EventEmitter {
constructor(client: Client, options?: GiveawaysManagerOptions<ExtraData>, init?: boolean);
public client: Client;
public giveaways: Giveaway<ExtraData>[];
public options: GiveawaysManagerOptions<ExtraData>;
public ready: boolean;
public generateMainEmbed(giveaway: Giveaway<ExtraData>, lastChanceEnabled?: boolean): EmbedBuilder;
public generateEndEmbed(giveaway: Giveaway<ExtraData>, winners: GuildMember[]): EmbedBuilder;
public generateNoValidParticipantsEndEmbed(giveaway: Giveaway<ExtraData>): EmbedBuilder;
public delete(messageId: Snowflake, doNotDeleteMessage?: boolean): Promise<Giveaway<ExtraData>>;
public edit(messageId: Snowflake, options: GiveawayEditOptions<ExtraData>): Promise<Giveaway<ExtraData>>;
public end(messageId: Snowflake, noWinnerMessage?: string | MessageObject): Promise<GuildMember[]>;
public reroll(messageId: Snowflake, options?: GiveawayRerollOptions): Promise<GuildMember[]>;
public start(
channel: GuildTextBasedChannel,
options: GiveawayStartOptions<ExtraData>
): Promise<Giveaway<ExtraData>>;
public pause(
messageId: Snowflake,
options?: Omit<PauseOptions, 'isPaused' | 'durationAfterPause'>
): Promise<Giveaway<ExtraData>>;
public unpause(messageId: Snowflake): Promise<Giveaway<ExtraData>>;
protected getAllGiveaways(): Promise<Giveaway<ExtraData>[]>;
protected editGiveaway(messageId: Snowflake, giveawayData: GiveawayData<ExtraData>): Promise<boolean>;
protected saveGiveaway(messageId: Snowflake, giveawayData: GiveawayData<ExtraData>): Promise<boolean>;
protected deleteGiveaway(messageId: Snowflake): Promise<boolean>;
public on<K extends keyof GiveawaysManagerEvents<ExtraData>>(
event: K,
listener: (...args: GiveawaysManagerEvents<ExtraData>[K]) => void
): this;
public once<K extends keyof GiveawaysManagerEvents<ExtraData>>(
event: K,
listener: (...args: GiveawaysManagerEvents<ExtraData>[K]) => void
): this;
public emit<K extends keyof GiveawaysManagerEvents<ExtraData>>(
event: K,
...args: GiveawaysManagerEvents<ExtraData>[K]
): boolean;
}
export interface BonusEntry<ExtraData> {
bonus(member: GuildMember, giveaway: Giveaway<ExtraData>): Awaitable<number>;
cumulative?: boolean;
}
export interface LastChanceOptions {
enabled?: boolean;
embedColor?: ColorResolvable;
content?: string;
threshold?: number;
}
export interface PauseOptions {
isPaused?: boolean;
content?: string;
unpauseAfter?: number | null;
embedColor?: ColorResolvable;
durationAfterPause?: number | null;
infiniteDurationText?: string;
}
export interface GiveawaysManagerOptions<ExtraData> {
storage?: string;
forceUpdateEvery?: number | null;
endedGiveawaysLifetime?: number | null;
default?: {
botsCanWin?: boolean;
exemptPermissions?: PermissionResolvable[];
exemptMembers?: (member: GuildMember, giveaway: Giveaway<ExtraData>) => Awaitable<boolean>;
embedColor?: ColorResolvable;
embedColorEnd?: ColorResolvable;
reaction?: EmojiIdentifierResolvable | null;
buttons?: ButtonsObject | null;
lastChance?: LastChanceOptions;
};
}
export interface GiveawayStartOptions<ExtraData> {
prize: string;
winnerCount: number;
duration?: number; // can be null for drops
hostedBy?: User;
botsCanWin?: boolean;
exemptPermissions?: PermissionResolvable[];
exemptMembers?: (member: GuildMember, giveaway: Giveaway<ExtraData>) => Awaitable<boolean>;
bonusEntries?: BonusEntry<ExtraData>[];
embedColor?: ColorResolvable;
embedColorEnd?: ColorResolvable;
reaction?: EmojiIdentifierResolvable;
buttons?: ButtonsObject;
messages?: GiveawayMessages;
thumbnail?: string;
image?: string;
extraData?: ExtraData;
lastChance?: LastChanceOptions;
pauseOptions?: PauseOptions;
isDrop?: boolean;
allowedMentions?: Omit<MessageMentionOptions, 'repliedUser'>;
}
export interface GiveawayMessages {
giveaway?: string;
giveawayEnded?: string;
title?: string;
inviteToParticipate?: string;
timeRemaining?: string;
winMessage?: string | MessageObject;
drawing?: string;
dropMessage?: string;
embedFooter?: string | { text?: string; iconURL?: string };
noWinner?: string;
winners?: string;
endedAt?: string;
hostedBy?: string;
}
export interface MessageObject {
content?: string;
embed?: JSONEncodable<APIEmbed> | APIEmbed;
components?: (
| JSONEncodable<APIActionRowComponent<APIMessageActionRowComponent | APIModalActionRowComponent>>
| APIActionRowComponent<APIMessageActionRowComponent | APIModalActionRowComponent>
)[];
replyToGiveaway?: boolean;
}
export interface ButtonsObject {
join: JSONEncodable<APIButtonComponent> | APIButtonComponent;
leave?: JSONEncodable<APIButtonComponent> | APIButtonComponent;
joinReply?: string | Omit<MessageObject, 'replyToGiveaway'>;
leaveReply?: string | Omit<MessageObject, 'replyToGiveaway'>;
}
export interface GiveawaysManagerEvents<ExtraData = any> {
giveawayDeleted: [giveaway: Giveaway<ExtraData>];
giveawayEnded: [giveaway: Giveaway<ExtraData>, member: GuildMember[]];
giveawayRerolled: [giveaway: Giveaway<ExtraData>, member: GuildMember[]];
giveawayReactionAdded: [
giveaway: Giveaway<ExtraData>,
member: GuildMember,
interaction: MessageReaction | ButtonComponent
];
giveawayReactionRemoved: [
giveaway: Giveaway<ExtraData>,
member: GuildMember,
interaction: MessageReaction | ButtonComponent
];
endedGiveawayReactionAdded: [
giveaway: Giveaway<ExtraData>,
member: GuildMember,
interaction: MessageReaction | ButtonComponent
];
}
export class Giveaway<ExtraData = any> extends EventEmitter {
constructor(manager: GiveawaysManager<ExtraData>, options: GiveawayData<ExtraData>);
public channelId: Snowflake;
public client: Client;
public manager: GiveawaysManager<ExtraData>;
public messageId: Snowflake;
public guildId: Snowflake;
public prize: string;
public winnerCount: number;
public startAt: number;
public endAt: number;
public ended: boolean;
public message: Message | null;
public hostedBy?: User;
public messages: Required<GiveawayMessages>;
public thumbnail?: string;
public image?: string;
public extraData?: ExtraData;
public options: GiveawayData<ExtraData>;
public entrantIds?: Snowflake[];
public winnerIds: Snowflake[];
public allowedMentions?: Omit<MessageMentionOptions, 'repliedUser'>;
private endTimeout?: NodeJS.Timeout;
// getters calculated using default manager options
readonly exemptPermissions: PermissionResolvable[];
readonly embedColor: ColorResolvable;
readonly embedColorEnd: ColorResolvable;
readonly botsCanWin: boolean;
readonly reaction: EmojiIdentifierResolvable | null;
readonly lastChance: Required<LastChanceOptions>;
// getters calculated using other values
readonly remainingTime: number;
readonly duration: number;
readonly messageURL: string;
readonly exemptMembersFunction: Function | null;
readonly bonusEntries: BonusEntry<ExtraData>[];
readonly data: GiveawayData<ExtraData>;
readonly pauseOptions: Required<PauseOptions>;
readonly isDrop: boolean;
readonly messageReaction: MessageReaction | null;
private ensureEndTimeout(): void;
private checkWinnerEntry(user: User): Promise<boolean>;
public checkBonusEntries(user: User): Promise<number>;
public fetchAllEntrants(): Promise<Collection<Snowflake, User>>;
public fillInString(string: string): string;
public fillInString(string: unknown): string | null;
public fillInEmbed(embed: JSONEncodable<APIEmbed> | APIEmbed): EmbedBuilder;
public fillInEmbed(embed: unknown): EmbedBuilder | null;
public fillInComponents(
components: (
| JSONEncodable<APIActionRowComponent<APIMessageActionRowComponent | APIModalActionRowComponent>>
| APIActionRowComponent<APIMessageActionRowComponent | APIModalActionRowComponent>
)[]
): ActionRowBuilder<MessageActionRowComponentBuilder>[];
public fillInComponents(components: unknown): ActionRowBuilder<MessageActionRowComponentBuilder>[] | null;
public exemptMembers(member: GuildMember): Promise<boolean>;
public fetchMessage(): Promise<Message>;
public edit(options: GiveawayEditOptions<ExtraData>): Promise<Giveaway<ExtraData>>;
public end(noWinnerMessage?: string | MessageObject): Promise<GuildMember[]>;
public reroll(options?: GiveawayRerollOptions): Promise<GuildMember[]>;
public roll(winnerCount?: number): Promise<GuildMember[]>;
public pause(options?: Omit<PauseOptions, 'isPaused' | 'durationAfterPause'>): Promise<Giveaway<ExtraData>>;
public unpause(): Promise<Giveaway<ExtraData>>;
}
export interface GiveawayEditOptions<ExtraData> {
newWinnerCount?: number;
newPrize?: string;
addTime?: number;
setEndTimestamp?: number;
newButtons?: ButtonsObject;
newMessages?: GiveawayMessages;
newThumbnail?: string;
newImage?: string;
newBonusEntries?: BonusEntry<ExtraData>[];
newExemptMembers?: (member: GuildMember, giveaway: Giveaway<ExtraData>) => Awaitable<boolean>;
newExtraData?: ExtraData;
newLastChance?: LastChanceOptions;
}
export interface GiveawayRerollOptions {
winnerCount?: number;
messages?: {
congrat?: string | MessageObject;
error?: string | MessageObject;
replyWhenNoWinner?: boolean;
};
}
export interface GiveawayData<ExtraData = any> {
startAt: number;
endAt: number;
winnerCount: number;
messages: Required<GiveawayMessages>;
prize: string;
channelId: Snowflake;
guildId: Snowflake;
ended: boolean;
winnerIds?: Snowflake[];
messageId: Snowflake;
reaction?: EmojiIdentifierResolvable;
buttons?: ButtonsObject;
exemptPermissions?: PermissionResolvable[];
exemptMembers?: string;
bonusEntries?: string;
embedColor?: ColorResolvable;
embedColorEnd?: ColorResolvable;
thumbnail?: string;
image?: string;
hostedBy?: string;
extraData?: ExtraData;
lastChance?: LastChanceOptions;
pauseOptions?: PauseOptions;
isDrop?: boolean;
allowedMentions?: Omit<MessageMentionOptions, 'repliedUser'>;
entrantIds?: Snowflake[];
}
export enum Events {
GiveawayDeleted = 'giveawayDeleted',
GiveawayEnded = 'giveawayEnded',
GiveawayMemberJoined = 'giveawayMemberJoined',
GiveawayMemberLeft = 'giveawayMemberLeft',
GiveawayRerolled = 'giveawayRerolled'
}