From 3dc20cbe476851c0fa66ee3d99cae8f9f04959cb Mon Sep 17 00:00:00 2001 From: 0xJordan Date: Tue, 29 Nov 2022 23:57:49 +0100 Subject: [PATCH 1/2] Working version for discord.js 14 I've updated all to make a working version for discord.js 14 --- package.json | 14 +- src/create.ts | 8 +- src/index.ts | 12 +- src/load.ts | 10 +- src/types/BackupData.ts | 8 +- src/types/BaseChannelData.ts | 4 +- src/types/MessageData.ts | 7 +- src/types/ThreadChannelData.ts | 4 +- src/types/index.ts | 2 - src/util.ts | 70 +++---- yarn.lock | 322 ++++++++++++++++++++++----------- 11 files changed, 281 insertions(+), 180 deletions(-) diff --git a/package.json b/package.json index 0b5f2835..71514d61 100644 --- a/package.json +++ b/package.json @@ -31,15 +31,15 @@ }, "homepage": "https://github.com/Androz2091/discord-backup#readme", "dependencies": { - "discord.js": "^14.2.0" + "discord.js": "^14.7.0" }, "devDependencies": { - "@types/node": "^17.0.30", - "@types/node-fetch": "^2.5.7", - "@types/ws": "^7.2.4", - "prettier": "^2.0.4", - "tslint": "^6.1.1", + "@types/node": "^18.11.9", + "@types/node-fetch": "^2.6.2", + "@types/ws": "^8.5.3", + "prettier": "^2.8.0", + "tslint": "^6.1.3", "tslint-config-prettier": "^1.18.0", - "typescript": "^4.6.4" + "typescript": "^4.9.3" } } diff --git a/src/create.ts b/src/create.ts index fc1a9a77..40a8ff35 100644 --- a/src/create.ts +++ b/src/create.ts @@ -8,7 +8,7 @@ import type { TextChannelData, VoiceChannelData } from './types'; -import type { CategoryChannel, ChannelType, Collection, Guild, GuildChannel, Snowflake, TextChannel, ThreadChannel, VoiceChannel } from 'discord.js'; +import { CategoryChannel, ChannelType, Collection, Guild, GuildChannel, Snowflake, TextChannel, ThreadChannel, VoiceChannel } from 'discord.js'; import nodeFetch from 'node-fetch'; import { fetchChannelPermissions, fetchTextChannelData, fetchVoiceChannelData } from './util'; import { MemberData } from './types/MemberData'; @@ -122,7 +122,7 @@ export async function getChannels(guild: Guild, options: CreateOptions) { children: [] // The children channels of the category }; // Gets the children channels of the category and sort them by position - const children = category.children.sort((a, b) => a.position - b.position).toJSON(); + const children = category.children.cache.sort((a, b) => a.position - b.position).toJSON(); for (const child of children) { // For each child channel if (child.type === ChannelType.GuildText || child.type === ChannelType.GuildNews) { @@ -140,13 +140,13 @@ export async function getChannels(guild: Guild, options: CreateOptions) { .filter((ch) => { return !ch.parent && ch.type !== ChannelType.GuildCategory //&& ch.type !== 'GUILD_STORE' // there is no way to restore store channels, ignore them - && ch.type !== ChannelType.GuildNewsThread && ch.type !== ChannelType.GuildPrivateThread && ch.type !== ChannelType.GuildPublicThread // threads will be saved with fetchTextChannelData + && ch.type !== ChannelType.AnnouncementThread && ch.type !== ChannelType.PrivateThread && ch.type !== ChannelType.PublicThread // threads will be saved with fetchTextChannelData }) as Collection>) .sort((a, b) => a.position - b.position) .toJSON(); for (const channel of others) { // For each channel - if (channel.type === ChnanelType.GuildText || channel.type === ChannelType.GuildNews) { + if (channel.type === ChannelType.GuildText || channel.type === ChannelType.GuildAnnouncement) { const channelData: TextChannelData = await fetchTextChannelData(channel as TextChannel, options); // Gets the channel data channels.others.push(channelData); // Update channels object } else { diff --git a/src/index.ts b/src/index.ts index 3d838109..46ee29d1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -76,8 +76,8 @@ export const create = async ( ) => { return new Promise(async (resolve, reject) => { - const intents = new IntentsBitField(guild.client.options.intents); - if (!intents.has(IntentsBitField.Flags.Guilds)) return reject('Guilds intent is required'); + const intents = guild.client.options.intents; + if (!intents.has(IntentsBitField.Flags.Guilds)) return reject('Guilds intent is required'); try { const backupData: BackupData = { @@ -97,15 +97,15 @@ export const create = async ( members: [], createdTimestamp: Date.now(), guildID: guild.id, - id: options.backupID ?? SnowflakeUtil.generate(Date.now()) + id: options.backupID ?? SnowflakeUtil.generate({ timestamp: Date.now() }).toString() }; - if (guild.iconURL()) { + if (guild.iconURL({})) { if (options && options.saveImages && options.saveImages === 'base64') { backupData.iconBase64 = ( - await nodeFetch(guild.iconURL({ dynamic: true })).then((res) => res.buffer()) + await nodeFetch(guild.iconURL({})).then((res) => res.buffer()) ).toString('base64'); } - backupData.iconURL = guild.iconURL({ dynamic: true }); + backupData.iconURL = guild.iconURL({}); } if (guild.splashURL()) { if (options && options.saveImages && options.saveImages === 'base64') { diff --git a/src/load.ts b/src/load.ts index 0dc4ac9a..a8c0b669 100644 --- a/src/load.ts +++ b/src/load.ts @@ -1,5 +1,5 @@ import type { BackupData, LoadOptions } from './types'; -import type { ChannelType, Emoji, Guild, GuildFeature, GuildChannel, Role, VoiceChannel } from 'discord.js'; +import { ChannelType, Emoji, Guild, GuildFeature, Role, VoiceChannel, NewsChannel, ForumChannel, TextChannel, Snowflake, StageChannel, GuildBasedChannel } from 'discord.js'; import { loadCategory, loadChannel } from './util'; /** @@ -97,7 +97,7 @@ export const loadChannels = (guild: Guild, backupData: BackupData, options: Load export const loadAFK = (guild: Guild, backupData: BackupData): Promise => { const afkPromises: Promise[] = []; if (backupData.afk) { - afkPromises.push(guild.setAFKChannel(guild.channels.cache.find((ch) => ch.name === backupData.afk.name && ch.type === ChannelType.GuildVoice) as VoiceChannel)); + afkPromises.push(guild.setAFKChannel(guild.channels.cache.find((ch: GuildBasedChannel) => ch.name === backupData.afk.name && ch.type === ChannelType.GuildVoice) as VoiceChannel)); afkPromises.push(guild.setAFKTimeout(backupData.afk.timeout)); } return Promise.all(afkPromises); @@ -110,9 +110,9 @@ export const loadEmojis = (guild: Guild, backupData: BackupData): Promise[] = []; backupData.emojis.forEach((emoji) => { if (emoji.url) { - emojiPromises.push(guild.emojis.create(emoji.url, emoji.name)); + emojiPromises.push(guild.emojis.create({ name: emoji.name, attachment: emoji.url })); } else if (emoji.base64) { - emojiPromises.push(guild.emojis.create(Buffer.from(emoji.base64, 'base64'), emoji.name)); + emojiPromises.push(guild.emojis.create({ name: emoji.name, attachment: Buffer.from(emoji.base64, 'base64') })); } }); return Promise.all(emojiPromises); @@ -142,7 +142,7 @@ export const loadEmbedChannel = (guild: Guild, backupData: BackupData): Promise< embedChannelPromises.push( guild.setWidgetSettings({ enabled: backupData.widget.enabled, - channel: guild.channels.cache.find((ch) => ch.name === backupData.widget.channel) + channel: guild.channels.cache.find((ch) => ch.name === backupData.widget.channel) }) ); } diff --git a/src/types/BackupData.ts b/src/types/BackupData.ts index 635e9adc..aabf271f 100644 --- a/src/types/BackupData.ts +++ b/src/types/BackupData.ts @@ -1,4 +1,4 @@ -import { DefaultMessageNotificationLevel, ExplicitContentFilterLevel, Snowflake, VerificationLevel } from 'discord.js'; +import { GuildDefaultMessageNotifications, GuildExplicitContentFilter, Snowflake, GuildVerificationLevel } from 'discord.js'; import { AfkData, BanData, ChannelsData, EmojiData, RoleData, WidgetData } from './'; import { MemberData } from './MemberData'; @@ -6,9 +6,9 @@ export interface BackupData { name: string; iconURL?: string; iconBase64?: string; - verificationLevel: VerificationLevel; - explicitContentFilter: ExplicitContentFilterLevel; - defaultMessageNotifications: DefaultMessageNotificationLevel | number; + verificationLevel: GuildVerificationLevel; + explicitContentFilter: GuildExplicitContentFilter; + defaultMessageNotifications: GuildDefaultMessageNotifications | number; afk?: AfkData; widget: WidgetData; splashURL?: string; diff --git a/src/types/BaseChannelData.ts b/src/types/BaseChannelData.ts index 1d4779ed..06e844e1 100644 --- a/src/types/BaseChannelData.ts +++ b/src/types/BaseChannelData.ts @@ -1,8 +1,8 @@ -import { TextBasedChannelTypes, VoiceBasedChannelTypes, ThreadChannelTypes } from 'discord.js'; +import { TextBasedChannelTypes, VoiceBasedChannelTypes, ThreadChannelType } from 'discord.js'; import { ChannelPermissionsData } from './'; export interface BaseChannelData { - type: TextBasedChannelTypes | VoiceBasedChannelTypes | ThreadChannelTypes; + type: TextBasedChannelTypes | VoiceBasedChannelTypes | ThreadChannelType; name: string; parent?: string; permissions: ChannelPermissionsData[]; diff --git a/src/types/MessageData.ts b/src/types/MessageData.ts index 475be887..aa9ba2b3 100644 --- a/src/types/MessageData.ts +++ b/src/types/MessageData.ts @@ -1,11 +1,10 @@ -import { MessageEmbed, FileOptions } from 'discord.js'; - +import { Embed, RawFile } from 'discord.js'; export interface MessageData { username: string; avatar?: string; content?: string; - embeds?: MessageEmbed[]; - files?: FileOptions[]; + embeds?: Embed[]; + files?: RawFile[]; pinned?: boolean; sentAt: string; } diff --git a/src/types/ThreadChannelData.ts b/src/types/ThreadChannelData.ts index e23163cb..a2c23e39 100644 --- a/src/types/ThreadChannelData.ts +++ b/src/types/ThreadChannelData.ts @@ -1,8 +1,8 @@ -import { Snowflake, ThreadAutoArchiveDuration, ThreadChannelTypes } from "discord.js"; +import { ThreadAutoArchiveDuration, ThreadChannelType } from "discord.js"; import { MessageData } from "./MessageData"; export interface ThreadChannelData { - type: ThreadChannelTypes; + type: ThreadChannelType; name: string; archived: boolean; autoArchiveDuration: ThreadAutoArchiveDuration; diff --git a/src/types/index.ts b/src/types/index.ts index d9a12da5..5b1d2447 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,5 +1,3 @@ -import type { GuildFeatures } from 'discord.js'; - export * from './AfkData'; export * from './BackupData'; export * from './BackupInfos'; diff --git a/src/util.ts b/src/util.ts index f1651f1c..502f88e9 100644 --- a/src/util.ts +++ b/src/util.ts @@ -8,14 +8,13 @@ import type { ThreadChannelData, VoiceChannelData } from './types'; -import type { +import { CategoryChannel, - ChannelLogsQueryOptions, - ChannelType, + ChannelType, Collection, Guild, GuildFeature, - GuildDefaultMessageNotifications, + GuildDefaultMessageNotifications, GuildSystemChannelFlags, GuildChannelCreateOptions, Message, @@ -24,18 +23,21 @@ import type { TextChannel, VoiceChannel, NewsChannel, - PremiumTier, ThreadChannel, - GuildFeatures, - Webhook + Webhook, + GuildPremiumTier, + GuildExplicitContentFilter, + GuildVerificationLevel, + OverwriteType, + AttachmentBuilder } from 'discord.js'; import nodeFetch from 'node-fetch'; -const MaxBitratePerTier: Record = { - None: 64000, - Tier1: 128000, - Tier2: 256000, - Tier3: 384000 +const MaxBitratePerTier: Record = { + [GuildPremiumTier.None]: 64000, + [GuildPremiumTier.Tier1]: 128000, + [GuildPremiumTier.Tier2]: 256000, + [GuildPremiumTier.Tier3]: 384000 }; /** @@ -44,7 +46,7 @@ const MaxBitratePerTier: Record = { export function fetchChannelPermissions(channel: TextChannel | VoiceChannel | CategoryChannel | NewsChannel) { const permissions: ChannelPermissionsData[] = []; channel.permissionOverwrites.cache - .filter((p) => p.type === 'role') + .filter((p) => p.type === OverwriteType.Role) .forEach((perm) => { // For each overwrites permission const role = channel.guild.roles.cache.get(perm.id); @@ -77,10 +79,10 @@ export async function fetchVoiceChannelData(channel: VoiceChannel) { }); } -export async function fetchChannelMessages (channel: TextChannel | NewsChannel | ThreadChannel, options: CreateOptions): Promise { +export async function fetchChannelMessages(channel: TextChannel | NewsChannel | ThreadChannel, options: CreateOptions): Promise { let messages: MessageData[] = []; const messageCount: number = isNaN(options.maxMessagesPerChannel) ? 10 : options.maxMessagesPerChannel; - const fetchOptions: ChannelLogsQueryOptions = { limit: 100 }; + const fetchOptions: { limit?: number, before?: Snowflake, after?: Snowflake, around?: Snowflake } = { limit: 100 }; let lastMessageId: Snowflake; let fetchComplete: boolean = false; while (!fetchComplete) { @@ -106,7 +108,7 @@ export async function fetchChannelMessages (channel: TextChannel | NewsChannel | } return { name: a.name, - attachment: attach + data: attach }; })) messages.push({ @@ -114,7 +116,7 @@ export async function fetchChannelMessages (channel: TextChannel | NewsChannel | avatar: msg.author.displayAvatarURL(), content: msg.cleanContent, embeds: msg.embeds, - files, + files: files, pinned: msg.pinned, sentAt: msg.createdAt.toISOString(), }); @@ -122,7 +124,7 @@ export async function fetchChannelMessages (channel: TextChannel | NewsChannel | } return messages; -} +} /** * Fetches the text channel data that is necessary for the backup @@ -165,7 +167,6 @@ export async function fetchTextChannelData(channel: TextChannel | NewsChannel, o /* Fetch channel messages */ try { channelData.messages = await fetchChannelMessages(channel, options); - /* Return channel data */ resolve(channelData); } catch { @@ -179,9 +180,7 @@ export async function fetchTextChannelData(channel: TextChannel | NewsChannel, o */ export async function loadCategory(categoryData: CategoryData, guild: Guild) { return new Promise((resolve) => { - guild.channels.create(categoryData.name, { - type: ChannelType.GuildCategory - }).then(async (category) => { + guild.channels.create({ name: categoryData.name, type: ChannelType.GuildCategory }).then(async (category) => { // When the category is created const finalPermissions: OverwriteData[] = []; categoryData.permissions.forEach((perm) => { @@ -211,25 +210,26 @@ export async function loadChannel( ) { return new Promise(async (resolve) => { - const loadMessages = (channel: TextChannel | ThreadChannel, messages: MessageData[], previousWebhook?: Webhook): Promise => { + const loadMessages = (channel: TextChannel | ThreadChannel, messages: MessageData[], previousWebhook?: Webhook): Promise => { return new Promise(async (resolve) => { const webhook = previousWebhook || await (channel as TextChannel).createWebhook({ name: 'MessagesBackup', avatar: channel.client.user.displayAvatarURL() - }).catch(() => {}); + }).catch(() => { }); if (!webhook) return resolve(); messages = messages .filter((m) => m.content.length > 0 || m.embeds.length > 0 || m.files.length > 0) .reverse(); messages = messages.slice(messages.length - options.maxMessagesPerChannel); for (const msg of messages) { + const files = msg.files.map(file => new AttachmentBuilder(file.data, { name: file.name })); const sentMsg = await webhook .send({ content: msg.content.length ? msg.content : undefined, username: msg.username, avatarURL: msg.avatar, embeds: msg.embeds, - files: msg.files, + files: files, allowedMentions: options.allowedMentions, threadId: channel.isThread() ? channel.id : undefined }) @@ -258,7 +258,7 @@ export async function loadChannel( let bitrate = (channelData as VoiceChannelData).bitrate; const bitrates = Object.values(MaxBitratePerTier); while (bitrate > MaxBitratePerTier[guild.premiumTier]) { - bitrate = bitrates[Object.keys(MaxBitratePerTier).indexOf(guild.premiumTier) - 1]; + bitrate = bitrates[Object.keys(MaxBitratePerTier).indexOf(guild.premiumTier.toString()) - 1]; } createOptions.bitrate = bitrate; createOptions.userLimit = (channelData as VoiceChannelData).userLimit; @@ -280,9 +280,9 @@ export async function loadChannel( await channel.permissionOverwrites.set(finalPermissions); if (channelData.type === ChannelType.GuildText) { /* Load messages */ - let webhook: Webhook|void; + let webhook: Webhook | void; if ((channelData as TextChannelData).messages.length > 0) { - webhook = await loadMessages(channel as TextChannel, (channelData as TextChannelData).messages).catch(() => {}); + webhook = await loadMessages(channel as TextChannel, (channelData as TextChannelData).messages).catch(() => { }); } /* Load threads */ if ((channelData as TextChannelData).threads.length > 0) { //&& guild.features.includes('THREADS_ENABLED')) { @@ -314,27 +314,27 @@ export async function clearGuild(guild: Guild) { guild.roles.cache .filter((role) => !role.managed && role.editable && role.id !== guild.id) .forEach((role) => { - role.delete().catch(() => {}); + role.delete().catch(() => { }); }); guild.channels.cache.forEach((channel) => { - channel.delete().catch(() => {}); + channel.delete().catch(() => { }); }); guild.emojis.cache.forEach((emoji) => { - emoji.delete().catch(() => {}); + emoji.delete().catch(() => { }); }); const webhooks = await guild.fetchWebhooks(); webhooks.forEach((webhook) => { - webhook.delete().catch(() => {}); + webhook.delete().catch(() => { }); }); const bans = await guild.bans.fetch(); bans.forEach((ban) => { - guild.members.unban(ban.user).catch(() => {}); + guild.members.unban(ban.user).catch(() => { }); }); guild.setAFKChannel(null); guild.setAFKTimeout(60 * 5); guild.setIcon(null); - guild.setBanner(null).catch(() => {}); - guild.setSplash(null).catch(() => {}); + guild.setBanner(null).catch(() => { }); + guild.setSplash(null).catch(() => { }); guild.setDefaultMessageNotifications(GuildDefaultMessageNotifications.OnlyMentions); guild.setWidgetSettings({ enabled: false, diff --git a/yarn.lock b/yarn.lock index d4d9ba28..440bb17d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,44 +23,69 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@discordjs/builders@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-0.11.0.tgz#4102abe3e0cd093501f3f71931df43eb92f5b0cc" - integrity sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg== - dependencies: - "@sindresorhus/is" "^4.2.0" - discord-api-types "^0.26.0" - ts-mixer "^6.0.0" - tslib "^2.3.1" - zod "^3.11.6" - -"@discordjs/collection@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.4.0.tgz#b6488286a1cc7b41b644d7e6086f25a1c1e6f837" - integrity sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw== - -"@sapphire/async-queue@^1.1.9": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.3.1.tgz#9d861e626dbffae02d808e13f823d4510e450a78" - integrity sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g== - -"@sindresorhus/is@^4.2.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== - -"@types/node-fetch@^2.5.12": - version "2.6.1" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975" - integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA== +"@discordjs/builders@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.4.0.tgz#b951b5e6ce4e459cd06174ce50dbd51c254c1d47" + integrity sha512-nEeTCheTTDw5kO93faM1j8ZJPonAX86qpq/QVoznnSa8WWcCgJpjlu6GylfINTDW6o7zZY0my2SYdxx2mfNwGA== dependencies: - "@types/node" "*" - form-data "^3.0.0" - -"@types/node-fetch@^2.5.7": - version "2.5.8" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.8.tgz#e199c835d234c7eb0846f6618012e558544ee2fb" - integrity sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw== + "@discordjs/util" "^0.1.0" + "@sapphire/shapeshift" "^3.7.1" + discord-api-types "^0.37.20" + fast-deep-equal "^3.1.3" + ts-mixer "^6.0.2" + tslib "^2.4.1" + +"@discordjs/collection@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-1.3.0.tgz#65bf9674db72f38c25212be562bb28fa0dba6aa3" + integrity sha512-ylt2NyZ77bJbRij4h9u/wVy7qYw/aDqQLWnadjvDqW/WoWCxrsX6M3CIw9GVP5xcGCDxsrKj5e0r5evuFYwrKg== + +"@discordjs/rest@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-1.4.0.tgz#ceaff2a63680c5a0d8c43b85c8a2b023413d4080" + integrity sha512-k3Ip7ffFSAfp7Mu4H/3BEXFvFz+JsbXRrRtpeBMnSp1LefhtlZWJE6xdXzNlblktKNQltnRwY+z0NZrGQdxAMw== + dependencies: + "@discordjs/collection" "^1.3.0" + "@discordjs/util" "^0.1.0" + "@sapphire/async-queue" "^1.5.0" + "@sapphire/snowflake" "^3.2.2" + discord-api-types "^0.37.20" + file-type "^18.0.0" + tslib "^2.4.1" + undici "^5.13.0" + +"@discordjs/util@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-0.1.0.tgz#e42ca1bf407bc6d9adf252877d1b206e32ba369a" + integrity sha512-e7d+PaTLVQav6rOc2tojh2y6FE8S7REkqLldq1XF4soCx74XB/DIjbVbVLtBemf0nLW77ntz0v+o5DytKwFNLQ== + +"@sapphire/async-queue@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.0.tgz#2f255a3f186635c4fb5a2381e375d3dfbc5312d8" + integrity sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA== + +"@sapphire/shapeshift@^3.7.1": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-3.7.1.tgz#11f6b7bedc5bc980a1de57bd98ea2566d679d39f" + integrity sha512-JmYN/0GW49Vl8Hi4PwrsDBNjcuCylH78vWYolVys74LRIzilAAMINxx4RHQOdvYoz+ceJKVp4+zBbQ5kuIFOLw== + dependencies: + fast-deep-equal "^3.1.3" + lodash.uniqwith "^4.5.0" + +"@sapphire/snowflake@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.2.2.tgz#faacdc1b5f7c43145a71eddba917de2b707ef780" + integrity sha512-ula2O0kpSZtX9rKXNeQMrHwNd7E4jPDJYUXmEGTFdMRfyfMw+FPyh04oKMjAiDuOi64bYgVkOV3MjK+loImFhQ== + +"@tokenizer/token@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" + integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== + +"@types/node-fetch@^2.6.2": + version "2.6.2" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" + integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== dependencies: "@types/node" "*" form-data "^3.0.0" @@ -70,19 +95,12 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.21.tgz#d934aacc22424fe9622ebf6857370c052eae464e" integrity sha512-cHYfKsnwllYhjOzuC5q1VpguABBeecUp24yFluHpn/BQaVxB1CuQ1FSRZCzrPxrkIfWISXV2LbeoBthLWg0+0A== -"@types/node@^17.0.30": - version "17.0.30" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.30.tgz#2c6e8512acac70815e8176aa30c38025067880ef" - integrity sha512-oNBIZjIqyHYP8VCNAV9uEytXVeXG2oR0w9lgAXro20eugRQfY002qr3CUl6BAe+Yf/z3CRjPdz27Pu6WWtuSRw== - -"@types/ws@^7.2.4": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.0.tgz#499690ea08736e05a8186113dac37769ab251a0e" - integrity sha512-Y29uQ3Uy+58bZrFLhX36hcI3Np37nqWE7ky5tjiDoy1GDZnIwVxS0CgF+s+1bXMzjKBFy+fqaRfb708iNzdinw== - dependencies: - "@types/node" "*" +"@types/node@^18.11.9": + version "18.11.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" + integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== -"@types/ws@^8.2.2": +"@types/ws@^8.5.3": version "8.5.3" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== @@ -126,6 +144,13 @@ builtin-modules@^1.1.1: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + chalk@^2.0.0, chalk@^2.3.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -174,25 +199,28 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -discord-api-types@^0.26.0: - version "0.26.1" - resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.26.1.tgz#726f766ddc37d60da95740991d22cb6ef2ed787b" - integrity sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ== - -discord.js@^13.6.0: - version "13.6.0" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.6.0.tgz#d8a8a591dbf25cbcf9c783d5ddf22c4694860475" - integrity sha512-tXNR8zgsEPxPBvGk3AQjJ9ljIIC6/LOPjzKwpwz8Y1Q2X66Vi3ZqFgRHYwnHKC0jC0F+l4LzxlhmOJsBZDNg9g== - dependencies: - "@discordjs/builders" "^0.11.0" - "@discordjs/collection" "^0.4.0" - "@sapphire/async-queue" "^1.1.9" - "@types/node-fetch" "^2.5.12" - "@types/ws" "^8.2.2" - discord-api-types "^0.26.0" - form-data "^4.0.0" - node-fetch "^2.6.1" - ws "^8.4.0" +discord-api-types@^0.37.20: + version "0.37.20" + resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.20.tgz#f23894e3e6b894abb5431ff6c4aa52471360377c" + integrity sha512-uAO+55E11rMkYR36/paE1vKN8c2bZa1mgrIaiQIBgIZRKZTDIGOZB+8I5eMRPFJcGxrg16riUu+0aTu2JQEPew== + +discord.js@^14.7.0: + version "14.7.0" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.7.0.tgz#1411ad6703d8e5ca58f8295e5acd2994b890cc51" + integrity sha512-CR2JAoqR+82D7mfMZ7toPAqdIk2sMF8wgTc8yDGPPMHzJknIKtkEPtzWFhBYGMZUkK+M4POw08ngBWqK2A4RMg== + dependencies: + "@discordjs/builders" "^1.4.0" + "@discordjs/collection" "^1.3.0" + "@discordjs/rest" "^1.4.0" + "@discordjs/util" "^0.1.0" + "@sapphire/snowflake" "^3.2.2" + "@types/ws" "^8.5.3" + discord-api-types "^0.37.20" + fast-deep-equal "^3.1.3" + lodash.snakecase "^4.1.1" + tslib "^2.4.1" + undici "^5.13.0" + ws "^8.11.0" escape-string-regexp@^1.0.5: version "1.0.5" @@ -204,6 +232,20 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +file-type@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-18.0.0.tgz#7a39378f8657ddc02807a0c62cb77cb4dc318197" + integrity sha512-jjMwFpnW8PKofLE/4ohlhqwDk5k0NC6iy0UHAJFKoY1fQeGMN0GDdLgHQrvCbSpMwbqzoCZhRI5dETCZna5qVA== + dependencies: + readable-web-to-node-stream "^3.0.2" + strtok3 "^7.0.0" + token-types "^5.0.1" + form-data@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" @@ -213,15 +255,6 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -244,6 +277,11 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -252,7 +290,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -270,6 +308,16 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== + +lodash.uniqwith@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz#7a0cbf65f43b5928625a9d4d0dc54b18cadc7ef3" + integrity sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q== + mime-db@1.44.0: version "1.44.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" @@ -301,11 +349,6 @@ mkdirp@^0.5.3: dependencies: minimist "^1.2.5" -node-fetch@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== - once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -323,10 +366,31 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== -prettier@^2.0.4: - version "2.2.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" - integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== +peek-readable@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-5.0.0.tgz#7ead2aff25dc40458c60347ea76cfdfd63efdfec" + integrity sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A== + +prettier@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" + integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== + +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-web-to-node-stream@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb" + integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== + dependencies: + readable-stream "^3.6.0" resolve@^1.3.2: version "1.17.0" @@ -335,6 +399,11 @@ resolve@^1.3.2: dependencies: path-parse "^1.0.6" +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + semver@^5.3.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -345,6 +414,26 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strtok3@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-7.0.0.tgz#868c428b4ade64a8fd8fee7364256001c1a4cbe5" + integrity sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ== + dependencies: + "@tokenizer/token" "^0.3.0" + peek-readable "^5.0.0" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -352,27 +441,35 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -ts-mixer@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.0.tgz#4e631d3a36e3fa9521b973b132e8353bc7267f9f" - integrity sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ== +token-types@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/token-types/-/token-types-5.0.1.tgz#aa9d9e6b23c420a675e55413b180635b86a093b4" + integrity sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg== + dependencies: + "@tokenizer/token" "^0.3.0" + ieee754 "^1.2.1" + +ts-mixer@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.2.tgz#3e4e4bb8daffb24435f6980b15204cb5b287e016" + integrity sha512-zvHx3VM83m2WYCE8XL99uaM7mFwYSkjR2OZti98fabHrwkjsCvgwChda5xctein3xGOyaQhtTeDq/1H/GNvF3A== tslib@^1.13.0, tslib@^1.8.1: version "1.13.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== -tslib@^2.3.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== tslint-config-prettier@^1.18.0: version "1.18.0" resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" integrity sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg== -tslint@^6.1.1: +tslint@^6.1.3: version "6.1.3" resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== @@ -398,22 +495,29 @@ tsutils@^2.29.0: dependencies: tslib "^1.8.1" -typescript@^4.6.4: - version "4.6.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" - integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== +typescript@^4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" + integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== + +undici@^5.13.0: + version "5.13.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.13.0.tgz#56772fba89d8b25e39bddc8c26a438bd73ea69bb" + integrity sha512-UDZKtwb2k7KRsK4SdXWG7ErXiL7yTGgLWvk2AXO1JMjgjh404nFo6tWSCM2xMpJwMPx3J8i/vfqEh1zOqvj82Q== + dependencies: + busboy "^1.6.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -ws@^8.4.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== - -zod@^3.11.6: - version "3.14.4" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.14.4.tgz#e678fe9e5469f4663165a5c35c8f3dc66334a5d6" - integrity sha512-U9BFLb2GO34Sfo9IUYp0w3wJLlmcyGoMd75qU9yf+DrdGA4kEx6e+l9KOkAlyUO0PSQzZCa3TR4qVlcmwqSDuw== +ws@^8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== From f332e6f5159d66df701979d713b4ed20cd5203ed Mon Sep 17 00:00:00 2001 From: 0xJordan Date: Wed, 30 Nov 2022 00:44:34 +0100 Subject: [PATCH 2/2] Fix not sending message with attachment in right order --- src/util.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/util.ts b/src/util.ts index 502f88e9..64ee583f 100644 --- a/src/util.ts +++ b/src/util.ts @@ -219,6 +219,7 @@ export async function loadChannel( if (!webhook) return resolve(); messages = messages .filter((m) => m.content.length > 0 || m.embeds.length > 0 || m.files.length > 0) + .sort((a, b) => { return new Date(a.sentAt) < new Date(b.sentAt) ? 1 : -1 }) .reverse(); messages = messages.slice(messages.length - options.maxMessagesPerChannel); for (const msg of messages) {