diff --git a/src/api/ServerList.tsx b/src/api/ServerList.tsx index 39d8b5da4..0bf5f6155 100644 --- a/src/api/ServerList.tsx +++ b/src/api/ServerList.tsx @@ -25,11 +25,11 @@ export const enum ServerListRenderPosition { Below, } -const componentsIn = new Set(); -const componentsAbove = new Set(); -const componentsBelow = new Set(); +const componentsIn = new Map(); +const componentsAbove = new Map(); +const componentsBelow = new Map(); -function getRenderFunctions(position: ServerListRenderPosition) { +function getRenderMap(position: ServerListRenderPosition) { switch (position) { case ServerListRenderPosition.Above: return componentsAbove; @@ -40,21 +40,20 @@ function getRenderFunctions(position: ServerListRenderPosition) { } } -export function addServerListElement(position: ServerListRenderPosition, renderFunction: ComponentType) { - getRenderFunctions(position).add(renderFunction); +export function addServerListElement(position: ServerListRenderPosition, renderFunction: ComponentType, priority = 0) { + getRenderMap(position).set(renderFunction, priority); } export function removeServerListElement(position: ServerListRenderPosition, renderFunction: ComponentType) { - getRenderFunctions(position).delete(renderFunction); + getRenderMap(position).delete(renderFunction); } export const renderAll = (position: ServerListRenderPosition) => { - return Array.from( - getRenderFunctions(position), - (Component, i) => ( + return Array.from(getRenderMap(position).entries()) + .sort((a, b) => b[1] - a[1]) + .map(([Component], i) => ( - ) - ); + )); }; diff --git a/src/equicordplugins/questify/index.tsx b/src/equicordplugins/questify/index.tsx index f0f6fd0ba..5a4faea25 100644 --- a/src/equicordplugins/questify/index.tsx +++ b/src/equicordplugins/questify/index.tsx @@ -631,7 +631,7 @@ export default definePlugin({ start() { initializeRestartTracking(settings); - addServerListElement(ServerListRenderPosition.Above, this.renderQuestifyButton); + addServerListElement(ServerListRenderPosition.Above, this.renderQuestifyButton, 1); onceReady.then(() => { if (!settings.store.disableQuestsEverything) { diff --git a/src/equicordplugins/songLink.desktop/Providers.ts b/src/equicordplugins/songLink.desktop/Providers.ts index 095fb27d2..b8baee643 100644 --- a/src/equicordplugins/songLink.desktop/Providers.ts +++ b/src/equicordplugins/songLink.desktop/Providers.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -const Providers = { +export const Providers = { amazonMusic: { name: "Amazon Music", logo: "data:image/png;base64,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" @@ -93,5 +93,3 @@ const Providers = { logo: "data:image/png;base64,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" } }; - -export default Providers; diff --git a/src/equicordplugins/songLink.desktop/Settings.tsx b/src/equicordplugins/songLink.desktop/Settings.tsx index 78bfd316a..8ba895ca6 100644 --- a/src/equicordplugins/songLink.desktop/Settings.tsx +++ b/src/equicordplugins/songLink.desktop/Settings.tsx @@ -8,7 +8,7 @@ import { FormSwitch } from "@components/FormSwitch"; import { HeadingTertiary } from "@components/Heading"; import { settings } from "."; -import Providers from "./Providers"; +import { Providers } from "./Providers"; export function Settings() { const blazinglyFastSettings = settings.use(["servicesSettings"]); diff --git a/src/equicordplugins/songLink.desktop/SongLinker.tsx b/src/equicordplugins/songLink.desktop/SongLinker.tsx index 1807eee2f..158baad3d 100644 --- a/src/equicordplugins/songLink.desktop/SongLinker.tsx +++ b/src/equicordplugins/songLink.desktop/SongLinker.tsx @@ -10,7 +10,7 @@ import { HeadphonesIcon } from "@components/Icons"; import { Button, useEffect, useState } from "@webpack/common"; import pl, { Native, settings, SongLinkResult } from "."; -import Providers from "./Providers"; +import { Providers } from "./Providers"; export default function SongLinker({ url }: { url: string; }) { const [songData, setSongData] = useState(); diff --git a/src/equicordplugins/songLink.desktop/index.tsx b/src/equicordplugins/songLink.desktop/index.tsx index 0834d639a..f558083a0 100644 --- a/src/equicordplugins/songLink.desktop/index.tsx +++ b/src/equicordplugins/songLink.desktop/index.tsx @@ -4,11 +4,13 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ +import { ApplicationCommandInputType, ApplicationCommandOptionType, findOption, sendBotMessage } from "@api/Commands"; import { definePluginSettings } from "@api/Settings"; -import { Devs } from "@utils/constants"; +import { Devs, EquicordDevs } from "@utils/constants"; +import { sendMessage } from "@utils/discord"; import definePlugin, { OptionType, PluginNative } from "@utils/types"; -import Providers from "./Providers"; +import { Providers } from "./Providers"; import { Settings } from "./Settings"; import SongLinker from "./SongLinker"; @@ -27,6 +29,11 @@ export const settings = definePluginSettings({ description: "Country used for lookup (Two letter country code)", default: "US" }, + includeMetadata: { + type: OptionType.BOOLEAN, + description: "Include the track title and artist name as a header.", + default: true, + }, servicesComponent: { type: OptionType.COMPONENT, component: () => @@ -48,12 +55,40 @@ export type SongLinkResult = { export const Native = VencordNative.pluginHelpers.SongLink as PluginNative; +function formatMessage(data: SongLinkResult): string | null { + const lines: string[] = []; + + for (const [serviceKey, service] of Object.entries(settings.store.servicesSettings)) { + if (!service.enabled) continue; + + const platformData = data.links[serviceKey]; + if (!platformData?.url) continue; + + const provider = Providers[serviceKey]; + const name = provider?.name ?? serviceKey; + + lines.push(`- [${name}](<${platformData.url}>)`); + } + + if (lines.length === 0) return null; + + const parts: string[] = []; + + if (settings.store.includeMetadata && data.info?.title && data.info?.artist) { + parts.push(`### **${data.info.title}** — *${data.info.artist}*`); + } + + parts.push(lines.join("\n")); + + return parts.join("\n"); +} + export default definePlugin({ name: "SongLink", description: "Adds streaming service buttons below song links", dependencies: ["MessageAccessoriesAPI"], tags: ["Media", "Utility"], - authors: [Devs.nin0dev], + authors: [Devs.nin0dev, EquicordDevs.NassCT], settings, Providers, cache: ({} as Record), @@ -85,5 +120,53 @@ export default definePlugin({ musicLinks.map(item => ) } ; - } + }, + commands: [ + { + name: "musiclink", + description: "Convert a music link to other streaming platforms.", + inputType: ApplicationCommandInputType.BUILT_IN, + options: [ + { + name: "url", + description: "Music link (Spotify, Deezer, YouTube, Tidal, Apple Music, SoundCloud)", + type: ApplicationCommandOptionType.STRING, + required: true, + }, + ], + execute: async (opts, ctx) => { + const url = findOption(opts, "url", ""); + + if (!url) { + sendBotMessage(ctx.channel.id, { + content: "Please provide a music link.", + }); + return; + } + + sendBotMessage(ctx.channel.id, { + content: "This will take a moment...", + }); + + try { + const data = await Native.getTrackData(url); + const formatted = formatMessage(data); + + if (!formatted) { + sendBotMessage(ctx.channel.id, { + content: + "No alternative platforms found for this link.", + }); + return; + } + + sendMessage(ctx.channel.id, { content: formatted }); + } catch (e: any) { + sendBotMessage(ctx.channel.id, { + content: "Failed to resolve music link", + }); + } + }, + }, + ], }); diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 1dd4fccb5..f95af20b7 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -1223,7 +1223,7 @@ export const EquicordDevs = Object.freeze({ }, prism: { name: "prism", - id: 390884143749136386n, + id: 390884143749136386n }, square: { name: "square", @@ -1251,7 +1251,7 @@ export const EquicordDevs = Object.freeze({ }, PWall: { name: "PWall", - id: 0n, + id: 0n }, busyboxkitty: { name: "busyboxkitty", @@ -1259,31 +1259,31 @@ export const EquicordDevs = Object.freeze({ }, BioTomateDE: { name: "BioTomateDE", - id: 553499669226061844n, + id: 553499669226061844n }, korzi: { name: "korzi", - id: 740966310875365416n, + id: 740966310875365416n }, davri: { name: "Davri", - id: 457579346282938368n, + id: 457579346282938368n }, yash: { name: "yash", - id: 889150838658977874n, + id: 889150838658977874n }, Leon135: { name: "Leon135", - id: 309275452231385088n, + id: 309275452231385088n }, bbpltergiest: { name: "bbpltergiest", - id: 279448683672502274n, + id: 279448683672502274n }, mshl: { name: "m.shl", - id: 1025245410224263258n, + id: 1025245410224263258n }, ScattrdBlade: { name: "ScattrdBlade", @@ -1291,11 +1291,11 @@ export const EquicordDevs = Object.freeze({ }, Ape: { name: "Ape", - id: 722832640360841308n, + id: 722832640360841308n }, Kiri: { name: "Kiri", - id: 310525496771346434n, + id: 310525496771346434n }, pointy: { name: "pointy", @@ -1307,7 +1307,7 @@ export const EquicordDevs = Object.freeze({ }, Gir0fa: { name: "gir0fa", - id: 1282734265955520545n, + id: 1282734265955520545n }, yonn2222: { name: "yonn2222", @@ -1321,6 +1321,10 @@ export const EquicordDevs = Object.freeze({ name: "sketchmyname", id: 1412164910443663491n }, + NassCT: { + name: "NassCT", + id: 354996937868705793n + }, } satisfies Record); // iife so #__PURE__ works correctly