diff --git a/packages/discord-types/enums/activity.ts b/packages/discord-types/enums/activity.ts new file mode 100644 index 00000000..513a65de --- /dev/null +++ b/packages/discord-types/enums/activity.ts @@ -0,0 +1,30 @@ +export const enum ActivityType { + PLAYING = 0, + STREAMING = 1, + LISTENING = 2, + WATCHING = 3, + CUSTOM_STATUS = 4, + COMPETING = 5, + HANG_STATUS = 6 +} + +export const enum ActivityFlags { + INSTANCE = 1 << 0, + JOIN = 1 << 1, + /** @deprecated */ + SPECTATE = 1 << 2, + /** @deprecated */ + JOIN_REQUEST = 1 << 3, + SYNC = 1 << 4, + PLAY = 1 << 5, + PARTY_PRIVACY_FRIENDS = 1 << 6, + PARTY_PRIVACY_VOICE_CHANNEL = 1 << 7, + EMBEDDED = 1 << 8, + CONTEXTLESS = 1 << 9 +} + +export const enum ActivityStatusDisplayType { + NAME = 0, + STATE = 1, + DETAILS = 2 +} diff --git a/packages/discord-types/enums/index.ts b/packages/discord-types/enums/index.ts index 3d80895c..a25ff3b5 100644 --- a/packages/discord-types/enums/index.ts +++ b/packages/discord-types/enums/index.ts @@ -1,3 +1,4 @@ +export * from "./activity"; export * from "./channel"; export * from "./commands"; export * from "./messages"; diff --git a/packages/discord-types/src/common/Activity.d.ts b/packages/discord-types/src/common/Activity.d.ts new file mode 100644 index 00000000..d513780a --- /dev/null +++ b/packages/discord-types/src/common/Activity.d.ts @@ -0,0 +1,36 @@ +import { ActivityFlags, ActivityStatusDisplayType, ActivityType } from "../../enums"; + +export interface ActivityAssets { + large_image?: string; + large_text?: string; + small_image?: string; + small_text?: string; +} + +export interface ActivityButton { + label: string; + url: string; +} + +export interface Activity { + name: string; + application_id: string; + type: ActivityType; + state?: string; + state_url?: string; + details?: string; + details_url?: string; + url?: string; + flags: ActivityFlags; + status_display_type?: ActivityStatusDisplayType; + timestamps?: { + start?: number; + end?: number; + }; + assets?: ActivityAssets; + buttons?: string[]; + metadata?: { + button_urls?: Array; + }; +} + diff --git a/packages/discord-types/src/common/index.d.ts b/packages/discord-types/src/common/index.d.ts index 5e50e96e..65ad8856 100644 --- a/packages/discord-types/src/common/index.d.ts +++ b/packages/discord-types/src/common/index.d.ts @@ -1,3 +1,4 @@ +export * from "./Activity"; export * from "./Application"; export * from "./Channel"; export * from "./Guild"; diff --git a/src/plugins/appleMusic.desktop/index.tsx b/src/plugins/appleMusic.desktop/index.tsx index 57e5ae19..f6fc9da9 100644 --- a/src/plugins/appleMusic.desktop/index.tsx +++ b/src/plugins/appleMusic.desktop/index.tsx @@ -7,49 +7,12 @@ import { definePluginSettings } from "@api/Settings"; import { Devs, IS_MAC } from "@utils/constants"; import definePlugin, { OptionType, PluginNative, ReporterTestable } from "@utils/types"; +import { Activity, ActivityAssets, ActivityButton } from "@vencord/discord-types"; +import { ActivityFlags, ActivityStatusDisplayType, ActivityType } from "@vencord/discord-types/enums"; import { ApplicationAssetUtils, FluxDispatcher, Forms } from "@webpack/common"; const Native = VencordNative.pluginHelpers.AppleMusicRichPresence as PluginNative; -interface ActivityAssets { - large_image?: string; - large_text?: string; - small_image?: string; - small_text?: string; -} - -interface ActivityButton { - label: string; - url: string; -} - -interface Activity { - state?: string; - details?: string; - timestamps?: { - start?: number; - end?: number; - }; - assets?: ActivityAssets; - buttons?: Array; - name: string; - application_id: string; - metadata?: { - button_urls?: Array; - }; - type: number; - flags: number; -} - -const enum ActivityType { - PLAYING = 0, - LISTENING = 2, -} - -const enum ActivityFlag { - INSTANCE = 1 << 0, -} - export interface TrackData { name: string; album?: string; @@ -90,6 +53,25 @@ const settings = definePluginSettings({ { label: "Listening", value: ActivityType.LISTENING } ], }, + statusDisplayType: { + description: "Show the track / artist name in the member list", + type: OptionType.SELECT, + options: [ + { + label: "Don't show (shows generic listening message)", + value: "off", + default: true + }, + { + label: "Show artist name", + value: "artist" + }, + { + label: "Show track name", + value: "track" + } + ] + }, refreshInterval: { type: OptionType.SLIDER, description: "The interval between activity refreshes (seconds)", @@ -258,7 +240,12 @@ export default definePlugin({ metadata: !isRadio && buttons.length ? { button_urls: buttons.map(v => v.url) } : undefined, type: settings.store.activityType, - flags: ActivityFlag.INSTANCE, + status_display_type: { + "off": ActivityStatusDisplayType.NAME, + "artist": ActivityStatusDisplayType.STATE, + "track": ActivityStatusDisplayType.DETAILS + }[settings.store.statusDisplayType], + flags: ActivityFlags.INSTANCE, }; } }); diff --git a/src/plugins/customRPC/index.tsx b/src/plugins/customRPC/index.tsx index d35dad13..9a5a1cd9 100644 --- a/src/plugins/customRPC/index.tsx +++ b/src/plugins/customRPC/index.tsx @@ -27,6 +27,8 @@ import { Margins } from "@utils/margins"; import { classes } from "@utils/misc"; import { useAwaiter } from "@utils/react"; import definePlugin, { OptionType } from "@utils/types"; +import { Activity } from "@vencord/discord-types"; +import { ActivityType } from "@vencord/discord-types/enums"; import { findByCodeLazy, findComponentByCodeLazy } from "@webpack"; import { ApplicationAssetUtils, Button, FluxDispatcher, Forms, React, UserStore } from "@webpack/common"; @@ -39,41 +41,7 @@ async function getApplicationAsset(key: string): Promise { return (await ApplicationAssetUtils.fetchAssetIds(settings.store.appID!, [key]))[0]; } -interface ActivityAssets { - large_image?: string; - large_text?: string; - small_image?: string; - small_text?: string; -} - -interface Activity { - state?: string; - details?: string; - timestamps?: { - start?: number; - end?: number; - }; - assets?: ActivityAssets; - buttons?: Array; - name: string; - application_id: string; - metadata?: { - button_urls?: Array; - }; - type: ActivityType; - url?: string; - flags: number; -} - -const enum ActivityType { - PLAYING = 0, - STREAMING = 1, - LISTENING = 2, - WATCHING = 3, - COMPETING = 5 -} - -const enum TimestampMode { +export const enum TimestampMode { NONE, NOW, TIME, diff --git a/src/plugins/lastfmRichPresence/index.tsx b/src/plugins/lastfmRichPresence/index.tsx index abf42d5f..3c36e9dc 100644 --- a/src/plugins/lastfmRichPresence/index.tsx +++ b/src/plugins/lastfmRichPresence/index.tsx @@ -21,40 +21,11 @@ import { Link } from "@components/Link"; import { Devs } from "@utils/constants"; import { Logger } from "@utils/Logger"; import definePlugin, { OptionType } from "@utils/types"; +import { Activity, ActivityAssets, ActivityButton } from "@vencord/discord-types"; +import { ActivityFlags, ActivityStatusDisplayType, ActivityType } from "@vencord/discord-types/enums"; import { findByPropsLazy } from "@webpack"; import { ApplicationAssetUtils, FluxDispatcher, Forms } from "@webpack/common"; -interface ActivityAssets { - large_image?: string; - large_text?: string; - small_image?: string; - small_text?: string; -} - - -interface ActivityButton { - label: string; - url: string; -} - -interface Activity { - state: string; - details?: string; - timestamps?: { - start?: number; - }; - assets?: ActivityAssets; - buttons?: Array; - name: string; - application_id: string; - status_display_type?: number; - metadata?: { - button_urls?: Array; - }; - type: number; - flags: number; -} - interface TrackData { name: string; album: string; @@ -63,16 +34,6 @@ interface TrackData { imageUrl?: string; } -// only relevant enum values -const enum ActivityType { - PLAYING = 0, - LISTENING = 2, -} - -const enum ActivityFlag { - INSTANCE = 1 << 0, -} - const enum NameFormat { StatusName = "status-name", ArtistFirst = "artist-first", @@ -367,9 +328,9 @@ export default definePlugin({ details: trackData.name, state: trackData.artist, status_display_type: { - "off": 0, - "artist": 1, - "track": 2 + "off": ActivityStatusDisplayType.NAME, + "artist": ActivityStatusDisplayType.STATE, + "track": ActivityStatusDisplayType.DETAILS }[settings.store.statusDisplayType], assets, @@ -379,7 +340,7 @@ export default definePlugin({ }, type: settings.store.useListeningStatus ? ActivityType.LISTENING : ActivityType.PLAYING, - flags: ActivityFlag.INSTANCE, + flags: ActivityFlags.INSTANCE, }; } });