* Add Collection as param to GuildChannel#replacePermissionOverwrites
* Add example for null to PermissionOverwriteOptions
* eslint-disable max-len
* PermissionOverwriteOptions desc. change default to unset
* deprecated allow/deny in favor of allowed/denied
Unlike TextChannel#fetchMessages, this method returned the cache rather than the fetched items, so in interests of consistency, this does as well now
closes#2574
The node documentation fails to correctly document when the backlog of unsent messages exceeds a certain threshhold the function will return false. This does not mean it will refuse to send- simply that it will take time. Issue in point: https://github.com/nodejs/node/issues/7657#issuecomment-240581726
If I am not mistaken the only way atm to remove a channels parent atm is to do this to get the null value through the code.
channel.client.rest.methods.updateChannel({id:channel.id, name:channel.name,
topic:channel.topic,position:channel.position,
bitrate:channel.bitrate,userLimit:channel.userLimit,parent:{id:null}}, {});
This fixes the method allowing channel.setParent(null); to work
Two things:
* Documentation doesn't account for possible raw object return
* Allows the return to be a Message object as well, like the docs originally intended
ClientUser#setPresence in master branch (latest) calls client.presences.setClientPresence, but that in v11.3 does not
so i change parameter sent to setPresence for clearing the game activity, from activity:null to game:null,
for now until setPresence gets updated
* Audio bitrate support
Note: not implemented for VoiceBroadcasts
* Fix default args, auto bitrate
* Late night typos are the best
* Changes bitrate to kbps for VoiceChannel stuff
* Add methods to manipulate bitrate while encoding
* Add `count` optional argument to Collection methods
[NON-BREAKING CHANGE]
An optional `count` argument is added to the following methods:
- random() and randomKey()
- first() and firstKey()
- last() and lastKey()
If `count` is used, the method returns an array instead of only the value. Performance impact non-existent for existing code. Performance for returning an array has been measured and this is the fastest I could find (array[i] = value is faster than array.push()).
* Update Collection.js
Fixed spacing/line length errors according to suggestions by codacy/pr
* Fixed docs
Added proper `@returns {*|Array}` as the methods might return either. Also added params where missing (whoops)
* Further doc fixes
Per Crawl's comments, fixed (i + 1) spacing as well as fixed {Integer} to {number}
* random() and randomKey() fix
Per Hydra's comment, random() and randomKey() now ensures unique values.
I've also resolved potential issues with requesting a count higher than the collection size. A collection with 10 items will only ever return at most 10 items using the `count` property.
* Can I facepalm harder
Had wrong header comments ^_^
* Fixed for "values/value" and Omited
Also, added "Positive" integer check.
* looks like I "omitted" a change, there.
* Update Collection.js
* Update Collection.js
* Update Collection.js
Remove the implication that a Message object's ID is unique only to the channel it was sent on
Message ID's are snowflakes, and as stated in Discord's API documentation, globally unique throughout Discord
* handing guildauditlog's promise rejections to the user
* Returning a new Promise to resolve a Promise.all is unnecessary.
Also for the docs, it returns a Promise<GuildauditLogs>, not GuildAuditLogs directly.
* totally did not removed that line
* fix fetchMentions' auth header, options and data mapping
* vscode strikes again
* switched to Util.mergeDefault
* vscode
* removed duplicated optionals and switched to instanceof
* Start rewriting Manager and Connection
* more stuff
* stuff
* Fix ready bug
* some stuff i forgot
* fix some stuff
* add stupid heartbeat ack like seriously who cares
* woo!
* fix a bug
* rate limit the dumb websocket
* stuff
* hdocs
* Docs
* Remove ClientManager#setupKeepAlive as it is now redundant
* Change Client._pingTimestamp to a getter that fetches the timestamp from the WebSocketConnection
* are you happy now eslint smh
* make gus happy
* Add CloseEvent external doc
* Make sure to emit 'reconnecting' when actually reconnecting
* ffs
* Fix RESUME logic
* Add heartbeat ack debug messages, including latency data
* Dumb stuff for Gus
* thx eslint
* more dumb stuff
* more dumb crap smh gus i h8 u
* moar messages
* fix for using wrong status, causing certain events not to be fired (#1422)
* throw error for role names/integers being provided for role resolvables
* Update RESTMethods.js
* Update RESTMethods.js
im really bad
* Update RESTMethods.js
* removed new promise reject
ty gus
* Update RESTMethods.js
* move error to guildmember.addRole method
* Update GuildMember.js
* EmojiIdentifierResolvable now supports emoji IDs and pre-encoded unicode
* forgot to return the identifier and not the emoji itself
* using ? in JSDoc instead of |null
* Break reconnect loop if you client.destroy in the disconnect event
* fix lint/long line?
* God this is So UGLY, why...
* Update WebSocketManager.js
* Update WebSocketManager.js
I considered it might be useful to have something exposed that allows the end-user to set these if they want, but our current code doesn't allow for that. It'll remain an internal feature for the time being.
* getters for decibel and logarithmic volume
I don't really understand where the conversion numbers come from but having this allows for an easy way to get the volume back based on what method you used to set it. I think the math is right, but yeah I've just used the conversion numbers from the other methods.
* fix trailing spaces
* rewrite http
* browser fun
* all the mimes dammit
* i need a newline
* whoops
* forgot about this
* use promises and HTTPRequest.method
* fluent
* move httpclient to external module
* branding
* middleware
* revert middleware
* make role calculated position nicer
* make channels sortable in a nice way too
* stupid git web rebase editor
* Update Guild.js
* Update Guild.js
* Update Guild.js
* Update Guild.js
* Update RESTMethods.js
* [requires more testing] Fix#1089
* Clean up unshift
* Remove <Message>.patch(data)
Nothing calls this method any longer. It is also a private method, so this shouldn't be a breaking change.
* Fix Message Reactions
Purposely reference previous reaction collections, so collection is consistant accross all message edits (no unnecisary data duplication). Makes #1221 extranious.
* Some Data Packets come Incomplete
And several properties can be falsy, so instead of || opted for hasOwnProperty().
* No reason MessageTypes should be an object...
* Use `prop in obj` isntead of hasOwnProp
per @Gawdl3y
* Update UserAgentManager.js
* Update UserAgentManager.js
* gawdl3y is one of the most pants-on-head retarded people i have ever met
* Update UserAgentManager.js
* Update UserAgentManager.js
* Update UserAgentManager.js
* Update UserAgentManager.js
- Rename Guild#updateChannelPositions -> setChannelPositions
- Allow Guild#setChannelPositions to take ChannelResolvables
- Prioritise ClientDataResolver#resolveChannel's string case
- Minor cleanup
* Adding resetGame functionallity
`setGame` method would allways result in an Object passed to `setPresence`.
Passing { game: null } (supported by discords WebSocket gateway to reset the current Game) to `setPresence` would still result in a Game Object sent to the endpoint.
Explicitly setting `game` to null should overwrite the `game` object provided by `localPresence` or `client.presence`.
This was neither supported by `setGame` or `setPresence`.
* Missing semicolons to resetGame and setPresence
* Fixing trailing spaces, commas and semicolons
* Moving resetGame functionality into setGame method
Minification of if statement in setPresence.
Removing resetGame method and adding a case for `game === null` to setGame method
* Adding missing space in setGame method
* Fix docs
* Adding shuffleArray method to utils
* Shuffle channels functionality on guild.
* Comment fix
* Removing shuffle functionality and replacing with a simple update
* Code review changes to method/variable names
* Update comment reference to channelId as well
* Updating jsdoc with typedef of ChannelPosition
* VoiceConnection rework
- improves codebase
- removes concept of pending connections
- attempts to fix memory leaks by removing EventEmitter listeners
- makes voice connections keep track of its own channel when it is moved by another user
- allows voice connections to reconnect when Discord falls back to another voice server or a region change occurs
- adds events for some of the aforementioned events
* Removed unused code
* More clean up / bugfixes
* Added typedefs to Status and VoiceStatus constants
* Add RichEmbed#attachFile
Mostly for attaching local images that can be accessed within the embed image/author icon/footer icon via `attachment//filename.png` and the like.
* Update docstring to reflect valid param types
* Update TextBasedChannel.js
* Update RichEmbed.js
* Update RichEmbed.js
* Added support for adding users to guild
added RESTMethods#AddGuildMemberOptions and Guild#addMember with typedef
AddGuildMemberOptions to be able to add user to guild as a member
through `PUT/guilds/{guild.id}/members/{user.id}`
https://discordapp.com/developers/docs/resources/guild#add-guild-member
* fixing lint errors
* Changes based on discussion
* Changes based on discussion 2
* Changes based on discussion 3
Yay! More changes.
* Fix for incorrect oldMember in guildMemberUpdate event after addRole
`addRole` would modify the cached GuildMember rather than letting it be handled internally when a guild member update packet is received from Discord, leading to the `oldMember` and `newMember` being identical following a call to `addRole`
This is currently how `addRoles` does it, and a correct oldMember is passed to the `guildMemberUpdate` event following a call to `addRoles`
* Return cloned member with added/removed role
So we can return a member object with the added/removed role without affecting the member object sent to `guildMemberUpdate`
* Wait for guildMemberUpdate and return updated GuildMember
* Fix linter errors
* Remove listeners after 10 seconds
* Add support to edit emojis
* Fixes for coding style.
* Add and use guildEmoji constants for updateEmoji
* Just use the Constant
* Fix typo in edit documentation
* Specify property types
* Fix ridiculous typo.
* Update Emoji.js
* Added opus stream support, added volume interface
* Remove setImmediate
* Fix weird syntax error
* Most useless commit ever
You're welcome, @PgBiel
* Fix potential memory leak with OpusScript
Emscripten has the tendency to not free resources even when the Opus engine instance has been garbage collected. Thanks to @abalabahaha for pointing this out.
* Typo
* VoiceReceiver.destroy: destroy opus encoder
* Message patching: clear mention collections
Fixes#1089
When discord sends an array of mentions, it is a full list of mentions -- therefore, we should clear the old mention collection. The same goes for when we re-analyze the message for channel mentions.
* Use Collection.clear() instead of new Collection
* Added try catch so that decode errors aren't fatal
* Tweaked the usage of the warn event and updated jsdocs
* Moved method into class for webpack scoping reasons
* add color resolvable, and color constants from the client
* fix up docs
* Update ClientDataResolver.js
* add easter eggs
* Update ClientDataResolver.js
* Update RESTMethods.js
* add more search stuff
* clean up the options
* fix link hostname
* use some resolvers
* fix type
* move the trasform to a seperate file
* pass this param
* move typedef
* start wip rewrite of sending/editing messages
* pass the build, modify the edit method to fit the new system
* simplify the applyToClass method
* change handling of file options
* add back message splitting
* i couldn't help myself
* add some smart message options
* clean up, add sexy options
* fix indentation
* fix up splitting
* add \b
* add back old methods for hydar happiness
* clean up more
* move code handling to the rest method
* clean up this.rest.client
* Update TextBasedChannel.js
* add docs back for the bad methods
* fix reply in group dms
* srsly gawdl3y
* make code better
* fix changes for gawdl3y
* fix checking
* remove getter
* make code handling more robust
* k
* fix up sendEmbed docs
* stupid
* fix up more docs because aaaaa
* no more pls
Changed RichEmbed to take StringResolvables for all title, name, value and
description arguments.
Also changed a few lines in setColor to make sure that the value
assigned to this.color is always a number.
* Pass Reason to the streamDispatcher end event
* Update <dispatcher>.end() to bring inline with <collector>.stop()
Also changed "Stream is not generating quickly enough." from an end to an error, per Crawl...
* Fix docs Copy/Paste fail from collection end event
* Docs update
Changed the param names and param descriptions to be consistent.
* Added === comparison
Changed Presence.equals and Game.equals to first compare using ===
* Collection.equals fix
Now returns false when collection is undefined, instead of crashing
💯
* + Added function to get a user's default avatar
+ Added HOST constant to Constants
+ Added assets endpoint
+ Added quality of life function to get a user's avatar or default avatar
+ Added quality of life function to get member's nickname or username
* * Fixed invocation of a getter.
* Fixed lint issue
* Made the API constant use the HOST constant for DRY-ness
Changed DOC comment to be more descriptive
* Update GuildMember.js
* RichEmbed Tweaks/Improvements
Changed .addTimestamp() to .setTimestamp() to bring it inline with all other single value settings.
Changed Field value to StringResolveable from String to bring it inline with typical sendMessage functionality.
* Lint Fix
* Remove Default, Add check for undefined
* Update faq.md (#949)
* fix docs
* Revert "fixed typo in documentation" (#950)
* new errors for richembed yay
Simplified the parsing for color arrays.
Throwing some errors on values that would result in Bad Requests.
Changed setAuthor and setFooter's icon parameter to icon_url to match
the embed object's property name.
Changed the docs for setFooter to reflect that icon_url is optional.
* changed docs instead of arg names
* capitalization
* this is why wrapping data 1:1 is a bad idea
* ffs
* whoever wrote role.hexColor is a bad, bad person
* Update MessageEmbed.js
* Update MessageEmbed.js
* Add more errors for RichEmbed builder char limits
Might as well if we're erroring on number of fields when that's the one limit that doesn't actually throw a bad request.
* Fix name.length check in previous commit
* Update RichEmbed.js
* Update number of fields error message
Adds an equals function that checks for differing size and differing
key-value pairs, and takes into account the edge case for when there's
an entry for the key, but the value is undefined.
* the performance from this is astounding
* help uws
* save 15 bytes in webpacks
* update readme
* why is markdown like this
* optimizations
* Update WebSocketManager.js
* friggin webpack tho
* probably important
* add all the stuff to the package.json
* add minify builds and a nice package.json script to run it all
* clean up
* use uglify harmony branch so we can actually run minify builds that work
* update build system
* make test better
* clean up
* fix issues with compression
*
* c++ requirements in a node lib? whaaaaat?
* fix travis yml?
* put railings on voice connections
* 🖕🏻
* aaaaaa
* handle arraybuffers in the unlikely event one is sent
* support arraybuffers in resolvebuffer
* this needs to be fixed at some point
* this was fixed
* disable filename versioning if env VERSIONED is set to false
* Update ClientDataResolver.js
* Update ClientVoiceManager.js
* Update WebSocketManager.js
* Update ConvertArrayBuffer.js
* Update webpack.html
* enable compression for browser and fix ws error handler
* Update WebSocketManager.js
* everything will be okay gawdl3y
* compression is slower in browser, so rip the last three hours of my life
* Update Constants.js
* Update .gitignore
This commit:
* fixes inconsistencies (primarily regarding capitalization)
* fixes non-proper nouns that were improperly capitalized
* fixes reminents from not-so-meticulous copy+paste jobs
* Add support for notes
* Ensure consistency with notes from ready payload
* Add getter method for users
* Minor tweaks
* Update warning messages
* More minor fixes
_timeouts and _intervals were changed to Set objects in
commit 6ede7a32fd a month ago.
Like #844, this fix was reverted in 7d04863b66 (#839)
without explanation and was never included in the followup rewrite in
commit 5e2ee2398e.
If the promise returned by logout() rejects, previously
it would be completely uncaught, and just return an
eternally pending promise that never resolved.
Related to pull requests #828 and #839.
* Add a script to automatically build and push docs
This script will checkout the repo in the `docs` branch, then build the
docs locally, copy it to that repo, commit and push. It is designed to
be used in conjunction with Travis.
* Add unencrypted deploy keys to the gitignore
* Make Travis automatically execute the deploy script
* Add the encrypted deploy key
* Update the .travis.yml with the necessary information
* add test for Client.destroy()
* propagate errors in ClientManager.destroy
If the promise returned by logout() rejects, previously
it would be completely uncaught, and just return an
eternally pending promise that never resolved.
* fix RESTMethods.logout
Without a data argument, the POST that superagent sends causes
the discord server to reply with a HTTP 400 error:
text: '{"Content-Type": "Expected Content-Type to be one of set([\'application/json\'])."}',
* fix Client.destroy
_timeouts and _intervals were changed to Set objects in
commit 6ede7a32fd a month ago.
Changing them to arrays causes failures if you try to reuse
the client object again.
* always close websocket in ClientManager.destroy
Invoking logout does not implicitly cause the server to close
the websocket for you, so cleanup everything.
Otherwise the websocket being open keeps node alive and hanging
mysteriously until the connection hits a timeout.
* fix indentation for eslint
* draft stuff
fix docstring for Client#token
Reorganise resolver
make env better for shards, clean up docs
Fix Gus' log messages
7
meh just gateway/bot not v7 :(
final changes, ready for mergin!
build docs
make default totalShards 'auto', fix docs for totalShards type
clean up docs more
run docs
* make consistancy real
* Update and rename getRecommendedShards.js to GetRecommendedShards.js
* Update GetRecommendedShards.js
* Update index.js
* Update RESTMethods.js
* Update Shard.js
* Update GetRecommendedShards.js
* Update ShardingManager.js
* run docs
* start blocking out client
* proto webhookclient
* wee working webhooks
* it's all working
* run docs
* fix jsdoc issues
* add example for webhookClient
* add example in the examples place
* fix docs
* Cache array and keyArray in Collection
Cache array and keyArray in the Collection class to improve consecutive
calls of collection.random() by around 400,000%, I think lel.
The speed decrease (I assume) compared to the previous version when
calling after it has changed is most likely negligible.
* Fix for ESLint
I think this fixes it.
* Handle DM messages in cleanContent getter. Closes#725.
* Fix build error, improve handling for user IDs.
* Update docblock to be more specific about behaviour.
* Handle group DMs in cleanContent.
* Regen docs.
* add documentation for events, and add a disconnect event, because i know people use that
* generate docs, and fix a hastily copied docstring
* fix permissions freak out
* add a message, because WHY THE HELL DID NO ONE EVER DO THIS
!!!
* make message better
* make linter happy
* disable max-len rule for line 37
* make gawdl3y be happy
* gawdl3y triggers me
* Update FfmpegConverterEngine.js
* Adding playStream options
Added optional volume and seek properties
* fixed code formatting
Edited my code styling to match with the rest of d.js
* Added Default Variable
* Added Documentation
Added documentation for the streamOptions parameter
Added a default value for seek in FFmpegConverterEngine
Removed redundantcy
* Fixed docs for voiceConnection
* Change _updateMember's notSame check from && to || (#665)
* Fixed git merge fail
* Built Docs. Again.........
* Hopefully finally fixed
* Added cleanContent getter which replaces mentions with the equivalent
text.
(Majority of code implemented by Gus).
* Fixed bug where invalid mentions would cause crash
* Fixed not cleaning @everyone and @here
* Fixed only detecting first @here or @everyone, resolved to test software (and learn regular expressions) in the future
* Overhaul channel typing system
* Fix ESLint error
* Add channel.isTyping()
* Add count argument to startTyping
* Add range checking to startTyping count
* Better range checking for count
* Add channel.getTypingCount()
* Change getTypingCount() to typingCount getter
* Switch isTyping() to typing getter
* Fix new methods and switch to Map
* Fix applyProp so getters/setters will work
* Add default value to force
* Altered GuildChannel.type to return a string containing either "text",
"voice" or the id of the channel type.
* Fixed typo
* Altered code to pass ESLint test (Functionality Unchanged).
* Third times the charm.
Unify ready and reconnecting properties into a single status property
and future-proof Message class
The state of the WebSocketManager is now represented by a single
status property, removing emittedReady
and reconnecting as representations of state.
Message class will now also cache users it isn't aware of that appear
in mentions and authors.
src/structures/datastore/WebSocketManagerDataStore.js
Added "rough" reconnection attempting
The following however still needs to be done:
1) stop trying after a certain amount of time
2) increasing timeout between each timeout
3) re-evaluate the current method of how reconnecting is handled
internally
**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.**
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
is a great boon to your development process.
## Setup
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
2. Run `npm install`
3. If you're working on voice, also run `npm install node-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)
Ignore any warnings about unmet peer dependencies, as they're all optional.
discord.js is a node module used as a way of interfacing with [Discord](https://discordapp.com/). It is a very useful module for creating bots.
Without voice support: `npm install discord.js`
With voice support ([node-opus](https://www.npmjs.com/package/node-opus)): `npm install discord.js node-opus`
With voice support ([opusscript](https://www.npmjs.com/package/opusscript)): `npm install discord.js opusscript`
### Installation
### Audio engines
The preferred audio engine is node-opus, as it performs significantly better than opusscript. When both are available, discord.js will automatically choose node-opus.
Using opusscript is only recommended for development environments where node-opus is tough to get working.
For production bots, using node-opus should be considered a necessity, especially if they're going to be running on multiple servers.
**Requires node 0.12+**
### Optional packages
- [bufferutil](https://www.npmjs.com/package/bufferutil) to greatly speed up the WebSocket when *not* using uws (`npm install bufferutil`)
- [erlpack](https://github.com/hammerandchisel/erlpack) for significantly faster WebSocket data (de)serialisation (`npm install hammerandchisel/erlpack`)
- One of the following packages can be installed for faster voice packet encryption and decryption:
If you have an issue or want to know if a feature exists, [read the documentation](http://discordjs.readthedocs.org/en/latest/) before contacting me about any issues! If it's badly/wrongly implemented, let me know!
If you would like to contact me, you can create an issue on the GitHub repo, e-mail me via the one available on my NPM profile.
Alternatively, you could just send a DM to **hydrabolt** in [**Discord API**](https://discord.gg/0SBTUU1wZTYd2XyW).
## 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).
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
A Cache object extends an Array (so it can be used like a regular array) but introduces helper functions to make it more useful when developing with discord.js. Unlike a regular array, it doesn't care about the instance or prototype of an object, it works purely on properties.
**Examples:**
..code-block::js
client.users.get("id",11238414);
client.channels.getAll("name","general");
--------
Functions
---------
get(key, value)
~~~~~~~~~~~~~~~
Returns a contained object where ``object[key] == value``. Also works if value is a regex or a function. Returns the first object found that matches the criteria.
get(value)
~~~~~~~~~~
Returns a contained object where ``object["id"] == value``. Shorthand for ``get("id", value)``. Returns ``null`` if ID is not found.
getAll(key, value)
~~~~~~~~~~~~~~~~~~
Similar to ``cache.get(key, value)``, but returns a Cache of any objects that meet the criteria.
has(key, value)
~~~~~~~~~~~~~~~
Returns `true` if there is an object that meets the condition ``object[key] == value`` in the cache
add(data)
~~~~~~~~~
Adds an object to the Cache as long as all the other objects in the cache don't have the same ID as it.
update(old, data)
~~~~~~~~~~~~~~~~~
Updates an old object in the Cache (if it exists) with the new one.
The Equality class is used to see if two objects are equal, based on ``object_1.id === object_2.id``.
If any class in Discord extends equality, it means you should never the default equality operands (``==`` & ``===``) as they could potentially be different instances and therefore appear not to be equal. Instead, use ``equalityObject.equals()`` as shown below.
..code-block::js
object1.equals(object2);// GOOD ✓
object1==object2;// BAD ✖
--------
Functions
---------
equals(object)
~~~~~~~~~~~~~~
Returns true if the specified object is the same as this one.
- **object** - Any `object` with an ``id`` property.
In discord.js, you can handle permissions in two ways. The preferred way is to just use the string name of the permission, alternatively you can use ``Discord.Constants.Permissions["permission name"]``.
--------
Valid Permission Names
----------------------
..code-block::js
{
// general
administrator,
createInstantInvite,
kickMembers,
banMembers,
manageRoles,
managePermissions,
manageChannels,
manageChannel,
manageServer,
changeNickname,
manageNicknames,
// text
readMessages,
sendMessages,
sendTTSMessages,
manageMessages,
embedLinks,
attachFiles,
readMessageHistory,
mentionEveryone,
// voice
voiceConnect,
voiceSpeak,
voiceMuteMembers,
voiceDeafenMembers,
voiceMoveMembers,
voiceUseVAD
};
Preferred Way
-------------
The preferred way of using permissions in discord.js is to just use the name. E.g:
``role.hasPermission("voiceUseVAD")``
Alternative
-----------
You can also go the long way round and use the numerical permission like so:
PermissionOverwrite is used to represent data about permission overwrites for roles or users in channels.
--------
Attributes
----------
id
~~
`String`, the ID of the PermissionOverwrite. If ``overwrite.type`` is ``role``, this is the role's ID. Otherwise, it is a User_ overwrite.
type
~~~~
`String`, type of the overwrite. Either ``member`` or ``role``.
allowed
~~~~~~~
Returns the permissions explicitly allowed by the overwrite. An `Array` of Strings, which are names of permissions. More can be found at `Permission Constants`_
denied
~~~~~~
Returns the permissions explicitly denied by the overwrite. An `Array` of Strings, which are names of permissions. More can be found at `Permission Constants`_
In discord.js, the aim is to allow the end developer to have freedom in what sort of data types they supply. References to any sort of resolvable basically mean what types of data you can provide. The different resolvables are shown before:
--------
Channel Resolvable
------------------
A Channel Resolvable allows:
- Channel_
- Server_
- Message_
- User_ (in some instances)
- String of Channel ID
- String of User ID
File Resolvable
---------------
A File Resolvable allows:
- URL
- Local file path
- Readable stream
Role Resolvable
---------------
A Role Resolvable allows:
- Role ID
- Role_
Voice Channel Resolvable
------------------------
A Voice Channel Resolvable allows:
- VoiceChannel_
- Voice Channel ID
Message Resolvable
------------------
A Message Resolvable allows:
- Message_
- TextChannel_
- PMChannel_
User Resolvable
---------------
A User Resolvable allows:
- User_
- Message_
- TextChannel_
- PMChannel_
- Server_
- String of User ID
String Resolvable
-----------------
A String Resolvable allows:
- Array
- String
Server Resolvable
-----------------
A Server Resolvable allows:
- Server_
- ServerChannel_
- Message_ (only for messages from server channels)
- String of Server ID
Invite ID Resolvable
--------------------
An Invite ID Resolvable allows:
- Invite_
- String containing either a http link to the invite or the invite code on its own.
`Number`, position of the role when viewing the roles of a server.
name
~~~~
`String`, name of the role.
managed
~~~~~~~
`Boolean`, whether Discord has created the role itself. Currently only used for Twitch integration.
id
~~
`String`, ID of the role.
hoist
~~~~~
`Boolean`, whether the role should be displayed as a separate category in the users section.
color
~~~~~
`Number`, a base 10 colour. Use ``role.colorAsHex()`` to get a hex colour instead.
server
~~~~~~
The Server_ the role belongs to.
client
~~~~~~
The Client_ that cached the role.
createdAt
~~~~~~~~~
A `Date` referring to when the role was created.
Functions
---------
serialise()
~~~~~~~~~~~
**Aliases:**`serialize`
Makes an object with the permission names found in `Permission Constants`_ and a boolean value for them.
hasPermission(permission)
~~~~~~~~~~~~~~~~~~~~~~~~~
Sees whether the role has the permission given.
-**permission** - See `Permission Constants`_ for valid permission names.
colorAsHex()
~~~~~~~~~~~~
Returns the role's colour as hex, e.g. ``#FF0000``.
mention()
~~~~~~~~~
Returns a valid string that can be sent in a message to mention the role. By default, ``role.toString()`` does this so by adding a role object to a string, e.g. ``role + ""``, their mention code will be retrieved. If the role isn't mentionable, its name gets returned.
`Integer` from 0-9999, don't use this to identify users. Used to separate the user from the 9998 others that may have the same username. Made redundant by ``user.id``.
id
~~
`String` (do not parse to an Integer, will become inaccurate). The ID of a user, never changes.
avatar
~~~~~~
`String`, the ID/hash of a user's avatar. To get a path to their avatar, see ``user.avatarURL``.
status
~~~~~~
The status of a user, `String`. Either ``online``, ``offline`` or ``idle``.
game
~~~~
The game object of a user. `null` if not playing a game, otherwise `Object` containing the following values:
..code-block::js
{
name:'Game Name'//Name of game user is playing
}
typing
~~~~~~
`Object` containing the following values:
..code-block::js
{
since:1448038288519,//timestamp of when
channel:<ChannelObject>// channel they are typing in.
}
avatarURL
~~~~~~~~~
A valid URL to the user's avatar if they have one, otherwise null.
bot
~~~
A boolean that represents if the user is an official OAuth bot account or not.
voiceChannel
~~~~~~~~~~~~
The VoiceChannel_ the user is connected to. If they aren't in any voice channels, this will be ``null``.
createdAt
~~~~~~~~~
A `Date` referring to when the user was created.
note
~~~~
The note of the user, `String`.
speaking
~~~~~~~~
A boolean that represents whether or not the user is speaking in a voice channel, default is `false`.
Functions
---------
mention()
~~~~~~~~~
Returns a valid string that can be sent in a message to mention the user. By default, ``user.toString()`` does this so by adding a user object to a string, e.g. ``user + ""``, their mention code will be retrieved.
discord.js currently supports sending audio data over Discord voice chat. A voice connection can be initiated using
client.joinVoiceChannel_ and then later accessed again using the `client.voiceConnection` property. You can play something
using the `playXYZ` methods and then later stop the playback and listen for events that tell you about the playback status.
Note that discord.js does not support receiving data from voice yet, only sending.
--------
Attributes
----------
voiceChannel
~~~~~~~~~~~~
VoiceChannel_ that the connection is for
client
~~~~~~
Client_ the connection belongs to
token
~~~~~
The token used to authenticate with Discord
server
~~~~~~
The Server_ on which the voice connection takes place
encoder
~~~~~~~
The AudioEncoder_ used to encode data in this particular session
playingIntent
~~~~~~~~~~~~~
A stream intent used to bind events to the voice connection
playing
~~~~~~~
Whether or not the bot is currently playing something
paused
~~~~~~
Whether or not the playback is currently paused
streamTime
~~~~~~~~~~
The amount of time the current track has been playing for, in milliseconds
Functions
---------
playFile(path, `options`, `callback`)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Plays a file to the voice channel. The file can be in practically any format; if you're looking for a list, look here: `Format list`_.
In addition to a file path local to your computer, it can also accept a URL, however this is not recommended as the entire content of the URL will be read before any playback starts.
This can cause delays from seconds to minutes - you can use `playRawStream` with a Stream obtained from the URL instead.
The `options` object can be used to control playback properties, currently, it allows setting the seek (in seconds) using the `seek` property, and the volume using the `volume` property, which can be in any of the following formats:
- A number representing the linear change in volume; 1 is equal to no change, 0 is completely silent, 0.5 is half the regular volume and 2 is double the regular volume.
- A string representing the linear change in volume, if this is more convenient for you.
- A string representing decibel gain, where `"0dB"` is no change, `"-3dB"` is half the volume (in linear units), `"+6dB"` is four times the volume (in linear units) and so on.
It is recommended to change the volume, because the default of 1 is usually too loud. (A reasonable setting is `0.25` or `"-6dB"`).
The callback will be called immediately after playback has *started*, it will have an error object and the stream intent as its parameters. The callback will only receive
an error if the encoding fails, for playback errors, you can bind a function to the `error` event of the intent. The intent supports the following events:
- The `time` event is emitted every packet (20 milliseconds) and has the current playback time in milliseconds as its only parameter. The playback time can also be checked at any time using the `streamTime` attribute.
- The `end` event is emitted once playback ends. Depending on various factors, it may be emitted a couple seconds earlier than the actual stream ending, you may have to add an offset if necessary.
- The `error` event is emitted if an error happens during playback, such as failing to send a packet.
The intent can later be accessed again using the `playingIntent` property. If you prefer _Promises over callbacks, this method will return a promise you can use in the same way as the callback.
playRawStream(stream, `options`, `callback`)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This method is used in much the same way as `playFile`, except it plays data back from a stream containing audio data instead of a file or URL.
| See voiceConnection.playFile_ for usage information.
This method can be used to play data obtained from an arbitrary call to ffmpeg. Note that the array of options given as the parameter will
still be concatenated with the following options so it can be used with Discord:
..code::
-loglevel 0
-f s16le
-ar 48000
-ac 2
pipe:1
setSpeaking(value)
~~~~~~~~~~~~~~~~~~
Sets whether or not the user is speaking (green circle around user on the official client). discord.js does this automatically when playing something,
but you may want to spoof it or manually disable it.
-**value** - `true` or `false`: whether or not you want the bot to show as speaking
setVolume(volume)
~~~~~~~~~~~~~
Sets the current volume of the connecion. 1.0 is normal, 0.5 is half as loud, 2.0 is twice as loud.
getVolume()
~~~~~~~~~~~~~
Returns the current volume. 1.0 is normal, 0.5 is half as loud, 2.0 is twice as loud.
pause()
~~~~~~~
Pauses the current connection's audio.
resume()
~~~~~~~~
Resumes the current connection's audio.
stopPlaying()
~~~~~~~~~~~~~
Stops the current playback immediately. After this method has finished, it is safe to play something else.
destroy()
~~~~~~~~~
Disconnects from the voice server and destroys all network connection. It's impossible to play anything on this connection afterwards, you will have to re-initiate
a connection using client.joinVoiceChannel_. This method also calls `stopPlaying` internally, you don't have to do that yourself.
Not all of these are standalone examples, many of them are usage examples. If you're a beginner to Discord.js, we encourage you to look through these examples to get a hang of the way things work using the library.
.. warning :: Please do not copy/paste code directly from these examples. Try to learn from and adapt these pieces of code to your specific situation.
.. note :: We use `Template Literals`_ in these examples. These are an ES6 feature and may not be fully supported in your environment. In this case, it is safe to use other methods of concatenating strings.
-----
Logging In
----------
Logs the Client_ in, allowing you to begin working with the Discord API.
Logging in with a username and password
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Do not use a normal user account for large or public bots. This is considered abuse of the API and can land you in trouble.**
This is by far the most common way people will send a message in the Discord API. Here we will send a message to the same Channel_ we received a message from in the above example.
..code-block::javascript
client.on('message',function(message){
// Don't forget to log the message!
client.sendMessage(message.channel,"Hello!");
});
You can also use a `Message`_ resolvable as an parameter. This example does the same thing as above.
..code-block::javascript
client.on('message',function(message){
client.sendMessage(message,"Hello!");
});
You can also directly reply to messages. This does the same as adding an @mention in front of your text.
Sends "@author Hello!"
..code-block::javascript
client.on('message',function(message){
client.reply(message,"Hello!");
});
To a specific server and channel
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sends "Hello" to the default Channel_ in the Server_ "My Server". Note that this does not require any sort of received message to be activated, however if there are multiple servers with the name "My Server", a random one will be chosen.
See Cache_ for more details on getting specific objects and resolvables.
You can also send private messages to a user with a User_ object. This will send "Hello!" as a private message to the original author of the received message.
Do note however, that a PMChannel_ is not the same as a ServerChannel_ and therefore does not have the same properties such as ``server`` and ``name``.
..code-block::javascript
client.on('message',function(message){
client.sendMessage(message.author,"Hello!");
});
-----
Sending files
-----------------
The process of sending files is similar to how you send messages.
The first parameter takes an `Channel Resolvable`_ or `User Resolvable`_. The User Resolvable will send the file as a DM, and the Channel Resolvable will send the file to a text channel.
The next parameter is a `File Resolvable`_.
The third parameter lets you name your file. This is optional.
The fourth parameter lets you add a message. This is optional.
The last parameter is a callback. It takes an error and a `Message`_ object.
URL
~~~~~~~~~~~~~~~~
..code-block::javascript
client.on('message',function(message){
client.sendFile(message,'http://i.imgur.com/6CbxaPc.jpg','kappa.jpg','Check out this cool file!',(err,m)=>{
if(err)console.log(err);
});
});
Local file
~~~~~~~~~~~~~~~~
..code-block::javascript
client.on('message',function(message){
client.sendFile(message,'/assets/dank_meme.jpg','dank_meme.jpg','Check out this cool file!',(err,m)=>{
// Log our bot in using the token from https://discordapp.com/developers/applications/me
client.login('your token here');
```
And here is the result:

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/stable/class/TextChannel?scrollTo=send) to see what other options are available.
```js
// Extract the required classes from the discord.js module
const{Client,Attachment}=require('discord.js');
// Create an instance of a Discord client
constclient=newClient();
/**
* The ready event is vital, it means that only _after_ this will your bot start reacting to information
- **Windows:** `npm install ffmpeg-binaries` 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 node-opus?
- **Ubuntu:** Simply run `npm install node-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 node-opus` in your bot's directory should successfully build it. Woo!
v11.4.0 backports many new features such as Rich Presence and bugfixes from v11.3.0.
See [the changelog](https://github.com/discordjs/discord.js/releases/tag/11.4.0) for a full list of changes, including information about deprecations.
# Version 11.3.0
v11.3.0 backports many new features and bug fixes from the in-development v12.
See [the changelog](https://github.com/discordjs/discord.js/releases/tag/11.3.0) for a full list of changes, including information about deprecations.
# Version 11.2.0
v11.2.0 fixes a lot of bugs we encountered along the 11.1.0 release, as well as support for new features such as Message Attachments and UserGuildSettings.
See [the changelog](https://github.com/discordjs/discord.js/releases/tag/11.2.0) for a full list of changes, including information about deprecations.
# 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
constclient=newDiscord.Client({
disable_everyone:true,
max_message_cache:500,
message_cache_lifetime:120,
message_sweep_interval:60
});
```
v10 code example:
```js
constclient=newDiscord.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
The v11.4 release contains bugfixes from v11.3 and backports features such as Rich Presence.
v12 is still very much a work-in-progress, as we're aiming to make it the best it can possibly be before releasing.
If you are fond of living life on the bleeding-edge, check out the master branch.
## About
discord.js is a powerful [Node.js](https://nodejs.org) module that allows you to interact with the
[Discord API](https://discordapp.com/developers/docs/intro) very easily.
- Object-oriented
- Predictable abstractions
- Performant
- 100% coverage of the Discord API
## Installation
**Node.js 6.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 ([node-opus](https://www.npmjs.com/package/node-opus)): `npm install discord.js node-opus`
With voice support ([opusscript](https://www.npmjs.com/package/opusscript)): `npm install discord.js opusscript`
### Audio engines
The preferred audio engine is node-opus, as it performs significantly better than opusscript. When both are available, discord.js will automatically choose node-opus.
Using opusscript is only recommended for development environments where node-opus is tough to get working.
For production bots, using node-opus should be considered a necessity, especially if they're going to be running on multiple servers.
### Optional packages
- [bufferutil](https://www.npmjs.com/package/bufferutil) to greatly speed up the WebSocket when *not* using uws (`npm install bufferutil`)
- [erlpack](https://github.com/hammerandchisel/erlpack) for significantly faster WebSocket data (de)serialisation (`npm install hammerandchisel/erlpack`)
- One of the following packages can be installed for faster voice packet encryption and decryption:
To install discord.js, you need a few dependencies.
..warning::**When installing with any of these methods, you'll encounter some errors.** This is because an optional dependency isn't working properly, but discord.js should still work fine.
-----------
Windows
-------
------------
- You need `Visual Studio`_ and `Python 2.7`_.
Your Visual Studio installation ideally has to be recent, but you can try installing without it first. You can use **Express, Community, Enteprise** or any others apart from ``VS Code``.
- You (obviously) need `NodeJS`_. Node 4 or higher is recommended.
After you have installed these things, to install just run: ``npm install --save --msvs_version=2015 discord.js`` to install the latest version of discord.js for your project.
Additional Audio Support
~~~~~~~~~~~~~~~~~~~~~~~~
- Install `ffmpeg`_ and add it to your PATH.
-----------
Linux (Debian-based)
-----
-----------
- You (obviously) need `NodeJS Linux`_. Node 4 or higher is recommended.
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-binaries`
* an opus encoder, choose one from below:
*`npm install opusscript`
*`npm install node-opus`
* a good network connection
The preferred opus engine is node-opus, as it performs significantly better than opusscript. When both are available, discord.js will automatically choose node-opus.
Using opusscript is only recommended for development environments where node-opus is tough to get working.
For production bots, using node-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
constDiscord=require('discord.js');
constclient=newDiscord.Client();
client.login('token here');
client.on('message',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.voiceChannel){
message.member.voiceChannel.join()
.then(connection=>{// Connection is an instance of VoiceConnection
message.reply('I have successfully connected to the channel!');
})
.catch(console.log);
}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. The following example shows how to stream an mp3
file:
**Playing a file:**
```js
// To play a file, we need to give an absolute path to it
Your file doesn't have to be just an mp3; ffmpeg can convert videos and audios of many formats.
The `dispatcher` variable is an instance of a `StreamDispatcher`, which manages streaming a specific resource to a voice
channel. We can do many things with the dispatcher, such as finding out when the stream ends or changing the volume:
```js
dispatcher.on('end',()=>{
// The song has finished
});
dispatcher.on('error',e=>{
// Catch any errors that may arise
console.log(e);
});
dispatcher.setVolume(0.5);// Set the volume to 50%
dispatcher.setVolume(1);// Set the volume back to 100%
console.log(dispatcher.time);// The time in milliseconds that the stream dispatcher has been playing for
dispatcher.pause();// Pause the stream
dispatcher.resume();// Carry on playing
dispatcher.end();// End the dispatcher, emits 'end' event
```
If you have an existing [ReadableStream](https://nodejs.org/api/stream.html#stream_readable_streams),
this can also be used:
**Playing a ReadableStream:**
```js
connection.playStream(myReadableStream);
// If you don't want to use absolute paths, you can use
// fs.createReadStream to circumvent it
constfs=require('fs');
conststream=fs.createReadStream('./test.mp3');
connection.playStream(stream);
```
It's important to note that creating a readable stream to a file is less efficient than simply using `connection.playFile()`.
**Playing anything else:**
For anything else, such as a URL to a file, you can use `connection.playArbitraryInput()`. You should consult the [ffmpeg protocol documentation](https://ffmpeg.org/ffmpeg-protocols.html) to see what you can use this for.
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.
## Usage
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:
Occasionally, the API can stop working for whatever reason. If it was working previously and it stopped working on the same version, it means that either we screwed code up or there's been a change to the Discord API. You can try asking around in the `discord.js channel in the API server`_. You could also `make an issue`_ if one relating to a similar issue doesn't exist. Please post a stacktrace if there is one, and be as detailed as possible - *"the API isn't working"* doesn't help at all.
If there is already an issue, feel free to comment that you're also experiencing the same thing. This helps to see how widespread the bug is.
You can try reconnecting before submitting an issue, as sometimes some of the servers may be slightly different.
If you're your bot or client is exiting unexpectedly with no error, this is likely caused by websocket disconnects. Make sure you have ``autoReconnect`` enabled. See `Client`_.
Voice
------
Often, especially if you're on Windows, voice will not work out of the box.
Follow the steps below, one by one.
- Is your system supported? The following are:
- Linux x64 & ia32
- Linux ARM (Raspberry Pi 1 & 2)
- Mac OS X x64
- Windows x64
- Did you install Python 2.7.x correctly? Is it in your PATH? ``python -V``. If not, install it correctly or try reinstalling.
- **Windows** - See https://python.org/downloads/
- **Linux / Mac OS** - Unix systems should already have it installed, but if not, use the OS's package manager
- Did you install FFMPEG correctly? Is it in your PATH? ``ffmpeg -version``. If not, install it correctly or try reinstalling.
- **Windows** - `Follow this guide`_
- **Linux / Mac OS** - Use your OS's package manager
- Did you install the required C++ compiler tool for your OS? If not, install the corresponding program, **then** try reinstalling discord.js ``npm i -S discord.js``
- **Windows** - `Visual Studio 2015`_ with `C++ Support enabled`_
- **Linux** - build-essential
- **Mac OS** - Xcode CLI tools
If you're still having problems try
- ``npm cache clean``
- ``npm config set msvs_version 2015``
- ``npm i -S discord.js``
If nothing of the above helped, feel free to jump on the `discord.js channel in the API server`_
.._discord.js channel in the API server : https://discord.gg/0SBTUU1wZTYcFtmP
.._make an issue : https://github.com/hydrabolt/discord.js/issues
.._Follow this guide : http://adaptivesamples.com/how-to-install-ffmpeg-on-windows/
.._Visual Studio 2015 : https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx
.._C++ Support enabled : https://social.msdn.microsoft.com/Forums/getfile/740020
function_classCallCheck(instance,Constructor){if(!(instanceinstanceofConstructor)){thrownewTypeError("Cannot call a class as a function");}}
function_inherits(subClass,superClass){if(typeofsuperClass!=="function"&&superClass!==null){thrownewTypeError("Super expression must either be null or a function, not "+typeofsuperClass);}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass;}
function_classCallCheck(instance,Constructor){if(!(instanceinstanceofConstructor)){thrownewTypeError("Cannot call a class as a function");}}
function_inherits(subClass,superClass){if(typeofsuperClass!=="function"&&superClass!==null){thrownewTypeError("Super expression must either be null or a function, not "+typeofsuperClass);}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass;}
function_classCallCheck(instance,Constructor){if(!(instanceinstanceofConstructor)){thrownewTypeError("Cannot call a class as a function");}}
function_inherits(subClass,superClass){if(typeofsuperClass!=="function"&&superClass!==null){thrownewTypeError("Super expression must either be null or a function, not "+typeofsuperClass);}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass;}
function_classCallCheck(instance,Constructor){if(!(instanceinstanceofConstructor)){thrownewTypeError("Cannot call a class as a function");}}
function_inherits(subClass,superClass){if(typeofsuperClass!=="function"&&superClass!==null){thrownewTypeError("Super expression must either be null or a function, not "+typeofsuperClass);}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass;}
function_classCallCheck(instance,Constructor){if(!(instanceinstanceofConstructor)){thrownewTypeError("Cannot call a class as a function");}}
function_inherits(subClass,superClass){if(typeofsuperClass!=="function"&&superClass!==null){thrownewTypeError("Super expression must either be null or a function, not "+typeofsuperClass);}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass;}
function_classCallCheck(instance,Constructor){if(!(instanceinstanceofConstructor)){thrownewTypeError("Cannot call a class as a function");}}
function_inherits(subClass,superClass){if(typeofsuperClass!=="function"&&superClass!==null){thrownewTypeError("Super expression must either be null or a function, not "+typeofsuperClass);}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass;}
function_classCallCheck(instance,Constructor){if(!(instanceinstanceofConstructor)){thrownewTypeError("Cannot call a class as a function");}}
function_inherits(subClass,superClass){if(typeofsuperClass!=="function"&&superClass!==null){thrownewTypeError("Super expression must either be null or a function, not "+typeofsuperClass);}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass;}
function_classCallCheck(instance,Constructor){if(!(instanceinstanceofConstructor)){thrownewTypeError("Cannot call a class as a function");}}
function_inherits(subClass,superClass){if(typeofsuperClass!=="function"&&superClass!==null){thrownewTypeError("Super expression must either be null or a function, not "+typeofsuperClass);}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass;}
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.