diff --git a/packages/discord-types/src/stores/SpotifyStore.d.ts b/packages/discord-types/src/stores/SpotifyStore.d.ts index 64cf08c5d..52574d9a5 100644 --- a/packages/discord-types/src/stores/SpotifyStore.d.ts +++ b/packages/discord-types/src/stores/SpotifyStore.d.ts @@ -32,6 +32,7 @@ export interface SpotifySocketAndDevice { export interface SpotifyArtist { id: string; name: string; + external_urls: { spotify: string; }; } export interface SpotifyImage { diff --git a/packages/discord-types/src/stores/UserGuildSettingsStore.d.ts b/packages/discord-types/src/stores/UserGuildSettingsStore.d.ts index 147879c65..ea1f9d632 100644 --- a/packages/discord-types/src/stores/UserGuildSettingsStore.d.ts +++ b/packages/discord-types/src/stores/UserGuildSettingsStore.d.ts @@ -69,7 +69,7 @@ export class UserGuildSettingsStore extends FluxStore { getPendingChannelUpdates(guildId: string): Record; getState(): UserGuildSettingsState; isCategoryMuted(guildId: string, channelId: string): boolean; - isChannelMuted(guildId: string, channelId: string): boolean; + isChannelMuted(guildId: string | null, channelId: string): boolean; isChannelOptedIn(guildId: string, channelId: string, usePending?: boolean): boolean; isChannelOrParentOptedIn(guildId: string, channelId: string, usePending?: boolean): boolean; isChannelRecordOrParentOptedIn(channel: Channel, usePending?: boolean): boolean; diff --git a/src/equicordplugins/findReply/ReplyNavigator.tsx b/src/equicordplugins/findReply/ReplyNavigator.tsx index c5aa6b158..36611aef6 100644 --- a/src/equicordplugins/findReply/ReplyNavigator.tsx +++ b/src/equicordplugins/findReply/ReplyNavigator.tsx @@ -13,7 +13,7 @@ import { findComponentByCodeLazy, findCssClassesLazy } from "@webpack"; import { React, useRef, useState } from "@webpack/common"; const CloseButton = findComponentByCodeLazy("CLOSE_BUTTON_LABEL"); -import { MutableRefObject } from "react"; +import type { RefObject } from "react"; import { jumper } from "./index"; @@ -22,7 +22,7 @@ const containerStyles = findCssClassesLazy("containerBottom", "containerTop"); export default function ReplyNavigator({ replies }: { replies: Message[]; }) { const [page, setPage] = useState(1); const [visible, setVisible] = useState(true); - const ref: MutableRefObject = useRef(null); + const ref: RefObject = useRef(null); React.useEffect(() => { setPage(1); setVisible(true); diff --git a/src/equicordplugins/instantScreenshare/utils.tsx b/src/equicordplugins/instantScreenshare/utils.tsx index 72fbe75d3..496938046 100644 --- a/src/equicordplugins/instantScreenshare/utils.tsx +++ b/src/equicordplugins/instantScreenshare/utils.tsx @@ -11,7 +11,7 @@ import { Paragraph } from "@components/Paragraph"; import { IS_WINDOWS } from "@utils/constants"; import { Logger } from "@utils/Logger"; import { OptionType } from "@utils/types"; -import { findByCodeLazy, findByPropsLazy } from "@webpack"; +import { findByCodeLazy } from "@webpack"; import { MediaEngineStore, SearchableSelect, useEffect, useState } from "@webpack/common"; interface PickerProps { @@ -20,7 +20,6 @@ interface PickerProps { } const getDesktopSources = findByCodeLazy("desktop sources"); -const configModule = findByPropsLazy("getOutputVolume"); const log = new Logger("InstantScreenShare"); export const settings = definePluginSettings({ @@ -73,7 +72,7 @@ export async function getCurrentMedia() { if (settings.store.includeVideoDevices) { try { - const videoDevices = Object.values(configModule.getVideoDevices() || {}); + const videoDevices = Object.values(MediaEngineStore.getVideoDevices() || {}); const videoSources = videoDevices.map((device: any) => ({ id: device.id, name: device.name, @@ -127,7 +126,7 @@ function ScreenSetting() { if (includeVideoDevices) { try { - const videoDevices = Object.values(configModule.getVideoDevices() || {}); + const videoDevices = Object.values(MediaEngineStore.getVideoDevices() || {}); const videoSources = videoDevices.map((device: any) => ({ id: device.id, name: device.name, diff --git a/src/equicordplugins/loginWithQR/ui/modals/QrModal.tsx b/src/equicordplugins/loginWithQR/ui/modals/QrModal.tsx index f6da905fa..77bdd2044 100644 --- a/src/equicordplugins/loginWithQR/ui/modals/QrModal.tsx +++ b/src/equicordplugins/loginWithQR/ui/modals/QrModal.tsx @@ -9,7 +9,6 @@ import { QrCodeIcon } from "@components/Icons"; import { wrapTab } from "@components/settings"; import loginWithQR from "@equicordplugins/loginWithQR"; import { images } from "@equicordplugins/loginWithQR/images"; -import { findByPropsLazy } from "@webpack"; import { RestAPI, useEffect, @@ -17,7 +16,7 @@ import { useState, } from "@webpack/common"; import jsQR, { QRCode } from "jsqr"; -import { MutableRefObject, ReactElement } from "react"; +import type { ReactElement, RefObject } from "react"; import { cl, Spinner, SpinnerTypes } from ".."; import openVerifyModal from "./VerifyModal"; @@ -43,7 +42,7 @@ interface QrModalProps { location?: QRCode["location"] ) => Promise; } -type QrModalPropsRef = MutableRefObject; +type QrModalPropsRef = RefObject; const limitSize = (width: number, height: number) => { if (width > height) { @@ -55,14 +54,11 @@ const limitSize = (width: number, height: number) => { } }; -const { getVideoDeviceId } = findByPropsLazy("getVideoDeviceId"); - const tokenRegex = /^https:\/\/discord\.com\/ra\/([\w-]+)$/; const verifyUrl = async ( token: string, { current: modalProps }: QrModalPropsRef ) => { - // yay let handshake: string | null = null; try { const res = await RestAPI.post({ diff --git a/src/equicordplugins/messageLoggerEnhanced/utils/contextMenu.tsx b/src/equicordplugins/messageLoggerEnhanced/utils/contextMenu.tsx index c04c9366b..97a9f65e2 100644 --- a/src/equicordplugins/messageLoggerEnhanced/utils/contextMenu.tsx +++ b/src/equicordplugins/messageLoggerEnhanced/utils/contextMenu.tsx @@ -6,20 +6,17 @@ import { addContextMenuPatch, NavContextMenuPatchCallback, removeContextMenuPatch } from "@api/ContextMenu"; import { updateMessage } from "@api/MessageUpdater"; -import { findStoreLazy } from "@webpack"; -import { FluxDispatcher, Menu, MessageActions, React, Toasts, UserStore } from "@webpack/common"; +import { FluxDispatcher, Menu, MessageActions, React, SortedGuildStore, Toasts, UserStore } from "@webpack/common"; import { openLogModal } from "../components/LogsModal"; import { deleteMessageIDB } from "../db"; import { settings } from "../index"; import { addToXAndRemoveFromOpposite, ListType, removeFromX } from "."; -const SortedGuildStore = findStoreLazy("SortedGuildStore"); - const idFunctions = { Folder: props => props?.folderId && - SortedGuildStore?.getGuildFolders?.().find(f => f?.folderId === props.folderId)?.guildIds, + SortedGuildStore.getGuildFolders().find(f => f?.folderId === props.folderId)?.guildIds, Server: props => props?.guild?.id, User: props => props?.message?.author?.id || props?.user?.id, Channel: props => props.message?.channel_id || props.channel?.id diff --git a/src/equicordplugins/toastNotifications/index.tsx b/src/equicordplugins/toastNotifications/index.tsx index 9100341f9..778a28955 100644 --- a/src/equicordplugins/toastNotifications/index.tsx +++ b/src/equicordplugins/toastNotifications/index.tsx @@ -9,12 +9,12 @@ import { Button } from "@components/Button"; import { EquicordDevs } from "@utils/constants"; import definePlugin, { makeRange, OptionType } from "@utils/types"; import { Channel, Message } from "@vencord/discord-types"; -import { findByPropsLazy, findStore } from "@webpack"; -import { ChannelStore, IconUtils, MessageStore, NavigationRouter, PresenceStore, RelationshipStore, SelectedChannelStore, StreamerModeStore, UserStore } from "@webpack/common"; +import { UserNotificationSetting } from "@vencord/discord-types/enums"; +import { findByPropsLazy } from "@webpack"; +import { ChannelStore, IconUtils, MessageStore, NavigationRouter, PresenceStore, RelationshipStore, SelectedChannelStore, StreamerModeStore, UserGuildSettingsStore, UserStore } from "@webpack/common"; import { setContainerPosition, showNotification, teardownNotifications } from "./components/Notifications"; -const MuteStore = findByPropsLazy("isSuppressEveryoneEnabled"); const SelectedChannelActionCreators = findByPropsLazy("selectPrivateChannel"); const ChannelRTCActions = findByPropsLazy("updateChatOpen", "toggleParticipants"); @@ -23,12 +23,6 @@ const ID_REGEX = /^\d{17,20}$/; let ignoredUsers: string[] = []; let notifyFor: string[] = []; -enum NotificationLevel { - ALL_MESSAGES = 0, - ONLY_MENTIONS = 1, - NO_MESSAGES = 2 -} - export const settings = definePluginSettings({ position: { type: OptionType.SELECT, @@ -147,7 +141,7 @@ export default definePlugin({ if ( (!settings.store.directMessages && channel.isDM()) // If DM notifications are disabled. || (!settings.store.groupMessages && channel.isGroupDM()) // If group DM notifications are disabled. - || MuteStore.isChannelMuted(null, channel.id) // If the user has muted the DM/group channel. + || UserGuildSettingsStore.isChannelMuted(null, channel.id) // If the user has muted the DM/group channel. ) return; } @@ -208,19 +202,19 @@ function shouldNotifyForGuildMessage(message: Message, channel: Channel): boolea if (settings.store.friendServerNotifications && RelationshipStore.isFriend(message.author.id)) return true; // Respect the user's mute state for the guild/category/channel. - if (MuteStore.isGuildOrCategoryOrChannelMuted(channel.guild_id, channel.id)) return false; + if (UserGuildSettingsStore.isGuildOrCategoryOrChannelMuted(channel.guild_id, channel.id)) return false; // Resolve the user's configured notification level for the channel/guild. - const userGuildSettings = findStore("UserGuildSettingsStore").getAllSettings().userGuildSettings[channel.guild_id]; + const userGuildSettings = UserGuildSettingsStore.getAllSettings().userGuildSettings[channel.guild_id]; if (!userGuildSettings) return false; const channelOverride = userGuildSettings.channel_overrides?.[channel.id]; - const level: NotificationLevel = (channelOverride && typeof channelOverride === "object" && "message_notifications" in channelOverride) + const level: UserNotificationSetting = (channelOverride && typeof channelOverride === "object" && "message_notifications" in channelOverride) ? channelOverride.message_notifications - : (typeof userGuildSettings.message_notifications === "number" ? userGuildSettings.message_notifications : NotificationLevel.NO_MESSAGES); + : (typeof userGuildSettings.message_notifications === "number" ? userGuildSettings.message_notifications : UserNotificationSetting.NO_MESSAGES); - if (level === NotificationLevel.NO_MESSAGES) return false; - if (level === NotificationLevel.ALL_MESSAGES) return true; + if (level === UserNotificationSetting.NO_MESSAGES) return false; + if (level === UserNotificationSetting.ALL_MESSAGES) return true; // Otherwise we only notify if the user was mentioned. return message.content.includes(`<@${UserStore.getCurrentUser().id}>`); diff --git a/src/equicordplugins/vcPanelSettings/index.tsx b/src/equicordplugins/vcPanelSettings/index.tsx index 2d34c423e..7547807ca 100644 --- a/src/equicordplugins/vcPanelSettings/index.tsx +++ b/src/equicordplugins/vcPanelSettings/index.tsx @@ -13,9 +13,8 @@ import { Link } from "@components/Link"; import { Devs } from "@utils/constants"; import { identity } from "@utils/misc"; import definePlugin, { OptionType } from "@utils/types"; -import { findByPropsLazy } from "@webpack"; -import { FluxDispatcher, Select, Slider, useEffect, useState } from "@webpack/common"; -const configModule = findByPropsLazy("getOutputVolume"); +import { VideoDevice } from "@vencord/discord-types"; +import { FluxDispatcher, MediaEngineStore, Select, Slider, useEffect, useState } from "@webpack/common"; const settings = definePluginSettings({ title1: { @@ -91,10 +90,10 @@ const settings = definePluginSettings({ }); function OutputVolumeComponent() { - const [outputVolume, setOutputVolume] = useState(configModule.getOutputVolume()); + const [outputVolume, setOutputVolume] = useState(MediaEngineStore.getOutputVolume()); useEffect(() => { - const listener = () => setOutputVolume(configModule.getOutputVolume()); + const listener = () => setOutputVolume(MediaEngineStore.getOutputVolume()); FluxDispatcher.subscribe("AUDIO_SET_OUTPUT_VOLUME", listener); return () => FluxDispatcher.unsubscribe("AUDIO_SET_OUTPUT_VOLUME", listener); }, []); @@ -113,10 +112,10 @@ function OutputVolumeComponent() { } function InputVolumeComponent() { - const [inputVolume, setInputVolume] = useState(configModule.getInputVolume()); + const [inputVolume, setInputVolume] = useState(MediaEngineStore.getInputVolume()); useEffect(() => { - const listener = () => setInputVolume(configModule.getInputVolume()); + const listener = () => setInputVolume(MediaEngineStore.getInputVolume()); FluxDispatcher.subscribe("AUDIO_SET_INPUT_VOLUME", listener); return () => FluxDispatcher.unsubscribe("AUDIO_SET_INPUT_VOLUME", listener); }, []); @@ -135,10 +134,10 @@ function InputVolumeComponent() { } function OutputDeviceComponent() { - const [outputDevice, setOutputDevice] = useState(configModule.getOutputDeviceId()); + const [outputDevice, setOutputDevice] = useState(MediaEngineStore.getOutputDeviceId()); useEffect(() => { - const listener = () => setOutputDevice(configModule.getOutputDeviceId()); + const listener = () => setOutputDevice(MediaEngineStore.getOutputDeviceId()); FluxDispatcher.subscribe("AUDIO_SET_OUTPUT_DEVICE", listener); return () => FluxDispatcher.unsubscribe("AUDIO_SET_OUTPUT_DEVICE", listener); }, []); @@ -146,7 +145,7 @@ function OutputDeviceComponent() { return ( <> {settings.store.showOutputDeviceHeader && Output device} - { return { value: device.id, label: settings.store.showOutputDeviceHeader ? device.name : `🔊 ${device.name}` }; })} serialize={identity} @@ -164,10 +163,10 @@ function OutputDeviceComponent() { } function InputDeviceComponent() { - const [inputDevice, setInputDevice] = useState(configModule.getInputDeviceId()); + const [inputDevice, setInputDevice] = useState(MediaEngineStore.getInputDeviceId()); useEffect(() => { - const listener = () => setInputDevice(configModule.getInputDeviceId()); + const listener = () => setInputDevice(MediaEngineStore.getInputDeviceId()); FluxDispatcher.subscribe("AUDIO_SET_INPUT_DEVICE", listener); return () => FluxDispatcher.unsubscribe("AUDIO_SET_INPUT_DEVICE", listener); }, []); @@ -175,7 +174,7 @@ function InputDeviceComponent() { return (
{settings.store.showInputDeviceHeader && Input device} - { return { value: device.id, label: settings.store.showInputDeviceHeader ? device.name : `🎤 ${device.name}` }; })} serialize={identity} @@ -193,10 +192,10 @@ function InputDeviceComponent() { } function VideoDeviceComponent() { - const [videoDevice, setVideoDevice] = useState(configModule.getVideoDeviceId()); + const [videoDevice, setVideoDevice] = useState(MediaEngineStore.getVideoDeviceId()); useEffect(() => { - const listener = () => setVideoDevice(configModule.getVideoDeviceId()); + const listener = () => setVideoDevice(MediaEngineStore.getVideoDeviceId()); FluxDispatcher.subscribe("MEDIA_ENGINE_SET_VIDEO_DEVICE", listener); return () => FluxDispatcher.unsubscribe("MEDIA_ENGINE_SET_VIDEO_DEVICE", listener); }, []); @@ -204,7 +203,7 @@ function VideoDeviceComponent() { return (
{settings.store.showVideoDeviceHeader && Camera} - { return { value: device.id, label: settings.store.showVideoDeviceHeader ? device.name : `📷 ${device.name}` }; })} serialize={identity} diff --git a/src/plugins/spotifyShareCommands/index.ts b/src/plugins/spotifyShareCommands/index.ts index b0d5e0fd2..f7982437a 100644 --- a/src/plugins/spotifyShareCommands/index.ts +++ b/src/plugins/spotifyShareCommands/index.ts @@ -20,50 +20,17 @@ import { ApplicationCommandInputType, findOption, OptionalMessageOption, sendBot import { Devs } from "@utils/constants"; import { sendMessage } from "@utils/discord"; import definePlugin from "@utils/types"; -import { Command } from "@vencord/discord-types"; -import { findByPropsLazy } from "@webpack"; -import { FluxDispatcher, MessageActions, PendingReplyStore } from "@webpack/common"; +import { Command, SpotifyTrack } from "@vencord/discord-types"; +import { FluxDispatcher, MessageActions, PendingReplyStore, SpotifyStore } from "@webpack/common"; -interface Album { - id: string; - image: { - height: number; - width: number; - url: string; - }; - name: string; -} - -interface Artist { - external_urls: { - spotify: string; - }; - href: string; - id: string; - name: string; - type: "artist" | string; - uri: string; -} - -interface Track { - id: string | null; - album: Album; - artists: Artist[]; - duration: number; - isLocal: boolean; - name: string; -} - -const Spotify = findByPropsLazy("getPlayerState"); - -function makeCommand(name: string, formatUrl: (track: Track) => string): Command { +function makeCommand(name: string, formatUrl: (track: SpotifyTrack) => string): Command { return { name, description: `Share your current Spotify ${name} in chat`, inputType: ApplicationCommandInputType.BUILT_IN, options: [OptionalMessageOption], execute(options, { channel }) { - const track: Track | null = Spotify.getTrack(); + const track = SpotifyStore.getTrack(); if (!track) { return sendBotMessage(channel.id, { content: "You're not listening to any music."