/** * BetterDiscord Discord API * Copyright (c) 2015-present Jiiks/JsSucks - https://github.com/Jiiks / https://github.com/JsSucks * All rights reserved. * https://betterdiscord.net * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ import { List } from 'structs'; import { User, Channel, Guild, Message } from 'discordstructs'; import { WebpackModules } from './webpackmodules'; export const Modules = { _getModule(name) { const foundModule = WebpackModules.getModuleByName(name); if (!foundModule) return null; delete this[name]; return this[name] = foundModule; }, get ChannelSelector() { return this._getModule('ChannelSelector'); }, get MessageActions() { return this._getModule('MessageActions'); }, get MessageParser() { return this._getModule('MessageParser'); }, get MessageStore() { return this._getModule('MessageStore'); }, get EmojiUtils() { return this._getModule('EmojiUtils'); }, get PermissionUtils() { return this._getModule('Permissions'); }, get SortedGuildStore() { return this._getModule('SortedGuildStore'); }, get PrivateChannelActions() { return this._getModule('PrivateChannelActions'); }, get GuildMemberStore() { return this._getModule('GuildMemberStore'); }, get GuildChannelsStore() { return this._getModule('GuildChannelsStore'); }, get MemberCountStore() { return this._getModule('MemberCountStore'); }, get GuildActions() { return this._getModule('GuildActions'); }, get NavigationUtils() { return this._getModule('NavigationUtils'); }, get GuildPermissions() { return this._getModule('GuildPermissions'); }, get DiscordConstants() { return this._getModule('DiscordConstants'); }, get ChannelStore() { return this._getModule('ChannelStore'); }, get GuildStore() { return this._getModule('GuildStore'); }, get SelectedGuildStore() { return this._getModule('SelectedGuildStore'); }, get SelectedChannelStore() { return this._getModule('SelectedChannelStore'); }, get UserStore() { return this._getModule('UserStore'); }, get RelationshipStore() { return this._getModule('RelationshipStore'); }, get RelationshipManager() { return this._getModule('RelationshipManager'); }, get ChangeNicknameModal() { return this._getModule('ChangeNicknameModal'); }, get UserSettingsStore() { return this._getModule('UserSettingsStore'); }, get UserSettingsWindow() { return this._getModule('UserSettingsWindow'); }, get UserStatusStore() { return this._getModule('UserStatusStore'); }, get ChannelSettingsWindow() { return this._getModule('ChannelSettingsWindow'); }, get GuildSettingsWindow() { return this._getModule('GuildSettingsWindow'); }, get CreateChannelModal() { return this._getModule('CreateChannelModal'); }, get PruneMembersModal() { return this._getModule('PruneMembersModal'); }, get NotificationSettingsModal() { return this._getModule('NotificationSettingsModal'); }, get PrivacySettingsModal() { return this._getModule('PrivacySettingsModal'); }, get UserProfileModal() { return this._getModule('UserProfileModal'); }, get APIModule() { return this._getModule('APIModule'); }, get UserNoteStore() { return this._getModule('UserNoteStore'); }, get DiscordPermissions() { return this.DiscordConstants.Permissions; } }; export default class DiscordApi { static get modules() { return Modules } static get User() { return User } static get Channel() { return Channel } static get Guild() { return Guild } static get Message() { return Message } /** * A list of loaded guilds. * @type {List} */ static get guilds() { const guilds = Modules.GuildStore.getGuilds(); return List.from(Object.entries(guilds), ([i, g]) => Guild.from(g)); } /** * A list of loaded channels. * @type {List} */ static get channels() { const channels = Modules.ChannelStore.getChannels(); return List.from(Object.entries(channels), ([i, c]) => Channel.from(c)); } /** * A list of loaded users. * @type {List} */ static get users() { const users = Modules.UserStore.getUsers(); return List.from(Object.entries(users), ([i, u]) => User.from(u)); } /** * An object mapping guild IDs to their member counts. * @type {Object} */ static get memberCounts() { return Modules.MemberCountStore.getMemberCounts(); } /** * A list of guilds in the order they appear in the server list. * @type {List} */ static get sortedGuilds() { const guilds = Modules.SortedGuildStore.getSortedGuilds(); return List.from(guilds, g => Guild.from(g)); } /** * An array of guild IDs in the order they appear in the server list. * @type {Number[]} */ static get guildPositions() { return Modules.SortedGuildStore.guildPositions; } /** * The currently selected guild. * @type {Guild} */ static get currentGuild() { const guild = Modules.GuildStore.getGuild(Modules.SelectedGuildStore.getGuildId()); if (guild) return Guild.from(guild); } /** * The currently selected channel. * @type {Channel} */ static get currentChannel() { const channel = Modules.ChannelStore.getChannel(Modules.SelectedChannelStore.getChannelId()); if (channel) return Channel.from(channel); } /** * The current user. * @type {User} */ static get currentUser() { const user = Modules.UserStore.getCurrentUser(); if (user) return User.from(user); } /** * A list of the current user's friends. * @type {List} */ static get friends() { const friends = Modules.RelationshipStore.getFriendIDs(); return List.from(friends, id => User.fromId(id)); } /** * User settings */ static get UserSettings() { return UserSettings; } } export class UserSettings { /** * Opens Discord's settings UI. */ static open(section = 'ACCOUNT') { Modules.UserSettingsWindow.setSection(section); Modules.UserSettingsWindow.open(); } /** * The user's current status. Either "online", "idle", "dnd" or "invisible". * @type {String} */ static get status() { return Modules.UserSettingsStore.status } /** * The user's selected explicit content filter level. * 0 == off, 1 == everyone except friends, 2 == everyone * Configurable in the privacy and safety panel. * @type {Number} */ static get explicitContentFilter() { return Modules.UserSettingsStore.explicitContentFilter } /** * Whether to disallow direct messages from server members by default. * @type {Boolean} */ static get defaultGuildsRestricted() { return Modules.UserSettingsStore.defaultGuildsRestricted } /** * An array of guilds to disallow direct messages from their members. * This is bypassed if the member is has another mutual guild with this disabled, or the member is friends with the current user. * Configurable in each server's privacy settings. * @type {Guild[]} */ static get restrictedGuildIds() { return Modules.UserSettingsStore.restrictedGuilds } static get restrictedGuilds() { return List.from(this.restrictedGuildIds, id => Guild.fromId(id) || id); } /** * An array of flags specifying who should be allowed to add the current user as a friend. * If everyone is checked, this will only have one item, "all". Otherwise it has either "mutual_friends", "mutual_guilds", both or neither. * Configurable in the privacy and safety panel. * @type {Array} */ static get friendSourceFlags() { return Object.keys(Modules.UserSettingsStore.friendSourceFlags) } static get friendSourceEveryone() { return this.friendSourceFlags.include('all') } static get friendSourceMutual_friends() { return this.friendSourceFlags.include('all') || this.friendSourceFlags.include('mutual_friends') } static get friendSourceMutual_guilds() { return this.friendSourceFlags.include('all') || this.friendSourceFlags.include('mutual_guilds') } static get friendSourceAnyone() { return this.friendSourceFlags.length > 0 } /** * Whether to automatically add accounts from other platforms running on the user's computer. * Configurable in the connections panel. * @type {Boolean} */ static get detectPlatformAccounts() { return Modules.UserSettingsStore.detectPlatformAccounts } /** * The number of seconds Discord will wait for activity before sending mobile push notifications. * Configurable in the notifications panel. * @type {Number} */ static get afkTimeout() { return Modules.UserSettingsStore.afkTimeout } /** * Whether to display the currently running game as a status message. * Configurable in the games panel. * @type {Boolean} */ static get showCurrentGame() { return Modules.UserSettingsStore.showCurrentGame } /** * Whether to show images uploaded directly to Discord. * Configurable in the text and images panel. * @type {Boolean} */ static get inlineAttachmentMedia() { return Modules.UserSettingsStore.inlineAttachmentMedia } /** * Whether to show images linked in Discord. * Configurable in the text and images panel. * @type {Boolean} */ static get inlineEmbedMedia() { return Modules.UserSettingsStore.inlineEmbedMedia } /** * Whether to automatically play GIFs when the Discord window is active without having to hover the mouse over the image. * Configurable in the text and images panel. * @type {Boolean} */ static get autoplayGifs() { return Modules.UserSettingsStore.gifAutoPlay } /** * Whether to show content from HTTP[s] links as embeds. * Configurable in the text and images panel. * @type {Boolean} */ static get showEmbeds() { return Modules.UserSettingsStore.renderEmbeds } /** * Whether to show a message's reactions. * Configurable in the text and images panel. * @type {Boolean} */ static get showReactions() { return Modules.UserSettingsStore.renderReactions } /** * Whether to play animated emoji. * Configurable in the text and images panel. * @type {Boolean} */ static get animateEmoji() { return Modules.UserSettingsStore.animateEmoji } /** * Whether to convert ASCII emoticons to emoji. * Configurable in the text and images panel. * @type {Boolean} */ static get convertEmoticons() { return Modules.UserSettingsStore.convertEmoticons } /** * Whether to allow playing text-to-speech messages. * Configurable in the text and images panel. * @type {Boolean} */ static get allowTts() { return Modules.UserSettingsStore.enableTTSCommand } /** * The user's selected theme. Either "dark" or "light". * Configurable in the appearance panel. * @type {String} */ static get theme() { return Modules.UserSettingsStore.theme } /** * Whether the user has enabled compact mode. * `true` if compact mode is enabled, `false` if cozy mode is enabled. * Configurable in the appearance panel. * @type {Boolean} */ static get displayCompact() { return Modules.UserSettingsStore.messageDisplayCompact } /** * Whether the user has enabled developer mode. * Currently only adds a "Copy ID" option to the context menu on users, guilds and channels. * Configurable in the appearance panel. * @type {Boolean} */ static get developerMode() { return Modules.UserSettingsStore.developerMode } /** * The user's selected language code. * Configurable in the language panel. * @type {String} */ static get locale() { return Modules.UserSettingsStore.locale } /** * The user's timezone offset in hours. * This is not configurable. * @type {Number} */ static get timezoneOffset() { return Modules.UserSettingsStore.timezoneOffset } }