#archive-github-djs

1 messages · Page 6 of 1

heavy crowBOT
#

The types are correct, it is saying the entire object is not assignable to CacheWithLimitsOptions, there should be a nested error that tells you why.

Here it is though, SweepFilter<unknown, unknown> isn't assignable to SweepFilter<string, Message>

The example is copied from the documentation, which is weird. Does this have to do with my code editor?

heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:

I'm trying to set slash commands into my application but when I console.log client.application it returns null.

Further details:

  • discord.js version: 13.0.0
  • Node.js version: 16.6.1
  • Operating system: Linux x64

Relevant client options:

  • gateway intents: GUILDS, GUILD_MESSAGES
heavy crowBOT
#
client.on('messageCreate', async (message) => {
console.log(message.content)
})

Further details:

  • discord.js version: 13.0.1
  • Node.js version: 16.6.1
  • Operating system: Linux Ubuntu 20.04 in a container
  • Priority this issue should have: medium

Relevant client options:

  • partials: none
  • gateway intents: tried all
  • other: none

I tried message & messageCreate, but the event don't trigger if someone DM the BOT

heavy crowBOT
heavy crowBOT
heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:
When using a GuildMemberRoleManager.cache it returns this error:
image

I've tried reinstalling all packages (deleting node_modules and package-lock.json
I've already tried the code on multiple computers, the same result.

Please tell me if it's something with my computers

**Include a reproduci...

heavy crowBOT
#

