Compare commits

..

784 Commits
v12 ... 13.2.0

Author SHA1 Message Date
iCrawl
26340acad9 chore(Release): version 2021-10-05 16:09:40 +02:00
Souji
8bc1ece98e docs: fetchReply info + example (#6753) 2021-10-05 01:37:04 +02:00
Rodry
ba93e85d0d refactor(User): set accentColor and banner to undefined when not yet received (#6721)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-10-05 00:16:59 +02:00
ObscuritySRL
d0025beb7b fix(AllowedImageSizes): add new image sizes (#6754) 2021-10-05 00:10:54 +02:00
Demir
c5421af68e chore(package): change homepage (#6550) 2021-10-05 00:08:13 +02:00
Almeida
a194d9c37f refactor: use optional chaining (#6757) 2021-10-05 00:04:53 +02:00
Suneet Tipirneni
d873a19d34 types(Interaction): allow Interaction cached properties to be type narrowed (#6668)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: Rodry <38259440+ImRodry@users.noreply.github.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-10-05 00:01:43 +02:00
Antonio Román
f88f4cca64 types: rename Awaited<T> to Awaitable<T> (#6756) 2021-10-04 14:11:42 +02:00
Rodry
00e1e2673b fix(User): compare flags in #equals (#6750) 2021-10-04 09:38:28 +02:00
Rodry
1db3e76054 docs(GuildMemberUpdateAction): event doesn't get emitted on user update (#6752) 2021-10-04 09:38:07 +02:00
Jiralite
7eec06145a fix(VoiceState): Patch streaming value (#6747) 2021-10-03 22:55:27 +02:00
Rodry
c3f4de4801 types(GuildBanManager): remove can return null (#6748) 2021-10-03 22:55:14 +02:00
Rodry
42acc6eef9 types: add ExcludeEnum utility for easier typings (#6746)
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
2021-10-03 22:54:43 +02:00
Jiralite
32b5c2e617 types(Webhook): More accurate type for sourceChannel (#6751) 2021-10-03 22:53:37 +02:00
Jiralite
abf158dc94 types(WebhooksUpdate): Allow NewsChannels (#6749)
Co-authored-by: Rodry <38259440+ImRodry@users.noreply.github.com>
2021-10-03 22:53:20 +02:00
Shubham Parihar
7129965423 feat: add support for role icons (#6633) 2021-10-03 18:55:29 +02:00
SpaceEEC
a8c21cd754 fix(Message): avoid overwriting properties in _patch (#6738) 2021-10-03 15:27:00 +02:00
Jiralite
6e5c768379 docs: Better links for .toJSON() of button and select menu (#6745)
Co-authored-by: Rodry <38259440+ImRodry@users.noreply.github.com>
2021-10-03 15:26:21 +02:00
SpaceEEC
d15dd5f07d fix(ReactionCollector): only call the filter function once (#6734) 2021-10-03 15:04:37 +02:00
SpaceEEC
905d100d4d fix(Shard): use provided timeout when respawning (#6735) 2021-10-03 15:04:23 +02:00
SpaceEEC
34b2ad0d8e docs: undocument private constructors (#6732) 2021-10-03 15:02:11 +02:00
Jiralite
a8e60105fb types: More accurate types instead of GuildChannelResolvable (#6744) 2021-10-03 15:01:38 +02:00
Almeida
9e421f6ccf fix(Role): toJSON() throwing due to permission bigints (#6724) 2021-10-03 15:01:24 +02:00
ObscuritySRL
28d96e344b feat(Interaction): add memberPermissions (#6741)
Co-authored-by: Rodry <38259440+ImRodry@users.noreply.github.com>
Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com>
2021-10-03 15:01:07 +02:00
Rodry
3eacf7a587 feat(CategoryChannel): add createChannel shortcut method (#6614) 2021-10-03 15:00:41 +02:00
Almeida
e9daa31eaf perf: use logical assignments instead of if statements (#6693) 2021-10-03 14:59:57 +02:00
Rodry
9eb9591473 fix: don't patch set data with undefined (#6694) 2021-10-03 14:59:52 +02:00
Rodry
8b4456e0aa types(ChannelTypes): remove unknown from CHANNEL options (#6701) 2021-10-03 14:59:45 +02:00
Rodry
b76bb8a409 fix(Invite): #guild never resolving into a Guild (#6742)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-10-02 23:46:32 +02:00
Jiralite
107822d28d feat: Allow webhooks to fetch, edit and delete messages in threads (#6695)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-10-02 13:42:25 +02:00
Nyan Spaghetti
cdf65f74e1 fix(GuildManager): add missing types and converts (#6683)
Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com>
2021-10-02 13:42:10 +02:00
muchnameless
a7cb314e07 types(TextBasedChannels): fix awaitMessageComponent return type (#6723) 2021-10-02 13:41:53 +02:00
Jiralite
3a978f347c types(Vanity): Make uses non-nullable (#6715) 2021-10-02 13:41:30 +02:00
Advaith
10478ad148 feat(Threads): update permissions and fix getters (#6466) 2021-10-02 13:41:05 +02:00
muchnameless
7c4d1dffb4 types(Role): Role#comparePositionTo accepts RoleResolvable (#6722) 2021-10-02 13:40:52 +02:00
Jiralite
2803db683d feat(PartialGroupDMChannel): Add recipients & fix name (#6713) 2021-10-02 13:40:40 +02:00
cherryblossom000
3f1100976f docs(Message): fix return type for reply (#6720) 2021-10-02 13:40:15 +02:00
Almeida
531b46c60d refactor: use the node: protocol (#6710) 2021-10-02 13:40:02 +02:00
Rodry
466e796a1d docs(CommandInteractionResolvedData): fix key type (#6729) 2021-10-02 13:38:59 +02:00
Almeida
8d80fec86d fix(Util): default animated to false when omitted on resolvePartialEmoji (#6725) 2021-10-02 13:38:37 +02:00
Rodry
fe9500538e types(Presence): fix ActivityOptions#type and Activity#id types (#6696) 2021-09-28 18:57:09 +02:00
ckohen
da3ae4854e types: fix missing channel type in subcommand options (#6706) 2021-09-28 18:55:39 +02:00
Rodry
dfd7b403a9 feat(GuildMember): add guild avatars (#5696)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: Shubham Parihar <shubhamparihar391@gmail.com>
Co-authored-by: GoldenAngel <50855202+GoldenAngel2@users.noreply.github.com>
2021-09-28 18:53:37 +02:00
Shubham Parihar
7cba67620e docs(EmojiResolvable): update description of typedef to remove ambiguity (#6708) 2021-09-28 18:52:47 +02:00
Shubham Parihar
c5db0ff606 feat(MessageAttachment): add support for ephemeral property (#6652)
Co-authored-by: Rodry <38259440+ImRodry@users.noreply.github.com>
2021-09-28 18:52:03 +02:00
Rodry
60aa9ae478 fix(Message): throw error on missing channel (#6581)
Co-authored-by: D Trombett <73136330+DTrombett@users.noreply.github.com>
2021-09-28 18:51:42 +02:00
ckohen
3b14883e34 feat(ApplicationCommand): add support for channel_types (#6640)
Co-authored-by: Tiemen <ThaTiemsz@users.noreply.github.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-09-27 13:49:39 +02:00
Shubham Parihar
8426770865 fix(CachedManager): return updated data when cache is false (#6685) 2021-09-27 13:49:25 +02:00
Rodry
79b1b20562 chore(IssueForms): remove default titles (#6659)
Co-authored-by: Souji <timoqueezle@gmail.com>
2021-09-26 21:39:52 +02:00
Jiralite
60b8ba6b86 fix(GuildEmoji): Cache restricted roles and author data (#6675) 2021-09-26 21:38:58 +02:00
Rodry
d3da83368d fix(Constants): allow undefined size (#6686)
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-09-26 21:38:11 +02:00
Jiralite
f8aa4bd470 fix(*RoleManager): Create set of role ids correctly (#6674)
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
2021-09-26 21:33:59 +02:00
Shubham Parihar
a06a87a7c4 feat(UserManager): allow #fetch to take UserResolvable (#6677) 2021-09-26 21:33:50 +02:00
Advaith
1ca8d2c8e8 types: add GuildEmojiManager to Caches (#6671) 2021-09-26 21:33:25 +02:00
Shubham Parihar
42fdcaa1da feat: add api error code 50101 (#6663) 2021-09-26 21:33:20 +02:00
Andreas Clausen
94ca0f599d typings(VoiceState): allow moving members to stage channels (#6684) 2021-09-26 21:33:11 +02:00
Megatank58
839974ca43 docs(ApplicationCommandPermissionsManager): fix example set method (#6658) 2021-09-23 14:04:49 +02:00
D Trombett
5070d23914 fix(Shard): eval promise never resolves (#6649) 2021-09-23 13:48:22 +02:00
Suneet Tipirneni
ecd637f7d6 feat: Add support for API command types in ApplicationCommandManager (#6621) 2021-09-23 13:47:17 +02:00
Advaith
66a90d3f89 feat(Permissions): add START_EMBEDDED_ACTIVITIES (#6622) 2021-09-23 13:47:09 +02:00
Rodry
caa3b60c30 feat(Integration): add missing props and fix docs/types (#6623)
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-09-23 13:47:01 +02:00
Rodry
29dd319b68 refactor(VoiceState): use manager edit method to remove error (#6631) 2021-09-23 13:46:55 +02:00
Rodry
124e177e91 refactor(Constants): better type error in cdn endpoints (#6637) 2021-09-23 13:46:40 +02:00
Apokalypt
034782641a types(Interaction): improve type guard for inGuild() (#6644) 2021-09-23 13:42:27 +02:00
Jiralite
b9a4899491 docs(Shard): Point to correct events (#6641) 2021-09-23 13:41:26 +02:00
tig
5d87398f9f fix(xxxable): follow more properly with discord behavior (#6551)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-09-23 13:41:18 +02:00
Shubham Parihar
603350645d fix: allow null to be passed in order to reset icon/avatar (#6646) 2021-09-23 13:40:51 +02:00
Rodry
92f6471e8e types(MessageOptions): allow APIEmbed (#6656) 2021-09-18 01:09:49 +02:00
tig
88e2622dde docs(VoiceChannel): deprecate editable (#6613) 2021-09-15 00:26:10 +02:00
Jiralite
75d85f7838 types(WelcomeChannel): Allow store channels (#6615) 2021-09-15 00:26:03 +02:00
Rodry
8add4b08f5 feat: default values for setX boolean methods (#6619) 2021-09-15 00:25:50 +02:00
Souji
0a71a4d18f chore: issue forms (#6611) 2021-09-15 00:25:19 +02:00
Shubham Parihar
183dbd7e53 feat: add api error code 30042 (#6635) 2021-09-15 00:24:16 +02:00
Rodry
256fb905fe types(MessageEmbed): allow APIEmbed type (#6629) 2021-09-15 00:19:49 +02:00
Jiralite
3c3522ae8a docs(PermissionOverwriteManager): Correct @returns of delete (#6632) 2021-09-15 00:19:04 +02:00
Suneet Tipirneni
be8912a421 feat: Give removed MessageReactions on messageReactionRemoveAll event (#6607)
Co-authored-by: D Trombett <maxtromb.dt@gmail.com>
Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-09-10 20:32:05 +02:00
Shubham Parihar
1b016a30c8 types(TextBasedChannelFields): add back createMessageCollector (#6616) 2021-09-10 20:31:29 +02:00
Rodry
3183b1166a fix(Message): pinnable returning false in non-DEFAULT messages (#6585) 2021-09-09 19:51:21 +02:00
Shubham Parihar
f866512e84 feat(ApplicationCommand): add version property (#6603)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-09-09 18:52:39 +02:00
Suneet Tipirneni
8cc3885739 typings: make channelId non-nullable on MessageComponentInteraction (#6600) 2021-09-08 14:42:05 +02:00
Suneet Tipirneni
c62823e43d typings: Message#createMessageComponentCollector use MessageComponentInteractionOptions<T> (#6596) 2021-09-08 14:36:15 +02:00
Jiralite
ea3695585d types(MessagePayload): Specify typings for files and resolveFile (#6608) 2021-09-08 14:34:53 +02:00
Jiralite
ea6a57e927 docs(MessagePayload): Correct return type of resolveFile() (#6605) 2021-09-08 14:34:26 +02:00
Hackerboi 69
f57791c5fe chore: remove jsdoc.json (#6587) 2021-09-05 15:40:41 +01:00
Bvdgames
8826e9ffbc fix(threadMembersUpdate): fixed typo (#6589) 2021-09-05 15:39:47 +01:00
Rodry
db73cf9255 docs(MessageButton): fix info tag (#6590) 2021-09-05 15:39:27 +01:00
Rodry
08edc0b1db fix(ThreadChannel): fetchStarterMessage bug (#6584) 2021-09-03 18:22:49 +01:00
Rodry
00bd92a451 refactor: ES2021 features (#6540)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: Voltrex <mohammadkeyvanzade94@gmail.com>
2021-09-03 12:58:01 +01:00
Advaith
d81590d566 feat(MessageTypes): add CONTEXT_MENU_COMMAND (23) (#6425) 2021-09-03 12:57:33 +01:00
Souji
06460565e4 chore: issue forms (#6583) 2021-09-03 12:53:05 +01:00
Suneet Tipirneni
08419561ed typings: Collector filter parameter inference (#6574) 2021-09-01 11:07:26 +01:00
Shubham Parihar
d16ada9708 feat: add api error code 160002 (#6566) 2021-08-31 11:38:27 +01:00
Rodry
cdb00053de typings(MessageReference): correctly add undefined type (#6563) 2021-08-31 11:38:12 +01:00
Jiralite
2c219cb982 types: @typedef for StageChannelResolvable (#6568) 2021-08-30 21:57:54 +01:00
ckohen
581921f8b7 feat(ApplicationCommand): add #equals (#6414)
Co-authored-by: Juruel Keanu Lorenzo <keanulorenzo32@gmail.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: Rodry <38259440+ImRodry@users.noreply.github.com>
2021-08-30 11:56:47 +01:00
Suneet Tipirneni
f49f70a4eb fix: await message component collectors should return component interactions not collectors (#6562) 2021-08-30 11:55:39 +01:00
Souji
54b33dd7df chore: issue forms (#6560)
* workflow: issue forms

* chore: make intents and partials dropdowns

* chore: add tip about multi-select

* chore: use typescript for cb
2021-08-30 11:53:55 +01:00
GodderE2D
33f6f8211f docs(WidgetMember): fix typo for deaf (#6564) 2021-08-30 08:10:59 +01:00
Jiralite
29d5fd163c docs(Constants): Fix interaction type link (#6558) 2021-08-29 23:45:59 +01:00
Jiralite
34024f5ef6 docs: Fix JSDoc for ClientUser#edit (#6554) 2021-08-29 20:55:39 +01:00
DraftMan
9301c9b420 fix(GuildChannel): Fix manageable method for voice-channels (#6447)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: Kyra <kyranet@users.noreply.github.com>
Co-authored-by: ckohen <chaikohen@gmail.com>
2021-08-29 16:26:05 +01:00
Suneet Tipirneni
03d5549461 typings: Allow message component interaction collectors to infer collected interaction types (#6476) 2021-08-29 16:25:58 +01:00
Jiralite
774e9609d2 typings(CommandInteractionOptionResolver): Document & type thread channels (#6521) 2021-08-29 13:23:20 +01:00
ckohen
a6932546e2 feat(Threads): add support for invitable in private threads (#6501)
Co-authored-by: Rodry <38259440+ImRodry@users.noreply.github.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-08-29 13:23:01 +01:00
Rodry
0fe5f88316 types(MessageComponentInteraction): fix componentType (#6536) 2021-08-29 13:22:53 +01:00
Jiralite
b89280a1dd docs(Util): Correct @param for cleanContent() (#6531) 2021-08-27 09:39:19 +01:00
Casper
fc51f61f0c feat(BaseGuildTextChannel): export BaseGuildTextChannel (#6527) 2021-08-25 23:41:15 +01:00
Jeroen Claassens
49e3a14d30 ci: setup npm auto deprecate workflow (#6520)
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-08-25 18:22:24 +01:00
Megatank58
7d4a40a26d docs(Formatters): fix typo of TimestampStyles (#6523) 2021-08-25 13:20:00 +01:00
Sugden
8a8c69a257 fix(MessageAttachment): re-assign name (#6518) 2021-08-24 21:32:56 +01:00
Advaith
839c6da03d feat(User): banners and accent colors (#6117)
* feat(User): support banners

don't mind it for now, just trying

* feat(User): support banners

* fix(Constants): declare dynamic

* fix(User): eslint

* typings: update User typings

* fix(User): add banner to equals and json bannerURL

* typings: missing dynamic

* refactor: xID to xId

* types: re-add typings

* feat: add banner color and fetch note

* feat: switch to accent color (swap hex and dec))

* Update src/structures/User.js

Co-authored-by: Rodry <38259440+ImRodry@users.noreply.github.com>

* Update typings/index.d.ts

Co-authored-by: Rodry <38259440+ImRodry@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: Koyamie <koyamie1@gmail.com>
Co-authored-by: Noel <icrawltogo@gmail.com>
Co-authored-by: Rodry <38259440+ImRodry@users.noreply.github.com>
2021-08-24 21:32:18 +01:00
Justin
96e26c428d feat(MessageAttachment): allow files to be marked as spoilers (#6509)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-08-24 21:25:45 +01:00
Danny May
5c276398d6 typings: mark enums as const enums (#6394)
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-08-24 21:24:34 +01:00
Rodry
705c5a1c17 feat(ThreadChannel): add fetchStarterMessage (#6488)
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-08-24 21:22:11 +01:00
Rodry
4bfd5d3e74 docs(GuildChannelCreateOptions): fix #type type (#6502) 2021-08-24 21:21:43 +01:00
Jiralite
8a95211230 docs(ThreadManager): Fix typo (#6485) 2021-08-24 21:21:22 +01:00
Kevin
141864917a fix(UserUpdateAction): rely on client.user when ids match (#6511) 2021-08-24 21:21:07 +01:00
Jiralite
57b94b9adf feat(Message): Add method to resolve a component by id (#6484) 2021-08-24 21:20:43 +01:00
Megatank58
9ca10cce06 docs: fix wrong type being displayed in docs (#6504) 2021-08-24 21:20:23 +01:00
Rodry
fb50dd9841 feat: set methods for MessageActionRow and MessageSelectMenu (#6490) 2021-08-24 21:20:03 +01:00
Jeroen Claassens
7aff15a055 typings(MessageEmbed): allow null for setTimestamp (#6514) 2021-08-24 21:19:03 +01:00
monbrey
c232baa715 typings: require component type in raw object formats (#6452) 2021-08-23 15:26:22 +01:00
Deivid
656b51875f typings(CommandInteractionOptionResolver): add missing parameter (#6497) 2021-08-23 15:23:27 +01:00
Walker Gray
c14e594d8a feat: export BaseCommandInteraction (#6478) 2021-08-23 15:22:48 +01:00
Francis Rivard
21983de3e0 feat(Guild): Add Guild#maximumBitrate getter. (#6455)
Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-08-23 15:19:55 +01:00
Francis Rivard
f39b597e31 feat(Message): prevent fetching an interaction webhook. (#6468) 2021-08-23 15:18:49 +01:00
Rodry
70cc0295f8 docs(MessageManager): fix typo (#6482) 2021-08-21 20:14:18 +01:00
MarkusRost
d6e6244336 fix(Util): allow empty strings in splitMessage (#6437) 2021-08-18 09:47:13 +01:00
Rodry
93a83c2cf7 docs(MessageReference): add possible message types (#6464) 2021-08-17 21:50:14 +01:00
Rodry
17b407935b docs(ApplicationCommandType): add DAPI link (#6463) 2021-08-17 21:49:53 +01:00
Rodry
6cac03a394 types(ClientPresence): add type declarations and docs (#6450) 2021-08-17 21:49:36 +01:00
Milo
76cf52cd0d chore(Typings): fix WebhookEditMessageOptions not having attachments (#6430) 2021-08-17 21:49:26 +01:00
Shubham Parihar
a4b8623b60 feat: add maximum prune requests reached api error (#6427) 2021-08-17 21:46:17 +01:00
Shino
5eb3553fd1 feat(Rest): expose https.Agent options (#6177)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-08-17 21:45:32 +01:00
ckohen
16493e65fd docs(BufferResolvable): add warning for URL input (#6451) 2021-08-17 21:44:37 +01:00
Synbulat Biishev
f294d1eff2 typings(GuildChannel): Added missing typing (#6454) 2021-08-17 21:44:02 +01:00
HyRo
9a833b1e0e fix(BaseClient): Remove selfbot ability (#6429) 2021-08-16 08:30:35 +01:00
monbrey
d289d5ccb7 feat(InteractionReponses): allow fetching of ephemeral messages (#6426) 2021-08-15 12:10:43 +01:00
Jiralite
2c449b6b48 fix(Sticker): Rename method correctly to _add (#6421) 2021-08-15 12:10:31 +01:00
BannerBomb
81bb68d3be typings: Message#_patch typings return type (#6433) 2021-08-15 12:09:49 +01:00
Koyamie
170c0c4985 feat: export ContextMenuInteraction (#6434) 2021-08-15 12:09:21 +01:00
ahmood
ecb6e50b46 fix(Message): fix typo (#6435) 2021-08-15 12:08:51 +01:00
Jiralite
0109ad0466 chore: Ignore .DS_Store (#6438) 2021-08-15 12:08:20 +01:00
Jiralite
84bb4f4153 docs(Formatters): Use id over ID (#6439) 2021-08-15 12:08:06 +01:00
Sugden
71fdf6fae0 refactor(Channel): make delete async (#6417) 2021-08-14 03:50:53 +01:00
Gm
759faa4174 docs(RoleManager): error in examples (#6416) 2021-08-14 03:50:44 +01:00
monbrey
615afab8bb docs: rename implementation of deferReply (#6412) 2021-08-13 01:24:05 +01:00
iCrawl
f1d5ffce04 chore: set dev version 2021-08-13 00:35:05 +02:00
iCrawl
d0bc4d7ff0 chore(Release): version 2021-08-13 00:32:27 +02:00
Ben
2bf09703c1 feat(GuildMemberManager): add 'list' method (#6403)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Ben <BenjammingKirby@users.noreply.github.com>
2021-08-12 23:05:06 +01:00
Suneet Tipirneni
dcc556c311 typings(ApplicationCommandData): make type field optional (#6405) 2021-08-12 22:12:29 +01:00
Jan
14aea12900 feat(GuildManager): allow setting with_counts to false (#6407) 2021-08-12 22:12:11 +01:00
Jan
e6f48d849f docs: remove unparsed examples (#6404) 2021-08-12 18:01:09 +01:00
Jan
933d2c5eb7 docs(GuildManager): increase fetch limit to 200 (#6406) 2021-08-12 17:29:30 +01:00
Mestery
bbda3c4beb chore(exports): allow imports of specific paths (#6367) 2021-08-12 15:10:38 +01:00
Jiralite
dce8fc7b9d fix(StageInstance): Ensure discoverableDisabled is not undefined (#6395) 2021-08-12 15:06:26 +01:00
Jiralite
44bbfa5c46 fix(WidgetMember): Default to null and not undefined (#6399) 2021-08-12 15:06:11 +01:00
Jiralite
4a64662a7d fix(Guild): preferredLocale to always be a string (#6402) 2021-08-12 15:06:03 +01:00
Suneet Tipirneni
6342430073 typings(Constants): add ApplicationCommandTypes to Constants (#6398) 2021-08-12 15:05:57 +01:00
Suneet Tipirneni
297a9118e7 typings(ApplicationCommandOptionData): Align command data options types more with discord API (#6247)
* types(ApplicationCommandData): align command data more with discord API

* types(ApplicationCommandData): clean up type definitions a bit

* types(ApplicationCommandData): fix issue where  could be used with  and

* types(ApplicationCommandOptionData): make subcommand option stronger

* test(ApplicationCommandOptionData): add typing tests
2021-08-12 15:05:41 +01:00
monbrey
fff887b2f4 feat(CommandInteractionResolvedData): access to "raw" resolved data (#6384)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-08-12 15:04:40 +01:00
monbrey
d9456a1a76 fix(ContextMenuInteractin): store message as raw value (#6400) 2021-08-12 11:38:42 +01:00
Jeroen Claassens
cd4029218f feat(Utils): add additional formatters (#6388) 2021-08-11 21:06:10 +01:00
Suneet Tipirneni
75b48d8d0f types(ApplicationCommandData): Stronger typings for ApplicationCommandData variants. (#6382) 2021-08-11 08:14:54 +01:00
DaStormer
de3c86f804 docs(ApplicationCommandData): fix type property (#6385) 2021-08-11 08:04:49 +01:00
monbrey
0266f28096 feat: right-clickybois (context menu support for ApplicationCommand and CommandInteraction) (#6176)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-08-10 23:56:12 +01:00
ckohen
779e14ef61 docs: update links for api-docs (#6380) 2021-08-10 23:52:51 +01:00
ckohen
4c8dc4cda6 docs: switch urls from upstream rearranging (#6378) 2021-08-10 21:33:32 +01:00
Jiralite
49d3c0bf87 docs: Correct wrong interaction links (#6274)
* docs: Correct wrong interaction links

* docs: fix errors and apply single option

* Update src/structures/CommandInteraction.js

Co-authored-by: Noel <buechler.noel@outlook.com>
2021-08-10 21:32:28 +01:00
Nico
3c17939fd5 fix(Util): remove truthy check before isNaN check (#6358)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-08-10 21:14:41 +01:00
Kevin
2a3e819fcf typings(Options): createDefaultOptions => createDefault (#6376) 2021-08-10 21:08:41 +01:00
Francis Rivard
006edca410 typings(Events): renamed messageReactionAdd's reaction parameter (#6371)
Nothing important but why not update it.
2021-08-10 15:33:51 +01:00
Noel
91740ecc30 chore(README): extend installation 2021-08-10 15:27:06 +01:00
Gilang Ramadhan
2985e5380f chore(README): more explanation in README.md (#6354)
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-08-10 15:25:59 +01:00
Casper
0062aa6f72 docs(Invite): MANAGE_CHANNELS instead of MANAGE_CHANNEL (#6361) 2021-08-09 17:30:30 +01:00
Koyamie
ea8d77ea62 docs(Options): defaultMakeCacheSettings typo (#6365)
fix defaultMakeCacheSettings to be consistant with the actual name.
2021-08-09 17:29:21 +01:00
Sugden
cd393fd421 chore: update conventional commit URL (#6351) 2021-08-08 18:11:45 +01:00
JeroenoBoy
efc20ff669 types(ApplicationCommandOptionData) changed options type (#6347)
* Changed ApplicationCommandOptionData interface

The options type `this[]` as a self reference causes issues when implementing this interface. Changing this to ApplicationCommandOptionData[] fixes this issue
https://imgur.com/a/0eVBoJU

* fixed ApplicationCommandOption

* Update typings/index.d.ts

Co-authored-by: Noel <buechler.noel@outlook.com>
2021-08-08 17:37:58 +01:00
Almeida
5f1def3793 types(ImageURLOptions): allow 'gif' format (#6342)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-08-08 17:36:16 +01:00
Advaith
47d2ef3e40 fix(Constants): fix CDN endpoint typings (#6332) 2021-08-08 12:45:00 +01:00
Muhimur
f13d27ca2e docs: grammar fixes (#6345) 2021-08-08 11:57:50 +01:00
Jiralite
570fba33d3 chore: Rename various stuff to "main" (#6343)
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-08-08 00:08:00 +01:00
Shino
94bb953bf1 ci(PublishDev): remove t and hardcoded dev version (#6238)
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-08-07 21:20:32 +01:00
ahmood
917e71a9ee fix(Managers): fix typo in unsupported warning (#6338) 2021-08-07 21:19:51 +01:00
Papageorgiadis Savvas
394d48649f feat(Threads): max autoArchiveDuration option (#6304)
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-08-07 21:19:29 +01:00
SinisterDeveloper
d87299ba20 fix(GuildMemberRoleManager): typo (#6335) 2021-08-07 16:50:28 +01:00
ckohen
d14a6bfe1d refactor(Options): separate default settings for make cache (#6330) 2021-08-07 16:41:12 +01:00
iCrawl
68c059165b chore: fix bug report and feature request templates 2021-08-07 13:41:41 +02:00
iCrawl
d1d740c1a5 chore: even more labels 2021-08-07 13:31:23 +02:00
iCrawl
ed0f605b23 chore: add additional topic labels 2021-08-07 13:21:37 +02:00
Noel
b2e23ca03c chore: give labels a facelift (#6333) 2021-08-07 12:07:03 +01:00
iCrawl
0d765f53d2 chore: dev version 2021-08-07 11:46:31 +02:00
iCrawl
622f398f4b chore(Release): prepare release 2021-08-07 11:39:43 +02:00
Noel
909c87353e fix(GuildMemberManager): refactor fetchMany (#6328) 2021-08-07 10:35:51 +01:00
Souji
ceae5960ed fix(Message): handle fetched messages (#6325) 2021-08-07 10:35:30 +01:00
Tiemen
60ace9a2d4 types(Util): fix cleanContent parameter type (#6321) 2021-08-07 00:59:03 +01:00
Matt (IPv4) Cowley
9e6a627a13 chore: add other maintainers to GH Sponsors config (#6329) 2021-08-06 23:09:43 +01:00
iCrawl
2b61fb5b3c ci: fix deprecation 2021-08-06 17:45:56 +02:00
Jan
cd1aefb46c docs: fix bad indentation (#6316) 2021-08-06 16:43:21 +01:00
iCrawl
3bff08acf7 chore: bump version 2021-08-06 17:38:30 +02:00
iCrawl
cfde127072 chore: prepare release 2021-08-06 15:30:54 +02:00
ckohen
1200bba7bc fix(MessageMentions): check guild exists before adding roles (#6313) 2021-08-06 14:07:31 +01:00
Noel
52817fc414 fix(GuildMemberManager): fetchMany fixes (#6314) 2021-08-06 14:07:14 +01:00
ckohen
3725dcafc0 fix(Caching): sweep archived threads in all channel caches (#6312) 2021-08-06 13:54:19 +01:00
Rodry
a0974fdbbb ci: update to node 16 (#6315) 2021-08-06 13:41:13 +01:00
Voltrex
d5e28c2298 refactor: replace dependency with initial implementation (#6310) 2021-08-06 13:15:51 +01:00
TotallyNotNero
7787a7695a docs: grammatical fix (#6311) 2021-08-06 13:15:23 +01:00
Muhimur
06644770c8 docs: grammar fixes (#6308) 2021-08-06 08:45:12 +01:00
슈리튬
913c9fa176 fix(Message): fix thread getter (#6309)
For ThreadChannel, errors occur because channel.threads do not exist.
2021-08-06 08:44:56 +01:00
iCrawl
a56ba097dc chore: deps 2021-08-06 01:25:20 +02:00
Rodry
f473f43d08 feat(Collector): return a boolean on checkEnd (#6289) 2021-08-05 20:34:17 +01:00
Rodry
b4afcf8236 docs: general cleanup and improvements (#6299)
Co-authored-by: DaStormer <40336269+DaStormer@users.noreply.github.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-08-05 20:34:06 +01:00
Jan
4241febe24 refactor(Interaction): rename defer to deferReply (#6306) 2021-08-05 17:30:13 +01:00
DaStormer
5b4efd13c9 feat(Channel): add isVoice() (#6297) 2021-08-05 16:41:06 +01:00
Timo
dd3a79eead docs: typo in ClientOptions (#6305) 2021-08-05 16:40:55 +01:00
Bluenix
b639b6c653 refactor(InteractionCollector): only keep Ids of objects (#6084)
Co-authored-by: monbrey <rsm999@uowmail.edu.au>
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-08-05 16:40:23 +01:00
monbrey
3eb41405f4 fix(BaseGuildTextChannel): call patch (#6298) 2021-08-04 23:45:26 +01:00
ckohen
a6d4035176 fix: remove support for overriding caches that break functionality (#6282)
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-08-04 22:04:40 +01:00
monbrey
5be471b47d refactor(Channels): fix incorrectly shared properties (#6262)
Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com>
2021-08-04 21:55:31 +01:00
Suneet Tipirneni
ae6200e58e types(MessageButtonOptions): Clean up and export some button option type definitions (#6291) 2021-08-04 21:48:46 +01:00
Souji
6e3236ab64 fix(Message): make #channel and #guild getters (#6271) 2021-08-04 21:47:32 +01:00
Jeroen Claassens
5b0621fb3a types: make MessageTarget extend on TextBasedChannels (#6296)
@kyranet and I found the bug when updating @skyra/editable-commands
when our custom function that accepted an argument of `MessageTarget`
was suddenly no longer accepting `message.channel`. Turns out it was
because of a mistake @kyranet made lulz
2021-08-04 21:33:03 +01:00
Muhimur
90c2e072bf docs: grammar fix (#6294) 2021-08-04 09:49:28 +01:00
Pixxies Design LTD
00d5ceebf7 Fixed typos in the slash command register example (#6292)
## First "example usage" example
Added a period to the first console.log for consistency. Corrected typo in second console.log to read "Successfully".
2021-08-04 00:44:05 +01:00
Antonio Román
6b2098f7c7 feat(Constants): added more error codes (#6234)
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-08-03 23:14:25 +01:00
ckohen
09471be30e fix(WebSocketShard): mark shard ready if no guilds intent (#6284)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-08-03 23:13:18 +01:00
Antonio Román
61db5f7618 refactor: added TextBasedChannels type (#6286) 2021-08-03 23:12:51 +01:00
muchnameless
a72b5a355e fix(Action): getChannel interaction DM (#6280) 2021-08-03 23:10:17 +01:00
muchnameless
3c7c82292a refactor(MessageComponents): default setDisabled to true (#6279) 2021-08-03 23:10:04 +01:00
muchnameless
35fa3b3103 docs(Client): mark _finalize as private (#6281) 2021-08-03 00:45:09 +01:00
Timotej Rojko
15aea68946 types(Caches): add GuildStickerManager and GuildInviteManager (#6268) 2021-08-02 19:58:34 +01:00
Rodry
7e0618f17a fix(GuildChannel): setParent not working (#6276)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-08-02 19:38:30 +01:00
Superchupu
6e0ea020c0 docs: update link of the guide to v13 changes (#6273) 2021-08-02 11:58:21 +01:00
Superchupu
2c452dffb8 docs: add missing semicolon to readme (#6270) 2021-08-02 08:43:36 +01:00
Sugden
e2e4f6518b refactor(*): use async functions (#6210) 2021-08-02 00:47:43 +01:00
Superchupu
626ff85ae7 docs: change example in readme to slash command (#6250)
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-08-01 16:58:41 +01:00
Kevin
7c540764f0 refactor(GuildChannel): use filter method for #members (#6253)
Co-authored-by: ckohen <chaikohen@gmail.com>
2021-08-01 16:58:06 +01:00
Timotej Rojko
774f5b77ec fix(ChannelUpdate): restore accidentally removed line (#6263) 2021-08-01 16:19:44 +01:00
Jiralite
bb56f17760 docs(InteractionResponses): Correct @returns on responses (#6257) 2021-08-01 11:13:29 +01:00
Vlad Frangu
74fc23b3de chore(Deps): update @discordjs/builders (#6259) 2021-08-01 01:42:20 +01:00
ckohen
93e0239c80 fix(Util): fix collection import (#6256) 2021-08-01 01:26:16 +01:00
Vlad Frangu
60028251f7 chore(Deps): update discord-api-type (#6258)
Bite me, Crawl.
2021-08-01 01:25:56 +01:00
ckohen
00c2bf81cd types: use api-types for stricter typings (#6230)
* types: use api-types for stricter typings

* fix: fixes from pr comments

Co-Authored-By: Vlad Frangu <kingdgrizzle@gmail.com>
Co-Authored-By: Antonio Román <kyradiscord@gmail.com>

* types: bigint not BigInt

Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-07-31 22:48:11 +01:00
Jiralite
24931d713b refactor(VoiceState): Change kick to disconnect (#6251) 2021-07-31 21:04:10 +01:00
1Computer1
bb5e648f3d refactor: merge collections with keeping entries at max (#6242) 2021-07-31 21:03:58 +01:00
Rodry
a25e16599a feat(MessageEmbed): add setFields method (#6186)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-07-31 13:15:49 +01:00
Rodry
331a9d3ffc feat(ThreadChannel): add fetchOwner() method (#6207)
* feat(ThreadChannel): add owner and fetchOwner()

* fix(ThreadChannel): remove owner and return ThreadMember with fetchOwner

* fix(ThreadChannel): apply suggestions from code review

Co-authored-by: SpaceEEC <spaceeec@yahoo.com>

* fix(ThreadChannel): correctly point to the manager

* docs(FetchOwnerOptions): update desc to mention threads

* fix(ThreadChannel): fetchOwner can return null

* docs(ThreadChannel): owner is nullable

Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com>

Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com>
2021-07-31 13:00:33 +01:00
Suneet Tipirneni
77c72e625f types(ButtonMessageOptions): make button/link button typings more specific (#6212)
* types(ButtonMessageOptions): make button typings more specific

* Update typings/index.d.ts

Co-authored-by: Tristan Guichaoua <33934311+tguichaoua@users.noreply.github.com>

Co-authored-by: Tristan Guichaoua <33934311+tguichaoua@users.noreply.github.com>
2021-07-31 12:59:58 +01:00
Rodry
434e330754 refactor(Message): accept a single object instead of 3 arguments (#6244)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-07-31 12:22:19 +01:00
ckohen
198a5c490d refactor: move member adding to manager (#6231)
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-07-31 12:21:47 +01:00
ckohen
2a07055cc0 refactor: use guild-wide route for fetching active threads (#6193)
Co-authored-by: SpaceEEC <24881032+SpaceEEC@users.noreply.github.com>
2021-07-31 12:19:41 +01:00
1Computer1
00bae4fe6b refactor: remove extended collection (#6246)
Co-authored-by: iCrawl <buechler.noel@outlook.com>
2021-07-31 12:08:59 +01:00
Jiralite
65ae06429d refactor: Strengthen channel typings in appropriate places (#6232) 2021-07-31 09:52:41 +01:00
Jiralite
82daee576a docs: Refactor a few @returns descriptions (#6228) 2021-07-31 09:51:34 +01:00
ThumusLive
8b52d06ca9 docs(Widget): Add the typedef WidgetChannel (#6182) 2021-07-31 09:51:20 +01:00
1Computer1
bf221f2bef fix: array/keyArray removed (#6245) 2021-07-31 09:45:33 +01:00
ckohen
797727ab6e docs: update readme node version requirement (#6241) 2021-07-31 09:42:19 +01:00
Vlad Frangu
ee3cdc81dd chore(Deps): update discord-api-types to 0.21.0 (#6237) 2021-07-31 00:21:25 +01:00
Shino
d2757cf899 ci(PublishDev): change version number to be sequential (#6235) 2021-07-31 00:11:22 +01:00
ckohen
dbb59ba1b2 feat(Util): add SweptCollection for auto sweeping of caches (#6110)
Co-authored-by: DTrombett <73136330+DTrombett@users.noreply.github.com>
Co-authored-by: 1Computer1 <22125769+1Computer1@users.noreply.github.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: NotSugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: Shino <shinotheshino@gmail.com>
Co-authored-by: SpaceEEC <24881032+SpaceEEC@users.noreply.github.com>
Co-authored-by: Noel <icrawltogo@gmail.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-07-30 22:57:46 +01:00
Jiralite
2675b0866c docs(GuildManager): Correct GuildCreateOptions typo (#6224) 2021-07-30 00:04:45 +01:00
monbrey
cc5f1ce75e docs(Constants): document the Constants object for enum-like usage (#6208)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-07-30 00:04:23 +01:00
ckohen
5f710ae559 refactor(Message): make thread a getter for accuracy (#6215)
* refactor(Message): make thread a getter for accuracy

* docs: reword info block
2021-07-30 00:04:05 +01:00
Jiralite
40b127ee1e docs(Guild): Correct GuildRolePosition typo (#6223) 2021-07-30 00:03:48 +01:00
Jiralite
d310e4fc28 docs(WelcomeChannel): Correct guild return type (#6222) 2021-07-29 12:29:01 +01:00
슈리튬
6b85f900fa fix(TextBasedChannel): Fix MessageCreate handling (#6217) 2021-07-29 11:55:37 +01:00
Kevin
105a194546 docs(Constants): fix StickerTypes typedef (#6218) 2021-07-29 11:53:38 +01:00
A1ex
f44bfc47c7 docs(MessageMentions): fix documentation for members property (#6206) 2021-07-29 11:53:23 +01:00
Jiralite
1009ce169b docs(Guild): Add GuildTextChannelResolvable type definition (#6221) 2021-07-29 11:53:02 +01:00
Jiralite
a69e2f7904 refactor: Match subcommand (group) name casing with Discord's (#6204) 2021-07-29 11:52:06 +01:00
GoldenAngel
4beb64769c chore(Integration): Cleanup removed methods (#6220) 2021-07-29 11:51:47 +01:00
Justin
e000af5c98 feat(WebhookClient): allow creation of clients via URLs (#6192) 2021-07-29 11:48:43 +01:00
SpaceEEC
42a0313034 fix(PermissionOverwrites): throw better error if resolving option fails (#6219) 2021-07-29 11:10:27 +01:00
Justin
be5c0eff34 chore: update discord domain name (#6214) 2021-07-29 02:54:08 +01:00
Scott Bucher
19b242ac10 feat(FetchRecommendedShardsOptions): account for large bot sharding (#6184)
Co-authored-by: Justin <justinleeong@gmail.com>
2021-07-29 02:52:51 +01:00
ckohen
4f1f32f2a5 types(WsEvents): add thread ws events (#6194) 2021-07-28 21:35:49 +01:00
ckohen
68725476b3 fix(Channel): add default for destructured options (#6203) 2021-07-28 21:31:59 +01:00
ckohen
26ba0e1036 feat(GuildAuditLogs): add threads (#6195) 2021-07-28 20:05:01 +01:00
Jiralite
f060a3fcd7 fix: Use string instead of Snowflake for invites (#6202) 2021-07-28 20:04:51 +01:00
Jiralite
5e433b5995 docs(InteractionResponses): Document missing properties (#6178) 2021-07-28 01:30:22 +01:00
ckohen
9679b90872 fix(ThreadChannel): better property handling (#6172) 2021-07-28 01:29:06 +01:00
IRONM00N
30a58dc801 fix: export various classes that are exported in the typings (#6166)
The following classes were exported in the typings but not the `index.js` file:
- `ApplicationCommandPermissionsManager`
- `CachedManager`
- `ClientVoiceManager`
- `DataManager`
- `GuildInviteManager`
- `StageInstanceManager`
- `VoiceStateManager`
- `WebSocketManager`
- `WebSocketShard`
- `AnonymousGuild`
- `GuildPreviewEmoji`
- `InviteStageInstance`
- `InviteGuild`
- `PartialGroupDMChannel`
- `StageInstance`
- `StickerPack`
- `Typing`
- `WelcomeChannel`
- `WelcomeScreen`
- `GuildAuditLogsEntry`
2021-07-27 11:15:49 +01:00
Advaith
b22272f860 feat(Guild): add fetchWidget() for getting widget data (#6180) 2021-07-27 11:15:31 +01:00
Advaith
2f1cc1fc27 feat(ApplicationCommandOptionType): add NUMBER (10) (#6128) 2021-07-27 11:12:43 +01:00
Tiemen
4886ae23ab refactor: only cache commands from own user (#6161) 2021-07-23 20:19:17 +01:00
Milo
4f8ca2936a fix(Typings): type attachments to InteractionUpdateOptions (#6162)
* fix(Typings): type attachments with never

* Update typings/index.d.ts

Co-authored-by: DTrombett <73136330+DTrombett@users.noreply.github.com>

* chore(Typings): fix

* chore(Typings): add fetchReply

Co-authored-by: DTrombett <73136330+DTrombett@users.noreply.github.com>
2021-07-23 20:18:30 +01:00
Shino
690c121aa9 feat(CommandInteractionOptionResolver): add sub-command required option (#6165) 2021-07-23 20:17:34 +01:00
Jiralite
c8ca7bfd2c fix(GuildAuditLog): Assert target to null upon not finding invite codes (#6171) 2021-07-23 01:17:02 +01:00
ckohen
870a0de53c fix(Message): fix typo in sticker_items (#6173) 2021-07-22 22:55:47 +01:00
Jiralite
5e706941fc docs(CommandInteraction): Correct type definition of CommandInteractionOption (#6169) 2021-07-22 12:56:44 +01:00
ckohen
cd47a524af refactor(Message): combine patch methods (#6071) 2021-07-22 09:05:38 +01:00
Shino
328501bd8e refactor(CommandInteractionOptionResolver): add readonly data property (#6156) 2021-07-21 22:22:47 +01:00
Apokalypt
07017a9699 fix(Sticker): replace 'this.guildID' (undefined) by 'this.guildId' in fetchUser (#6160)
Co-authored-by: Apokalypt <enterprise@apokalypt.fr>
2021-07-21 08:39:17 +01:00
Apokalypt
85865058ed types(DataManager): add 'K' to type parameter of 'resolveId' (#6152)
Co-authored-by: Apokalypt <enterprise@apokalypt.fr>
2021-07-21 08:38:55 +01:00
Tristan Guichaoua
1e90be8f7a types(ColorResolvable): readonly tuple (#6153) 2021-07-20 20:20:37 +01:00
Jan
5addcd15d8 refactor(OptionResolver): accept single type instead of an array (#6154) 2021-07-20 20:20:20 +01:00
monbrey
02f55f0971 fix(CommandInteractionOptionResolver): type should be USER (#6148) 2021-07-20 01:46:38 +01:00
Floffah
8ccfd6e07b fix(CommandInteractionOptionResolver): Export CommandInteractionOptio… (#6146)
**Please describe the changes this PR makes and why it should be merged:**
CommandInteractionOptionResolver is exported in the typings, but not in the index.js file

**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
2021-07-20 00:18:19 +01:00
Advaith
54d6a3a070 feat(Sticker): updates, sticker packs, and guild stickers (#5867)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: Tiemen <ThaTiemsz@users.noreply.github.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
Co-authored-by: BannerBomb <BannerBomb55@gmail.com>
Co-authored-by: Noel <icrawltogo@gmail.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-07-20 00:17:21 +01:00
Vlad Frangu
76888e6c1b chore(Deps): update discord-api-types to 0.19.0 (#6147) 2021-07-20 00:15:42 +01:00
Shino
77784aca43 fix(CommandInteraction): change options type from Collection to array (#6139) 2021-07-19 08:02:53 +01:00
Devin
8ea04b295d Updates identity to correct scope name of identify (#6140) 2021-07-19 08:02:37 +01:00
DTrombett
63ce065fc3 refactor: change const enums to interfaces (#6078)
* types(*): revert const enum to enum

* refactor: change const enums to interfaces
2021-07-18 19:29:40 +01:00
GoldenAngel
9f039a8679 feat(GuildPreview): add createdAt & createdTimestamp (#6130)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-07-18 19:18:53 +01:00
eeehh
c40c0f934a fix(GuildChannel): only fetch invites for the specific channel (#6132) 2021-07-18 19:16:48 +01:00
Shino
f293132345 feat(CommandInteraction): add CommandInteractionOptionResolver (#6107)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-07-18 19:16:32 +01:00
HyRo
4d53d0fd11 refactor(ActionsManager): less complex code (#6102)
Co-authored-by: Matt (IPv4) Cowley <me@mattcowley.co.uk>
Co-authored-by: DTrombett <73136330+DTrombett@users.noreply.github.com>
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
Co-authored-by: Gabe616 <60316309+Gabe616@users.noreply.github.com>
2021-07-17 12:25:59 +01:00
Advaith
366f3c910a feat: make Instance#fetch force true by default, and fix force parameter (#6116)
Co-authored-by: Almeida <almeidx@pm.me>
2021-07-17 12:25:23 +01:00
Antonio Román
ef5ba05996 types(Message): mark #thread as nullable (#6129) 2021-07-17 12:25:05 +01:00
Alan
de384047b3 chore(ApiRequest): remove mention of var (#6125)
Co-authored-by: Alan <you@example.comalanlichen1@gmail.com>
2021-07-17 12:22:45 +01:00
Antonio Román
5ca97c9351 refactor: remove timer utilities from Client (#6113) 2021-07-16 13:31:25 +01:00
Joey Smalen
f200f14a40 feat(REST): append additional information to the required User Agent (#6112)
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-07-16 12:27:12 +01:00
DTrombett
8db6df3d1e types(Options): add types for cacheWithLimits (#6095) 2021-07-16 12:20:38 +01:00
Antonio Román
576eee8de2 refactor: remove typing caching (#6114)
Co-authored-by: DTrombett <73136330+DTrombett@users.noreply.github.com>
2021-07-16 12:20:05 +01:00
Shino
4206e35b23 feat(Client): add conditional ready typings (#6073) 2021-07-14 16:19:38 +01:00
DTrombett
60148c6a78 types(Interaction): change inGuild return type (#6094) 2021-07-14 16:14:20 +01:00
Bluenix
a9e7ebd94f types(PartialWebhookFields): add APIMessage to deleteMessage union (#6085) 2021-07-14 16:13:32 +01:00
Hackerboi 69
98c60789a2 types(Interactions): fix function overloads (#6109) 2021-07-13 13:31:55 +01:00
monbrey
1dcad051a8 revert: support for nested arrays of components, fix error handling (#6081) 2021-07-12 07:53:27 +01:00
Matt (IPv4) Cowley
dee5c83fc0 fix(PermissionsOverwrites): only convert type if number (#6092) 2021-07-12 07:53:18 +01:00
Tiemen
a8984bc68c types(Guild): remove fetchVoiceRegions (#6099) 2021-07-11 23:58:16 +01:00
Rodry
d433fe8a08 fix: channel type check in actions (#6086) 2021-07-10 21:51:32 +01:00
SpaceEEC
f72ce7c136 fix(GuildChannel): clone its PermissionOverwriteManager too (#6083) 2021-07-10 13:15:20 +01:00
DTrombett
d6c43a50bd types(Partial): add partial reactions (#6066)
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-07-09 12:25:59 +01:00
iCrawl
5b6be0cebc types(Test): fix overloads for channel create 2021-07-08 22:46:26 +02:00
SpaceEEC
637c8e0fdf fix(PresenceUpdate): use added presence over nullable getter (#6077)
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-07-08 21:43:48 +01:00
Rodry
6301728d35 refactor(Channel): change channel types to UPPER_CASE (#6035) 2021-07-08 21:32:19 +01:00
anandre
b170fb5ce8 docs(InteractionResponses): reply docs example (#6079)
Co-authored-by: DTrombett <73136330+DTrombett@users.noreply.github.com>
2021-07-08 21:16:03 +01:00
BaumianerNiklas
67e9ce4693 docs(InteractionResponses): generalize wording in update to fit other component interaction types (#6074) 2021-07-08 15:39:36 +01:00
BannerBomb
c1eaa78ab7 typings(GuildInviteManager): FetchInvitesOptions (#6076) 2021-07-08 15:39:23 +01:00
1Computer1
9cd5e7ed61 refactor(Managers): rename add to _add (#6060) 2021-07-08 11:34:45 +01:00
DTrombett
28b5ffb4d6 docs(ClientUser): fix shardId nullable (#6072)
* docs(ClientUser): fix shardId nullable

* docs(ClientUser): fix id lowercase for consistency

Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>

Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-07-07 23:22:51 +01:00
Antonio Román
7322547172 types: fixed unreachable overloads (#6062) 2021-07-07 17:34:39 +01:00
DTrombett
58bbcd591e types(ApplicationCommand): fix option name (#6067)
* types(ApplicationCommand): fix option name

* fix(ApplicationCommand): update tests

* fix(ApplicationCommand): fix error param
2021-07-07 13:41:47 +01:00
Antonio Román
98a5b52d8b refactor(ApplicationCommandManager): remove unused assignment (#6063) 2021-07-07 13:41:02 +01:00
Antonio Román
4eb3a2a885 refactor: rename Constants.OPCode to Opcode, moved objects to enums (#6065) 2021-07-07 13:40:36 +01:00
ckohen
755c180659 feat: allow channels from uncached guilds to be returned from fetch (#6034)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-07-06 13:04:26 +01:00
Rodry
2e078e4488 types(*): revert incorrect unknown type changes (#6057)
Co-authored-by: DTrombett <73136330+DTrombett@users.noreply.github.com>
2021-07-05 22:49:34 +01:00
Jan
c0a814fdb3 feat(Collector): better types for events (#6058)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-07-05 22:26:15 +01:00
BannerBomb
4c0426c469 docs: fixed several typings and MessagePayload#create JSDoc (#6059) 2021-07-05 22:26:06 +01:00
SpaceEEC
ded93feb57 refactor(PresenceManager): have Presence extend Base and simplify add (#6056)
* refactor(PresenceManager): have Presence extend Base and simplify add

* style(Presence): add empty line after super call

Co-authored-by: Noel <buechler.noel@outlook.com>

Co-authored-by: Noel <buechler.noel@outlook.com>
2021-07-05 19:53:15 +01:00
SpaceEEC
afbd5db404 refactor(Presences): remove from User, nullable on GuildMember (#6055)
as well as on Client#presenceUpdate
2021-07-05 19:53:00 +01:00
Shubham Parihar
8d9ab741c8 docs(ThreadChannel): fix documentation for setLocked method (#6053) 2021-07-05 18:36:25 +01:00
iAmZiNc
162d89a42f fix(Presence) missing client property definition (#6054) 2021-07-05 18:03:07 +01:00
Almeida
93e2c04ec2 fix(InviteScope): added missing 'bot' scope (#6052) 2021-07-05 16:07:57 +01:00
Antonio Román
03fe6ee4e4 test(Types): add notPropertyOf type-only utility (#6051) 2021-07-05 16:07:45 +01:00
Souji
3022b0f5b1 refactor(Intents): remove computed shorts (#6050) 2021-07-05 16:07:30 +01:00
PanSzelescik
28c57246d1 feat(Message): add 'failIfNotExists' to ClientOptions (#6038)
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-07-05 13:53:40 +01:00
PanSzelescik
31d31293d3 feat(LimitedCollection): export LimitedCollection (#6043)
* feat(LimitedCollection): export LimitedCollection

* fix: remove @private

* fix: typings
2021-07-05 13:53:15 +01:00
monbrey
34708d6d18 fix(SelectMenuInteraction): set values to empty array if not provided (#6045) 2021-07-05 13:39:21 +01:00
Antonio Román
1a27f57950 refactor: remove lastMessage properties from User and GuildMember (#6046) 2021-07-05 13:11:13 +01:00
Jan
676118ab0f refactor(typings): general cleanup (#6047) 2021-07-05 12:55:06 +01:00
monbrey
e3d877d542 fix(Guild): add invite manager property, extend CachedManager (#6049)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-07-05 12:16:34 +01:00
BannerBomb
fe5d56c9b1 fix(TeamMember): Fixed incorrect return types. (#6044) 2021-07-04 22:55:00 +01:00
monbrey
c6e5521687 feat(Client): enforce passing scopes to generateInvite (#6024)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-07-04 22:53:57 +01:00
DraftMan
9e08b02df2 feat(Managers): Add GuildInviteManager (#5889)
Co-authored-by: iShibi <shubhamparihar391@gmail.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: SpaceEEC <SpaceEEC@users.noreply.github.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: iCrawl <icrawltogo@gmail.com>
2021-07-04 22:53:13 +01:00
BannerBomb
c4aa9feee2 types(Options): should extend null (#6042)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-07-04 22:05:16 +01:00
Antonio Román
185e37602b types(Voice): move types to the library's definitions (#6041)
* types(Voice): move types to d.js

* types: added padding lines

Co-authored-by: Noel <buechler.noel@outlook.com>

Co-authored-by: Noel <buechler.noel@outlook.com>
2021-07-04 21:10:33 +01:00
Antonio Román
a7c6678c72 refactor: change xID to xId (#6036)
* refactor: change `xID` to `xId`

* Update src/managers/MessageManager.js

Co-authored-by: Noel <buechler.noel@outlook.com>

Co-authored-by: Noel <buechler.noel@outlook.com>
2021-07-04 19:54:27 +01:00
didinele
281072be44 chore: remove unnecessary getter (#6037) 2021-07-04 15:59:28 +01:00
1Computer1
ab0b3b9a07 fix(Structures): remove Structures (#6027) 2021-07-04 12:26:35 +01:00
Shubham Parihar
db60e367b4 docs(MessageManager): document options param for #edit as required (#6031) 2021-07-04 12:25:59 +01:00
ckohen
2ab32e6bc6 types: better fullPermissions typings (#6028) 2021-07-04 12:25:42 +01:00
ckohen
b62d646271 docs: add Partial typedef (#6029) 2021-07-04 12:25:35 +01:00
Shubham Parihar
d58f0d243c fix(GuildChannel): use map method on cache not its manager (#6032) 2021-07-04 12:25:28 +01:00
monbrey
610b0b4dd6 docs: fix some missed MessageComponent collector methods (#6023) 2021-07-04 00:27:07 +01:00
monbrey
8077e4f4f1 fix(PermissionOverwriteManager): pass ID to API correctly (#6026) 2021-07-04 00:26:44 +01:00
1Computer1
8c7cb0eff8 feat(Managers): add customizable caching for managers (#6013) 2021-07-04 00:26:26 +01:00
Almeida
ec06ba7ad0 docs(*): wrap optional properties with union types in parentheses (#6021) 2021-07-03 21:00:53 +01:00
Shubham Parihar
4bf49809f2 refactor: improve typings and docs related to threads (#5991)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-07-03 20:38:38 +01:00
SkyFlags
7e3001191c fix(GuildChannel): Add missing 'cache' property (#6019) 2021-07-03 19:59:52 +01:00
Vlad Frangu
39db95352c fix: Remove connection.url from open debug message (#6018) 2021-07-03 18:44:48 +01:00
monbrey
374c779f7f feat(InteractionCollector): reworked to be more generic (#5999)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-07-03 13:35:39 +01:00
DTrombett
bd25ff5913 fix(Util): splitMessage not working with array (#6008)
Co-authored-by: muchnameless <12682826+muchnameless@users.noreply.github.com>
2021-07-03 13:25:43 +01:00
Antonio Román
2446ff5251 refactor(Util): make class extend null (#6000) 2021-07-03 13:25:35 +01:00
Ishmaam Khan
e7ad2fe207 feat: PermissionOverwriteManager (#5318)
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-07-03 13:24:38 +01:00
Antonio Román
a11a10525b refactor: rename events to be consistent with WS names (#6010)
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-07-03 13:23:53 +01:00
SpaceEEC
7dd1a8da08 docs(Collector): properly document endReason (#6016) 2021-07-03 13:23:15 +01:00
ckohen
568691ce6a fix: correct permissions checks and cache on update (#6015) 2021-07-03 13:23:01 +01:00
Rodry
4adfc45b5a docs(CreateInviteOptions): fix TargetType link (#6017) 2021-07-03 13:22:35 +01:00
Antonio Román
98e45a5995 feat(Formatters): added new URL utilities and docs (#6014)
* feat(Formatters): added new URL utilities and docs

* refactor: use static class to fix docsgen error

* fix(Typings): declare members as public

* docs(Formatters): add method tags

* docs: remove empty line

Co-authored-by: SpaceEEC <spaceeec@yahoo.com>

Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-07-03 13:22:20 +01:00
Rodry
56b5b7ee82 types(MessageOptions): fix components being optional (#6005) 2021-07-03 08:58:29 +01:00
DTrombett
0dc5dd5808 types(*): create mention types (#6003) 2021-07-03 08:58:18 +01:00
Pravesh Kunwar
1242c5434d types(VoiceState): fix optional params (#5993) 2021-07-03 08:57:41 +01:00
BannerBomb
c40b06cac9 types(ClientUser): updated setAFK signature (#6011) 2021-07-03 08:57:31 +01:00
Tobias Peltzer
e4be666c2c fix(ThreadManager): fixed wrong private and fetchAll check (#6012) 2021-07-03 08:56:35 +01:00
Adrian Paschkowski
3a718d8c62 fix(Typings): Improve components typings in MessageEditOptions (#6002) 2021-07-02 19:54:13 +01:00
Antonio Román
27e217caee chore(Constants): added new error codes (#5975) 2021-07-02 19:53:48 +01:00
Rodry
fbdad6eac3 docs(*): add class links to isX() methods (#6007) 2021-07-02 19:51:59 +01:00
kikorp78
fe6cc0c15d types(MessageSelectMenu): fix typings (#5995) 2021-07-02 00:44:05 +01:00
BannerBomb
726073fef7 docs: WebSocketShard#send and TextBasedChannel#send (#5998) 2021-07-02 00:42:11 +01:00
Antonio Román
1e73c25fbf feat(RoleManager): added edit method, alias Role#edit (#5983)
Co-authored-by: monbrey <rsm999@uowmail.edu.au>
2021-07-01 22:32:03 +01:00
DTrombett
d742814686 docs(Util): methods removed on the base object (#5990) 2021-07-01 17:38:52 +01:00
Rodry
d078dce2f8 ci: deprecate old dev releases on publish (#5992)
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-07-01 17:37:32 +01:00
Hackerboi 69
521d26c57f types(Interactions): fix function overload types (#5989) 2021-07-01 17:37:25 +01:00
Adrian Castro
6edf55c04b fix(ApplicationCommand): fix typo in JSDoc (#5994) 2021-07-01 17:35:10 +01:00
monbrey
941cd86881 types: few missing thread channels (#5988) 2021-07-01 10:01:14 +01:00
monbrey
0eeb2775a5 types(MessageOptions): improved component typings (#5987) 2021-07-01 10:00:33 +01:00
Rodry
58183d425b docs(Partials): add link to the guide (#5982) 2021-07-01 09:58:27 +01:00
monbrey
9ac68670d7 fix(ThreadChannel): check for existence of properties when patching (#5961)
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-07-01 09:58:20 +01:00
Shubham Parihar
71fb33a5fe feat(StageChannel): add createStageInstance method & use better naming convention (#5951)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-07-01 09:58:11 +01:00
ckohen
388e05b4af types(ApplicationCommandPermissionsManager): fix types (#5979) 2021-07-01 09:58:01 +01:00
Rodry
f819416bac docs(MessageSelectMenu): add link to Discord docs (#5984) 2021-07-01 09:57:25 +01:00
DTrombett
a08ce7dddb types(ThreadChannel): make locked and archived param optional (#5980) 2021-06-30 23:45:59 +01:00
Sugden
1e8f01253e refactor: new node features (#5132)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-06-30 21:40:33 +01:00
Shubham Parihar
f108746c15 docs(ThreadManager): fix FetchedThreads typedef and startMessage (#5971) 2021-06-30 17:20:01 +01:00
Shubham Parihar
b7ed6752ac feat(Channel): add isThread typeguard for better TS support (#5978) 2021-06-30 16:19:59 +01:00
Rodry
788d58e5a3 types(*): make hex color types compatible with ColorResolvable (#5973)
* types(*): make hex color types compatible with ColorResolvable

* types(*): create HexColorString type

* types(HexColorString): move to a less awkward place
2021-06-30 14:32:14 +01:00
iCrawl
64f093f9c4 chore: deps 2021-06-30 13:05:02 +02:00
Antonio Román
8c7a28f211 feat(Util): added formatters (#5976) 2021-06-30 09:50:31 +01:00
A1ex
58bc1458d0 docs(Message): Add ThreadChannel as a channel type (#5972) 2021-06-30 06:24:37 +01:00
Mark Fisher
ae37d202a5 types(CommandInteraction): Readd followUp type (#5974) 2021-06-30 06:21:24 +01:00
iCrawl
5842e35881 fix(Typings): erronous RawMessage 2021-06-29 23:38:23 +02:00
monbrey
5e28ff83cb feat(Interactions): option to auto-fetch replies (#5831) 2021-06-29 22:32:33 +01:00
Shubham Parihar
5dfd7dd1bf docs(ThreadManager): fix reason prop of ThreadCreateOptions (#5970) 2021-06-29 22:31:26 +01:00
Jake Ward
3174507d57 types(ThreadManager): add type to ThreadManager#create options (#5969) 2021-06-29 21:03:15 +01:00
DTrombett
edab5afff9 fix(Thread): make archive_timestamp not nullable (#5965) 2021-06-29 20:41:21 +01:00
Antonio Román
1925d01d8f fix(Sharding): strict type context and return (#5933) 2021-06-29 20:36:04 +01:00
Papageorgiadis Savvas
87e8cdd3eb feat(Interaction): add guild guard (#5955)
* feat(Interaction): add guild guard

* fix: remove possibly uncached getters & duplicate method

* fix: boolean ensuring

Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>

Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-06-29 20:35:52 +01:00
Rodry
706c6eae60 ci: add UNIX timestamp to version number (#5967)
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
2021-06-29 20:27:47 +01:00
Shubham Parihar
853be621ac docs(Channel): fix description of thread channel types (#5968) 2021-06-29 20:27:20 +01:00
ckohen
6264c60e97 feat(Managers): new ApplicationCommandPermissionsManager (#5897)
Co-authored-by: SpaceEEC <24881032+SpaceEEC@users.noreply.github.com>
Co-authored-by: Yoshida Tomio <mail@tomio.codes>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-06-29 19:19:48 +01:00
ckohen
bbc48fdad6 chore(Threads): general fixup and catch up on features (#5959)
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-06-29 18:58:51 +01:00
Amish Shah
63a8df1c1f chore(Types): include @discordjs/voice typings (#5941)
Co-authored-by: Noel <buechler.noel@outlook.com>
2021-06-29 18:44:45 +01:00
BannerBomb
5ad83a6a65 fix(Webhook): return void from #delete for consistency. (#5954) 2021-06-29 13:25:01 +01:00
BannerBomb
fb8d5166a8 refactor(Presence): remove second assignment of syncID (#5956) 2021-06-29 11:50:51 +01:00
Antonio Román
acdcb906ae types(ColorResolvable): change string to #${string} (#5950) 2021-06-29 00:42:54 +01:00
Jan
6c447b12e3 fix(Collector): docs and types (#5937) 2021-06-29 00:37:45 +01:00
monbrey
41f718f779 docs: drop string from MessageButtonStyleResolvable (#5944) 2021-06-29 00:37:38 +01:00
Peter Maguire
d38b34756b docs(Features): resolved typo in FATEWAY_PRESENCE_LIMITED (#5952)
* Fix documentation typo

* Update index.d.ts
2021-06-29 00:34:43 +01:00
BaumianerNiklas
d3d19ce49b docs(Webhook): fix thread example in send method (#5953) 2021-06-29 00:34:30 +01:00
monbrey
e37ef3af21 types: define ApplicationCommand enums in lib (#5947) 2021-06-28 12:00:07 +01:00
DraftMan
0a0630c049 revert(BitField): Bring back-compatibility after BitField serialization (#5910) 2021-06-28 11:54:14 +01:00
SkyFlags
dc671c8ac4 fix(Message): Make author of referenced message nullable (#5929) 2021-06-28 11:53:53 +01:00
monbrey
03d3a5cdde types: fix remaining Raw type references, update discord-api-types dep (#5942) 2021-06-27 22:48:11 +01:00
monbrey
b15d825bb3 refactor(MessagePayload): rename APIMessage (#5921) 2021-06-27 12:47:15 +01:00
SpaceEEC
630432b4e2 docs(Channel): make the type news_thread an inline code-block (#5940) 2021-06-27 12:46:37 +01:00
Rodry
e44ae96100 fix(User): fix bot and system properties being incorrect in some cases (#5923) 2021-06-27 12:46:24 +01:00
Antonio Román
985d4d6a43 refactor: removed code and split options (#5918)
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>

BREAKING CHANGE: Removed `APIMessage#split`
BREAKING CHANGE: Removed `MessageEditOptions#code`
BREAKING CHANGE: Removed `BaseMessageOptions#code`
BREAKING CHANGE: Removed `BaseMessageOptions#split`
2021-06-26 23:11:40 +01:00
Jan
0d0c8f07f2 refactor(Collector): make filter an option (#5903)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-06-26 10:57:06 +01:00
monbrey
1439183ad3 feat(MessageComponentInteraction): component getter (#5840)
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
2021-06-26 10:55:37 +01:00
Jake Ward
adecead716 fix(ThreadMemberManager): fix ThreadMemberManager#add and ThreadMemberManager#fetch (#5927) 2021-06-26 10:54:37 +01:00
ckohen
6065b11634 types(ThreadMemberManager): fix incorrect usage (#5928) 2021-06-26 10:54:23 +01:00
SpaceEEC
4714a961b8 fix(Webhook): resolve non-string avatars too (#5914) 2021-06-25 11:11:56 +01:00
Jan
261612596d feat(MessageMentions): add repliedUser (#5905) 2021-06-25 11:07:31 +01:00
Rodry
5af2ef5fbc docs(Thread): add links to discord api docs (#5919) 2021-06-25 00:34:10 +01:00
monbrey
75837a8252 docs(MessageSelectMenu): fix options typings (#5922) 2021-06-25 00:33:58 +01:00
monbrey
e5fcf0bee5 feat(MessageSelectMenu): droppybois (#5692)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-06-24 22:25:16 +01:00
BannerBomb
d984ac9d09 Fixed typos from commit #5570 (#5917) 2021-06-24 22:20:57 +01:00
monbrey
ca2a36b1d7 fix(ApplicationCommand): stringType isn't supposed to be sent to the API (#5916) 2021-06-24 21:57:11 +01:00
ckohen
7346621d15 feat: api v9 and threads (#5570)
Co-authored-by: Noel <icrawltogo@gmail.com>
Co-authored-by: Amish Shah <dev@shah.gg>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
Co-authored-by: SynthGhost <60333233+synthghost@users.noreply.github.com>
Co-authored-by: SpaceEEC <24881032+SpaceEEC@users.noreply.github.com>
Co-authored-by: Elliot <elliot@maisl.fr>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-06-24 20:48:29 +01:00
monbrey
ea49f7ca74 feat(InteractionCreate): move to an Action handler (#5906) 2021-06-24 20:42:56 +01:00
SpaceEEC
ee025b0558 fix(Permissions): allow admin to override in the missing method (#5911) 2021-06-24 20:42:40 +01:00
Rodry
e0efcc6ab0 docs(*): add links to Discord's API objects & data (#5862) 2021-06-24 09:55:44 +01:00
Pronin Egor
6d3d00b445 fix(InteractionResponses): set replied status on editReply (#5899)
Co-authored-by: Noel <buechler.noel@outlook.com>
Co-authored-by: Noel <icrawltogo@gmail.com>
2021-06-24 00:07:33 +01:00
Shubham Parihar
d930c812bb feat: add missing APIError codes (#5898) 2021-06-24 00:04:55 +01:00
monbrey
bd9f56af9a feat(Interactions): improve error handling for ephemeral responses (#5892)
Co-authored-by: muchnameless <12682826+muchnameless@users.noreply.github.com>
2021-06-24 00:03:52 +01:00
monbrey
2d7c12b0e9 fix(Message): flags not being parsed on some edits (#5886)
* fix(Message): flags not being parsed on some edits

* refactor(MessageManager): access cache once
2021-06-24 00:02:30 +01:00
Jan
1816a93b1b refactor: remove exported shortcuts to util methods (#5904) 2021-06-23 10:47:17 +01:00
Shubham Parihar
6cebeae15e docs: move embeds field into BaseMessageOptions (#5902) 2021-06-22 15:25:18 +01:00
Antonio Román
edf6f0ca70 docs(Readme): remove dependencies badge (#5901) 2021-06-22 11:09:23 +01:00
Brage
3d96a33bd0 docs(AnonymousGuild): add missing extends tag (#5896) 2021-06-22 10:24:04 +01:00
Shubham Parihar
c850ae1027 feat: add APIError codes for stage instance (#5888) 2021-06-20 15:48:02 +01:00
ckohen
174b7a7f9c fix(Guild): don't patch before instance properties (#5885)
Co-authored-by: BannerBomb <BannerBomb55@gmail.com>
2021-06-20 15:47:30 +01:00
Jacob Morrison
1f8f3ab0f8 fix(presenceUpdate): fire when only state/details change on an activity (#5846) 2021-06-19 17:27:54 +01:00
Souji
44e2ee7b20 feat(WelcomeScreen): welcome screens (#5490)
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
Co-authored-by: izexi <43889168+izexi@users.noreply.github.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-06-19 16:44:45 +01:00
Brage
807ea2d3c1 docs(VoiceState): channel can be null (#5872)
The docs does not show that VoiceState#channel can be null
![Docs Image](https://i.imgur.com/fLqRBqm.png)
This should fix the issue
2021-06-18 16:37:57 +01:00
Tyler Resch
e3ed74a5e8 docs(ReplyMessageOptions,MessageEditOptions): replaced embed with embeds (#5860)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-06-18 14:42:53 +01:00
Shubham Parihar
2d12db000f feat: stage instance invite (#5856)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-06-18 00:01:18 +01:00
Shubham Parihar
a3cbcca13d feat(Guild): add enum for premium_tier (#5868) 2021-06-16 15:33:01 +01:00
monbrey
a0b7d95e36 types(MessageReactionResolvable): add string (#5863) 2021-06-16 10:29:14 +01:00
Antonio Román
6cceb936a7 refactor(Package): remove runkitExampleFilename (#5866) 2021-06-16 10:29:02 +01:00
Shubham Parihar
f7eeccba4b feat(*): use enums for consistency and speed (#5843)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-06-15 12:33:31 +01:00
Rodry
671436cbb8 fix(Message): editedTimestamp defaulting to 0 (#5847) 2021-06-15 12:02:56 +01:00
monbrey
9dda9b742f refactor(awaitMessageComponentInteraction): use options object for lib consistency (#5852) 2021-06-15 12:02:48 +01:00
Jiralite
96a4e7b86e docs: Consistent application name usage (#5853) 2021-06-15 12:02:39 +01:00
ThumusLive
038ee99604 feat(Widget): wrapper for widget.json (#5619)
Co-authored-by: monbrey <rsm999@uowmail.edu.au>
Co-authored-by: BannerBomb <BannerBomb55@gmail.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: Noel <icrawltogo@gmail.com>
2021-06-15 12:02:18 +01:00
Tyler Resch
a6dae75d3a docs(TextBasedChannel#send): update embeds example (#5857) 2021-06-15 11:59:53 +01:00
Shubham Parihar
918921e821 feat: stage instances (#5749)
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-06-14 12:57:37 +01:00
muchnameless
a1f94f670e fix(ApplicationCommand): default option.required fix (#5848) 2021-06-14 08:10:05 +01:00
Shubham Parihar
1ac9a2eb5b refactor(*): make typedefs for all options params (#5785)
Co-authored-by: Rodry <38259440+ImRodry@users.noreply.github.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-06-13 19:32:54 +01:00
monbrey
01a1fd615b fix(Guild): setChannelPositions null parenting (#5841) 2021-06-13 19:31:06 +01:00
Rodry
77c1f15c9f fix(ApplicationCommand): default option.required to false (#5838) 2021-06-13 19:31:00 +01:00
Papageorgiadis Savvas
d5bb7585da types(GuildApplicationCommandManager): allow undefined command (#5837)
Co-authored-by: Almeida <almeidx@pm.me>
2021-06-13 19:30:34 +01:00
Almeida
a0a56e2cb3 types: corrected shard broadcastEval (#5834) 2021-06-13 19:30:28 +01:00
Jan
4dbcaf76c3 refactor(GuildPreviewEmoji): make roles an array (#5720) 2021-06-13 19:30:20 +01:00
Jan
02693bc02f refactor(APIMessage): remove unused declarations (#5836) 2021-06-12 12:11:57 +01:00
monbrey
9376ee42f4 docs(ButtonInteraction): fix typo (#5835) 2021-06-12 12:11:48 +01:00
ckohen
7111b4cd5f refactor: fetch options consistency (#5824) 2021-06-12 12:10:35 +01:00
monbrey
08cffd6a30 types(MessageComponentInteraction): update should return Promise<void> (#5829) 2021-06-12 12:10:24 +01:00
Shubham Parihar
29173bf814 fix(GuildManager): #create throws when systemChannelFlags is undefined (#5832) 2021-06-12 12:10:13 +01:00
Matt (IPv4) Cowley
c5859337b6 fix(GuildChannel): don't force parentID/permissionOverwrites to empty on create (#5823) 2021-06-12 12:10:01 +01:00
Adrian Castro
99ff715137 feat(*): document and support embeds field in message create endpoint (#5792)
Co-authored-by: ckohen <chaikohen@gmail.com>
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
2021-06-11 23:45:17 +01:00
Matt (IPv4) Cowley
6df36232a0 fix(GuildChannel): improve empty overwrite handling for permissionsLocked (#5821) 2021-06-11 23:45:05 +01:00
Antonio Román
9e5106d90e docs: removed topics and FAQ from the repository (#5820)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
Co-authored-by: ckohen <chaikohen@gmail.com>
2021-06-11 23:41:49 +01:00
ckohen
24e5868818 fix(ApplicationCommands): allow managing commands for uncached guilds (#5729)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-06-11 23:26:24 +01:00
Jan
e990c35476 fix(ClientApplication): freeze flags (#5811) 2021-06-11 23:22:10 +01:00
Shubham Parihar
a5a6e22316 fix(*): typedefs and typings for image & webhook options (#5805) 2021-06-11 23:22:01 +01:00
SpaceEEC
19d0405aa5 refactor(GuildChannel): use Permissions.defaultBit over 0n (#5822) 2021-06-11 23:21:51 +01:00
Antonio Román
fdef940127 refactor: remove all voice code (#5818)
* refactor: remove all voice code

* refactor: remove even more remnants
2021-06-11 23:21:34 +01:00
Almeida
93b0a4e005 fix(TextBasedChannel): allow passing an APIMessage with split (#5815)
* fix(TextBasedChannel): allow passing an APIMessage with split

* fix(Webhook): allow passing an APIMessage with slit
2021-06-11 22:54:29 +01:00
Ratul Saha
19fd1622f5 types(Extendable): add ButtonInteraction (#5802) 2021-06-11 22:54:00 +01:00
Jan
e3e466d3e5 refactor(MessageEmbed): remove files (#5813)
* refactor(MessageEmbed): remove files

* fix: test
2021-06-11 21:36:31 +01:00
Juruel Keanu Lorenzo
a7ebb2145c fix(PermissionOverwrites): optional allow/deny OverwriteData (#5810) 2021-06-11 21:31:11 +01:00
Adrian Paschkowski
935f819207 fix(Typings): Fix BitField toJSON/valueOf return types (#5806) 2021-06-11 21:30:58 +01:00
Almeida
5fb6c0dd14 chore(npm): ignore unnecessary files (#5816)
* chore(npm): ignore unnecessary files

* use package#files instead of npmignore
2021-06-11 21:30:34 +01:00
Antonio Román
55ad6f0e23 docs(README): re-add install command, remove voice remnants (#5817) 2021-06-11 21:30:09 +01:00
Jan
77e28cf65b fix(Hooks): make husky hooks executable (#5812) 2021-06-11 17:18:05 +01:00
Mark Fisher
41673b7382 fix(GuildChannel): clone errors when options.name isn't provided (#5804) 2021-06-11 11:04:45 +01:00
SpaceEEC
53d8e49dca fix(WebSocketShard): don't catch errors thrown in event handlers (#5803) 2021-06-11 10:46:14 +01:00
Tyler Resch
f5f3f77286 docs(MessageEmbed): deprecation advisory for type (#5774)
Co-authored-by: DTrombett <73136330+DTrombett@users.noreply.github.com>
Co-authored-by: Noel <icrawltogo@gmail.com>
2021-06-10 19:35:35 +01:00
SpaceEEC
097c7b9cdd fix: don't patch missing properties from partial payloads (#5796)
* fix: don't patch missing properties from partial payloads

* fix(GuildChannel): initialize permissionOverwrites in the constructor

* refactor(GuildChannel): remove redundant if
2021-06-10 17:42:45 +01:00
Shubham Parihar
ffabec3a5e feat(Guild): add enum for mfa_level (#5797) 2021-06-10 17:19:08 +01:00
SpaceEEC
2f5424bdac fix(GuildChannel): spread clone options to avoid infinite recursion (#5800) 2021-06-10 17:07:12 +01:00
SpaceEEC
18ac72e457 feat(RequestHandler): emit more info when a rate limit was hit (#5801)
* feat(RequestHandler): emit more info when a rate limit was hit

* emit 'None' when no sublimit was hit

Co-authored-by: Antonio Román <kyradiscord@gmail.com>

Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-06-10 17:06:11 +01:00
SpaceEEC
eb98e33a85 fix(Webhook): throw an error if no token is available when it's required (#5798) 2021-06-10 17:05:45 +01:00
Shubham Parihar
e0ab836b2d feat: add new APIErrors (#5794) 2021-06-10 17:05:37 +01:00
SpaceEEC
ea0e06f980 fix(ClientPresence): produce valid activities for set presences (#5799) 2021-06-10 17:05:27 +01:00
SpaceEEC
68f7aebcaf fix(BitField): ensure missing returns an array of strings (#5795) 2021-06-10 17:05:17 +01:00
Souji
a1f763ee75 refactor(Guild): remove region from guild and manager methods (#5766) 2021-06-10 15:09:57 +01:00
u9g
fbcbb29884 feat(Util): allow array for StringOptions' char (#5566)
Co-authored-by: Voltrex <62040526+VoltrexMaster@users.noreply.github.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Papaia <43409674+papaia@users.noreply.github.com>
Co-authored-by: Noel <icrawltogo@gmail.com>
2021-06-10 10:24:45 +01:00
Shubham Parihar
eb0291d9a5 feat(GuildAuditLogs): make #target a channel for channel related logs (#5781)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-06-10 10:24:36 +01:00
ckohen
35781597d0 fix(ApiMessage): only pass objects as options directly (#5793)
* fix(ApiMessage): only pass objects as options directly

* refactor: inline if with ternary
2021-06-10 08:41:01 +01:00
Austrian
35c2225f50 docs(Messages): fix examples in messages after changes in #5758 (#5791) 2021-06-09 19:33:07 +01:00
Jiralite
4511624e79 docs(ApplicationCommand): Typos in ApplicationCommandPermissionData (#5789) 2021-06-09 19:32:49 +01:00
Amish Shah
c6aeebb18d feat(Sharding*): contexts for broadcastEval (#5756)
* feat(ShardClientUtil): add parameterList to broadcastEval

* feat(ShardingManager): add parameterList to broadcastEval

* chore: update typings

* refactor(Sharding*): use BroadcastEvalOptions

* chore: update typings

* docs: use serializable instead of stringifiable

* refactor: don't set broadcastEval default context

Co-authored-by: Antonio Román <kyradiscord@gmail.com>

* chore: fix inaccuracy in typings

* refactor(Sharding*): remove string-based broadcastEval

* fix(ShardingManager): incorrect usage of _broadcastEvalRaw

* refactor(ShardingManager): remove unnecessary method

* refactor(Sharding*): type check the eval script

* fix(ShardingManager): return Promise rejection rather than throwing an error

Co-authored-by: SpaceEEC <spaceeec@yahoo.com>

* chore: fix typings

Co-authored-by: SpaceEEC <spaceeec@yahoo.com>

Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-06-09 18:14:33 +01:00
Amish Shah
7b2e12b102 feat(Voice): implement support for @discordjs/voice (#5402) 2021-06-09 14:21:19 +01:00
monbrey
c4f1c75efa feat: general component improvements (#5787) 2021-06-09 13:59:12 +01:00
Kevin
0156f693e0 fix(BitField): throw an error if bit to resolve is undefined (#5565)
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-06-09 13:56:40 +01:00
Jan
0139e102e3 docs(GuildMemberManager): fix docs for #search() (#5784) 2021-06-09 13:15:53 +01:00
Ishmaam Khan
e798fb720e feat(GuildChannelManager): add 'fetch' method (#4966)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: Avocado <43632131+Awoocado@users.noreply.github.com>
2021-06-09 13:12:33 +01:00
Adrian Castro
0467a9075f refactor: enforce single param on sending/editing methods (#5758)
Co-authored-by: ckohen <chaikohen@gmail.com>
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-06-09 13:12:16 +01:00
Adam Gauthier
dda5ee2e9f refactor: guildAvailable, typingStop from Constants (#4861)
Both of these events no longer exist and should not be exposed in
Constants. Typings have been adjusted to correspond to Constants.Events.
2021-06-09 10:43:57 +01:00
Jan
ae78a336e1 fix: remove remnants of awaitMessageComponentInteractions (#5783) 2021-06-09 08:45:34 +01:00
Ven
16f261e773 feat(Rest): optional ratelimit errors (#5659)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-06-09 08:45:04 +01:00
monbrey
c2b3ed09a0 feat: promisified single interaction collection (#5770) 2021-06-08 20:52:27 +01:00
Kevin
32d8c8ba94 docs: CommandInteraction#channelID is type of Snowflake (#5776) 2021-06-08 14:16:37 +01:00
Nordiago
84e5b075b4 refactor(Interactions): move Structures import out of switch block (#5763) 2021-06-08 14:16:05 +01:00
Shubham Parihar
e980948de5 fix(*): add missing imports for custom errors (#5767) 2021-06-07 13:09:43 +01:00
meister03
d1c5b6fe9e fix(ShardingManager): client error event cannot be emitted (#5559)
Co-authored-by: monbrey <rsm999@uowmail.edu.au>
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-06-07 13:09:23 +01:00
Souji
65dc00f321 feat(Message): applicationID for interaction responses (#5765) 2021-06-07 09:58:38 +01:00
Souji
bf191df9c0 feat(Client): make use of with_expiration in #fetchInvite (#5764) 2021-06-07 09:58:26 +01:00
Shubham Parihar
4567cd4ca2 docs(InteractionDeferOptions): correctly define the typedef (#5769) 2021-06-07 09:33:12 +01:00
monbrey
657635c1c0 fix: add components to MessageOption typedefs (#5768) 2021-06-07 09:32:50 +01:00
ckohen
dec191aa1e feat(Interactions): add InteractionWebhook for better internals (#5712) 2021-06-06 00:41:23 +01:00
Rodry
1d57754d46 fix(Interaction): add missing types and fix docs lists (#5762)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-06-05 21:05:27 +01:00
Shubham Parihar
2901fd595b fix(Webhook): #editMessage throws error when content is null (#5757) 2021-06-05 20:26:12 +01:00
SpaceEEC
f0dad26a5b fix(MessageComponentInteraction): correctly type defer method (#5760) 2021-06-05 20:25:39 +01:00
Shubham Parihar
f7e420bf29 docs: add new guild features (#5755) 2021-06-05 11:04:56 +01:00
monbrey
c6696d8399 types: extend MessageComponentInteractionCollector correctly (#5752) 2021-06-05 11:04:31 +01:00
TheMaestroo
cf224560bc fix(RoleManager): bug in #create (#5730)
Co-authored-by: ckohen <chaikohen@gmail.com>
2021-06-05 07:14:44 +01:00
monbrey
cbd7f2b9aa feat(MessageComponents): clickybois (MessageButton, MessageActionRow, associated Collectors) (#5674)
Co-authored-by: Vicente <33096355+Vicente015@users.noreply.github.com>
Co-authored-by: Shubham Parihar <shubhamparihar391@gmail.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: BannerBomb <BannerBomb55@gmail.com>
Co-authored-by: Arechi <22101241+Arechii@users.noreply.github.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-06-04 16:49:46 +01:00
Shubham Parihar
df9b67894a docs(Message): fix content param in #edit not showing as nullable (#5748) 2021-06-03 23:08:40 +01:00
iCrawl
43fc40e9b4 types: fix awaitReactions typings for returned collection 2021-06-03 20:29:02 +02:00
Shubham Parihar
a2f0c11474 fix(Message): update typings and docs related to #edit (#5745)
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
2021-06-03 19:18:13 +01:00
Rodry
ff4d6dded5 types: change remaining string IDs to Snowflakes (#5737) 2021-06-03 19:17:31 +01:00
Casper
3e9ce35023 fix(Typings): add missing typings for HttpError -> requestData (#5742)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-06-03 19:17:05 +01:00
SpaceEEC
99e2ca408b debug(WebSocketShard): emit intents used in identify (#5744) 2021-06-03 16:18:21 +01:00
Vlad Frangu
db0d7d4ea8 feat(Esm): use gen-esm-wrapper instead of manually making the file (#5700) 2021-06-03 16:01:49 +01:00
Jan
b317d86a93 docs: all the missing object -> Object changes (#5738) 2021-06-03 15:57:46 +01:00
Jan
bfe01b52ab fix(MessageEmbed): import custom RangeError class (#5740) 2021-06-03 15:54:19 +01:00
Justin
02b3cca522 chore: update the color of the discord.js server badge (#5739)
This uses the hex code 5865F2, which is the new blurple of Discord.
2021-06-03 15:53:51 +01:00
Vlad Frangu
ef92339d07 feat(Rest): show the data that is sent to Discord when an errors occurs (#5701) 2021-06-03 09:35:09 +01:00
Shubham Parihar
af2fad9473 fix(CommandInteraction): cmds with no options throw error (#5734) 2021-06-03 09:34:40 +01:00
Shubham Parihar
fdad140997 feat(CommandInteraction): make options a collection (#5705) 2021-06-02 17:44:50 +01:00
Lupa
5141ea4f06 fix(CommandInteraction): channel type should be text based channels (#5690)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-06-02 11:05:35 +01:00
Andreas Clausen
d21e6af1d2 fix(GuildMemberManager): allow moving members to any non-text channel (#5681) 2021-06-02 10:57:04 +01:00
Shubham Parihar
678b7da5b3 docs: remove traces of StringResolvable (#5727) 2021-06-02 10:55:56 +01:00
Shubham Parihar
086c3f0799 fix: interfaces not importing due to re-export of Snowflake (#5723)
Co-authored-by: Noel <icrawltogo@gmail.com>
2021-06-02 01:01:59 +01:00
Jan
53d952a4ce refactor: remove _roles from pseudo-managers (#5721) 2021-06-01 22:35:11 +01:00
Souji
7b85a7259f feat(*): enforce strings (#4880)
BREAKING CHANGE: Removes all Resolvables for only string inputs

Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-06-01 16:31:49 +01:00
monbrey
66a6a1fced types(Snowflake): export the type (#5722) 2021-06-01 07:02:59 +01:00
iCrawl
7f0d93a2da chore: pull config files out of package.json 2021-06-01 00:06:52 +02:00
SpaceEEC
b212b64214 feat(Message): allow editing files into messages (#5718) 2021-05-31 20:56:26 +01:00
Shubham Parihar
256d1b0dfc docs(Webhook): update typings and docs for #editMessage (#5713) 2021-05-31 20:56:08 +01:00
Noel
76db642543 types: use Snowflake type (#5717)
* types: use Snowflake type

* Update typings/index.d.ts

Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>

Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
2021-05-31 20:55:18 +01:00
Souji
d52bcd46ec feat: easier guards for channelUpdate (#5716)
* feat: easier guards for channelUpdate

* typings: more explicit typings for client events involving channels

* docs: event doc consistency regarding channel types
2021-05-31 16:38:37 +01:00
iCrawl
652c683da7 ci: fix publish action 2021-05-31 03:23:48 +02:00
dependabot[bot]
0b169792af chore(deps): bump ws from 7.4.5 to 7.4.6 (#5707)
Bumps [ws](https://github.com/websockets/ws) from 7.4.5 to 7.4.6.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.4.5...7.4.6)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-30 23:04:12 +01:00
Jeroen Claassens
91efe5a611 ci(publish-dev): improve resolving of next version (#5710) 2021-05-30 23:03:35 +01:00
iCrawl
01bb2ac97b ci: publish action for automatic master releases 2021-05-30 21:33:02 +02:00
Adrian Castro
6567ba821a fix(PermissionOverwrites): fix typo in typedef jsdoc (#5704) 2021-05-30 18:59:51 +01:00
Jan
48d6850d9a feat: add support for fetching multiple guilds (#5472)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Noel <icrawltogo@gmail.com>
2021-05-29 22:37:45 +01:00
Vanished
e300518597 Added Certified Moderator badge flag. (#5642)
Co-authored-by: Shubham Parihar <shubhamparihar391@gmail.com>
2021-05-29 15:29:29 +01:00
ckohen
0b179c87f1 cleanup(Client): guard emitting GMU and PU on user updates (#5655) 2021-05-29 15:28:41 +01:00
Ed L
7d7d2a53b1 docs(Message): add example for message.reply (#5332)
Co-authored-by: Papaia <43409674+papaia@users.noreply.github.com>
2021-05-29 15:27:33 +01:00
Rodry
47bbdf415c docs(TextChannel): warning about setRateLimitPerUser NewsChannel (#5403) 2021-05-29 15:26:30 +01:00
Antonio Román
a73a5cf914 fix(Types): make event listeners accept async callbacks (#5602) 2021-05-29 12:28:21 +01:00
Jan
add924cdb2 docs: fix InteractionDeferOptions typedef (#5694) 2021-05-29 12:24:28 +01:00
Shubham Parihar
c89bdd7566 fix(GuildEmojiRoleManager): bug in #remove (#5666) 2021-05-28 11:09:51 +01:00
SpaceEEC
b90b0c3cfa fix(ApplicationCommandOptionData): options property should be itself (#5679)
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
2021-05-27 12:14:13 +01:00
Rodry
7d9818e21a docs(ColorResolvable): Add Fuchsia to ColorResolvable typedef (#5676)
Also moved DARKER_GREY to its place in the Colors export on Constants.js
2021-05-27 12:13:58 +01:00
Shubham Parihar
3fe7add2c5 feat(Guild): add the new nsfw_level property (#5660)
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
Co-authored-by: Noel <icrawltogo@gmail.com>
2021-05-27 12:12:52 +01:00
Shubham Parihar
b40027beb9 types(PermissionOverwriteOptions): remove unused interface (#5651) 2021-05-27 12:12:44 +01:00
SpaceEEC
9f491ffeb9 fix(APIMessage): document Interaction as valid MessageTarget (#5678) 2021-05-27 11:54:42 +01:00
Shubham Parihar
840ad0a35a fix(Message): bug in #suppressEmbeds due to #5612 (#5644) 2021-05-26 12:09:35 +01:00
Shubham Parihar
3589e0f442 docs: add new typedef to properly doc InteractionReplyOptions (#5632) 2021-05-26 12:09:25 +01:00
Jan
ed593c91fb feat: InteractionDeferOptions (#5641) 2021-05-26 12:09:14 +01:00
iCrawl
5f6ec2211d fix: lint-staged for typescript files 2021-05-26 11:09:56 +02:00
Noel
3ac6d550ca chore: fix husky install (#5671) 2021-05-25 21:36:26 +01:00
Matt (IPv4) Cowley
0ca200f322 chore: set minimum npm version (#5663) 2021-05-24 19:58:42 +01:00
cherryblossom000
b376f31af9 fix(DataResolver): fix circular dependency error with GuildTemplate (#5622) 2021-05-22 21:40:44 +02:00
Antonio Román
14c6802438 refactor(Deps): use async-queue package (#5662) 2021-05-22 21:10:20 +02:00
Noel
f8703e3e59 chore: general cleanup (#5661) 2021-05-22 11:40:30 +02:00
Jan
03256bd9f8 fix(ApplicationCommandManager): limit permission methods to guilds (#5613)
* fix(ApplicationCommandManager): limit permission methods to guilds

* docs: add warn tags

* feat: improve error message

* style: eslint

* chore: make error name more verbose
2021-05-22 10:02:24 +02:00
Shubham Parihar
56d44fbf1c fix(CommandInteraction): update typings and docs for #editReply (#5630) 2021-05-22 09:58:06 +02:00
Casper
38bf24a6e5 chore(Colors): use new Discord colors (#5624)
* chore(Colors): use new Discord colors

* chore(Colors): add fuchsia color

* chore(Colors): add fuchsia color to ColorResolvable
2021-05-22 09:52:48 +02:00
Shubham Parihar
c8d20a456b docs(Guild): add proper punctuation to #fetchOwner jsdoc (#5645) 2021-05-18 23:21:57 +02:00
Vlad Frangu
ab82cafcde docs: correct casing of object -> Object in AuditLogChange (#5636) 2021-05-15 23:25:06 +02:00
Juruel Keanu Lorenzo
a6079bc9ce fix(ApplicationCommand): return string equivalent of ApplicationCommandOptionType (#5617) 2021-05-15 00:40:41 +02:00
monbrey
68b40dd91d feat(CommandInteraction): ephemeral followup messages (#5618)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-05-15 00:40:23 +02:00
monbrey
c7334363b3 fix: resolve emoji in Message#react (#5614) 2021-05-13 17:48:07 +02:00
monbrey
73f4114f59 fix: typo in GuildMemberManager (#5616) 2021-05-12 17:51:50 +02:00
Souji
f831872125 feat(GuildChannel): createInvite target options (#5514)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: Advaith <advaithj1@gmail.com>
2021-05-11 22:25:09 +02:00
anandre
ff2f7372f2 feat(MessageEmbed): remove normalizeField validation (#5459) 2021-05-11 22:24:35 +02:00
Vicente
d219ecd05c docs(GuildChannelManager): add stage option (#5608) 2021-05-11 22:23:58 +02:00
monbrey
2e2464bf07 feat(GuildMemberManager): extend API coverage (#4872)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-05-11 22:23:42 +02:00
Synbulat Biishev
668cd471a1 fix(Client) added a forgotten keyword "this" (#5598) 2021-05-11 22:23:27 +02:00
Shubham Parihar
58763b0e91 feat(GuildChannel): make createOverwrite and updateOverwrite not dependent on cache (#5489)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-05-11 22:23:09 +02:00
SpaceEEC
74e97ef91b fix(Message): editing with MessageEmbed or APIMessage (#5612) 2021-05-11 22:22:48 +02:00
Nojay-Games
2eac84296b fix(VoiceReceiver): fix memory leak (#5609)
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-05-11 13:33:45 +02:00
monbrey
c56c4a8dc8 feat(MessageManager): extend API coverage (#4869)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: izexi <43889168+izexi@users.noreply.github.com>
Co-authored-by: Advaith <advaithj1@gmail.com>
2021-05-11 00:32:15 +02:00
Shubham Parihar
7ce741dacd feat(Message): add ReplyMessageOptions for #reply (#5296) 2021-05-10 23:58:19 +02:00
uhKevinMC
31b4390042 feat(ShardingManager): add options typings (#5583)
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-05-10 23:54:32 +02:00
Shubham Parihar
2345c6db0c typings(WebhookMessageOptions): omit reply instead of replyTo (#5610) 2021-05-10 22:48:32 +02:00
Ishmaam Khan
d455cb65a6 feat(GuildChannel#clone): support for position property (#5236) 2021-05-10 12:41:14 +02:00
MBR-0001
6d09160f5b feat: GuildBanManager (#5276)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
Co-authored-by: izexi <43889168+izexi@users.noreply.github.com>
Co-authored-by: Shubham Parihar <shubhamparihar391@gmail.com>
2021-05-10 12:35:25 +02:00
Rodry
4a06dd1295 docs(MessageEmbed): MessageEmbedOptions typedef (#5466)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-05-10 12:31:35 +02:00
ckohen
eaf332f83f refactor(*): return the invalid element when erroring from Array (#5314) 2021-05-10 12:28:36 +02:00
ckohen
1ecda83da7 refactor(MessageOptions): move replyTo to reply#messageReference and add failIfNotExists (#5298)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Shubham Parihar <shubhamparihar391@gmail.com>
2021-05-10 12:27:36 +02:00
Justin
533c2471c2 docs: update invite link, change version in the intro (#5592) 2021-05-10 10:57:20 +02:00
Advaith
135abccd9c feat(APIRequest): support setting global headers in HTTPOptions (#5586)
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-05-10 10:56:56 +02:00
monbrey
1398431bca feat(Message): replace referencedMessage with fetchReference (#5577) 2021-05-10 10:56:46 +02:00
Jan
ca9e5a0ee1 feat(Message): allow removing attachments (#5557) 2021-05-10 10:56:33 +02:00
Adrian Castro
3392eb7de2 fix(ApplicationCommandManager): fix typo in JSDoc (#5603) 2021-05-10 10:55:58 +02:00
dependabot[bot]
0e40f9b868 chore(deps): bump hosted-git-info from 2.8.8 to 2.8.9 (#5595)
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-08 01:25:43 +02:00
Jan
9f74f95f69 feat: add support for application command events (#5596) 2021-05-08 01:25:27 +02:00
Amish Shah
452ac55a28 chore: update package author email address 2021-05-07 20:15:02 +01:00
dependabot[bot]
b456ff1090 chore(deps): bump lodash from 4.17.20 to 4.17.21 (#5594)
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-07 17:26:33 +02:00
dependabot[bot]
043a25992a chore(deps): bump handlebars from 4.7.6 to 4.7.7 (#5593)
Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.7.6 to 4.7.7.
- [Release notes](https://github.com/wycats/handlebars.js/releases)
- [Changelog](https://github.com/handlebars-lang/handlebars.js/blob/master/release-notes.md)
- [Commits](https://github.com/wycats/handlebars.js/compare/v4.7.6...v4.7.7)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-07 17:24:24 +02:00
Jan
f7643f7bbe feat: interactions (#5448)
Co-authored-by: izexi <43889168+izexi@users.noreply.github.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: Advaith <advaithj1@gmail.com>
Co-authored-by: Shiaupiau <stu43005@gmail.com>
Co-authored-by: monbrey <rsm999@uowmail.edu.au>
Co-authored-by: Tiemen <ThaTiemsz@users.noreply.github.com>
Co-authored-by: Carter <carter@elhnet.net>
2021-05-07 17:22:33 +02:00
Antonio Román
af00ec8970 refactor(Sticker): rename Snowflake variable (#5575) 2021-04-30 22:32:52 +02:00
Jan
f830eb7101 fix(Sticker): file renamed to SnowflakeUtil (#5573) 2021-04-30 22:26:55 +02:00
Junseo Park
026afc2c1a feat(Sticker): added Sticker (#4909)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: monbrey <rsm999@uowmail.edu.au>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
Co-authored-by: Tristan Guichaoua <33934311+tguichaoua@users.noreply.github.com>
Co-authored-by: Advaith <advaithj1@gmail.com>
Co-authored-by: izexi <43889168+izexi@users.noreply.github.com>
Co-authored-by: Mestery <48163546+Mesteery@users.noreply.github.com>
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
2021-04-30 21:53:25 +02:00
izexi
63398d6ae4 feat(Webhook): add 'fetchMessage' method (#5530) 2021-04-30 21:49:32 +02:00
Souji
d9fa180cf9 feat(GuildManager): allow system channel flags in create (#5504) 2021-04-30 21:48:57 +02:00
Souji
4866e2672f feat(Guild): setChannelPositions parent, lockPermissions keys (#5507)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-04-30 21:48:51 +02:00
ckohen
a5d41c9f6c refactor(RequestHandler): use x-ratelimit-reset-after when present (#5511) 2021-04-30 21:48:37 +02:00
Robert Coe
cdcc50f365 refactor: remove error-silencing try/catch on event handler imports (#5542) 2021-04-30 21:48:19 +02:00
Souji
5397021efb fix(Emoji): name can be null (#5513) 2021-04-30 21:47:15 +02:00
monbrey
c9b53539d5 refactor(Sharding): use options objects (#5510)
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-04-30 21:46:20 +02:00
Souji
116ecf246e feat(Webhook): sourceGuild, sourceChannel, improve owner (#5508) 2021-04-30 21:44:23 +02:00
Shubham Parihar
9572521e3c fix(GuildMemberRoleManager): unable to remove roles when passed an array (#5556) 2021-04-30 21:43:14 +02:00
Souji
8a059cccb8 feat(Guild): allow description and features in edit (#5505) 2021-04-27 09:36:48 +02:00
Souji
2c54f72670 chore(UserFlags): remove system flag (#5517) 2021-04-25 18:59:13 +02:00
Skick
705d7b36af docs(VoiceState): #setRequestToSpeak and #setSuppressed returns a Promise instead of void (#5558) 2021-04-23 18:24:22 +02:00
Jan
1b827fe136 refactor: add discord-api-types as a dependency (#5539) 2021-04-23 02:18:07 +02:00
GoldElysium
0d68ca8eb9 fix: typings for 'Message' (#5518) 2021-04-21 02:44:19 +02:00
Yoshida Tomio
cb50241e6f fix(HTTPOptions): change default value in jsdoc to 8 (#5547) 2021-04-20 19:37:45 +02:00
Advaith
f1c0c043b5 feat(Util): make cleanContent take a channel instead of a message (#5535) 2021-04-18 18:53:09 +02:00
Souji
596832371c feat(Guild): nsfw guilds (#5525)
Co-authored-by: Advaith <advaithj1@gmail.com>
2021-04-18 18:52:53 +02:00
Advaith
1be67b8851 feat(Guild): replace owner with fetchOwner (#5480) 2021-04-16 06:39:12 +02:00
PhaxeNor
3c175cb511 feat(GuildFeatures): added the new screening features (#5328)
Co-authored-by: Noel <icrawltogo@gmail.com>
2021-04-15 02:07:15 +02:00
anandre
936516cb9c docs(GuildChannelManager): fix type options in description (#5440) 2021-04-15 00:39:12 +02:00
monbrey
7b161f93a0 feat(MessageAttachment): support for #contentType (#5481)
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
2021-04-15 00:38:45 +02:00
Jan
164ddf668f refactor: rename Snowflake to SnowflakeUtil (#5502) 2021-04-15 00:37:54 +02:00
Souji
e9bf206d88 fix(GuildAuditLogsEntry): executor can be missing (#5500) 2021-04-15 00:37:45 +02:00
Souji
fe93a7e084 feat(SysChanFlags): new flag and rename in sync with client (#5506) 2021-04-15 00:37:32 +02:00
Jan
207735cedc feat: move internal regular expressions to static properties (#5384) 2021-04-15 00:36:35 +02:00
Bryan Chen
900e57657e fix(typings): update GuildMemberRoleManager typings to match implementation (#5497) 2021-04-15 00:35:04 +02:00
GrapeColor
565d7b3747 fix(MessageMentions#channels): Fix type of channels of mentions (#5370) 2021-04-15 00:34:13 +02:00
Kevin Novak
32b0d71af7 feat(typings): add ShardingManager.shardList to type definitions (#5446) 2021-04-15 00:33:59 +02:00
Ven
7c49612d4b feat(typings): explicitly type PremiumTier and Collectors (#5458) 2021-04-15 00:33:35 +02:00
Shubham Parihar
fa5a37e51a fix(Resolvables): valid resolvables throw error when uncached (#5495)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-04-15 00:32:08 +02:00
Yoshida Tomio
b380f16367 chore(ci): Update actions/setup-node action to v2 (#5527) 2021-04-15 00:31:32 +02:00
Bread
b710a43232 fix(GuildChannel): check for community required channels in GuildChannel#deletable (#5170)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2021-04-15 00:31:08 +02:00
Sugden
aff3625d4f fix(GuildMember): correctly check for premium_since (#5312) 2021-04-15 00:30:45 +02:00
Shubham Parihar
eb43ce4d4f feat: make changes to PresenceData typings and docs (#5317)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-04-14 14:53:54 +02:00
Advaith
c9107e35fa feat(MessageTypes): add 16 and 17 (#4685) 2021-04-14 14:53:30 +02:00
izexi
0ba2bcb545 feat(GuildMemberManager): add 'search' method (#4154)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-04-14 14:53:01 +02:00
Amish Shah
eec7cf7634 feat: stage channels (#5456)
* feat: add stage channel type

* feat: initialise stage channel structure

* feat: add STAGE_MODERATOR permissions bitfield

* fix: typo in permissions

* fix(Channel): type selection logic

* feat: add rtcRegion to StageChannel and VoiceChannel

* feat: rtc region editing for stage and voice channels

* feat: stage channel userLimit

* feat: add stage channels to exports

* feat: add computed properties to stage channel

* feat(VoiceState): include stage channel in docs

* feat: allow ability to join stage channels

* feat(StageChannel): join and leave methods

* docs: add StageChannel link in GuildChannel docs

* feat(VoiceState): suppress and requestToSpeakTimestamp

* feat(StageChannel): setRequestToSpeak

* refactor(StageChannel): update setRequestToSpeak

* feat(VoiceState): add moveToSpeakers and moveToAudience

* feat(VoiceState): add methods to move in/out of speakers

* feat(VoiceState): add stage channel sanity checks

* feat(Permissions): add REQUEST_TO_SPEAK

* feat(VoiceState): simpler methods

* docs(VoiceState): add documentation for new methods

* refactor: remove unused error message

* chore: remove debug statements

* chore: revert changes to package-lock.json

* docs(VoiceState): clarify suppress

* docs(VoiceState): add missing @type param

* feat(StageChannel): remove nsfw property

* fix(VoiceState): check permissions in channel

Co-authored-by: Advaith <advaithj1@gmail.com>

* fix(VoiceState): instantiate error with new

Co-authored-by: BannerBomb <BannerBomb55@gmail.com>

* refactor(VoiceState): more readable API route builder

Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>

* style(VoiceState): fix lint errors

* docs(VoiceState): add example usage for new methods

* docs: setRTCRegion examples

* chore: update typings

* fix(VoiceState): calculate permissions for self

* refactor(VoiceState): tidy up implementation

* Update src/structures/VoiceState.js

Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>

* refactor: vaporox's suggestions

* style(VoiceState): fix linter errors

* chore: update typings

* chore: remove unused error message

* refactor(VoiceState): use optional chaining

Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>

* chore: move getters below constructor in typings

* refactor(StageChannel): optional chaining

Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>

* style(VoiceState): fix lint errors

* docs: fix incorrect types

Co-authored-by: izexi <43889168+izexi@users.noreply.github.com>

* Update src/structures/VoiceChannel.js

Co-authored-by: izexi <43889168+izexi@users.noreply.github.com>

* Update src/structures/VoiceChannel.js

Co-authored-by: izexi <43889168+izexi@users.noreply.github.com>

* refactor(VoiceState): use optional chaining

Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>

* refactor(StageChannel): remove permission override check in joinable

* refactor: make ChannelTypes a proper enum

* Use createEnum

Co-authored-by: izexi <43889168+izexi@users.noreply.github.com>

* chore: remove unused code from Constants

* refactor(StageChannel): remove unnecessary getters

* chore: update typings

* refactor: introduce BaseGuildVoiceChannel class

* refactor(VoiceChannel): reduce code duplication

* feat: export BaseGuildVoiceChannel

* chore: update typings

* docs: fix typos

* refactor: move setRTCRegion to BaseGuildVoiceChannel

* feat(VoiceState): remove permission checks

* chore: update typings

* Apply suggestions from code review

Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>

* chore: update esm exports and typings

* Update src/structures/VoiceState.js

Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>

Co-authored-by: Advaith <advaithj1@gmail.com>
Co-authored-by: BannerBomb <BannerBomb55@gmail.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: Jan <66554238+vaporox@users.noreply.github.com>
Co-authored-by: izexi <43889168+izexi@users.noreply.github.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-04-14 13:35:55 +01:00
Advaith
63ff6a07eb feat(Activity): add missing fields (#4984)
Co-authored-by: Jan <66554238+Vaporox@users.noreply.github.com>
2021-04-06 23:03:45 +02:00
Souji
599f0f5cef docs(ClientUser): #setPresence does not return a promise (#5485) 2021-04-05 23:26:28 +02:00
Carson M
2b52cdc915 fix(Voice): only skip undocumented voice packet byte if present (#5309)
* fix(Voice*): Only skip undocumented byte if present

* fix linting errors
2021-04-05 08:56:48 +01:00
izexi
67025e63e4 fix: typings for 'WebhookMessageOptions' (#5476) 2021-04-04 23:17:19 +02:00
Souji
e848d25c86 docs(GuildChannel): #members add cached spec, include voice (#5385) 2021-04-03 20:01:54 +02:00
Jan
0a2e0c0e3e refactor(Guild): remove fetchVanityCode() (#5471) 2021-04-03 20:01:14 +02:00
Souji
8023250ee7 fix(IntegrationApplication): add missing export to index.js (#5475) 2021-04-03 20:00:41 +02:00
izexi
7cabc1c490 feat(Webhook): add '(edit|delete)Message' methods (#5223) 2021-04-03 15:06:18 +02:00
Jan
404ce57bcc fix(ApplicationFlags): export class (#5465) 2021-04-03 15:01:52 +02:00
Shubham Parihar
b82ea98c71 chore: allow three more types of commit msgs (#5470) 2021-04-03 15:01:35 +02:00
Shubham Parihar
a4d09ab0a8 types: remove typings for Client#disconnect event (#5469) 2021-04-03 15:01:20 +02:00
Amish Shah
3af8179878 fix(Voice): disconnect if voice channel not cached (#5467) 2021-04-02 12:53:49 +02:00
Souji
6c6b1053b7 fix(InviteDelete): guild can be missing (#5457) 2021-03-31 22:31:37 +02:00
Alec Woods
9d2d60691e feat(Rest): better handling of global rate limit and invalid request tracking (#4711)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: Tristan Guichaoua <33934311+tguichaoua@users.noreply.github.com>
Co-authored-by: Papaia <43409674+Papaia@users.noreply.github.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-03-31 21:56:58 +02:00
Jan
06e9d86cb3 feat(Application): application flags (#5147)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2021-03-31 21:55:12 +02:00
Shubham Parihar
dedf43288e docs(BanOptions): make days description more clear (#5327) 2021-03-29 05:52:41 +02:00
Carter
685b2604e4 docs: update docs and examples for #4879 (#5323)
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-03-29 05:51:42 +02:00
Souji
624a4464ca feat(WebSocketManager): let identify throw on depleted limits (#5283)
* feat(WebSocketManager): let identify throw on depleted limits

* chore: remove WSM#sessionStartLimit
2021-03-28 15:33:31 +02:00
Jan
8d14ee3540 refactor(Collector): make endReason a getter (#5271) 2021-03-28 15:29:39 +02:00
SynysterZV
09846c725b chore: update d.js guide FAQ link (#5176) 2021-03-28 15:29:03 +02:00
Souji
43bd568f1c fix(ReactionUserManager): remove before query option (#5281) 2021-03-28 15:28:33 +02:00
Sugden
ca5f371f1a typings(PermissionOverwrites): use correct parameter type for resolveOverwriteOptions (#5302) 2021-03-28 15:28:08 +02:00
Souji
62ba2499e0 docs(GuildMember): document owner override in permissions getter (#5320) 2021-03-28 15:27:32 +02:00
Carter
077892645b fix(GuildManager): add missing toString() on Permission#resolve fns (#5324) 2021-03-28 15:27:16 +02:00
Carter
aac6275300 typings(MessageReaction): allow message to be partial (#5303) 2021-03-28 15:26:44 +02:00
Souji
e7c4f3672e fix(GuildChannel): regression on default channel type (#5251) 2021-03-28 15:24:41 +02:00
Advaith
1c8b1096c6 docs(ChannelManager): fetch can return Promise<null> (#5422) 2021-03-28 15:24:19 +02:00
BannerBomb
8411b9e142 fix(Guild/GuildChannel): methods reason arg usage (#5419) 2021-03-28 15:23:32 +02:00
nopeless
4099c28776 test: client should destroy (#5353)
Co-authored-by: Adrian Paschkowski <leiter04@gmail.com>
2021-03-28 15:22:04 +02:00
Tyler Resch
941e36f48a docs(Guild): clarified description of guild.features (#5352)
- Removed the phrase "partnered guilds" from the description of `guild.features`

**Reasoning:**
To prevent the assumption that **any** `guild.features` will be indicative of `guild.partnered`.
2021-03-28 15:21:32 +02:00
Jan
f46940228e feat: jsdelivr default file support (#5424) 2021-03-22 21:31:55 +01:00
Jan
d744e51c1b fix(Role): pass Permissions class, not the bitfield (#5321) 2021-02-22 01:03:21 +01:00
Sugden
ee5bc1a5c4 refactor: switch api and gateway to V8 (#4879)
Co-authored-by: Jan <66554238+Vaporox@users.noreply.github.com>
2021-02-11 18:10:35 +01:00
ckohen
ae3c3d80ee feat(Client): add InviteGenerationOptions#additionalScopes (#5215)
Co-authored-by: izexi <43889168+izexi@users.noreply.github.com>
Co-authored-by: Antonio Román <kyradiscord@gmail.com>
2021-02-10 15:52:44 +01:00
BannerBomb
56d8b445ed fix(WebSocketShard): key name in WebSocketShard#_send. (#5304)
I just changed an incorrect key name that was introduced in Pull Request #3722. When destroying the websocket from the WebSocketShard#_send method it's using `close` as the key name instead of `closeCode`
2021-02-10 15:48:16 +01:00
Souji
cee6cf70ce chore(*): streamline issue and PR templates and redirects (#5269)
* chore(*): streamline issue and PR templates and redirects

* chore: reword redirect to not sound apologetic

* chore: reintroduce one-liner to use discord for questions

* chore: ae consistency
2021-01-27 20:31:47 +01:00
Alon Livne
09d1f2f18f feat(ReactionCollector): event create (#4108)
* fix(Typing): setSpeaking public

* feat(ReactionCollector): create event, close #2844

* Revert "fix(Typing): setSpeaking public"

This reverts commit ccc0e0cc76.
2021-01-27 12:13:15 +01:00
Shubham Parihar
640a6633b1 docs(BaseManager): fix a typo in #resolveID description (#5180)
* fix(BaseManager): #resolveID returns null for non-numeric string arg

* docs(BaseManager): fix a typo in #resolveID description
2021-01-27 11:30:08 +01:00
Antonio Román
a6bc39d3c6 fix(ApiMessage): remove resolve() from typings (#5241) 2021-01-27 11:28:26 +01:00
Matt (IPv4) Cowley
aaed72b723 refactor(Client): remove fetchAllMembers option (#5257)
* feat(Client): remove fetchAllMembers option & logic

* Cleanup

* Missed type change
2021-01-27 11:27:50 +01:00
Antonio Román
41bd6c2717 fix(GuildChannel): overload permissionsFor and BaseManager#resolve[id] (#5260)
* fix(GuildChannel): overload permissionsFor and BaseManager#resolve[id]

* fix(GuildChannel): GuildMessage and Role trigger non-null return
2021-01-27 11:27:01 +01:00
Papaia
9ffcd83027 docs(BitFields): remove string from BitFieldResolvable (#5122)
* refactor(BitFields): remove string from BitFieldResolvable

* docs(Client#generateInvite): fix indentation in example

* chore: resolve conflict

* refactor: revert breaking changes

Co-authored-by: Papaia <43409674+ItsPapaia@users.noreply.github.com>
2021-01-24 11:52:35 +01:00
Ishmaam Khan
5401b92aac refactor(GuildMember): remove GuildMember#hasPermission (#5152)
* refactor(GuildMember): remove GuildMember#hasPermission

* refactor(GuildEmoji): remove use for `GuildMember#hasPermission`

* typings: remove `GuildMember#hasPermission`
2021-01-24 11:50:58 +01:00
Kevin Novak
80e1afb654 types(RateLimitData): remove timeDifference property (#5208) 2021-01-24 11:49:26 +01:00
Alex
001676c7a9 feat(ShardingManager): Allow b-Eval/fetchClientValues on a specific shard when not all are ready (#5222)
Co-authored-by: BennyDiscord <46286597+BennyDiscord@users.noreply.github.com>
2021-01-24 11:49:15 +01:00
Jan
a33eed71af refactor(Util): remove convertToBuffer (#5237) 2021-01-24 11:48:03 +01:00
Carter
8bf76ffa52 chore: remove webpack from deploy workflow (#5253) 2021-01-24 11:47:20 +01:00
ckohen
f95f5dcd79 fix(GuildEmoji): check for cahnges to available in equals (#5201) 2021-01-22 19:18:06 +01:00
Shubham Parihar
0d5de4333d fix(VoiceConnection): make #dispatcher nullable (#5217) 2021-01-22 19:17:32 +01:00
monbrey
5ac3b57f9b feat(GuildChannel): support conversion between text and news (#5022)
* feat(GuildChannel): support conversion between text and news

* fix(Typings): add type to ChannelData

* fix(GuildChannel): use ChannelUpdate action handler to change class type

* Update src/structures/TextChannel.js

Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>

* fix(Typings): re-use ChannelType from GuildCreateChannelOptions

* fix(Typings): only allow text-news conversion

* fix(Typings): exclude -> pick (vlads suggestion)

* fix(Typings): pick -> exclude in two other spots

Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2021-01-22 18:03:02 +01:00
Zaid
98b1c58218 fix(Message): update getters to take null permissions into account (#5066)
* fix(Message): update message#delete

* refactor(Message): message#deletable avoid duplicate call

* Update Message.js

* fix(message): resolve syntax errors

* chore(message): resolve linting issues (death to the gh web panel)

* Update Message.js

* death to the github web panel

* Update src/structures/Message.js

Co-authored-by: Jan <66554238+Vaporox@users.noreply.github.com>

Co-authored-by: Jan <66554238+Vaporox@users.noreply.github.com>
2021-01-22 18:02:21 +01:00
izexi
eb28ee7905 fix(typings): return types for 'Webhook(Client)#send()' (#4876)
* feat(Typings): add 'APIRawMessage' interface

* fix(Typings): return type for WebhookFields#send()

* fix(Typings): types for APIRawMessage props

* refactor(Typings): exclude oauth props from API

* feat(Typings): add WebhookRawMessageResponse type

* refactor(Typings): use WebhookRawMessageResponse
2021-01-22 17:46:55 +01:00
Carter
c8ad52b89d chore: remove codeql job (#5231) 2021-01-22 17:45:40 +01:00
Souji
273e9557be feat(BitField): move problematic bit into the error message (#5228)
* feat(BitField): move problematic bit into the error message

* fix: remove intermediate constant
2021-01-22 17:44:50 +01:00
ElCholoGamer
764966e398 feat(ClientEvents): add tuple labels to event arguments (#5225) 2021-01-22 17:44:11 +01:00
Adrian Paschkowski
c4c817116f feat(GuildMember): #pending (#5121)
* Add GuildMember#isPending

* Rename is_pending to pending

* Improve jsdoc wording

* pending isn't nullable

* ??
2021-01-02 23:55:37 +01:00
Bread
e37160f4e3 fix(MessageEmbed): include author.name in length getter (#5167)
* fix(MessageEmbed): include `author.name` in length getter

* Update src/structures/MessageEmbed.js

Co-authored-by: Papaia <43409674+papaia@users.noreply.github.com>

* style: oxford comma

Co-authored-by: Papaia <43409674+papaia@users.noreply.github.com>

* refactor: es2020 syntax

Co-authored-by: Papaia <43409674+papaia@users.noreply.github.com>
2021-01-01 00:11:52 +01:00
Sugden
57b3ba425e chore: remove webpack from .*ignore files (#5171) 2021-01-01 00:10:56 +01:00
Mr¤KayJayDee
4e132f18c4 chore: bump LICENSE year (#5173) 2021-01-01 00:10:24 +01:00
Antonio Román
b0077dcd0c chore(Deps): remove setimmediate (#5159)
setimmediate is a browser polyfill, and since we do not support webpack anymore, there is no reason to keep it here.
2020-12-30 11:22:11 +01:00
Matt (IPv4) Cowley
8c2e6b70b8 refactor(Message): remove stored edit history (#5155) 2020-12-30 11:21:34 +01:00
ManEatingTapir
6a77453532 chore(RoleManager): change parameter of create to be one unnamed object (#5026)
* chore(RoleManager): change parameter of create to be one unnamed object

* chore(RoleManager): update src/managers/RoleManager.js

* chore(RoleManager): update typings/index.d.ts

* chore(RoleManager): update src/managers/RoleManager.js

Co-authored-by: Noel <buechler.noel@outlook.com>
2020-12-26 10:59:16 +01:00
ckohen
2aea7dd921 docs(MessageEditOptions): add the flags parameter (#5126) 2020-12-26 10:58:02 +01:00
Ishmaam Khan
2a0dcc5cae refactor: RoleManager (#5131)
* refactor(RoleManager): make use of `BaseManager#client`

* refactor(RoleManager): cool syntax

* refactor +1

Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>

* refactor +2

Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>

Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2020-12-26 10:57:34 +01:00
Jan
2c2249ee73 fix(Collection): toJSON() errors if the collection includes empty values (#5129) 2020-12-26 10:56:37 +01:00
dependabot[bot]
b19b8b593a chore(deps): bump node-notifier from 8.0.0 to 8.0.1 (#5145)
Bumps [node-notifier](https://github.com/mikaelbr/node-notifier) from 8.0.0 to 8.0.1.
- [Release notes](https://github.com/mikaelbr/node-notifier/releases)
- [Changelog](https://github.com/mikaelbr/node-notifier/blob/v8.0.1/CHANGELOG.md)
- [Commits](https://github.com/mikaelbr/node-notifier/compare/v8.0.0...v8.0.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-26 10:54:50 +01:00
cherryblossom000
40d77bacc3 types: make Client#voice non-nullable (#5148)
Because of the removal of browser support (#5113) Client#voice is always non-nullable.
2020-12-26 10:54:15 +01:00
Zaid
b8be7237b8 Create CODE_OF_CONDUCT.md (#5120)
* Create CODE_OF_CONDUCT.md

* chore: move coc into .github/
2020-12-18 06:24:25 +01:00
Ishmaam Khan
ffe31405ff feat(GuildEmojiManager): implement GuildEmojiManager#fetch (#4933)
* feat: GuildEmojiManager#fetch

* typings: GuildEmojiManager#fetch
2020-12-14 21:44:15 +01:00
anandre
be0f383568 docs(RoleManager): fetch description (#4920)
* Update fetch description

The `fetch` method does not support fetching multiple IDs, so the description is currently inaccurate.

* Update src/managers/RoleManager.js

Co-authored-by: Tristan Guichaoua <33934311+tguichaoua@users.noreply.github.com>

Co-authored-by: Tristan Guichaoua <33934311+tguichaoua@users.noreply.github.com>
Co-authored-by: Noel <buechler.noel@outlook.com>
2020-12-14 14:12:36 +01:00
monbrey
b2a6720477 revert: 5047 (#5050) 2020-12-14 13:58:21 +01:00
Noel
0a591a9697 feat(Browser): remove browser � (#5113) 2020-12-14 13:56:16 +01:00
X-Classified
5c4547e84d docs(TextBasedChannel): indicate that replyTo cannot be system (#5115) 2020-12-14 13:54:51 +01:00
Souji
d6234b764e feat(Role): role tags (#4628)
* feat(Role): role tags

* fix(RoleManager): fix js docs and mark nullable

* fix(Role): typings tags are be null, not undefined

* fix(Role): getters should actually return a bool

* fix(RoleManager): typo

* fix(Role): should always return a boolean

* fix(Gmrm): getter should return null

* fix(RoleManager): getters should return null

* fix: typing getters should return null

* fix(Role): docs grammar and consistency

* chore: prefer in operator over Reflect#has

* feat(GmRm): botRole getter

* fix(GmRm): use the actual properties

* feat(RoleManager): rem myRole in pref o botRoleFor

* fix(Role): remove obsolete is- getters

* fix:  checking tags after getter removal

* chore: identifier naming consistency

* chore: prefer explicit true type over boolean

* fix: typo

* feat(Integration): Add Integration#roles getter (#1)

* fix(RoleManager): remove bot check r:partials

* feat(RoleManager): robustness against uncached u

* docs: possibly undefined

Co-authored-by: Jan <66554238+Vaporox@users.noreply.github.com>
2020-12-14 13:54:02 +01:00
Souji
8883a0144b fix: implement valueOf on pseudomanagers (#4595) 2020-12-14 13:52:21 +01:00
Jan
75e6dfbfd3 refactor(Message): remove options for Message#delete (#4999) 2020-12-14 13:52:04 +01:00
Advaith
41078997ae feat(APIMessage): remove disableMentions (#4836)
* chore: remove disableMentions

* style: fix eslint
2020-12-14 13:51:31 +01:00
Mirdukkk
9c7fe34c50 fix: add presence to ClientPresence from ClientOptions (#5041) 2020-12-13 03:14:23 +01:00
VoltrexMaster
9042d19c4e fix: filtering of string forms of null and undefined (#5075)
Removed null and undefined being filtered out in string forms which caused issues in `<client>.api`, issue: https://github.com/discordjs/discord.js/issues/5072
2020-12-13 03:13:52 +01:00
Awesome Stickz
12c909eecc fix(ChannelManager): Avoid crash in remove method with uncached channel (#4937)
* fix(ChannelManager): Avoid crash in remove method with uncached channel

* Use optional chaining

Co-authored-by: Ishmaam Khan <ishmaamk@gmail.com>

Co-authored-by: Ishmaam Khan <ishmaamk@gmail.com>
2020-12-12 22:40:50 +01:00
X-Classified
bb78120283 fix(Message): #system non-zero message types are not guaranteed to be system (#5108)
* fix(Message): #system not all nonzero message types are system

* feat(Message): introduce system message types

* refactor(Constants): change SystemMessageTypes to be exclusionary

* fix(Constants): only need to check if type exists

Co-authored-by: Jan <66554238+Vaporox@users.noreply.github.com>

* fix(Constants): lint

* fix(Typings): add SystemMessageTypees to Constants

Co-authored-by: Jan <66554238+Vaporox@users.noreply.github.com>
2020-12-12 22:40:39 +01:00
Jan
5b51392724 refactor(Client): improve generateInvite() (#5065)
* cleanup(Client): improve generateInvite()

* fix: you actually do need to fetch the application
2020-12-12 22:38:57 +01:00
dependabot[bot]
b6b3c6f29b chore(deps): bump ini from 1.3.5 to 1.3.8 (#5110)
Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.8.
- [Release notes](https://github.com/isaacs/ini/releases)
- [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.8)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-12 14:56:44 +01:00
Zaid
d70127cee6 feat(GuildMember): make GuildMember#setNickname first param nullable (#5070)
* Update index.d.ts

* Update GuildMember.js

* Update src/structures/GuildMember.js

Co-authored-by: Jan <66554238+Vaporox@users.noreply.github.com>

* Update GuildMember.js

* Update index.d.ts

Co-authored-by: Jan <66554238+Vaporox@users.noreply.github.com>
2020-12-12 14:50:33 +01:00
anandre
77d42373a1 docs: permission overwrite methods descriptions (#5079)
* Change permission overwrite methods descriptions

The methods `GuildChannel#updateOverwrite` and `#createOverwrite` had some awkward wording in the description: `. (...)` does not look good.  This PR cleans up the descriptions to be one sentence that's clearer in meaning.  There's also changes to make `permission overwrite/s` consistent - some lines had `permissions overwrite/s`.

* Update src/structures/GuildChannel.js

Co-authored-by: SpaceEEC <spaceeec@yahoo.com>

* Update src/structures/GuildChannel.js

Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>

* Update src/structures/GuildChannel.js

Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>

Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2020-12-12 14:50:04 +01:00
Jan
bb04e69a92 cleanup(Guild): remove Guild#voice (#5091) 2020-12-12 14:49:32 +01:00
SpaceEEC
b509862bfa fix(UserFlags): correct early bot dev name, remove deprecated aliases (#5104) 2020-12-12 14:48:03 +01:00
Advaith
2685b960d7 docs(Client): #emojis is a BaseGuildEmojiManager (#5048) 2020-12-08 22:07:06 +01:00
monbrey
60e5a0e46f feat(Message|TextChannel): Inline replies (#4874)
* feat(Message): remove reply functionality

* feat(InlineReplies): add INLINE_REPLY constant/typing

* feat(InlineReplies): add Message#replyReference property

* feat(InlineReplies): add typings for sending inline replies

* feat(InlineReplies): provide support for inline-replying to messages

* feat(Message): add referencedMessage getter

* fix: check that Message#reference is defined in referencedMessage

* refactor(InlineReplies): rename property, rework Message resolution

* docs: update jsdoc for inline replies

* feat(Message): inline reply method

* fix(ApiMessage): finish renaming replyTo

* fix: jsdocs for Message#referencedMessage

Co-authored-by: Tristan Guichaoua <33934311+tguichaoua@users.noreply.github.com>

* fix: restore reply typings

* fix: dont pass channel_id to API when replying

* chore: update jsdocs

* chore: more jsdoc updates

* feat(AllowedMentions): add typings for replied_user

* fix: naming conventions

* fix(Message): referenced_message is null, not undefined

* fix(MessageMentionOptions): repliedUser should be optional

* chore: get this back to the right state

* fix(ApiMessage): pass allowed_mentions when replying without content

* fix(ApiMessage): prevent mutation of client options

Co-authored-by: almostSouji <timoqueezle@gmail.com>
Co-authored-by: Tristan Guichaoua <33934311+tguichaoua@users.noreply.github.com>
2020-12-08 21:08:26 +01:00
SpaceEEC
7365f40300 fix(Collector): throw an error if a non-function was provided as filter (#5034) 2020-12-08 20:11:44 +01:00
Carter
09d07553ab docs(User): fix typos in jsdoc (#5060) 2020-12-06 18:03:39 +01:00
BannerBomb
e272fd6909 fix(BaseGuildEmoji): typo in requiresColons (#5076) 2020-12-06 17:59:12 +01:00
Antonio Román
90d458820b chore(Engine): bump Node.js to v14.0.0 (#5067)
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2020-12-06 17:58:08 +01:00
Advaith
9f3c3e0918 docs(WebSocketManager): fix type of status (#5059) 2020-11-30 01:08:54 +01:00
monbrey
6b322f47a0 fix(MessageReaction): set MessageReaction#me in patch method (#5047) 2020-11-25 23:55:29 +01:00
Amish Shah
4fcb9ebf30 fix(Voice*): filter out silent audio from video users (#5035) 2020-11-25 23:51:16 +01:00
izexi
53529bd05d fix(GuildTemplate): 'guild' getter (#5040) 2020-11-25 23:50:28 +01:00
Jan
8d650a7250 feat: BaseGuildEmojiManager (#4934)
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
2020-11-22 19:48:30 +01:00
Jan
12a096b5f1 fix(RoleManager): fix ID return value, change return type to collection (#4935)
Co-authored-by: Ishmaam Khan <ishmaamk@gmail.com>
2020-11-22 19:39:19 +01:00
Advaith
6f3076325e remove User#locale (#4932) 2020-11-22 19:39:06 +01:00
anandre
8c8883ef26 Remove Guild#member (#4890) 2020-11-22 19:21:01 +01:00
Junseo Park
4b555fdf4c feat(Message): added string type for message nonce (#4782)
Co-authored-by: Vlad Frangu <kingdgrizzle@gmail.com>
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
2020-11-22 19:13:38 +01:00
monbrey
863734aba4 feat(GuildMemberManager): throw TypeError on incorrect GuildMemberManager#ban params (#4816)
Co-authored-by: Sugden <28943913+NotSugden@users.noreply.github.com>
2020-11-22 19:13:07 +01:00
295 changed files with 38975 additions and 19912 deletions

26
.commitlintrc.json Normal file
View File

@@ -0,0 +1,26 @@
{
"extends": ["@commitlint/config-angular"],
"rules": {
"scope-case": [2, "always", "pascal-case"],
"type-enum": [
2,
"always",
[
"chore",
"build",
"ci",
"docs",
"feat",
"fix",
"perf",
"refactor",
"revert",
"style",
"test",
"types",
"workflow",
"wip"
]
]
}
}

View File

@@ -2,13 +2,12 @@
"extends": ["eslint:recommended", "plugin:prettier/recommended"],
"plugins": ["import"],
"parserOptions": {
"ecmaVersion": 2020
"ecmaVersion": 2021
},
"env": {
"es2020": true,
"es2021": true,
"node": true
},
"overrides": [{ "files": ["*.browser.js"], "env": { "browser": true } }],
"rules": {
"import/order": [
"error",

76
.github/CODE_OF_CONDUCT.md vendored Normal file
View File

@@ -0,0 +1,76 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at https://discord.gg/djs. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq

View File

@@ -1,6 +1,6 @@
# Contributing
**The issue tracker is only for bug reports and enhancement suggestions. If you have a question, please ask it in the [Discord server](https://discord.gg/bRCvFy9) instead of opening an issue you will get redirected there anyway.**
**The issue tracker is only for bug reports and enhancement suggestions. If you have a question, please ask it in the [Discord server](https://discord.gg/djs) instead of opening an issue you will get redirected there anyway.**
If you wish to contribute to the discord.js codebase or documentation, feel free to fork the repository and submit a
pull request. We use ESLint to enforce a consistent coding style, so having that set up in your editor of choice
@@ -10,9 +10,8 @@ is a great boon to your development process.
To get ready to work on the codebase, please do the following:
1. Fork & clone the repository, and make sure you're on the **master** branch
1. Fork & clone the repository, and make sure you're on the **main** branch
2. Run `npm ci`
3. If you're working on voice, also run `npm install @discordjs/opus` or `npm install opusscript`
4. Code your heart out!
5. Run `npm test` to run ESLint and ensure any JSDoc changes are valid
6. [Submit a pull request](https://github.com/discordjs/discord.js/compare) (Make sure you follow the [conventional commit format](https://github.com/discordjs/discord.js-next/blob/master/.github/COMMIT_CONVENTION.md))
3. Code your heart out!
4. Run `npm test` to run ESLint and ensure any JSDoc changes are valid
5. [Submit a pull request](https://github.com/discordjs/discord.js/compare) (Make sure you follow the [conventional commit format](https://github.com/discordjs/discord.js-modules/blob/main/.github/COMMIT_CONVENTION.md))

11
.github/FUNDING.yml vendored
View File

@@ -1,11 +1,2 @@
# These are supported funding model platforms
# github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
# patreon: # Replace with a single Patreon username
# open_collective: # Replace with a single Open Collective username
# ko_fi: # Replace with a single Ko-fi username
# tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
# custom: # Replace with a single custom sponsorship URL
github: amishshah
github: [amishshah, iCrawl, vladfrangu, kyranet]
patreon: discordjs

View File

@@ -1,45 +0,0 @@
---
name: Bug report
about: Report incorrect or unexpected behaviour of discord.js
title: ''
labels: 's: unverified, type: bug'
assignees: ''
---
<!--
If you need help with discord.js installation or usage, please go to the discord.js Discord server instead:
https://discord.gg/bRCvFy9
This issue tracker is only for bug reports and enhancement suggestions.
You won't receive any basic help here.
-->
**Please describe the problem you are having in as much detail as possible:**
**Include a reproducible code sample here, if possible:**
```js
// Place your code here
```
**Further details:**
- discord.js version:
- Node.js version:
- Operating system:
- Priority this issue should have please be realistic and elaborate if possible:
**Relevant client options:**
- partials: none
- gateway intents: none
- other: none
<!--
If this applies to you, please check the respective checkbox: [ ] becomes [x].
You don't have to modify the text to suit your particular situation if you want to
elaborate, please do so in the description.
While it's not a requirement to test your issue on the master branch, it would make fixing
the problem a lot easier for us, so please do so if possible.
-->
- [ ] I have also tested the issue on latest master, commit hash:

135
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View File

@@ -0,0 +1,135 @@
name: Bug report
description: Report incorrect or unexpected behavior of discord.js
labels: [bug, need repro]
body:
- type: markdown
attributes:
value: |
Use Discord for questions: https://discord.gg/djs
If you are reporting a voice issue, please post your issue at https://github.com/discordjs/voice/issues
- type: textarea
id: description
attributes:
label: Issue description
description: |
Describe the issue in as much detail as possible.
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files into it.
placeholder: |
Steps to reproduce with below code sample:
1. do thing
2. do thing in Discord client
3. observe behavior
4. see error logs below
validations:
required: true
- type: textarea
id: codesample
attributes:
label: Code sample
description: Include a reproducible, minimal code sample. This will be automatically formatted into code, so no need for backticks.
render: typescript
placeholder: |
const { Client, Intents } = require('discord.js');
const client = new Client({ intents: [Intents.FLAGS.GUILDS] });
client.on('ready', () => {
console.log(`Logged in as ${client.user.tag}!`);
});
client.on('interactionCreate', async interaction => {
if (!interaction.isCommand()) return;
if (interaction.commandName === 'ping') {
await interaction.reply('Pong!');
}
});
client.login('token');
- type: input
id: djs-version
attributes:
label: discord.js version
description: Which version of discord.js are you using? Run `npm list discord.js` in your project directory and paste the output.
placeholder: 13.x.x (we no longer support version 12 or earlier)
validations:
required: true
- type: input
id: node-version
attributes:
label: Node.js version
description: |
Which version of Node.js are you using? Run `node --version` in your project directory and paste the output.
If you are using TypeScript, please include its version (`npm list typescript`) as well.
placeholder: Node.js version 16.6+ is required for version 13.0.0+
validations:
required: true
- type: input
id: os
attributes:
label: Operating system
description: Which OS does your application run on?
- type: dropdown
id: priority
attributes:
label: Priority this issue should have
description: Please be realistic. If you need to elaborate on your reasoning, please use the Issue description field above.
options:
- Low (slightly annoying)
- Medium (should be fixed soon)
- High (immediate attention needed)
validations:
required: true
- type: dropdown
id: partials
attributes:
label: Which partials do you have configured?
description: |
Check your Client constructor for the `partials` key.
Tip: you can select multiple items
options:
- No Partials
- USER
- CHANNEL
- GUILD_MEMBER
- MESSAGE
- REACTION
multiple: true
validations:
required: true
- type: dropdown
id: intents
attributes:
label: Which gateway intents are you subscribing to?
description: |
Check your Client constructor for the `intents` key.
Tip: you can select multiple items
options:
- GUILDS
- GUILD_MEMBERS
- GUILD_EMOJIS_AND_STICKERS
- GUILD_INTEGRATIONS
- GUILD_WEBHOOKS
- GUILD_INVITES
- GUILD_VOICE_STATES
- GUILD_PRESENCES
- GUILD_MESSAGES
- GUILD_MESSAGE_REACTIONS
- GUILD_MESSAGE_TYPING
- DIRECT_MESSAGES
- DIRECT_MESSAGE_REACTIONS
- DIRECT_MESSAGE_TYPING
multiple: true
validations:
required: true
- type: input
id: dev-release
attributes:
label: I have tested this issue on a development release
placeholder: d23280c
description: |
The issue might already be fixed in a development release. This is not required, but helps us greatly.
To install the latest development release run `npm i discord.js@dev` in your project directory.
Run `npm list discord.js` and use the last part of the printed information (`d23280c` for `discord.js@xx.x.x-dev.1530234593.d23280c`)

View File

@@ -1,5 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Discord server
url: https://discord.gg/bRCvFy9
about: Have questions or need support? Please go to the Discord server, as issues that are just support-related will be closed and redirected there.
url: https://discord.gg/djs
about: Please visit our Discord server for questions and support requests.

View File

@@ -1,26 +0,0 @@
---
name: Feature request
about: Request a feature for the core discord.js library
title: ''
labels: 'type: enhancement'
assignees: ''
---
<!--
If you need help with discord.js installation or usage, please go to the discord.js Discord server instead:
https://discord.gg/bRCvFy9
This issue tracker is only for bug reports and enhancement suggestions.
You likely won't receive any basic help here.
-->
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Eg. I'm always frustrated when [...]
**Describe the ideal solution**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@@ -0,0 +1,35 @@
name: Feature request
description: Request a new feature (documented features of the official Discord developer API only!)
labels: [feature request]
body:
- type: markdown
attributes:
value: |
We can only implement features that Discord publishes, documents and merges into the Discord API documentation.
We do not implement unreleased features.
Use Discord for questions: https://discord.gg/djs
- type: textarea
id: description
attributes:
label: Feature
description: A clear and concise description of what the problem is, or what feature you want to be implemented.
placeholder: I'm always frustrated when..., Discord has recently released..., A good addition would be...
validations:
required: true
- type: textarea
id: solution
attributes:
label: Ideal solution or implementation
description: A clear and concise description of what you want to happen.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternative solutions or implementations
description: A clear and concise description of any alternative solutions or features you have considered.
- type: textarea
id: additional-context
attributes:
label: Other context
description: Any other context, screenshots, or file uploads that help us understand your feature request.

View File

@@ -1,12 +1,14 @@
**Please describe the changes this PR makes and why it should be merged:**
**Status**
- [ ] 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
**Semantic versioning classification:**
**Status and versioning classification:**
- [ ] This PR changes the library's interface (methods or parameters added)
- [ ] This PR includes breaking changes (methods removed or renamed, parameters moved or removed)
- [ ] This PR **only** includes non-code changes, like changes to documentation, README, etc.
<!--
Please move lines that apply to you out of the comment:
- 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)
- This PR includes breaking changes (methods removed or renamed, parameters moved or removed)
- This PR **only** includes non-code changes, like changes to documentation, README, etc.
-->

6
.github/SUPPORT.md vendored
View File

@@ -1,7 +1,7 @@
# Seeking support?
We're sorry, we only use this issue tracker for bugs in the library itself and feature requests for it. We are not able to provide general support or answser questions on the issue tracker.
We only use this issue tracker for bug reports and feature request. We are not able to provide general support or answer questions in the form of GitHub issues.
Should you want to ask such questions, please post in one of our support channels in our Discord server: https://discord.gg/bRCvFy9
For general questions about discord.js installation and use please use the dedicated support channels in our Discord server: https://discord.gg/djs
Any issues that don't directly involve a bug in the library or a feature request will likely be closed and redirected to the Discord server.
Any issues that don't directly involve a bug or a feature request will likely be closed and redirected.

80
.github/labels.yml vendored Normal file
View File

@@ -0,0 +1,80 @@
- name: 'api changes'
color: '5663e9'
- name: 'api support'
color: '5663e9'
- name: 'backlog'
color: '7ef7ef'
- name: 'bug'
color: 'd73a4a'
- name: 'caching'
color: '80c042'
- name: 'chore'
color: 'ffffff'
- name: 'ci'
color: '0075ca'
- name: 'dependencies'
color: '276bd1'
- name: 'discussion'
color: 'b6b1f9'
- name: 'discord'
color: '5663e9'
- name: 'documentation'
color: '0075ca'
- name: 'duplicate'
color: 'cfd3d7'
- name: 'error handling'
color: '80c042'
- name: 'feature request'
color: 'fcf95a'
- name: 'gateway'
color: '80c042'
- name: 'good first issue'
color: '7057ff'
- name: 'has PR'
color: '4b1f8e'
- name: 'help wanted'
color: '008672'
- name: 'interactions'
color: '80c042'
- name: 'in progress'
color: 'ffccd7'
- name: 'in review'
color: 'aed5fc'
- name: 'invalid'
color: 'e4e669'
- name: 'need repro'
color: 'c66037'
- name: 'performance'
color: '80c042'
- name: 'permissions'
color: '80c042'
- name: 'priority:high'
color: 'fc1423'
- name: 'question (please use Discord instead)'
color: 'd876e3'
- name: 'ratelimits'
color: '80c042'
- name: 'refactor'
color: '1d637f'
- name: 'regression'
color: 'ea8785'
- name: 'REST'
color: '80c042'
- name: 'semver:major'
color: 'c10f47'
- name: 'semver:minor'
color: 'e4f486'
- name: 'semver:patch'
color: 'e8be8b'
- name: 'sharding'
color: '80c042'
- name: 'tests'
color: 'f06dff'
- name: 'threads'
color: '80c042'
- name: 'typings'
color: '80c042'
- name: 'utility'
color: '80c042'
- name: 'wontfix'
color: 'ffffff'

25
.github/workflows/auto-deprecate.yml vendored Normal file
View File

@@ -0,0 +1,25 @@
name: NPM auto deprecate
on:
workflow_dispatch:
schedule:
- cron: '0 1 * * *'
jobs:
auto-deprecate:
name: NPM auto deprecate
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Install Node v16
uses: actions/setup-node@v2
with:
node-version: 16
- name: Install dependencies
run: npm ci --ignore-scripts
- name: Deprecate versions
run: 'npm exec --no npm-deprecate -- --name "*dev*" --package "discord.js"'
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }}

View File

@@ -1,27 +0,0 @@
name: "CodeQL"
on:
push:
pull_request:
schedule:
- cron: '0 */12 * * 4'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
with:
fetch-depth: 2
- run: git checkout HEAD^2
if: ${{ github.event_name == 'pull_request' }}
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: javascript
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

View File

@@ -3,7 +3,6 @@ on:
push:
branches:
- '*'
- '!webpack'
- '!docs'
tags:
- '*'
@@ -13,12 +12,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@master
uses: actions/checkout@v2
- name: Install Node v12
uses: actions/setup-node@master
- name: Install Node v16
uses: actions/setup-node@v2
with:
node-version: 12
node-version: 16
- name: Install dependencies
run: npm ci
@@ -27,23 +26,3 @@ jobs:
uses: discordjs/action-docs@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
webpack:
name: webpack
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@master
- name: Install Node v12
uses: actions/setup-node@master
with:
node-version: 12
- name: Install dependencies
run: npm ci
- name: Build and deploy webpack
uses: discordjs/action-webpack@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

22
.github/workflows/labelsync.yml vendored Normal file
View File

@@ -0,0 +1,22 @@
name: Label Sync
on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch:
push:
branches:
- main
paths:
- '.github/labels.yml'
jobs:
labeler:
name: Labeler
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Run Label Sync
uses: crazy-max/ghaction-github-labeler@v3
with:
github-token: ${{ secrets.GITHUB_TOKEN }}

33
.github/workflows/publish-dev.yml vendored Normal file
View File

@@ -0,0 +1,33 @@
name: Publish dev
on:
workflow_dispatch:
schedule:
- cron: '0 */12 * * *'
jobs:
npm:
name: npm
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Install Node v16
uses: actions/setup-node@v2
with:
node-version: 16
registry-url: https://registry.npmjs.org/
- name: Install dependencies
run: npm ci --ignore-scripts
- name: Deprecate old versions
run: npm deprecate discord.js@"~$(jq --raw-output '.version' package.json)" "no longer supported" || true
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }}
- name: Publish
run: |
npm version --git-tag-version=false $(jq --raw-output '.version' package.json).$(date +%s).$(git rev-parse --short HEAD)
npm publish --tag dev || true
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }}

View File

@@ -8,30 +8,30 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v1
uses: actions/checkout@v2
- name: Install Node v12
uses: actions/setup-node@v1
- name: Install Node v16
uses: actions/setup-node@v2
with:
node-version: 12
node-version: 16
- name: Install dependencies
run: npm ci
- name: Run ESLint
uses: icrawl/action-eslint@v1
run: npm run lint
typings:
name: TSLint
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v1
uses: actions/checkout@v2
- name: Install Node v12
uses: actions/setup-node@v1
- name: Install Node v16
uses: actions/setup-node@v2
with:
node-version: 12
node-version: 16
- name: Install dependencies
run: npm ci
@@ -46,10 +46,10 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v2
- name: Install Node v12
uses: actions/setup-node@v1
- name: Install Node v16
uses: actions/setup-node@v2
with:
node-version: 12
node-version: 16
- name: Install dependencies
run: npm ci
@@ -65,12 +65,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v1
uses: actions/checkout@v2
- name: Install Node v12
uses: actions/setup-node@v1
- name: Install Node v16
uses: actions/setup-node@v2
with:
node-version: 12
node-version: 16
- name: Install dependencies
run: npm ci

View File

@@ -8,16 +8,16 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v2
- name: Install Node v12
uses: actions/setup-node@v1
- name: Install Node v16
uses: actions/setup-node@v2
with:
node-version: 12
node-version: 16
- name: Install dependencies
run: npm ci
- name: Run ESLint
uses: icrawl/action-eslint@v1
run: npm run lint
typings:
name: TSLint
@@ -26,10 +26,10 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v2
- name: Install Node v12
uses: actions/setup-node@v1
- name: Install Node v16
uses: actions/setup-node@v2
with:
node-version: 12
node-version: 16
- name: Install dependencies
run: npm ci
@@ -44,10 +44,10 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v2
- name: Install Node v12
uses: actions/setup-node@v1
- name: Install Node v16
uses: actions/setup-node@v2
with:
node-version: 12
node-version: 16
- name: Install dependencies
run: npm ci
@@ -65,10 +65,10 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v2
- name: Install Node v12
uses: actions/setup-node@v1
- name: Install Node v16
uses: actions/setup-node@v2
with:
node-version: 12
node-version: 16
- name: Install dependencies
run: npm ci

5
.gitignore vendored
View File

@@ -20,4 +20,7 @@ deploy/deploy_key.pub
.idea/
docs/docs.json
typings/index.js
webpack/
.DS_Store
# Autogenerated
src/index.mjs

1
.husky/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
_

4
.husky/commit-msg Executable file
View File

@@ -0,0 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx --no-install commitlint --edit $1

4
.husky/pre-commit Executable file
View File

@@ -0,0 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx --no-install lint-staged

4
.lintstagedrc.json Normal file
View File

@@ -0,0 +1,4 @@
{
"*.{mjs,js}": "eslint --fix --ext mjs,js,ts",
"*.{ts,json,yml,yaml}": "prettier --write"
}

View File

@@ -1,26 +0,0 @@
# Packages
node_modules/
yarn.lock
# Log files
logs/
*.log
# Authentication
deploy/
# Miscellaneous
.tmp/
.vscode/
docs/
# NPM ignore
.eslintrc.json
.gitattributes
.gitignore
.travis.yml
webpack.config.js
.github/
test/
tsconfig.json
tslint.json

3
.npmrc Normal file
View File

@@ -0,0 +1,3 @@
audit=false
fund=false
legacy-peer-deps=true

7
.prettierrc.json Normal file
View File

@@ -0,0 +1,7 @@
{
"singleQuote": true,
"printWidth": 120,
"trailingComma": "all",
"endOfLine": "lf",
"arrowParens": "avoid"
}

View File

@@ -10,8 +10,5 @@
"fullDocs": true,
"strong": true
},
"webpack": {
"configPath": "./webpack.config.js"
}
}
}

432
CHANGELOG.md Normal file
View File

@@ -0,0 +1,432 @@
# [13.2.0](https://github.com/discordjs/discord.js/compare/13.1.0...13.2.0) (2021-10-05)
### Bug Fixes
* ***RoleManager:** Create set of role ids correctly ([#6674](https://github.com/discordjs/discord.js/issues/6674)) ([f8aa4bd](https://github.com/discordjs/discord.js/commit/f8aa4bd4705ee3bf7892670b944516d01146580f))
* **AllowedImageSizes:** add new image sizes ([#6754](https://github.com/discordjs/discord.js/issues/6754)) ([d0025be](https://github.com/discordjs/discord.js/commit/d0025beb7b1ee6611f4315be91b38788c428f1c1))
* **BaseClient:** Remove selfbot ability ([#6429](https://github.com/discordjs/discord.js/issues/6429)) ([9a833b1](https://github.com/discordjs/discord.js/commit/9a833b1e0eb638c60c4abbb9255ed64a170e4679))
* **CachedManager:** return updated data when cache is false ([#6685](https://github.com/discordjs/discord.js/issues/6685)) ([8426770](https://github.com/discordjs/discord.js/commit/84267708659e3e9bb2f8eb3b08d8923f235e8953))
* **Constants:** allow undefined size ([#6686](https://github.com/discordjs/discord.js/issues/6686)) ([d3da833](https://github.com/discordjs/discord.js/commit/d3da83368def207585bce9ea95564d79b5097a55))
* **GuildChannel:** Fix manageable method for voice-channels ([#6447](https://github.com/discordjs/discord.js/issues/6447)) ([9301c9b](https://github.com/discordjs/discord.js/commit/9301c9b42085e860f49a322879b21b923e23a4d7))
* **GuildEmoji:** Cache restricted roles and author data ([#6675](https://github.com/discordjs/discord.js/issues/6675)) ([60b8ba6](https://github.com/discordjs/discord.js/commit/60b8ba6b865ba02428d7926998af72cdaa17ea5d))
* **GuildManager:** add missing types and converts ([#6683](https://github.com/discordjs/discord.js/issues/6683)) ([cdf65f7](https://github.com/discordjs/discord.js/commit/cdf65f74e1e9d22d405617521d1e6711493ca120))
* **Invite:** #guild never resolving into a Guild ([#6742](https://github.com/discordjs/discord.js/issues/6742)) ([b76bb8a](https://github.com/discordjs/discord.js/commit/b76bb8a409c63aef9279acf5c1f60e846131f755))
* **Message:** avoid overwriting properties in _patch ([#6738](https://github.com/discordjs/discord.js/issues/6738)) ([a8c21cd](https://github.com/discordjs/discord.js/commit/a8c21cd754d634b4d40047f85264528681a61b41))
* **Message:** fix typo ([#6435](https://github.com/discordjs/discord.js/issues/6435)) ([ecb6e50](https://github.com/discordjs/discord.js/commit/ecb6e50b46e627e3217107d662dd19c64527976d))
* **Message:** pinnable returning false in non-DEFAULT messages ([#6585](https://github.com/discordjs/discord.js/issues/6585)) ([3183b11](https://github.com/discordjs/discord.js/commit/3183b1166a8c96f8864f7307710f88193217a773))
* **Message:** throw error on missing channel ([#6581](https://github.com/discordjs/discord.js/issues/6581)) ([60aa9ae](https://github.com/discordjs/discord.js/commit/60aa9ae478597caf66d5891ff6ca4d7b4336bcba))
* **MessageAttachment:** re-assign name ([#6518](https://github.com/discordjs/discord.js/issues/6518)) ([8a8c69a](https://github.com/discordjs/discord.js/commit/8a8c69a2575b9afc18fdb46a03424e7029499d17))
* **ReactionCollector:** only call the filter function once ([#6734](https://github.com/discordjs/discord.js/issues/6734)) ([d15dd5f](https://github.com/discordjs/discord.js/commit/d15dd5f07dab00e8a31f0a37b1e60ea4017871d0))
* **Role:** toJSON() throwing due to permission bigints ([#6724](https://github.com/discordjs/discord.js/issues/6724)) ([9e421f6](https://github.com/discordjs/discord.js/commit/9e421f6ccf09230769740e069590fb8937f766b9))
* **Shard:** eval promise never resolves ([#6649](https://github.com/discordjs/discord.js/issues/6649)) ([5070d23](https://github.com/discordjs/discord.js/commit/5070d23914c13814a98cf8ea560853a82b226f94))
* **Shard:** use provided timeout when respawning ([#6735](https://github.com/discordjs/discord.js/issues/6735)) ([905d100](https://github.com/discordjs/discord.js/commit/905d100d4def974223a128c6276d4a5833c04955))
* **Sticker:** Rename method correctly to _add ([#6421](https://github.com/discordjs/discord.js/issues/6421)) ([2c449b6](https://github.com/discordjs/discord.js/commit/2c449b6b48f5cbc88e666afa852055b873994ca5))
* **ThreadChannel:** fetchStarterMessage bug ([#6584](https://github.com/discordjs/discord.js/issues/6584)) ([08edc0b](https://github.com/discordjs/discord.js/commit/08edc0b1db52992b2a2f8f6012a6001fb4336f38))
* **threadMembersUpdate:** fixed typo ([#6589](https://github.com/discordjs/discord.js/issues/6589)) ([8826e9f](https://github.com/discordjs/discord.js/commit/8826e9ffbcc8990dbebe3ccdf6e65241ab4c863c))
* **User:** compare flags in #equals ([#6750](https://github.com/discordjs/discord.js/issues/6750)) ([00e1e26](https://github.com/discordjs/discord.js/commit/00e1e2673b86e0041f2bebab7b3ced5722f450bb))
* **UserUpdateAction:** rely on client.user when ids match ([#6511](https://github.com/discordjs/discord.js/issues/6511)) ([1418649](https://github.com/discordjs/discord.js/commit/141864917ac920a081df6f6b34c13ba83e660bbf))
* **Util:** allow empty strings in splitMessage ([#6437](https://github.com/discordjs/discord.js/issues/6437)) ([d6e6244](https://github.com/discordjs/discord.js/commit/d6e6244336ccdcdac9a06ab453debe76b13c9bde))
* **Util:** default `animated` to false when omitted on resolvePartialEmoji ([#6725](https://github.com/discordjs/discord.js/issues/6725)) ([8d80fec](https://github.com/discordjs/discord.js/commit/8d80fec86d39fc640fd746cc03e6270cd574c0cf))
* **VoiceState:** Patch streaming value ([#6747](https://github.com/discordjs/discord.js/issues/6747)) ([7eec061](https://github.com/discordjs/discord.js/commit/7eec06145a141d167afc7814f3cfd9e06eb292e6))
* allow null to be passed in order to reset icon/avatar ([#6646](https://github.com/discordjs/discord.js/issues/6646)) ([6033506](https://github.com/discordjs/discord.js/commit/603350645d0fe9d96b763d169215d15b3f4f71b1))
* await message component collectors should return component interactions not collectors ([#6562](https://github.com/discordjs/discord.js/issues/6562)) ([f49f70a](https://github.com/discordjs/discord.js/commit/f49f70a4ebacf657f22d73043e3a504710821249))
* don't patch set data with undefined ([#6694](https://github.com/discordjs/discord.js/issues/6694)) ([9eb9591](https://github.com/discordjs/discord.js/commit/9eb9591473902a7608aed9c1927690c4445a6fb9))
* **xxxable:** follow more properly with discord behavior ([#6551](https://github.com/discordjs/discord.js/issues/6551)) ([5d87398](https://github.com/discordjs/discord.js/commit/5d87398f9fc57915d5447842b4788f0c80642de0))
### Features
* add support for role icons ([#6633](https://github.com/discordjs/discord.js/issues/6633)) ([7129965](https://github.com/discordjs/discord.js/commit/7129965423e9fb333ca93cecba54b588073873fd))
* **ApplicationCommand:** add #equals ([#6414](https://github.com/discordjs/discord.js/issues/6414)) ([581921f](https://github.com/discordjs/discord.js/commit/581921f8b7152a009cb3bd0496627665b7e3442b))
* **ApplicationCommand:** add support for channel_types ([#6640](https://github.com/discordjs/discord.js/issues/6640)) ([3b14883](https://github.com/discordjs/discord.js/commit/3b14883e349c23a15aec225bb133ce49ed440817))
* **ApplicationCommand:** add version property ([#6603](https://github.com/discordjs/discord.js/issues/6603)) ([f866512](https://github.com/discordjs/discord.js/commit/f866512e8435e03012222298af09addefb605451))
* **BaseGuildTextChannel:** export `BaseGuildTextChannel` ([#6527](https://github.com/discordjs/discord.js/issues/6527)) ([fc51f61](https://github.com/discordjs/discord.js/commit/fc51f61f0cdc66087e918165646aee4be74e6e56))
* **CategoryChannel:** add createChannel shortcut method ([#6614](https://github.com/discordjs/discord.js/issues/6614)) ([3eacf7a](https://github.com/discordjs/discord.js/commit/3eacf7a58785db0639aa38ac4fd455f3b318d4f5))
* **Guild:** Add `Guild#maximumBitrate` getter. ([#6455](https://github.com/discordjs/discord.js/issues/6455)) ([21983de](https://github.com/discordjs/discord.js/commit/21983de3e00b6ae72bb8a41359209f77025a7808))
* **Integration:** add missing props and fix docs/types ([#6623](https://github.com/discordjs/discord.js/issues/6623)) ([caa3b60](https://github.com/discordjs/discord.js/commit/caa3b60c30a8ab13d195e084331889aed820a389))
* **Interaction:** add memberPermissions ([#6741](https://github.com/discordjs/discord.js/issues/6741)) ([28d96e3](https://github.com/discordjs/discord.js/commit/28d96e344bb4b4d9dfb7c9b41a04c95c1eecbd25))
* Allow webhooks to fetch, edit and delete messages in threads ([#6695](https://github.com/discordjs/discord.js/issues/6695)) ([107822d](https://github.com/discordjs/discord.js/commit/107822d28d9de04f6c14fea74647c46fe2fd1016))
* **GuildMember:** add guild avatars ([#5696](https://github.com/discordjs/discord.js/issues/5696)) ([dfd7b40](https://github.com/discordjs/discord.js/commit/dfd7b403a932b2e779b0b1619ebd701a86f70d00))
* **InteractionReponses:** allow fetching of ephemeral messages ([#6426](https://github.com/discordjs/discord.js/issues/6426)) ([d289d5c](https://github.com/discordjs/discord.js/commit/d289d5ccb7153df4656f071c69f41efe74754362))
* **Message:** Add method to resolve a component by id ([#6484](https://github.com/discordjs/discord.js/issues/6484)) ([57b94b9](https://github.com/discordjs/discord.js/commit/57b94b9adf0d7444f494190fc2c8a29d44f1c5eb))
* **Message:** prevent fetching an interaction webhook. ([#6468](https://github.com/discordjs/discord.js/issues/6468)) ([f39b597](https://github.com/discordjs/discord.js/commit/f39b597e3120701287e86acdb247b4815f693c91))
* **MessageAttachment:** add support for ephemeral property ([#6652](https://github.com/discordjs/discord.js/issues/6652)) ([c5db0ff](https://github.com/discordjs/discord.js/commit/c5db0ff60600875534b8bd04666ec99770497870))
* **MessageAttachment:** allow files to be marked as spoilers ([#6509](https://github.com/discordjs/discord.js/issues/6509)) ([96e26c4](https://github.com/discordjs/discord.js/commit/96e26c428d7745b14908d56a96b635226471d699))
* **MessageTypes:** add CONTEXT_MENU_COMMAND (23) ([#6425](https://github.com/discordjs/discord.js/issues/6425)) ([d81590d](https://github.com/discordjs/discord.js/commit/d81590d566f7252832acfa97976343f551405848))
* **PartialGroupDMChannel:** Add recipients & fix name ([#6713](https://github.com/discordjs/discord.js/issues/6713)) ([2803db6](https://github.com/discordjs/discord.js/commit/2803db683defe73a8b24a9f3c98d7f90d9605e5c))
* **Permissions:** add `START_EMBEDDED_ACTIVITIES` ([#6622](https://github.com/discordjs/discord.js/issues/6622)) ([66a90d3](https://github.com/discordjs/discord.js/commit/66a90d3f8903c7dbe17851f7120a06f0e1f2ee96))
* **Threads:** update permissions and fix getters ([#6466](https://github.com/discordjs/discord.js/issues/6466)) ([10478ad](https://github.com/discordjs/discord.js/commit/10478ad14850123625a551b5c26143aa32313ab8))
* **UserManager:** allow #fetch to take UserResolvable ([#6677](https://github.com/discordjs/discord.js/issues/6677)) ([a06a87a](https://github.com/discordjs/discord.js/commit/a06a87a7c49db29b108b77db82cf8e6f4346ef19))
* add api error code 160002 ([#6566](https://github.com/discordjs/discord.js/issues/6566)) ([d16ada9](https://github.com/discordjs/discord.js/commit/d16ada97087e0324134484c9c0724b52a2839bdf))
* add api error code 30042 ([#6635](https://github.com/discordjs/discord.js/issues/6635)) ([183dbd7](https://github.com/discordjs/discord.js/commit/183dbd7e533f17ae3375f42fd95cbaf3ea06bffd))
* add api error code 50101 ([#6663](https://github.com/discordjs/discord.js/issues/6663)) ([42fdcaa](https://github.com/discordjs/discord.js/commit/42fdcaa1da65f097ef441beee5062f78ae03dfda))
* add maximum prune requests reached api error ([#6427](https://github.com/discordjs/discord.js/issues/6427)) ([a4b8623](https://github.com/discordjs/discord.js/commit/a4b8623b60150b3d9e3d2d54a2ef07e240e3c5c7))
* Add support for API command types in `ApplicationCommandManager` ([#6621](https://github.com/discordjs/discord.js/issues/6621)) ([ecd637f](https://github.com/discordjs/discord.js/commit/ecd637f7d6174d4c8e86c8eb8e782eb6a197dd6e))
* default values for setX boolean methods ([#6619](https://github.com/discordjs/discord.js/issues/6619)) ([8add4b0](https://github.com/discordjs/discord.js/commit/8add4b08f5e93ff690454b8f9673f2ad4a678841))
* Give removed `MessageReaction`s on `messageReactionRemoveAll` event ([#6607](https://github.com/discordjs/discord.js/issues/6607)) ([be8912a](https://github.com/discordjs/discord.js/commit/be8912a4219d1c1aa59a8060707973e567b7b5a3))
* **Rest:** expose https.Agent options ([#6177](https://github.com/discordjs/discord.js/issues/6177)) ([5eb3553](https://github.com/discordjs/discord.js/commit/5eb3553fd1d7bcd88f2ddbccb452a470eb853ecb))
* **ThreadChannel:** add fetchStarterMessage ([#6488](https://github.com/discordjs/discord.js/issues/6488)) ([705c5a1](https://github.com/discordjs/discord.js/commit/705c5a1c17bc3ba31f03f7bd6831e4c50dcbddd0))
* **Threads:** add support for invitable in private threads ([#6501](https://github.com/discordjs/discord.js/issues/6501)) ([a693254](https://github.com/discordjs/discord.js/commit/a6932546e2ed919bf130a919a597b4f31ef35307))
* **User:** banners and accent colors ([#6117](https://github.com/discordjs/discord.js/issues/6117)) ([839c6da](https://github.com/discordjs/discord.js/commit/839c6da03d0cc24b9023d807ba53c81704b9cb72))
* export BaseCommandInteraction ([#6478](https://github.com/discordjs/discord.js/issues/6478)) ([c14e594](https://github.com/discordjs/discord.js/commit/c14e594d8a905d5559aa1f6ce013d245552295fd))
* export ContextMenuInteraction ([#6434](https://github.com/discordjs/discord.js/issues/6434)) ([170c0c4](https://github.com/discordjs/discord.js/commit/170c0c4985595f77555c07747e72ae381d98a4d4))
* set methods for MessageActionRow and MessageSelectMenu ([#6490](https://github.com/discordjs/discord.js/issues/6490)) ([fb50dd9](https://github.com/discordjs/discord.js/commit/fb50dd984178b21375928431fb106f3ba5ed91ee))
### Performance Improvements
* use logical assignments instead of if statements ([#6693](https://github.com/discordjs/discord.js/issues/6693)) ([e9daa31](https://github.com/discordjs/discord.js/commit/e9daa31eaf73c90daee667fb89542bd0e5e763ad))
# [13.1.0](https://github.com/discordjs/discord.js/compare/13.0.1...13.1.0) (2021-08-12)
### Bug Fixes
* **Constants:** fix CDN endpoint typings ([#6332](https://github.com/discordjs/discord.js/issues/6332)) ([47d2ef3](https://github.com/discordjs/discord.js/commit/47d2ef3e40165d846b5a901709b26dfffea46ef2))
* **ContextMenuInteractin:** store message as raw value ([#6400](https://github.com/discordjs/discord.js/issues/6400)) ([d9456a1](https://github.com/discordjs/discord.js/commit/d9456a1a76e66bc2bfffa4a4b1dd228132056e9f))
* **Guild:** `preferredLocale` to always be a string ([#6402](https://github.com/discordjs/discord.js/issues/6402)) ([4a64662](https://github.com/discordjs/discord.js/commit/4a64662a7d5526817ad52fa3d2206dc11f38cb29))
* **GuildMemberRoleManager:** typo ([#6335](https://github.com/discordjs/discord.js/issues/6335)) ([d87299b](https://github.com/discordjs/discord.js/commit/d87299ba2036ee19da22b5c8abfae3f9d355ea1e))
* **Managers:** fix typo in unsupported warning ([#6338](https://github.com/discordjs/discord.js/issues/6338)) ([917e71a](https://github.com/discordjs/discord.js/commit/917e71a9ee7d8bd76d8dbea40b40a4fb28276f60))
* **StageInstance:** Ensure `discoverableDisabled` is not `undefined` ([#6395](https://github.com/discordjs/discord.js/issues/6395)) ([dce8fc7](https://github.com/discordjs/discord.js/commit/dce8fc7b9d4603de26b1118058322aaa96ea699a))
* **Util:** remove truthy check before isNaN check ([#6358](https://github.com/discordjs/discord.js/issues/6358)) ([3c17939](https://github.com/discordjs/discord.js/commit/3c17939fd53a1f139d95bd36dfdab85b46538a73))
* **WidgetMember:** Default to `null` and not `undefined` ([#6399](https://github.com/discordjs/discord.js/issues/6399)) ([44bbfa5](https://github.com/discordjs/discord.js/commit/44bbfa5c46a4bb35777aec8681f18590dec9aea4))
### Features
* **CommandInteractionResolvedData:** access to "raw" resolved data ([#6384](https://github.com/discordjs/discord.js/issues/6384)) ([fff887b](https://github.com/discordjs/discord.js/commit/fff887b2f43d19164dbf2878b00abead90a0703f))
* **GuildManager:** allow setting with_counts to false ([#6407](https://github.com/discordjs/discord.js/issues/6407)) ([14aea12](https://github.com/discordjs/discord.js/commit/14aea1290061c225feb9d9f5378508d937e34a69))
* **GuildMemberManager:** add 'list' method ([#6403](https://github.com/discordjs/discord.js/issues/6403)) ([2bf0970](https://github.com/discordjs/discord.js/commit/2bf09703c13afe7481071ae1b064dbc3513468e1))
* **Utils:** add additional formatters ([#6388](https://github.com/discordjs/discord.js/issues/6388)) ([cd40292](https://github.com/discordjs/discord.js/commit/cd4029218fc8b67c395b3cd49a121b1bfa38f021))
* **ContextMenus:** right-clickybois (context menu support for ApplicationCommand and CommandInteraction) ([#6176](https://github.com/discordjs/discord.js/issues/6176)) ([0266f28](https://github.com/discordjs/discord.js/commit/0266f280960729b27bf65ba0ee7b7bd8659f304d))
* **Threads:** max autoArchiveDuration option ([#6304](https://github.com/discordjs/discord.js/issues/6304)) ([394d486](https://github.com/discordjs/discord.js/commit/394d48649fe4faef8c6b30d5c04962588f86261e))
## [13.0.1](https://github.com/discordjs/discord.js/compare/13.0.0...13.0.1) (2021-08-07)
### Bug Fixes
* **GuildMemberManager:** refactor fetchMany ([#6328](https://github.com/discordjs/discord.js/issues/6328)) ([909c873](https://github.com/discordjs/discord.js/commit/909c87353e24eb7947d1cabc78d9c0ee97c3902d))
* **Message:** handle fetched messages ([#6325](https://github.com/discordjs/discord.js/issues/6325)) ([ceae596](https://github.com/discordjs/discord.js/commit/ceae5960edefc63be5f16a52e286e390c14e0d29))
# [13.0.0](https://github.com/discordjs/discord.js/compare/12.5.0...13.0.0) (2021-08-06)
### Bug Fixes
* **Action:** getChannel interaction DM ([#6280](https://github.com/discordjs/discord.js/issues/6280)) ([a72b5a3](https://github.com/discordjs/discord.js/commit/a72b5a355e443f17edf1b348f63d314c743093b9))
* **BaseGuildTextChannel:** call patch ([#6298](https://github.com/discordjs/discord.js/issues/6298)) ([3eb4140](https://github.com/discordjs/discord.js/commit/3eb41405f412ee2b2d05c4245c4ebb80adfcec6b))
* **Caching:** sweep archived threads in all channel caches ([#6312](https://github.com/discordjs/discord.js/issues/6312)) ([3725dca](https://github.com/discordjs/discord.js/commit/3725dcafc0cbb4a40d3ff66d2a9718e986f47c5b))
* **Channel:** add default for destructured options ([#6203](https://github.com/discordjs/discord.js/issues/6203)) ([6872547](https://github.com/discordjs/discord.js/commit/68725476b39d5ef5793ccf62cfb468073e7d9cb2))
* **ChannelUpdate:** restore accidentally removed line ([#6263](https://github.com/discordjs/discord.js/issues/6263)) ([774f5b7](https://github.com/discordjs/discord.js/commit/774f5b77ec6218c30360c773b5fe6185d1efd146))
* **CommandInteractionOptionResolver:** Export CommandInteractionOptio… ([#6146](https://github.com/discordjs/discord.js/issues/6146)) ([8ccfd6e](https://github.com/discordjs/discord.js/commit/8ccfd6e07b3208568c495110c80990366637818e))
* **CommandInteractionOptionResolver:** type should be USER ([#6148](https://github.com/discordjs/discord.js/issues/6148)) ([02f55f0](https://github.com/discordjs/discord.js/commit/02f55f09712af5d6a6f67b5ac369b1969801e23f))
* **Guild:** add invite manager property, extend CachedManager ([#6049](https://github.com/discordjs/discord.js/issues/6049)) ([e3d877d](https://github.com/discordjs/discord.js/commit/e3d877d542518d0f82c476d921968338a859722b))
* **GuildChannel:** Add missing 'cache' property ([#6019](https://github.com/discordjs/discord.js/issues/6019)) ([7e30011](https://github.com/discordjs/discord.js/commit/7e3001191c1529b9db09b6168ddd0c09931598f5))
* **GuildChannel:** setParent not working ([#6276](https://github.com/discordjs/discord.js/issues/6276)) ([7e0618f](https://github.com/discordjs/discord.js/commit/7e0618f17a786708093bc532501b261191e85561))
* **GuildChannel:** use map method on cache not its manager ([#6032](https://github.com/discordjs/discord.js/issues/6032)) ([d58f0d2](https://github.com/discordjs/discord.js/commit/d58f0d243c9bbd803cff7b8da2056c11e0416bef))
* **GuildMemberManager:** fetchMany fixes ([#6314](https://github.com/discordjs/discord.js/issues/6314)) ([52817fc](https://github.com/discordjs/discord.js/commit/52817fc414eef5220043e055a740e4ad0f8287a0))
* **Message:** fix thread getter ([#6309](https://github.com/discordjs/discord.js/issues/6309)) ([913c9fa](https://github.com/discordjs/discord.js/commit/913c9fa17672fa914776beb556edcee5cd2d2dc8))
* **MessageMentions:** check guild exists before adding roles ([#6313](https://github.com/discordjs/discord.js/issues/6313)) ([1200bba](https://github.com/discordjs/discord.js/commit/1200bba7bcc48dab6a454925e533528a7e3c0cf7))
* export various classes that are exported in the typings ([#6166](https://github.com/discordjs/discord.js/issues/6166)) ([30a58dc](https://github.com/discordjs/discord.js/commit/30a58dc80130d334bf8c85e7b37513c109beda1b))
* remove support for overriding caches that break functionality ([#6282](https://github.com/discordjs/discord.js/issues/6282)) ([a6d4035](https://github.com/discordjs/discord.js/commit/a6d4035176ca784e75bd1cbdf30e039658c62fd4))
* **CommandInteraction:** change options type from Collection to array ([#6139](https://github.com/discordjs/discord.js/issues/6139)) ([77784ac](https://github.com/discordjs/discord.js/commit/77784aca431709ff3c17095bd06f9e4016fbd11d))
* **GuildAuditLog:** Assert `target` to null upon not finding invite codes ([#6171](https://github.com/discordjs/discord.js/issues/6171)) ([c8ca7bf](https://github.com/discordjs/discord.js/commit/c8ca7bfd2c5e7b29e54987a78301e9bdfa4a717b))
* **GuildChannel:** clone its PermissionOverwriteManager too ([#6083](https://github.com/discordjs/discord.js/issues/6083)) ([f72ce7c](https://github.com/discordjs/discord.js/commit/f72ce7c136cf2dfe31a67b190c00e30ba7d70bfa))
* **GuildChannel:** only fetch invites for the specific channel ([#6132](https://github.com/discordjs/discord.js/issues/6132)) ([c40c0f9](https://github.com/discordjs/discord.js/commit/c40c0f934a571c100e4b3aa633a80fe48661d836))
* **InviteScope:** added missing 'bot' scope ([#6052](https://github.com/discordjs/discord.js/issues/6052)) ([93e2c04](https://github.com/discordjs/discord.js/commit/93e2c04ec27c44a8c955e576944023dc25075647))
* **Message:** fix typo in sticker_items ([#6173](https://github.com/discordjs/discord.js/issues/6173)) ([870a0de](https://github.com/discordjs/discord.js/commit/870a0de53c01331c9357df4808fc0979ff17b9a4))
* **Message:** make #channel and #guild getters ([#6271](https://github.com/discordjs/discord.js/issues/6271)) ([6e3236a](https://github.com/discordjs/discord.js/commit/6e3236ab64549d27445c631cbb3d88c2bb9bf289))
* **PermissionOverwriteManager:** pass ID to API correctly ([#6026](https://github.com/discordjs/discord.js/issues/6026)) ([8077e4f](https://github.com/discordjs/discord.js/commit/8077e4f4f132f95c4fa21e9fc7313b93a2c4b9d7))
* **PermissionOverwrites:** throw better error if resolving option fails ([#6219](https://github.com/discordjs/discord.js/issues/6219)) ([42a0313](https://github.com/discordjs/discord.js/commit/42a03130345d3a3841f5271d82a2cb8725b6fa0e))
* **PermissionsOverwrites:** only convert type if number ([#6092](https://github.com/discordjs/discord.js/issues/6092)) ([dee5c83](https://github.com/discordjs/discord.js/commit/dee5c83fc0d1147d5b65151a8f91a4a089687a73))
* **PresenceUpdate:** use added presence over nullable getter ([#6077](https://github.com/discordjs/discord.js/issues/6077)) ([637c8e0](https://github.com/discordjs/discord.js/commit/637c8e0fdfb4ce15361646017718c72c3d6af538))
* **SelectMenuInteraction:** set values to empty array if not provided ([#6045](https://github.com/discordjs/discord.js/issues/6045)) ([34708d6](https://github.com/discordjs/discord.js/commit/34708d6d18f94b5c8d9c582973d057e1f89bfe1f))
* **Sticker:** replace 'this.guildID' (undefined) by 'this.guildId' in fetchUser ([#6160](https://github.com/discordjs/discord.js/issues/6160)) ([07017a9](https://github.com/discordjs/discord.js/commit/07017a9699eecc4af7824ace39dd91e8b689f3c6))
* **Structures:** remove Structures ([#6027](https://github.com/discordjs/discord.js/issues/6027)) ([ab0b3b9](https://github.com/discordjs/discord.js/commit/ab0b3b9a07f5e4987e4f25e41b2a007f2db06322))
* **TeamMember:** Fixed incorrect return types. ([#6044](https://github.com/discordjs/discord.js/issues/6044)) ([fe5d56c](https://github.com/discordjs/discord.js/commit/fe5d56c9b11b3e5f05933c6d746237b9f353b392))
* **TextBasedChannel:** Fix MessageCreate handling ([#6217](https://github.com/discordjs/discord.js/issues/6217)) ([6b85f90](https://github.com/discordjs/discord.js/commit/6b85f900fa8e6cc01f7ee14ae730950cf1635dd5))
* **ThreadChannel:** better property handling ([#6172](https://github.com/discordjs/discord.js/issues/6172)) ([9679b90](https://github.com/discordjs/discord.js/commit/9679b9087200e29d2f488d84d115465449021b51))
* **Util:** fix collection import ([#6256](https://github.com/discordjs/discord.js/issues/6256)) ([93e0239](https://github.com/discordjs/discord.js/commit/93e0239c8054293eac63338819a10490dbd49ff1))
* **WebSocketShard:** mark shard ready if no guilds intent ([#6284](https://github.com/discordjs/discord.js/issues/6284)) ([09471be](https://github.com/discordjs/discord.js/commit/09471be30eea2540999c3d5a2b001a985a0d27cc))
* array/keyArray removed ([#6245](https://github.com/discordjs/discord.js/issues/6245)) ([bf221f2](https://github.com/discordjs/discord.js/commit/bf221f2bef2871f019aa4a6978deb8460fff85b9))
* Use `string` instead of `Snowflake` for invites ([#6202](https://github.com/discordjs/discord.js/issues/6202)) ([f060a3f](https://github.com/discordjs/discord.js/commit/f060a3fcd7e1ad30789d582e8baf28dbdddf8063))
* **Typings:** type attachments to InteractionUpdateOptions ([#6162](https://github.com/discordjs/discord.js/issues/6162)) ([4f8ca29](https://github.com/discordjs/discord.js/commit/4f8ca2936a85109757fb3225e9d6cf9aae9714e2))
* channel type check in actions ([#6086](https://github.com/discordjs/discord.js/issues/6086)) ([d433fe8](https://github.com/discordjs/discord.js/commit/d433fe8a0827e6275e2a7ceed537be38411f4f67))
* Remove `connection.url` from open debug message ([#6018](https://github.com/discordjs/discord.js/issues/6018)) ([39db953](https://github.com/discordjs/discord.js/commit/39db95352c91faf175c2fd8ed365f293f965a0e4))
* **Util:** splitMessage not working with array ([#6008](https://github.com/discordjs/discord.js/issues/6008)) ([bd25ff5](https://github.com/discordjs/discord.js/commit/bd25ff59133ba31713647d3e6a5ef66abc4d54fb))
* correct permissions checks and cache on update ([#6015](https://github.com/discordjs/discord.js/issues/6015)) ([568691c](https://github.com/discordjs/discord.js/commit/568691ce6a7994adc85db2b2a5b2227ece8c8358))
* typedefs and typings for image & webhook options ([#5805](https://github.com/discordjs/discord.js/issues/5805)) ([a5a6e22](https://github.com/discordjs/discord.js/commit/a5a6e223166cf9af430da9003780e6582ea17b1c))
* **ApplicationCommand:** default option.required fix ([#5848](https://github.com/discordjs/discord.js/issues/5848)) ([a1f94f6](https://github.com/discordjs/discord.js/commit/a1f94f670e5b6009b9c33932ce06ed512447b953))
* **ApplicationCommand:** default option.required to false ([#5838](https://github.com/discordjs/discord.js/issues/5838)) ([77c1f15](https://github.com/discordjs/discord.js/commit/77c1f15c9f7562465c07727602c3213ddcf02778))
* **ApplicationCommand:** fix typo in JSDoc ([#5994](https://github.com/discordjs/discord.js/issues/5994)) ([6edf55c](https://github.com/discordjs/discord.js/commit/6edf55c04b970235fdc92c00808ee86002e589b6))
* **ApplicationCommand:** stringType isn't supposed to be sent to the API ([#5916](https://github.com/discordjs/discord.js/issues/5916)) ([ca2a36b](https://github.com/discordjs/discord.js/commit/ca2a36b1d713a743045b15adf99eda69a6fdbec7))
* **ApplicationCommands:** allow managing commands for uncached guilds ([#5729](https://github.com/discordjs/discord.js/issues/5729)) ([24e5868](https://github.com/discordjs/discord.js/commit/24e586881865c187ff0a3044ac37f6e338cc51ee))
* **ClientApplication:** freeze flags ([#5811](https://github.com/discordjs/discord.js/issues/5811)) ([e990c35](https://github.com/discordjs/discord.js/commit/e990c35476fb6f7e1a5449493833140144e0469c))
* **Collector:** docs and types ([#5937](https://github.com/discordjs/discord.js/issues/5937)) ([6c447b1](https://github.com/discordjs/discord.js/commit/6c447b12e3f978328cb2577ea3f81a5ab1531bbf))
* **Guild:** don't patch before instance properties ([#5885](https://github.com/discordjs/discord.js/issues/5885)) ([174b7a7](https://github.com/discordjs/discord.js/commit/174b7a7f9c5f95ab182a2c90dae43ccd4f55357b))
* **Guild:** setChannelPositions null parenting ([#5841](https://github.com/discordjs/discord.js/issues/5841)) ([01a1fd6](https://github.com/discordjs/discord.js/commit/01a1fd615bbf017e18bbffe8e97336345f42564a))
* **GuildChannel:** clone errors when options.name isn't provided ([#5804](https://github.com/discordjs/discord.js/issues/5804)) ([41673b7](https://github.com/discordjs/discord.js/commit/41673b738232f64da2ded3b15be0f798135ae351))
* **GuildChannel:** don't force parentID/permissionOverwrites to empty on create ([#5823](https://github.com/discordjs/discord.js/issues/5823)) ([c585933](https://github.com/discordjs/discord.js/commit/c5859337b616c1fe2a60884595d27db4f13d8fee))
* **GuildChannel:** improve empty overwrite handling for permissionsLocked ([#5821](https://github.com/discordjs/discord.js/issues/5821)) ([6df3623](https://github.com/discordjs/discord.js/commit/6df36232a05e396d31461200725755745526d2ed))
* **GuildChannel:** spread clone options to avoid infinite recursion ([#5800](https://github.com/discordjs/discord.js/issues/5800)) ([2f5424b](https://github.com/discordjs/discord.js/commit/2f5424bdac7c97d0a371dd72084ac02d5e774f1a))
* **GuildManager:** #create throws when systemChannelFlags is undefined ([#5832](https://github.com/discordjs/discord.js/issues/5832)) ([29173bf](https://github.com/discordjs/discord.js/commit/29173bf814e2cd795467b9b3814f0eaf0773e9ae))
* **Hooks:** make husky hooks executable ([#5812](https://github.com/discordjs/discord.js/issues/5812)) ([77e28cf](https://github.com/discordjs/discord.js/commit/77e28cf65b0fb3fc2fb7ab07fc7bb0f2f5a400b5))
* **InteractionResponses:** set replied status on editReply ([#5899](https://github.com/discordjs/discord.js/issues/5899)) ([6d3d00b](https://github.com/discordjs/discord.js/commit/6d3d00b44577a70e840f0187d6894043677c5329))
* **Message:** editedTimestamp defaulting to 0 ([#5847](https://github.com/discordjs/discord.js/issues/5847)) ([671436c](https://github.com/discordjs/discord.js/commit/671436cbb89f7f48bd9ae0ccb9dd75a376cc5281))
* **Message:** flags not being parsed on some edits ([#5886](https://github.com/discordjs/discord.js/issues/5886)) ([2d7c12b](https://github.com/discordjs/discord.js/commit/2d7c12b0e9387f56f1809822bc2c8c4ee52a00e9))
* **Message:** Make author of referenced message nullable ([#5929](https://github.com/discordjs/discord.js/issues/5929)) ([dc671c8](https://github.com/discordjs/discord.js/commit/dc671c8ac418c1f932034e82f38def28575a4b65))
* **PermissionOverwrites:** optional allow/deny OverwriteData ([#5810](https://github.com/discordjs/discord.js/issues/5810)) ([a7ebb21](https://github.com/discordjs/discord.js/commit/a7ebb2145c380214567514906393c4ab87932e95))
* **Permissions:** allow admin to override in the missing method ([#5911](https://github.com/discordjs/discord.js/issues/5911)) ([ee025b0](https://github.com/discordjs/discord.js/commit/ee025b05588493b55057b237ca96f88ecc5f0b02))
* **presenceUpdate:** fire when only state/details change on an activity ([#5846](https://github.com/discordjs/discord.js/issues/5846)) ([1f8f3ab](https://github.com/discordjs/discord.js/commit/1f8f3ab0f8dbd346154bbfa14a98726b8df25d57))
* **Sharding:** strict type context and return ([#5933](https://github.com/discordjs/discord.js/issues/5933)) ([1925d01](https://github.com/discordjs/discord.js/commit/1925d01d8f05ca10b2a39b91f25ffcabe363874b))
* **TextBasedChannel:** allow passing an APIMessage with split ([#5815](https://github.com/discordjs/discord.js/issues/5815)) ([93b0a4e](https://github.com/discordjs/discord.js/commit/93b0a4e005b5b1d371f7936238556db2e36cc982))
* **Thread:** make archive_timestamp not nullable ([#5965](https://github.com/discordjs/discord.js/issues/5965)) ([edab5af](https://github.com/discordjs/discord.js/commit/edab5afff9a4c79e5965c7c52b0a0d5ebb9ba35a))
* **ThreadChannel:** check for existence of properties when patching ([#5961](https://github.com/discordjs/discord.js/issues/5961)) ([9ac6867](https://github.com/discordjs/discord.js/commit/9ac68670d782fc81e266784e790af699f280eb0e))
* **ThreadManager:** fixed wrong private and fetchAll check ([#6012](https://github.com/discordjs/discord.js/issues/6012)) ([e4be666](https://github.com/discordjs/discord.js/commit/e4be666c2c273c56f04b8f965efc88bb9aff0032))
* **ThreadMemberManager:** fix ThreadMemberManager#add and ThreadMemberManager#fetch ([#5927](https://github.com/discordjs/discord.js/issues/5927)) ([adecead](https://github.com/discordjs/discord.js/commit/adecead716670278516fd031f240e05792420c75))
* **Typings:** erronous RawMessage ([5842e35](https://github.com/discordjs/discord.js/commit/5842e35881755350764b557d66b475c2c03f249a))
* **Typings:** Fix BitField toJSON/valueOf return types ([#5806](https://github.com/discordjs/discord.js/issues/5806)) ([935f819](https://github.com/discordjs/discord.js/commit/935f819207ac4219d37f3b99a2508e368626e6da))
* **Typings:** Improve components typings in MessageEditOptions ([#6002](https://github.com/discordjs/discord.js/issues/6002)) ([3a718d8](https://github.com/discordjs/discord.js/commit/3a718d8c625ab45bc9f4dfcd9d6bbdef67ae75b4))
* **User:** fix bot and system properties being incorrect in some cases ([#5923](https://github.com/discordjs/discord.js/issues/5923)) ([e44ae96](https://github.com/discordjs/discord.js/commit/e44ae961005358dac7032c75bfc74be3b719e5a1))
* **Webhook:** resolve non-string avatars too ([#5914](https://github.com/discordjs/discord.js/issues/5914)) ([4714a96](https://github.com/discordjs/discord.js/commit/4714a961b87746b0f85214c756614d276666f285))
* **Webhook:** return void from #delete for consistency. ([#5954](https://github.com/discordjs/discord.js/issues/5954)) ([5ad83a6](https://github.com/discordjs/discord.js/commit/5ad83a6a65e5944ceb3a41fee2df40ba1f5b03e4))
* **Webhook:** throw an error if no token is available when it's required ([#5798](https://github.com/discordjs/discord.js/issues/5798)) ([eb98e33](https://github.com/discordjs/discord.js/commit/eb98e33a85cc9bb235ceb509ed01218bae44ba73))
* **WebSocketShard:** don't catch errors thrown in event handlers ([#5803](https://github.com/discordjs/discord.js/issues/5803)) ([53d8e49](https://github.com/discordjs/discord.js/commit/53d8e49dca2d83fe2e066fb0b3d10418acbbc244))
* don't patch missing properties from partial payloads ([#5796](https://github.com/discordjs/discord.js/issues/5796)) ([097c7b9](https://github.com/discordjs/discord.js/commit/097c7b9cdd5e1bb52b037272eed19f556800ccff))
* add missing imports for custom errors ([#5767](https://github.com/discordjs/discord.js/issues/5767)) ([e980948](https://github.com/discordjs/discord.js/commit/e980948de55e91e59c9e3293ac76bc645a058a53))
* **ApiMessage:** only pass objects as options directly ([#5793](https://github.com/discordjs/discord.js/issues/5793)) ([3578159](https://github.com/discordjs/discord.js/commit/35781597d032fa7821e010e483c89f70ec51926c))
* **BitField:** ensure missing returns an array of strings ([#5795](https://github.com/discordjs/discord.js/issues/5795)) ([68f7aeb](https://github.com/discordjs/discord.js/commit/68f7aebcafcfd62bef02de855ca0c304a54e8d4c))
* **BitField:** throw an error if bit to resolve is undefined ([#5565](https://github.com/discordjs/discord.js/issues/5565)) ([0156f69](https://github.com/discordjs/discord.js/commit/0156f693e08fe2ad75133bf67c4aeb3e9c91a02d))
* **ClientPresence:** produce valid activities for set presences ([#5799](https://github.com/discordjs/discord.js/issues/5799)) ([ea0e06f](https://github.com/discordjs/discord.js/commit/ea0e06f9802fb57b41f471413b39ccd09546bb67))
* add components to MessageOption typedefs ([#5768](https://github.com/discordjs/discord.js/issues/5768)) ([657635c](https://github.com/discordjs/discord.js/commit/657635c1c09aa68211130bc3c56d6e8bb6e8e773))
* remove remnants of awaitMessageComponentInteractions ([#5783](https://github.com/discordjs/discord.js/issues/5783)) ([ae78a33](https://github.com/discordjs/discord.js/commit/ae78a336e1d0d190ec9f525449332dc781e0b3bf))
* **APIMessage:** document Interaction as valid MessageTarget ([#5678](https://github.com/discordjs/discord.js/issues/5678)) ([9f491ff](https://github.com/discordjs/discord.js/commit/9f491ffeb96ff380f2ab5ab2f86201d58be64c41))
* **ApplicationCommand:** return string equivalent of ApplicationCommandOptionType ([#5617](https://github.com/discordjs/discord.js/issues/5617)) ([a6079bc](https://github.com/discordjs/discord.js/commit/a6079bc9ce40ecbb4adace033dbf201897b5459f))
* **ApplicationCommandManager:** fix typo in JSDoc ([#5603](https://github.com/discordjs/discord.js/issues/5603)) ([3392eb7](https://github.com/discordjs/discord.js/commit/3392eb7de270842dbf5a54d19aa3e703dd445ba0))
* **ApplicationCommandManager:** limit permission methods to guilds ([#5613](https://github.com/discordjs/discord.js/issues/5613)) ([03256bd](https://github.com/discordjs/discord.js/commit/03256bd9f88c63dc5c2169e2c09ac8078ea84992))
* **ApplicationCommandOptionData:** options property should be itself ([#5679](https://github.com/discordjs/discord.js/issues/5679)) ([b90b0c3](https://github.com/discordjs/discord.js/commit/b90b0c3cfa2278caa38d1ff41eef2ccf4428b99e))
* **CommandInteraction:** channel type should be text based channels ([#5690](https://github.com/discordjs/discord.js/issues/5690)) ([5141ea4](https://github.com/discordjs/discord.js/commit/5141ea4f0694a60375d8bc0801b1225928bb3bd1))
* **CommandInteraction:** cmds with no options throw error ([#5734](https://github.com/discordjs/discord.js/issues/5734)) ([af2fad9](https://github.com/discordjs/discord.js/commit/af2fad94732eeb620fe17d9b537c279471c567c0))
* **CommandInteraction:** update typings and docs for #editReply ([#5630](https://github.com/discordjs/discord.js/issues/5630)) ([56d44fb](https://github.com/discordjs/discord.js/commit/56d44fbf1c922260c497350e8829d7151eb7a331))
* **DataResolver:** fix circular dependency error with GuildTemplate ([#5622](https://github.com/discordjs/discord.js/issues/5622)) ([b376f31](https://github.com/discordjs/discord.js/commit/b376f31af9881b9cd3f82ac4a42a468947cce482))
* **Emoji:** name can be null ([#5513](https://github.com/discordjs/discord.js/issues/5513)) ([5397021](https://github.com/discordjs/discord.js/commit/5397021efb1f9883cf4b48a0ca78d12b713a61fd))
* **GuildEmojiRoleManager:** bug in #remove ([#5666](https://github.com/discordjs/discord.js/issues/5666)) ([c89bdd7](https://github.com/discordjs/discord.js/commit/c89bdd7566599a95a404b0f9e4b0828a866d0a71))
* **GuildMemberManager:** allow moving members to any non-text channel ([#5681](https://github.com/discordjs/discord.js/issues/5681)) ([d21e6af](https://github.com/discordjs/discord.js/commit/d21e6af1d2b81db9847336b3f964f9d2693394e6))
* **GuildMemberRoleManager:** unable to remove roles when passed an array ([#5556](https://github.com/discordjs/discord.js/issues/5556)) ([9572521](https://github.com/discordjs/discord.js/commit/9572521e3c390e610de8e4dc79e4086b3b1d6e44))
* **HTTPOptions:** change default value in jsdoc to 8 ([#5547](https://github.com/discordjs/discord.js/issues/5547)) ([cb50241](https://github.com/discordjs/discord.js/commit/cb50241e6fa7c95891925c8b18840c17df078620))
* **Interaction:** add missing types and fix docs lists ([#5762](https://github.com/discordjs/discord.js/issues/5762)) ([1d57754](https://github.com/discordjs/discord.js/commit/1d57754d4654c5c95aa14afc13f8abe335314767))
* **Message:** bug in #suppressEmbeds due to [#5612](https://github.com/discordjs/discord.js/issues/5612) ([#5644](https://github.com/discordjs/discord.js/issues/5644)) ([840ad0a](https://github.com/discordjs/discord.js/commit/840ad0a35a344a19c5bb84c421f80802fb186d0b))
* **Message:** editing with MessageEmbed or APIMessage ([#5612](https://github.com/discordjs/discord.js/issues/5612)) ([74e97ef](https://github.com/discordjs/discord.js/commit/74e97ef91b413300c83f163bc3914eaf8bd45d89))
* **Message:** update typings and docs related to #edit ([#5745](https://github.com/discordjs/discord.js/issues/5745)) ([a2f0c11](https://github.com/discordjs/discord.js/commit/a2f0c11474826bfd5b770d2a6990b6bd41c89451))
* **MessageComponentInteraction:** correctly type defer method ([#5760](https://github.com/discordjs/discord.js/issues/5760)) ([f0dad26](https://github.com/discordjs/discord.js/commit/f0dad26a5b8c3139b2519d1895df2fe23352b102))
* **MessageEmbed:** import custom RangeError class ([#5740](https://github.com/discordjs/discord.js/issues/5740)) ([bfe01b5](https://github.com/discordjs/discord.js/commit/bfe01b52ab29df1bb26fc2d385f63fb5adbb12b2))
* **PermissionOverwrites:** fix typo in typedef jsdoc ([#5704](https://github.com/discordjs/discord.js/issues/5704)) ([6567ba8](https://github.com/discordjs/discord.js/commit/6567ba821a54d3dc97d07ce8ac55335fef2f346b))
* **RoleManager:** bug in #create ([#5730](https://github.com/discordjs/discord.js/issues/5730)) ([cf22456](https://github.com/discordjs/discord.js/commit/cf224560bc59c05f7801088b0db2ec76c5369302))
* **ShardingManager:** client error event cannot be emitted ([#5559](https://github.com/discordjs/discord.js/issues/5559)) ([d1c5b6f](https://github.com/discordjs/discord.js/commit/d1c5b6fe9e18b532ad69ed4bd82e1874a6dff4df))
* **Types:** make event listeners accept async callbacks ([#5602](https://github.com/discordjs/discord.js/issues/5602)) ([a73a5cf](https://github.com/discordjs/discord.js/commit/a73a5cf91498cf7b08cea85753ad481c194ec089))
* **Typings:** add missing typings for `HttpError` -> `requestData` ([#5742](https://github.com/discordjs/discord.js/issues/5742)) ([3e9ce35](https://github.com/discordjs/discord.js/commit/3e9ce35023e71ffda1f4eaca6f109b0422ec7d29))
* **Webhook:** #editMessage throws error when content is null ([#5757](https://github.com/discordjs/discord.js/issues/5757)) ([2901fd5](https://github.com/discordjs/discord.js/commit/2901fd595be847a0e6c86155b3229d3341cfad32))
* interfaces not importing due to re-export of Snowflake ([#5723](https://github.com/discordjs/discord.js/issues/5723)) ([086c3f0](https://github.com/discordjs/discord.js/commit/086c3f0799d65c64c4e60d6370246a37a27a1eab))
* lint-staged for typescript files ([5f6ec22](https://github.com/discordjs/discord.js/commit/5f6ec2211d1e6555ab2d501579e4a1d97023c647))
* resolve emoji in Message#react ([#5614](https://github.com/discordjs/discord.js/issues/5614)) ([c733436](https://github.com/discordjs/discord.js/commit/c7334363b36c5f7f1c7880fe77a2e9b2eb1a6442))
* typo in GuildMemberManager ([#5616](https://github.com/discordjs/discord.js/issues/5616)) ([73f4114](https://github.com/discordjs/discord.js/commit/73f4114f59fc2f514d570ac8df3eac7d328cca3c))
* **Sticker:** file renamed to SnowflakeUtil ([#5573](https://github.com/discordjs/discord.js/issues/5573)) ([f830eb7](https://github.com/discordjs/discord.js/commit/f830eb7101d05f90bbbf44ff750e4012ecb72449))
* **VoiceReceiver:** fix memory leak ([#5609](https://github.com/discordjs/discord.js/issues/5609)) ([2eac842](https://github.com/discordjs/discord.js/commit/2eac84296b448907213680690ec766bb5fbe5990))
* typings for 'Message' ([#5518](https://github.com/discordjs/discord.js/issues/5518)) ([0d68ca8](https://github.com/discordjs/discord.js/commit/0d68ca8eb9abdb517acee562fe01374416d225ed))
* **ApiMessage:** remove resolve() from typings ([#5241](https://github.com/discordjs/discord.js/issues/5241)) ([a6bc39d](https://github.com/discordjs/discord.js/commit/a6bc39d3c699eec0b7851cda334335baa892c1de))
* **ApplicationFlags:** export class ([#5465](https://github.com/discordjs/discord.js/issues/5465)) ([404ce57](https://github.com/discordjs/discord.js/commit/404ce57bcc3ce39c807457f25a5679a80e69d1bb))
* **BaseGuildEmoji:** typo in requiresColons ([#5076](https://github.com/discordjs/discord.js/issues/5076)) ([e272fd6](https://github.com/discordjs/discord.js/commit/e272fd6909a17941d2d3e4840e75436d98a41198))
* **ChannelManager:** Avoid crash in remove method with uncached channel ([#4937](https://github.com/discordjs/discord.js/issues/4937)) ([12c909e](https://github.com/discordjs/discord.js/commit/12c909eeccb9ed6ab205d314ac8d63fc58713ae6))
* **Collection:** toJSON() errors if the collection includes empty values ([#5129](https://github.com/discordjs/discord.js/issues/5129)) ([2c2249e](https://github.com/discordjs/discord.js/commit/2c2249ee7314401b65be677c233370657e1d4695))
* **Collector:** throw an error if a non-function was provided as filter ([#5034](https://github.com/discordjs/discord.js/issues/5034)) ([7365f40](https://github.com/discordjs/discord.js/commit/7365f403006eeb28ab10f03cbf85416272678ef7))
* **Guild/GuildChannel:** methods reason arg usage ([#5419](https://github.com/discordjs/discord.js/issues/5419)) ([8411b9e](https://github.com/discordjs/discord.js/commit/8411b9e14211f83fddb00f622088979ee6586803))
* **GuildAuditLogsEntry:** executor can be missing ([#5500](https://github.com/discordjs/discord.js/issues/5500)) ([e9bf206](https://github.com/discordjs/discord.js/commit/e9bf206d88b9307e4098b7f89178105d08b07544))
* **GuildChannel:** check for community required channels in GuildChannel#deletable ([#5170](https://github.com/discordjs/discord.js/issues/5170)) ([b710a43](https://github.com/discordjs/discord.js/commit/b710a432326be823beb10f5f06f2a1e3fcd7c0ee))
* **GuildChannel:** overload permissionsFor and BaseManager#resolve[id] ([#5260](https://github.com/discordjs/discord.js/issues/5260)) ([41bd6c2](https://github.com/discordjs/discord.js/commit/41bd6c2717faeeaa36514d39a4816f7cf65b4c02))
* **GuildChannel:** regression on default channel type ([#5251](https://github.com/discordjs/discord.js/issues/5251)) ([e7c4f36](https://github.com/discordjs/discord.js/commit/e7c4f3672e7059c264ba67a94b87a655ea6e4da5))
* **GuildEmoji:** check for cahnges to available in equals ([#5201](https://github.com/discordjs/discord.js/issues/5201)) ([f95f5dc](https://github.com/discordjs/discord.js/commit/f95f5dcd791b39c6a4d60dc8d64b0287e06ed768))
* **GuildManager:** add missing toString() on Permission#resolve fns ([#5324](https://github.com/discordjs/discord.js/issues/5324)) ([0778926](https://github.com/discordjs/discord.js/commit/077892645bd59d1b5c50e3291701cb4241c0bbdf))
* **GuildMember:** correctly check for premium_since ([#5312](https://github.com/discordjs/discord.js/issues/5312)) ([aff3625](https://github.com/discordjs/discord.js/commit/aff3625d4fc3c738d77325f8492b72077e6345e7))
* **GuildTemplate:** 'guild' getter ([#5040](https://github.com/discordjs/discord.js/issues/5040)) ([53529bd](https://github.com/discordjs/discord.js/commit/53529bd05deb449d5d9bbfa332470c9881d8093c))
* **IntegrationApplication:** add missing export to index.js ([#5475](https://github.com/discordjs/discord.js/issues/5475)) ([8023250](https://github.com/discordjs/discord.js/commit/8023250ee7bb79a5e3f12d7297c29589f91d6b81))
* **InviteDelete:** guild can be missing ([#5457](https://github.com/discordjs/discord.js/issues/5457)) ([6c6b105](https://github.com/discordjs/discord.js/commit/6c6b1053b7a6778a5d0402941a13258ca13378f8))
* **Message:** #system non-zero message types are not guaranteed to be system ([#5108](https://github.com/discordjs/discord.js/issues/5108)) ([bb78120](https://github.com/discordjs/discord.js/commit/bb78120283b671d1926c8707a17a9d4d515aafdd))
* **Message:** update getters to take null permissions into account ([#5066](https://github.com/discordjs/discord.js/issues/5066)) ([98b1c58](https://github.com/discordjs/discord.js/commit/98b1c582189faee9ac40d81963008d94801f3837))
* **MessageEmbed:** include `author.name` in length getter ([#5167](https://github.com/discordjs/discord.js/issues/5167)) ([e37160f](https://github.com/discordjs/discord.js/commit/e37160f4e3d647e8e33b5b03d5f9e6c98b065499))
* **MessageMentions#channels:** Fix type of channels of mentions ([#5370](https://github.com/discordjs/discord.js/issues/5370)) ([565d7b3](https://github.com/discordjs/discord.js/commit/565d7b3747d59ceeb01e2d88b20d761a99927a12))
* **MessageReaction:** set MessageReaction#me in patch method ([#5047](https://github.com/discordjs/discord.js/issues/5047)) ([6b322f4](https://github.com/discordjs/discord.js/commit/6b322f47a0f86115dab71c06c7879fe82ea04ec4))
* **ReactionUserManager:** remove before query option ([#5281](https://github.com/discordjs/discord.js/issues/5281)) ([43bd568](https://github.com/discordjs/discord.js/commit/43bd568f1c38a6df38f56a8d607375ccc9da026a))
* **Resolvables:** valid resolvables throw error when uncached ([#5495](https://github.com/discordjs/discord.js/issues/5495)) ([fa5a37e](https://github.com/discordjs/discord.js/commit/fa5a37e51a14fdd95420092fb8c2acffad132c3b))
* **Role:** pass Permissions class, not the bitfield ([#5321](https://github.com/discordjs/discord.js/issues/5321)) ([d744e51](https://github.com/discordjs/discord.js/commit/d744e51c1bdb4c7a26c0faeea1f2f45baaf5fd3c))
* **RoleManager:** fix ID return value, change return type to collection ([#4935](https://github.com/discordjs/discord.js/issues/4935)) ([12a096b](https://github.com/discordjs/discord.js/commit/12a096b5f1c5ad518e73d1b9f50bb388928117dd))
* **typings:** return types for 'Webhook(Client)#send()' ([#4876](https://github.com/discordjs/discord.js/issues/4876)) ([eb28ee7](https://github.com/discordjs/discord.js/commit/eb28ee7905eee248b9ccd248f7d8275933dd0637))
* **typings:** update GuildMemberRoleManager typings to match implementation ([#5497](https://github.com/discordjs/discord.js/issues/5497)) ([900e576](https://github.com/discordjs/discord.js/commit/900e57657e80833df2557c60862fcd71b35d0df1))
* **UserFlags:** correct early bot dev name, remove deprecated aliases ([#5104](https://github.com/discordjs/discord.js/issues/5104)) ([b509862](https://github.com/discordjs/discord.js/commit/b509862bfa924494824af5e7729bd545315d2c67))
* **Voice:** disconnect if voice channel not cached ([#5467](https://github.com/discordjs/discord.js/issues/5467)) ([3af8179](https://github.com/discordjs/discord.js/commit/3af8179878c093985c8a94ee2fd7e99d45243bda))
* **Voice:** only skip undocumented voice packet byte if present ([#5309](https://github.com/discordjs/discord.js/issues/5309)) ([2b52cdc](https://github.com/discordjs/discord.js/commit/2b52cdc915146c6775bc7565e5ecf31e7c9880e7))
* add presence to ClientPresence from ClientOptions ([#5041](https://github.com/discordjs/discord.js/issues/5041)) ([9c7fe34](https://github.com/discordjs/discord.js/commit/9c7fe34c50808ba080527a1919b1846ed6585d4d))
* filtering of string forms of null and undefined ([#5075](https://github.com/discordjs/discord.js/issues/5075)) ([9042d19](https://github.com/discordjs/discord.js/commit/9042d19c4ef54d9976776f41336610ab0a24db27))
* implement valueOf on pseudomanagers ([#4595](https://github.com/discordjs/discord.js/issues/4595)) ([8883a01](https://github.com/discordjs/discord.js/commit/8883a0144b02e76c767c21ecf28fb430b7223c7f))
* typings for 'WebhookMessageOptions' ([#5476](https://github.com/discordjs/discord.js/issues/5476)) ([67025e6](https://github.com/discordjs/discord.js/commit/67025e63e4e8306a2b3ff62ae1067acf4b468a6a))
* **Voice*:** filter out silent audio from video users ([#5035](https://github.com/discordjs/discord.js/issues/5035)) ([4fcb9eb](https://github.com/discordjs/discord.js/commit/4fcb9ebf300633022e2b9867fa06a586307ff17a))
* **VoiceConnection:** make #dispatcher nullable ([#5217](https://github.com/discordjs/discord.js/issues/5217)) ([0d5de43](https://github.com/discordjs/discord.js/commit/0d5de4333d8afa57826aa75475fc4e3dfe8978c4))
* **WebSocketShard:** key name in WebSocketShard#_send. ([#5304](https://github.com/discordjs/discord.js/issues/5304)) ([56d8b44](https://github.com/discordjs/discord.js/commit/56d8b445ede6c7915aec173a68905cda3d91f0ca)), closes [#3722](https://github.com/discordjs/discord.js/issues/3722)
### Code Refactoring
* removed `code` and `split` options ([#5918](https://github.com/discordjs/discord.js/issues/5918)) ([985d4d6](https://github.com/discordjs/discord.js/commit/985d4d6a438fc9123264f6a1c600f34fccc1825f))
### Features
* **ApplicationCommandOptionType:** add NUMBER (10) ([#6128](https://github.com/discordjs/discord.js/issues/6128)) ([2f1cc1f](https://github.com/discordjs/discord.js/commit/2f1cc1fc27f5af6d9b88cdc353605a3ddf76e579))
* **Channel:** add isThread typeguard for better TS support ([#5978](https://github.com/discordjs/discord.js/issues/5978)) ([b7ed675](https://github.com/discordjs/discord.js/commit/b7ed6752ac98e56e79b6fd9fd3a5e47572454d85))
* **Channel:** add isVoice() ([#6297](https://github.com/discordjs/discord.js/issues/6297)) ([5b4efd1](https://github.com/discordjs/discord.js/commit/5b4efd13c9eced97f4160f9c4c19d1c843360943))
* **Client:** add conditional ready typings ([#6073](https://github.com/discordjs/discord.js/issues/6073)) ([4206e35](https://github.com/discordjs/discord.js/commit/4206e35b2316431c1a009664636dcda85d39fff8))
* **Client:** enforce passing scopes to generateInvite ([#6024](https://github.com/discordjs/discord.js/issues/6024)) ([c6e5521](https://github.com/discordjs/discord.js/commit/c6e55216874f1892727db927f55db3de6a1712d8))
* **Collector:** better types for events ([#6058](https://github.com/discordjs/discord.js/issues/6058)) ([c0a814f](https://github.com/discordjs/discord.js/commit/c0a814fdb35cb1fa7418bb3bdd3cec0a8a130bf5))
* **Collector:** return a boolean on checkEnd ([#6289](https://github.com/discordjs/discord.js/issues/6289)) ([f473f43](https://github.com/discordjs/discord.js/commit/f473f43d081c8c703a0888acaf3fdbaf4bb20c6d))
* **CommandInteraction:** add CommandInteractionOptionResolver ([#6107](https://github.com/discordjs/discord.js/issues/6107)) ([f293132](https://github.com/discordjs/discord.js/commit/f293132345294e33e80866272feaedf2e4a70d45))
* **CommandInteractionOptionResolver:** add sub-command required option ([#6165](https://github.com/discordjs/discord.js/issues/6165)) ([690c121](https://github.com/discordjs/discord.js/commit/690c121aa9575f7b878030229b0fedd56c3a1a87))
* **Constants:** added more error codes ([#6234](https://github.com/discordjs/discord.js/issues/6234)) ([6b2098f](https://github.com/discordjs/discord.js/commit/6b2098f7c7592eee2aedbf19e62d3c262e159cba))
* **FetchRecommendedShardsOptions:** account for large bot sharding ([#6184](https://github.com/discordjs/discord.js/issues/6184)) ([19b242a](https://github.com/discordjs/discord.js/commit/19b242ac10aa9b32c1a45a9178c97481d62a9400))
* **Formatters:** added new URL utilities and docs ([#6014](https://github.com/discordjs/discord.js/issues/6014)) ([98e45a5](https://github.com/discordjs/discord.js/commit/98e45a59957842fd1ee55d59e30ee868f985e15d))
* **Guild:** add fetchWidget() for getting widget data ([#6180](https://github.com/discordjs/discord.js/issues/6180)) ([b22272f](https://github.com/discordjs/discord.js/commit/b22272f86075ac5585abf05f54cf05187c4eabf9))
* **GuildAuditLogs:** add threads ([#6195](https://github.com/discordjs/discord.js/issues/6195)) ([26ba0e1](https://github.com/discordjs/discord.js/commit/26ba0e10368ff7c4b7a79a37450c8c0784185fb7))
* **GuildPreview:** add createdAt & createdTimestamp ([#6130](https://github.com/discordjs/discord.js/issues/6130)) ([9f039a8](https://github.com/discordjs/discord.js/commit/9f039a86798352e360d7e47d62d1b9c011c2ec71))
* **InteractionCollector:** reworked to be more generic ([#5999](https://github.com/discordjs/discord.js/issues/5999)) ([374c779](https://github.com/discordjs/discord.js/commit/374c779f7f8bbaa9bf06fa2b5b16f60da5095b5c))
* **Interactions:** option to auto-fetch replies ([#5831](https://github.com/discordjs/discord.js/issues/5831)) ([5e28ff8](https://github.com/discordjs/discord.js/commit/5e28ff83cbc04850077cc2f97bb2039c55b3b8ea))
* **LimitedCollection:** export LimitedCollection ([#6043](https://github.com/discordjs/discord.js/issues/6043)) ([31d3129](https://github.com/discordjs/discord.js/commit/31d31293d314492562104f02511d4d1e117711f3))
* **Managers:** ✨ Add GuildInviteManager ([#5889](https://github.com/discordjs/discord.js/issues/5889)) ([9e08b02](https://github.com/discordjs/discord.js/commit/9e08b02df2c9b31cfd91eac3ad008dab94855a59))
* **Managers:** add customizable caching for managers ([#6013](https://github.com/discordjs/discord.js/issues/6013)) ([8c7cb0e](https://github.com/discordjs/discord.js/commit/8c7cb0eff8e169836decf3c9843d7fa0998a5e84))
* **Message:** add 'failIfNotExists' to ClientOptions ([#6038](https://github.com/discordjs/discord.js/issues/6038)) ([28c5724](https://github.com/discordjs/discord.js/commit/28c57246d1d3cd7a22384ddc7970ab5263a4ace0))
* **MessageEmbed:** add setFields method ([#6186](https://github.com/discordjs/discord.js/issues/6186)) ([a25e165](https://github.com/discordjs/discord.js/commit/a25e16599a2b3d82aabebcaeaef663680f2982a8))
* **REST:** append additional information to the required User Agent ([#6112](https://github.com/discordjs/discord.js/issues/6112)) ([f200f14](https://github.com/discordjs/discord.js/commit/f200f14a409a56df5efe788de0ae45fc061bb46d))
* **RoleManager:** added `edit` method, alias `Role#edit` ([#5983](https://github.com/discordjs/discord.js/issues/5983)) ([1e73c25](https://github.com/discordjs/discord.js/commit/1e73c25fbfc9b3cb62bed719dc79de25f67707ee))
* **StageChannel:** add createStageInstance method & use better naming convention ([#5951](https://github.com/discordjs/discord.js/issues/5951)) ([71fb33a](https://github.com/discordjs/discord.js/commit/71fb33a5fea7398598b603a888e07519fddd56a9))
* **Sticker:** updates, sticker packs, and guild stickers ([#5867](https://github.com/discordjs/discord.js/issues/5867)) ([54d6a3a](https://github.com/discordjs/discord.js/commit/54d6a3a0708105acd6a3a709a8e1636d00c81fc8))
* **ThreadChannel:** add fetchOwner() method ([#6207](https://github.com/discordjs/discord.js/issues/6207)) ([331a9d3](https://github.com/discordjs/discord.js/commit/331a9d3ffc6e45c068bfb454e05b863130559d42))
* **Util:** add SweptCollection for auto sweeping of caches ([#6110](https://github.com/discordjs/discord.js/issues/6110)) ([dbb59ba](https://github.com/discordjs/discord.js/commit/dbb59ba1b29b2f75dd8faab5c3004ade51598abc))
* **Util:** added formatters ([#5976](https://github.com/discordjs/discord.js/issues/5976)) ([8c7a28f](https://github.com/discordjs/discord.js/commit/8c7a28f211dd05ec67cbce667b1d591ed59a40c6))
* **WebhookClient:** allow creation of clients via URLs ([#6192](https://github.com/discordjs/discord.js/issues/6192)) ([e000af5](https://github.com/discordjs/discord.js/commit/e000af5c98483046db25a46e905ed244bdcfe262))
* allow channels from uncached guilds to be returned from fetch ([#6034](https://github.com/discordjs/discord.js/issues/6034)) ([755c180](https://github.com/discordjs/discord.js/commit/755c180659c125532fe6f8e33e6c3b56e275311b))
* make Instance#fetch force true by default, and fix force parameter ([#6116](https://github.com/discordjs/discord.js/issues/6116)) ([366f3c9](https://github.com/discordjs/discord.js/commit/366f3c910a370ff1e184afae054f957db9a98293))
* PermissionOverwriteManager ([#5318](https://github.com/discordjs/discord.js/issues/5318)) ([e7ad2fe](https://github.com/discordjs/discord.js/commit/e7ad2fe20772915dcf3e9c4ae92a072b9c918a07))
* use enums for consistency and speed ([#5843](https://github.com/discordjs/discord.js/issues/5843)) ([f7eeccb](https://github.com/discordjs/discord.js/commit/f7eeccba4b7015496df811f10cc2da2b0fab0630))
* **Client:** make use of with_expiration in #fetchInvite ([#5764](https://github.com/discordjs/discord.js/issues/5764)) ([bf191df](https://github.com/discordjs/discord.js/commit/bf191df9c033404da3e717f73306cdb3f659fafc))
* **Esm:** use `gen-esm-wrapper` instead of manually making the file ([#5700](https://github.com/discordjs/discord.js/issues/5700)) ([db0d7d4](https://github.com/discordjs/discord.js/commit/db0d7d4ea8e7b2bae4d1548e5617875b5ae0bbd4))
* **Interaction:** add guild guard ([#5955](https://github.com/discordjs/discord.js/issues/5955)) ([87e8cdd](https://github.com/discordjs/discord.js/commit/87e8cdd3eba29ae1d741aa86572f1731b05c12fb))
* **Managers:** new ApplicationCommandPermissionsManager ([#5897](https://github.com/discordjs/discord.js/issues/5897)) ([6264c60](https://github.com/discordjs/discord.js/commit/6264c60e97da93b311a7a9fd92e16e59de94104a))
* **MessageComponentInteraction:** component getter ([#5840](https://github.com/discordjs/discord.js/issues/5840)) ([1439183](https://github.com/discordjs/discord.js/commit/1439183ad3f84b2b7500aaead2cf8779199b47d4))
* **MessageMentions:** add repliedUser ([#5905](https://github.com/discordjs/discord.js/issues/5905)) ([2616125](https://github.com/discordjs/discord.js/commit/261612596d37aa6fb48ae070d358b3fde953c769))
* **MessageSelectMenu:** droppybois ([#5692](https://github.com/discordjs/discord.js/issues/5692)) ([e5fcf0b](https://github.com/discordjs/discord.js/commit/e5fcf0bee53a15d7a87d4a5cf4e206823d6e7d87))
* api v9 and threads ([#5570](https://github.com/discordjs/discord.js/issues/5570)) ([7346621](https://github.com/discordjs/discord.js/commit/7346621d15c96906d5b848c483669750ff9c6e12))
* **InteractionCreate:** move to an Action handler ([#5906](https://github.com/discordjs/discord.js/issues/5906)) ([ea49f7c](https://github.com/discordjs/discord.js/commit/ea49f7ca74892495dd53f8d315086035c1814149))
* add missing APIError codes ([#5898](https://github.com/discordjs/discord.js/issues/5898)) ([d930c81](https://github.com/discordjs/discord.js/commit/d930c812bb4511a688b76d9bf1ac66e28bff033e))
* **GuildChannelManager:** add 'fetch' method ([#4966](https://github.com/discordjs/discord.js/issues/4966)) ([e798fb7](https://github.com/discordjs/discord.js/commit/e798fb720ee5ced008471fe899337f6817936770))
* **Interactions:** add InteractionWebhook for better internals ([#5712](https://github.com/discordjs/discord.js/issues/5712)) ([dec191a](https://github.com/discordjs/discord.js/commit/dec191aa1e4f22690285ca06c6eee7e6086b2930))
* **Interactions:** improve error handling for ephemeral responses ([#5892](https://github.com/discordjs/discord.js/issues/5892)) ([bd9f56a](https://github.com/discordjs/discord.js/commit/bd9f56af9a0a1fb12cfa30d9e2e0ad680eb80949))
* add APIError codes for stage instance ([#5888](https://github.com/discordjs/discord.js/issues/5888)) ([c850ae1](https://github.com/discordjs/discord.js/commit/c850ae10270076c4b2e10b130dd8f88eed4ed201))
* **Message:** applicationID for interaction responses ([#5765](https://github.com/discordjs/discord.js/issues/5765)) ([65dc00f](https://github.com/discordjs/discord.js/commit/65dc00f3210065015684b6d585f6747bd5ebadf1))
* **MessageComponents:** clickybois (MessageButton, MessageActionRow, associated Collectors) ([#5674](https://github.com/discordjs/discord.js/issues/5674)) ([cbd7f2b](https://github.com/discordjs/discord.js/commit/cbd7f2b9aa44a9240947ed716d0e72257ac499f7))
* **Rest:** optional ratelimit errors ([#5659](https://github.com/discordjs/discord.js/issues/5659)) ([16f261e](https://github.com/discordjs/discord.js/commit/16f261e773a353c54a75f38008f9b28435ae6603))
* **Sharding*:** contexts for broadcastEval ([#5756](https://github.com/discordjs/discord.js/issues/5756)) ([c6aeebb](https://github.com/discordjs/discord.js/commit/c6aeebb18d6b969f7c8bdb1b719883d4384dd03e))
* **WelcomeScreen:** welcome screens ([#5490](https://github.com/discordjs/discord.js/issues/5490)) ([44e2ee7](https://github.com/discordjs/discord.js/commit/44e2ee7b20dbec79c993dbc1f30ddb643d943347))
* stage instance invite ([#5856](https://github.com/discordjs/discord.js/issues/5856)) ([2d12db0](https://github.com/discordjs/discord.js/commit/2d12db000f2a0a22a8919d7a63989a6e762ae335))
* document and support embeds field in message create endpoint ([#5792](https://github.com/discordjs/discord.js/issues/5792)) ([99ff715](https://github.com/discordjs/discord.js/commit/99ff7151379fe03a1cfd52f252c0e6fc892d7776))
* **Guild:** add enum for mfa_level ([#5797](https://github.com/discordjs/discord.js/issues/5797)) ([ffabec3](https://github.com/discordjs/discord.js/commit/ffabec3a5e3651e5a0b8bcac83ee26bb909695fa))
* **Guild:** add enum for premium_tier ([#5868](https://github.com/discordjs/discord.js/issues/5868)) ([a3cbcca](https://github.com/discordjs/discord.js/commit/a3cbcca13da1af416c219bd64a0a6e84bb87a057))
* **GuildAuditLogs:** make #target a channel for channel related logs ([#5781](https://github.com/discordjs/discord.js/issues/5781)) ([eb0291d](https://github.com/discordjs/discord.js/commit/eb0291d9a5078836183c1b63ea96461ec112f96e))
* **RequestHandler:** emit more info when a rate limit was hit ([#5801](https://github.com/discordjs/discord.js/issues/5801)) ([18ac72e](https://github.com/discordjs/discord.js/commit/18ac72e457fa137d7f7f7bde876436ff643b4a63))
* **Widget:** wrapper for widget.json ([#5619](https://github.com/discordjs/discord.js/issues/5619)) ([038ee99](https://github.com/discordjs/discord.js/commit/038ee99604cded41d4c67edf4bd6bc7969712f52))
* add new APIErrors ([#5794](https://github.com/discordjs/discord.js/issues/5794)) ([e0ab836](https://github.com/discordjs/discord.js/commit/e0ab836b2d88caf0d9e1f9eba76ae46be9df0554))
* enforce strings ([#4880](https://github.com/discordjs/discord.js/issues/4880)) ([7b85a72](https://github.com/discordjs/discord.js/commit/7b85a7259f563ab14ae6c0a665a3dd43c486fde4))
* **APIRequest:** support setting global headers in HTTPOptions ([#5586](https://github.com/discordjs/discord.js/issues/5586)) ([135abcc](https://github.com/discordjs/discord.js/commit/135abccd9c75c33c8510cdcbe33b0dea4198fe33))
* **CommandInteraction:** ephemeral followup messages ([#5618](https://github.com/discordjs/discord.js/issues/5618)) ([68b40dd](https://github.com/discordjs/discord.js/commit/68b40dd91df70593c8271bd455fd0b3c6d19d334))
* **CommandInteraction:** make options a collection ([#5705](https://github.com/discordjs/discord.js/issues/5705)) ([fdad140](https://github.com/discordjs/discord.js/commit/fdad14099779e61cb84dcd1cb2497e0e853a6144))
* **Guild:** add the new nsfw_level property ([#5660](https://github.com/discordjs/discord.js/issues/5660)) ([3fe7add](https://github.com/discordjs/discord.js/commit/3fe7add2c5c07023d3cc83c06bba846c1328e446))
* **GuildChannel:** createInvite target options ([#5514](https://github.com/discordjs/discord.js/issues/5514)) ([f831872](https://github.com/discordjs/discord.js/commit/f831872125214e39c8866ce1cf7c63159a3dba39))
* **GuildChannel:** make createOverwrite and updateOverwrite not dependent on cache ([#5489](https://github.com/discordjs/discord.js/issues/5489)) ([58763b0](https://github.com/discordjs/discord.js/commit/58763b0e91b78d068121521ea3e853627b3ea325))
* **GuildChannel#clone:** support for position property ([#5236](https://github.com/discordjs/discord.js/issues/5236)) ([d455cb6](https://github.com/discordjs/discord.js/commit/d455cb65a6188e7d7b6720848b5ce37dbf8b5dff))
* **GuildMemberManager:** extend API coverage ([#4872](https://github.com/discordjs/discord.js/issues/4872)) ([2e2464b](https://github.com/discordjs/discord.js/commit/2e2464bf07c2b2e08d396b093126f887d19aec57))
* **Message:** add ReplyMessageOptions for #reply ([#5296](https://github.com/discordjs/discord.js/issues/5296)) ([7ce741d](https://github.com/discordjs/discord.js/commit/7ce741dacd06fd8af0ab501e38be08cf6b506a62))
* **Message:** allow editing files into messages ([#5718](https://github.com/discordjs/discord.js/issues/5718)) ([b212b64](https://github.com/discordjs/discord.js/commit/b212b64214ecee4f6118e78f9b90f3d3da574ecc))
* **Rest:** show the data that is sent to Discord when an errors occurs ([#5701](https://github.com/discordjs/discord.js/issues/5701)) ([ef92339](https://github.com/discordjs/discord.js/commit/ef92339d073f82cdaa2bc69f7be8443ec16789a7))
* add support for fetching multiple guilds ([#5472](https://github.com/discordjs/discord.js/issues/5472)) ([48d6850](https://github.com/discordjs/discord.js/commit/48d6850d9a8c34f407a22b6b401f2ed74415acd0))
* easier guards for channelUpdate ([#5716](https://github.com/discordjs/discord.js/issues/5716)) ([d52bcd4](https://github.com/discordjs/discord.js/commit/d52bcd46ec5985f9f18da37ba9d7d77209f58337))
* general component improvements ([#5787](https://github.com/discordjs/discord.js/issues/5787)) ([c4f1c75](https://github.com/discordjs/discord.js/commit/c4f1c75efa1cff1f9c775a266dccbe581305e79d))
* GuildBanManager ([#5276](https://github.com/discordjs/discord.js/issues/5276)) ([6d09160](https://github.com/discordjs/discord.js/commit/6d09160f5ba878fcd1f8bae88b5e6347e632cd2c))
* InteractionDeferOptions ([#5641](https://github.com/discordjs/discord.js/issues/5641)) ([ed593c9](https://github.com/discordjs/discord.js/commit/ed593c91fb7b87ae8b512c6f127e12f33c9631b6))
* **Guild:** allow description and features in edit ([#5505](https://github.com/discordjs/discord.js/issues/5505)) ([8a059cc](https://github.com/discordjs/discord.js/commit/8a059cccb8ecbd0bf60d2ed395a8de0806b3395a))
* **Guild:** nsfw guilds ([#5525](https://github.com/discordjs/discord.js/issues/5525)) ([5968323](https://github.com/discordjs/discord.js/commit/596832371cefef7739e8d714248d1c6d438eb8df))
* **Guild:** replace `owner` with `fetchOwner` ([#5480](https://github.com/discordjs/discord.js/issues/5480)) ([1be67b8](https://github.com/discordjs/discord.js/commit/1be67b88516b104073e46574a180498bad2aa02b))
* **Guild:** setChannelPositions parent, lockPermissions keys ([#5507](https://github.com/discordjs/discord.js/issues/5507)) ([4866e26](https://github.com/discordjs/discord.js/commit/4866e2672f28bfc481cf03533f7ba259050c80f4))
* **GuildFeatures:** added the new screening features ([#5328](https://github.com/discordjs/discord.js/issues/5328)) ([3c175cb](https://github.com/discordjs/discord.js/commit/3c175cb5116fe50ba3084163565dd244a25b657f))
* **GuildManager:** allow system channel flags in create ([#5504](https://github.com/discordjs/discord.js/issues/5504)) ([d9fa180](https://github.com/discordjs/discord.js/commit/d9fa180cf93f1a339192ae95dfb512482bd0ed0b))
* **Message:** allow removing attachments ([#5557](https://github.com/discordjs/discord.js/issues/5557)) ([ca9e5a0](https://github.com/discordjs/discord.js/commit/ca9e5a0ee1afca544192df1daef744d5a35f1727))
* **Message:** replace referencedMessage with fetchReference ([#5577](https://github.com/discordjs/discord.js/issues/5577)) ([1398431](https://github.com/discordjs/discord.js/commit/1398431bca9a3743758295f1effa2e7f6c35093e))
* **MessageEmbed:** remove normalizeField validation ([#5459](https://github.com/discordjs/discord.js/issues/5459)) ([ff2f737](https://github.com/discordjs/discord.js/commit/ff2f7372f23f901620d3afff215f33be487521d5))
* **MessageManager:** extend API coverage ([#4869](https://github.com/discordjs/discord.js/issues/4869)) ([c56c4a8](https://github.com/discordjs/discord.js/commit/c56c4a8dc86b0f37dd7c9ee9a4d422a52070b50c))
* **ShardingManager:** add options typings ([#5583](https://github.com/discordjs/discord.js/issues/5583)) ([31b4390](https://github.com/discordjs/discord.js/commit/31b4390042e6557f7f9d2f258c79ea50ba4929e2))
* add support for application command events ([#5596](https://github.com/discordjs/discord.js/issues/5596)) ([9f74f95](https://github.com/discordjs/discord.js/commit/9f74f95f69f4aa8a9a23c160e25dc61010c0a8e0))
* interactions ([#5448](https://github.com/discordjs/discord.js/issues/5448)) ([f7643f7](https://github.com/discordjs/discord.js/commit/f7643f7bbe64003ad8b221006190dd15529651e9))
* **Activity:** add missing fields ([#4984](https://github.com/discordjs/discord.js/issues/4984)) ([63ff6a0](https://github.com/discordjs/discord.js/commit/63ff6a07ebcba7e9134e3902e338e8dc6564ee63))
* **APIMessage:** remove disableMentions ([#4836](https://github.com/discordjs/discord.js/issues/4836)) ([4107899](https://github.com/discordjs/discord.js/commit/41078997aefce2a9e683b9805aad6436612a3aa7))
* **Application:** application flags ([#5147](https://github.com/discordjs/discord.js/issues/5147)) ([06e9d86](https://github.com/discordjs/discord.js/commit/06e9d86cb3dd11708c9cdd81f15970979e5b090d))
* **BitField:** move problematic bit into the error message ([#5228](https://github.com/discordjs/discord.js/issues/5228)) ([273e955](https://github.com/discordjs/discord.js/commit/273e9557be68eb1c2466f29e1c41e9b146a777c1))
* **Client:** add InviteGenerationOptions#additionalScopes ([#5215](https://github.com/discordjs/discord.js/issues/5215)) ([ae3c3d8](https://github.com/discordjs/discord.js/commit/ae3c3d80ee603fc46a28140107cb90c81da0afc9))
* **ClientEvents:** add tuple labels to event arguments ([#5225](https://github.com/discordjs/discord.js/issues/5225)) ([764966e](https://github.com/discordjs/discord.js/commit/764966e398e693a5ec868bc22d722f8518656b3a))
* **GuildChannel:** support conversion between text and news ([#5022](https://github.com/discordjs/discord.js/issues/5022)) ([5ac3b57](https://github.com/discordjs/discord.js/commit/5ac3b57f9bd53d1c20549a70942b023826f6f726))
* **GuildEmojiManager:** implement GuildEmojiManager#fetch ([#4933](https://github.com/discordjs/discord.js/issues/4933)) ([ffe3140](https://github.com/discordjs/discord.js/commit/ffe31405ff559202be55473db7e8b34894fbf4a7))
* **GuildMember:** #pending ([#5121](https://github.com/discordjs/discord.js/issues/5121)) ([c4c8171](https://github.com/discordjs/discord.js/commit/c4c817116f868cedb4ec20bcbf90b9b3d382621e))
* **GuildMember:** make GuildMember#setNickname first param nullable ([#5070](https://github.com/discordjs/discord.js/issues/5070)) ([d70127c](https://github.com/discordjs/discord.js/commit/d70127cee69e66e87702a6db4b58ad12aa85f96c))
* **GuildMemberManager:** add 'search' method ([#4154](https://github.com/discordjs/discord.js/issues/4154)) ([0ba2bcb](https://github.com/discordjs/discord.js/commit/0ba2bcb54582b38ee8eec8d1547b979bf1b7c755))
* **GuildMemberManager:** throw TypeError on incorrect GuildMemberManager#ban params ([#4816](https://github.com/discordjs/discord.js/issues/4816)) ([863734a](https://github.com/discordjs/discord.js/commit/863734aba46c5e0d04fbc83d2ed314726bddcbc2))
* **Message:** added string type for message nonce ([#4782](https://github.com/discordjs/discord.js/issues/4782)) ([4b555fd](https://github.com/discordjs/discord.js/commit/4b555fdf4c3b35fa0ea284f9cd56765ecb608b89))
* **MessageAttachment:** support for #contentType ([#5481](https://github.com/discordjs/discord.js/issues/5481)) ([7b161f9](https://github.com/discordjs/discord.js/commit/7b161f93a040a6bdce6e7e26d7a3c3b6c61a04fd))
* **SysChanFlags:** new flag and rename in sync with client ([#5506](https://github.com/discordjs/discord.js/issues/5506)) ([fe93a7e](https://github.com/discordjs/discord.js/commit/fe93a7e084189b54b8af82461809dee1da112b75))
* move internal regular expressions to static properties ([#5384](https://github.com/discordjs/discord.js/issues/5384)) ([207735c](https://github.com/discordjs/discord.js/commit/207735cedcf9a998571a328c7c7b2414d3ebe9d5))
* **Message|TextChannel:** Inline replies ([#4874](https://github.com/discordjs/discord.js/issues/4874)) ([60e5a0e](https://github.com/discordjs/discord.js/commit/60e5a0e46f57cf297b66f1a940d24a20f46b5319))
* **ReactionCollector:** event create ([#4108](https://github.com/discordjs/discord.js/issues/4108)) ([09d1f2f](https://github.com/discordjs/discord.js/commit/09d1f2f18f5ec536bb25156553986fee51c80d1e)), closes [#2844](https://github.com/discordjs/discord.js/issues/2844)
* **Rest:** better handling of global rate limit and invalid request tracking ([#4711](https://github.com/discordjs/discord.js/issues/4711)) ([9d2d606](https://github.com/discordjs/discord.js/commit/9d2d60691eb4bde729f40fb633ae257cf5bc6545))
* **typings:** add ShardingManager.shardList to type definitions ([#5446](https://github.com/discordjs/discord.js/issues/5446)) ([32b0d71](https://github.com/discordjs/discord.js/commit/32b0d71af7e3afc401898753b1e8cb1e991b70e7))
* **typings:** explicitly type PremiumTier and Collectors ([#5458](https://github.com/discordjs/discord.js/issues/5458)) ([7c49612](https://github.com/discordjs/discord.js/commit/7c49612d4bedfe13f7ed676c125cc7f7f33596df))
* jsdelivr default file support ([#5424](https://github.com/discordjs/discord.js/issues/5424)) ([f469402](https://github.com/discordjs/discord.js/commit/f46940228e9f82db4af09ae2f2dad684db0d74ed))
* make changes to PresenceData typings and docs ([#5317](https://github.com/discordjs/discord.js/issues/5317)) ([eb43ce4](https://github.com/discordjs/discord.js/commit/eb43ce4d4fb4d634696c5b0f026174dc0e435fe3))
* promisified single interaction collection ([#5770](https://github.com/discordjs/discord.js/issues/5770)) ([c2b3ed0](https://github.com/discordjs/discord.js/commit/c2b3ed09a0ec7f9b7453d0bcf9f2900e408f5001))
* **MessageTypes:** add 16 and 17 ([#4685](https://github.com/discordjs/discord.js/issues/4685)) ([c9107e3](https://github.com/discordjs/discord.js/commit/c9107e35fa8b74f8ad7a7d3ee7d7178a35790e18))
* stage channels ([#5456](https://github.com/discordjs/discord.js/issues/5456)) ([eec7cf7](https://github.com/discordjs/discord.js/commit/eec7cf7634653fc02ee4f94e970960174a0e6d1b))
* stage instances ([#5749](https://github.com/discordjs/discord.js/issues/5749)) ([918921e](https://github.com/discordjs/discord.js/commit/918921e8211fc16e9b12d2502f3168264246ea22))
* **Browser:** remove browser <20> ([#5113](https://github.com/discordjs/discord.js/issues/5113)) ([0a591a9](https://github.com/discordjs/discord.js/commit/0a591a96974ab8b2aef7d7b9b64ec63d0fbe4ec4))
* **Role:** role tags ([#4628](https://github.com/discordjs/discord.js/issues/4628)) ([d6234b7](https://github.com/discordjs/discord.js/commit/d6234b764ecbf12ebc0a795429a6aa3a650f5a6c))
* **ShardingManager:** Allow b-Eval/fetchClientValues on a specific shard when not all are ready ([#5222](https://github.com/discordjs/discord.js/issues/5222)) ([001676c](https://github.com/discordjs/discord.js/commit/001676c7a97f4e44c6601dd84aa0354ea94b7c25))
* **Sticker:** added Sticker ([#4909](https://github.com/discordjs/discord.js/issues/4909)) ([026afc2](https://github.com/discordjs/discord.js/commit/026afc2c1a88bc210c973bcf235fef3484571111))
* **Util:** allow array for StringOptions' char ([#5566](https://github.com/discordjs/discord.js/issues/5566)) ([fbcbb29](https://github.com/discordjs/discord.js/commit/fbcbb29884a35308a7af2169f5f9ae5658c458e8))
* **Util:** make `cleanContent` take a channel instead of a message ([#5535](https://github.com/discordjs/discord.js/issues/5535)) ([f1c0c04](https://github.com/discordjs/discord.js/commit/f1c0c043b516f4158ab9d473419e3b5e125a4c03))
* **Voice:** implement support for @discordjs/voice ([#5402](https://github.com/discordjs/discord.js/issues/5402)) ([7b2e12b](https://github.com/discordjs/discord.js/commit/7b2e12b102984abf61132e1057558ef7f04e6d83))
* **Webhook:** add '(edit|delete)Message' methods ([#5223](https://github.com/discordjs/discord.js/issues/5223)) ([7cabc1c](https://github.com/discordjs/discord.js/commit/7cabc1c490ddd9518528e12a58a746d65e43d4eb))
* **Webhook:** add 'fetchMessage' method ([#5530](https://github.com/discordjs/discord.js/issues/5530)) ([63398d6](https://github.com/discordjs/discord.js/commit/63398d6ae46f0487c4d5d8bfe823952a803e4a5a))
* **Webhook:** sourceGuild, sourceChannel, improve owner ([#5508](https://github.com/discordjs/discord.js/issues/5508)) ([116ecf2](https://github.com/discordjs/discord.js/commit/116ecf246e89db4d629a13877a440260c7504e30))
* **WebSocketManager:** let identify throw on depleted limits ([#5283](https://github.com/discordjs/discord.js/issues/5283)) ([624a446](https://github.com/discordjs/discord.js/commit/624a4464ca86bfa0b095ecb2cdaac2e8030cc413))
* BaseGuildEmojiManager ([#4934](https://github.com/discordjs/discord.js/issues/4934)) ([8d650a7](https://github.com/discordjs/discord.js/commit/8d650a72509a3f369ae31ec421d1892d182175e4))
### Reverts
* support for nested arrays of components, fix error handling ([#6081](https://github.com/discordjs/discord.js/issues/6081)) ([1dcad05](https://github.com/discordjs/discord.js/commit/1dcad051a835407bc24de3446dbd0ac3c0efeefc))
* **BitField:** ⏪ Bring back-compatibility after BitField serialization ([#5910](https://github.com/discordjs/discord.js/issues/5910)) ([0a0630c](https://github.com/discordjs/discord.js/commit/0a0630c0498d8ae24e703a2bfdf978541deb9b60))
* 5047 ([#5050](https://github.com/discordjs/discord.js/issues/5050)) ([b2a6720](https://github.com/discordjs/discord.js/commit/b2a672047745b0a47729ef775482e06a20b38db3))
### BREAKING CHANGES
For breaking changes please reference: <https://discordjs.guide/additional-info/changes-in-v13.html>

View File

@@ -175,7 +175,7 @@
END OF TERMS AND CONDITIONS
Copyright 2015 - 2020 Amish Shah
Copyright 2015 - 2021 Amish Shah
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

101
README.md
View File

@@ -5,30 +5,14 @@
</p>
<br />
<p>
<a href="https://discord.gg/bRCvFy9"><img src="https://img.shields.io/discord/222078108977594368?color=7289da&logo=discord&logoColor=white" alt="Discord server" /></a>
<a href="https://discord.gg/djs"><img src="https://img.shields.io/discord/222078108977594368?color=5865F2&logo=discord&logoColor=white" alt="Discord server" /></a>
<a href="https://www.npmjs.com/package/discord.js"><img src="https://img.shields.io/npm/v/discord.js.svg?maxAge=3600" alt="NPM version" /></a>
<a href="https://www.npmjs.com/package/discord.js"><img src="https://img.shields.io/npm/dt/discord.js.svg?maxAge=3600" alt="NPM downloads" /></a>
<a href="https://github.com/discordjs/discord.js/actions"><img src="https://github.com/discordjs/discord.js/workflows/Testing/badge.svg" alt="Build status" /></a>
<a href="https://david-dm.org/discordjs/discord.js"><img src="https://img.shields.io/david/discordjs/discord.js.svg?maxAge=3600" alt="Dependencies" /></a>
<a href="https://www.patreon.com/discordjs"><img src="https://img.shields.io/badge/donate-patreon-F96854.svg" alt="Patreon" /></a>
</p>
<p>
<a href="https://nodei.co/npm/discord.js/"><img src="https://nodei.co/npm/discord.js.png?downloads=true&stars=true" alt="npm installnfo" /></a>
</p>
</div>
## Table of contents
- [About](#about)
- [Installation](#installation)
- [Audio engines](#audio-engines)
- [Optional packages](#optional-packages)
- [Example Usage](#example-usage)
- [Links](#links)
- [Extensions](#extensions)
- [Contributing](#contributing)
- [Help](#help)
## About
discord.js is a powerful [Node.js](https://nodejs.org) module that allows you to easily interact with the
@@ -41,42 +25,73 @@ discord.js is a powerful [Node.js](https://nodejs.org) module that allows you to
## Installation
**Node.js 12.0.0 or newer is required.**
Ignore any warnings about unmet peer dependencies, as they're all optional.
**Node.js 16.6.0 or newer is required.**
Without voice support: `npm install discord.js`
With voice support ([@discordjs/opus](https://www.npmjs.com/package/@discordjs/opus)): `npm install discord.js @discordjs/opus`
With voice support ([opusscript](https://www.npmjs.com/package/opusscript)): `npm install discord.js opusscript`
### Audio engines
The preferred audio engine is @discordjs/opus, as it performs significantly better than opusscript. When both are available, discord.js will automatically choose @discordjs/opus.
Using opusscript is only recommended for development environments where @discordjs/opus is tough to get working.
For production bots, using @discordjs/opus should be considered a necessity, especially if they're going to be running on multiple servers.
```sh-session
npm install discord.js
yarn add discord.js
pnpm add discord.js
```
### Optional packages
- [zlib-sync](https://www.npmjs.com/package/zlib-sync) for WebSocket data compression and inflation (`npm install zlib-sync`)
- [erlpack](https://github.com/discord/erlpack) for significantly faster WebSocket data (de)serialisation (`npm install discord/erlpack`)
- One of the following packages can be installed for faster voice packet encryption and decryption:
- [sodium](https://www.npmjs.com/package/sodium) (`npm install sodium`)
- [libsodium.js](https://www.npmjs.com/package/libsodium-wrappers) (`npm install libsodium-wrappers`)
- [bufferutil](https://www.npmjs.com/package/bufferutil) for a much faster WebSocket connection (`npm install bufferutil`)
- [utf-8-validate](https://www.npmjs.com/package/utf-8-validate) in combination with `bufferutil` for much faster WebSocket processing (`npm install utf-8-validate`)
- [@discordjs/voice](https://github.com/discordjs/voice) for interacting with the Discord Voice API
## Example usage
Install all required dependencies:
```sh-session
npm install discord.js @discordjs/rest discord-api-types
yarn add discord.js @discordjs/rest discord-api-types
pnpm add discord.js @discordjs/rest discord-api-types
```
Register a slash command against the Discord API:
```js
const Discord = require('discord.js');
const client = new Discord.Client();
const { REST } = require('@discordjs/rest');
const { Routes } = require('discord-api-types/v9');
const commands = [{
name: 'ping',
description: 'Replies with Pong!'
}];
const rest = new REST({ version: '9' }).setToken('token');
(async () => {
try {
console.log('Started refreshing application (/) commands.');
await rest.put(
Routes.applicationGuildCommands(CLIENT_ID, GUILD_ID),
{ body: commands },
);
console.log('Successfully reloaded application (/) commands.');
} catch (error) {
console.error(error);
}
})();
```
Afterwards we can create a quite simple example bot:
```js
const { Client, Intents } = require('discord.js');
const client = new Client({ intents: [Intents.FLAGS.GUILDS] });
client.on('ready', () => {
console.log(`Logged in as ${client.user.tag}!`);
});
client.on('message', msg => {
if (msg.content === 'ping') {
msg.reply('pong');
client.on('interactionCreate', async interaction => {
if (!interaction.isCommand()) return;
if (interaction.commandName === 'ping') {
await interaction.reply('Pong!');
}
});
@@ -86,14 +101,14 @@ client.login('token');
## Links
- [Website](https://discord.js.org/) ([source](https://github.com/discordjs/website))
- [Documentation](https://discord.js.org/#/docs/main/master/general/welcome)
- [Guide](https://discordjs.guide/) ([source](https://github.com/discordjs/guide)) - this is still for stable
See also the [Update Guide](https://discordjs.guide/additional-info/changes-in-v12.html), including updated and removed items in the library.
- [Discord.js Discord server](https://discord.gg/bRCvFy9)
- [Documentation](https://discord.js.org/#/docs)
- [Guide](https://discordjs.guide/) ([source](https://github.com/discordjs/guide))
See also the [Update Guide](https://discordjs.guide/additional-info/changes-in-v13.html), including updated and removed items in the library.
- [Discord.js Discord server](https://discord.gg/djs)
- [Discord API Discord server](https://discord.gg/discord-api)
- [GitHub](https://github.com/discordjs/discord.js)
- [NPM](https://www.npmjs.com/package/discord.js)
- [Related libraries](https://discordapi.com/unofficial/libs.html)
- [Related libraries](https://discord.com/developers/docs/topics/community-resources#libraries)
### Extensions
@@ -103,9 +118,9 @@ client.login('token');
Before creating an issue, please ensure that it hasn't already been reported/suggested, and double-check the
[documentation](https://discord.js.org/#/docs).
See [the contribution guide](https://github.com/discordjs/discord.js/blob/master/.github/CONTRIBUTING.md) if you'd like to submit a PR.
See [the contribution guide](https://github.com/discordjs/discord.js/blob/main/.github/CONTRIBUTING.md) if you'd like to submit a PR.
## Help
If you don't understand something in the documentation, you are experiencing problems, or you just need a gentle
nudge in the right direction, please don't hesitate to join our official [Discord.js Server](https://discord.gg/bRCvFy9).
nudge in the right direction, please don't hesitate to join our official [Discord.js Server](https://discord.gg/djs).

View File

@@ -1,163 +0,0 @@
# Sending Attachments
In here you'll see a few examples showing how you can send an attachment using discord.js.
## Sending an attachment using a URL
There are a few ways you can do this, but we'll show you the easiest.
The following examples use [MessageAttachment](/#/docs/main/master/class/MessageAttachment).
```js
// Extract the required classes from the discord.js module
const { Client, MessageAttachment } = require('discord.js');
// Create an instance of a Discord client
const client = new Client();
/**
* The ready event is vital, it means that only _after_ this will your bot start reacting to information
* received from Discord
*/
client.on('ready', () => {
console.log('I am ready!');
});
client.on('message', message => {
// If the message is '!rip'
if (message.content === '!rip') {
// Create the attachment using MessageAttachment
const attachment = new MessageAttachment('https://i.imgur.com/w3duR07.png');
// Send the attachment in the message channel
message.channel.send(attachment);
}
});
// Log our bot in using the token from https://discord.com/developers/applications
client.login('your token here');
```
And here is the result:
![Image showing the result](/static/attachment-example1.png)
But what if you want to send an attachment with a message content? Fear not, for it is easy to do that too! We'll recommend reading [the TextChannel's "send" function documentation](/#/docs/main/master/class/TextChannel?scrollTo=send) to see what other options are available.
```js
// Extract the required classes from the discord.js module
const { Client, MessageAttachment } = require('discord.js');
// Create an instance of a Discord client
const client = new Client();
/**
* The ready event is vital, it means that only _after_ this will your bot start reacting to information
* received from Discord
*/
client.on('ready', () => {
console.log('I am ready!');
});
client.on('message', message => {
// If the message is '!rip'
if (message.content === '!rip') {
// Create the attachment using MessageAttachment
const attachment = new MessageAttachment('https://i.imgur.com/w3duR07.png');
// Send the attachment in the message channel with a content
message.channel.send(`${message.author},`, attachment);
}
});
// Log our bot in using the token from https://discord.com/developers/applications
client.login('your token here');
```
And here's the result of this one:
![Image showing the result](/static/attachment-example2.png)
## Sending a local file or buffer
Sending a local file isn't hard either! We'll be using [MessageAttachment](/#/docs/main/master/class/MessageAttachment) for these examples too.
```js
// Extract the required classes from the discord.js module
const { Client, MessageAttachment } = require('discord.js');
// Create an instance of a Discord client
const client = new Client();
/**
* The ready event is vital, it means that only _after_ this will your bot start reacting to information
* received from Discord
*/
client.on('ready', () => {
console.log('I am ready!');
});
client.on('message', message => {
// If the message is '!rip'
if (message.content === '!rip') {
// Create the attachment using MessageAttachment
const attachment = new MessageAttachment('./rip.png');
// Send the attachment in the message channel with a content
message.channel.send(`${message.author},`, attachment);
}
});
// Log our bot in using the token from https://discord.com/developers/applications
client.login('your token here');
```
The results are the same as the URL examples:
![Image showing result](/static/attachment-example2.png)
But what if you have a buffer from an image? Or a text document? Well, it's the same as sending a local file or a URL!
In the following example, we'll be getting the buffer from a `memes.txt` file, and send it in the message channel.
You can use any buffer you want, and send it. Just make sure to overwrite the filename if it isn't an image!
```js
// Extract the required classes from the discord.js module
const { Client, MessageAttachment } = require('discord.js');
// Import the native fs module
const fs = require('fs');
// Create an instance of a Discord client
const client = new Client();
/**
* The ready event is vital, it means that only _after_ this will your bot start reacting to information
* received from Discord
*/
client.on('ready', () => {
console.log('I am ready!');
});
client.on('message', message => {
// If the message is '!memes'
if (message.content === '!memes') {
// Get the buffer from the 'memes.txt', assuming that the file exists
const buffer = fs.readFileSync('./memes.txt');
/**
* Create the attachment using MessageAttachment,
* overwritting the default file name to 'memes.txt'
* Read more about it over at
* http://discord.js.org/#/docs/main/master/class/MessageAttachment
*/
const attachment = new MessageAttachment(buffer, 'memes.txt');
// Send the attachment in the message channel with a content
message.channel.send(`${message.author}, here are your memes!`, attachment);
}
});
// Log our bot in using the token from https://discord.com/developers/applications
client.login('your token here');
```
And of course, the results are:
![Attachment File example 3](/static/attachment-example3.png)

View File

@@ -1,31 +0,0 @@
'use strict';
/**
* Send a user a link to their avatar
*/
// Import the discord.js module
const Discord = require('discord.js');
// Create an instance of a Discord client
const client = new Discord.Client();
/**
* The ready event is vital, it means that only _after_ this will your bot start reacting to information
* received from Discord
*/
client.on('ready', () => {
console.log('I am ready!');
});
// Create an event listener for messages
client.on('message', message => {
// If the message is "what is my avatar"
if (message.content === 'what is my avatar') {
// Send the user's avatar URL
message.reply(message.author.displayAvatarURL());
}
});
// Log our bot in using the token from https://discord.com/developers/applications
client.login('your token here');

View File

@@ -1,40 +0,0 @@
'use strict';
/**
* An example of how you can send embeds
*/
// Extract the required classes from the discord.js module
const { Client, MessageEmbed } = require('discord.js');
// Create an instance of a Discord client
const client = new Client();
/**
* The ready event is vital, it means that only _after_ this will your bot start reacting to information
* received from Discord
*/
client.on('ready', () => {
console.log('I am ready!');
});
client.on('message', message => {
// If the message is "how to embed"
if (message.content === 'how to embed') {
// We can create embeds using the MessageEmbed constructor
// Read more about all that you can do with the constructor
// over at https://discord.js.org/#/docs/main/master/class/MessageEmbed
const embed = new MessageEmbed()
// Set the title of the field
.setTitle('A slick little embed')
// Set the color of the embed
.setColor(0xff0000)
// Set the main content of the embed
.setDescription('Hello, this is a slick embed!');
// Send the embed to the same channel as the message
message.channel.send(embed);
}
});
// Log our bot in using the token from https://discord.com/developers/applications
client.login('your token here');

View File

@@ -1,32 +0,0 @@
'use strict';
/**
* A bot that welcomes new guild members when they join
*/
// Import the discord.js module
const Discord = require('discord.js');
// Create an instance of a Discord client
const client = new Discord.Client();
/**
* The ready event is vital, it means that only _after_ this will your bot start reacting to information
* received from Discord
*/
client.on('ready', () => {
console.log('I am ready!');
});
// Create an event listener for new guild members
client.on('guildMemberAdd', member => {
// Send the message to a designated channel on a server:
const channel = member.guild.channels.cache.find(ch => ch.name === 'member-log');
// Do nothing if the channel wasn't found on this server
if (!channel) return;
// Send the message, mentioning the member
channel.send(`Welcome to the server, ${member}`);
});
// Log our bot in using the token from https://discord.com/developers/applications
client.login('your token here');

View File

@@ -1,151 +0,0 @@
# Moderation
In here, you'll see some basic examples for kicking and banning a member.
## Kicking a member
Let's say you have a member that you'd like to kick. Here is an example of how you _can_ do it.
```js
// Import the discord.js module
const Discord = require('discord.js');
// Create an instance of a Discord client
const client = new Discord.Client();
/**
* The ready event is vital, it means that only _after_ this will your bot start reacting to information
* received from Discord
*/
client.on('ready', () => {
console.log('I am ready!');
});
client.on('message', message => {
// Ignore messages that aren't from a guild
if (!message.guild) return;
// If the message content starts with "!kick"
if (message.content.startsWith('!kick')) {
// Assuming we mention someone in the message, this will return the user
// Read more about mentions over at https://discord.js.org/#/docs/main/master/class/MessageMentions
const user = message.mentions.users.first();
// If we have a user mentioned
if (user) {
// Now we get the member from the user
const member = message.guild.member(user);
// If the member is in the guild
if (member) {
/**
* Kick the member
* Make sure you run this on a member, not a user!
* There are big differences between a user and a member
*/
member
.kick('Optional reason that will display in the audit logs')
.then(() => {
// We let the message author know we were able to kick the person
message.reply(`Successfully kicked ${user.tag}`);
})
.catch(err => {
// An error happened
// This is generally due to the bot not being able to kick the member,
// either due to missing permissions or role hierarchy
message.reply('I was unable to kick the member');
// Log the error
console.error(err);
});
} else {
// The mentioned user isn't in this guild
message.reply("That user isn't in this guild!");
}
// Otherwise, if no user was mentioned
} else {
message.reply("You didn't mention the user to kick!");
}
}
});
// Log our bot in using the token from https://discord.com/developers/applications
client.login('your token here');
```
And the result is:
![Image showing the result](/static/kick-example.png)
## Banning a member
Banning works the same way as kicking, but it has slightly more options that can be changed.
```js
// Import the discord.js module
const Discord = require('discord.js');
// Create an instance of a Discord client
const client = new Discord.Client();
/**
* The ready event is vital, it means that only _after_ this will your bot start reacting to information
* received from Discord
*/
client.on('ready', () => {
console.log('I am ready!');
});
client.on('message', message => {
// Ignore messages that aren't from a guild
if (!message.guild) return;
// if the message content starts with "!ban"
if (message.content.startsWith('!ban')) {
// Assuming we mention someone in the message, this will return the user
// Read more about mentions over at https://discord.js.org/#/docs/main/master/class/MessageMentions
const user = message.mentions.users.first();
// If we have a user mentioned
if (user) {
// Now we get the member from the user
const member = message.guild.member(user);
// If the member is in the guild
if (member) {
/**
* Ban the member
* Make sure you run this on a member, not a user!
* There are big differences between a user and a member
* Read more about what ban options there are over at
* https://discord.js.org/#/docs/main/master/class/GuildMember?scrollTo=ban
*/
member
.ban({
reason: 'They were bad!',
})
.then(() => {
// We let the message author know we were able to ban the person
message.reply(`Successfully banned ${user.tag}`);
})
.catch(err => {
// An error happened
// This is generally due to the bot not being able to ban the member,
// either due to missing permissions or role hierarchy
message.reply('I was unable to ban the member');
// Log the error
console.error(err);
});
} else {
// The mentioned user isn't in this guild
message.reply("That user isn't in this guild!");
}
} else {
// Otherwise, if no user was mentioned
message.reply("You didn't mention the user to ban!");
}
}
});
// Log our bot in using the token from https://discord.com/developers/applications
client.login('your token here');
```
And the result is:
![Image showing the result](/static/ban-example.png)

View File

@@ -1,31 +0,0 @@
'use strict';
/**
* A ping pong bot, whenever you send "ping", it replies "pong".
*/
// Import the discord.js module
const Discord = require('discord.js');
// Create an instance of a Discord client
const client = new Discord.Client();
/**
* The ready event is vital, it means that only _after_ this will your bot start reacting to information
* received from Discord
*/
client.on('ready', () => {
console.log('I am ready!');
});
// Create an event listener for messages
client.on('message', message => {
// If the message is "ping"
if (message.content === 'ping') {
// Send "pong" to the same channel
message.channel.send('pong');
}
});
// Log our bot in using the token from https://discord.com/developers/applications
client.login('your token here');

View File

@@ -1,19 +0,0 @@
'use strict';
/**
* Send a message using a webhook
*/
// Import the discord.js module
const Discord = require('discord.js');
/*
* Create a new webhook
* The Webhooks ID and token can be found in the URL, when you request that URL, or in the response body.
* https://discord.com/api/webhooks/12345678910/T0kEn0fw3Bh00K
* ^^^^^^^^^^ ^^^^^^^^^^^^
* Webhook ID Webhook Token
*/
const hook = new Discord.WebhookClient('webhook id', 'webhook token');
// Send a message using the webhook
hook.send('I am now alive!');

View File

@@ -1,30 +0,0 @@
# Frequently Asked Questions
These questions are some of the most frequently asked.
## No matter what, I get `SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode`‽
Update to Node.js 12.0.0 or newer.
## How do I get voice working?
- Install FFMPEG.
- Install either the `@discordjs/opus` package or the `opusscript` package.
@discordjs/opus is greatly preferred, due to it having significantly better performance.
## How do I install FFMPEG?
- **npm:** `npm install ffmpeg-static`
- **Ubuntu 16.04:** `sudo apt install ffmpeg`
- **Ubuntu 14.04:** `sudo apt-get install libav-tools`
- **Windows:** `npm install ffmpeg-static` or see the [FFMPEG section of AoDude's guide](https://github.com/bdistin/OhGodMusicBot/blob/master/README.md#download-ffmpeg).
## How do I set up @discordjs/opus?
- **Ubuntu:** Simply run `npm install @discordjs/opus`, and it's done. Congrats!
- **Windows:** Run `npm install --global --production windows-build-tools` in an admin command prompt or PowerShell.
Then, running `npm install @discordjs/opus` in your bot's directory should successfully build it. Woo!
Other questions can be found at the [official Discord.js guide](https://discordjs.guide/popular-topics/common-questions.html)
If you have issues not listed here or on the guide, feel free to ask in the [official Discord.js server](https://discord.gg/bRCvFy9).
Always make sure to read the [documentation](https://discord.js.org/#/docs/main/stable/general/welcome).

View File

@@ -1,195 +0,0 @@
# Version 12.0.0
v12.0.0 contains many new and improved features, optimisations, and bug fixes.
See [the changelog](https://github.com/discordjs/discord.js/releases/tag/12.0.0) for a full list of changes.
You can also visit [the guide](https://discordjs.guide/additional-info/changes-in-v12.html) for help with updating your v11 code to v12.
# Version 11.1.0
v11.1.0 features improved voice and gateway stability, as well as support for new features such as audit logs and searching for messages.
See [the changelog](https://github.com/discordjs/discord.js/releases/tag/11.1.0) for a full list of changes, including
information about deprecations.
# Version 11
Version 11 contains loads of new and improved features, optimisations, and bug fixes.
See [the changelog](https://github.com/discordjs/discord.js/releases/tag/11.0.0) for a full list of changes.
## Significant additions
- Message Reactions and Embeds (rich text)
- Support for uws and erlpack for better performance
- OAuthApplication support
- Web distributions
## Breaking changes
### Client.login() no longer supports logging in with email + password
Logging in with an email and password has always been heavily discouraged since the advent of proper token support, but in v11 we have made the decision to completely remove the functionality, since Hammer & Chisel have [officially stated](https://github.com/hammerandchisel/discord-api-docs/issues/69#issuecomment-223886862) it simply shouldn't be done.
User accounts can still log in with tokens just like bot accounts. To obtain the token for a user account, you can log in to Discord with that account, and use Ctrl + Shift + I to open the developer tools. In the console tab, evaluating `localStorage.token` will give you the token for that account.
### ClientUser.setEmail()/setPassword() now require the current password, as well as setUsername() on user accounts
Since you can no longer log in with email and password, you must provide the current account password to the `setEmail()`, `setPassword()`, and `setUsername()` methods for user accounts (self-bots).
### Removed TextBasedChannel.sendTTSMessage()
This method was deemed to be an entirely pointless shortcut that virtually nobody even used.
The same results can be achieved by passing options to `send()` or `sendMessage()`.
Example:
```js
channel.send('Hi there', { tts: true });
```
### Using Collection.find()/exists() with IDs will throw an error
This is simply to help prevent a common mistake that is made frequently.
To find something or check its existence using an ID, you should use `.get()` and `.has()` which are part of the [ES6 Map class](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map), which Collection is an extension of.
# Version 10
Version 10's non-BC changes focus on cleaning up some inconsistencies that exist in previous versions.
Upgrading from v9 should be quick and painless.
## Client options
All client options have been converted to camelCase rather than snake_case, and `max_message_cache` was renamed to `messageCacheMaxSize`.
v9 code example:
```js
const client = new Discord.Client({
disable_everyone: true,
max_message_cache: 500,
message_cache_lifetime: 120,
message_sweep_interval: 60,
});
```
v10 code example:
```js
const client = new Discord.Client({
disableEveryone: true,
messageCacheMaxSize: 500,
messageCacheLifetime: 120,
messageSweepInterval: 60,
});
```
## Presences
Presences have been completely restructured.
Previous versions of discord.js assumed that users had the same presence amongst all guilds - with the introduction of sharding, however, this is no longer the case.
v9 discord.js code may look something like this:
```js
User.status; // the status of the user
User.game; // the game that the user is playing
ClientUser.setStatus(status, game, url); // set the new status for the user
```
v10 moves presences to GuildMember instances. For the sake of simplicity, though, User classes also expose presences.
When accessing a presence on a User object, it simply finds the first GuildMember for the user, and uses its presence.
Additionally, the introduction of the Presence class keeps all of the presence data organised.
**It is strongly recommended that you use a GuildMember's presence where available, rather than a User.
A user may have an entirely different presence between two different guilds.**
v10 code:
```js
MemberOrUser.presence.status; // the status of the member or user
MemberOrUser.presence.game; // the game that the member or user is playing
ClientUser.setStatus(status); // online, idle, dnd, offline
ClientUser.setGame(game, streamingURL); // a game
ClientUser.setPresence(fullPresence); // status and game combined
```
## Voice
Voice has been rewritten internally, but in a backwards-compatible manner.
There is only one breaking change here; the `disconnected` event was renamed to `disconnect`.
Several more events have been made available to a VoiceConnection, so see the documentation.
## Events
Many events have been renamed or had their arguments change.
### Client events
| Version 9 | Version 10 |
| ---------------------------------------------- | --------------------------------------- |
| guildMemberAdd(guild, member) | guildMemberAdd(member) |
| guildMemberAvailable(guild, member) | guildMemberAvailable(member) |
| guildMemberRemove(guild, member) | guildMemberRemove(member) |
| guildMembersChunk(guild, members) | guildMembersChunk(members) |
| guildMemberUpdate(guild, oldMember, newMember) | guildMemberUpdate(oldMember, newMember) |
| guildRoleCreate(guild, role) | roleCreate(role) |
| guildRoleDelete(guild, role) | roleDelete(role) |
| guildRoleUpdate(guild, oldRole, newRole) | roleUpdate(oldRole, newRole) |
The guild parameter that has been dropped from the guild-related events can still be derived using `member.guild` or `role.guild`.
### VoiceConnection events
| Version 9 | Version 10 |
| ------------ | ---------- |
| disconnected | disconnect |
## Dates and timestamps
All dates/timestamps on the structures have been refactored to have a consistent naming scheme and availability.
All of them are named similarly to this:
**Date:** `Message.createdAt`
**Timestamp:** `Message.createdTimestamp`
See the docs for each structure to see which date/timestamps are available on them.
# Version 9
The version 9 (v9) rewrite takes a much more object-oriented approach than previous versions,
which allows your code to be much more readable and manageable.
It's been rebuilt from the ground up and should be much more stable, fixing caching issues that affected
older versions. It also has support for newer Discord Features, such as emojis.
Version 9, while containing a sizable number of breaking changes, does not require much change in your code's logic -
most of the concepts are still the same, but loads of functions have been moved around.
The vast majority of methods you're used to using have been moved out of the Client class,
into other more relevant classes where they belong.
Because of this, you will need to convert most of your calls over to the new methods.
Here are a few examples of methods that have changed:
- `Client.sendMessage(channel, message)` ==> `TextChannel.sendMessage(message)`
- `Client.sendMessage(user, message)` ==> `User.sendMessage(message)`
- `Client.updateMessage(message, "New content")` ==> `Message.edit("New Content")`
- `Client.getChannelLogs(channel, limit)` ==> `TextChannel.fetchMessages({options})`
- `Server.detailsOfUser(User)` ==> `Server.members.get(User).properties` (retrieving a member gives a GuildMember object)
- `Client.joinVoiceChannel(voicechannel)` => `VoiceChannel.join()`
A couple more important details:
- `Client.loginWithToken("token")` ==> `client.login("token")`
- `Client.servers.length` ==> `client.guilds.size` (all instances of `server` are now `guild`)
## No more callbacks!
Version 9 eschews callbacks in favour of Promises. This means all code relying on callbacks must be changed.
For example, the following code:
```js
client.getChannelLogs(channel, 100, function(messages) {
console.log(`${messages.length} messages found`);
});
```
```js
channel.fetchMessages({ limit: 100 }).then(messages => {
console.log(`${messages.size} messages found`);
});
```

View File

@@ -1,103 +0,0 @@
<div align="center">
<br />
<p>
<a href="https://discord.js.org"><img src="/static/logo.svg" width="546" alt="discord.js" id="djs-logo" /></a>
</p>
<br />
<p>
<a href="https://discord.gg/bRCvFy9"><img src="https://img.shields.io/discord/222078108977594368?color=7289da&logo=discord&logoColor=white" alt="Discord server" /></a>
<a href="https://www.npmjs.com/package/discord.js"><img src="https://img.shields.io/npm/v/discord.js.svg?maxAge=3600" alt="NPM version" /></a>
<a href="https://www.npmjs.com/package/discord.js"><img src="https://img.shields.io/npm/dt/discord.js.svg?maxAge=3600" alt="NPM downloads" /></a>
<a href="https://travis-ci.org/discordjs/discord.js"><img src="https://travis-ci.org/discordjs/discord.js.svg" alt="Build status" /></a>
<a href="https://david-dm.org/discordjs/discord.js"><img src="https://img.shields.io/david/discordjs/discord.js.svg?maxAge=3600" alt="Dependencies" /></a>
<a href="https://www.patreon.com/discordjs"><img src="https://img.shields.io/badge/donate-patreon-F96854.svg" alt="Patreon" /></a>
</p>
<p>
<a href="https://nodei.co/npm/discord.js/"><img src="https://nodei.co/npm/discord.js.png?downloads=true&stars=true" alt="NPM info" /></a>
</p>
</div>
# Welcome!
Welcome to the discord.js v12 documentation.
## About
discord.js is a powerful [Node.js](https://nodejs.org) module that allows you to easily interact with the
[Discord API](https://discord.com/developers/docs/intro).
- Object-oriented
- Predictable abstractions
- Performant
- 100% coverage of the Discord API
## Installation
**Node.js 12.0.0 or newer is required.**
Ignore any warnings about unmet peer dependencies, as they're all optional.
Without voice support: `npm install discord.js`
With voice support ([@discordjs/opus](https://www.npmjs.com/package/@discordjs/opus)): `npm install discord.js @discordjs/opus`
With voice support ([opusscript](https://www.npmjs.com/package/opusscript)): `npm install discord.js opusscript`
### Audio engines
The preferred audio engine is @discordjs/opus, as it performs significantly better than opusscript. When both are available, discord.js will automatically choose @discordjs/opus.
Using opusscript is only recommended for development environments where @discordjs/opus is tough to get working.
For production bots, using @discordjs/opus should be considered a necessity, especially if they're going to be running on multiple servers.
### Optional packages
- [zlib-sync](https://www.npmjs.com/package/zlib-sync) for WebSocket data compression and inflation (`npm install zlib-sync`)
- [erlpack](https://github.com/discord/erlpack) for significantly faster WebSocket data (de)serialisation (`npm install discord/erlpack`)
- One of the following packages can be installed for faster voice packet encryption and decryption:
- [sodium](https://www.npmjs.com/package/sodium) (`npm install sodium`)
- [libsodium.js](https://www.npmjs.com/package/libsodium-wrappers) (`npm install libsodium-wrappers`)
- [bufferutil](https://www.npmjs.com/package/bufferutil) for a much faster WebSocket connection (`npm install bufferutil`)
- [utf-8-validate](https://www.npmjs.com/package/utf-8-validate) in combination with `bufferutil` for much faster WebSocket processing (`npm install utf-8-validate`)
## Example usage
```js
const Discord = require('discord.js');
const client = new Discord.Client();
client.on('ready', () => {
console.log(`Logged in as ${client.user.tag}!`);
});
client.on('message', msg => {
if (msg.content === 'ping') {
msg.reply('pong');
}
});
client.login('token');
```
## Links
- [Website](https://discord.js.org/) ([source](https://github.com/discordjs/website))
- [Documentation](https://discord.js.org/#/docs/main/master/general/welcome)
- [Guide](https://discordjs.guide/) ([source](https://github.com/discordjs/guide)) - this is still for stable
See also the WIP [Update Guide](https://discordjs.guide/additional-info/changes-in-v12.html) also including updated and removed items in the library.
- [Discord.js Discord server](https://discord.gg/bRCvFy9)
- [Discord API Discord server](https://discord.gg/discord-api)
- [GitHub](https://github.com/discordjs/discord.js)
- [NPM](https://www.npmjs.com/package/discord.js)
- [Related libraries](https://discordapi.com/unofficial/libs.html)
### Extensions
- [RPC](https://www.npmjs.com/package/discord-rpc) ([source](https://github.com/discordjs/RPC))
## Contributing
Before creating an issue, please ensure that it hasn't already been reported/suggested, and double-check the
[documentation](https://discord.js.org/#/docs).
See [the contribution guide](https://github.com/discordjs/discord.js/blob/master/.github/CONTRIBUTING.md) if you'd like to submit a PR.
## Help
If you don't understand something in the documentation, you are experiencing problems, or you just need a gentle
nudge in the right direction, please don't hesitate to join our official [Discord.js Server](https://discord.gg/bRCvFy9).

View File

@@ -1,32 +1,5 @@
- name: General
files:
- name: Welcome
path: welcome.md
- name: Updating your code
path: updating.md
- name: FAQ
path: faq.md
- name: Topics
files:
- name: Voice
path: voice.md
- name: Web builds
path: web.md
- name: Partials
path: partials.md
- name: Examples
files:
- name: Ping
path: ping.js
- name: Avatars
path: avatars.js
- name: Attachments
path: attachments.md
- name: Server greeting
path: greeting.js
- name: Message Embed
path: embed.js
- name: Moderation
path: moderation.md
- name: Webhook
path: webhook.js
id: welcome
path: ../../README.md

View File

@@ -1,65 +0,0 @@
# Partials
Partials allow you to receive events that contain uncached instances, providing structures that contain very minimal
data. For example, if you were to receive a `messageDelete` event with an uncached message, normally Discord.js would
discard the event. With partials, you're able to receive the event, with a Message object that contains just an ID.
## Opting in
Partials are opt-in, and you can enable them in the Client options by specifying [PartialTypes](/#/docs/main/master/typedef/PartialType):
```js
// Accept partial messages, DM channels, and reactions when emitting events
new Client({ partials: ['MESSAGE', 'CHANNEL', 'REACTION'] });
```
## Usage & warnings
<warn>The only guaranteed data a partial structure can store is its ID. All other properties/methods should be
considered invalid/defunct while accessing a partial structure.</warn>
After opting-in with the above, you begin to allow partial messages and channels in your caches, so it's important
to check whether they're safe to access whenever you encounter them, whether it be in events or through normal cache
usage.
All instance of structures that you opted-in for will have a `partial` property. As you'd expect, this value is `true`
when the instance is partial. Partial structures are only guaranteed to contain an ID, any other properties and methods
no longer carry their normal type guarantees.
This means you have to take time to consider possible parts of your program that might need checks put in place to
prevent accessing partial data:
```js
client.on('messageDelete', message => {
console.log(`${message.id} was deleted!`);
// Partial messages do not contain any content so skip them
if (!message.partial) {
console.log(`It had content: "${message.content}"`);
}
});
// You can also try to upgrade partials to full instances:
client.on('messageReactionAdd', async (reaction, user) => {
// If a message gains a reaction and it is uncached, fetch and cache the message
// You should account for any errors while fetching, it could return API errors if the resource is missing
if (reaction.message.partial) await reaction.message.fetch();
// Now the message has been cached and is fully available:
console.log(`${reaction.message.author}'s message "${reaction.message.content}" gained a reaction!`);
// Fetches and caches the reaction itself, updating resources that were possibly defunct.
if (reaction.partial) await reaction.fetch();
// Now the reaction is fully available and the properties will be reflected accurately:
console.log(`${reaction.count} user(s) have given the same reaction to this message!`);
});
```
<info>If a message is deleted and both the message and channel are uncached, you must enable both 'MESSAGE' and
'CHANNEL' in the client options to receive the messageDelete event.</info>
## Why?
This allows developers to listen to events that contain uncached data, which is useful if you're running a moderation
bot or any bot that relies on still receiving updates to resources you don't have cached -- message reactions are a
good example.
Currently, the only type of channel that can be uncached is a DM channel, there is no reason why guild channels should
not be cached.

View File

@@ -1,140 +0,0 @@
# Introduction to Voice
Voice in discord.js can be used for many things, such as music bots, recording or relaying audio.
In discord.js, you can use voice by connecting to a `VoiceChannel` to obtain a `VoiceConnection`, where you can start streaming and receiving audio.
To get started, make sure you have:
- FFmpeg - `npm install ffmpeg-static`
- an opus encoder, choose one from below:
- `npm install @discordjs/opus` (better performance)
- `npm install opusscript`
- a good network connection
The preferred opus engine is @discordjs/opus, as it performs significantly better than opusscript. When both are available, discord.js will automatically choose @discordjs/opus.
Using opusscript is only recommended for development environments where @discordjs/opus is tough to get working.
For production bots, using @discordjs/opus should be considered a necessity, especially if they're going to be running on multiple servers.
## Joining a voice channel
The example below reacts to a message and joins the sender's voice channel, catching any errors. This is important
as it allows us to obtain a `VoiceConnection` that we can start to stream audio with.
```js
const Discord = require('discord.js');
const client = new Discord.Client();
client.login('token here');
client.on('message', async message => {
// Voice only works in guilds, if the message does not come from a guild,
// we ignore it
if (!message.guild) return;
if (message.content === '/join') {
// Only try to join the sender's voice channel if they are in one themselves
if (message.member.voice.channel) {
const connection = await message.member.voice.channel.join();
} else {
message.reply('You need to join a voice channel first!');
}
}
});
```
## Streaming to a Voice Channel
In the previous example, we looked at how to join a voice channel in order to obtain a `VoiceConnection`. Now that we
have obtained a voice connection, we can start streaming audio to it.
### Introduction to playing on voice connections
The most basic example of playing audio over a connection would be playing a local file:
```js
const dispatcher = connection.play('/home/discord/audio.mp3');
```
The `dispatcher` in this case is a `StreamDispatcher` - here you can control the volume and playback of the stream:
```js
dispatcher.pause();
dispatcher.resume();
dispatcher.setVolume(0.5); // half the volume
dispatcher.on('finish', () => {
console.log('Finished playing!');
});
dispatcher.destroy(); // end the stream
```
We can also pass in options when we first play the stream:
```js
const dispatcher = connection.play('/home/discord/audio.mp3', {
volume: 0.5,
});
```
### What can I play?
Discord.js allows you to play a lot of things:
```js
// ReadableStreams, in this example YouTube audio
const ytdl = require('ytdl-core');
connection.play(ytdl('https://www.youtube.com/watch?v=ZlAU_w7-Xp8', { filter: 'audioonly' }));
// Files on the internet
connection.play('http://www.sample-videos.com/audio/mp3/wave.mp3');
// Local files
connection.play('/home/discord/audio.mp3');
```
New to v12 is the ability to play OggOpus and WebmOpus streams with much better performance by skipping out Ffmpeg. Note this comes at the cost of no longer having volume control over the stream:
```js
connection.play(fs.createReadStream('./media.webm'), {
type: 'webm/opus',
});
connection.play(fs.createReadStream('./media.ogg'), {
type: 'ogg/opus',
});
```
Make sure to consult the documentation for a full list of what you can play - there's too much to cover here!
## Voice Broadcasts
A voice broadcast is very useful for "radio" bots, that play the same audio across multiple channels. It means audio is only transcoded once, and is much better on performance.
```js
const broadcast = client.voice.createBroadcast();
broadcast.on('subscribe', dispatcher => {
console.log('New broadcast subscriber!');
});
broadcast.on('unsubscribe', dispatcher => {
console.log('Channel unsubscribed from broadcast :(');
});
```
`broadcast` is an instance of `VoiceBroadcast`, which has the same `play` method you are used to with regular VoiceConnections:
```js
const dispatcher = broadcast.play('./audio.mp3');
connection.play(broadcast);
```
It's important to note that the `dispatcher` stored above is a `BroadcastDispatcher` - it controls all the dispatcher subscribed to the broadcast, e.g. setting the volume of this dispatcher affects the volume of all subscribers.
## Voice Receive
coming soon&trade;

View File

@@ -1,52 +0,0 @@
# Web builds
In addition to your usual Node applications, discord.js has special distributions available that are capable of running in web browsers.
This is useful for client-side web apps that need to interact with the Discord API.
[Webpack 3](https://webpack.js.org/) is used to build these.
## Restrictions
- Any voice-related functionality is unavailable, as there is currently no audio encoding/decoding capabilities without external native libraries,
which web browsers do not support.
- The ShardingManager cannot be used, since it relies on being able to spawn child processes for shards.
- None of the native optional packages are usable.
### Require Library
If you are making your own webpack project, you can require `discord.js/browser` wherever you need to use discord.js, like so:
```js
const Discord = require('discord.js/browser');
// do something with Discord like you normally would
```
### Webpack File
You can obtain your desired version of discord.js' web build from the [webpack branch](https://github.com/discordjs/discord.js/tree/webpack) of the GitHub repository.
There is a file for each branch and version of the library, and the ones ending in `.min.js` are minified to substantially reduce the size of the source code.
Include the file on the page just as you would any other JS library, like so:
```html
<script type="text/javascript" src="discord.VERSION.min.js"></script>
```
Rather than importing discord.js with `require('discord.js')`, the entire `Discord` object is available as a global (on the `window`) object.
The usage of the API isn't any different from using it in Node.js.
#### Example
```html
<script type="text/javascript" src="discord.11.1.0.min.js"></script>
<script type="text/javascript">
const client = new Discord.Client();
client.on('message', msg => {
const guildTag = msg.channel.type === 'text' ? `[${msg.guild.name}]` : '[DM]';
const channelTag = msg.channel.type === 'text' ? `[#${msg.channel.name}]` : '';
console.log(`${guildTag}${channelTag} ${msg.author.tag}: ${msg.content}`);
});
client.login('some crazy token');
</script>
```

View File

@@ -1,95 +0,0 @@
import Discord from '../src/index.js';
export default Discord;
export const {
BaseClient,
Client,
Shard,
ShardClientUtil,
ShardingManager,
WebhookClient,
ActivityFlags,
BitField,
Collection,
Constants,
DataResolver,
BaseManager,
DiscordAPIError,
HTTPError,
MessageFlags,
Intents,
Permissions,
Speaking,
Snowflake,
SnowflakeUtil,
Structures,
SystemChannelFlags,
UserFlags,
Util,
version,
ChannelManager,
GuildChannelManager,
GuildEmojiManager,
GuildEmojiRoleManager,
GuildMemberManager,
GuildMemberRoleManager,
GuildManager,
ReactionManager,
ReactionUserManager,
MessageManager,
PresenceManager,
RoleManager,
UserManager,
discordSort,
escapeMarkdown,
fetchRecommendedShards,
resolveColor,
resolveString,
splitMessage,
Application,
Base,
Activity,
APIMessage,
BaseGuildEmoji,
CategoryChannel,
Channel,
ClientApplication,
ClientUser,
Collector,
DMChannel,
Emoji,
Guild,
GuildAuditLogs,
GuildChannel,
GuildEmoji,
GuildMember,
GuildPreview,
GuildTemplate,
Integration,
Invite,
Message,
MessageAttachment,
MessageCollector,
MessageEmbed,
MessageMentions,
MessageReaction,
NewsChannel,
PermissionOverwrites,
Presence,
ClientPresence,
ReactionCollector,
ReactionEmoji,
RichPresenceAssets,
Role,
StoreChannel,
Team,
TeamMember,
TextChannel,
User,
VoiceChannel,
VoiceRegion,
VoiceState,
Webhook,
WebSocket
} = Discord;

View File

@@ -1,3 +0,0 @@
{
"plugins": ["node_modules/jsdoc-strip-async-await"]
}

22380
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,18 +1,20 @@
{
"name": "discord.js",
"version": "12.5.3",
"version": "13.2.0",
"description": "A powerful library for interacting with the Discord API",
"main": "./src/index",
"main": "./src/index.js",
"module": "./src/index.mjs",
"types": "./typings/index.d.ts",
"files": [
"src",
"typings"
],
"exports": {
".": [
{
"require": "./src/index.js",
"import": "./esm/discord.mjs"
},
"./src/index.js"
],
"./esm": "./esm/discord.mjs"
"./*": "./*",
".": {
"require": "./src/index.js",
"import": "./src/index.mjs"
}
},
"scripts": {
"test": "npm run lint && npm run docs:test && npm run lint:typings",
@@ -23,12 +25,13 @@
"lint:fix": "eslint src --fix",
"lint:typings": "tslint typings/index.d.ts",
"prettier": "prettier --write src/**/*.js typings/**/*.ts",
"build:browser": "webpack",
"prepublishOnly": "npm run test && cross-env NODE_ENV=production npm run build:browser"
"prepublishOnly": "npm run test && gen-esm-wrapper ./src/index.js ./src/index.mjs",
"prepare": "is-ci || husky install",
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s"
},
"repository": {
"type": "git",
"url": "git+https://github.com/discordjs/discord.js.git"
"url": "https://github.com/discordjs/discord.js.git"
},
"keywords": [
"discord",
@@ -38,126 +41,46 @@
"node",
"discordapp"
],
"author": "Amish Shah <amishshah.2k@gmail.com>",
"author": "Amish Shah <amish@shah.gg>",
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/discordjs/discord.js/issues"
},
"homepage": "https://github.com/discordjs/discord.js#readme",
"runkitExampleFilename": "./docs/examples/ping.js",
"unpkg": "./webpack/discord.min.js",
"homepage": "https://discord.js.org",
"dependencies": {
"@discordjs/collection": "^0.1.6",
"@discordjs/builders": "^0.6.0",
"@discordjs/collection": "^0.2.1",
"@discordjs/form-data": "^3.0.1",
"abort-controller": "^3.0.0",
"@sapphire/async-queue": "^1.1.5",
"@types/ws": "^8.2.0",
"discord-api-types": "^0.23.1",
"node-fetch": "^2.6.1",
"prism-media": "^1.2.9",
"setimmediate": "^1.0.5",
"tweetnacl": "^1.0.3",
"ws": "^7.4.4"
"ws": "^8.2.3"
},
"devDependencies": {
"@commitlint/cli": "^12.0.1",
"@commitlint/config-angular": "^12.0.1",
"@types/node": "^12.12.6",
"@types/ws": "^7.4.0",
"@commitlint/cli": "^13.2.0",
"@commitlint/config-angular": "^13.2.0",
"@discordjs/docgen": "^0.10.0",
"@favware/npm-deprecate": "^1.0.4",
"@types/node": "^16.10.2",
"conventional-changelog-cli": "^2.1.1",
"cross-env": "^7.0.3",
"discord.js-docgen": "git+https://github.com/discordjs/docgen.git",
"dtslint": "^4.0.8",
"eslint": "^7.23.0",
"eslint-config-prettier": "^6.13.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-prettier": "^3.3.1",
"husky": "^4.3.0",
"jest": "^26.6.3",
"json-filter-loader": "^1.0.0",
"lint-staged": "^10.5.4",
"prettier": "^2.2.1",
"terser-webpack-plugin": "^4.2.3",
"dtslint": "^4.1.6",
"eslint": "^7.32.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-import": "^2.24.2",
"eslint-plugin-prettier": "^4.0.0",
"gen-esm-wrapper": "^1.1.3",
"husky": "^7.0.2",
"is-ci": "^3.0.0",
"jest": "^27.2.4",
"lint-staged": "^11.2.0",
"prettier": "^2.4.1",
"tslint": "^6.1.3",
"typescript": "^4.2.3",
"webpack": "^4.44.2",
"webpack-cli": "^3.3.12"
"typescript": "^4.4.3"
},
"engines": {
"node": ">=12.0.0"
},
"browser": {
"@discordjs/opus": false,
"https": false,
"ws": false,
"erlpack": false,
"prism-media": false,
"opusscript": false,
"node-opus": false,
"tweetnacl": false,
"sodium": false,
"worker_threads": false,
"zlib-sync": false,
"src/sharding/Shard.js": false,
"src/sharding/ShardClientUtil.js": false,
"src/sharding/ShardingManager.js": false,
"src/client/voice/ClientVoiceManager.js": false,
"src/client/voice/VoiceBroadcast.js": false,
"src/client/voice/VoiceConnection.js": false,
"src/client/voice/dispatcher/BroadcastDispatcher.js": false,
"src/client/voice/dispatcher/StreamDispatcher.js": false,
"src/client/voice/networking/VoiceUDPClient.js": false,
"src/client/voice/networking/VoiceWebSocket.js": false,
"src/client/voice/player/AudioPlayer.js": false,
"src/client/voice/player/BasePlayer.js": false,
"src/client/voice/player/BroadcastAudioPlayer.js": false,
"src/client/voice/receiver/PacketHandler.js": false,
"src/client/voice/receiver/Receiver.js": false,
"src/client/voice/util/PlayInterface.js": false,
"src/client/voice/util/Secretbox.js": false,
"src/client/voice/util/Silence.js": false,
"src/client/voice/util/VolumeInterface.js": false
},
"husky": {
"hooks": {
"pre-commit": "lint-staged",
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
},
"lint-staged": {
"*.js": "eslint --fix",
"*.ts": "prettier --write"
},
"commitlint": {
"extends": [
"@commitlint/config-angular"
],
"rules": {
"scope-case": [
2,
"always",
"pascal-case"
],
"type-enum": [
2,
"always",
[
"chore",
"build",
"ci",
"docs",
"feat",
"fix",
"perf",
"refactor",
"revert",
"style",
"test"
]
]
}
},
"prettier": {
"singleQuote": true,
"printWidth": 120,
"trailingComma": "all",
"endOfLine": "lf",
"arrowParens": "avoid"
"node": ">=16.6.0",
"npm": ">=7.0.0"
}
}

View File

@@ -1,7 +1,5 @@
'use strict';
const { browser } = require('./util/Constants');
let erlpack;
try {
@@ -9,15 +7,7 @@ try {
if (!erlpack.pack) erlpack = null;
} catch {} // eslint-disable-line no-empty
let TextDecoder;
if (browser) {
TextDecoder = window.TextDecoder; // eslint-disable-line no-undef
exports.WebSocket = window.WebSocket; // eslint-disable-line no-undef
} else {
TextDecoder = require('util').TextDecoder;
exports.WebSocket = require('ws');
}
exports.WebSocket = require('ws');
const ab = new TextDecoder();
@@ -42,7 +32,6 @@ exports.create = (gateway, query = {}, ...args) => {
query = new URLSearchParams(query);
if (q) new URLSearchParams(q).forEach((v, k) => query.set(k, v));
const ws = new exports.WebSocket(`${g}?${query}`, ...args);
if (browser) ws.binaryType = 'arraybuffer';
return ws;
};

View File

@@ -1,9 +1,8 @@
'use strict';
require('setimmediate');
const EventEmitter = require('events');
const EventEmitter = require('node:events');
const RESTManager = require('../rest/RESTManager');
const { DefaultOptions } = require('../util/Constants');
const Options = require('../util/Options');
const Util = require('../util/Util');
/**
@@ -14,39 +13,18 @@ class BaseClient extends EventEmitter {
constructor(options = {}) {
super();
/**
* Timeouts set by {@link BaseClient#setTimeout} that are still active
* @type {Set<Timeout>}
* @private
*/
this._timeouts = new Set();
/**
* Intervals set by {@link BaseClient#setInterval} that are still active
* @type {Set<Timeout>}
* @private
*/
this._intervals = new Set();
/**
* Intervals set by {@link BaseClient#setImmediate} that are still active
* @type {Set<Immediate>}
* @private
*/
this._immediates = new Set();
/**
* The options the client was instantiated with
* @type {ClientOptions}
*/
this.options = Util.mergeDefault(DefaultOptions, options);
this.options = Util.mergeDefault(Options.createDefault(), options);
/**
* The REST manager of the client
* @type {RESTManager}
* @private
*/
this.rest = new RESTManager(this, options._tokenType);
this.rest = new RESTManager(this);
}
/**
@@ -61,82 +39,10 @@ class BaseClient extends EventEmitter {
/**
* Destroys all assets used by the base client.
* @returns {void}
*/
destroy() {
for (const t of this._timeouts) this.clearTimeout(t);
for (const i of this._intervals) this.clearInterval(i);
for (const i of this._immediates) this.clearImmediate(i);
this._timeouts.clear();
this._intervals.clear();
this._immediates.clear();
}
/**
* Sets a timeout that will be automatically cancelled if the client is destroyed.
* @param {Function} fn Function to execute
* @param {number} delay Time to wait before executing (in milliseconds)
* @param {...*} args Arguments for the function
* @returns {Timeout}
*/
setTimeout(fn, delay, ...args) {
const timeout = setTimeout(() => {
fn(...args);
this._timeouts.delete(timeout);
}, delay);
this._timeouts.add(timeout);
return timeout;
}
/**
* Clears a timeout.
* @param {Timeout} timeout Timeout to cancel
*/
clearTimeout(timeout) {
clearTimeout(timeout);
this._timeouts.delete(timeout);
}
/**
* Sets an interval that will be automatically cancelled if the client is destroyed.
* @param {Function} fn Function to execute
* @param {number} delay Time to wait between executions (in milliseconds)
* @param {...*} args Arguments for the function
* @returns {Timeout}
*/
setInterval(fn, delay, ...args) {
const interval = setInterval(fn, delay, ...args);
this._intervals.add(interval);
return interval;
}
/**
* Clears an interval.
* @param {Timeout} interval Interval to cancel
*/
clearInterval(interval) {
clearInterval(interval);
this._intervals.delete(interval);
}
/**
* Sets an immediate that will be automatically cancelled if the client is destroyed.
* @param {Function} fn Function to execute
* @param {...*} args Arguments for the function
* @returns {Immediate}
*/
setImmediate(fn, ...args) {
const immediate = setImmediate(fn, ...args);
this._immediates.add(immediate);
return immediate;
}
/**
* Clears an immediate.
* @param {Immediate} immediate Immediate to cancel
*/
clearImmediate(immediate) {
clearImmediate(immediate);
this._immediates.delete(immediate);
if (this.rest.sweepInterval) clearInterval(this.rest.sweepInterval);
}
/**

View File

@@ -1,27 +1,30 @@
'use strict';
const { Collection } = require('@discordjs/collection');
const BaseClient = require('./BaseClient');
const ActionsManager = require('./actions/ActionsManager');
const ClientVoiceManager = require('./voice/ClientVoiceManager');
const WebSocketManager = require('./websocket/WebSocketManager');
const { Error, TypeError, RangeError } = require('../errors');
const BaseGuildEmojiManager = require('../managers/BaseGuildEmojiManager');
const ChannelManager = require('../managers/ChannelManager');
const GuildEmojiManager = require('../managers/GuildEmojiManager');
const GuildManager = require('../managers/GuildManager');
const UserManager = require('../managers/UserManager');
const ShardClientUtil = require('../sharding/ShardClientUtil');
const ClientApplication = require('../structures/ClientApplication');
const ClientPresence = require('../structures/ClientPresence');
const GuildPreview = require('../structures/GuildPreview');
const GuildTemplate = require('../structures/GuildTemplate');
const Invite = require('../structures/Invite');
const Sticker = require('../structures/Sticker');
const StickerPack = require('../structures/StickerPack');
const VoiceRegion = require('../structures/VoiceRegion');
const Webhook = require('../structures/Webhook');
const Collection = require('../util/Collection');
const { Events, browser, DefaultOptions } = require('../util/Constants');
const Widget = require('../structures/Widget');
const { Events, InviteScopes, Status } = require('../util/Constants');
const DataResolver = require('../util/DataResolver');
const Intents = require('../util/Intents');
const Options = require('../util/Options');
const Permissions = require('../util/Permissions');
const Structures = require('../util/Structures');
/**
* The main hub for interacting with the Discord API, and the starting point for any bot.
@@ -29,27 +32,21 @@ const Structures = require('../util/Structures');
*/
class Client extends BaseClient {
/**
* @param {ClientOptions} [options] Options for the client
* @param {ClientOptions} options Options for the client
*/
constructor(options = {}) {
super(Object.assign({ _tokenType: 'Bot' }, options));
constructor(options) {
super(options);
// Obtain shard details from environment or if present, worker threads
let data = process.env;
try {
// Test if worker threads module is present and used
data = require('worker_threads').workerData || data;
} catch {
// Do nothing
}
const data = require('node:worker_threads').workerData ?? process.env;
const defaults = Options.createDefault();
if (this.options.shards === DefaultOptions.shards) {
if (this.options.shards === defaults.shards) {
if ('SHARDS' in data) {
this.options.shards = JSON.parse(data.SHARDS);
}
}
if (this.options.shardCount === DefaultOptions.shardCount) {
if (this.options.shardCount === defaults.shardCount) {
if ('SHARD_COUNT' in data) {
this.options.shardCount = Number(data.SHARD_COUNT);
} else if (Array.isArray(this.options.shards)) {
@@ -75,6 +72,20 @@ class Client extends BaseClient {
this._validateOptions();
/**
* Functions called when a cache is garbage collected or the Client is destroyed
* @type {Set<Function>}
* @private
*/
this._cleanups = new Set();
/**
* The finalizers used to cleanup items.
* @type {FinalizationRegistry}
* @private
*/
this._finalizers = new FinalizationRegistry(this._finalize.bind(this));
/**
* The WebSocket manager of the client
* @type {WebSocketManager}
@@ -89,35 +100,34 @@ class Client extends BaseClient {
this.actions = new ActionsManager(this);
/**
* The voice manager of the client (`null` in browsers)
* @type {?ClientVoiceManager}
* The voice manager of the client
* @type {ClientVoiceManager}
*/
this.voice = !browser ? new ClientVoiceManager(this) : null;
this.voice = new ClientVoiceManager(this);
/**
* Shard helpers for the client (only if the process was spawned from a {@link ShardingManager})
* @type {?ShardClientUtil}
*/
this.shard =
!browser && process.env.SHARDING_MANAGER
? ShardClientUtil.singleton(this, process.env.SHARDING_MANAGER_MODE)
: null;
this.shard = process.env.SHARDING_MANAGER
? ShardClientUtil.singleton(this, process.env.SHARDING_MANAGER_MODE)
: null;
/**
* All of the {@link User} objects that have been cached at any point, mapped by their IDs
* All of the {@link User} objects that have been cached at any point, mapped by their ids
* @type {UserManager}
*/
this.users = new UserManager(this);
/**
* All of the guilds the client is currently handling, mapped by their IDs -
* All of the guilds the client is currently handling, mapped by their ids -
* as long as sharding isn't being used, this will be *every* guild the bot is a member of
* @type {GuildManager}
*/
this.guilds = new GuildManager(this);
/**
* All of the {@link Channel}s that the client is currently handling, mapped by their IDs -
* All of the {@link Channel}s that the client is currently handling, mapped by their ids -
* as long as sharding isn't being used, this will be *every* channel in *every* guild the bot
* is a member of. Note that DM channels will not be initially cached, and thus not be present
* in the Manager without their explicit fetching or use.
@@ -125,16 +135,15 @@ class Client extends BaseClient {
*/
this.channels = new ChannelManager(this);
const ClientPresence = Structures.get('ClientPresence');
/**
* The presence of the Client
* @private
* @type {ClientPresence}
*/
this.presence = new ClientPresence(this);
this.presence = new ClientPresence(this, this.options.presence);
Object.defineProperty(this, 'token', { writable: true });
if (!browser && !this.token && 'DISCORD_TOKEN' in process.env) {
if (!this.token && 'DISCORD_TOKEN' in process.env) {
/**
* Authorization token for the logged in bot.
* If present, this defaults to `process.env.DISCORD_TOKEN` when instantiating the client
@@ -152,6 +161,12 @@ class Client extends BaseClient {
*/
this.user = null;
/**
* The application of this bot
* @type {?ClientApplication}
*/
this.application = null;
/**
* Time at which the client was last regarded as being in the `READY` state
* (each time the client disconnects and successfully reconnects, this will be overwritten)
@@ -160,17 +175,24 @@ class Client extends BaseClient {
this.readyAt = null;
if (this.options.messageSweepInterval > 0) {
this.setInterval(this.sweepMessages.bind(this), this.options.messageSweepInterval * 1000);
process.emitWarning(
'The message sweeping client options are deprecated, use the makeCache option with LimitedCollection instead.',
'DeprecationWarning',
);
this.sweepMessageInterval = setInterval(
this.sweepMessages.bind(this),
this.options.messageSweepInterval * 1_000,
).unref();
}
}
/**
* All custom emojis that the client has access to, mapped by their IDs
* @type {GuildEmojiManager}
* All custom emojis that the client has access to, mapped by their ids
* @type {BaseGuildEmojiManager}
* @readonly
*/
get emojis() {
const emojis = new GuildEmojiManager({ client: this });
const emojis = new BaseGuildEmojiManager(this);
for (const guild of this.guilds.cache.values()) {
if (guild.available) for (const emoji of guild.emojis.cache.values()) emojis.cache.set(emoji.id, emoji);
}
@@ -183,7 +205,7 @@ class Client extends BaseClient {
* @readonly
*/
get readyTimestamp() {
return this.readyAt ? this.readyAt.getTime() : null;
return this.readyAt?.getTime() ?? null;
}
/**
@@ -214,7 +236,7 @@ class Client extends BaseClient {
);
if (this.options.presence) {
this.options.ws.presence = await this.presence._parse(this.options.presence);
this.options.ws.presence = this.presence._parse(this.options.presence);
}
this.emit(Events.DEBUG, 'Preparing to connect to the gateway...');
@@ -228,12 +250,27 @@ class Client extends BaseClient {
}
}
/**
* Returns whether the client has logged in, indicative of being able to access
* properties such as `user` and `application`.
* @returns {boolean}
*/
isReady() {
return this.ws.status === Status.READY;
}
/**
* Logs out, terminates the connection to Discord, and destroys the client.
* @returns {void}
*/
destroy() {
super.destroy();
for (const fn of this._cleanups) fn();
this._cleanups.clear();
if (this.sweepMessageInterval) clearInterval(this.sweepMessageInterval);
this.ws.destroy();
this.token = null;
}
@@ -243,16 +280,14 @@ class Client extends BaseClient {
* @param {InviteResolvable} invite Invite code or URL
* @returns {Promise<Invite>}
* @example
* client.fetchInvite('https://discord.gg/bRCvFy9')
* client.fetchInvite('https://discord.gg/djs')
* .then(invite => console.log(`Obtained invite with code: ${invite.code}`))
* .catch(console.error);
*/
fetchInvite(invite) {
async fetchInvite(invite) {
const code = DataResolver.resolveInviteCode(invite);
return this.api
.invites(code)
.get({ query: { with_counts: true } })
.then(data => new Invite(this, data));
const data = await this.api.invites(code).get({ query: { with_counts: true, with_expiration: true } });
return new Invite(this, data);
}
/**
@@ -264,17 +299,15 @@ class Client extends BaseClient {
* .then(template => console.log(`Obtained template with code: ${template.code}`))
* .catch(console.error);
*/
fetchGuildTemplate(template) {
async fetchGuildTemplate(template) {
const code = DataResolver.resolveGuildTemplateCode(template);
return this.api.guilds
.templates(code)
.get()
.then(data => new GuildTemplate(this, data));
const data = await this.api.guilds.templates(code).get();
return new GuildTemplate(this, data);
}
/**
* Obtains a webhook from Discord.
* @param {Snowflake} id ID of the webhook
* @param {Snowflake} id The webhook's id
* @param {string} [token] Token for the webhook
* @returns {Promise<Webhook>}
* @example
@@ -282,11 +315,9 @@ class Client extends BaseClient {
* .then(webhook => console.log(`Obtained webhook with name: ${webhook.name}`))
* .catch(console.error);
*/
fetchWebhook(id, token) {
return this.api
.webhooks(id, token)
.get()
.then(data => new Webhook(this, data));
async fetchWebhook(id, token) {
const data = await this.api.webhooks(id, token).get();
return new Webhook(this, { token, ...data });
}
/**
@@ -297,12 +328,56 @@ class Client extends BaseClient {
* .then(regions => console.log(`Available regions are: ${regions.map(region => region.name).join(', ')}`))
* .catch(console.error);
*/
fetchVoiceRegions() {
return this.api.voice.regions.get().then(res => {
const regions = new Collection();
for (const region of res) regions.set(region.id, new VoiceRegion(region));
return regions;
});
async fetchVoiceRegions() {
const apiRegions = await this.api.voice.regions.get();
const regions = new Collection();
for (const region of apiRegions) regions.set(region.id, new VoiceRegion(region));
return regions;
}
/**
* Obtains a sticker from Discord.
* @param {Snowflake} id The sticker's id
* @returns {Promise<Sticker>}
* @example
* client.fetchSticker('id')
* .then(sticker => console.log(`Obtained sticker with name: ${sticker.name}`))
* .catch(console.error);
*/
async fetchSticker(id) {
const data = await this.api.stickers(id).get();
return new Sticker(this, data);
}
/**
* Obtains the list of sticker packs available to Nitro subscribers from Discord.
* @returns {Promise<Collection<Snowflake, StickerPack>>}
* @example
* client.fetchPremiumStickerPacks()
* .then(packs => console.log(`Available sticker packs are: ${packs.map(pack => pack.name).join(', ')}`))
* .catch(console.error);
*/
async fetchPremiumStickerPacks() {
const data = await this.api('sticker-packs').get();
return new Collection(data.sticker_packs.map(p => [p.id, new StickerPack(this, p)]));
}
/**
* A last ditch cleanup function for garbage collection.
* @param {Function} options.cleanup The function called to GC
* @param {string} [options.message] The message to send after a successful GC
* @param {string} [options.name] The name of the item being GCed
* @private
*/
_finalize({ cleanup, message, name }) {
try {
cleanup();
this._cleanups.delete(cleanup);
if (message) {
this.emit(Events.DEBUG, message);
}
} catch {
this.emit(Events.DEBUG, `Garbage collection failed on ${name ?? 'an unknown item'}.`);
}
}
/**
@@ -326,7 +401,7 @@ class Client extends BaseClient {
return -1;
}
const lifetimeMs = lifetime * 1000;
const lifetimeMs = lifetime * 1_000;
const now = Date.now();
let channels = 0;
let messages = 0;
@@ -336,7 +411,7 @@ class Client extends BaseClient {
channels++;
messages += channel.messages.cache.sweep(
message => now - (message.editedTimestamp || message.createdTimestamp) > lifetimeMs,
message => now - (message.editedTimestamp ?? message.createdTimestamp) > lifetimeMs,
);
}
@@ -347,64 +422,98 @@ class Client extends BaseClient {
return messages;
}
/**
* Obtains the OAuth Application of this bot from Discord.
* @returns {Promise<ClientApplication>}
*/
fetchApplication() {
return this.api.oauth2
.applications('@me')
.get()
.then(app => new ClientApplication(this, app));
}
/**
* Obtains a guild preview from Discord, available for all guilds the bot is in and all Discoverable guilds.
* @param {GuildResolvable} guild The guild to fetch the preview for
* @returns {Promise<GuildPreview>}
*/
fetchGuildPreview(guild) {
const id = this.guilds.resolveID(guild);
async fetchGuildPreview(guild) {
const id = this.guilds.resolveId(guild);
if (!id) throw new TypeError('INVALID_TYPE', 'guild', 'GuildResolvable');
return this.api
.guilds(id)
.preview.get()
.then(data => new GuildPreview(this, data));
const data = await this.api.guilds(id).preview.get();
return new GuildPreview(this, data);
}
/**
* Generates a link that can be used to invite the bot to a guild.
* @param {InviteGenerationOptions|PermissionResolvable} [options] Permissions to request
* @returns {Promise<string>}
* @example
* client.generateInvite({
* permissions: ['SEND_MESSAGES', 'MANAGE_GUILD', 'MENTION_EVERYONE'],
* })
* .then(link => console.log(`Generated bot invite link: ${link}`))
* .catch(console.error);
* Obtains the widget data of a guild from Discord, available for guilds with the widget enabled.
* @param {GuildResolvable} guild The guild to fetch the widget data for
* @returns {Promise<Widget>}
*/
async generateInvite(options = {}) {
if (Array.isArray(options) || ['string', 'number'].includes(typeof options) || options instanceof Permissions) {
process.emitWarning(
'Client#generateInvite: Generate invite with an options object instead of a PermissionResolvable',
'DeprecationWarning',
);
options = { permissions: options };
}
const application = await this.fetchApplication();
async fetchGuildWidget(guild) {
const id = this.guilds.resolveId(guild);
if (!id) throw new TypeError('INVALID_TYPE', 'guild', 'GuildResolvable');
const data = await this.api.guilds(id, 'widget.json').get();
return new Widget(this, data);
}
/**
* Options for {@link Client#generateInvite}.
* @typedef {Object} InviteGenerationOptions
* @property {InviteScope[]} scopes Scopes that should be requested
* @property {PermissionResolvable} [permissions] Permissions to request
* @property {GuildResolvable} [guild] Guild to preselect
* @property {boolean} [disableGuildSelect] Whether to disable the guild selection
*/
/**
* Generates a link that can be used to invite the bot to a guild.
* @param {InviteGenerationOptions} [options={}] Options for the invite
* @returns {string}
* @example
* const link = client.generateInvite({
* scopes: ['applications.commands'],
* });
* console.log(`Generated application invite link: ${link}`);
* @example
* const link = client.generateInvite({
* permissions: [
* Permissions.FLAGS.SEND_MESSAGES,
* Permissions.FLAGS.MANAGE_GUILD,
* Permissions.FLAGS.MENTION_EVERYONE,
* ],
* scopes: ['bot'],
* });
* console.log(`Generated bot invite link: ${link}`);
*/
generateInvite(options = {}) {
if (typeof options !== 'object') throw new TypeError('INVALID_TYPE', 'options', 'object', true);
if (!this.application) throw new Error('CLIENT_NOT_READY', 'generate an invite link');
const query = new URLSearchParams({
client_id: application.id,
permissions: Permissions.resolve(options.permissions),
scope: 'bot',
client_id: this.application.id,
});
if (typeof options.disableGuildSelect === 'boolean') {
query.set('disable_guild_select', options.disableGuildSelect.toString());
const { scopes } = options;
if (typeof scopes === 'undefined') {
throw new TypeError('INVITE_MISSING_SCOPES');
}
if (typeof options.guild !== 'undefined') {
const guildID = this.guilds.resolveID(options.guild);
if (!guildID) throw new TypeError('INVALID_TYPE', 'options.guild', 'GuildResolvable');
query.set('guild_id', guildID);
if (!Array.isArray(scopes)) {
throw new TypeError('INVALID_TYPE', 'scopes', 'Array of Invite Scopes', true);
}
if (!scopes.some(scope => ['bot', 'applications.commands'].includes(scope))) {
throw new TypeError('INVITE_MISSING_SCOPES');
}
const invalidScope = scopes.find(scope => !InviteScopes.includes(scope));
if (invalidScope) {
throw new TypeError('INVALID_ELEMENT', 'Array', 'scopes', invalidScope);
}
query.set('scope', scopes.join(' '));
if (options.permissions) {
const permissions = Permissions.resolve(options.permissions);
if (permissions) query.set('permissions', permissions);
}
if (options.disableGuildSelect) {
query.set('disable_guild_select', true);
}
if (options.guild) {
const guildId = this.guilds.resolveId(options.guild);
if (!guildId) throw new TypeError('INVALID_TYPE', 'options.guild', 'GuildResolvable');
query.set('guild_id', guildId);
}
return `${this.options.http.api}${this.api.oauth2.authorize}?${query}`;
}
@@ -431,8 +540,10 @@ class Client extends BaseClient {
* @private
*/
_validateOptions(options = this.options) {
if (typeof options.ws.intents !== 'undefined') {
options.ws.intents = Intents.resolve(options.ws.intents);
if (typeof options.intents === 'undefined') {
throw new TypeError('CLIENT_MISSING_INTENTS');
} else {
options.intents = Intents.resolve(options.intents);
}
if (typeof options.shardCount !== 'number' || isNaN(options.shardCount) || options.shardCount < 1) {
throw new TypeError('CLIENT_INVALID_OPTION', 'shardCount', 'a number greater than or equal to 1');
@@ -441,8 +552,8 @@ class Client extends BaseClient {
throw new TypeError('CLIENT_INVALID_OPTION', 'shards', "'auto', a number or array of numbers");
}
if (options.shards && !options.shards.length) throw new RangeError('CLIENT_INVALID_PROVIDED_SHARDS');
if (typeof options.messageCacheMaxSize !== 'number' || isNaN(options.messageCacheMaxSize)) {
throw new TypeError('CLIENT_INVALID_OPTION', 'messageCacheMaxSize', 'a number');
if (typeof options.makeCache !== 'function') {
throw new TypeError('CLIENT_INVALID_OPTION', 'makeCache', 'a function');
}
if (typeof options.messageCacheLifetime !== 'number' || isNaN(options.messageCacheLifetime)) {
throw new TypeError('CLIENT_INVALID_OPTION', 'The messageCacheLifetime', 'a number');
@@ -450,18 +561,8 @@ class Client extends BaseClient {
if (typeof options.messageSweepInterval !== 'number' || isNaN(options.messageSweepInterval)) {
throw new TypeError('CLIENT_INVALID_OPTION', 'messageSweepInterval', 'a number');
}
if (
typeof options.messageEditHistoryMaxSize !== 'number' ||
isNaN(options.messageEditHistoryMaxSize) ||
options.messageEditHistoryMaxSize < -1
) {
throw new TypeError('CLIENT_INVALID_OPTION', 'messageEditHistoryMaxSize', 'a number greater than or equal to -1');
}
if (typeof options.fetchAllMembers !== 'boolean') {
throw new TypeError('CLIENT_INVALID_OPTION', 'fetchAllMembers', 'a boolean');
}
if (typeof options.disableMentions !== 'string') {
throw new TypeError('CLIENT_INVALID_OPTION', 'disableMentions', 'a string');
if (typeof options.invalidRequestWarningInterval !== 'number' || isNaN(options.invalidRequestWarningInterval)) {
throw new TypeError('CLIENT_INVALID_OPTION', 'invalidRequestWarningInterval', 'a number');
}
if (!Array.isArray(options.partials)) {
throw new TypeError('CLIENT_INVALID_OPTION', 'partials', 'an Array');
@@ -472,25 +573,32 @@ class Client extends BaseClient {
if (typeof options.restRequestTimeout !== 'number' || isNaN(options.restRequestTimeout)) {
throw new TypeError('CLIENT_INVALID_OPTION', 'restRequestTimeout', 'a number');
}
if (typeof options.restGlobalRateLimit !== 'number' || isNaN(options.restGlobalRateLimit)) {
throw new TypeError('CLIENT_INVALID_OPTION', 'restGlobalRateLimit', 'a number');
}
if (typeof options.restSweepInterval !== 'number' || isNaN(options.restSweepInterval)) {
throw new TypeError('CLIENT_INVALID_OPTION', 'restSweepInterval', 'a number');
}
if (typeof options.retryLimit !== 'number' || isNaN(options.retryLimit)) {
throw new TypeError('CLIENT_INVALID_OPTION', 'retryLimit', 'a number');
}
if (typeof options.failIfNotExists !== 'boolean') {
throw new TypeError('CLIENT_INVALID_OPTION', 'failIfNotExists', 'a boolean');
}
if (!Array.isArray(options.userAgentSuffix)) {
throw new TypeError('CLIENT_INVALID_OPTION', 'userAgentSuffix', 'an array of strings');
}
if (
typeof options.rejectOnRateLimit !== 'undefined' &&
!(typeof options.rejectOnRateLimit === 'function' || Array.isArray(options.rejectOnRateLimit))
) {
throw new TypeError('CLIENT_INVALID_OPTION', 'rejectOnRateLimit', 'an array or a function');
}
}
}
module.exports = Client;
/**
* Options for {@link Client#generateInvite}.
* @typedef {Object} InviteGenerationOptions
* @property {PermissionResolvable} [permissions] Permissions to request
* @property {GuildResolvable} [guild] Guild to preselect
* @property {boolean} [disableGuildSelect] Whether to disable the guild selection
*/
/**
* Emitted for general warnings.
* @event Client#warn
@@ -502,3 +610,8 @@ module.exports = Client;
* @event Client#debug
* @param {string} info The debug information
*/
/**
* @external Collection
* @see {@link https://discord.js.org/#/docs/collection/main/class/Collection}
*/

View File

@@ -1,6 +1,7 @@
'use strict';
const BaseClient = require('./BaseClient');
const { Error } = require('../errors');
const Webhook = require('../structures/Webhook');
/**
@@ -10,20 +11,49 @@ const Webhook = require('../structures/Webhook');
*/
class WebhookClient extends BaseClient {
/**
* @param {Snowflake} id ID of the webhook
* @param {string} token Token of the webhook
* @param {ClientOptions} [options] Options for the client
* @example
* // Create a new webhook and send a message
* const hook = new Discord.WebhookClient('1234', 'abcdef');
* hook.send('This will send a message').catch(console.error);
* The data for the webhook client containing either an id and token or just a URL
* @typedef {Object} WebhookClientData
* @property {Snowflake} [id] The id of the webhook
* @property {string} [token] The token of the webhook
* @property {string} [url] The full url for the webhook client
*/
constructor(id, token, options) {
/**
* @param {WebhookClientData} data The data of the webhook
* @param {ClientOptions} [options] Options for the client
*/
constructor(data, options) {
super(options);
Object.defineProperty(this, 'client', { value: this });
let { id, token } = data;
if ('url' in data) {
const url = data.url.match(
// eslint-disable-next-line no-useless-escape
/^https?:\/\/(?:canary|ptb)?\.?discord\.com\/api\/webhooks(?:\/v[0-9]\d*)?\/([^\/]+)\/([^\/]+)/i,
);
if (!url || url.length <= 1) throw new Error('WEBHOOK_URL_INVALID');
[, id, token] = url;
}
this.id = id;
Object.defineProperty(this, 'token', { value: token, writable: true, configurable: true });
}
// These are here only for documentation purposes - they are implemented by Webhook
/* eslint-disable no-empty-function */
send() {}
sendSlackMessage() {}
fetchMessage() {}
edit() {}
editMessage() {}
delete() {}
deleteMessage() {}
get createdTimestamp() {}
get createdAt() {}
get url() {}
}
Webhook.applyToClass(WebhookClient);

View File

@@ -26,20 +26,20 @@ class GenericAction {
getPayload(data, manager, id, partialType, cache) {
const existing = manager.cache.get(id);
if (!existing && this.client.options.partials.includes(partialType)) {
return manager.add(data, cache);
return manager._add(data, cache);
}
return existing;
}
getChannel(data) {
const id = data.channel_id || data.id;
const id = data.channel_id ?? data.id;
return (
data.channel ||
data.channel ??
this.getPayload(
{
id,
guild_id: data.guild_id,
recipients: [data.author || { id: data.user_id }],
recipients: [data.author ?? data.user ?? { id: data.user_id }],
},
this.client.channels,
id,
@@ -49,14 +49,14 @@ class GenericAction {
}
getMessage(data, channel, cache) {
const id = data.message_id || data.id;
const id = data.message_id ?? data.id;
return (
data.message ||
data.message ??
this.getPayload(
{
id,
channel_id: channel.id,
guild_id: data.guild_id || (channel.guild ? channel.guild.id : null),
guild_id: data.guild_id ?? channel.guild?.id,
},
channel.messages,
id,
@@ -67,12 +67,12 @@ class GenericAction {
}
getReaction(data, message, user) {
const id = data.emoji.id || decodeURIComponent(data.emoji.name);
const id = data.emoji.id ?? decodeURIComponent(data.emoji.name);
return this.getPayload(
{
emoji: data.emoji,
count: message.partial ? null : 0,
me: user ? user.id === this.client.user.id : false,
me: user?.id === this.client.user.id,
},
message.reactions,
id,
@@ -86,16 +86,16 @@ class GenericAction {
getUser(data) {
const id = data.user_id;
return data.user || this.getPayload({ id }, this.client.users, id, PartialTypes.USER);
return data.user ?? this.getPayload({ id }, this.client.users, id, PartialTypes.USER);
}
getUserFromMember(data) {
if (data.guild_id && data.member && data.member.user) {
if (data.guild_id && data.member?.user) {
const guild = this.client.guilds.cache.get(data.guild_id);
if (guild) {
return guild.members.add(data.member).user;
return guild.members._add(data.member).user;
} else {
return this.client.users.add(data.member.user);
return this.client.users._add(data.member.user);
}
}
return this.getUser(data);

View File

@@ -1,42 +1,17 @@
'use strict';
const fs = require('node:fs');
class ActionsManager {
constructor(client) {
this.client = client;
this.register(require('./MessageCreate'));
this.register(require('./MessageDelete'));
this.register(require('./MessageDeleteBulk'));
this.register(require('./MessageUpdate'));
this.register(require('./MessageReactionAdd'));
this.register(require('./MessageReactionRemove'));
this.register(require('./MessageReactionRemoveAll'));
this.register(require('./MessageReactionRemoveEmoji'));
this.register(require('./ChannelCreate'));
this.register(require('./ChannelDelete'));
this.register(require('./ChannelUpdate'));
this.register(require('./GuildDelete'));
this.register(require('./GuildUpdate'));
this.register(require('./InviteCreate'));
this.register(require('./InviteDelete'));
this.register(require('./GuildMemberRemove'));
this.register(require('./GuildMemberUpdate'));
this.register(require('./GuildBanRemove'));
this.register(require('./GuildRoleCreate'));
this.register(require('./GuildRoleDelete'));
this.register(require('./GuildRoleUpdate'));
this.register(require('./PresenceUpdate'));
this.register(require('./UserUpdate'));
this.register(require('./VoiceStateUpdate'));
this.register(require('./GuildEmojiCreate'));
this.register(require('./GuildEmojiDelete'));
this.register(require('./GuildEmojiUpdate'));
this.register(require('./GuildEmojisUpdate'));
this.register(require('./GuildRolesPositionUpdate'));
this.register(require('./GuildChannelsPositionUpdate'));
this.register(require('./GuildIntegrationsUpdate'));
this.register(require('./WebhooksUpdate'));
this.register(require('./TypingStart'));
const files = fs.readdirSync(__dirname);
for (const file of files) {
if (['Action.js', 'ActionsManager.js'].includes(file)) continue;
this.register(require(`./${file}`));
}
}
register(Action) {

View File

@@ -7,12 +7,12 @@ class ChannelCreateAction extends Action {
handle(data) {
const client = this.client;
const existing = client.channels.cache.has(data.id);
const channel = client.channels.add(data);
const channel = client.channels._add(data);
if (!existing && channel) {
/**
* Emitted whenever a channel is created.
* Emitted whenever a guild channel is created.
* @event Client#channelCreate
* @param {DMChannel|GuildChannel} channel The channel that was created
* @param {GuildChannel} channel The channel that was created
*/
client.emit(Events.CHANNEL_CREATE, channel);
}

View File

@@ -12,10 +12,10 @@ class ChannelDeleteAction extends Action {
handle(data) {
const client = this.client;
let channel = client.channels.cache.get(data.id);
const channel = client.channels.cache.get(data.id);
if (channel) {
client.channels.remove(channel.id);
client.channels._remove(channel.id);
channel.deleted = true;
if (channel.messages && !(channel instanceof DMChannel)) {
for (const message of channel.messages.cache.values()) {

View File

@@ -12,10 +12,9 @@ class ChannelUpdateAction extends Action {
if (channel) {
const old = channel._update(data);
if (ChannelTypes[channel.type.toUpperCase()] !== data.type) {
if (ChannelTypes[channel.type] !== data.type) {
const newChannel = Channel.create(this.client, data, channel.guild);
for (const [id, message] of channel.messages.cache) newChannel.messages.cache.set(id, message);
newChannel._typing = new Map(channel._typing);
channel = newChannel;
this.client.channels.cache.set(channel.id, channel);
}
@@ -24,6 +23,8 @@ class ChannelUpdateAction extends Action {
old,
updated: channel,
};
} else {
client.channels._add(data);
}
return {};

View File

@@ -0,0 +1,20 @@
'use strict';
const Action = require('./Action');
const { Events } = require('../../util/Constants');
class GuildBanAdd extends Action {
handle(data) {
const client = this.client;
const guild = client.guilds.cache.get(data.guild_id);
/**
* Emitted whenever a member is banned from a guild.
* @event Client#guildBanAdd
* @param {GuildBan} ban The ban that occurred
*/
if (guild) client.emit(Events.GUILD_BAN_ADD, guild.bans._add(data));
}
}
module.exports = GuildBanAdd;

View File

@@ -1,20 +1,24 @@
'use strict';
const Action = require('./Action');
const GuildBan = require('../../structures/GuildBan');
const { Events } = require('../../util/Constants');
class GuildBanRemove extends Action {
handle(data) {
const client = this.client;
const guild = client.guilds.cache.get(data.guild_id);
const user = client.users.add(data.user);
/**
* Emitted whenever a member is unbanned from a guild.
* @event Client#guildBanRemove
* @param {Guild} guild The guild that the unban occurred in
* @param {User} user The user that was unbanned
* @param {GuildBan} ban The ban that was removed
*/
if (guild && user) client.emit(Events.GUILD_BAN_REMOVE, guild, user);
if (guild) {
const ban = guild.bans.cache.get(data.user.id) ?? new GuildBan(client, data, guild);
guild.bans.cache.delete(ban.user.id);
client.emit(Events.GUILD_BAN_REMOVE, ban);
}
}
}

View File

@@ -14,10 +14,6 @@ class GuildDeleteAction extends Action {
let guild = client.guilds.cache.get(data.id);
if (guild) {
for (const channel of guild.channels.cache.values()) {
if (channel.type === 'text') channel.stopTyping(true);
}
if (data.unavailable) {
// Guild is unavailable
guild.available = false;
@@ -36,8 +32,8 @@ class GuildDeleteAction extends Action {
};
}
for (const channel of guild.channels.cache.values()) this.client.channels.remove(channel.id);
if (guild.voice && guild.voice.connection) guild.voice.connection.disconnect();
for (const channel of guild.channels.cache.values()) this.client.channels._remove(channel.id);
client.voice.adapters.get(data.id)?.destroy();
// Delete guild
client.guilds.cache.delete(guild.id);
@@ -53,14 +49,14 @@ class GuildDeleteAction extends Action {
this.deleted.set(guild.id, guild);
this.scheduleForDeletion(guild.id);
} else {
guild = this.deleted.get(data.id) || null;
guild = this.deleted.get(data.id) ?? null;
}
return { guild };
}
scheduleForDeletion(id) {
this.client.setTimeout(() => this.deleted.delete(id), this.client.options.restWsBridgeTimeout);
setTimeout(() => this.deleted.delete(id), this.client.options.restWsBridgeTimeout).unref();
}
}

View File

@@ -6,7 +6,7 @@ const { Events } = require('../../util/Constants');
class GuildEmojiCreateAction extends Action {
handle(guild, createdEmoji) {
const already = guild.emojis.cache.has(createdEmoji.id);
const emoji = guild.emojis.add(createdEmoji);
const emoji = guild.emojis._add(createdEmoji);
/**
* Emitted whenever a custom emoji is created in a guild.
* @event Client#emojiCreate

View File

@@ -5,7 +5,7 @@ const Action = require('./Action');
class GuildEmojisUpdateAction extends Action {
handle(data) {
const guild = this.client.guilds.cache.get(data.guild_id);
if (!guild || !guild.emojis) return;
if (!guild?.emojis) return;
const deletions = new Map(guild.emojis.cache);

View File

@@ -9,8 +9,8 @@ class GuildMemberUpdateAction extends Action {
if (data.user.username) {
const user = client.users.cache.get(data.user.id);
if (!user) {
client.users.add(data.user);
} else if (!user.equals(data.user)) {
client.users._add(data.user);
} else if (!user._equals(data.user)) {
client.actions.UserUpdate.handle(data.user);
}
}
@@ -22,14 +22,13 @@ class GuildMemberUpdateAction extends Action {
const old = member._update(data);
/**
* Emitted whenever a guild member changes - i.e. new role, removed role, nickname.
* Also emitted when the user's details (e.g. username) change.
* @event Client#guildMemberUpdate
* @param {GuildMember} oldMember The member before the update
* @param {GuildMember} newMember The member after the update
*/
if (shard.status === Status.READY) client.emit(Events.GUILD_MEMBER_UPDATE, old, member);
if (shard.status === Status.READY && !member.equals(old)) client.emit(Events.GUILD_MEMBER_UPDATE, old, member);
} else {
const newMember = guild.members.add(data);
const newMember = guild.members._add(data);
/**
* Emitted whenever a member becomes available in a large guild.
* @event Client#guildMemberAvailable

View File

@@ -10,7 +10,7 @@ class GuildRoleCreate extends Action {
let role;
if (guild) {
const already = guild.roles.cache.has(data.role.id);
role = guild.roles.add(data.role);
role = guild.roles._add(data.role);
/**
* Emitted whenever a role is created.
* @event Client#roleCreate

View File

@@ -0,0 +1,20 @@
'use strict';
const Action = require('./Action');
const { Events } = require('../../util/Constants');
class GuildStickerCreateAction extends Action {
handle(guild, createdSticker) {
const already = guild.stickers.cache.has(createdSticker.id);
const sticker = guild.stickers._add(createdSticker);
/**
* Emitted whenever a custom sticker is created in a guild.
* @event Client#stickerCreate
* @param {Sticker} sticker The sticker that was created
*/
if (!already) this.client.emit(Events.GUILD_STICKER_CREATE, sticker);
return { sticker };
}
}
module.exports = GuildStickerCreateAction;

View File

@@ -0,0 +1,20 @@
'use strict';
const Action = require('./Action');
const { Events } = require('../../util/Constants');
class GuildStickerDeleteAction extends Action {
handle(sticker) {
sticker.guild.stickers.cache.delete(sticker.id);
sticker.deleted = true;
/**
* Emitted whenever a custom sticker is deleted in a guild.
* @event Client#stickerDelete
* @param {Sticker} sticker The sticker that was deleted
*/
this.client.emit(Events.GUILD_STICKER_DELETE, sticker);
return { sticker };
}
}
module.exports = GuildStickerDeleteAction;

View File

@@ -0,0 +1,20 @@
'use strict';
const Action = require('./Action');
const { Events } = require('../../util/Constants');
class GuildStickerUpdateAction extends Action {
handle(current, data) {
const old = current._update(data);
/**
* Emitted whenever a custom sticker is updated in a guild.
* @event Client#stickerUpdate
* @param {Sticker} oldSticker The old sticker
* @param {Sticker} newSticker The new sticker
*/
this.client.emit(Events.GUILD_STICKER_UPDATE, old, current);
return { sticker: current };
}
}
module.exports = GuildStickerUpdateAction;

View File

@@ -0,0 +1,34 @@
'use strict';
const Action = require('./Action');
class GuildStickersUpdateAction extends Action {
handle(data) {
const guild = this.client.guilds.cache.get(data.guild_id);
if (!guild?.stickers) return;
const deletions = new Map(guild.stickers.cache);
for (const sticker of data.stickers) {
// Determine type of sticker event
const cachedSticker = guild.stickers.cache.get(sticker.id);
if (cachedSticker) {
deletions.delete(sticker.id);
if (!cachedSticker.equals(sticker)) {
// Sticker updated
this.client.actions.GuildStickerUpdate.handle(cachedSticker, sticker);
}
} else {
// Sticker added
this.client.actions.GuildStickerCreate.handle(guild, sticker);
}
}
for (const sticker of deletions.values()) {
// Sticker deleted
this.client.actions.GuildStickerDelete.handle(sticker);
}
}
}
module.exports = GuildStickersUpdateAction;

View File

@@ -0,0 +1,81 @@
'use strict';
const Action = require('./Action');
const ButtonInteraction = require('../../structures/ButtonInteraction');
const CommandInteraction = require('../../structures/CommandInteraction');
const ContextMenuInteraction = require('../../structures/ContextMenuInteraction');
const SelectMenuInteraction = require('../../structures/SelectMenuInteraction');
const { Events, InteractionTypes, MessageComponentTypes, ApplicationCommandTypes } = require('../../util/Constants');
let deprecationEmitted = false;
class InteractionCreateAction extends Action {
handle(data) {
const client = this.client;
// Resolve and cache partial channels for Interaction#channel getter
this.getChannel(data);
let InteractionType;
switch (data.type) {
case InteractionTypes.APPLICATION_COMMAND:
switch (data.data.type) {
case ApplicationCommandTypes.CHAT_INPUT:
InteractionType = CommandInteraction;
break;
case ApplicationCommandTypes.USER:
case ApplicationCommandTypes.MESSAGE:
InteractionType = ContextMenuInteraction;
break;
default:
client.emit(
Events.DEBUG,
`[INTERACTION] Received application command interaction with unknown type: ${data.data.type}`,
);
return;
}
break;
case InteractionTypes.MESSAGE_COMPONENT:
switch (data.data.component_type) {
case MessageComponentTypes.BUTTON:
InteractionType = ButtonInteraction;
break;
case MessageComponentTypes.SELECT_MENU:
InteractionType = SelectMenuInteraction;
break;
default:
client.emit(
Events.DEBUG,
`[INTERACTION] Received component interaction with unknown type: ${data.data.component_type}`,
);
return;
}
break;
default:
client.emit(Events.DEBUG, `[INTERACTION] Received interaction with unknown type: ${data.type}`);
return;
}
const interaction = new InteractionType(client, data);
/**
* Emitted when an interaction is created.
* @event Client#interactionCreate
* @param {Interaction} interaction The interaction which was created
*/
client.emit(Events.INTERACTION_CREATE, interaction);
/**
* Emitted when an interaction is created.
* @event Client#interaction
* @param {Interaction} interaction The interaction which was created
* @deprecated Use {@link Client#interactionCreate} instead
*/
if (client.emit('interaction', interaction) && !deprecationEmitted) {
deprecationEmitted = true;
process.emitWarning('The interaction event is deprecated. Use interactionCreate instead', 'DeprecationWarning');
}
}
}
module.exports = InteractionCreateAction;

View File

@@ -1,7 +1,6 @@
'use strict';
const Action = require('./Action');
const Invite = require('../../structures/Invite');
const { Events } = require('../../util/Constants');
class InviteCreateAction extends Action {
@@ -12,11 +11,12 @@ class InviteCreateAction extends Action {
if (!channel) return false;
const inviteData = Object.assign(data, { channel, guild });
const invite = new Invite(client, inviteData);
const invite = guild.invites._add(inviteData);
/**
* Emitted when an invite is created.
* <info> This event only triggers if the client has `MANAGE_GUILD` permissions for the guild,
* or `MANAGE_CHANNEL` permissions for the channel.</info>
* or `MANAGE_CHANNELS` permissions for the channel.</info>
* @event Client#inviteCreate
* @param {Invite} invite The invite that was created
*/

View File

@@ -13,11 +13,12 @@ class InviteDeleteAction extends Action {
const inviteData = Object.assign(data, { channel, guild });
const invite = new Invite(client, inviteData);
guild.invites.cache.delete(invite.code);
/**
* Emitted when an invite is deleted.
* <info> This event only triggers if the client has `MANAGE_GUILD` permissions for the guild,
* or `MANAGE_CHANNEL` permissions for the channel.</info>
* or `MANAGE_CHANNELS` permissions for the channel.</info>
* @event Client#inviteDelete
* @param {Invite} invite The invite that was deleted
*/

View File

@@ -3,32 +3,36 @@
const Action = require('./Action');
const { Events } = require('../../util/Constants');
let deprecationEmitted = false;
class MessageCreateAction extends Action {
handle(data) {
const client = this.client;
const channel = client.channels.cache.get(data.channel_id);
const channel = this.getChannel(data);
if (channel) {
const existing = channel.messages.cache.get(data.id);
if (existing) return { message: existing };
const message = channel.messages.add(data);
const user = message.author;
let member = message.member;
channel.lastMessageID = data.id;
if (user) {
user.lastMessageID = data.id;
user.lastMessageChannelID = channel.id;
}
if (member) {
member.lastMessageID = data.id;
member.lastMessageChannelID = channel.id;
}
const message = channel.messages._add(data);
channel.lastMessageId = data.id;
/**
* Emitted whenever a message is created.
* @event Client#messageCreate
* @param {Message} message The created message
*/
client.emit(Events.MESSAGE_CREATE, message);
/**
* Emitted whenever a message is created.
* @event Client#message
* @param {Message} message The created message
* @deprecated Use {@link Client#messageCreate} instead
*/
client.emit(Events.MESSAGE_CREATE, message);
if (client.emit('message', message) && !deprecationEmitted) {
deprecationEmitted = true;
process.emitWarning('The message event is deprecated. Use messageCreate instead', 'DeprecationWarning');
}
return { message };
}

View File

@@ -1,7 +1,7 @@
'use strict';
const { Collection } = require('@discordjs/collection');
const Action = require('./Action');
const Collection = require('../../util/Collection');
const { Events } = require('../../util/Constants');
class MessageDeleteBulkAction extends Action {
@@ -31,7 +31,7 @@ class MessageDeleteBulkAction extends Action {
/**
* Emitted whenever messages are deleted in bulk.
* @event Client#messageDeleteBulk
* @param {Collection<Snowflake, Message>} messages The deleted messages, mapped by their ID
* @param {Collection<Snowflake, Message>} messages The deleted messages, mapped by their id
*/
if (messages.size > 0) client.emit(Events.MESSAGE_BULK_DELETE, messages);
return { messages };

View File

@@ -1,7 +1,7 @@
'use strict';
const Action = require('./Action');
const { Events } = require('../../util/Constants');
const { Events, VoiceBasedChannelTypes } = require('../../util/Constants');
const { PartialTypes } = require('../../util/Constants');
/*
@@ -23,7 +23,7 @@ class MessageReactionAdd extends Action {
// Verify channel
const channel = this.getChannel(data);
if (!channel || channel.type === 'voice') return false;
if (!channel || VoiceBasedChannelTypes.includes(channel.type)) return false;
// Verify message
const message = this.getMessage(data, channel);
@@ -31,9 +31,9 @@ class MessageReactionAdd extends Action {
// Verify reaction
if (message.partial && !this.client.options.partials.includes(PartialTypes.REACTION)) return false;
const existing = message.reactions.cache.get(data.emoji.id || data.emoji.name);
if (existing && existing.users.cache.has(user.id)) return { message, reaction: existing, user };
const reaction = message.reactions.add({
const existing = message.reactions.cache.get(data.emoji.id ?? data.emoji.name);
if (existing?.users.cache.has(user.id)) return { message, reaction: existing, user };
const reaction = message.reactions._add({
emoji: data.emoji,
count: message.partial ? null : 0,
me: user.id === this.client.user.id,

View File

@@ -1,7 +1,7 @@
'use strict';
const Action = require('./Action');
const { Events } = require('../../util/Constants');
const { Events, VoiceBasedChannelTypes } = require('../../util/Constants');
/*
{ user_id: 'id',
@@ -20,7 +20,7 @@ class MessageReactionRemove extends Action {
// Verify channel
const channel = this.getChannel(data);
if (!channel || channel.type === 'voice') return false;
if (!channel || VoiceBasedChannelTypes.includes(channel.type)) return false;
// Verify message
const message = this.getMessage(data, channel);

View File

@@ -1,20 +1,23 @@
'use strict';
const Action = require('./Action');
const { Events } = require('../../util/Constants');
const { Events, VoiceBasedChannelTypes } = require('../../util/Constants');
class MessageReactionRemoveAll extends Action {
handle(data) {
// Verify channel
const channel = this.getChannel(data);
if (!channel || channel.type === 'voice') return false;
if (!channel || VoiceBasedChannelTypes.includes(channel.type)) return false;
// Verify message
const message = this.getMessage(data, channel);
if (!message) return false;
// Copy removed reactions to emit for the event.
const removed = message.reactions.cache.clone();
message.reactions.cache.clear();
this.client.emit(Events.MESSAGE_REACTION_REMOVE_ALL, message);
this.client.emit(Events.MESSAGE_REACTION_REMOVE_ALL, message, removed);
return { message };
}
@@ -24,6 +27,7 @@ class MessageReactionRemoveAll extends Action {
* Emitted whenever all reactions are removed from a cached message.
* @event Client#messageReactionRemoveAll
* @param {Message} message The message the reactions were removed from
* @param {Collection<string|Snowflake, MessageReaction>} reactions The cached message reactions that were removed.
*/
module.exports = MessageReactionRemoveAll;

View File

@@ -1,19 +1,19 @@
'use strict';
const Action = require('./Action');
const { Events } = require('../../util/Constants');
const { Events, VoiceBasedChannelTypes } = require('../../util/Constants');
class MessageReactionRemoveEmoji extends Action {
handle(data) {
const channel = this.getChannel(data);
if (!channel || channel.type === 'voice') return false;
if (!channel || VoiceBasedChannelTypes.includes(channel.type)) return false;
const message = this.getMessage(data, channel);
if (!message) return false;
const reaction = this.getReaction(data, message);
if (!reaction) return false;
if (!message.partial) message.reactions.cache.delete(reaction.emoji.id || reaction.emoji.name);
if (!message.partial) message.reactions.cache.delete(reaction.emoji.id ?? reaction.emoji.name);
/**
* Emitted when a bot removes an emoji reaction from a cached message.

View File

@@ -9,7 +9,7 @@ class MessageUpdateAction extends Action {
const { id, channel_id, guild_id, author, timestamp, type } = data;
const message = this.getMessage({ id, channel_id, guild_id, author, timestamp, type }, channel);
if (message) {
const old = message.patch(data);
const old = message._update(data);
return {
old,
updated: message,

View File

@@ -6,37 +6,35 @@ const { Events } = require('../../util/Constants');
class PresenceUpdateAction extends Action {
handle(data) {
let user = this.client.users.cache.get(data.user.id);
if (!user && data.user.username) user = this.client.users.add(data.user);
if (!user && data.user?.username) user = this.client.users._add(data.user);
if (!user) return;
if (data.user && data.user.username) {
if (!user.equals(data.user)) this.client.actions.UserUpdate.handle(data.user);
if (data.user?.username) {
if (!user._equals(data.user)) this.client.actions.UserUpdate.handle(data.user);
}
const guild = this.client.guilds.cache.get(data.guild_id);
if (!guild) return;
let oldPresence = guild.presences.cache.get(user.id);
if (oldPresence) oldPresence = oldPresence._clone();
const oldPresence = guild.presences.cache.get(user.id)?._clone() ?? null;
let member = guild.members.cache.get(user.id);
if (!member && data.status !== 'offline') {
member = guild.members.add({
member = guild.members._add({
user,
roles: data.roles,
deaf: false,
mute: false,
});
this.client.emit(Events.GUILD_MEMBER_AVAILABLE, member);
}
guild.presences.add(Object.assign(data, { guild }));
if (member && this.client.listenerCount(Events.PRESENCE_UPDATE)) {
const newPresence = guild.presences._add(Object.assign(data, { guild }));
if (this.client.listenerCount(Events.PRESENCE_UPDATE) && !newPresence.equals(oldPresence)) {
/**
* Emitted whenever a guild member's presence (e.g. status, activity) is changed.
* @event Client#presenceUpdate
* @param {?Presence} oldPresence The presence before the update, if one at all
* @param {Presence} newPresence The presence after the update
*/
this.client.emit(Events.PRESENCE_UPDATE, oldPresence, member.presence);
this.client.emit(Events.PRESENCE_UPDATE, oldPresence, newPresence);
}
}
}

View File

@@ -0,0 +1,28 @@
'use strict';
const Action = require('./Action');
const { Events } = require('../../util/Constants');
class StageInstanceCreateAction extends Action {
handle(data) {
const client = this.client;
const channel = this.getChannel(data);
if (channel) {
const stageInstance = channel.guild.stageInstances._add(data);
/**
* Emitted whenever a stage instance is created.
* @event Client#stageInstanceCreate
* @param {StageInstance} stageInstance The created stage instance
*/
client.emit(Events.STAGE_INSTANCE_CREATE, stageInstance);
return { stageInstance };
}
return {};
}
}
module.exports = StageInstanceCreateAction;

View File

@@ -0,0 +1,32 @@
'use strict';
const Action = require('./Action');
const { Events } = require('../../util/Constants');
class StageInstanceDeleteAction extends Action {
handle(data) {
const client = this.client;
const channel = this.getChannel(data);
if (channel) {
const stageInstance = channel.guild.stageInstances._add(data);
if (stageInstance) {
channel.guild.stageInstances.cache.delete(stageInstance.id);
stageInstance.deleted = true;
/**
* Emitted whenever a stage instance is deleted.
* @event Client#stageInstanceDelete
* @param {StageInstance} stageInstance The deleted stage instance
*/
client.emit(Events.STAGE_INSTANCE_DELETE, stageInstance);
return { stageInstance };
}
}
return {};
}
}
module.exports = StageInstanceDeleteAction;

View File

@@ -0,0 +1,30 @@
'use strict';
const Action = require('./Action');
const { Events } = require('../../util/Constants');
class StageInstanceUpdateAction extends Action {
handle(data) {
const client = this.client;
const channel = this.getChannel(data);
if (channel) {
const oldStageInstance = channel.guild.stageInstances.cache.get(data.id)?._clone() ?? null;
const newStageInstance = channel.guild.stageInstances._add(data);
/**
* Emitted whenever a stage instance gets updated - e.g. change in topic or privacy level
* @event Client#stageInstanceUpdate
* @param {?StageInstance} oldStageInstance The stage instance before the update
* @param {StageInstance} newStageInstance The stage instance after the update
*/
client.emit(Events.STAGE_INSTANCE_UPDATE, oldStageInstance, newStageInstance);
return { oldStageInstance, newStageInstance };
}
return {};
}
}
module.exports = StageInstanceUpdateAction;

View File

@@ -0,0 +1,23 @@
'use strict';
const Action = require('./Action');
const { Events } = require('../../util/Constants');
class ThreadCreateAction extends Action {
handle(data) {
const client = this.client;
const existing = client.channels.cache.has(data.id);
const thread = client.channels._add(data);
if (!existing && thread) {
/**
* Emitted whenever a thread is created or when the client user is added to a thread.
* @event Client#threadCreate
* @param {ThreadChannel} thread The thread that was created
*/
client.emit(Events.THREAD_CREATE, thread);
}
return { thread };
}
}
module.exports = ThreadCreateAction;

View File

@@ -0,0 +1,30 @@
'use strict';
const Action = require('./Action');
const { Events } = require('../../util/Constants');
class ThreadDeleteAction extends Action {
handle(data) {
const client = this.client;
const thread = client.channels.cache.get(data.id);
if (thread) {
client.channels._remove(thread.id);
thread.deleted = true;
for (const message of thread.messages.cache.values()) {
message.deleted = true;
}
/**
* Emitted whenever a thread is deleted.
* @event Client#threadDelete
* @param {ThreadChannel} thread The thread that was deleted
*/
client.emit(Events.THREAD_DELETE, thread);
}
return { thread };
}
}
module.exports = ThreadDeleteAction;

View File

@@ -0,0 +1,59 @@
'use strict';
const { Collection } = require('@discordjs/collection');
const Action = require('./Action');
const { Events } = require('../../util/Constants');
class ThreadListSyncAction extends Action {
handle(data) {
const client = this.client;
const guild = client.guilds.cache.get(data.guild_id);
if (!guild) return {};
if (data.channel_ids) {
for (const id of data.channel_ids) {
const channel = client.channels.resolve(id);
if (channel) this.removeStale(channel);
}
} else {
for (const channel of guild.channels.cache.values()) {
this.removeStale(channel);
}
}
const syncedThreads = data.threads.reduce((coll, rawThread) => {
const thread = client.channels._add(rawThread);
return coll.set(thread.id, thread);
}, new Collection());
for (const rawMember of Object.values(data.members)) {
// Discord sends the thread id as id in this object
const thread = client.channels.cache.get(rawMember.id);
if (thread) {
thread.members._add(rawMember);
}
}
/**
* Emitted whenever the client user gains access to a text or news channel that contains threads
* @event Client#threadListSync
* @param {Collection<Snowflake, ThreadChannel>} threads The threads that were synced
*/
client.emit(Events.THREAD_LIST_SYNC, syncedThreads);
return {
syncedThreads,
};
}
removeStale(channel) {
channel.threads?.cache.forEach(thread => {
if (!thread.archived) {
this.client.channels._remove(thread.id);
}
});
}
}
module.exports = ThreadListSyncAction;

View File

@@ -0,0 +1,30 @@
'use strict';
const Action = require('./Action');
const { Events } = require('../../util/Constants');
class ThreadMemberUpdateAction extends Action {
handle(data) {
const client = this.client;
// Discord sends the thread id as id in this object
const thread = client.channels.cache.get(data.id);
if (thread) {
const member = thread.members.cache.get(data.user_id);
if (!member) {
const newMember = thread.members._add(data);
return { newMember };
}
const old = member._update(data);
/**
* Emitted whenever the client user's thread member is updated.
* @event Client#threadMemberUpdate
* @param {ThreadMember} oldMember The member before the update
* @param {ThreadMember} newMember The member after the update
*/
client.emit(Events.THREAD_MEMBER_UPDATE, old, member);
}
return {};
}
}
module.exports = ThreadMemberUpdateAction;

View File

@@ -0,0 +1,34 @@
'use strict';
const Action = require('./Action');
const { Events } = require('../../util/Constants');
class ThreadMembersUpdateAction extends Action {
handle(data) {
const client = this.client;
const thread = client.channels.cache.get(data.id);
if (thread) {
const old = thread.members.cache.clone();
thread.memberCount = data.member_count;
data.added_members?.forEach(rawMember => {
thread.members._add(rawMember);
});
data.removed_member_ids?.forEach(memberId => {
thread.members.cache.delete(memberId);
});
/**
* Emitted whenever members are added or removed from a thread. Requires `GUILD_MEMBERS` privileged intent
* @event Client#threadMembersUpdate
* @param {Collection<Snowflake, ThreadMember>} oldMembers The members before the update
* @param {Collection<Snowflake, ThreadMember>} newMembers The members after the update
*/
client.emit(Events.THREAD_MEMBERS_UPDATE, old, thread.members.cache);
}
return {};
}
}
module.exports = ThreadMembersUpdateAction;

View File

@@ -1,8 +1,8 @@
'use strict';
const Action = require('./Action');
const { Events } = require('../../util/Constants');
const textBasedChannelTypes = ['dm', 'text', 'news'];
const Typing = require('../../structures/Typing');
const { Events, TextBasedChannelTypes } = require('../../util/Constants');
class TypingStart extends Action {
handle(data) {
@@ -10,49 +10,21 @@ class TypingStart extends Action {
if (!channel) {
return;
}
if (!textBasedChannelTypes.includes(channel.type)) {
if (!TextBasedChannelTypes.includes(channel.type)) {
this.client.emit(Events.WARN, `Discord sent a typing packet to a ${channel.type} channel ${channel.id}`);
return;
}
const user = this.getUserFromMember(data);
const timestamp = new Date(data.timestamp * 1000);
if (channel && user) {
if (channel._typing.has(user.id)) {
const typing = channel._typing.get(user.id);
typing.lastTimestamp = timestamp;
typing.elapsedTime = Date.now() - typing.since;
this.client.clearTimeout(typing.timeout);
typing.timeout = this.tooLate(channel, user);
} else {
const since = new Date();
const lastTimestamp = new Date();
channel._typing.set(user.id, {
user,
since,
lastTimestamp,
elapsedTime: Date.now() - since,
timeout: this.tooLate(channel, user),
});
/**
* Emitted whenever a user starts typing in a channel.
* @event Client#typingStart
* @param {Channel} channel The channel the user started typing in
* @param {User} user The user that started typing
*/
this.client.emit(Events.TYPING_START, channel, user);
}
/**
* Emitted whenever a user starts typing in a channel.
* @event Client#typingStart
* @param {Typing} typing The typing state
*/
this.client.emit(Events.TYPING_START, new Typing(channel, user, data));
}
}
tooLate(channel, user) {
return channel.client.setTimeout(() => {
channel._typing.delete(user.id);
}, 10000);
}
}
module.exports = TypingStart;

View File

@@ -7,7 +7,7 @@ class UserUpdateAction extends Action {
handle(data) {
const client = this.client;
const newUser = client.users.cache.get(data.id);
const newUser = data.id === client.user.id ? client.user : client.users.cache.get(data.id);
const oldUser = newUser._update(data);
if (!oldUser.equals(newUser)) {

View File

@@ -1,32 +1,30 @@
'use strict';
const Action = require('./Action');
const VoiceState = require('../../structures/VoiceState');
const { Events } = require('../../util/Constants');
const Structures = require('../../util/Structures');
class VoiceStateUpdate extends Action {
handle(data) {
const client = this.client;
const guild = client.guilds.cache.get(data.guild_id);
if (guild) {
const VoiceState = Structures.get('VoiceState');
// Update the state
const oldState = guild.voiceStates.cache.has(data.user_id)
? guild.voiceStates.cache.get(data.user_id)._clone()
: new VoiceState(guild, { user_id: data.user_id });
const oldState =
guild.voiceStates.cache.get(data.user_id)?._clone() ?? new VoiceState(guild, { user_id: data.user_id });
const newState = guild.voiceStates.add(data);
const newState = guild.voiceStates._add(data);
// Get the member
let member = guild.members.cache.get(data.user_id);
if (member && data.member) {
member._patch(data.member);
} else if (data.member && data.member.user && data.member.joined_at) {
member = guild.members.add(data.member);
} else if (data.member?.user && data.member.joined_at) {
member = guild.members._add(data.member);
}
// Emit event
if (member && member.user.id === client.user.id) {
if (member?.user.id === client.user.id) {
client.emit('debug', `[VOICE] received voice state update: ${JSON.stringify(data)}`);
client.voice.onVoiceStateUpdate(data);
}

View File

@@ -8,9 +8,9 @@ class WebhooksUpdate extends Action {
const client = this.client;
const channel = client.channels.cache.get(data.channel_id);
/**
* Emitted whenever a guild text channel has its webhooks changed.
* Emitted whenever a channel has its webhooks changed.
* @event Client#webhookUpdate
* @param {TextChannel} channel The channel that had a webhook update
* @param {TextChannel|NewsChannel} channel The channel that had a webhook update
*/
if (channel) client.emit(Events.WEBHOOKS_UPDATE, channel);
}

View File

@@ -1,9 +1,6 @@
'use strict';
const VoiceBroadcast = require('./VoiceBroadcast');
const VoiceConnection = require('./VoiceConnection');
const { Error } = require('../../errors');
const Collection = require('../../util/Collection');
const { Events } = require('../../util/Constants');
/**
* Manages voice connections for the client
@@ -19,98 +16,29 @@ class ClientVoiceManager {
Object.defineProperty(this, 'client', { value: client });
/**
* A collection mapping connection IDs to the Connection objects
* @type {Collection<Snowflake, VoiceConnection>}
* Maps guild ids to voice adapters created for use with @discordjs/voice.
* @type {Map<Snowflake, Object>}
*/
this.connections = new Collection();
this.adapters = new Map();
/**
* Active voice broadcasts that have been created
* @type {VoiceBroadcast[]}
*/
this.broadcasts = [];
}
/**
* Creates a voice broadcast.
* @returns {VoiceBroadcast}
*/
createBroadcast() {
const broadcast = new VoiceBroadcast(this.client);
this.broadcasts.push(broadcast);
return broadcast;
}
onVoiceServer({ guild_id, token, endpoint }) {
this.client.emit('debug', `[VOICE] voiceServer guild: ${guild_id} token: ${token} endpoint: ${endpoint}`);
const connection = this.connections.get(guild_id);
if (connection) connection.setTokenAndEndpoint(token, endpoint);
}
onVoiceStateUpdate({ guild_id, session_id, channel_id }) {
const connection = this.connections.get(guild_id);
this.client.emit('debug', `[VOICE] connection? ${!!connection}, ${guild_id} ${session_id} ${channel_id}`);
if (!connection) return;
if (!channel_id) {
connection._disconnect();
this.connections.delete(guild_id);
return;
}
const channel = this.client.channels.cache.get(channel_id);
if (channel) {
connection.channel = channel;
connection.setSessionID(session_id);
} else {
this.client.emit('debug', `[VOICE] disconnecting from guild ${guild_id} as channel ${channel_id} is uncached`);
connection.disconnect();
}
}
/**
* Sets up a request to join a voice channel.
* @param {VoiceChannel} channel The voice channel to join
* @returns {Promise<VoiceConnection>}
* @private
*/
joinChannel(channel) {
return new Promise((resolve, reject) => {
if (!channel.joinable) {
throw new Error('VOICE_JOIN_CHANNEL', channel.full);
}
let connection = this.connections.get(channel.guild.id);
if (connection) {
if (connection.channel.id !== channel.id) {
this.connections.get(channel.guild.id).updateChannel(channel);
client.on(Events.SHARD_DISCONNECT, (_, shardId) => {
for (const [guildId, adapter] of this.adapters.entries()) {
if (client.guilds.cache.get(guildId)?.shardId === shardId) {
adapter.destroy();
}
resolve(connection);
return;
} else {
connection = new VoiceConnection(this, channel);
connection.on('debug', msg =>
this.client.emit('debug', `[VOICE (${channel.guild.id}:${connection.status})]: ${msg}`),
);
connection.authenticate();
this.connections.set(channel.guild.id, connection);
}
connection.once('failed', reason => {
this.connections.delete(channel.guild.id);
reject(reason);
});
connection.on('error', reject);
connection.once('authenticated', () => {
connection.once('ready', () => {
resolve(connection);
connection.removeListener('error', reject);
});
connection.once('disconnect', () => this.connections.delete(channel.guild.id));
});
});
}
onVoiceServer(payload) {
this.adapters.get(payload.guild_id)?.onVoiceServerUpdate(payload);
}
onVoiceStateUpdate(payload) {
if (payload.guild_id && payload.session_id && payload.user_id === this.client.user?.id) {
this.adapters.get(payload.guild_id)?.onVoiceStateUpdate(payload);
}
}
}
module.exports = ClientVoiceManager;

View File

@@ -1,111 +0,0 @@
'use strict';
const EventEmitter = require('events');
const BroadcastAudioPlayer = require('./player/BroadcastAudioPlayer');
const PlayInterface = require('./util/PlayInterface');
const { Events } = require('../../util/Constants');
/**
* A voice broadcast can be played across multiple voice connections for improved shared-stream efficiency.
*
* Example usage:
* ```js
* const broadcast = client.voice.createBroadcast();
* broadcast.play('./music.mp3');
* // Play "music.mp3" in all voice connections that the client is in
* for (const connection of client.voice.connections.values()) {
* connection.play(broadcast);
* }
* ```
* @implements {PlayInterface}
* @extends {EventEmitter}
*/
class VoiceBroadcast extends EventEmitter {
constructor(client) {
super();
/**
* The client that created the broadcast
* @type {Client}
*/
this.client = client;
/**
* The subscribed StreamDispatchers of this broadcast
* @type {StreamDispatcher[]}
*/
this.subscribers = [];
this.player = new BroadcastAudioPlayer(this);
}
/**
* The current master dispatcher, if any. This dispatcher controls all that is played by subscribed dispatchers.
* @type {?BroadcastDispatcher}
* @readonly
*/
get dispatcher() {
return this.player.dispatcher;
}
/**
* Play an audio resource.
* @param {ReadableStream|string} resource The resource to play.
* @param {StreamOptions} [options] The options to play.
* @example
* // Play a local audio file
* broadcast.play('/home/hydrabolt/audio.mp3', { volume: 0.5 });
* @example
* // Play a ReadableStream
* broadcast.play(ytdl('https://www.youtube.com/watch?v=ZlAU_w7-Xp8', { filter: 'audioonly' }));
* @example
* // Using different protocols: https://ffmpeg.org/ffmpeg-protocols.html
* broadcast.play('http://www.sample-videos.com/audio/mp3/wave.mp3');
* @returns {BroadcastDispatcher}
*/
play() {
return null;
}
/**
* Ends the broadcast, unsubscribing all subscribed channels and deleting the broadcast
*/
end() {
for (const dispatcher of this.subscribers) this.delete(dispatcher);
const index = this.client.voice.broadcasts.indexOf(this);
if (index !== -1) this.client.voice.broadcasts.splice(index, 1);
}
add(dispatcher) {
const index = this.subscribers.indexOf(dispatcher);
if (index === -1) {
this.subscribers.push(dispatcher);
/**
* Emitted whenever a stream dispatcher subscribes to the broadcast.
* @event VoiceBroadcast#subscribe
* @param {StreamDispatcher} subscriber The subscribed dispatcher
*/
this.emit(Events.VOICE_BROADCAST_SUBSCRIBE, dispatcher);
return true;
} else {
return false;
}
}
delete(dispatcher) {
const index = this.subscribers.indexOf(dispatcher);
if (index !== -1) {
this.subscribers.splice(index, 1);
dispatcher.destroy();
/**
* Emitted whenever a stream dispatcher unsubscribes to the broadcast.
* @event VoiceBroadcast#unsubscribe
* @param {StreamDispatcher} dispatcher The unsubscribed dispatcher
*/
this.emit(Events.VOICE_BROADCAST_UNSUBSCRIBE, dispatcher);
return true;
}
return false;
}
}
PlayInterface.applyToClass(VoiceBroadcast);
module.exports = VoiceBroadcast;

View File

@@ -1,526 +0,0 @@
'use strict';
const EventEmitter = require('events');
const VoiceUDP = require('./networking/VoiceUDPClient');
const VoiceWebSocket = require('./networking/VoiceWebSocket');
const AudioPlayer = require('./player/AudioPlayer');
const VoiceReceiver = require('./receiver/Receiver');
const PlayInterface = require('./util/PlayInterface');
const Silence = require('./util/Silence');
const { Error } = require('../../errors');
const { OPCodes, VoiceOPCodes, VoiceStatus, Events } = require('../../util/Constants');
const Speaking = require('../../util/Speaking');
const Util = require('../../util/Util');
// Workaround for Discord now requiring silence to be sent before being able to receive audio
class SingleSilence extends Silence {
_read() {
super._read();
this.push(null);
}
}
const SUPPORTED_MODES = ['xsalsa20_poly1305_lite', 'xsalsa20_poly1305_suffix', 'xsalsa20_poly1305'];
/**
* Represents a connection to a guild's voice server.
* ```js
* // Obtained using:
* voiceChannel.join()
* .then(connection => {
*
* });
* ```
* @extends {EventEmitter}
* @implements {PlayInterface}
*/
class VoiceConnection extends EventEmitter {
constructor(voiceManager, channel) {
super();
/**
* The voice manager that instantiated this connection
* @type {ClientVoiceManager}
*/
this.voiceManager = voiceManager;
/**
* The voice channel this connection is currently serving
* @type {VoiceChannel}
*/
this.channel = channel;
/**
* The current status of the voice connection
* @type {VoiceStatus}
*/
this.status = VoiceStatus.AUTHENTICATING;
/**
* Our current speaking state
* @type {Readonly<Speaking>}
*/
this.speaking = new Speaking().freeze();
/**
* The authentication data needed to connect to the voice server
* @type {Object}
* @private
*/
this.authentication = {};
/**
* The audio player for this voice connection
* @type {AudioPlayer}
*/
this.player = new AudioPlayer(this);
this.player.on('debug', m => {
/**
* Debug info from the connection.
* @event VoiceConnection#debug
* @param {string} message The debug message
*/
this.emit('debug', `audio player - ${m}`);
});
this.player.on('error', e => {
/**
* Warning info from the connection.
* @event VoiceConnection#warn
* @param {string|Error} warning The warning
*/
this.emit('warn', e);
});
this.once('closing', () => this.player.destroy());
/**
* Map SSRC values to user IDs
* @type {Map<number, Snowflake>}
* @private
*/
this.ssrcMap = new Map();
/**
* Tracks which users are talking
* @type {Map<Snowflake, Readonly<Speaking>>}
* @private
*/
this._speaking = new Map();
/**
* Object that wraps contains the `ws` and `udp` sockets of this voice connection
* @type {Object}
* @private
*/
this.sockets = {};
/**
* The voice receiver of this connection
* @type {VoiceReceiver}
*/
this.receiver = new VoiceReceiver(this);
}
/**
* The client that instantiated this connection
* @type {Client}
* @readonly
*/
get client() {
return this.voiceManager.client;
}
/**
* The current stream dispatcher (if any)
* @type {?StreamDispatcher}
* @readonly
*/
get dispatcher() {
return this.player.dispatcher;
}
/**
* Sets whether the voice connection should display as "speaking", "soundshare" or "none".
* @param {BitFieldResolvable} value The new speaking state
*/
setSpeaking(value) {
if (this.speaking.equals(value)) return;
if (this.status !== VoiceStatus.CONNECTED) return;
this.speaking = new Speaking(value).freeze();
this.sockets.ws
.sendPacket({
op: VoiceOPCodes.SPEAKING,
d: {
speaking: this.speaking.bitfield,
delay: 0,
ssrc: this.authentication.ssrc,
},
})
.catch(e => {
this.emit('debug', e);
});
}
/**
* The voice state of this connection
* @type {?VoiceState}
*/
get voice() {
return this.channel.guild.voice;
}
/**
* Sends a request to the main gateway to join a voice channel.
* @param {Object} [options] The options to provide
* @returns {Promise<Shard>}
* @private
*/
sendVoiceStateUpdate(options = {}) {
options = Util.mergeDefault(
{
guild_id: this.channel.guild.id,
channel_id: this.channel.id,
self_mute: this.voice ? this.voice.selfMute : false,
self_deaf: this.voice ? this.voice.selfDeaf : false,
},
options,
);
this.emit('debug', `Sending voice state update: ${JSON.stringify(options)}`);
return this.channel.guild.shard.send(
{
op: OPCodes.VOICE_STATE_UPDATE,
d: options,
},
true,
);
}
/**
* Set the token and endpoint required to connect to the voice servers.
* @param {string} token The voice token
* @param {string} endpoint The voice endpoint
* @returns {void}
* @private
*/
setTokenAndEndpoint(token, endpoint) {
this.emit('debug', `Token "${token}" and endpoint "${endpoint}"`);
if (!endpoint) {
// Signifies awaiting endpoint stage
return;
}
if (!token) {
this.authenticateFailed('VOICE_TOKEN_ABSENT');
return;
}
endpoint = endpoint.match(/([^:]*)/)[0];
this.emit('debug', `Endpoint resolved as ${endpoint}`);
if (!endpoint) {
this.authenticateFailed('VOICE_INVALID_ENDPOINT');
return;
}
if (this.status === VoiceStatus.AUTHENTICATING) {
this.authentication.token = token;
this.authentication.endpoint = endpoint;
this.checkAuthenticated();
} else if (token !== this.authentication.token || endpoint !== this.authentication.endpoint) {
this.reconnect(token, endpoint);
}
}
/**
* Sets the Session ID for the connection.
* @param {string} sessionID The voice session ID
* @private
*/
setSessionID(sessionID) {
this.emit('debug', `Setting sessionID ${sessionID} (stored as "${this.authentication.sessionID}")`);
if (!sessionID) {
this.authenticateFailed('VOICE_SESSION_ABSENT');
return;
}
if (this.status === VoiceStatus.AUTHENTICATING) {
this.authentication.sessionID = sessionID;
this.checkAuthenticated();
} else if (sessionID !== this.authentication.sessionID) {
this.authentication.sessionID = sessionID;
/**
* Emitted when a new session ID is received.
* @event VoiceConnection#newSession
* @private
*/
this.emit('newSession', sessionID);
}
}
/**
* Checks whether the voice connection is authenticated.
* @private
*/
checkAuthenticated() {
const { token, endpoint, sessionID } = this.authentication;
this.emit('debug', `Authenticated with sessionID ${sessionID}`);
if (token && endpoint && sessionID) {
this.status = VoiceStatus.CONNECTING;
/**
* Emitted when we successfully initiate a voice connection.
* @event VoiceConnection#authenticated
*/
this.emit('authenticated');
this.connect();
}
}
/**
* Invoked when we fail to initiate a voice connection.
* @param {string} reason The reason for failure
* @private
*/
authenticateFailed(reason) {
this.client.clearTimeout(this.connectTimeout);
this.emit('debug', `Authenticate failed - ${reason}`);
if (this.status === VoiceStatus.AUTHENTICATING) {
/**
* Emitted when we fail to initiate a voice connection.
* @event VoiceConnection#failed
* @param {Error} error The encountered error
*/
this.emit('failed', new Error(reason));
} else {
/**
* Emitted whenever the connection encounters an error.
* @event VoiceConnection#error
* @param {Error} error The encountered error
*/
this.emit('error', new Error(reason));
}
this.status = VoiceStatus.DISCONNECTED;
}
/**
* Move to a different voice channel in the same guild.
* @param {VoiceChannel} channel The channel to move to
* @private
*/
updateChannel(channel) {
this.channel = channel;
this.sendVoiceStateUpdate();
}
/**
* Attempts to authenticate to the voice server.
* @private
*/
authenticate() {
this.sendVoiceStateUpdate();
this.connectTimeout = this.client.setTimeout(() => this.authenticateFailed('VOICE_CONNECTION_TIMEOUT'), 15000);
}
/**
* Attempts to reconnect to the voice server (typically after a region change).
* @param {string} token The voice token
* @param {string} endpoint The voice endpoint
* @private
*/
reconnect(token, endpoint) {
this.authentication.token = token;
this.authentication.endpoint = endpoint;
this.speaking = new Speaking().freeze();
this.status = VoiceStatus.RECONNECTING;
this.emit('debug', `Reconnecting to ${endpoint}`);
/**
* Emitted when the voice connection is reconnecting (typically after a region change).
* @event VoiceConnection#reconnecting
*/
this.emit('reconnecting');
this.connect();
}
/**
* Disconnects the voice connection, causing a disconnect and closing event to be emitted.
*/
disconnect() {
this.emit('closing');
this.emit('debug', 'disconnect() triggered');
this.client.clearTimeout(this.connectTimeout);
const conn = this.voiceManager.connections.get(this.channel.guild.id);
if (conn === this) this.voiceManager.connections.delete(this.channel.guild.id);
this.sendVoiceStateUpdate({
channel_id: null,
});
this._disconnect();
}
/**
* Internally disconnects (doesn't send disconnect packet).
* @private
*/
_disconnect() {
this.cleanup();
this.status = VoiceStatus.DISCONNECTED;
/**
* Emitted when the voice connection disconnects.
* @event VoiceConnection#disconnect
*/
this.emit('disconnect');
}
/**
* Cleans up after disconnect.
* @private
*/
cleanup() {
this.player.destroy();
this.speaking = new Speaking().freeze();
const { ws, udp } = this.sockets;
this.emit('debug', 'Connection clean up');
if (ws) {
ws.removeAllListeners('error');
ws.removeAllListeners('ready');
ws.removeAllListeners('sessionDescription');
ws.removeAllListeners('speaking');
ws.shutdown();
}
if (udp) udp.removeAllListeners('error');
this.sockets.ws = null;
this.sockets.udp = null;
}
/**
* Connect the voice connection.
* @private
*/
connect() {
this.emit('debug', `Connect triggered`);
if (this.status !== VoiceStatus.RECONNECTING) {
if (this.sockets.ws) throw new Error('WS_CONNECTION_EXISTS');
if (this.sockets.udp) throw new Error('UDP_CONNECTION_EXISTS');
}
if (this.sockets.ws) this.sockets.ws.shutdown();
if (this.sockets.udp) this.sockets.udp.shutdown();
this.sockets.ws = new VoiceWebSocket(this);
this.sockets.udp = new VoiceUDP(this);
const { ws, udp } = this.sockets;
ws.on('debug', msg => this.emit('debug', msg));
udp.on('debug', msg => this.emit('debug', msg));
ws.on('error', err => this.emit('error', err));
udp.on('error', err => this.emit('error', err));
ws.on('ready', this.onReady.bind(this));
ws.on('sessionDescription', this.onSessionDescription.bind(this));
ws.on('startSpeaking', this.onStartSpeaking.bind(this));
this.sockets.ws.connect();
}
/**
* Invoked when the voice websocket is ready.
* @param {Object} data The received data
* @private
*/
onReady(data) {
Object.assign(this.authentication, data);
for (let mode of data.modes) {
if (SUPPORTED_MODES.includes(mode)) {
this.authentication.mode = mode;
this.emit('debug', `Selecting the ${mode} mode`);
break;
}
}
this.sockets.udp.createUDPSocket(data.ip);
}
/**
* Invoked when a session description is received.
* @param {Object} data The received data
* @private
*/
onSessionDescription(data) {
Object.assign(this.authentication, data);
this.status = VoiceStatus.CONNECTED;
const ready = () => {
this.client.clearTimeout(this.connectTimeout);
this.emit('debug', `Ready with authentication details: ${JSON.stringify(this.authentication)}`);
/**
* Emitted once the connection is ready, when a promise to join a voice channel resolves,
* the connection will already be ready.
* @event VoiceConnection#ready
*/
this.emit('ready');
};
if (this.dispatcher) {
ready();
} else {
// This serves to provide support for voice receive, sending audio is required to receive it.
const dispatcher = this.play(new SingleSilence(), { type: 'opus', volume: false });
dispatcher.once('finish', ready);
}
}
onStartSpeaking({ user_id, ssrc, speaking }) {
this.ssrcMap.set(+ssrc, {
...(this.ssrcMap.get(+ssrc) || {}),
userID: user_id,
speaking: speaking,
});
}
/**
* Invoked when a speaking event is received.
* @param {Object} data The received data
* @private
*/
onSpeaking({ user_id, speaking }) {
speaking = new Speaking(speaking).freeze();
const guild = this.channel.guild;
const user = this.client.users.cache.get(user_id);
const old = this._speaking.get(user_id);
this._speaking.set(user_id, speaking);
/**
* Emitted whenever a user changes speaking state.
* @event VoiceConnection#speaking
* @param {User} user The user that has changed speaking state
* @param {Readonly<Speaking>} speaking The speaking state of the user
*/
if (this.status === VoiceStatus.CONNECTED) {
this.emit('speaking', user, speaking);
if (!speaking.has(Speaking.FLAGS.SPEAKING)) {
this.receiver.packets._stoppedSpeaking(user_id);
}
}
if (guild && user && !speaking.equals(old)) {
const member = guild.member(user);
if (member) {
/**
* Emitted once a guild member changes speaking state.
* @event Client#guildMemberSpeaking
* @param {GuildMember} member The member that started/stopped speaking
* @param {Readonly<Speaking>} speaking The speaking state of the member
*/
this.client.emit(Events.GUILD_MEMBER_SPEAKING, member, speaking);
}
}
}
play() {} // eslint-disable-line no-empty-function
}
PlayInterface.applyToClass(VoiceConnection);
module.exports = VoiceConnection;

View File

@@ -1,46 +0,0 @@
'use strict';
const StreamDispatcher = require('./StreamDispatcher');
/**
* The class that sends voice packet data to the voice connection.
* @implements {VolumeInterface}
* @extends {StreamDispatcher}
*/
class BroadcastDispatcher extends StreamDispatcher {
constructor(player, options, streams) {
super(player, options, streams);
this.broadcast = player.broadcast;
}
_write(chunk, enc, done) {
if (!this.startTime) this.startTime = Date.now();
for (const dispatcher of this.broadcast.subscribers) {
dispatcher._write(chunk, enc);
}
this._step(done);
}
_destroy(err, cb) {
if (this.player.dispatcher === this) this.player.dispatcher = null;
const { streams } = this;
if (streams.opus) streams.opus.unpipe(this);
if (streams.ffmpeg) streams.ffmpeg.destroy();
super._destroy(err, cb);
}
/**
* Set the bitrate of the current Opus encoder if using a compatible Opus stream.
* @param {number} value New bitrate, in kbps
* If set to 'auto', 48kbps will be used
* @returns {boolean} true if the bitrate has been successfully changed.
*/
setBitrate(value) {
if (!value || !this.streams.opus || !this.streams.opus.setBitrate) return false;
const bitrate = value === 'auto' ? 48 : value;
this.streams.opus.setBitrate(bitrate * 1000);
return true;
}
}
module.exports = BroadcastDispatcher;

View File

@@ -1,354 +0,0 @@
'use strict';
const { Writable } = require('stream');
const secretbox = require('../util/Secretbox');
const Silence = require('../util/Silence');
const VolumeInterface = require('../util/VolumeInterface');
const FRAME_LENGTH = 20;
const CHANNELS = 2;
const TIMESTAMP_INC = (48000 / 100) * CHANNELS;
const MAX_NONCE_SIZE = 2 ** 32 - 1;
const nonce = Buffer.alloc(24);
/**
* @external WritableStream
* @see {@link https://nodejs.org/api/stream.html#stream_class_stream_writable}
*/
/**
* The class that sends voice packet data to the voice connection.
* ```js
* // Obtained using:
* voiceChannel.join().then(connection => {
* // You can play a file or a stream here:
* const dispatcher = connection.play('/home/hydrabolt/audio.mp3');
* });
* ```
* @implements {VolumeInterface}
* @extends {WritableStream}
*/
class StreamDispatcher extends Writable {
constructor(player, { seek = 0, volume = 1, fec, plp, bitrate = 96, highWaterMark = 12 } = {}, streams) {
const streamOptions = { seek, volume, fec, plp, bitrate, highWaterMark };
super(streamOptions);
/**
* The Audio Player that controls this dispatcher
* @type {AudioPlayer}
*/
this.player = player;
this.streamOptions = streamOptions;
this.streams = streams;
this.streams.silence = new Silence();
this._nonce = 0;
this._nonceBuffer = Buffer.alloc(24);
/**
* The time that the stream was paused at (null if not paused)
* @type {?number}
*/
this.pausedSince = null;
this._writeCallback = null;
/**
* The broadcast controlling this dispatcher, if any
* @type {?VoiceBroadcast}
*/
this.broadcast = this.streams.broadcast || null;
this._pausedTime = 0;
this._silentPausedTime = 0;
this.count = 0;
this.on('finish', () => {
this._cleanup();
this._setSpeaking(0);
});
this.setVolume(volume);
this.setBitrate(bitrate);
if (typeof fec !== 'undefined') this.setFEC(fec);
if (typeof plp !== 'undefined') this.setPLP(plp);
const streamError = (type, err) => {
/**
* Emitted when the dispatcher encounters an error.
* @event StreamDispatcher#error
*/
if (type && err) {
err.message = `${type} stream: ${err.message}`;
this.emit(this.player.dispatcher === this ? 'error' : 'debug', err);
}
this.destroy();
};
this.on('error', () => streamError());
if (this.streams.input) this.streams.input.on('error', err => streamError('input', err));
if (this.streams.ffmpeg) this.streams.ffmpeg.on('error', err => streamError('ffmpeg', err));
if (this.streams.opus) this.streams.opus.on('error', err => streamError('opus', err));
if (this.streams.volume) this.streams.volume.on('error', err => streamError('volume', err));
}
get _sdata() {
return this.player.streamingData;
}
_write(chunk, enc, done) {
if (!this.startTime) {
/**
* Emitted once the stream has started to play.
* @event StreamDispatcher#start
*/
this.emit('start');
this.startTime = Date.now();
}
this._playChunk(chunk);
this._step(done);
}
_destroy(err, cb) {
this._cleanup();
super._destroy(err, cb);
}
_cleanup() {
if (this.player.dispatcher === this) this.player.dispatcher = null;
const { streams } = this;
if (streams.broadcast) streams.broadcast.delete(this);
if (streams.opus) streams.opus.destroy();
if (streams.ffmpeg) streams.ffmpeg.destroy();
}
/**
* Pauses playback
* @param {boolean} [silence=false] Whether to play silence while paused to prevent audio glitches
*/
pause(silence = false) {
if (this.paused) return;
if (this.streams.opus) this.streams.opus.unpipe(this);
if (silence) {
this.streams.silence.pipe(this);
this._silence = true;
} else {
this._setSpeaking(0);
}
this.pausedSince = Date.now();
}
/**
* Whether or not playback is paused
* @type {boolean}
* @readonly
*/
get paused() {
return Boolean(this.pausedSince);
}
/**
* Total time that this dispatcher has been paused in milliseconds
* @type {number}
* @readonly
*/
get pausedTime() {
return this._silentPausedTime + this._pausedTime + (this.paused ? Date.now() - this.pausedSince : 0);
}
/**
* Resumes playback
*/
resume() {
if (!this.pausedSince) return;
this.streams.silence.unpipe(this);
if (this.streams.opus) this.streams.opus.pipe(this);
if (this._silence) {
this._silentPausedTime += Date.now() - this.pausedSince;
this._silence = false;
} else {
this._pausedTime += Date.now() - this.pausedSince;
}
this.pausedSince = null;
if (typeof this._writeCallback === 'function') this._writeCallback();
}
/**
* The time (in milliseconds) that the dispatcher has actually been playing audio for
* @type {number}
* @readonly
*/
get streamTime() {
return this.count * FRAME_LENGTH;
}
/**
* The time (in milliseconds) that the dispatcher has been playing audio for, taking into account skips and pauses
* @type {number}
* @readonly
*/
get totalStreamTime() {
return Date.now() - this.startTime;
}
/**
* Set the bitrate of the current Opus encoder if using a compatible Opus stream.
* @param {number} value New bitrate, in kbps
* If set to 'auto', the voice channel's bitrate will be used
* @returns {boolean} true if the bitrate has been successfully changed.
*/
setBitrate(value) {
if (!value || !this.bitrateEditable) return false;
const bitrate = value === 'auto' ? this.player.voiceConnection.channel.bitrate : value;
this.streams.opus.setBitrate(bitrate * 1000);
return true;
}
/**
* Sets the expected packet loss percentage if using a compatible Opus stream.
* @param {number} value between 0 and 1
* @returns {boolean} Returns true if it was successfully set.
*/
setPLP(value) {
if (!this.bitrateEditable) return false;
this.streams.opus.setPLP(value);
return true;
}
/**
* Enables or disables forward error correction if using a compatible Opus stream.
* @param {boolean} enabled true to enable
* @returns {boolean} Returns true if it was successfully set.
*/
setFEC(enabled) {
if (!this.bitrateEditable) return false;
this.streams.opus.setFEC(enabled);
return true;
}
_step(done) {
this._writeCallback = () => {
this._writeCallback = null;
done();
};
if (!this.streams.broadcast) {
const next = FRAME_LENGTH + this.count * FRAME_LENGTH - (Date.now() - this.startTime - this._pausedTime);
setTimeout(() => {
if ((!this.pausedSince || this._silence) && this._writeCallback) this._writeCallback();
}, next);
}
this._sdata.sequence++;
this._sdata.timestamp += TIMESTAMP_INC;
if (this._sdata.sequence >= 2 ** 16) this._sdata.sequence = 0;
if (this._sdata.timestamp >= 2 ** 32) this._sdata.timestamp = 0;
this.count++;
}
_final(callback) {
this._writeCallback = null;
callback();
}
_playChunk(chunk) {
if (this.player.dispatcher !== this || !this.player.voiceConnection.authentication.secret_key) return;
this._sendPacket(this._createPacket(this._sdata.sequence, this._sdata.timestamp, chunk));
}
_encrypt(buffer) {
const { secret_key, mode } = this.player.voiceConnection.authentication;
if (mode === 'xsalsa20_poly1305_lite') {
this._nonce++;
if (this._nonce > MAX_NONCE_SIZE) this._nonce = 0;
this._nonceBuffer.writeUInt32BE(this._nonce, 0);
return [secretbox.methods.close(buffer, this._nonceBuffer, secret_key), this._nonceBuffer.slice(0, 4)];
} else if (mode === 'xsalsa20_poly1305_suffix') {
const random = secretbox.methods.random(24);
return [secretbox.methods.close(buffer, random, secret_key), random];
} else {
return [secretbox.methods.close(buffer, nonce, secret_key)];
}
}
_createPacket(sequence, timestamp, buffer) {
const packetBuffer = Buffer.alloc(12);
packetBuffer[0] = 0x80;
packetBuffer[1] = 0x78;
packetBuffer.writeUIntBE(sequence, 2, 2);
packetBuffer.writeUIntBE(timestamp, 4, 4);
packetBuffer.writeUIntBE(this.player.voiceConnection.authentication.ssrc, 8, 4);
packetBuffer.copy(nonce, 0, 0, 12);
return Buffer.concat([packetBuffer, ...this._encrypt(buffer)]);
}
_sendPacket(packet) {
/**
* Emitted whenever the dispatcher has debug information.
* @event StreamDispatcher#debug
* @param {string} info The debug info
*/
this._setSpeaking(1);
if (!this.player.voiceConnection.sockets.udp) {
this.emit('debug', 'Failed to send a packet - no UDP socket');
return;
}
this.player.voiceConnection.sockets.udp.send(packet).catch(e => {
this._setSpeaking(0);
this.emit('debug', `Failed to send a packet - ${e}`);
});
}
_setSpeaking(value) {
if (typeof this.player.voiceConnection !== 'undefined') {
this.player.voiceConnection.setSpeaking(value);
}
/**
* Emitted when the dispatcher starts/stops speaking.
* @event StreamDispatcher#speaking
* @param {boolean} value Whether or not the dispatcher is speaking
*/
this.emit('speaking', value);
}
get volumeEditable() {
return Boolean(this.streams.volume);
}
/**
* Whether or not the Opus bitrate of this stream is editable
* @type {boolean}
* @readonly
*/
get bitrateEditable() {
return this.streams.opus && this.streams.opus.setBitrate;
}
// Volume
get volume() {
return this.streams.volume ? this.streams.volume.volume : 1;
}
setVolume(value) {
if (!this.streams.volume) return false;
/**
* Emitted when the volume of this dispatcher changes.
* @event StreamDispatcher#volumeChange
* @param {number} oldVolume The old volume of this dispatcher
* @param {number} newVolume The new volume of this dispatcher
*/
this.emit('volumeChange', this.volume, value);
this.streams.volume.setVolume(value);
return true;
}
// Volume stubs for docs
/* eslint-disable no-empty-function*/
get volumeDecibels() {}
get volumeLogarithmic() {}
setVolumeDecibels() {}
setVolumeLogarithmic() {}
}
VolumeInterface.applyToClass(StreamDispatcher);
module.exports = StreamDispatcher;

View File

@@ -1,154 +0,0 @@
'use strict';
const udp = require('dgram');
const EventEmitter = require('events');
const { Error } = require('../../../errors');
const { VoiceOPCodes } = require('../../../util/Constants');
/**
* Represents a UDP client for a Voice Connection.
* @extends {EventEmitter}
* @private
*/
class VoiceConnectionUDPClient extends EventEmitter {
constructor(voiceConnection) {
super();
/**
* The voice connection that this UDP client serves
* @type {VoiceConnection}
*/
this.voiceConnection = voiceConnection;
/**
* The UDP socket
* @type {?Socket}
*/
this.socket = null;
/**
* The address of the Discord voice server
* @type {?string}
*/
this.discordAddress = null;
/**
* The local IP address
* @type {?string}
*/
this.localAddress = null;
/**
* The local port
* @type {?string}
*/
this.localPort = null;
this.voiceConnection.on('closing', this.shutdown.bind(this));
}
shutdown() {
this.emit('debug', `[UDP] shutdown requested`);
if (this.socket) {
this.socket.removeAllListeners('message');
try {
this.socket.close();
} finally {
this.socket = null;
}
}
}
/**
* The port of the Discord voice server
* @type {number}
* @readonly
*/
get discordPort() {
return this.voiceConnection.authentication.port;
}
/**
* Send a packet to the UDP client.
* @param {Object} packet The packet to send
* @returns {Promise<Object>}
*/
send(packet) {
return new Promise((resolve, reject) => {
if (!this.socket) throw new Error('UDP_SEND_FAIL');
if (!this.discordAddress || !this.discordPort) throw new Error('UDP_ADDRESS_MALFORMED');
this.socket.send(packet, 0, packet.length, this.discordPort, this.discordAddress, error => {
if (error) {
this.emit('debug', `[UDP] >> ERROR: ${error}`);
reject(error);
} else {
resolve(packet);
}
});
});
}
async createUDPSocket(address) {
this.discordAddress = address;
const socket = (this.socket = udp.createSocket('udp4'));
socket.on('error', e => {
this.emit('debug', `[UDP] Error: ${e}`);
this.emit('error', e);
});
socket.on('close', () => {
this.emit('debug', '[UDP] socket closed');
});
this.emit('debug', `[UDP] created socket`);
socket.once('message', message => {
this.emit('debug', `[UDP] message: [${[...message]}] (${message})`);
// Stop if the sockets have been deleted because the connection has been closed already
if (!this.voiceConnection.sockets.ws) return;
const packet = parseLocalPacket(message);
if (packet.error) {
this.emit('debug', `[UDP] ERROR: ${packet.error}`);
this.emit('error', packet.error);
return;
}
this.localAddress = packet.address;
this.localPort = packet.port;
this.voiceConnection.sockets.ws.sendPacket({
op: VoiceOPCodes.SELECT_PROTOCOL,
d: {
protocol: 'udp',
data: {
address: packet.address,
port: packet.port,
mode: this.voiceConnection.authentication.mode,
},
},
});
this.emit('debug', `[UDP] << ${JSON.stringify(packet)}`);
socket.on('message', buffer => this.voiceConnection.receiver.packets.push(buffer));
});
const blankMessage = Buffer.alloc(70);
blankMessage.writeUIntBE(this.voiceConnection.authentication.ssrc, 0, 4);
this.emit('debug', `Sending IP discovery packet: [${[...blankMessage]}]`);
await this.send(blankMessage);
this.emit('debug', `Successfully sent IP discovery packet`);
}
}
function parseLocalPacket(message) {
try {
const packet = Buffer.from(message);
let address = '';
for (let i = 4; i < packet.indexOf(0, i); i++) address += String.fromCharCode(packet[i]);
const port = parseInt(packet.readUIntLE(packet.length - 2, 2).toString(10), 10);
return { address, port };
} catch (error) {
return { error };
}
}
module.exports = VoiceConnectionUDPClient;

View File

@@ -1,268 +0,0 @@
'use strict';
const EventEmitter = require('events');
const WebSocket = require('../../../WebSocket');
const { Error } = require('../../../errors');
const { OPCodes, VoiceOPCodes } = require('../../../util/Constants');
/**
* Represents a Voice Connection's WebSocket.
* @extends {EventEmitter}
* @private
*/
class VoiceWebSocket extends EventEmitter {
constructor(connection) {
super();
/**
* The Voice Connection that this WebSocket serves
* @type {VoiceConnection}
*/
this.connection = connection;
/**
* How many connection attempts have been made
* @type {number}
*/
this.attempts = 0;
this.dead = false;
this.connection.on('closing', this.shutdown.bind(this));
}
/**
* The client of this voice WebSocket
* @type {Client}
* @readonly
*/
get client() {
return this.connection.client;
}
shutdown() {
this.emit('debug', `[WS] shutdown requested`);
this.dead = true;
this.reset();
}
/**
* Resets the current WebSocket.
*/
reset() {
this.emit('debug', `[WS] reset requested`);
if (this.ws) {
if (this.ws.readyState !== WebSocket.CLOSED) this.ws.close();
this.ws = null;
}
this.clearHeartbeat();
}
/**
* Starts connecting to the Voice WebSocket Server.
*/
connect() {
this.emit('debug', `[WS] connect requested`);
if (this.dead) return;
if (this.ws) this.reset();
if (this.attempts >= 5) {
this.emit('debug', new Error('VOICE_CONNECTION_ATTEMPTS_EXCEEDED', this.attempts));
return;
}
this.attempts++;
/**
* The actual WebSocket used to connect to the Voice WebSocket Server.
* @type {WebSocket}
*/
this.ws = WebSocket.create(`wss://${this.connection.authentication.endpoint}/`, { v: 4 });
this.emit('debug', `[WS] connecting, ${this.attempts} attempts, ${this.ws.url}`);
this.ws.onopen = this.onOpen.bind(this);
this.ws.onmessage = this.onMessage.bind(this);
this.ws.onclose = this.onClose.bind(this);
this.ws.onerror = this.onError.bind(this);
}
/**
* Sends data to the WebSocket if it is open.
* @param {string} data The data to send to the WebSocket
* @returns {Promise<string>}
*/
send(data) {
this.emit('debug', `[WS] >> ${data}`);
return new Promise((resolve, reject) => {
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) throw new Error('WS_NOT_OPEN', data);
this.ws.send(data, null, error => {
if (error) reject(error);
else resolve(data);
});
});
}
/**
* JSON.stringify's a packet and then sends it to the WebSocket Server.
* @param {Object} packet The packet to send
* @returns {Promise<string>}
*/
sendPacket(packet) {
try {
packet = JSON.stringify(packet);
} catch (error) {
return Promise.reject(error);
}
return this.send(packet);
}
/**
* Called whenever the WebSocket opens.
*/
onOpen() {
this.emit('debug', `[WS] opened at gateway ${this.connection.authentication.endpoint}`);
this.sendPacket({
op: OPCodes.DISPATCH,
d: {
server_id: this.connection.channel.guild.id,
user_id: this.client.user.id,
token: this.connection.authentication.token,
session_id: this.connection.authentication.sessionID,
},
}).catch(() => {
this.emit('error', new Error('VOICE_JOIN_SOCKET_CLOSED'));
});
}
/**
* Called whenever a message is received from the WebSocket.
* @param {MessageEvent} event The message event that was received
* @returns {void}
*/
onMessage(event) {
try {
return this.onPacket(WebSocket.unpack(event.data, 'json'));
} catch (error) {
return this.onError(error);
}
}
/**
* Called whenever the connection to the WebSocket server is lost.
*/
onClose() {
this.emit('debug', `[WS] closed`);
if (!this.dead) this.client.setTimeout(this.connect.bind(this), this.attempts * 1000);
}
/**
* Called whenever an error occurs with the WebSocket.
* @param {Error} error The error that occurred
*/
onError(error) {
this.emit('debug', `[WS] Error: ${error}`);
this.emit('error', error);
}
/**
* Called whenever a valid packet is received from the WebSocket.
* @param {Object} packet The received packet
*/
onPacket(packet) {
this.emit('debug', `[WS] << ${JSON.stringify(packet)}`);
switch (packet.op) {
case VoiceOPCodes.HELLO:
this.setHeartbeat(packet.d.heartbeat_interval);
break;
case VoiceOPCodes.READY:
/**
* Emitted once the voice WebSocket receives the ready packet.
* @param {Object} packet The received packet
* @event VoiceWebSocket#ready
*/
this.emit('ready', packet.d);
break;
/* eslint-disable no-case-declarations */
case VoiceOPCodes.SESSION_DESCRIPTION:
packet.d.secret_key = new Uint8Array(packet.d.secret_key);
/**
* Emitted once the Voice Websocket receives a description of this voice session.
* @param {Object} packet The received packet
* @event VoiceWebSocket#sessionDescription
*/
this.emit('sessionDescription', packet.d);
break;
case VoiceOPCodes.CLIENT_CONNECT:
this.connection.ssrcMap.set(+packet.d.audio_ssrc, {
userID: packet.d.user_id,
speaking: 0,
hasVideo: Boolean(packet.d.video_ssrc),
});
break;
case VoiceOPCodes.CLIENT_DISCONNECT:
const streamInfo = this.connection.receiver && this.connection.receiver.packets.streams.get(packet.d.user_id);
if (streamInfo) {
this.connection.receiver.packets.streams.delete(packet.d.user_id);
streamInfo.stream.push(null);
}
break;
case VoiceOPCodes.SPEAKING:
/**
* Emitted whenever a speaking packet is received.
* @param {Object} data
* @event VoiceWebSocket#startSpeaking
*/
this.emit('startSpeaking', packet.d);
break;
default:
/**
* Emitted when an unhandled packet is received.
* @param {Object} packet
* @event VoiceWebSocket#unknownPacket
*/
this.emit('unknownPacket', packet);
break;
}
}
/**
* Sets an interval at which to send a heartbeat packet to the WebSocket.
* @param {number} interval The interval at which to send a heartbeat packet
*/
setHeartbeat(interval) {
if (!interval || isNaN(interval)) {
this.onError(new Error('VOICE_INVALID_HEARTBEAT'));
return;
}
if (this.heartbeatInterval) {
/**
* Emitted whenever the voice WebSocket encounters a non-fatal error.
* @param {string} warn The warning
* @event VoiceWebSocket#warn
*/
this.emit('warn', 'A voice heartbeat interval is being overwritten');
this.client.clearInterval(this.heartbeatInterval);
}
this.heartbeatInterval = this.client.setInterval(this.sendHeartbeat.bind(this), interval);
}
/**
* Clears a heartbeat interval, if one exists.
*/
clearHeartbeat() {
if (!this.heartbeatInterval) {
this.emit('warn', 'Tried to clear a heartbeat interval that does not exist');
return;
}
this.client.clearInterval(this.heartbeatInterval);
this.heartbeatInterval = null;
}
/**
* Sends a heartbeat packet.
*/
sendHeartbeat() {
this.sendPacket({ op: VoiceOPCodes.HEARTBEAT, d: Math.floor(Math.random() * 10e10) }).catch(() => {
this.emit('warn', 'Tried to send heartbeat, but connection is not open');
this.clearHeartbeat();
});
}
}
module.exports = VoiceWebSocket;

Some files were not shown because too many files have changed in this diff Show More