diff --git a/package.json b/package.json index 3bf1dadba..3b4add6df 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "equicord", "private": "true", - "version": "1.12.13", + "version": "1.13.0", "description": "The other cutest Discord client mod", "homepage": "https://github.com/Equicord/Equicord#readme", "bugs": { diff --git a/packages/discord-types/enums/activity.ts b/packages/discord-types/enums/activity.ts new file mode 100644 index 000000000..513a65dee --- /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 3d80895cd..a25ff3b5d 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 index a4df551a0..acc8b8691 100644 --- a/packages/discord-types/src/common/Activity.d.ts +++ b/packages/discord-types/src/common/Activity.d.ts @@ -1,45 +1,43 @@ -import { CSSProperties, ImgHTMLAttributes, JSX } from "react"; -import { Application } from "./Application"; -import { User } from "./User"; +import { ActivityFlags, ActivityStatusDisplayType, ActivityType } from "../../enums"; -export interface ActivityTimestamp { - start?: number; - end?: number; +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 { - created_at: number; - id: string; + created_at?: number; + id?: string; name: string; - type: number; + application_id: string; + type: ActivityType; emoji?: { animated: boolean; id: string; name: string; }; state?: string; - flags?: number; - sync_id?: string; + state_url?: string; details?: string; - application_id?: string; - assets?: { - large_text?: string; - large_image?: string; - small_text?: string; - small_image?: string; + details_url?: string; + url?: string; + flags: ActivityFlags; + status_display_type?: ActivityStatusDisplayType; + timestamps?: { + start?: number; + end?: number; }; - buttons?: Array; + assets?: ActivityAssets; + buttons?: string[]; metadata?: { button_urls?: Array; }; - timestamps?: ActivityTimestamp; platform?: string; } - -export const enum ActivityType { - PLAYING = 0, - STREAMING = 1, - LISTENING = 2, - WATCHING = 3, - COMPETING = 5 -} diff --git a/src/plugins/appleMusic.desktop/index.tsx b/src/plugins/appleMusic.desktop/index.tsx index 57e5ae19e..f6fc9da93 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 d35dad135..9a5a1cd98 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 a6de8b188..3da7bf851 100644 --- a/src/plugins/lastfmRichPresence/index.tsx +++ b/src/plugins/lastfmRichPresence/index.tsx @@ -22,40 +22,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; @@ -64,16 +35,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", @@ -375,9 +336,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, @@ -387,7 +348,7 @@ export default definePlugin({ }, type: settings.store.useListeningStatus ? ActivityType.LISTENING : ActivityType.PLAYING, - flags: ActivityFlag.INSTANCE, + flags: ActivityFlags.INSTANCE, }; } }); diff --git a/src/plugins/messageLatency/index.tsx b/src/plugins/messageLatency/index.tsx index b23d4aadb..9ce3070a3 100644 --- a/src/plugins/messageLatency/index.tsx +++ b/src/plugins/messageLatency/index.tsx @@ -11,7 +11,7 @@ import { isNonNullish } from "@utils/guards"; import definePlugin, { OptionType } from "@utils/types"; import { Message } from "@vencord/discord-types"; import { findComponentByCodeLazy } from "@webpack"; -import { SnowflakeUtils, Tooltip } from "@webpack/common"; +import { AuthenticationStore, SnowflakeUtils, Tooltip } from "@webpack/common"; type FillValue = ("status-danger" | "status-warning" | "status-positive" | "text-muted"); type Fill = [FillValue, FillValue, FillValue]; @@ -48,6 +48,11 @@ export default definePlugin({ type: OptionType.BOOLEAN, description: "Show milliseconds", default: false + }, + ignoreSelf: { + type: OptionType.BOOLEAN, + description: "Don't add indicator to your own messages", + default: false } }), @@ -91,7 +96,7 @@ export default definePlugin({ }, latencyTooltipData(message: Message) { - const { latency, detectDiscordKotlin, showMillis } = this.settings.store; + const { latency, detectDiscordKotlin, showMillis, ignoreSelf } = this.settings.store; const { id, nonce } = message; // Message wasn't received through gateway @@ -100,6 +105,8 @@ export default definePlugin({ // Bots basically never send a nonce, and if someone does do it then it's usually not a snowflake if (message.author.bot) return null; + if (ignoreSelf && message.author.id === AuthenticationStore.getId()) return null; + let isDiscordKotlin = false; let delta = SnowflakeUtils.extractTimestamp(id) - SnowflakeUtils.extractTimestamp(nonce); // milliseconds if (!showMillis) {