diff --git a/src/Vencord.ts b/src/Vencord.ts index e626fed6..eee92344 100644 --- a/src/Vencord.ts +++ b/src/Vencord.ts @@ -71,7 +71,8 @@ async function syncSettings() { if (localStorage.Vencord_settingsDirty) { await putCloudSettings(); delete localStorage.Vencord_settingsDirty; - } else if (await getCloudSettings(false)) { // if we synchronized something (false means no sync) + } else if (await getCloudSettings(false)) { + // if we synchronized something (false means no sync) // we show a notification here instead of allowing getCloudSettings() to show one to declutter the amount of // potential notifications that might occur. getCloudSettings() will always send a notification regardless if // there was an error to notify the user, but besides that we only want to show one notification instead of all diff --git a/src/equicordplugins/annamox/index.ts b/src/equicordplugins/anammox/index.ts similarity index 83% rename from src/equicordplugins/annamox/index.ts rename to src/equicordplugins/anammox/index.ts index 89ef314c..363a1cc4 100644 --- a/src/equicordplugins/annamox/index.ts +++ b/src/equicordplugins/anammox/index.ts @@ -37,12 +37,13 @@ export const settings = definePluginSettings({ export default definePlugin({ name: "Anammox", - description: "Remove Some Discord Settings", + description: "A microbial process that plays an important part in the nitrogen cycle", authors: [Devs.Kyuuhachi], settings, patches: [ - { // Above DMs, mouse nav + { + // Above DMs, mouse nav find: 'tutorialId:"direct-messages"', replacement: [ { @@ -56,7 +57,8 @@ export default definePlugin({ ], predicate: () => settings.store.dms, }, - { // Above DMs, keyboard nav + { + // Above DMs, keyboard nav find: ".hasLibraryApplication()&&!", replacement: [ { @@ -70,7 +72,8 @@ export default definePlugin({ ], predicate: () => settings.store.dms, }, - { // Settings, sidebar + { + // Settings, sidebar find: "Messages.BILLING_SETTINGS", replacement: [ { @@ -84,23 +87,26 @@ export default definePlugin({ ], predicate: () => settings.store.billing, }, - { // Gift button - find: 'Messages.PREMIUM_GIFT_BUTTON_LABEL,"aria-haspopup":"dialog",onClick:', + { + // Gift button + find: ".gifts)||void 0===", replacement: { - match: /if\(\i\)return null;/, - replace: "return null;", + match: /let\{disabled:\i,channel:\i\}=\i/, + replace: "return null;$&", }, predicate: () => settings.store.gift, }, - { // Emoji list + { + // Emoji list find: "Messages.EMOJI_PICKER_CREATE_EMOJI_TITLE,size:", replacement: { - match: /(\i)=\i\|\|!\i&&\i.\i\i.isEmojiCategoryNitroLocked\(\{[^}]*\}\);/, + match: /(\i)=\i\|\|!\i&&\i.\i.isEmojiCategoryNitroLocked\(\{[^}]*\}\);/, replace: "$&$1||" }, predicate: () => settings.store.emojiList, }, - { // Emoji category list + { + // Emoji category list find: "Messages.EMOJI_CATEGORY_TOP_GUILD_EMOJI.format({", replacement: { match: /(?<=(\i)\.unshift\((\i)\):)(?=\1\.push\(\2\))/, diff --git a/src/equicordplugins/channelTabs/components/ChannelTab.tsx b/src/equicordplugins/channelTabs/components/ChannelTab.tsx index a72ccfc9..0a9756a6 100644 --- a/src/equicordplugins/channelTabs/components/ChannelTab.tsx +++ b/src/equicordplugins/channelTabs/components/ChannelTab.tsx @@ -163,7 +163,8 @@ function ChannelTabContent(props: ChannelTabsProps & { {!showStatusIndicators && } ); - } else { // Group DM + } else { + // Group DM return ( <> diff --git a/src/equicordplugins/imagePreview/index.ts b/src/equicordplugins/imagePreview/index.ts index 2d70e3fb..e82be1c4 100644 --- a/src/equicordplugins/imagePreview/index.ts +++ b/src/equicordplugins/imagePreview/index.ts @@ -25,7 +25,7 @@ const mimeTypes = { mov: "video/quicktime", }; -const formatDimension = (value) => value % 1 === 0 ? value : value.toFixed(2); +const formatDimension = value => value % 1 === 0 ? value : value.toFixed(2); function getMimeType(extension: string | undefined): [boolean, string] { if (!extension) return [false, ""]; @@ -389,7 +389,7 @@ export default definePlugin({ start() { let timeout: number | undefined; - let previewDiv: HTMLDivElement | null = null; + const previewDiv: HTMLDivElement | null = null; function initialScan() { const appContainer = document.querySelector('[class*="app-"]'); diff --git a/src/equicordplugins/imagePreview/styles.css b/src/equicordplugins/imagePreview/styles.css index da1ee3b5..343997b0 100644 --- a/src/equicordplugins/imagePreview/styles.css +++ b/src/equicordplugins/imagePreview/styles.css @@ -55,4 +55,4 @@ video { .dimensions-displaying, .dimensions-original { display: block; -} \ No newline at end of file +} diff --git a/src/equicordplugins/messageLinkTooltip/index.tsx b/src/equicordplugins/messageLinkTooltip/index.tsx index 41b07eac..debd6d26 100644 --- a/src/equicordplugins/messageLinkTooltip/index.tsx +++ b/src/equicordplugins/messageLinkTooltip/index.tsx @@ -6,12 +6,14 @@ import "./style.css"; +import { definePluginSettings } from "@api/Settings"; +import { getUserSettingLazy } from "@api/UserSettings"; import ErrorBoundary from "@components/ErrorBoundary"; import { Devs } from "@utils/constants"; import { proxyLazy } from "@utils/lazy"; -import definePlugin from "@utils/types"; +import definePlugin, { OptionType } from "@utils/types"; import { findComponentByCodeLazy } from "@webpack"; -import { ChannelStore, Forms, MessageStore, RestAPI, Tooltip, useEffect, useState, useStateFromStores } from "@webpack/common"; +import { ChannelStore, Constants, Forms, MessageStore, RestAPI, Tooltip, useEffect, useState, useStateFromStores } from "@webpack/common"; import type { ComponentType, HTMLAttributes } from "react"; declare enum SpinnerTypes { @@ -38,52 +40,124 @@ const { Spinner } = proxyLazy(() => Forms as any as { SpinnerTypes: typeof SpinnerTypes; }); +const MessageDisplayCompact = getUserSettingLazy("textAndImages", "messageDisplayCompact")!; + const ChannelMessage = findComponentByCodeLazy("isFirstMessageInForumPost", "trackAnnouncementViews") as ComponentType; +const settings = definePluginSettings({ + onLink: { + description: "Show tooltip when hovering over message links", + type: OptionType.BOOLEAN, + default: true, + restartNeeded: true, + }, + onReply: { + description: "Show tooltip when hovering over message replies", + type: OptionType.BOOLEAN, + default: true, + restartNeeded: true, + }, + onForward: { + description: "Show tooltip when hovering over forwarded messages", + type: OptionType.BOOLEAN, + default: true, + restartNeeded: true, + }, + display: { + description: "Display style", + type: OptionType.SELECT, + options: [ + { + label: "Same as message", + value: "auto", + default: true + }, + { + label: "Compact", + value: "compact" + }, + { + label: "Cozy", + value: "cozy" + }, + ] + }, +}); + export default definePlugin({ name: "MessageLinkTooltip", description: "Like MessageLinkEmbed but without taking space", authors: [Devs.Kyuuhachi], + settings, + patches: [ { find: ',className:"channelMention",children:[', replacement: { - match: /(?<=\.jsxs\)\()(\i\.\i)(?=,\{role:"link")/, - replace: "$self.wrapComponent(arguments[0], $1)" - } - } + match: /(?<=\.jsxs\)\()(\i\.\i),\{(?=role:"link")/, + replace: "$self.MentionTooltip,{Component:$1,vcProps:arguments[0]," + }, + predicate: () => settings.store.onLink, + }, + { + find: "Messages.REPLY_QUOTE_MESSAGE_NOT_LOADED", + replacement: { + // Should match two places + match: /(\i\.Clickable),\{/g, + replace: "$self.ReplyTooltip,{Component:$1,vcProps:arguments[0]," + }, + predicate: () => settings.store.onReply, + }, + { + find: "Messages.MESSAGE_FORWARDED}", + replacement: { + match: /(\i\.Clickable),\{/, + replace: "$self.ForwardTooltip,{Component:$1,vcProps:arguments[0]," + }, + predicate: () => settings.store.onForward, + }, ], - wrapComponent({ messageId, channelId }, Component: ComponentType) { - return props => { - if (messageId === undefined) return ; - return - - - } - > - {({ onMouseEnter, onMouseLeave }) => - - } - ; - }; - } + MentionTooltip({ Component, vcProps, ...props }) { + return withTooltip(Component, props, vcProps.messageId, vcProps.channelId); + }, + + ReplyTooltip({ Component, vcProps, ...props }) { + const mess = vcProps.baseMessage.messageReference; + return withTooltip(Component, props, mess?.message_id, mess?.channel_id); + }, + + ForwardTooltip({ Component, vcProps, ...props }) { + const mess = vcProps.message.messageReference; + return withTooltip(Component, props, mess?.message_id, mess?.channel_id); + }, }); +function withTooltip(Component, props, messageId, channelId) { + if (!messageId) return ; + return + + + } + children={({ onMouseEnter, onMouseLeave }) => + } + />; +} + function MessagePreview({ channelId, messageId }) { const channel = ChannelStore.getChannel(channelId); const message = useMessage(channelId, messageId); + const rawCompact = MessageDisplayCompact.useSetting(); + + const compact = settings.store.display === "compact" ? true : settings.store.display === "cozy" ? false : rawCompact; + // TODO handle load failure if (!message) { return ; @@ -94,6 +168,7 @@ function MessagePreview({ channelId, messageId }) { message={message} channel={channel} subscribeToComponentDispatch={false} + compact={compact} />; } @@ -107,7 +182,7 @@ function useMessage(channelId, messageId) { if (message == null) (async () => { const res = await RestAPI.get({ - url: `/channels/${channelId}/messages`, + url: Constants.Endpoints.MESSAGES(channelId), query: { limit: 1, around: messageId, diff --git a/src/equicordplugins/moreThemes/index.ts b/src/equicordplugins/moreThemes/index.ts new file mode 100644 index 00000000..9627dac4 --- /dev/null +++ b/src/equicordplugins/moreThemes/index.ts @@ -0,0 +1,34 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2024 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { Devs } from "@utils/constants"; +import definePlugin from "@utils/types"; + +export default definePlugin({ + name: "MoreThemes", + description: "Enables Darker and Midnight themes", + authors: [Devs.Kyuuhachi], + + patches: [ + { + // matches twice: the settings menu and the settings context menu + find: '("appearance_settings")', + replacement: { + match: /\("appearance_settings"\)/, + replace: "$&||true" + }, + all: true, + }, + { + // make it actually save the setting instead of falling back to dark + find: 'getCurrentConfig({location:"ThemeStore"}).enabled', + replacement: { + match: /getCurrentConfig\(\{location:"ThemeStore"\}\)\.enabled/, + replace: "$&&&false" + }, + } + ], +}); diff --git a/src/plugins/_core/settings.tsx b/src/plugins/_core/settings.tsx index 6981f783..5ec3c048 100644 --- a/src/plugins/_core/settings.tsx +++ b/src/plugins/_core/settings.tsx @@ -218,7 +218,8 @@ export default definePlugin({ // @ts-ignore Typescript will add userAgentData IMMEDIATELY || navigator.userAgentData?.brands?.find(b => b.brand === "Chromium" || b.brand === "Google Chrome")?.version || null; - } catch { // inb4 some stupid browser throws unsupported error for navigator.userAgentData, it's only in chromium + } catch { + // inb4 some stupid browser throws unsupported error for navigator.userAgentData, it's only in chromium return null; } }, diff --git a/src/plugins/arRPC.web/index.tsx b/src/plugins/arRPC.web/index.tsx index df307e75..04289e57 100644 --- a/src/plugins/arRPC.web/index.tsx +++ b/src/plugins/arRPC.web/index.tsx @@ -83,14 +83,16 @@ export default definePlugin({ const connectionSuccessful = await new Promise(res => setTimeout(() => res(ws.readyState === WebSocket.OPEN), 1000)); // check if open after 1s if (!connectionSuccessful) { - showNotice("Failed to connect to arRPC, is it running?", "Retry", () => { // show notice about failure to connect, with retry/ignore + showNotice("Failed to connect to arRPC, is it running?", "Retry", () => { + // show notice about failure to connect, with retry/ignore popNotice(); this.start(); }); return; } - Toasts.show({ // show toast on success + Toasts.show({ + // show toast on success message: "Connected to arRPC", type: Toasts.Type.SUCCESS, id: Toasts.genId(), diff --git a/src/plugins/betterSettings/index.tsx b/src/plugins/betterSettings/index.tsx index f0dd89a7..3ffd17f6 100644 --- a/src/plugins/betterSettings/index.tsx +++ b/src/plugins/betterSettings/index.tsx @@ -84,19 +84,22 @@ export default definePlugin({ { find: "this.renderArtisanalHack()", replacement: [ - { // Fade in on layer + { + // Fade in on layer match: /(?<=\((\i),"contextType",\i\.\i\);)/, replace: "$1=$self.Layer;", predicate: () => settings.store.disableFade }, - { // Lazy-load contents + { + // Lazy-load contents match: /createPromise:\(\)=>([^:}]*?),webpackId:"?\d+"?,name:(?!="CollectiblesShop")"[^"]+"/g, replace: "$&,_:$1", predicate: () => settings.store.eagerLoad } ] }, - { // For some reason standardSidebarView also has a small fade-in + { + // For some reason standardSidebarView also has a small fade-in find: 'minimal:"contentColumnMinimal"', replacement: [ { @@ -110,7 +113,8 @@ export default definePlugin({ ], predicate: () => settings.store.disableFade }, - { // Load menu TOC eagerly + { + // Load menu TOC eagerly find: "Messages.USER_SETTINGS_WITH_BUILD_OVERRIDE.format", replacement: { match: /(\i)\(this,"handleOpenSettingsContextMenu",.{0,100}?null!=\i&&.{0,100}?(await Promise\.all[^};]*?\)\)).*?,(?=\1\(this)/, @@ -118,7 +122,8 @@ export default definePlugin({ }, predicate: () => settings.store.eagerLoad }, - { // Settings cog context menu + { + // Settings cog context menu find: "Messages.USER_SETTINGS_ACTIONS_MENU_LABEL", replacement: [ { diff --git a/src/plugins/customidle/index.ts b/src/plugins/customidle/index.ts index 7d353f15..97a77973 100644 --- a/src/plugins/customidle/index.ts +++ b/src/plugins/customidle/index.ts @@ -84,7 +84,8 @@ export default definePlugin({ }); }, - getIdleTimeout() { // milliseconds, default is 6e5 + getIdleTimeout() { + // milliseconds, default is 6e5 const { idleTimeout } = settings.store; return idleTimeout === 0 ? Infinity : idleTimeout * 60000; } diff --git a/src/plugins/messageLatency/index.tsx b/src/plugins/messageLatency/index.tsx index e4e5b877..a96fe9a1 100644 --- a/src/plugins/messageLatency/index.tsx +++ b/src/plugins/messageLatency/index.tsx @@ -108,7 +108,8 @@ export default definePlugin({ // Old Discord Android clients have a delay of around 17 days // This is a workaround for that - if (-delta >= DISCORD_KT_DELAY - 86400000) { // One day of padding for good measure + if (-delta >= DISCORD_KT_DELAY - 86400000) { + // One day of padding for good measure isDiscordKotlin = detectDiscordKotlin; delta += DISCORD_KT_DELAY; } diff --git a/src/plugins/quickReply/index.ts b/src/plugins/quickReply/index.ts index ac2a3870..0a1beb54 100644 --- a/src/plugins/quickReply/index.ts +++ b/src/plugins/quickReply/index.ts @@ -135,7 +135,8 @@ function jumpIfOffScreen(channelId: string, messageId: string) { function getNextMessage(isUp: boolean, isReply: boolean) { let messages: Array = MessageStore.getMessages(SelectedChannelStore.getChannelId())._array; - if (!isReply) { // we are editing so only include own + if (!isReply) { + // we are editing so only include own const meId = UserStore.getCurrentUser().id; messages = messages.filter(m => m.author.id === meId); }