diff --git a/src/client/Client.js b/src/client/Client.js index f685382d60b0..b6c25f677fce 100644 --- a/src/client/Client.js +++ b/src/client/Client.js @@ -14,7 +14,6 @@ const VoiceBroadcast = require('./voice/VoiceBroadcast'); const UserStore = require('../stores/UserStore'); const ChannelStore = require('../stores/ChannelStore'); const GuildStore = require('../stores/GuildStore'); -const ClientPresenceStore = require('../stores/ClientPresenceStore'); const GuildEmojiStore = require('../stores/GuildEmojiStore'); const { Events, browser } = require('../util/Constants'); const DataResolver = require('../util/DataResolver'); @@ -96,17 +95,10 @@ class Client extends BaseClient { */ this.channels = new ChannelStore(this); - /** - * Presences that have been received for the client user's friends, mapped by user IDs - * This is only filled when using a user account. - * @type {ClientPresenceStore} - */ - this.presences = new ClientPresenceStore(this); - Object.defineProperty(this, 'token', { writable: true }); if (!browser && !this.token && 'CLIENT_TOKEN' in process.env) { /** - * Authorization token for the logged in user/bot + * Authorization token for the logged in bot * This should be kept private at all times. * @type {?string} */ @@ -240,10 +232,6 @@ class Client extends BaseClient { /** * Logs the client in, establishing a websocket connection to Discord. - * Both bot and regular user accounts are supported, but it is highly recommended to use a bot account whenever - * possible. User accounts are subject to harsher ratelimits and other restrictions that don't apply to bot accounts. - * Bot accounts also have access to many features that user accounts cannot utilise. User accounts that are found to - * be abusing/overusing the API will be banned, locking you out of Discord entirely. * @param {string} token Token of the account to log in with * @returns {Promise} Token of the account used * @example @@ -269,20 +257,6 @@ class Client extends BaseClient { return this.manager.destroy(); } - /** - * Requests a sync of guild data with Discord. - * This can be done automatically every 30 seconds by enabling {@link ClientOptions#sync}. - * This is only available when using a user account. - * @param {Guild[]|Collection} [guilds=this.guilds] An array or collection of guilds to sync - */ - syncGuilds(guilds = this.guilds) { - if (this.user.bot) return; - this.ws.send({ - op: 12, - d: guilds instanceof Collection ? guilds.keyArray() : guilds.map(g => g.id), - }); - } - /** * Obtains an invite from Discord. * @param {InviteResolvable} invite Invite code or URL diff --git a/src/client/ClientManager.js b/src/client/ClientManager.js index 2a081e3a71db..b1929cbdebac 100644 --- a/src/client/ClientManager.js +++ b/src/client/ClientManager.js @@ -64,14 +64,9 @@ class ClientManager { destroy() { this.client.ws.destroy(); if (!this.client.user) return Promise.resolve(); - if (this.client.user.bot) { + return this.client.api.logout.post().then(() => { this.client.token = null; - return Promise.resolve(); - } else { - return this.client.api.logout.post().then(() => { - this.client.token = null; - }); - } + }); } } diff --git a/src/errors/Messages.js b/src/errors/Messages.js index 0485296a6426..a4e8362ceb81 100644 --- a/src/errors/Messages.js +++ b/src/errors/Messages.js @@ -6,8 +6,6 @@ const Messages = { TOKEN_INVALID: 'An invalid token was provided.', TOKEN_MISSING: 'Request to use token, but token was unavailable to the client.', - FEATURE_USER_ONLY: 'Only user accounts are able to make use of this feature.', - WS_CONNECTION_TIMEOUT: 'The connection to the gateway timed out.', WS_CONNECTION_EXISTS: 'There is already an existing WebSocket connection.', WS_NOT_OPEN: (data = 'data') => `Websocket not open to send ${data}`, diff --git a/src/index.js b/src/index.js index b89d9ce5674f..9606c66388f0 100644 --- a/src/index.js +++ b/src/index.js @@ -25,7 +25,6 @@ module.exports = { // Stores ChannelStore: require('./stores/ChannelStore'), - ClientPresenceStore: require('./stores/ClientPresenceStore'), GuildChannelStore: require('./stores/GuildChannelStore'), GuildEmojiStore: require('./stores/GuildEmojiStore'), GuildEmojiRoleStore: require('./stores/GuildEmojiRoleStore'), @@ -57,8 +56,6 @@ module.exports = { return require('./structures/ClientUser'); }, ClientUserChannelOverride: require('./structures/ClientUserChannelOverride'), - ClientUserGuildSettings: require('./structures/ClientUserGuildSettings'), - ClientUserSettings: require('./structures/ClientUserSettings'), Collector: require('./structures/interfaces/Collector'), DMChannel: require('./structures/DMChannel'), Emoji: require('./structures/Emoji'), diff --git a/src/rest/RESTManager.js b/src/rest/RESTManager.js index 4ca4cb174c78..ec9d3891f759 100644 --- a/src/rest/RESTManager.js +++ b/src/rest/RESTManager.js @@ -39,8 +39,7 @@ class RESTManager { getAuth() { const token = this.client.token || this.client.accessToken; - const prefixed = !!this.client.application || (this.client.user && this.client.user.bot); - if (token && prefixed) return `${this.tokenPrefix} ${token}`; + if (token && this.client.application) return `${this.tokenPrefix} ${token}`; else if (token) return token; throw new Error('TOKEN_MISSING'); } diff --git a/src/stores/ClientPresenceStore.js b/src/stores/ClientPresenceStore.js deleted file mode 100644 index 94d48d4a424f..000000000000 --- a/src/stores/ClientPresenceStore.js +++ /dev/null @@ -1,80 +0,0 @@ -const PresenceStore = require('./PresenceStore'); -const Collection = require('../util/Collection'); -const { ActivityTypes, OPCodes } = require('../util/Constants'); -const { Presence } = require('../structures/Presence'); -const { TypeError } = require('../errors'); - -/** - * Stores the client presence and other presences. - * @extends {PresenceStore} - */ -class ClientPresenceStore extends PresenceStore { - constructor(...args) { - super(...args); - this.clientPresence = new Presence(this.client, { - status: 'online', - afk: false, - since: null, - activity: null, - }); - } - - async setClientPresence(presence) { - const packet = await this._parse(presence); - this.clientPresence.patch(packet); - this.client.ws.send({ op: OPCodes.STATUS_UPDATE, d: packet }); - return this.clientPresence; - } - - async _parse({ status, since, afk, activity }) { // eslint-disable-line complexity - const applicationID = activity && (activity.application ? activity.application.id || activity.application : null); - let assets = new Collection(); - if (activity) { - if (typeof activity.name !== 'string') throw new TypeError('INVALID_TYPE', 'name', 'string'); - if (!activity.type) activity.type = 0; - if (activity.assets && applicationID) { - try { - const a = await this.client.api.oauth2.applications(applicationID).assets.get(); - for (const asset of a) assets.set(asset.name, asset.id); - } catch (err) { } // eslint-disable-line no-empty - } - } - - const packet = { - afk: afk != null ? afk : false, // eslint-disable-line eqeqeq - since: since != null ? since : null, // eslint-disable-line eqeqeq - status: status || this.clientPresence.status, - game: activity ? { - type: activity.type, - name: activity.name, - url: activity.url, - details: activity.details || undefined, - state: activity.state || undefined, - assets: activity.assets ? { - large_text: activity.assets.largeText || undefined, - small_text: activity.assets.smallText || undefined, - large_image: assets.get(activity.assets.largeImage) || activity.assets.largeImage, - small_image: assets.get(activity.assets.smallImage) || activity.assets.smallImage, - } : undefined, - timestamps: activity.timestamps || undefined, - party: activity.party || undefined, - application_id: applicationID || undefined, - secrets: activity.secrets || undefined, - instance: activity.instance || undefined, - } : null, - }; - - if ((status || afk || since) && !activity) { - packet.game = this.clientPresence.activity; - } - - if (packet.game) { - packet.game.type = typeof packet.game.type === 'number' ? - packet.game.type : ActivityTypes.indexOf(packet.game.type); - } - - return packet; - } -} - -module.exports = ClientPresenceStore; diff --git a/src/stores/GuildStore.js b/src/stores/GuildStore.js index c42bf5e490af..5787fd193301 100644 --- a/src/stores/GuildStore.js +++ b/src/stores/GuildStore.js @@ -39,7 +39,7 @@ class GuildStore extends DataStore { /** * Creates a guild. - * This is only available to bots in less than 10 guilds and user accounts. + * This is only available to bots in less than 10 guilds. * @param {string} name The name of the guild * @param {Object} [options] Options for the creating * @param {string} [options.region] The region for the server, defaults to the closest one available diff --git a/src/stores/MessageStore.js b/src/stores/MessageStore.js index 852f4ebe55bb..7db733eb3cd1 100644 --- a/src/stores/MessageStore.js +++ b/src/stores/MessageStore.js @@ -1,7 +1,6 @@ const DataStore = require('./DataStore'); const Collection = require('../util/Collection'); const Message = require('../structures/Message'); -const { Error } = require('../errors'); /** * Stores messages for text-based channels. @@ -68,12 +67,6 @@ class MessageStore extends DataStore { } async _fetchId(messageID) { - if (!this.client.user.bot) { - const messages = await this._fetchMany({ limit: 1, around: messageID }); - const msg = messages.get(messageID); - if (!msg) throw new Error('MESSAGE_MISSING'); - return msg; - } const data = await this.client.api.channels[this.channel.id].messages[messageID].get(); return this.add(data); } diff --git a/src/structures/ClientApplication.js b/src/structures/ClientApplication.js index f76e98b0a37b..e6cf07016899 100644 --- a/src/structures/ClientApplication.js +++ b/src/structures/ClientApplication.js @@ -174,26 +174,6 @@ class ClientApplication extends Base { } }); } - /** - * Resets the app's secret. - * This is only available when using a user account. - * @returns {Promise} - */ - resetSecret() { - return this.client.api.oauth2.applications[this.id].reset.post() - .then(app => new ClientApplication(this.client, app)); - } - - /** - * Resets the app's bot token. - * This is only available when using a user account. - * @returns {Promise} - */ - resetToken() { - return this.client.api.oauth2.applications[this.id].bot.reset.post() - .then(app => new ClientApplication(this.client, Object.assign({}, this, { bot: app }))); - } - /** * When concatenated with a string, this automatically returns the application's name instead of the * ClientApplication object. diff --git a/src/structures/ClientUser.js b/src/structures/ClientUser.js index cce9957ad071..0929438d99dc 100644 --- a/src/structures/ClientUser.js +++ b/src/structures/ClientUser.js @@ -1,10 +1,5 @@ const Structures = require('../util/Structures'); -const Collection = require('../util/Collection'); -const ClientUserSettings = require('./ClientUserSettings'); -const ClientUserGuildSettings = require('./ClientUserGuildSettings'); -const Util = require('../util/Util'); const DataResolver = require('../util/DataResolver'); -const Guild = require('./Guild'); /** * Represents the logged in client's Discord user. @@ -20,75 +15,8 @@ class ClientUser extends Structures.get('User') { */ this.verified = data.verified; - /** - * The email of this account - * This is only filled when using a user account. - * @type {?string} - */ - this.email = data.email; this._typing = new Map(); - /** - * A Collection of friends for the logged in user - * This is only filled when using a user account. - * @type {Collection} - */ - this.friends = new Collection(); - - /** - * A Collection of blocked users for the logged in user - * This is only filled when using a user account. - * @type {Collection} - */ - this.blocked = new Collection(); - - /** - * A Collection of notes for the logged in user - * This is only filled when using a user account. - * @type {Collection} - */ - this.notes = new Collection(); - - /** - * If the user has Discord premium (nitro) - * This is only filled when using a user account. - * @type {?boolean} - */ - this.premium = typeof data.premium === 'boolean' ? data.premium : null; - - /** - * If the user has MFA enabled on their account - * This is only filled when using a user account. - * @type {?boolean} - */ - this.mfaEnabled = typeof data.mfa_enabled === 'boolean' ? data.mfa_enabled : null; - - /** - * If the user has ever used a mobile device on Discord - * This is only filled when using a user account. - * @type {?boolean} - */ - this.mobile = typeof data.mobile === 'boolean' ? data.mobile : null; - - /** - * Various settings for this user - * This is only filled when using a user account. - * @type {?ClientUserSettings} - */ - this.settings = data.user_settings ? new ClientUserSettings(this, data.user_settings) : null; - - /** - * All of the user's guild settings - * This is only filled when using a user account. - * @type {Collection} - */ - this.guildSettings = new Collection(); - if (data.user_guild_settings) { - for (const settings of data.user_guild_settings) { - this.guildSettings.set(settings.guild_id, new ClientUserGuildSettings(this.client, settings)); - } - } - if (data.token) this.client.token = data.token; } @@ -101,15 +29,7 @@ class ClientUser extends Structures.get('User') { return this.client.presences.clientPresence; } - edit(data, passcode) { - if (!this.bot) { - if (typeof passcode !== 'object') { - data.password = passcode; - } else { - data.code = passcode.mfaCode; - data.password = passcode.password; - } - } + edit(data) { return this.client.api.users('@me').patch({ data }) .then(newData => { this.client.token = newData.token; @@ -122,7 +42,6 @@ class ClientUser extends Structures.get('User') { * Changing usernames in Discord is heavily rate limited, with only 2 requests * every hour. Use this sparingly! * @param {string} username The new username - * @param {string} [password] Current password (only for user accounts) * @returns {Promise} * @example * // Set username @@ -130,43 +49,8 @@ class ClientUser extends Structures.get('User') { * .then(user => console.log(`My new username is ${user.username}`)) * .catch(console.error); */ - setUsername(username, password) { - return this.edit({ username }, password); - } - - /** - * Changes the email for the client user's account. - * This is only available when using a user account. - * @param {string} email New email to change to - * @param {string} password Current password - * @returns {Promise} - * @example - * // Set email - * client.user.setEmail('bob@gmail.com', 'some amazing password 123') - * .then(user => console.log(`My new email is ${user.email}`)) - * .catch(console.error); - */ - setEmail(email, password) { - return this.edit({ email }, password); - } - - /** - * Changes the password for the client user's account. - * This is only available when using a user account. - * @param {string} newPassword New password to change to - * @param {Object|string} options Object containing an MFA code, password or both. - * Can be just a string for the password. - * @param {string} [options.oldPassword] Current password - * @param {string} [options.mfaCode] Timed MFA Code - * @returns {Promise} - * @example - * // Set password - * client.user.setPassword('some new amazing password 456', 'some amazing password 123') - * .then(user => console.log('New password set!')) - * .catch(console.error); - */ - setPassword(newPassword, options) { - return this.edit({ new_password: newPassword }, { password: options.oldPassword, mfaCode: options.mfaCode }); + setUsername(username) { + return this.edit({ username }); } /** @@ -262,36 +146,6 @@ class ClientUser extends Structures.get('User') { return this.setPresence({ afk }); } - /** - * Fetches messages that mentioned the client's user. - * This is only available when using a user account. - * @param {Object} [options={}] Options for the fetch - * @param {number} [options.limit=25] Maximum number of mentions to retrieve - * @param {boolean} [options.roles=true] Whether to include role mentions - * @param {boolean} [options.everyone=true] Whether to include everyone/here mentions - * @param {GuildResolvable} [options.guild] Limit the search to a specific guild - * @returns {Promise} - * @example - * // Fetch mentions - * client.user.fetchMentions() - * .then(console.log) - * .catch(console.error); - * @example - * // Fetch mentions from a guild - * client.user.fetchMentions({ - * guild: '222078108977594368' - * }) - * .then(console.log) - * .catch(console.error); - */ - fetchMentions(options = {}) { - if (options.guild instanceof Guild) options.guild = options.guild.id; - Util.mergeDefault({ limit: 25, roles: true, everyone: true, guild: null }, options); - - return this.client.api.users('@me').mentions.get({ query: options }) - .then(data => data.map(m => this.client.channels.get(m.channel_id).messages.add(m, false))); - } - /** * An object containing either a user or access token, and an optional nickname. * @typedef {Object} GroupDMRecipientOptions diff --git a/src/structures/ClientUserGuildSettings.js b/src/structures/ClientUserGuildSettings.js deleted file mode 100644 index ef1ba9a57bf1..000000000000 --- a/src/structures/ClientUserGuildSettings.js +++ /dev/null @@ -1,60 +0,0 @@ -const { UserGuildSettingsMap } = require('../util/Constants'); -const Collection = require('../util/Collection'); -const ClientUserChannelOverride = require('./ClientUserChannelOverride'); - -/** - * A wrapper around the ClientUser's guild settings. - */ -class ClientUserGuildSettings { - constructor(client, data) { - /** - * The client that created the instance of the ClientUserGuildSettings - * @name ClientUserGuildSettings#client - * @type {Client} - * @readonly - */ - Object.defineProperty(this, 'client', { value: client }); - /** - * The ID of the guild these settings are for - * @type {Snowflake} - */ - this.guildID = data.guild_id; - this.channelOverrides = new Collection(); - this.patch(data); - } - - /** - * Patch the data contained in this class with new partial data. - * @param {Object} data Data to patch this with - * @private - */ - patch(data) { - for (const [key, value] of Object.entries(UserGuildSettingsMap)) { - if (!data.hasOwnProperty(key)) continue; - if (key === 'channel_overrides') { - for (const channel of data[key]) { - const override = this.channelOverrides.get(channel.channel_id); - if (override) override.patch(channel); - else this.channelOverrides.set(channel.channel_id, new ClientUserChannelOverride(channel)); - } - } else if (typeof value === 'function') { - this[value.name] = value(data[key]); - } else { - this[value] = data[key]; - } - } - } - - /** - * Update a specific property of the guild settings. - * @param {string} name Name of property - * @param {*} value Value to patch - * @returns {Promise} - * @private - */ - update(name, value) { - return this.client.api.users('@me').guilds(this.guildID).settings.patch({ data: { [name]: value } }); - } -} - -module.exports = ClientUserGuildSettings; diff --git a/src/structures/ClientUserSettings.js b/src/structures/ClientUserSettings.js deleted file mode 100644 index 20bb82d1a295..000000000000 --- a/src/structures/ClientUserSettings.js +++ /dev/null @@ -1,80 +0,0 @@ -const { UserSettingsMap } = require('../util/Constants'); -const Util = require('../util/Util'); -const { Error } = require('../errors'); - -/** - * A wrapper around the ClientUser's settings. - */ -class ClientUserSettings { - constructor(user, data) { - this.user = user; - this.patch(data); - } - - /** - * Patch the data contained in this class with new partial data. - * @param {Object} data Data to patch this with - * @private - */ - patch(data) { - for (const [key, value] of Object.entries(UserSettingsMap)) { - if (!data.hasOwnProperty(key)) continue; - if (typeof value === 'function') { - this[value.name] = value(data[key]); - } else { - this[value] = data[key]; - } - } - } - - /** - * Update a specific property of of user settings. - * @param {string} name Name of property - * @param {*} value Value to patch - * @returns {Promise} - * @private - */ - update(name, value) { - return this.user.client.api.users['@me'].settings.patch({ data: { [name]: value } }); - } - - /** - * Sets the position of the guild in the guild listing. - * @param {Guild} guild The guild to move - * @param {number} position Absolute or relative position - * @param {boolean} [relative=false] Whether to position relatively or absolutely - * @returns {Promise} - */ - setGuildPosition(guild, position, relative) { - const temp = Object.assign([], this.guildPositions); - Util.moveElementInArray(temp, guild.id, position, relative); - return this.update('guild_positions', temp).then(() => guild); - } - - /** - * Adds a guild to the list of restricted guilds. - * @param {Guild} guild The guild to add - * @returns {Promise} - */ - addRestrictedGuild(guild) { - const temp = Object.assign([], this.restrictedGuilds); - if (temp.includes(guild.id)) return Promise.reject(new Error('GUILD_RESTRICTED', true)); - temp.push(guild.id); - return this.update('restricted_guilds', temp).then(() => guild); - } - - /** - * Removes a guild from the list of restricted guilds. - * @param {Guild} guild The guild to remove - * @returns {Promise} - */ - removeRestrictedGuild(guild) { - const temp = Object.assign([], this.restrictedGuilds); - const index = temp.indexOf(guild.id); - if (index < 0) return Promise.reject(new Error('GUILD_RESTRICTED')); - temp.splice(index, 1); - return this.update('restricted_guilds', temp).then(() => guild); - } -} - -module.exports = ClientUserSettings; diff --git a/src/structures/GroupDMChannel.js b/src/structures/GroupDMChannel.js index 21ab142ea6eb..68709aa69d1c 100644 --- a/src/structures/GroupDMChannel.js +++ b/src/structures/GroupDMChannel.js @@ -182,16 +182,12 @@ class GroupDMChannel extends Channel { * @param {Object} options Options for this method * @param {UserResolvable} options.user User to add to this Group DM * @param {string} [options.accessToken] Access token to use to add the user to this Group DM - * (only available under a bot account) - * @param {string} [options.nick] Permanent nickname to give the user (only available under a bot account) + * @param {string} [options.nick] Permanent nickname to give the user * @returns {Promise} */ addUser({ user, accessToken, nick }) { const id = this.client.users.resolveID(user); - const data = this.client.user.bot ? - { nick, access_token: accessToken } : - { recipient: id }; - return this.client.api.channels[this.id].recipients[id].put({ data }) + return this.client.api.channels[this.id].recipients[id].put({ nick, access_token: accessToken }) .then(() => this); } diff --git a/src/structures/Guild.js b/src/structures/Guild.js index f106647ce371..27afda3ad73d 100644 --- a/src/structures/Guild.js +++ b/src/structures/Guild.js @@ -7,7 +7,6 @@ const Collection = require('../util/Collection'); const Util = require('../util/Util'); const DataResolver = require('../util/DataResolver'); const Snowflake = require('../util/Snowflake'); -const Shared = require('./shared'); const GuildMemberStore = require('../stores/GuildMemberStore'); const RoleStore = require('../stores/RoleStore'); const GuildEmojiStore = require('../stores/GuildEmojiStore'); @@ -343,79 +342,6 @@ class Guild extends Base { return this.client.voice.connections.get(this.id) || null; } - /** - * The position of this guild - * This is only available when using a user account. - * @type {?number} - * @readonly - */ - get position() { - if (this.client.user.bot) return null; - if (!this.client.user.settings.guildPositions) return null; - return this.client.user.settings.guildPositions.indexOf(this.id); - } - - /** - * Whether the guild is muted - * This is only available when using a user account. - * @type {?boolean} - * @readonly - */ - get muted() { - if (this.client.user.bot) return null; - try { - return this.client.user.guildSettings.get(this.id).muted; - } catch (err) { - return false; - } - } - - /** - * The type of message that should notify you - * one of `EVERYTHING`, `MENTIONS`, `NOTHING` - * This is only available when using a user account. - * @type {?string} - * @readonly - */ - get messageNotifications() { - if (this.client.user.bot) return null; - try { - return this.client.user.guildSettings.get(this.id).messageNotifications; - } catch (err) { - return null; - } - } - - /** - * Whether to receive mobile push notifications - * This is only available when using a user account. - * @type {?boolean} - * @readonly - */ - get mobilePush() { - if (this.client.user.bot) return null; - try { - return this.client.user.guildSettings.get(this.id).mobilePush; - } catch (err) { - return false; - } - } - - /** - * Whether to suppress everyone messages - * This is only available when using a user account. - * @type {?boolean} - * @readonly - */ - get suppressEveryone() { - if (this.client.user.bot) return null; - try { - return this.client.user.guildSettings.get(this.id).suppressEveryone; - } catch (err) { - return null; - } - } - /** * The `@everyone` role of the guild * @type {?Role} @@ -588,26 +514,6 @@ class Guild extends Base { .then(data => this.members.add(data)); } - /** - * Performs a search within the entire guild. - * This is only available when using a user account. - * @param {MessageSearchOptions} [options={}] Options to pass to the search - * @returns {Promise} - * @example - * guild.search({ - * content: 'discord.js', - * before: '2016-11-17' - * }) - * .then(res => { - * const hit = res.results[0].find(m => m.hit).content; - * console.log(`I found: **${hit}**, total results: ${res.total}`); - * }) - * .catch(console.error); - */ - search(options = {}) { - return Shared.search(this, options); - } - /** * The data for editing a guild. * @typedef {Object} GuildEditData @@ -804,55 +710,6 @@ class Guild extends Base { return this.edit({ splash: await DataResolver.resolveImage(splash), reason }); } - /** - * Sets the position of the guild in the guild listing. - * This is only available when using a user account. - * @param {number} position Absolute or relative position - * @param {boolean} [relative=false] Whether to position relatively or absolutely - * @returns {Promise} - */ - setPosition(position, relative) { - if (this.client.user.bot) { - return Promise.reject(new Error('FEATURE_USER_ONLY')); - } - return this.client.user.settings.setGuildPosition(this, position, relative); - } - - /** - * Marks all messages in this guild as read. - * This is only available when using a user account. - * @returns {Promise} - */ - acknowledge() { - return this.client.api.guilds(this.id).ack - .post({ data: { token: this.client.rest._ackToken } }) - .then(res => { - if (res.token) this.client.rest._ackToken = res.token; - return this; - }); - } - - /** - * Whether to allow direct messages from guild members. - * This is only available when using a user account. - * @param {boolean} allow Whether to allow direct messages - * @returns {Promise} - */ - allowDMs(allow) { - if (this.client.user.bot) return Promise.reject(new Error('FEATURE_USER_ONLY')); - const settings = this.client.user.settings; - if (allow) return settings.removeRestrictedGuild(this); - else return settings.addRestrictedGuild(this); - } - - /** - * Syncs this guild (already done automatically every 30 seconds). - * This is only available when using a user account. - */ - sync() { - if (!this.client.user.bot) this.client.syncGuilds([this]); - } - /** * The data needed for updating a channel's position. * @typedef {Object} ChannelPosition diff --git a/src/structures/GuildChannel.js b/src/structures/GuildChannel.js index 45e952617b47..21db8fccd925 100644 --- a/src/structures/GuildChannel.js +++ b/src/structures/GuildChannel.js @@ -6,7 +6,6 @@ const PermissionOverwrites = require('./PermissionOverwrites'); const Util = require('../util/Util'); const Permissions = require('../util/Permissions'); const Collection = require('../util/Collection'); -const { MessageNotificationTypes } = require('../util/Constants'); const { Error, TypeError } = require('../errors'); /** @@ -564,37 +563,6 @@ class GuildChannel extends Channel { delete(reason) { return this.client.api.channels(this.id).delete({ reason }).then(() => this); } - - /** - * Whether the channel is muted - * This is only available when using a user account. - * @type {?boolean} - * @readonly - */ - get muted() { - if (this.client.user.bot) return null; - try { - return this.client.user.guildSettings.get(this.guild.id).channelOverrides.get(this.id).muted; - } catch (err) { - return false; - } - } - - /** - * The type of message that should notify you - * one of `EVERYTHING`, `MENTIONS`, `NOTHING`, `INHERIT` - * This is only available when using a user account. - * @type {?string} - * @readonly - */ - get messageNotifications() { - if (this.client.user.bot) return null; - try { - return this.client.user.guildSettings.get(this.guild.id).channelOverrides.get(this.id).messageNotifications; - } catch (err) { - return MessageNotificationTypes[3]; - } - } } module.exports = GuildChannel; diff --git a/src/structures/Message.js b/src/structures/Message.js index b57769a210a5..4cbe00c1e551 100644 --- a/src/structures/Message.js +++ b/src/structures/Message.js @@ -493,20 +493,6 @@ class Message extends Base { return this.channel.send(content, Object.assign(options, { reply: this.member || this.author })); } - /** - * Marks the message as read. - * This is only available when using a user account. - * @returns {Promise} - */ - acknowledge() { - return this.client.api.channels(this.channel.id).messages(this.id).ack - .post({ data: { token: this.client.rest._ackToken } }) - .then(res => { - if (res.token) this.client.rest._ackToken = res.token; - return this; - }); - } - /** * Fetches the webhook used to create this message. * @returns {Promise} diff --git a/src/structures/User.js b/src/structures/User.js index 674583efb35f..30a226b549fc 100644 --- a/src/structures/User.js +++ b/src/structures/User.js @@ -1,6 +1,5 @@ const TextBasedChannel = require('./interfaces/TextBasedChannel'); const { Presence } = require('./Presence'); -const UserProfile = require('./UserProfile'); const Snowflake = require('../util/Snowflake'); const Base = require('./Base'); const { Error } = require('../errors'); @@ -150,16 +149,6 @@ class User extends Base { return `${this.username}#${this.discriminator}`; } - /** - * The note that is set for the user - * This is only available when using a user account. - * @type {?string} - * @readonly - */ - get note() { - return this.client.user.notes.get(this.id) || null; - } - /** * Checks whether the user is typing in a channel. * @param {ChannelResolvable} channel The channel to check in @@ -221,26 +210,6 @@ class User extends Base { .then(data => this.client.actions.ChannelDelete.handle(data).channel); } - /** - * Gets the profile of the user. - * This is only available when using a user account. - * @returns {Promise} - */ - fetchProfile() { - return this.client.api.users(this.id).profile.get().then(data => new UserProfile(this, data)); - } - - /** - * Sets a note for the user. - * This is only available when using a user account. - * @param {string} note The note to set for the user - * @returns {Promise} - */ - setNote(note) { - return this.client.api.users('@me').notes(this.id).put({ data: { note } }) - .then(() => this); - } - /** * Checks if the user is equal to another. It compares ID, username, discriminator, avatar, and bot flags. * It is recommended to compare equality by using `user.id === user2.id` unless you want to compare all properties. diff --git a/src/structures/UserProfile.js b/src/structures/UserProfile.js deleted file mode 100644 index 704cb07482d9..000000000000 --- a/src/structures/UserProfile.js +++ /dev/null @@ -1,83 +0,0 @@ -const Collection = require('../util/Collection'); -const { UserFlags } = require('../util/Constants'); -const UserConnection = require('./UserConnection'); -const Base = require('./Base'); - -/** - * Represents a user's profile on Discord. - * @extends {Base} - */ -class UserProfile extends Base { - constructor(user, data) { - super(user.client); - - /** - * The owner of the profile - * @type {User} - */ - this.user = user; - - /** - * The guilds that the client user and the user share - * @type {Collection} - */ - this.mutualGuilds = new Collection(); - - /** - * The user's connections - * @type {Collection} - */ - this.connections = new Collection(); - - this._patch(data); - } - - _patch(data) { - /** - * If the user has Discord Premium - * @type {boolean} - */ - this.premium = Boolean(data.premium_since); - - /** - * The Bitfield of the users' flags - * @type {number} - * @private - */ - this._flags = data.user.flags; - - /** - * The date since which the user has had Discord Premium - * @type {?Date} - */ - this.premiumSince = data.premium_since ? new Date(data.premium_since) : null; - - for (const guild of data.mutual_guilds) { - if (this.client.guilds.has(guild.id)) { - this.mutualGuilds.set(guild.id, this.client.guilds.get(guild.id)); - } - } - for (const connection of data.connected_accounts) { - this.connections.set(connection.id, new UserConnection(this.user, connection)); - } - } - - /** - * The flags the user has - * @type {UserFlags[]} - * @readonly - */ - get flags() { - const flags = []; - for (const [name, flag] of Object.entries(UserFlags)) { - if ((this._flags & flag) === flag) flags.push(name); - } - return flags; - } - - toJSON() { - return super.toJSON({ flags: true }); - } -} - -module.exports = UserProfile; diff --git a/src/structures/interfaces/TextBasedChannel.js b/src/structures/interfaces/TextBasedChannel.js index 9659a61c04d8..37da0f60299e 100644 --- a/src/structures/interfaces/TextBasedChannel.js +++ b/src/structures/interfaces/TextBasedChannel.js @@ -119,23 +119,6 @@ class TextBasedChannel { return Shared.sendMessage(this, options); } - /** - * Performs a search within the channel. - * This is only available when using a user account. - * @param {MessageSearchOptions} [options={}] Options to pass to the search - * @returns {Promise} - * @example - * channel.search({ content: 'discord.js', before: '2016-11-17' }) - * .then(res => { - * const hit = res.results[0].find(m => m.hit).content; - * console.log(`I found: **${hit}**, total results: ${res.total}`); - * }) - * .catch(console.error); - */ - search(options = {}) { - return Shared.search(this, options); - } - /** * Starts a typing indicator in the channel. * @param {number} [count=1] The number of times startTyping should be considered to have been called @@ -316,21 +299,6 @@ class TextBasedChannel { throw new TypeError('MESSAGE_BULK_DELETE_TYPE'); } - /** - * Marks all messages in this channel as read. - * This is only available when using a user account. - * @returns {Promise} - */ - acknowledge() { - if (!this.lastMessageID) return Promise.resolve(this); - return this.client.api.channels[this.id].messages[this.lastMessageID].ack - .post({ data: { token: this.client.rest._ackToken } }) - .then(res => { - if (res.token) this.client.rest._ackToken = res.token; - return this; - }); - } - static applyToClass(structure, full = false, ignore = []) { const props = ['send']; if (full) { diff --git a/src/util/Constants.js b/src/util/Constants.js index 65b275a358df..7b5ed1df9ff6 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -21,7 +21,6 @@ const browser = exports.browser = typeof window !== 'undefined'; * @property {boolean} [fetchAllMembers=false] Whether to cache all guild members and users upon startup, as well as * upon joining a guild (should be avoided whenever possible) * @property {boolean} [disableEveryone=false] Default value for {@link MessageOptions#disableEveryone} - * @property {boolean} [sync=false] Whether to periodically sync guilds (for user accounts) * @property {number} [restWsBridgeTimeout=5000] Maximum time permitted between REST responses and their * corresponding websocket events * @property {number} [restTimeOffset=500] Extra time in millseconds to wait before continuing to make REST @@ -46,7 +45,6 @@ exports.DefaultOptions = { messageSweepInterval: 0, fetchAllMembers: false, disableEveryone: false, - sync: false, restWsBridgeTimeout: 5000, disabledEvents: [], restTimeOffset: 500, @@ -382,13 +380,6 @@ exports.ExplicitContentFilterTypes = [ 'FRIENDS_AND_NON_FRIENDS', ]; -exports.MessageNotificationTypes = [ - 'EVERYTHING', - 'MENTIONS', - 'NOTHING', - 'INHERIT', -]; - exports.UserSettingsMap = { /** * Automatically convert emoticons in your messages to emoji,