* Small changes to parseEmoji regex
I just made a small change to the parseEmoji regex, this change will make an invalid emoji, like `<aname:id>` return as null, before this change it would return as an animated emoji because the name started with an `a` which would result in false positives, then the `?` I added to the end of `(\d{17,19})?` is used if someone provided an emoji as `:name:` or `a:name:` it will return the correct values but have an invalid id.
* Update Util.js
2nd Update: I changed the regex to output the results if you provide `<aemoji:123456789012345678>` and <:aemoji:123456789012345678>` which will output `{ animated: false, name: "aemoji", id: "123456789012345678" }` or `<:emojiname:>` which outputs `{ animated: false, name: "emojiname", id: null }` or `<a:emoji:>` which would output `{ animated: true, name: "emoji", id: null }`. Before this PR the method would return that the emoji was animated if you provided something like `<anemojiname:emoji_id>` because the name started with an `a`.
* Making Util.splitMessage always return an array
Util.splitMessage sometimes returns an array, but other times it returns a string. This should make it so that it always returns an array.
* jsdoc
Co-Authored-By: TNThacker2015 <37024464+TNThacker2015@users.noreply.github.com>
* docs(Util): remove superfluous space in docstring
* wip refactor
* add escapeMarkdown tests
* italics can be done with a single underscore too
* more refined
* fix test name
* unnecessary eslint ignores
* use jest
* make eslint less annoying in this test file
* more testing
* fix lib usage
* more tests and a small fix
* Implement idle feature
* Add typings
* Minimal fixes
* Make everything in Collector and not attached to ReactionCollector
* set this._idletimeout to null when collector ends
* also set this._timeout to null when collector ends
* basic teams support
* export Team & TeamMember
* use typedef
* typings and some fixes
* Update src/structures/TeamMember.js
Co-Authored-By: Vlad Frangu <kingdgrizzle@gmail.com>
* fix Team#iconURL()
* fix typings and a bug
* fix states start at 1
* team icon hash can be null
* fix owner typings
* Update TextChannel.js
Update `setRateLimitPerUser` description to specify the `number` is in seconds, per the Discord docs
* Update TextChannel.js
Add unit to the rateLimitPerUser property
* Update GuildChannel.js
* Update StreamDispatcher.js
Specify unit for `StreamDispatcher.pausedTime`
* Update TextChannel.js
Update `setRateLimitPerUser` description to specify the `number` is in seconds, per the Discord docs
* Update TextChannel.js
Add unit to the rateLimitPerUser property
* Update GuildChannel.js
* Disambiguate the description of <client>.channels
Although not explicitly said, the current wording makes it seem like all channels are cached and available at any time in this store. Hopefully this variation makes it a bit clearer.
* make more explicit (I think)
* remove trailing white spaces
* feat(voice): kick members from voice channels
* fix(VoiceState): improve stability in checking for client user
* feat(VoiceState): add setChannel for moving/kicking members
* update typings
* remove duplicated methods across GuildMember and VoiceState
member.setDeaf => member.voice.setDeaf
member.setMute => member.voice.setMute
member.setVoiceChannel => member.voice.setChannel
* src: Implement store and news channels!
* src: Remove code dupe
* src: Add missing guild properties
* docs: Add a small notice that the channel type may also change
* src: Remove re-creation of the MessageStore
* lint: Unused Import
* src: Requested changes for StoreChannels
* typings: Fix typings
* src: Moar guild updates
* src: Set maximumPresence to the data prop, the already existent one, or default to 5000
* typings: afkChannel is a VC
I keep confusing them, ffs
Co-Authored-By: vladfrangu <kingdgrizzle@gmail.com>
* docs: Document that maximumMembers and maximumPresences may be inaccurate before fetching
* src Appels requested changes
* add a public alternative to the private raw event
while retaining raw for use in debugging privately
* only emit dispatch packets
* requested changes
TIL, that's neat
* fix padding
* requested changes
* Update WebSocketManager.js
* docs: document constructors of extendible structures
* docs(ClientPresence): document default value for data parameter
Co-Authored-By: SpaceEEC <spaceeec@yahoo.com>
* docs(Presence): document default value for data parameter
Co-Authored-By: SpaceEEC <spaceeec@yahoo.com>
* docs(DMChannel): capitalize DM in the constructor doc
* fix end method in VoiceBroadcast
this.client is a ClientVoiceManager and thus its this.client.broadcasts instead of this.client.voice.broascasts
* revert the voicebroadcast and pass this.client at clientvoice
* passed this.client
* docs: make voice public
* typings: Update typings to match the docs
* typings: ClientVoiceManager is nullable in Client
Co-Authored-By: vladfrangu <kingdgrizzle@gmail.com>
* typings: Mark client as readonly
Co-Authored-By: vladfrangu <kingdgrizzle@gmail.com>
* src: Make the client readonly
* src: Remove Client#voiceConnections getter in favor of ClientVoiceManager#connections
* src: WIP Internal Sharding refactor
* src: Refactor unavailable guild check
Co-Authored-By: kyranet <kyradiscord@gmail.com>
* src: More WIP Code
F in the chat to the old manager
* src: It should work but Discord says no.
Seriously why is this not working!
* fix: Inflator causing issues
* src: Finishing touches and typings
* misc: Proper debug message
* fix: Making things hidden needs writable: true as well
* fix: Sharding allowing multiple of the same shard, negative shards or strings
* fix: Again... edge cases
I love you guys .w.
* misc: Touchups
* misc: Better error?
* docs: Typo
* typings: Requested changes
* src: Requested changes
* src: Fix issues, validate provided shard options and more
* src: Forgot to remove the listener
* lint: eslint complaining
* fix: Setting shardCount to auto crashing the process
* misc: Requested changes
* typings: Correct typings for shardCount client option
* typings: Add invalidSession event to the shard and correct typings
* src: Minor docs adjustements, and code consistency between setHelloTimeout and setHeartbeatTimeout
* src: Don't block reconnect while creating shards
Might fix silent disconnects *again*
* src: Prevent reconnect from running if the Manager isn't READY
That way, if a shard dies while we're still spawning, it won't cause issues
* fix: Retry to reconnect if there's a network error going on.
The manager *should* keep reconnecting unless the token is invalid
* src: Enhance onClose handler for shards in the manager
- If the close code is between 1000 and 2000 (inclusive), you cannot resume
I tested this locally
- If there's a session ID still present, immediately try to resume
Faster resumes :papaBless:
Otherwise, the invalid session event will trigger and it'll handle accordingly
I swear if I see a SINGULAR Silent DC I'm yeeting
* src: Fix error check
* src: Make sure message exists on the error
* src: Used the wrong property for the shardQueue
* src: Make the hello timeout be made by the client
god help
* docs: Correct docs for WSEvents
* misc: Remove old events from the Events constant
* src: Throw the HTTP error if we don't get a 401
* typings: Can't forget about them
* src: Implement some more fail safes just in case
Seriously, better safe than sorry! Gotta failproof it completely
* edit shouldn't remove content
If undefined is passed to the api, content isn't removed in such a case where you are only editing the embed.
* fix a related doc string
* update typings
* requested changes
* Remove GroupDMChannels
they sparked no joy
* Start partials for message deletion
* MessageUpdate partials
* Add partials as an opt-in client option
* Add fetch() to Message
* Message.author should never be undefined
* Fix channels being the wrong type
* Allow fetching channels
* Refactor and add reaction add partials
* Reaction remove partials
* Check for emoji first
* fix message fetching
janky
* User partials in audit logs
* refactor overwrite code
* guild member partials
* partials as a whitelist
* document GuildMember#fetch
* fix: check whether a structure is a partial, not whether cache is true
* typings: Updated for latest commit (#3075)
* partials: fix messageUpdate behaviour (now "old" message can be partial)
* partials: add warnings and docs
* partials: add partials to index.yml
* partials: tighten "partial" definitions
* partials: fix embed-only messages counting as partials
* fix: Sharding bugs, silent disconnects and cleanup code
* typings
* fix: Destroy connecting with close code different from 1000
Per `If a client does not receive a heartbeat ack between its attempts at sending heartbeats, it should immediately terminate the connection with a non-1000 close code, reconnect, and attempt to resume.`
* misc: Wait x ms before reconnecting
Per https://discordapp.com/developers/docs/topics/gateway#resuming
* docs
* nit: docs
* misc: Prevent multiple calls to WebSocketManager#destroy
* fix: Implement destroying if you reset the token
* misc: Clear the WS packet queue on WebSocketShard#destroy
You can't send those packets anywhere anymore, so no point in keeping them
* fix: Handle session limits when reconnecting a full shard, cleanup
* misc: No need to create a new shard instance
* fix: closeSequence being null, thus emitting null on Client#resumed
* misc: Remove GUILD_SYNC Gateway handler and add missing dot to string
* misc: Close WS with code 4000 if we didn't get a heartbeat in time
As said in the Discord API server
* fix: Handle ready emitting in onPacket
Doesn't allow broken packets
* misc: Close the connection if Discord asks for a reconnect
Prevents double triggers
* testing: Prevent multiple reconnect attempts on a shard
Should fix some issues some people have had.
* fix: Prevent multiple reconnect calls on the shard, re-use conn to identify, remove reconnect function
Note: Closing the WS with 1000 makes the session invalid
* misc: Forgot to remove 2 unneeded setters
* docs: Wrong param docstring for WebSocketShard#destroy
* misc: Set status to reconnecting after destroying
* misc: Close connection with code 1000 on session invalidated
Allows us to cleanup the shard and do a full reconnect
Also remove identify wait delay, not used anywhere
* fix: Fix zlib crash on node
And with that, the PR is done!
* misc: Implement a reconnect queue
And that is all there was to be done in this PR.
Shards now queue up for a reconnect
* nit: Debug the queue after destroying
* docs: Make the invalidated event clearer
* lint: I'm good at my job
* docs
* docs: Make description for isReconnectingShards accurate
*can I stop finding issues, this PR is meant to be done*
* misc: Remove shard from bind params
* misc: Code re-ordering and cleanup
Resumes do not need to be queued up, as they do not count to the identify limit, and after some testing, they don't have the 5 second delay required, like in identify
* fix: Issues with token regeneration and shards not properly handling them
We close the ws connection with code 1000 if we get an invalid session payload,
that way we can queue the reconnects and handle any issues
* misc: Remove useless delays on session invalidated
They get handled by the rest of the code already
* lint
* misc: reset the sequence on Shard#destroy
This especially is a problem if you need to re-identify, as the sequence doesn't get set to the current one,
causing the sequence to be wrong
* fix: GitHub rebase and minor tweak
* Implement a 15 second timeout if shards don't connect till then
Should prevent shards that never reconnect
* revert: Make WebSocketShard#send and WebSocketManager#broadcast public
* typings: Set type to void instead of undefined
* docs: Requested Changes
- Fixed a bug where `GuildMemberRoleStore#{add,remove}` would create a rejected promise inside a promise, instead of rejecting the first one.
- Fixed a bug where `GuildMember#edit` with a specified unknown channel would throw synchronously, instead of rejecting asynchronously.
* feat({Role,Channel}Store): fetch method
* docs: Add usage examples to the new methods
* misc: Add note of why we are fetching all roles even for a single one
This PR attempts to fix the reported resumed event count in the debug output (where it is always displayed only as 1 event replayed) and in the emitted `resumed` event, where it passed the current sequence instead of passing the actual replayed event count (which was an utopic high number for smaller bots on resume).
* fix(Util): throw an explicit error if a chunk exceeds the max length
* refactor(Util): consolidate both errors in splitMessage into one
* revert(Messages): do not unnecessarily change the error code
* revert(Messages): do not remove the word 'the'
* Add explicit error to setting invalid voice channel
* restrict to guild
Co-Authored-By: Darqam <anhim2@gmail.com>
* add a more explicit error and channel type check
* bad tab
* fix: Sharding causing constant heartbeat / identify spam
* misc: Remove wait param in connect
* misc: Wait 2.5 seconds before sending identify again if session is resumable
* misc: Remove useless destroy call
* nit: Capitalization
* fix: Identify on HELLO not connectionOpen
* misc: Add different intervals for identify after invalid session
- 2500 if we couldn't resume in time
- 5000 if we didn't have a session ID (per the docs on identify, that a client can only connect every 5 seconds)
- Otherwise, just identify again
* misc: Only clear heartbeat if shard is fully dead
Reconnect clears it otherwise
* fix: Accessing .length on a Collection
* internal sharding
* ready event
* the square deal
* the new deal
* the second new deal
* add actual documentation
* the new freedom
* the great society
* federal intervention
* some of requested changes
* i ran out of things to call these
* destroy this
* fix: Client#uptime went missing
* fix(Client): destroy the client on login failure
This may happen duo invalid sharding config / invalid token / user requested destroy
* fix(Client): reject login promise when the client is destroyed before ready
* fix(WebSocketManager): remove redundancy in destroy method (#2491)
* typo(ErrorMessages): duo -> duo to
* typo(ErrorMessages): duo -> due
* fix: docs and options
* docs(WebSocketManager): WebSockethard -> WebSocketShard (#2502)
* fix(ClientUser): lazily load to account for extended user structure (#2501)
* docs(WebSocketShard): document class to make it visible in documentation (#2504)
* fix: WebSocketShard#reconnect
* fix: presenceUpdate & userUpdate
* presenceUpdate wasn't really being handled at all
* userUpdate handled incorrectly because as of v7 in the Discord API, it comes inside presenceUpdate
* re-add raw event
* member is now part of message create payload
* feat: Add functionality to support multiple servers with different shards (#2395)
* Added functionallity to spawn multiple sharding managers due to adding start and end shards
* Small fixes and limiting shard amount to max recommended
* Forgot a check in spawn()
* Fixed indentation
* Removed optiosn object documentation for totalShards
* More fixes and a check that the startShard + amount doesnt go over the recommended shard amount
* fix getting max recommended
* Removed async from constructor (my fault)
* Changed start and end shard to a shardList or "auto" + fixed some brainfarts with isNaN
* Changed the loop and totalShard count calculation
* shards are actually 0 based
* Fixed a problem with the gateway and handled some range errors and type errors
* Changed Number.isNan to isNaN and changed a few Integer checks to use Number.isInteger
* Added check if shardList contains smth greater than totalShards; made spawn use totalShards again; shardList will be ignored and rebuild if totalShards is 'auto'; fixed docs
* ShardingManager#spawn now uses a for..of loop; fixed the if statement inside the new for..of loop to still work as intended; made the totalShards be set to a new amount if smth manual is put into ShardingManager#spawn just like before; Fixed some spelling
* internal sharding
* ready event
* the square deal
* the new deal
* the second new deal
* add actual documentation
* the new freedom
* the great society
* federal intervention
* some of requested changes
* i ran out of things to call these
* destroy this
* fix: Client#uptime went missing
* fix(Client): destroy the client on login failure
This may happen duo invalid sharding config / invalid token / user requested destroy
* fix(Client): reject login promise when the client is destroyed before ready
* fix(WebSocketManager): remove redundancy in destroy method (#2491)
* typo(ErrorMessages): duo -> duo to
* typo(ErrorMessages): duo -> due
* fix: docs and options
* docs(WebSocketManager): WebSockethard -> WebSocketShard (#2502)
* fix(ClientUser): lazily load to account for extended user structure (#2501)
* docs(WebSocketShard): document class to make it visible in documentation (#2504)
* fix: WebSocketShard#reconnect
* fix: presenceUpdate & userUpdate
* presenceUpdate wasn't really being handled at all
* userUpdate handled incorrectly because as of v7 in the Discord API, it comes inside presenceUpdate
* Internal Sharding adaptation
Adapted to internal sharding
Fixed a bug where non ready invalidated sessions wouldnt respawn
* Fixed shardCount not retrieving
* Fixing style
removed unnecessary parenthesis
* Fixing and rebasing
lets hope i didnt dun hecklered it
* Fixing my own retardation
* Thanks git rebase
* fix: assigning member in message create payload
* fix: resumes
* fix: IS wont give up reconnecting now
* docs: add missing docs mostly
* fix: found lost methods
* fix: WebSocketManager#broadcast check if shard exists
* fix: ShardClientUtil#id returning undefined
* feat: handle new session rate limits (#2796)
* feat: handle new session rate limits
* i have no idea what i was doing last night
* fix if statement weirdness
* fix: re-add presence parsing from ClientOptions (#2893)
* resolve conflicts
* typings: missing typings
* re-add missing linter rule
* fix: replacing ClientUser wrongly
* address unecessary performance waste
* docs: missing disconnect event
* fix(typings): Fix 2 issues with typings (#2909)
* (Typings) Update typings to reflect current ClientOptions
* fix(Typings) fixes a bug with Websockets and DOM Types
* fix travis
* feat: allow setting presence per shard
* add WebSocketManager#shardX events
* adjust typings, docs and performance issues
* readjust shard events, now provide shardId parameter instead
* fix: ready event should check shardCount, not actualShardCount
* fix: re-add replayed parameter of Client#resume
* fix(Sharding): fixes several things in Internal Sharding (#2914)
* fix(Sharding) fixes several things in Internal Sharding
* add default value for shards property
* better implement checking for shards array
* fix travis & some casing
* split shard count into 2 words
* update to latest Internal Sharding, fix requested changes
* make sure totalShardCount is a number
* fix comment
* fix small typo
* dynamically set totalShardCount if either shards or shardCount is provided
* consistency: rename shardID to shardId
* remove Client#shardIds
* fix: typo in GuildIntegrationsUpdate handler
* fix: incorrect packet data being passed in some events (#2919)
* fix: edgecase of ShardingManager and totalShardCount (#2918)
* fix: Client#userUpdate being passed wrong parameter
and fix a potential edgecase of returning null in ClientUser#edit from this event
* fix consistency and typings issues
* consistency: shardId instances renamed to shardID
* typings: fix typings regarding WebSocket
* style(.eslintrc): remove additional whitespace
* fix(Client): remove ondisconnect handler on timeout
* docs(BaseClient): fix typo of Immediate
* nitpick: typings, private fields and methods
* typo: improve grammar a bit
* fix: error assigning client in WebSocketManager
* typo: actually spell milliseconds properly
* Add worker-based sharding mode to ShardingManager
* Fix ClientShardUtil mode
* Fix worker not being cleared on shard death
* Update docs and typings
* Clean up Client sharding logic a bit
* Add info about requirements for worker mode
* feat: Add TextChannel#rateLimitPerUser
Rename parameter in TextChannel#setRateLimitPerUser
feat: Add `rateLimitPerUser` param to ChannelData
fix: eslint
* docs: Updated typings
* fix: Requested changes
* fix: rateLimitPerUser being undefined when 0
When `rate_limit_per_user` is 0, the gateway does not send it (but REST does). When this is set to a non-zero number, this property starts to exist. Otherwise this will be `0`. Adding `|| 0` should do the trick changing `undefined` to `0`.
* fix: eslint
* wip: comprehensive permissionOverwrites refactor
* PermissionOverwrites.resolve should Promise.reject()
where a promise is the expected return value
* On second thought, async rewrite to automatically reject on throw
* Fix some docs
* Fix a bug
* fix 2 more bugs
* typings: Updated for latest commit
* typings: Add missing method in GuildChannel
* typings: Add missing `| null` in PermissionOverwriteOption type
* Suggested changes
* feat: add ClientOptions#retryLimit
* hydra needs to learn how to code right
* a default would probably help
* move incrementor & update comment
* clarify docs on Infinity
* fix: better global ratelimit handling in RequestHandler
fix: Remove useless line
fix: Better global ratelimit management
* refactor: Changed RESTManager#globallyRateLimited to be a getter
* refactor: Remove RESTManager#globallyRateLimited getter
* docs: Updated comments to reflect latest changes
* Docs: merge PermissionOverwriteOptions and OverwriteData
* fix user-member and replace eslint-disable with linebreaks
* consistency fix
* Fix: remove empty line between jsdocs and method
* Fix: allowed/denied to allow/deny to conform with recent master changes
* refactor: clean up rate limit handling
* requested changes
* remove request mode option
* fix dupe requests
* hardcode reaction ratelimits
* suggested changes
* fix small thing
* re-add restTimeOffset
* move restTimeOffset a bit
* i swear i know english its my native language ok
* requested changes
* fix: a bit *too* pre-emptive with ratelimits, now less so
* fix: dapi error shoudl reject with path
* fix: make errors in execute catchable
* fix promise return
* rebase is hard
* misc: Update ClientApplication for the current API
* cleanup: ClientApplication#fetchAssets, removed createAsset
* Major cleanup time
* Merge to kyra's branch
* docs: Updated typings
* fix: re-add ClientApplication#{cover,coverImage()}
* typings(ClientApplication): move coverImage declaration up
* Rework createMessage
- MessageAttachment is now structurally similar to FileOptions
- No longer mutates the object passed as options
- Supports more permutations of arguments
* Ignore complexity warning
* Refactor name finding
* Fix typo
* Update typings
* Default name to null for MessageAttachment
* Make Message#reply use transformOptions
* Move transformOptions
* Fix Message#reply
* Fix mutation
* Update tests
* Fix options passing
* Refactor into APIMessage
* Fix webhook send
* Expose APIMessage
* Add documentation
* Add types
* Fix type doc
* Fix another type doc
* Fix another another type doc (is this one even right!?)
* Remove trailing comma
* Properly clone split options
* Add support for sending file as stream
* Missed a doc
* Resolve files only once when splitting messages
* This looks nicer
* Assign directly
* Don't cache data and files
* Missing return type
* Use object spread instead Object.assign
* Document constructors
* Crawl is a little dot
* comp pls
* tests: sanitize local file path, disable no-await-in-loop
* abstract BitField from Permissions
* reduce useless code, improve docs
* add a ReadOnly identifier to the return type of Bitfield#freeze()
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html#partial-readonly-record-and-pick
* fix the RangeError
* update docs, convert Speaking and ActivityFlags to bitfields
* fix some docs
* Fix Speaking BitField oops
* docs for oops
* more incorrect docs
* Fix incorrectly named property
* add new classes to index
* fix missing @extends docs
* default bitfield resolve to 0, and cleanup defaulting everywhere
Also removes GuildMember#missiongPermissions() alias that had incorrect behavior
* Breaking: Rename Overwrite allowed and denied to allow and deny
To be consistent with the api's naming
* fix setSpeaking usage to bitfields instead of booleans
* fix speaking bug in playChunk
* docs: Updated typings
* fix: BitFieldResolvable should use RecursiveArray
* bugfix/requested change
* typings: Cleanup (#2)
* typings: Fix BitField#{toArray,@@iterator} output type
* typings: correct PermissionOverwrites property names and nitpicks
* src: Handle WEBHOOK_UPDATE events
* Commit rename of 77'
Or adding the letter S
* I missed this
* Properly do this now
Typos everywhere
* Typings
* refactor: remove now unnecessary guild variable
* Error for guild.fetchVanityURL feature not enabled
* added GET/guilds/{guild.id}/vanity-url endpoint
* fix: code conventions
* adopted suggestion
* Changed error message according to change request
* Renamed method
to indicate that only the code is fetched, not the entire url.
* Update Guild.js