diff --git a/README.md b/README.md index fb3996c..44ff7b4 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,10 @@ Make your experience better with spotify links. Like Playing directly or adding in queue. (Also opening directly in app) Direct Download Link: -[![dev.yofukashino.Distify.asar](https://img.shields.io/github/downloads/YofukashiNo/MessageLinkEmbeds/total.svg?style=social&label=Direct%20Download)](https://github.com/YofukashiNo/Distify/releases/latest/download/dev.yofukashino.Distify.asar) +[![dev.yofukashino.Distify.asar](https://img.shields.io/github/downloads/YofukashiNo/Distify/total.svg?style=social&label=Direct%20Download)](https://github.com/YofukashiNo/Distify/releases/latest/download/dev.yofukashino.Distify.asar) Install Link: -[![Safe](https://img.shields.io/github/downloads/YofukashiNo/MessageLinkEmbeds/total.svg?style=social&label=Install%20in%20Replugged&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMjQ1NzkgMjQ1NzkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnNYbGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sU3BhY2U9InByZXNlcnZlIiB4bWxuczpzZXJpZj0iaHR0cDovL3d3dy5zZXJpZi5jb20vIiBjbGFzcz0iX3BsdWdfM2J3NmNfMjIiIHN0eWxlPSJmaWxsLXJ1bGU6IGV2ZW5vZGQ7IGNsaXAtcnVsZTogZXZlbm9kZDsgc3Ryb2tlLWxpbmVqb2luOiByb3VuZDsiPjxnPjxjbGlwUGF0aCBpZD0iX2NsaXAxIj48cGF0aCBkPSJNMjIyMjAuMywyMjQ3NC44YzM5LjI1LDQ0LjU3MSA3MS40NjcsOTQuODcxIDk1LjU0MiwxNDkuMTYzYzE2NC4wOTYsMzY4LjQyNSAxNjIuNDI5LDc5Ni42MDggLTE3Ljk0MiwxMTcwLjFjLTQzLjE0MSw4OS4zMzMgLTk1LjA4NywxNzIuNiAtMTU0LjUwOCwyNDguOTcxYy0yODEuNzMzLDM2My41NjcgLTc2OS43NjcsNDk3LjI5NiAtMTE5Ny40OCwzMjguMTI5Yy0xNzc3LjgyLC02NzguMzc1IC00MTIxLjMyLC0xMjgyLjAzIC01NjcwLjA0LC0yMTQ1Ljg1Yy0zMDExLjE4LC0xNjc5LjU0IC01MDg0LjY3LC0zMjgzLjI4IC0zNjQ2LjE3LC03NzMxLjI5YzI2LjEzNywtODAuODgzIDk4LjgxNiwtMTM3Ljc1NCAxODMuNjA4LC0xNDMuNjcxYzE4MDUuNzcsLTEzNy4xMDggMzQxMC40LC0xMzkyLjE5IDM5MDUuNzIsLTMyNDAuNzVjMTYwLjg1LC02MDAuMzEyIDMxMi4yMjksLTExNjUuMjYgNDMyLjc3NSwtMTYxNS4xNWM3MC44NTgsLTI2NC40NDEgMzMuNzYyLC01NDYuMiAtMTAzLjEyMSwtNzgzLjI5MWMtMTM2Ljg4NywtMjM3LjA5MiAtMzYyLjM1LC00MTAuMDk2IC02MjYuNzkyLC00ODAuOTVsLTQyMi42NzksLTExMy4yNTlsODc4LjQ5MiwtMzI3OC41OGM1MC40NSwtMTg4LjI3MSAyNC4wMzcsLTM4OC44NzUgLTczLjQxNywtNTU3LjY3NWMtOTcuNDU4LC0xNjguOCAtMjU3Ljk3OSwtMjkxLjk3MSAtNDQ2LjI1LC0zNDIuNDE3Yy0xODguMjcxLC01MC40NSAtMzg4Ljg3NSwtMjQuMDM3IC01NTcuNjc1LDczLjQxN2MtMTY4LjgsOTcuNDU4IC0yOTEuOTcxLDI1Ny45NzkgLTM0Mi40MTcsNDQ2LjI1bC04NzguNDkxLDMyNzguNThsLTI3OTguNTUsLTc0OS44NjZsODc4LjQ5NiwtMzI3OC41OGM1MC40NDYsLTE4OC4yNyAyNC4wMzcsLTM4OC44NyAtNzMuNDIxLC01NTcuNjdjLTk3LjQ1NCwtMTY4LjggLTI1Ny45NzUsLTI5MS45NzUgLTQ0Ni4yNSwtMzQyLjQyMWMtMC4xMzMsLTAuMDM4IC0wLjI2NywtMC4wNzEgLTAuNDA0LC0wLjEwOWMtMTg4LjE2MywtNTAuNDIgLTM4OC42NSwtMjQuMDI1IC01NTcuMzU0LDczLjM4Yy0xNjguNzA1LDk3LjQgLTI5MS44MDUsMjU3LjgyOSAtMzQyLjIyNSw0NDUuOTkxbC04NzguNiwzMjc4Ljk5bC00MjIuNjgsLTExMy4yNTljLTI2NC40NDEsLTcwLjg1OCAtNTQ2LjIsLTMzLjc2MiAtNzgzLjI5MSwxMDMuMTIxYy0yMzcuMDkyLDEzNi44ODQgLTQxMC4wOTYsMzYyLjM0NiAtNDgwLjk1NCw2MjYuNzg4Yy0xMjAuNTUsNDQ5Ljg5NiAtMjcxLjkyNSwxMDE0Ljg0IC00MzIuNzgsMTYxNS4xNWMtNDc4LjM3NSwxNzg1LjMzIDIxNi4xMjUsMzYwOC42IDE2MTEuMTUsNDY1MS43MWM3Mi4zODgsNTMuMzg4IDEwMi4yNSwxNDcuMjU4IDc0LjAxNywyMzIuNjU4Yy0xNzAzLjcsNTE1OC41IDM5MC43NzEsNzY5NS42MiAyMzc2LjIsOTI4Mi4zM2M0MTMuODA4LDMzMC43MDQgODY2LjUzOCw2NDIuNDIxIDEzNDAuNjQsOTMxLjYwNGMxMzIuMjQyLDgxLjA2NyAxOTQuNDgzLDI0MC4xNSAxNTIuMzY3LDM4OS40MzNjLTQyLjExNywxNDkuMjg0IC0xNzguMzI2LDI1Mi4zODQgLTMzMy40MzQsMjUyLjM4NGMtMjgzNy4yOCwwLjc3MSAtOTE5OC41NCwwLjc3MSAtOTE5OC41NCwwLjc3MWMtNzY3LjA2MiwtMCAtMTM4OC44OSwtNjIxLjgyNSAtMTM4OC44OSwtMTM4OC44OWwtMCwtMjE4MDAuMmMtMCwtMzY4LjUzMyAxNDYuNDcxLC03MjEuOTYyIDQwNy4xNjIsLTk4Mi40NThjMjYwLjY5MiwtMjYwLjQ5NiA2MTQuMjMsLTQwNi43MDQgOTgyLjc2MywtNDA2LjQyOWMzNjA5LjE3LDIuNyAxMzAwMCw5LjcyMSAxMzAwMCw5LjcyMWMxNjM2LjAzLC0wIDMyMDUuMDYsNjQ5LjkxMiA0MzYxLjkyLDE4MDYuNzZjMTE1Ni44NSwxMTU2Ljg1IDE4MDYuNzYsMjcyNS44OCAxODA2Ljc2LDQzNjEuOTJsMCw0NDUwLjc1YzAsMTYzNi4wMyAtNjQ5LjkxMiwzMjA1LjA2IC0xODA2Ljc2LDQzNjEuOTJjLTE0OTMuNDYsMTQ5My40NSAtMTU2OS41NSwzODkwLjMgLTE3My44MjEsNTQ3NS40NmM4NzguMyw5OTcuNTE3IDE1NzkuNjUsMTc5NC4wNSAxNzY3LjM2LDIwMDcuMjVsLTAuMDA0LDAuMDQxWiI+PC9wYXRoPjwvY2xpcFBhdGg+PGcgY2xpcC1wYXRoPSJ1cmwoI19jbGlwMSkiPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIyNDU3OSIgaGVpZ2h0PSIyNDU3OSIgc3R5bGU9ImZpbGw6IHVybCgmcXVvdDsjX0xpbmVhcjImcXVvdDspOyI+PC9yZWN0PjwvZz48L2c+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJfTGluZWFyMiIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDI0NTc5LC0yNDU3OSwyNDU3OSwyNDU3OSwwLDI0NTc5KSI+PHN0b3Agb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjogcmdiKDI1NSwgMzIsIDYyKTsgc3RvcC1vcGFjaXR5OiAxOyI+PC9zdG9wPjxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IHJnYig4MCwgNiwgMjU1KTsgc3RvcC1vcGFjaXR5OiAxOyI+PC9zdG9wPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjwvc3ZnPg==)](https://replugged.dev/install?identifier=YofukashiNo/Distify&source=github) +[![Safe](https://img.shields.io/github/downloads/YofukashiNo/Distify/total.svg?style=social&label=Install%20in%20Replugged&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMjQ1NzkgMjQ1NzkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnNYbGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sU3BhY2U9InByZXNlcnZlIiB4bWxuczpzZXJpZj0iaHR0cDovL3d3dy5zZXJpZi5jb20vIiBjbGFzcz0iX3BsdWdfM2J3NmNfMjIiIHN0eWxlPSJmaWxsLXJ1bGU6IGV2ZW5vZGQ7IGNsaXAtcnVsZTogZXZlbm9kZDsgc3Ryb2tlLWxpbmVqb2luOiByb3VuZDsiPjxnPjxjbGlwUGF0aCBpZD0iX2NsaXAxIj48cGF0aCBkPSJNMjIyMjAuMywyMjQ3NC44YzM5LjI1LDQ0LjU3MSA3MS40NjcsOTQuODcxIDk1LjU0MiwxNDkuMTYzYzE2NC4wOTYsMzY4LjQyNSAxNjIuNDI5LDc5Ni42MDggLTE3Ljk0MiwxMTcwLjFjLTQzLjE0MSw4OS4zMzMgLTk1LjA4NywxNzIuNiAtMTU0LjUwOCwyNDguOTcxYy0yODEuNzMzLDM2My41NjcgLTc2OS43NjcsNDk3LjI5NiAtMTE5Ny40OCwzMjguMTI5Yy0xNzc3LjgyLC02NzguMzc1IC00MTIxLjMyLC0xMjgyLjAzIC01NjcwLjA0LC0yMTQ1Ljg1Yy0zMDExLjE4LC0xNjc5LjU0IC01MDg0LjY3LC0zMjgzLjI4IC0zNjQ2LjE3LC03NzMxLjI5YzI2LjEzNywtODAuODgzIDk4LjgxNiwtMTM3Ljc1NCAxODMuNjA4LC0xNDMuNjcxYzE4MDUuNzcsLTEzNy4xMDggMzQxMC40LC0xMzkyLjE5IDM5MDUuNzIsLTMyNDAuNzVjMTYwLjg1LC02MDAuMzEyIDMxMi4yMjksLTExNjUuMjYgNDMyLjc3NSwtMTYxNS4xNWM3MC44NTgsLTI2NC40NDEgMzMuNzYyLC01NDYuMiAtMTAzLjEyMSwtNzgzLjI5MWMtMTM2Ljg4NywtMjM3LjA5MiAtMzYyLjM1LC00MTAuMDk2IC02MjYuNzkyLC00ODAuOTVsLTQyMi42NzksLTExMy4yNTlsODc4LjQ5MiwtMzI3OC41OGM1MC40NSwtMTg4LjI3MSAyNC4wMzcsLTM4OC44NzUgLTczLjQxNywtNTU3LjY3NWMtOTcuNDU4LC0xNjguOCAtMjU3Ljk3OSwtMjkxLjk3MSAtNDQ2LjI1LC0zNDIuNDE3Yy0xODguMjcxLC01MC40NSAtMzg4Ljg3NSwtMjQuMDM3IC01NTcuNjc1LDczLjQxN2MtMTY4LjgsOTcuNDU4IC0yOTEuOTcxLDI1Ny45NzkgLTM0Mi40MTcsNDQ2LjI1bC04NzguNDkxLDMyNzguNThsLTI3OTguNTUsLTc0OS44NjZsODc4LjQ5NiwtMzI3OC41OGM1MC40NDYsLTE4OC4yNyAyNC4wMzcsLTM4OC44NyAtNzMuNDIxLC01NTcuNjdjLTk3LjQ1NCwtMTY4LjggLTI1Ny45NzUsLTI5MS45NzUgLTQ0Ni4yNSwtMzQyLjQyMWMtMC4xMzMsLTAuMDM4IC0wLjI2NywtMC4wNzEgLTAuNDA0LC0wLjEwOWMtMTg4LjE2MywtNTAuNDIgLTM4OC42NSwtMjQuMDI1IC01NTcuMzU0LDczLjM4Yy0xNjguNzA1LDk3LjQgLTI5MS44MDUsMjU3LjgyOSAtMzQyLjIyNSw0NDUuOTkxbC04NzguNiwzMjc4Ljk5bC00MjIuNjgsLTExMy4yNTljLTI2NC40NDEsLTcwLjg1OCAtNTQ2LjIsLTMzLjc2MiAtNzgzLjI5MSwxMDMuMTIxYy0yMzcuMDkyLDEzNi44ODQgLTQxMC4wOTYsMzYyLjM0NiAtNDgwLjk1NCw2MjYuNzg4Yy0xMjAuNTUsNDQ5Ljg5NiAtMjcxLjkyNSwxMDE0Ljg0IC00MzIuNzgsMTYxNS4xNWMtNDc4LjM3NSwxNzg1LjMzIDIxNi4xMjUsMzYwOC42IDE2MTEuMTUsNDY1MS43MWM3Mi4zODgsNTMuMzg4IDEwMi4yNSwxNDcuMjU4IDc0LjAxNywyMzIuNjU4Yy0xNzAzLjcsNTE1OC41IDM5MC43NzEsNzY5NS42MiAyMzc2LjIsOTI4Mi4zM2M0MTMuODA4LDMzMC43MDQgODY2LjUzOCw2NDIuNDIxIDEzNDAuNjQsOTMxLjYwNGMxMzIuMjQyLDgxLjA2NyAxOTQuNDgzLDI0MC4xNSAxNTIuMzY3LDM4OS40MzNjLTQyLjExNywxNDkuMjg0IC0xNzguMzI2LDI1Mi4zODQgLTMzMy40MzQsMjUyLjM4NGMtMjgzNy4yOCwwLjc3MSAtOTE5OC41NCwwLjc3MSAtOTE5OC41NCwwLjc3MWMtNzY3LjA2MiwtMCAtMTM4OC44OSwtNjIxLjgyNSAtMTM4OC44OSwtMTM4OC44OWwtMCwtMjE4MDAuMmMtMCwtMzY4LjUzMyAxNDYuNDcxLC03MjEuOTYyIDQwNy4xNjIsLTk4Mi40NThjMjYwLjY5MiwtMjYwLjQ5NiA2MTQuMjMsLTQwNi43MDQgOTgyLjc2MywtNDA2LjQyOWMzNjA5LjE3LDIuNyAxMzAwMCw5LjcyMSAxMzAwMCw5LjcyMWMxNjM2LjAzLC0wIDMyMDUuMDYsNjQ5LjkxMiA0MzYxLjkyLDE4MDYuNzZjMTE1Ni44NSwxMTU2Ljg1IDE4MDYuNzYsMjcyNS44OCAxODA2Ljc2LDQzNjEuOTJsMCw0NDUwLjc1YzAsMTYzNi4wMyAtNjQ5LjkxMiwzMjA1LjA2IC0xODA2Ljc2LDQzNjEuOTJjLTE0OTMuNDYsMTQ5My40NSAtMTU2OS41NSwzODkwLjMgLTE3My44MjEsNTQ3NS40NmM4NzguMyw5OTcuNTE3IDE1NzkuNjUsMTc5NC4wNSAxNzY3LjM2LDIwMDcuMjVsLTAuMDA0LDAuMDQxWiI+PC9wYXRoPjwvY2xpcFBhdGg+PGcgY2xpcC1wYXRoPSJ1cmwoI19jbGlwMSkiPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIyNDU3OSIgaGVpZ2h0PSIyNDU3OSIgc3R5bGU9ImZpbGw6IHVybCgmcXVvdDsjX0xpbmVhcjImcXVvdDspOyI+PC9yZWN0PjwvZz48L2c+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJfTGluZWFyMiIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDI0NTc5LC0yNDU3OSwyNDU3OSwyNDU3OSwwLDI0NTc5KSI+PHN0b3Agb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjogcmdiKDI1NSwgMzIsIDYyKTsgc3RvcC1vcGFjaXR5OiAxOyI+PC9zdG9wPjxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IHJnYig4MCwgNiwgMjU1KTsgc3RvcC1vcGFjaXR5OiAxOyI+PC9zdG9wPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjwvc3ZnPg==)](https://replugged.dev/install?identifier=YofukashiNo/Distify&source=github) ![distify](https://i.imgur.com/i7r0j9L.png) diff --git a/manifest.json b/manifest.json index 7e536b6..ded809a 100644 --- a/manifest.json +++ b/manifest.json @@ -9,8 +9,8 @@ }, "version": "1.0.5", "updater": { - "type": "store", - "id": "dev.yofukashino.Distify" + "type": "github", + "id": "YofukashiNo/Distify" }, "license": "MIT", "type": "replugged-plugin", diff --git a/src/index.ts b/src/index.ts index 8d53764..0fcddb5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,11 +1,11 @@ import { Injector, Logger } from "replugged"; -export const PluginLogger = Logger.plugin("Distify"); +export const PluginLogger = Logger.plugin("Distify", "#b380ff"); export const PluginInjector = new Injector(); export const { utils: PluginInjectorUtils } = PluginInjector; import Injections from "./injections/index"; export const start = (): void => { - void Injections.applyInjections(); + void Injections.applyInjections().catch((err) => PluginLogger.error(err)); }; export const stop = (): void => { diff --git a/src/lib/requiredModules.ts b/src/lib/requiredModules.ts index b0e4115..240293b 100644 --- a/src/lib/requiredModules.ts +++ b/src/lib/requiredModules.ts @@ -4,10 +4,22 @@ import Types from "../types"; export const Modules: Types.Modules = {}; Modules.loadModules = async (): Promise => { - Modules.ElementParser ??= await webpack.waitForProps( - "sanitizeUrl", - "sanitizeText", - ); + Modules.ElementParser ??= await webpack + .waitForProps(["sanitizeUrl", "sanitizeText"], { + timeout: 10000, + }) + .catch(() => { + throw new Error("Failed To Find ElementParser Module"); + }); + + Modules.ConnectedAccountsUtils ??= await webpack + .waitForProps(["setShowActivity", "refreshAccessToken"], { + timeout: 10000, + }) + .catch(() => { + throw new Error("Failed To Find ConnectedAccountsUtils Module"); + }); + Modules.ConnectedAccountsStore ??= webpack.getByStoreName("ConnectedAccountsStore"); Modules.SpotifyStore ??= webpack.getByStoreName("SpotifyStore"); diff --git a/src/lib/utils.tsx b/src/lib/utils.tsx index 848c491..8edcb6b 100644 --- a/src/lib/utils.tsx +++ b/src/lib/utils.tsx @@ -15,23 +15,21 @@ export const ensureSpotifyPlayer = (): Promise<{ if (activePlayer) return Promise.resolve(activePlayer); const playableDevices = SpotifyStore.getPlayableComputerDevices(); if (playableDevices.length > 0) { - const [{ socket, device }] = playableDevices; - return Promise.resolve({ - socket, - device, - }); + const playablePlayer = playableDevices.find( + ({ socket, device }) => socket?.connected && device?.is_active != null, + ); + return Promise.resolve(playablePlayer ?? {}); } return new Promise((res) => { const timer = { timeout: null }; const changeListerner = () => { const playableDevices = SpotifyStore.getPlayableComputerDevices(); - const [{ socket, device }] = playableDevices; + const playablePlayer = playableDevices.find( + ({ socket, device }) => socket?.connected && device?.is_active != null, + ); clearTimeout(timer?.timeout); SpotifyStore.removeChangeListener(changeListerner); - res({ - socket, - device, - }); + res(playablePlayer ?? {}); }; SpotifyStore.addChangeListener(changeListerner); timer.timeout = setTimeout(() => { @@ -56,7 +54,7 @@ export const error = async (res): Promise => { return new Error("Unknown Error, Check the console and report the dev"); } }; -export const play = async (type: string, id: string): Promise => { +export const play = async (type: string, id: string, retry?: boolean): Promise => { const { socket, device } = await ensureSpotifyPlayer(); if (!socket?.accessToken) { throw new Error("Please link your Spotify to Discord in Settings > Connections"); @@ -77,10 +75,20 @@ export const play = async (type: string, id: string): Promise => { if (SpotifyResponse.ok) { return; } + if (!retry) { + const accecssToken = (await Modules.ConnectedAccountsUtils.refreshAccessToken( + "spotify", + socket?.accountId, + )) as string; + if (socket.accessToken !== accecssToken) socket.accessToken = accecssToken; + play(type, id, true); + return; + } + throw await error(SpotifyResponse); }; -export const queue = async (type: string, id: string): Promise => { +export const queue = async (type: string, id: string, retry?: boolean): Promise => { const { socket, device } = await ensureSpotifyPlayer(); if (!socket?.accessToken) { throw new Error("Please link your Spotify to Discord in Settings > Connections"); @@ -100,6 +108,15 @@ export const queue = async (type: string, id: string): Promise => { if (SpotifyResponse.ok) { return; } + if (!retry) { + const accecssToken = (await Modules.ConnectedAccountsUtils.refreshAccessToken( + "spotify", + socket?.accountId, + )) as string; + if (socket.accessToken !== accecssToken) socket.accessToken = accecssToken; + queue(type, id, true); + return; + } throw await error(SpotifyResponse); }; diff --git a/src/types.ts b/src/types.ts index 6f14461..3d9d072 100644 --- a/src/types.ts +++ b/src/types.ts @@ -53,6 +53,24 @@ export namespace Types { shouldShowActivity: DefaultTypes.AnyFunction; wasAutoPaused: DefaultTypes.AnyFunction; } + export interface ConnectedAccountsUtils { + authorize: DefaultTypes.AnyFunction; + callback: DefaultTypes.AnyFunction; + completeTwoWayLink: DefaultTypes.AnyFunction; + connect: DefaultTypes.AnyFunction; + disconnect: DefaultTypes.AnyFunction; + fetch: DefaultTypes.AnyFunction; + joinServer: DefaultTypes.AnyFunction; + linkDispatchAuthCallback: DefaultTypes.AnyFunction; + refresh: DefaultTypes.AnyFunction; + refreshAccessToken: DefaultTypes.AnyFunction; + setFriendSync: DefaultTypes.AnyFunction; + setMetadataVisibility: DefaultTypes.AnyFunction; + setShowActivity: DefaultTypes.AnyFunction; + setVisibility: DefaultTypes.AnyFunction; + submitPinCode: DefaultTypes.AnyFunction; + update: DefaultTypes.AnyFunction; + } export interface SpotifySocket { accessToken: string; accountId: string; @@ -114,6 +132,7 @@ export namespace Types { export interface Modules { loadModules?: () => Promise; ConnectedAccountsStore?: ConnectedAccountsStore; + ConnectedAccountsUtils?: ConnectedAccountsUtils; ElementParser?: ElementParser; SpotifyStore?: SpotifyStore; }