(node:9680) UnhandledPromiseRejectionWarning: ReferenceError: AbortController is not defined
at RequestHandler.execute (C:\Users\user\bot\node_modules\discord.js\src\rest\RequestHandler.js:172:15)
at RequestHandler.execute (C:\Users\user\bot\node_modules\discord.js\src\rest\RequestHandler.js:176:19)
at RequestHandler.push (C:\Users\user\bot\node_modules\discord.js\src\rest\RequestHandler.js:50:25)
at processTicksAndRejections (internal/process/task_queues.js:95:5...

heavy crowBOT
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:

Fixes a method name mismatch in the typings.
Preferred to edit the typing instead of the actual method name since Options.createDefaultOptions seems a little bit repetitive.

Status and versioning classification:

  • Code changes have been tested against the Discord API, or there are no code changes
  • I know how to update typings and have done so, or typings don't need updating
  • This PR only include...
#

Please describe the changes this PR makes and why it should be merged:
VoiceState#suppress can be undefined. This is achieved by not knowing the state of a GuildMember's VoiceState upon them joining a voice channel or a stage channel.

This can be reproduced by starting the bot up using the following code:

const Client = new (require("discord.js")).Client({
  intents: [
    "GUILD_VOICE_STATES"
  ]
});

Client.on("voiceStateUpdate", oldState => console.log...
heavy crowBOT
heavy crowBOT
#

Is your feature request related to a problem? Please describe.

Upstream PR: https://github.com/discord/discord-api-docs/pull/3600

Describe the ideal solution

  • [ ] Add invitable to the ThreadChannel structure
  • [ ] Add support for editing invitable (private threads only!)
  • [ ] Add support for invitable field when creating private threads

Describe alternatives you've considered

N/A

Additional context

Waiting to implement this until it is deployed to ...

heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:
It seems like setPosition is putting the position on -1 resulting in an DiscordAPIError;

https://discord.js.org/#/docs/main/13.0.1/class/GuildChannel?scrollTo=setPosition

Include a reproducible code sample here, if possible:

        console.log(position); //returns 10
        await channel.delete("Channel Nuked by Maxminded Bot.");
        const newChannel = await channel.clone().catch...
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:

This introduces compile time constraints for the changes recently added to ApplicationCommandData:

  • description is required when type is set to 'CHAT_INPUT'
  • options is only available to commands of 'CHAT_INPUT' types as per the discord docs

Status and versioning classification:

heavy crowBOT
#

In the absence of a good way to expose individual resolved data as "mentions", this exposed the complete, parsed interaction.data.resolved object as a number of Collections, similar to how MessageMentions are provided.

Aim is to do this in a non-breaking way for 13.1.0, hence using the "resolved" property name, leaving "mentions" available if we want to do a better filtering of it somewhere else down the track.

Status and versioning classification:

  • Code changes have been tested...
heavy crowBOT
heavy crowBOT
heavy crowBOT
heavy crowBOT
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:

This is a follow-up on my PR to builders yesterday.

I also noticed we were not exposing the *mention functions so added those while I was in the file anyway, as well as fine tuning some of the JSDoc (matching the TSDoc of builders) and re-sorting alphabetically because apparently that was a thing in this file.

Status and versioning classification:

  • Code changes have been tested against the Discord API, or th...
heavy crowBOT
heavy crowBOT
#

I see your point! The other option I was thinking of was making it null, just in case VoiceState is swept by the makeCache ClientOption, since we can't tell what that was? I'm not familiar with the new cache stuff, but if it's no longer in cache and removed whilst they're a speaker in a stage channel, defaulting to true if they leave wouldn't be correct here? If I'm totally wrong, let me know and I'll change the default back to true (:

heavy crowBOT
#

I have just tested this out with this:

const { Client, Options } = require("discord.js");

const client = new Client({
  intents: [
    "GUILD_VOICE_STATES"
  ],
  makeCache: Options.cacheWithLimits({
    VoiceStateManager: 3
  })
});

client.on("voiceStateUpdate", oldState => console.log(oldState)); // Let >= 3 people do whatever first, then leave as a speaker

client.login("token");

With a couple of accounts (3), their voice states were created accordingly...

heavy crowBOT
#

CHAT_INPUT input commands are not context menu items, they are normal slash commands. The error you're getting is from Discord, since slash commands still have their name and description restrictions. Only the USER and MESSAGE types are context menu item commands.

https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-types

heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:

Since upgrading to Discord v13, my bot Just disconnects from Discord randomly. I am seeing no errors or warning and after turning on the debug log I notice the Heartbeat just stops with no further messages. This issue is pretty frequent happening multiple times a day. When this happens, the Systemd service is still running and nothing is crashed or frozen, just the bot has disconnected from Discord. I don't reall...

heavy crowBOT
#
   * @property {Collection<string, User>} [users] The resolved users
   * @property {Collection<string, GuildMember|APIGuildMember>} [members] The resolved guild members
   * @property {Collection<string, Role|APIRole>} [roles] The resolved messages
   * @property {Collection<string, Channel|APIChannel>} [channels] The resolved channels
   * @property {Collection<string, Message|APIMessage>} [messages] The resolved messages

seeing as they are all optional

#

Is your feature request related to a problem? Please describe.
My bot have 100+ commands and every command have message.channel.send({embed: {/* embed here */}}).

After upgrade to discord.js v13, I need to replace every single message.channel.send to make embeds work again.

Describe the ideal solution
I want to return old embed property to message.channel.send to enable backward compatibility with v12 code.

Describe alternatives you've considered

**Additional cont...

heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:
The enum instances arent actually exported, so shouldnt be declared in the typings as being exported.
Declaring them as const enums instead means they will be replaced by their value at compile time, removing any runtime errors when trying to access the enum value.

This means importing discord.js/typings/enums and using the enum will no longer result in a runtime error, without impacting existing code or definit...

heavy crowBOT
#

This issue also applies to VoiceState#streaming. By not knowing the state of a guild member's VoiceState upon them stopping streaming or leaving voice (whilst streaming) etc., VoiceState#streaming will be false, but in actual fact, this should have been true.

This wasn't much of an issue before, but since we have adopted this awesome caching behaviour which means sweeping the cache or setting a limit, there now exists a possibility that this is improperly set.

Should a new pul...

heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:
StageInstance#discoverableDisabled was possibly undefined.

This can occur via the following steps:

  1. Start a stage channel instance
  2. End the stage channel instance
  3. Restart the bot to ensure that the instance is not cached
  4. Fetch the audit log entry for this stage instance

Response

GuildAuditLogsEntry {
  targetType: 'STAGE_INSTANCE',
  actionType: 'DELETE',
  action: 'STAGE...
#

Please describe the changes this PR makes and why it should be merged:

A lot of our typings use a *Types enum for different type definitions, with the recent changes in #6291 and #6212. We decide type properties based on the type field. The issue is that a consumer of the library cannot properly type narrow our types because our types are using unexposed enums.

For example:

  if (command.type === 'CHAT_INPUT') {
   // Command is Chat input command type.
  } els...
#

The issue with #6065 (comment) is that the typescript declaration was declaring there to be an instance available at runtime when there wasnt, hence the undefined you get at runtime. Const enums dont declare anything as existing at runtime. As a toy example:

enum ThisEnumExistsAtRuntime {
    OPTION_1 = 1,
    OPTION_2 = 2,
    OPTION_3 = 3
}

const enum ThisEnumDoesntExistAtRuntime {
    OPTION_A = 'A...
#

Please describe the problem you are having in as much detail as possible:
The Slash Command Builder doesnt set Type
Include a reproducible code sample here, if possible:
Its the Admin Command
https://img.eliteschw31n.de/PEBE2/JOxeKAgo42.png
https://img.eliteschw31n.de/PEBE2/fUXiFEDO37.png

// Place your code here

Further details:

  • discord.js version:13.0.1
  • Node.js version:16.6.1
  • Operating system:raspbian
  • Priority this issue should have – pl...
#

Making those const enum breaks:

  • non-literal string access, e.g. ChannelTypes[channel.type] (errors, but in runtime returns a number)
  • Reverse mapping, e.g. ChannelTypes[ChannelTypes.GUILD_TEXT] (errors, but in runtime returns a string)

We actually export those enums under Constants (end of declaration):
https://github.com/discordjs/discord.js/blob/cd4029218fc8b67c395b3cd49a121b1bfa38f021/typings/index.d.ts#L2144

If there is a way to have them, but not be importable ...

#

Good point! Ive updated the PR to support that. These are the test cases I used:

import { Channel, Constants } from 'discord.js';
import { ChannelTypes } from 'discord.js/typings/enums';

const channel: Channel = <Channel><unknown>undefined; // Hack just to get the type info for testing

const x = Constants.ChannelTypes[channel.type];              // type: ChannelTypes
const y = Constants.ChannelTypes[Constants.ChannelTypes.DM]; // type: string
const z = Constants.ChannelTypes....
heavy crowBOT
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:
The WidgetMember class had a bunch of properties that would default to undefined if said member was not in voice or did not have an activity. The documentation already assumed them to be nullable, but the typings didn't! Side note: WidgetMember#avatar typings were wrong as they return null if not found.

I've defaulted them now to null. The JSDo...

heavy crowBOT
heavy crowBOT
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:
#6299 modified this to be nullable, but upon looking through Discord's documentation (and all prior versions) with testing on non-community guilds, it seems it is documented to always return a string and testing has verified this. Thus, this property will be modified to be only a string!

Status and versioning classification:

  • Code changes have been tested against the Discord API, or there are no code changes
    ...
#

Making those const enum breaks:

  • non-literal string access, e.g. ChannelTypes[channel.type] (errors, but in runtime returns a number)
  • Reverse mapping, e.g. ChannelTypes[ChannelTypes.GUILD_TEXT] (errors, but in runtime returns a string)

We actually export those enums under Constants (end of declaration):
https://github.com/discordjs/discord.js/blob/cd4029218fc8b67c395b3cd49a121b1bfa38f021/typings/index.d.ts#L2144

If there is a way to have them, but not be importable ...

heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:

Add a method (list) on GuildMemberManager to support sending a request in order to list guild members

Status and versioning classification:

  • Code changes have been tested against the Discord API, or there are no code changes
  • I know how to update typings and have done so, or typings don't need updating
  • This PR changes the lib...
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:

It has come to my attention that the discord API doesn't require the type field, and when not provided it defaults to CHAT_INPUT. This PR makes the type field optional, and assumes if not provided, that the command typings correspond to a slash command.

This also alleviates a breaking type change for typescript users going from v13 to v13.1, when using ApplicationCommandData

**Status and versioning cla...

#

Please describe the changes this PR makes and why it should be merged:

Now that users can join 200 guilds with nitro, bots got a higher limit as well: https://discord.com/developers/docs/resources/user#get-current-user-guilds-query-string-params

Status and versioning classification:

  • There are no code changes
  • Typings don't need updating
  • This PR only includes non-code changes, like changes to documentation, README, etc.
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:

This allows setting the with_counts query parameter when fetching a guild. I'm not sure when you would want to disable it, but the option exists so it counts towards the API coverage

Status and versioning classification:

  • I know how to update typings and have done so
  • This PR changes the library's interface (methods or parameters added)
#

Please describe the problem you are having in as much detail as possible:

When I use setInterval() in shard process it will cause SHARDING_READY_TIMEOUT error,if i dont use it, it works fine

Include a reproducible code sample here, if possible:

// Place your code here


// bot.ts
const client = new Client({intents: new Intents(32767)});
(async() => {
    await client.login(xxx);
    setInterval(() => {
        ...
    }, 10000)
})();



//shard.ts
const ...
heavy crowBOT
#

Is your feature request related to a problem? Please describe.

With how types are currently setup it can be quite confusing figuring out how to narrow them to the desired type, for example to check if a command is strictly a context menu type you'd have to write this helper out:

export function isContextMenuCommand(commandData: ApplicationCommandData): commandData is (MessageApplicationCommandData | UserApplicationCommandData) {
  return commandData.type === 'MESSAGE' ||...
heavy crowBOT
heavy crowBOT
heavy crowBOT
heavy crowBOT
#
[discordjs/discord.js] New tag created: 13\.1\.0
heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:
.delete() Method on Channels dosen't accept a reason anymore but the api still accepts X-Audit-Log-Reason header.
Discord Ref : https://discord.com/developers/docs/resources/channel#deleteclose-channel

The discord.js doc still says that we can input a reason for GuildChannel deletion but typings don't.
The discord.js doc says that we can't input a reason for Channel deletion neither does typings.

I'm ...

heavy crowBOT
heavy crowBOT
heavy crowBOT
heavy crowBOT
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:

Adds ApplicationCommand#equals since checking the equivalence of application commands is a non-trivial task. Especially when handling the instantiated class and raw data.

Status and versioning classification:

  • Code changes have been tested against the Discord API, or there are no code changes
  • I know how to update typings and have done so, or typings don't need updating
  • This PR changes the library'...
heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:

RangeError [BITFIELD_INVALID]: Invalid bitfield flag or number: DJS.Permissions.FLAGS.CREATE_INSTANT_INVITE.
    at Function.resolve (/app/node_modules/discord.js/src/util/BitField.js:152:11)
    at Permissions.has (/app/node_modules/discord.js/src/util/BitField.js:44:28)
    at Permissions.has (/app/node_modules/discord.js/src/util/Permissions.js:54:85)

**Include a reproducible code sample here...

#

I don't know if this is needed, since TS can infer from the properties if we have done unions right, but LGTM

You're correct, but I find doing having to do command.type === 'CHAT_INPUT' && command.type === Constants.ApplicationCommandTypes.CHAT_INPUT, is too verbose, and somewhat confusing. The typeguards in this context are more like aliases for these checks.

An alternative would be to split up the interfaces even more (add another interface for each variant, one for strings one fo...

heavy crowBOT
#

Is your feature request related to a problem? Please describe.
https://github.com/discord/erlpack/ won't compile/install with node v16, which is required for discord.js v13. The maintainers over there are really slow to respond on the verge of it being an abandoned project. Users are trying to get a fix for 10 days now without even a response and the thread on that PR is devolving a bit: https://github.com/discord/erlpack/pull/40 .

Describe the ideal solution
discordjs should j...

heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:

Adds a getter which indicates if the channel can be viewed by the public or not.

Status and versioning classification:

  • Code changes have been tested against the Discord API, or there are no code changes
  • I know how to update typings and have done so, or typings don't need updating
  • This PR changes the library's interface (methods or parameters added)
heavy crowBOT
heavy crowBOT
heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:
Basically Sticker.fetchUser() isn't working, I used Sticker.fetch() and it worked

This is what I get when I run my code

Sticker {
  id: '859884354128838666',
  description: 'Un emoji bastante sorprendido',
  type: 'GUILD',
  format: 'PNG',
  name: 'WARNING-E ~ Gran sorpresa',
  packId: null,
  tags: [ 'flushed' ],
  available: true,
  guildId: '390200963476094976',
  user: null,
  sortValu...
#

Please describe the changes this PR makes and why it should be merged:

The CachedManager#add() method was renamed to CachedManager#_add() to be treated as an internal method, which should be used here.

Fixes #6420

Status and versioning classification:

  • Code changes have been tested against the Discord API, or there are no code changes.
  • I know how to update typings and have done so, or typings don't need updating.
heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:

....\node_modules\discord.js\src\managers\GuildMemberRoleManager.js:36
    return this.guild.roles.cache.filter(role => this.member._roles.includes(role.id)).set(everyone.id, everyone);
                                                                    ^

TypeError: this.member._roles.includes is not a function
    at d:\workspace\maiabot\app\node_modules\discord.js\src\managers\GuildMemberRoleMa...
heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:
In v12 of discord.js, you used to be able to call the broadcastEval method, while providing outside variables like so:

let myStatus = "idle";

shardManager.broadcastEval(
    `this.user.setStatus(${myStatus});`
);

Now with v13, broadcastEval takes a function instead, so the above code could be refactored like so:

let myStatus = "idle";

shardManager.broadcastEval((client) =...
heavy crowBOT
heavy crowBOT
heavy crowBOT
#

That's completly expected and normal, and this is why the method allows you to pass context variables in its option.
Please use options.context to pass all the data that you need for your function to work.
https://discord.js.org/#/docs/main/stable/class/ShardingManager?scrollTo=broadcastEval
And please use the Discord server for those kind of questions in the future, as this is not a bug in itself.

heavy crowBOT
#

It appears a recent API change now allows fetching of ephemeral messages - this removes the internal checks which were in place to prevent API errors.

Attempting to delete an ephemeral still responds with Unknown Message.

Status and versioning classification:

  • Code changes have been tested against the Discord API, or there are no code changes
  • I know how to update typings and have done so, or typings don't need updating
heavy crowBOT
heavy crowBOT
heavy crowBOT
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:

Removing this will prevent people from raiding easier. Yes they can do PR, but I don't think a well known library like this should support it.

How can you make a self bot?
new Client({_tokenType:""})

Status and versioning classification:

  • Code changes have been tested against the Discord API, or there are no code changes
  • I know how to update typings and have done so, or typings don't need updatin...
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:

Fixes some issues in the Typings (basically like my previous PR #6162)

attachments wasn't typed in MessageOptions, so I added that and update the Pick when defining WebhookEditMessageOptions to add attachments to the typings and to ensure this doesn't bug

Status and versioning classification:

Code changes have been tested against the Discord API, or there are no code changes
I know how to update ...

heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:
When a message "X" with reactions is referenced by a different message (e.g. via reply or via fetching an old reply) , message "X" has its reaction manager overwritten and will lose access to reactions from before that point.

Include a reproducible code sample here, if possible:

const { Client, Intents } = require('discord.js');

const client = new Client({ intents: [Intents.FLAGS.GUILDS, I...
heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:
I was trying to add a sticker to a guild using this example:

Notes: I've tested it just using a URL

guild.stickers.create('https://i.imgur.com/w3duR07.png', 'rip')
  .then(sticker => console.log(`Created new sticker with name ${sticker.name}!`))
  .catch(console.error);

Source: https://discord.js.org/#/docs/main/13.1.0/class/GuildStickerManager?scrollTo=create

But I'm getting this erro...

#

You are not supposed to pass an object to GuildStickerManager#create, but as documentation suggests (and the example you literally posted in the message shows), several parameters corresponding respectively to the sticker data, its name, its tag and extra options.

Please use the Discord server for those issues in the future as this is not a bug in itself.

heavy crowBOT
#
#
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:
In PR #6071 the Message#_patch method was changed to return type Message because the old patch method did that. But looking at the _patch method it doesn't return anything.

Status and versioning classification:

  • Code changes have been tested against the Discord API, or there are no code changes
  • I know how to update typings and have done so, or typings don't need updating
heavy crowBOT
heavy crowBOT
heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:

Util.splitMessage() does not allow empty strings to be used in it. This should not be the case as splitMessage is just a utility function and no longer used in sending messages directly. It's not referenced anywhere in the lib and therefor just unnecessarily restricts the possible usages for the function.

Include a reproducible code sample here, if possible:

const { Util } = require('disc...
heavy crowBOT
heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:

When attempting to start a messageComponentCollector from a message fetched using interaction.fetchReply(), it won't work in DMs (but it WILL work in any other text channel that I've tested it in).

Include a reproducible code sample here, if possible:

// interaction.isCommand() = true
// context is asynchronous

const msg = await interaction.fetchReply()

const filter = i => i.user.id ...
heavy crowBOT
heavy crowBOT
#

Since you've specified no intents and no partials, and the issue is only in DMs, I'm going to guess that you need the CHANNEL partial so it can create a Message in that channels cache instead of emitting a raw object.

My bad for forgetting about intents! I updated the original message, but when i get back to my bot I’ll try it with the CHANNEL partial

heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:

when I try to access to the property "choices" in opt (defined in the forEach shown in the code sample) , I get the error which is displayed below
Property 'choices' does not exist on type 'ApplicationCommandOption'
only after I update discord.js to v13.1.0, and it works fine at v13.0.1

but when I look at the index.d.ts (typing of discord.js v13.1.0), I see that property choices actually exist in type Applic...

heavy crowBOT
heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:
If I send a message after the bot gets ready, the messageCreate does not get emitted.

Include a reproducible code sample here, if possible:

const dc = require('discord.js');
const client = new dc.Client({intents: [dc.Intents.FLAGS.GUILDS]});
client.on('messageCreate', (a) => {
    console.log(a.content)
})
client.on('ready', () => {
    console.log('ready as ' + client.user.tag)
})
clien...
#

Please describe the problem you are having in as much detail as possible:
If I send a message after the bot gets ready, the messageCreate does not get emitted.

Include a reproducible code sample here, if possible:

const dc = require('discord.js');
const client = new dc.Client({intents: [dc.Intents.FLAGS.GUILDS]});
client.on('messageCreate', (a) => {
    console.log(a.content)
})
client.on('ready', () => {
    console.log('ready as ' + client.user.tag)
})
clien...
#

Please describe the problem you are having in as much detail as possible:
If I send a message after the bot gets ready, the messageCreate does not get emitted.

Include a reproducible code sample here, if possible:

const dc = require('discord.js');
const client = new dc.Client({intents: [dc.Intents.FLAGS.GUILDS]});
client.on('messageCreate', (a) => {
    console.log(a.content)
})
client.on('ready', () => {
    console.log('ready as ' + client.user.tag)
})
clien...
#

Please describe the changes this PR makes and why it should be merged:

This PR adds a getter which indicates if the client can send messages in it.

Status and versioning classification:

  • Code changes have been tested against the Discord API, or there are no code changes
  • I know how to update typings and have done so, or typings don't need updating
  • This PR changes the library's interface (methods or parameters added)
#

Not a fan of this or #6419. Permission helpers don't need to bloat the library imo

the library is literally full of permission helpers @monbrey, some classes have more than 5, some even close to 10

And we have on multiple occassions suggested we don't want to go further in that direction and increase the problem. Unless that's changed and I haven't realised.

#

Not a fan of this or #6419. Permission helpers don't need to bloat the library imo

the library is literally full of permission helpers @monbrey, some classes have more than 5, some even close to 10

And we have on multiple occassions suggested we don't want to go further in that direction and increase the problem. Unless that's changed and I haven't realised.

I haven’t seen any signs of this slowing down because they keep getting introduced as new classes come....

#

Please describe the problem you are having in as much detail as possible:
Each time, message has an attachment, Discord.js fetches it. It is all ok as long as attachments are sent as files. But if we send image as an URL(https://someiplogger.com/coolimage.png), Discord.js will still fetch it and thus leak IP address of machine.

Further details:

  • discord.js version: 13.1.0
  • Node.js version: doesn't matter
  • Operating system: doesn't matter
  • Priority: high

**Relevant c...

#

Not a fan of this or #6419. Permission helpers don't need to bloat the library imo

Added this to maintain consistency with ThreadChannel. Alternatively, the getter from that class could be removed.

If this is actually implemented, this also has to check for VIEW_CHANNEL permissions. Without those, SEND_MESSAGES is implicitly denied.

Fixed 👍

#

I don't think discord.js is automatically downloading attachments on received messages.

Can you create a Minimal, Reproducible Example for this?

Misunderstood the problem at first. I thought, D.js fetches every attachment on messageCreate event, however, it is not true actually. However, the problem still exists.

client.on('message', async msg => {
  const args = msg.content.split(/ +/)
  
  if (args[0] ==...
#

Please describe the problem you are having in as much detail as possible:

I catch a Missing Permissions error on a channel edit when all needed checks are done.

  • .manageable is tested
  • .editable is not tested but we know that we have the MANAGE_ROLES permission because we create a role. The target role has just be created so under the position of the bot.

Here is a sentry report error: https://sentry.draftbot.fr/share/issue/1309451c008c4269bd2e4a3a85294a31/

**Inc...

heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:

.manageable is not efficient with voice channels because .viewable is not checked on voice channels.

if (VoiceBasedChannelTypes.includes(this.type)) { 
   // connect permission check
 } else if (!this.viewable) { 
   return false;
 }

Status and versioning classification:

  • I know how to update typings and have done so, or typings don't need updating
heavy crowBOT
heavy crowBOT
#

Can reproduce and this is a direct consequence of #6247 which made it almost impossible to work with command options and typescript. I honestly think that PR should be 100% reverted

Correction: This was actually caused by #6832.

I believe that it would be a step backwards to revert it. Not all commands have an options field, trying to access it on an arbitrary command doesn't really make sense. It saying that it doesn't exist is both accurate and intentional.

When a developer hasn't s...

heavy crowBOT
heavy crowBOT
#

I am trying to add a sticker in a guild with a link or an attachment but it is giving me an error saying HTTPError [TypeError]: source.on is not a function.
Note: The URL links starts with https://cdn.discordapp.com/

Here's my code:

if(message.stickers.size == 0 && !message.attachments.first()) {
       const stickerURL = args[0]
        const stickerName = args.join(" ");
    try {
        const finalSticker = await message.guild.stickers.create(stickerURL, stickerName, {r...
#

I am trying to add a sticker in a guild with a link or an attachment but it is giving me an error saying HTTPError [TypeError]: source.on is not a function.
Note: The URL links starts with https://cdn.discordapp.com/

Here's my code:

if(message.stickers.size == 0 && !message.attachments.first()) {
       const stickerURL = args[0]
        const stickerName = args.slice(1).join(" ");
    try {
        const finalSticker = await message.guild.stickers.cr...
heavy crowBOT
heavy crowBOT
heavy crowBOT
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:
I noticed that the ClientPresence class was empty on the docs as it did not extend Presence as it should and none of its methods were documented. Along with that, this class didn't appear in the typings either, and nor was Client#presence present either. This PR fixes all of that. One thing to keep in mind is that I made the set method public but this may not be wanted to please let me know if this should be changed
...

heavy crowBOT
#

Can't we just do this?

// Owner always can manage:
if (this.client.user.id === this.guild.ownerId) return true;

// Get the permissions, if we couldn't resolve to a member, return false:
const permissions = this.permissionsFor(this.client.user);
if (!permissions) return false;

// Get the bitfield and see if we fulfill it:
const bitfield = VoiceBasedChannelTypes.includes(this.type)
  ? Permissions.FLAGS.VIEW_CHANNEL | Permissions.FLAGS.MANAGE_CHANNELS | Permissions....
#

It's the bot developer's job to sanitise their arguments, not Discord.js's - just like it's your job to sanitise user input before inserting them in SQL code (unless you haven't heard of our friend "Bobby Tables").

Limiting where attachments can be uploaded from in a very specific endpoint leads to inconsistent behaviour, so if we're changing this, it'd be to remove the option to upload from URL, which is highly unlikely and doesn't solve your issue as you're just moving code from one plac...

heavy crowBOT
#

If you don't know discord.js can upload GIFs from links, what is the expected input users must sent to use that command? I can think of sending up to around a million characters in Base64, but that'd be a bit too much over the content length limit 😅

That being said, it's documented:

#

I suggest adding warnings where it is not obvious that the content from the link will be downloaded automatically. For example, GuildEmojiManager#create - in order to understand that the link will be fetched automatically, you either need to know that the Discord API does not accept links as emojis, or you need to read the library code. How many developers do you think are aware of this?

heavy crowBOT
heavy crowBOT
#

Opening this one up for discussion as to pros and cons - this change enforces the type property when using JSON object format for components, rather than builders.

This works and enforces the param, but does mean that objects typed as the base typedefs:

  • MessageActionRowOptions
  • MessageButtonOptions
  • MessageSelectMenuOptions

are not compatible with MessageOptions anymore, and instead must be typed as:

  • Required & MessageActionRowOptions for action rows
  • `Messa...
heavy crowBOT
heavy crowBOT
heavy crowBOT
#

I encountered this problem as well. Before I transitioned to v13, Message.reactions.cache always contained the real-time reaction data. After my transition to v13, however, it is not as reliable (consistently returning an empty Collection). I was able to fix the problem by fetching the message before checking the reactions cache. I haven't tested your code, but the principle behind the solution that worked for me would look like this:

 // ...
 message.channel.send("Here's the...
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:

This throws an error to the user if the options provided is not an object. It prevents more confusing and misleading errors given by the process. For example, one may have something like this:

new WebhookClient('id', 'token');

Which is, in fact, an outdated way of creating Webhooks. I wouldn't say we shouldn't place it because it's the user's fault, though. Since the options parameter is a string, ...

heavy crowBOT
#

Documentation is pretty clear on how to build each class, if people don't want to be bothered to check it, it's their problem.
discord.js is a beginner-friendly library (in spite of itself? e.g. the stricter Snowflake type) but its source code should not be containing extra-(useless)-code.

JavaScript being weakly typed is one of its forces, but also one of its drawbacks (which is why TypeScript was born), but imo it's not up to the library to check for those inputs. If people want to code...

#

Please describe the changes this PR makes and why it should be merged:
Closes #6411

Status and versioning classification:

  • Code changes have been tested against the Discord API, or there are no code changes
  • I know how to update typings and have done so, or typings don't need updating
  • This PR only includes non-code changes, like changes to documentation, README, etc.
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:
This PR adds a property to Guild which indicates the maximum allowed bitrate in this guild.
This is similar to the ThreadAutoArchiveDuration['MAX'] option.

Status and versioning classification:

  • Code changes have been tested against the Discord API, or there are no code changes
  • I know how to update typings and have done so, or typings don't need updating
  • This PR changes the library's interface (met...
heavy crowBOT
#

Is your feature request related to a problem? Please describe.
When using interaction#options#getMentionable there's no easy way of telling whether it's a role or user. Meaning we have to resolve to several instanceof checks

Describe the ideal solution
a simple interaction#options#getMentionable#type property would be great

Describe alternatives you've considered
¯\_(ツ)_/¯

Additional context
None

heavy crowBOT
#

This would mean that getMentionable would have to return some sort of complex and/or composite type, such as { type: "USER", value: <User> }, since we aren't going to add type properties to the User or Role objects it currently returns.

Can you provide an example of how you're using this type where it matters if its a User or a Role, but can't use the separate USER/ROLE type options instead?

heavy crowBOT
heavy crowBOT
heavy crowBOT
#

Adding the type property to MessageActionRowOptions, BaseButtonOptions, and MessageSelectMenuOptions interfaces actually enforces you to supply a type.

export interface MessageActionRowOptions extends BaseMessageComponentOptions {
  type: 'ACTION_ROW' | MessageComponentTypes.ACTION_ROW;
  components: MessageActionRowComponentResolvable[];
}
export interface BaseButtonOptions extends BaseMessageComponentOptions {
  type: 'BUTTON' | MessageComponentTypes.BUT...
heavy crowBOT
#

HTTPError [AbortError]: The user aborted a request. at RequestHandler.execute (/home/pi/node_stuff/Kety_folfs_bot_2_0/node_modules/discord.js/src/rest/RequestHandler.js:107:21) at runMicrotasks (<anonymous>) at processTicksAndRejections (internal/process/task_queues.js:97:5) { code: 500, method: 'post', path: '/channels/735679498774642749/messages' } i get this with my bot

Have you resolved this 500 problem?

heavy crowBOT
heavy crowBOT
#

Is your feature request related to a problem? Please describe.
So, I need the option .addChannelOption for a sub command. But I only need all 'GUILD_TEXT' channels. Nothing else. But I am not able, to filter all channels for only 'GUILD_TEXT' channels, so the user is only able to choose them and is not able to choose any other channel type.

Describe the ideal solution
.addChannelOption((option) => option.filter(blablabla))

![image](https://user-images.githubusercontent.c...

heavy crowBOT
#

When I fetch the last 100 messages of a channel and later use the message cache of the channel, those messages don't seem to be there. Can someone verify if it works for them?

This is my MessageManager cache BTW: new LimitedCollection({ sweepFilter: LimitedCollection.filterByLifetime({ lifetime: 86400 }), sweepInterval: 5400 });

heavy crowBOT
heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:

When trying to get the current presence for my bot through the client, the TSLint errors with a Property 'presence' does not exist on type 'ClientUser'. ts(2339) message.
image

However, if I suppress the error with a ts-ignore comment, I can get the presence during runtime with the same code.
![...

heavy crowBOT
#

That works perfectly with my code sample provided above.

I guess in a sense it wouldn't technically change to pre-v13 functionality due to what caching is for. By always getting new reactions whenever requested from the cache, it would make it useless to have caching at all. Instead a method should be implemented to fetch/update reactions, though I don't know if the only way of doing so is by fetching/updating the message in the Discord API. Perhaps you're meant to do the fetch() metho...

#

Please describe the problem you are having in as much detail as possible:
Upon adding any reaction to a message with a ReactionCollector on it, the collector's filter function is called twice. This issue began with v13.0.0. I've checked the source code and found that the filter is called once to determine whether the create event should be emitted...
https://github.com/discordjs/discord.js/blob/cfde127072ae06b63f17ba19b3e0d28fddef97d6/src/structures/ReactionCollector.js#L104-L106
...

heavy crowBOT
#

Adding the type property to MessageActionRowOptions, BaseButtonOptions, and MessageSelectMenuOptions interfaces actually enforces you to supply a type.

This is exactly what I don't want to do, as it would then enforce specifying type if providing parameters the constructors of these objects, as I said in the issue.

without change the fact that the type is not required in the base typedefs

#

I don't think it would be a good idea because then you'd be receiving an object with a type property and the actual object you want inside which would also be a pain to design and document. You should technically only need one instanceof check because if it isn't a role then it's either a member (if it's in a guild) or a user so I don't see how this would be an issue

There's both Role and APIRole

heavy crowBOT
#

As mon said, this is awaited due to the finally call, which is intended. eslint doesn't error on this because the behavior is different.

E.g.
Not awaited:
Request is queued, waits for previous requests, as the request goes out, return active request, finally block is called and lets the next request pass even though this hasn't finished

Awaited:
Request is queued, waits for previous requests, wait for request to complete, return result, finally block is called and lets the next reque...

heavy crowBOT
heavy crowBOT
#

this isn't how switch statements work...

You are right. I did it all wrong. I think that the last commit would be the best.

Alternatively, we can also define an object somewhere and do the following:

The reason i went with a switch statement is that if tomorrow, discord releases a Tier 4, we won't have an issue as it would at least return the default bitrate. But other options would also work.

heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:
Following the tradition from #6299 this PR adds a link to Discord's API documentation regarding ApplicationCommandTypes

Status and versioning classification:

  • Code changes have been tested against the Discord API, or there are no code changes
  • I know how to update typings and have done so, or typings don't need updating
  • This PR only includes non-code changes, like changes to documentation, README, et...
heavy crowBOT
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:
As suggested on the [discord server](#archive-site-discussion message), this PR adds a list of message "types" that can hold a MessageReference, as well as a link to the Discord API docs page about this.

Status and versioning classification:

  • Code changes have been tested against the Discord API, or there are no code changes
  • This PR only includes non...
heavy crowBOT
#

The basic premise is that if you deferReply() on an interaction, you cannot then followUp using the "opposite" ephemeral flag. That is- if you call deferReply({ephermeral:true}) , using followUp({ephemeral: false}) will still only show the followup to the interacting user. This is the same in the opposite direction false -> true.

Further details:

  • discord.js version: 13.0.1
  • Node.js version: 16.6.1
  • Operating system: n/a
  • Priority this issue should have – please be...
heavy crowBOT
heavy crowBOT
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:

  • Renames USE_THREADS to CREATE_THREADS
  • Adds SEND_MESSAGES_IN_THREADS
  • Fixes permission getters checking outdated private_thread type\
  • Fixes permission checks passing false to checkAdmin
  • Fixes sendable checking archived but not locked or manageable
  • Updates sendable to use new permissions

Status and versioning classification:

  • I know how to update typings and have done so, or typings don'...
heavy crowBOT
heavy crowBOT
#

When using .followUp() on an interaction, a message is returned. This message isn't identified as an interactrion (message.interaction = null). So later, if i want to edit this message, i'm not able to except if i do a interaction.update().

Please describe the problem you are having in as much detail as possible:

I'm creating a collector on the .followUp() returned Promise. Collector is working fine but if the message is deleted (ephemeral reply in my case), the value `messa...

heavy crowBOT
#

This is entirely expected - ephemeral followUps cannot be edited or deleted. You also don't receive any event when dismissed, so we can't mark them as deleted either.

We could include ephemeral checking in message.edit() however you're still going to have an error thrown - it would just be by discord.js rather than by the Discord API.

Regarding an "ephemeral property", it's a flag. message.flags.has(MessageFlags.EPHEMERAL)

heavy crowBOT
#

This is entirely expected - ephemeral followUps cannot be edited or deleted. You also don't receive any event when dismissed, so we can't mark them as deleted either.

We could include ephemeral checking in message.edit() however you're still going to have an error thrown - it would just be by discord.js rather than by the Discord API.

Regarding an "ephemeral property", it's a flag. message.flags.has(MessageFlags.FLAGS.EPHEMERAL)

Thanks for the clarification. The advanta...

heavy crowBOT
heavy crowBOT
#

followUp is not always a direct reply to an interaction though - if you defer first it does edit that message, but anything else is essentially a new one. If Message#interaction is null, it's because the API didn't provide that data, suggesting the API doesn't consider it a reply.

You also cant use <Interaction>.update() to edit any existing replies - that's purely for the first-response to a Button or SelectMenu interaction.

#

followUp is not always a direct reply to an interaction though - if you defer first it does edit that message, but anything else is essentially a new one. If Message#interaction is null, it's because the API didn't provide that data, suggesting the API doesn't consider it a reply to one.

You also cant use <Interaction>.update() to edit any existing replies - that's purely for the first-response to a Button or SelectMenu interaction.

I came into this issue when trying to edit...

heavy crowBOT
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:
After some testings, it seems that we can't use .fetchWebhook() on a message that was sent by an application (interaction). The way so check this is by comparing the applicationId in the message and the webhookId. If they match, this means that the message comes from an interaction and the webhook behind it cannot be fetched from the api.

The api returns DiscordAPIError: Unknown Webhook

**Status and versio...

heavy crowBOT
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:

While in the process of engineering my bot application, I found the CommandInteractionOptionResolver's way of managing subcommand(group)s rather unnecessary.

As _group and _subcommand were already processed, there was no need to implement two separate methods fetching it (getSubcommandGroup and getSubcommand), except for consistency and the required parameter. I ended up using the _group property in...

#

For those who would want to process the command arguments, including subcommands, on their own - getSubcommand exists, but it requires the programmer to do getSubcommand(false) each time while they ultimately can just use the group property. It might not be as big of a deal as the latter change I proposed, but at the same time, these properties are already computed at initialisation of the resolver instance.

heavy crowBOT
#

Whatever I do, with the latest version of discord.js, the code doesn't work for me, I always get the error:

(node:37728) UnhandledPromiseRejectionWarning: ReferenceError: AbortController is not defined
    at RequestHandler.execute (C:\Users\mella\Desktop\MisPruebas\node_modules\discord.js\src\rest\RequestHandler.js:172:15)
    at RequestHandler.execute (C:\Users\mella\Desktop\MisPruebas\node_modules\discord.js\src\rest\RequestHandler.js:176:19)
    at RequestHandler.push (C:\Use...
heavy crowBOT
heavy crowBOT
heavy crowBOT
heavy crowBOT
heavy crowBOT
heavy crowBOT
#

Is your feature request related to a problem? Please describe.
I would like to send an attachment message based on an url as a spoiler.

Describe the ideal solution
Create a setter for the spoiler property of the MessageAttachment class

const post = getPostFromReddit('surprise')
const attachment = new MessageAttachment(post.url)
attachment.spoiler = true
discordChannel.send(post.title, attachment)

Describe alternatives you've considered
Download the image...

heavy crowBOT
#

The idea is that fetchReply from MessageComponentInteraction/BaseCommandInteraction can be global and specified on the Client, as well as allowedMentions and not having to set it for every interaction.reply.

The idea written in code would be something like:

// Main file
const { Client } = require('discord.js');
new Client({
  intents: [...],
  fetchReplies: true
});


// interactionCreate event
interaction.reply({
  content: 'upa'
}); // This will return a ...
heavy crowBOT
heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:
I noticed that if you have the GUILD_PRESENCES intent and try to access the cache of members of any of your guilds, you will have every member in it available, however, once you remove this intent, you only have the client user on that guild's cache before fetching its members

Include a reproducible code sample here, if possible:

import Discord from "discord.js"
const Client = new Discord.Clie...
heavy crowBOT
#

the members who can be sent in the initial list depends on their presence, so it does make sense

although both Rodry and monbrey have said incorrect things here.

I noticed that if you have the GUILD_PRESENCES intent and try to access the cache of members of any of your guilds, you will have every member in it available

this is only true if the guild has under 50/large_threshold members

Without the intent, Discord does not provide any guild members in the initial payload.

no...

heavy crowBOT
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:

As it stands now if you use this code:

const collector = message.createMessageComponentCollector({ componentType: 'SELECT_MENU' });

collector.on('collect', interaction => {
  // Interaction is type of `MessageComponentInteraction`
});

You'll end up with a MessageComponentInteraction in the collect handler.

Currently there are two trivial ways to narrow this type.

  1. Type Guard it:
    `...
heavy crowBOT
heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:
I have a command which is triggered by a button, the first question sends but then despite me answering it (or anyone else) the bot refuses to store and then send the next question, I have tried using different methods to overcome this but it hasn't worked since I changed to V13.
Include a reproducible code sample here, if possible:
const { MessageActionRow, MessageButton } = require('discord.js');
con...

heavy crowBOT
heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:

  • When setting up a new bot, it does not appear that the bot is seeing any commands in a server that I have added the bot to
  • The bot does not console.log anything that I am inputting into chat channels that the bot is present in
  • after running the application, I see the Ready! message get logged to the console
  • I followed all steps on the discordjs.guide up to [this point](https://discordjs.guide/creatin...
heavy crowBOT
heavy crowBOT
#

Here is my updated code:

const { Client, Intents } = require('discord.js');

const client = new Client({ intents: [Intents.FLAGS.GUILDS] });

client.once('ready', () => {
	console.log('Ready!');
});

client.on('interactionCreate', interaction => {
	console.log(interaction);
});

client.on('messageCreate', message => {
	console.log(message);
});

client.login('token');

I still do not see anything logged to the console when typing messages in a chat channel with ...

#

I'm wanting to use it for polymorphic behavior. I have an Interaction, which could be any of the subclasses, but I'm only interested in accessing the properties defined in the abstract BaseCommandInteraction. I'd like to be able to run instanceof checks with BaseCommandInteraction to accomplish this, rather than needing to check each subclass separately.

I'm working in TypeScript, and this class is exported in the type definitions which makes it appear to be usable in this way, but since ...

#

You need the GUILD_MESSAGES intent to receive message events.

This fixed the issue, the bot is now logging information to the console. I believe this means the documentation should be updated, unless I am alone in coming across this problem. It was not clear to me that I needed to add this intent to the client config and the documentation seemed to imply that I should be getting info logged to the console with the code in the state it is as shown [here](https://discordjs.guide/creating...

#

Here is the complete code after I added the GUILD_MESSAGES intent that caused the bot to start receiving message events. The only thing that was added was the intent.

const { Client, Intents } = require('discord.js');

const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES] });

client.once('ready', () => {
	console.log('Ready!');
});

client.on('interactionCreate', async interaction => {
	console.log(interaction);
});

client.login('t...
heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:

Threads can execute commands, for example if a new thread is named "!help" and a bot has that command, it will respond, now if someone uses !ban or other command it will also respond regardless of the permissions of the person who made the thread.

Include a reproducible code sample here, if possible:

// No code

Further details:

  • discord.js version: 13.1.0
  • Node.js version:...
heavy crowBOT
heavy crowBOT
#

MessageComponentInteraction#component is marked as nullable. This was true in the past, but right now, it isn't! Ephemeral messages show components now and we receive the full data from them, so there is no way this can be null anymore!

The code in question:
https://github.com/discordjs/discord.js/blob/d6e6244336ccdcdac9a06ab453debe76b13c9bde/src/structures/MessageComponentInteraction.js#...

heavy crowBOT
heavy crowBOT
#

Please describe the problem you are having in as much detail as possible:
The .animated property is only sent across if it is actually animated. Right now, if it is not sent across, it will be undefined. This could default to false instead.

Under the hood, it looks like they call this utility method:
https://github.com/discordjs/discord.js/blob/d6e6244336ccdcdac9a06ab453debe76b13c9bde/src/util/Util.js#L301-L313
Since animated there was undefined, it shows as such. Bu...

heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:
Now that the API enforces custom ids to be unique in components in a message, I want to go ahead and propose this new method!

This will add the .resolveComponent() method. By supplying a custom id, the desired component will be returned (or null if not found). The use case for this is when the desired behaviour is altering the state of some other specific component upon the interaction of a component on the sam...

heavy crowBOT
heavy crowBOT
heavy crowBOT
heavy crowBOT
#

Please describe the changes this PR makes and why it should be merged:
This channel adds a getter to ThreadChannels called starterMessage that represents the message that started the thread when this exists. I didn't find any other way to tell if a thread channel was started by a message or not so this just simply finds a message with the same ID as the channel in the cache

Status and versioning classification:

  • Code changes have been tested against the Discord API, or there are...
heavy crowBOT
heavy crowBOT