diff --git a/bin/Embeds.js b/bin/Embeds.js index 3f4aa5a..03e360d 100644 --- a/bin/Embeds.js +++ b/bin/Embeds.js @@ -82,13 +82,9 @@ class s extends r.PaginationEmbed { for (const r of this.array) r.setURL(t); return this; } - spliceFields(t, r, s, e, i) { + spliceFields(t, r, ...s) { if (!this.array) throw new TypeError("this.array must be set first."); - for (const a of this.array) a.spliceFields(t, r, [ { - name: s, - value: e, - inline: i - } ]); + for (const e of this.array) e.spliceFields(t, r, ...s); return this; } toJSON() { @@ -96,7 +92,7 @@ class s extends r.PaginationEmbed { return this.array.map((t => t.toJSON())); } async _loadList(r = !0) { - this.listenerCount("pageUpdate") && this.emit("pageUpdate"); + this.listenerCount("pageUpdate") && this.emit("pageUpdate", this); const s = new t.MessageEmbed(this.currentEmbed), e = "footer" === this.usePageIndicator, i = this.usePageIndicator && !e ? 1 === this.pages ? "" : this.pageIndicator : "", {separator: a, text: o} = this.content, n = { embeds: [ s ], content: `${o ? `${o}${a}` : ""}${i}` || null diff --git a/bin/FieldsEmbed.js b/bin/FieldsEmbed.js index a0d13b5..632a84d 100644 --- a/bin/FieldsEmbed.js +++ b/bin/FieldsEmbed.js @@ -21,7 +21,7 @@ class s extends t.PaginationEmbed { await this._verify(); const e = this.embed.fields; this.embed.fields = []; - for (const t of e) "function" == typeof t.value ? this.formatField(t.name, t.value, t.inline) : this.embed.addField(t.name, t.value, t.inline); + for (const t of e) this.embed.fields.push(t); if (!this.embed.fields.filter((e => "function" == typeof e.value)).length) throw new Error("Cannot invoke FieldsEmbed class without at least one formatted field to paginate."); return this._loadList(); } @@ -38,18 +38,22 @@ class s extends t.PaginationEmbed { return this.elementsPerPage = e, this; } async _drawList() { - const t = new e.MessageEmbed(this.embed); - t.fields = []; - for (const e of this.embed.fields) t.addField(e.name, "function" == typeof e.value ? this.elementList.map(e.value).join("\n") : e.value, e.inline); - return t; + const t = this.embed.fields; + this.embed.fields = []; + const s = new e.MessageEmbed(this.embed); + this.embed.fields = t; + for (const e of t) s.addField(e.name, "function" == typeof e.value ? this.elementList.map(e.value).join("\n") : e.value, e.inline); + return s; } async _loadList(e = !0) { - this.listenerCount("pageUpdate") && this.emit("pageUpdate"); - const t = await this._drawList(), s = "footer" === this.usePageIndicator, i = this.usePageIndicator && !s ? 1 === this.pages ? "" : this.pageIndicator : "", {separator: n, text: a} = this.content, r = { - embeds: [ t ], - content: `${a ? `${a}${n}` : ""}${i}` || null + var t; + this.listenerCount("pageUpdate") && this.emit("pageUpdate", this); + const s = await this._drawList(), i = "footer" === this.usePageIndicator, n = this.usePageIndicator && !i ? 1 === this.pages ? "" : this.pageIndicator : "", {separator: a, text: r} = this.content, o = { + embeds: [ s ], + content: `${r ? `${r}${a}` : ""}${n}` || null }; - return s && t.setFooter(this.pageIndicator, t.footer.iconURL), this.clientAssets.message ? await this.clientAssets.message.edit(r) : this.clientAssets.message = await this.channel.send(r), + return i && s.setFooter(this.pageIndicator, null === (t = s.footer) || void 0 === t ? void 0 : t.iconURL), + this.clientAssets.message ? await this.clientAssets.message.edit(o) : this.clientAssets.message = await this.channel.send(o), super._loadList(e); } } diff --git a/bin/base/index.js b/bin/base/index.js index 4ad19ff..c391296 100644 --- a/bin/base/index.js +++ b/bin/base/index.js @@ -4,9 +4,9 @@ Object.defineProperty(exports, "__esModule", { value: !0 }), exports.PaginationEmbed = void 0; -const t = require("events"); +const t = require("discord.js"), e = require("events"); -class e extends t.EventEmitter { +class i extends e.EventEmitter { constructor() { super(), this.authorizedUsers = [], this.channel = null, this.clientAssets = {}, this.content = { @@ -133,10 +133,10 @@ class e extends t.EventEmitter { return this._checkPermissions(); } async _checkPermissions() { - const t = this.channel; - if (t.guild) { - const e = t.permissionsFor(t.client.user).missing([ "ADD_REACTIONS", "EMBED_LINKS", "VIEW_CHANNEL", "SEND_MESSAGES" ]); - if (e.length) throw new Error(`Cannot invoke PaginationEmbed class without required permissions: ${e.join(", ")}`); + const e = this.channel; + if (e.guild) { + const i = e.permissionsFor(e.client.user).missing([ t.Permissions.FLAGS.ADD_REACTIONS, t.Permissions.FLAGS.EMBED_LINKS, t.Permissions.FLAGS.VIEW_CHANNEL, t.Permissions.FLAGS.READ_MESSAGE_HISTORY, t.Permissions.FLAGS.SEND_MESSAGES ]); + if (i.length) throw new Error(`Cannot invoke PaginationEmbed class without required permissions: ${i.join(", ")}`); } return !0; } @@ -146,7 +146,7 @@ class e extends t.EventEmitter { async _drawEmojis() { return this.emojisFunctionAfterNavigation ? (await this._drawNavigationEmojis(), await this._drawFunctionEmojis()) : (await this._drawFunctionEmojis(), await this._drawNavigationEmojis()), - this.listenerCount("start") && this.emit("start"), this._awaitResponse(); + this._emit("start"), this._awaitResponse(); } async _drawFunctionEmojis() { if (Object.keys(this.functionEmojis).length) for (const t of Object.keys(this.functionEmojis)) await this.clientAssets.message.react(t); @@ -164,21 +164,21 @@ class e extends t.EventEmitter { return this.setPage(t), await this._loadList(!1), this._awaitResponse(); } async _awaitResponse() { - const t = Object.values(this.navigationEmojis), e = this.clientAssets.message.channel, i = (e, i) => { - const s = !!this._enabled("all") && (!this._disabledNavigationEmojiValues.length || this._disabledNavigationEmojiValues.some((t => ![ e.emoji.name, e.emoji.id ].includes(t)))) && (t.includes(e.emoji.name) || t.includes(e.emoji.id)) || e.emoji.name in this.functionEmojis || e.emoji.id in this.functionEmojis; + const e = Object.values(this.navigationEmojis), i = this.clientAssets.message.channel, s = (t, i) => { + const s = !!this._enabled("all") && (!this._disabledNavigationEmojiValues.length || this._disabledNavigationEmojiValues.some((e => ![ t.emoji.name, t.emoji.id ].includes(e)))) && (e.includes(t.emoji.name) || e.includes(t.emoji.id)) || t.emoji.name in this.functionEmojis || t.emoji.id in this.functionEmojis; return this.authorizedUsers.length ? this.authorizedUsers.includes(i.id) && s : !i.bot && s; - }, s = this.clientAssets.message; + }, a = this.clientAssets.message; try { - const t = (await s.awaitReactions({ - filter: i, + const e = (await a.awaitReactions({ + filter: s, max: 1, time: this.timeout, errors: [ "time" ] - })).first(), n = t.users.cache.last(), a = [ t.emoji.name, t.emoji.id ]; - if (this.listenerCount("react") && this.emit("react", n, t.emoji), s.guild) { - e.permissionsFor(e.client.user).missing([ "MANAGE_MESSAGES" ]).length || await t.users.remove(n); + })).first(), n = e.users.cache.last(), o = [ e.emoji.name, e.emoji.id ]; + if (this._emit("react", n, e.emoji), a.guild) { + i.permissionsFor(i.client.user).missing(t.Permissions.FLAGS.MANAGE_MESSAGES).length || await e.users.remove(n); } - switch (a[0] || a[1]) { + switch (o[0] || o[1]) { case this.navigationEmojis.back: return 1 === this.page ? this._awaitResponse() : this._loadPage("back"); @@ -189,51 +189,60 @@ class e extends t.EventEmitter { return this.page === this.pages ? this._awaitResponse() : this._loadPage("forward"); case this.navigationEmojis.delete: - return await s.delete(), void (this.listenerCount("finish") && this.emit("finish", n)); + return await a.delete(), void this._emit("finish", n); default: { - const t = this.functionEmojis[a[0]] || this.functionEmojis[a[1]]; + const t = this.functionEmojis[o[0]] || this.functionEmojis[o[1]]; try { await t(n, this); } catch (t) { - return this._cleanUp(t, s, !1, n); + return this._cleanUp(t, a, !1, n); } return this._loadPage(this.page); } } } catch (t) { - return this._cleanUp(t, s); + return this._cleanUp(t, a); } } - async _cleanUp(t, e, i = !0, s) { + async _cleanUp(e, i, s = !0, a) { const n = this.clientAssets.message.channel; - if (this.deleteOnTimeout && e.deletable && (await e.delete(), e.deleted = !0), e.guild && !e.deleted) { - n.permissionsFor(n.client.user).missing([ "MANAGE_MESSAGES" ]).length || await e.reactions.removeAll(); + if (this.deleteOnTimeout && i.deletable && (await i.delete(), i.deleted = !0), i.guild && !i.deleted) { + n.permissionsFor(n.client.user).missing(t.Permissions.FLAGS.MANAGE_MESSAGES).length || await i.reactions.removeAll(); } - if (t instanceof Error) return void (this.listenerCount("error") && this.emit("error", t)); - const a = i ? "expire" : "finish"; - this.listenerCount(a) && this.emit(a, s); + if (e instanceof Error) return void this._emit("error", e); + const o = s ? "expire" : "finish"; + this._emit(o, a); } async _awaitResponseEx(t) { const e = [ "0", "cancel" ], i = i => { const s = parseInt(i.content); return i.author.id === t.id && (!isNaN(Number(i.content)) && s !== this.page && s >= 1 && s <= this.pages || e.includes(i.content.toLowerCase())); - }, s = this.clientAssets.message.channel, n = await s.send(this.clientAssets.prompt.replace(/\{\{user\}\}/g, t.toString())); + }, s = this.clientAssets.message, a = s.channel, n = this.clientAssets.prompt.replace(/\{\{user\}\}/g, t.toString()), o = await a.send({ + content: n, + reply: { + messageReference: s, + failIfNotExists: !1 + } + }); try { - const t = (await s.awaitMessages({ + const t = (await a.awaitMessages({ filter: i, max: 1, time: this.timeout, errors: [ "time" ] - })).first(), a = t.content, o = s.permissionsFor(s.client.user).missing([ "MANAGE_MESSAGES" ]); - return this.clientAssets.message.deleted ? void (this.listenerCount("error") && this.emit("error", new Error("Client's message was deleted before being processed."))) : (await n.delete(), - t.deletable && (o.length || await t.delete()), e.includes(a) ? this._awaitResponse() : this._loadPage(parseInt(a))); + })).first(), s = t.content; + return this.clientAssets.message.deleted || await o.delete(), t.deletable && await t.delete(), + e.includes(s) ? this._awaitResponse() : this._loadPage(parseInt(s)); } catch (t) { - if (n.deletable && await n.delete(), t instanceof Error) return void (this.listenerCount("error") && this.emit("error", t)); - this.listenerCount("expire") && this.emit("expire"); + if (o.deletable && await o.delete(), t instanceof Error) return void this._emit("error", t); + this._emit("expire"); } } + _emit(t, ...e) { + if (this.listenerCount(t)) return this.emit(t, ...e, this); + } } -exports.PaginationEmbed = e; \ No newline at end of file +exports.PaginationEmbed = i; \ No newline at end of file diff --git a/package.json b/package.json index 2597dfc..9c9d52b 100644 --- a/package.json +++ b/package.json @@ -43,17 +43,17 @@ "discord.js": "^13.0.0-dev.4206e35.1626393827" }, "devDependencies": { - "@types/node": "^14.14.35", - "@typescript-eslint/eslint-plugin": "^4.19.0", - "@typescript-eslint/parser": "^4.19.0", - "del": "^5.0.0", + "@types/node": "^14.17.5", + "@typescript-eslint/eslint-plugin": "^4.28.4", + "@typescript-eslint/parser": "^4.28.4", + "del": "^6.0.0", "gulp": "^4.0.2", - "gulp-eslint7": "^0.3.0", + "gulp-eslint7": "^0.3.1", "gulp-terser": "^2.0.1", "gulp-typescript": "^6.0.0-alpha.1", - "typedoc": "^0.20.30", - "typedoc-neo-theme": "^1.1.0", - "typedoc-plugin-no-inherit": "^1.2.2", - "typescript": "^4.2.3" + "typedoc": "^0.21.4", + "typedoc-neo-theme": "^1.1.1", + "typedoc-plugin-no-inherit": "^1.3.0", + "typescript": "^4.3.5" } } diff --git a/src/Embeds.ts b/src/Embeds.ts index cb67da2..fb22dca 100644 --- a/src/Embeds.ts +++ b/src/Embeds.ts @@ -283,17 +283,11 @@ export class Embeds extends PaginationEmbed { * @param value - The value of the field. * @param inline - Set the field to display inline. */ - public spliceFields ( - index: number, - deleteCount: number, - name?: string, - value?: string, - inline?: boolean - ) { + public spliceFields (index: number, deleteCount: number, ...fields: EmbedFieldData[] | EmbedFieldData[][]) { if (!this.array) throw new TypeError('this.array must be set first.'); for (const el of this.array) - el.spliceFields(index, deleteCount, [ { name, value, inline } ]); + el.spliceFields(index, deleteCount, ...fields); return this; } @@ -307,7 +301,7 @@ export class Embeds extends PaginationEmbed { /** @ignore */ public async _loadList (callNavigation = true) { - if (this.listenerCount('pageUpdate')) this.emit('pageUpdate'); + if (this.listenerCount('pageUpdate')) this.emit('pageUpdate', this); const embed = new MessageEmbed(this.currentEmbed); const isFooter = this.usePageIndicator === 'footer'; diff --git a/src/FieldsEmbed.ts b/src/FieldsEmbed.ts index 54a7658..e19bee8 100644 --- a/src/FieldsEmbed.ts +++ b/src/FieldsEmbed.ts @@ -84,10 +84,7 @@ export class FieldsEmbed extends PaginationEmbed { this.embed.fields = []; for (const field of fields) - if (typeof field.value === 'function') - this.formatField(field.name, field.value, field.inline); - else - this.embed.addField(field.name, field.value, field.inline); + this.embed.fields.push(field); const hasPaginateField = this.embed.fields.filter(f => typeof f.value === 'function').length; @@ -127,10 +124,12 @@ export class FieldsEmbed extends PaginationEmbed { } protected async _drawList () { + const fields = this.embed.fields; + this.embed.fields = []; const embed = new MessageEmbed(this.embed); - embed.fields = []; + this.embed.fields = fields; - for (const field of this.embed.fields) + for (const field of fields) embed.addField( field.name, typeof field.value === 'function' @@ -144,7 +143,7 @@ export class FieldsEmbed extends PaginationEmbed { /** @ignore */ public async _loadList (callNavigation = true) { - if (this.listenerCount('pageUpdate')) this.emit('pageUpdate'); + if (this.listenerCount('pageUpdate')) this.emit('pageUpdate', this); const embed = await this._drawList(); const isFooter = this.usePageIndicator === 'footer'; @@ -159,7 +158,7 @@ export class FieldsEmbed extends PaginationEmbed { const options = { embeds: [ embed ], content: content || null }; if (isFooter) - embed.setFooter(this.pageIndicator, embed.footer.iconURL); + embed.setFooter(this.pageIndicator, embed.footer?.iconURL); if (this.clientAssets.message) await this.clientAssets.message.edit(options); else diff --git a/src/base/index.ts b/src/base/index.ts index f41ef44..42f5465 100644 --- a/src/base/index.ts +++ b/src/base/index.ts @@ -6,6 +6,7 @@ import { Message, MessageReaction, NewsChannel, + Permissions, Snowflake, TextChannel, User @@ -14,9 +15,6 @@ import { EventEmitter } from 'events'; import { Embeds } from '../Embeds'; import { FieldsEmbed } from '../FieldsEmbed'; -/** @ignore */ -const MESSAGE_DELETED = 'Client\'s message was deleted before being processed.'; - /** * The base class for Pagination Modes. **Do not invoke**. * @extends [EventEmitter](https://nodejs.org/api/events.html#events_class_eventemitter) @@ -446,7 +444,13 @@ export abstract class PaginationEmbed extends EventEmitter { if (channel.guild) { const missing = channel .permissionsFor(channel.client.user) - .missing([ 'ADD_REACTIONS', 'EMBED_LINKS', 'VIEW_CHANNEL', 'SEND_MESSAGES' ]); + .missing([ + Permissions.FLAGS.ADD_REACTIONS, + Permissions.FLAGS.EMBED_LINKS, + Permissions.FLAGS.VIEW_CHANNEL, + Permissions.FLAGS.READ_MESSAGE_HISTORY, + Permissions.FLAGS.SEND_MESSAGES, + ]); if (missing.length) throw new Error(`Cannot invoke PaginationEmbed class without required permissions: ${missing.join(', ')}`); @@ -475,8 +479,7 @@ export abstract class PaginationEmbed extends EventEmitter { await this._drawNavigationEmojis(); } - if (this.listenerCount('start')) - this.emit('start'); + this._emit('start'); return this._awaitResponse(); } @@ -548,11 +551,12 @@ export abstract class PaginationEmbed extends EventEmitter { const user = response.users.cache.last(); const emoji = [ response.emoji.name, response.emoji.id ]; - if (this.listenerCount('react')) this.emit('react', user, response.emoji); + this._emit('react', user, response.emoji); + if (clientMessage.guild) { const missing = channel .permissionsFor(channel.client.user) - .missing([ 'MANAGE_MESSAGES' ]); + .missing(Permissions.FLAGS.MANAGE_MESSAGES); if (!missing.length) await response.users.remove(user); @@ -577,7 +581,7 @@ export abstract class PaginationEmbed extends EventEmitter { case this.navigationEmojis.delete: await clientMessage.delete(); - if (this.listenerCount('finish')) this.emit('finish', user); + this._emit('finish', user); return; @@ -617,19 +621,19 @@ export abstract class PaginationEmbed extends EventEmitter { if (clientMessage.guild && !clientMessage.deleted) { const missing = channel .permissionsFor(channel.client.user) - .missing([ 'MANAGE_MESSAGES' ]); + .missing(Permissions.FLAGS.MANAGE_MESSAGES); if (!missing.length) await clientMessage.reactions.removeAll(); } if (err instanceof Error) { - if (this.listenerCount('error')) this.emit('error', err); + this._emit('error', err); return; } const eventType = expired ? 'expire' : 'finish'; - if (this.listenerCount(eventType)) this.emit(eventType, user); + this._emit(eventType, user); } /** @@ -648,107 +652,116 @@ export abstract class PaginationEmbed extends EventEmitter { ) ); }; - const channel = this.clientAssets.message.channel; - const prompt = await channel - .send(this.clientAssets.prompt.replace(/\{\{user\}\}/g, user.toString())) as Message; + const clientMessage = this.clientAssets.message; + const channel = clientMessage.channel; + const content = this.clientAssets.prompt.replace(/\{\{user\}\}/g, user.toString()); + const prompt = await channel.send({ + content, + reply: { + messageReference: clientMessage, + failIfNotExists: false + } + }); try { const responses = await channel.awaitMessages({ filter, max: 1, time: this.timeout, errors: [ 'time' ] }); const response = responses.first(); const content = response.content; - const missing = (channel as TextChannel).permissionsFor(channel.client.user) - .missing([ 'MANAGE_MESSAGES' ]); - - if (this.clientAssets.message.deleted) { - if (this.listenerCount('error')) this.emit('error', new Error(MESSAGE_DELETED)); - - return; - } - - await prompt.delete(); - - if (response.deletable) - if (!missing.length) await response.delete(); + if (!this.clientAssets.message.deleted) await prompt.delete(); + if (response.deletable) await response.delete(); if (cancel.includes(content)) return this._awaitResponse(); return this._loadPage(parseInt(content)); } catch (c) { if (prompt.deletable) await prompt.delete(); if (c instanceof Error) { - if (this.listenerCount('error')) this.emit('error', c); + this._emit('error', c); return; } - if (this.listenerCount('expire')) this.emit('expire'); + this._emit('expire'); } } + protected _emit (event: string, ...args: any[]) { + if (!this.listenerCount(event)) return; + + return this.emit(event, ...args, this); + } + /** * Emitted after the initial embed has been sent * (technically, after the client finished reacting with enabled navigation and function emojis). * @event */ - public on (event: 'start', listener: () => void): this; + public on (event: 'start', listener: (instance: this) => void): this; /** * Emitted when the instance is finished by a user reacting with `delete` navigation emoji * or a function emoji that throws non-Error type. * @event */ - public on (event: 'finish', listener: ListenerUser): this; + public on (event: 'finish', listener: ListenerUser): this; /** * Emitted after the page number is updated and before the client sends the embed. * @event */ - public on (event: 'pageUpdate', listener: () => void): this; + public on (event: 'pageUpdate', listener: (instance: this) => void): this; /** * Emitted upon a user reacting on the instance. * @event */ - public on (event: 'react', listener: ListenerReact): this; + public on (event: 'react', listener: ListenerReact): this; /** * Emitted when the awaiting timeout is reached. * @event */ - public on (event: 'expire', listener: () => void): this; + public on (event: 'expire', listener: (instance: this) => void): this; /** * Emitted upon an occurance of error. * @event */ // @ts-ignore - public on (event: 'error', listener: ListenerError): this; + public on (event: 'error', listener: ListenerError): this; /** @event */ - public once (event: 'finish', listener: ListenerUser): this; + public once (event: 'finish', listener: ListenerUser): this; /** @event */ - public once (event: 'start' | 'expire' | 'pageUpdate', listener: () => void): this; + public once (event: 'start' | 'expire' | 'pageUpdate', listener: (instance: this) => void): this; /** @event */ - public once (event: 'react', listener: ListenerReact): this; + public once (event: 'react', listener: ListenerReact): this; /** @event */ // @ts-ignore - public once (event: 'error', listener: ListenerError): this; + public once (event: 'error', listener: ListenerError): this; } -/** @param user The user who responded to the instance. */ -export type ListenerUser = (user: User) => void; +/** + * @param user The user who responded to the instance. + * @param instance The current instance of PaginationEmbed. + **/ +export type ListenerUser = (user: User, instance: PaginationEmbed) => void; /** * @param user The user who responded to the instance. * @param emoji The emoji that was reacted to the instance. + * @param instance The current instance of PaginationEmbed. */ -export type ListenerReact = (user: User, emoji: Emoji) => void; +export type ListenerReact = (user: User, emoji: Emoji, instance: PaginationEmbed) => void; -/** @param err The error object. */ -export type ListenerError = (err: Error) => void; +/** + * @param err The error object. + * @param instance The current instance of PaginationEmbed. + * */ +export type ListenerError = (err: Error, instance: PaginationEmbed) => void; /** Options for [[PaginationEmbed.disabledNavigationEmojis]]. */ export type DisabledNavigationEmojis = NavigationEmojiIdentifier[]; @@ -807,7 +820,7 @@ export type NavigationEmojiIdentifier = 'back' | 'jump' | 'forward' | 'delete' | * ``` */ export interface FunctionEmoji { - [emojiNameOrID: string]: (user: User, instance: Embeds | FieldsEmbed) => any; + [emojiNameOrId: string]: (user: User, instance: Embeds | FieldsEmbed) => any; } /** diff --git a/test/bot.js b/test/bot.js index 1dff1bc..c12f94a 100644 --- a/test/bot.js +++ b/test/bot.js @@ -49,7 +49,7 @@ bot for (let i = 1; i <= 3; ++i) embeds.push({ - fields: [ { name: 'Page', value: i, inline: false } ], + fields: [ { name: 'Page', value: String(i), inline: false } ], image: { url: 'attachment://1.jpg' } }); @@ -72,11 +72,11 @@ bot .setFunctionEmojis({ '⬆': (_, instance) => { for (const embed of instance.array) - embed.fields[0].value++; + embed.fields[0].value = String(Number(embed.fields[0].value) + 1); }, '⬇': (_, instance) => { for (const embed of instance.array) - embed.fields[0].value--; + embed.fields[0].value = String(Number(embed.fields[0].value) - 1); }, '⏹': () => Promise.reject('stopped'), '🔕': () => Promise.reject(new Error('Worst Error Ever')) diff --git a/typings/Embeds.d.ts b/typings/Embeds.d.ts index 00c899a..7a8f231 100644 --- a/typings/Embeds.d.ts +++ b/typings/Embeds.d.ts @@ -149,7 +149,7 @@ export declare class Embeds extends PaginationEmbed { * @param value - The value of the field. * @param inline - Set the field to display inline. */ - spliceFields(index: number, deleteCount: number, name?: string, value?: string, inline?: boolean): this; + spliceFields(index: number, deleteCount: number, ...fields: EmbedFieldData[] | EmbedFieldData[][]): this; /** Transforms all embeds to plain objects. */ toJSON(): unknown[]; /** @ignore */ diff --git a/typings/base/index.d.ts b/typings/base/index.d.ts index ee11c27..3095b28 100644 --- a/typings/base/index.d.ts +++ b/typings/base/index.d.ts @@ -241,56 +241,64 @@ export declare abstract class PaginationEmbed extends EventEmitter { * @param user - The user who reacted to jump on a certain page. */ protected _awaitResponseEx(user: User): Promise; + protected _emit(event: string, ...args: any[]): boolean; /** * Emitted after the initial embed has been sent * (technically, after the client finished reacting with enabled navigation and function emojis). * @event */ - on(event: 'start', listener: () => void): this; + on(event: 'start', listener: (instance: this) => void): this; /** * Emitted when the instance is finished by a user reacting with `delete` navigation emoji * or a function emoji that throws non-Error type. * @event */ - on(event: 'finish', listener: ListenerUser): this; + on(event: 'finish', listener: ListenerUser): this; /** * Emitted after the page number is updated and before the client sends the embed. * @event */ - on(event: 'pageUpdate', listener: () => void): this; + on(event: 'pageUpdate', listener: (instance: this) => void): this; /** * Emitted upon a user reacting on the instance. * @event */ - on(event: 'react', listener: ListenerReact): this; + on(event: 'react', listener: ListenerReact): this; /** * Emitted when the awaiting timeout is reached. * @event */ - on(event: 'expire', listener: () => void): this; + on(event: 'expire', listener: (instance: this) => void): this; /** * Emitted upon an occurance of error. * @event */ - on(event: 'error', listener: ListenerError): this; + on(event: 'error', listener: ListenerError): this; /** @event */ - once(event: 'finish', listener: ListenerUser): this; + once(event: 'finish', listener: ListenerUser): this; /** @event */ - once(event: 'start' | 'expire' | 'pageUpdate', listener: () => void): this; + once(event: 'start' | 'expire' | 'pageUpdate', listener: (instance: this) => void): this; /** @event */ - once(event: 'react', listener: ListenerReact): this; + once(event: 'react', listener: ListenerReact): this; /** @event */ - once(event: 'error', listener: ListenerError): this; + once(event: 'error', listener: ListenerError): this; } -/** @param user The user who responded to the instance. */ -export declare type ListenerUser = (user: User) => void; +/** + * @param user The user who responded to the instance. + * @param instance The current instance of PaginationEmbed. + **/ +export declare type ListenerUser = (user: User, instance: PaginationEmbed) => void; /** * @param user The user who responded to the instance. * @param emoji The emoji that was reacted to the instance. + * @param instance The current instance of PaginationEmbed. */ -export declare type ListenerReact = (user: User, emoji: Emoji) => void; -/** @param err The error object. */ -export declare type ListenerError = (err: Error) => void; +export declare type ListenerReact = (user: User, emoji: Emoji, instance: PaginationEmbed) => void; +/** + * @param err The error object. + * @param instance The current instance of PaginationEmbed. + * */ +export declare type ListenerError = (err: Error, instance: PaginationEmbed) => void; /** Options for [[PaginationEmbed.disabledNavigationEmojis]]. */ export declare type DisabledNavigationEmojis = NavigationEmojiIdentifier[]; /** An object containing emojis to use as navigation emojis. */ @@ -343,7 +351,7 @@ export declare type NavigationEmojiIdentifier = 'back' | 'jump' | 'forward' | 'd * ``` */ export interface FunctionEmoji { - [emojiNameOrID: string]: (user: User, instance: Embeds | FieldsEmbed) => any; + [emojiNameOrId: string]: (user: User, instance: Embeds | FieldsEmbed) => any; } /** * Function to pass to the instance for page indicator formatting.