diff --git a/src/api/ContextMenu.ts b/src/api/ContextMenu.ts index fdd4facf..fd8c7e10 100644 --- a/src/api/ContextMenu.ts +++ b/src/api/ContextMenu.ts @@ -90,19 +90,20 @@ export function removeGlobalContextMenuPatch(patch: GlobalContextMenuPatchCallba * A helper function for finding the children array of a group nested inside a context menu based on the id(s) of its children * @param id The id of the child. If an array is specified, all ids will be tried * @param children The context menu children + * @param matchSubstring Whether to check if the id is a substring of the child id */ -export function findGroupChildrenByChildId(id: string | string[], children: Array): Array | null { +export function findGroupChildrenByChildId(id: string | string[], children: Array, matchSubstring = false): Array | null { for (const child of children) { if (child == null) continue; if (Array.isArray(child)) { - const found = findGroupChildrenByChildId(id, child); + const found = findGroupChildrenByChildId(id, child, matchSubstring); if (found !== null) return found; } if ( - (Array.isArray(id) && id.some(id => child.props?.id === id)) - || child.props?.id === id + (Array.isArray(id) && id.some(id => matchSubstring ? child.props?.id?.includes(id) : child.props?.id === id)) + || matchSubstring ? child.props?.id?.includes(id) : child.props?.id === id ) return children; let nextChildren = child.props?.children; @@ -112,7 +113,7 @@ export function findGroupChildrenByChildId(id: string | string[], children: Arra child.props.children = nextChildren; } - const found = findGroupChildrenByChildId(id, nextChildren); + const found = findGroupChildrenByChildId(id, nextChildren, matchSubstring); if (found !== null) return found; } } diff --git a/src/equicordplugins/atSomeone/index.ts b/src/equicordplugins/atSomeone/index.ts index 193c3888..5a356a37 100644 --- a/src/equicordplugins/atSomeone/index.ts +++ b/src/equicordplugins/atSomeone/index.ts @@ -10,7 +10,7 @@ import definePlugin from "@utils/types"; import { ChannelStore, GuildMemberStore, SelectedChannelStore, SelectedGuildStore } from "@webpack/common"; export default definePlugin({ - name: "atSomeone", + name: "AtSomeone", authors: [Devs.Joona], description: "Mention someone randomly", patches: [ diff --git a/src/equicordplugins/messageLoggerEnhanced/index.tsx b/src/equicordplugins/messageLoggerEnhanced/index.tsx index 95616174..c1a4587a 100644 --- a/src/equicordplugins/messageLoggerEnhanced/index.tsx +++ b/src/equicordplugins/messageLoggerEnhanced/index.tsx @@ -567,7 +567,7 @@ const contextMenuPath: NavContextMenuPatchCallback = (children, props) => { export default definePlugin({ name: "MessageLoggerEnhanced", authors: [Devs.Aria], - description: "G'day", + description: "logs messages, images, and ghost pings", dependencies: ["MessageLogger"], contextMenus: { "message": contextMenuPath, diff --git a/src/plugins/fakeNitro/index.tsx b/src/plugins/fakeNitro/index.tsx index de07ce0d..05dd546a 100644 --- a/src/plugins/fakeNitro/index.tsx +++ b/src/plugins/fakeNitro/index.tsx @@ -203,6 +203,15 @@ export default definePlugin({ settings, patches: [ + // Patch the emoji picker in voice calls to not be bypassed by fake nitro + { + find: "emojiItemDisabled]", + predicate: () => settings.store.enableEmojiBypass, + replacement: { + match: /CHAT/, + replace: "STATUS" + } + }, { find: ".PREMIUM_LOCKED;", group: true, diff --git a/src/plugins/fullSearchContext/index.tsx b/src/plugins/fullSearchContext/index.tsx index 158612c6..193e69f1 100644 --- a/src/plugins/fullSearchContext/index.tsx +++ b/src/plugins/fullSearchContext/index.tsx @@ -16,16 +16,25 @@ * along with this program. If not, see . */ +import { findGroupChildrenByChildId, NavContextMenuPatchCallback } from "@api/ContextMenu"; import { migratePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; +import { NoopComponent } from "@utils/react"; import definePlugin from "@utils/types"; -import { findByPropsLazy } from "@webpack"; +import { filters, findByPropsLazy, waitFor } from "@webpack"; import { ChannelStore, ContextMenuApi, i18n, UserStore } from "@webpack/common"; import { Message } from "discord-types/general"; -import type { MouseEvent } from "react"; const { useMessageMenu } = findByPropsLazy("useMessageMenu"); +interface CopyIdMenuItemProps { + id: string; + label: string; +} + +let CopyIdMenuItem: (props: CopyIdMenuItemProps) => React.ReactElement | null = NoopComponent; +waitFor(filters.componentByCode('"devmode-copy-id-".concat'), m => CopyIdMenuItem = m); + function MessageMenu({ message, channel, onHeightUpdate }) { const canReport = message.author && !(message.author.id === UserStore.getCurrentUser().id || message.author.system); @@ -48,9 +57,25 @@ function MessageMenu({ message, channel, onHeightUpdate }) { itemSrc: void 0, itemSafeSrc: void 0, itemTextContent: void 0, + + isFullSearchContextMenu: true }); } +interface MessageActionsProps { + message: Message; + isFullSearchContextMenu?: boolean; +} + +const contextMenuPatch: NavContextMenuPatchCallback = (children, props: MessageActionsProps) => { + if (props?.isFullSearchContextMenu == null) return; + + const group = findGroupChildrenByChildId("devmode-copy-id", children, true); + group?.push( + CopyIdMenuItem({ id: props.message.author.id, label: i18n.Messages.COPY_ID_AUTHOR }) + ); +}; + migratePluginSettings("FullSearchContext", "SearchReply"); export default definePlugin({ name: "FullSearchContext", @@ -65,7 +90,7 @@ export default definePlugin({ } }], - handleContextMenu(event: MouseEvent, message: Message) { + handleContextMenu(event: React.MouseEvent, message: Message) { const channel = ChannelStore.getChannel(message.channel_id); if (!channel) return; @@ -78,5 +103,9 @@ export default definePlugin({ onHeightUpdate={contextMenuProps.onHeightUpdate} /> ); + }, + + contextMenus: { + "message-actions": contextMenuPatch } }); diff --git a/src/plugins/platformIndicators/index.tsx b/src/plugins/platformIndicators/index.tsx index 18c71db9..526de858 100644 --- a/src/plugins/platformIndicators/index.tsx +++ b/src/plugins/platformIndicators/index.tsx @@ -67,6 +67,7 @@ const Icons = { web: Icon("M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2Zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93Zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39Z"), mobile: Icon("M 187 0 L 813 0 C 916.277 0 1000 83.723 1000 187 L 1000 1313 C 1000 1416.277 916.277 1500 813 1500 L 187 1500 C 83.723 1500 0 1416.277 0 1313 L 0 187 C 0 83.723 83.723 0 187 0 Z M 125 1000 L 875 1000 L 875 250 L 125 250 Z M 500 1125 C 430.964 1125 375 1180.964 375 1250 C 375 1319.036 430.964 1375 500 1375 C 569.036 1375 625 1319.036 625 1250 C 625 1180.964 569.036 1125 500 1125 Z", { viewBox: "0 0 1000 1500", height: 17, width: 17 }), embedded: Icon("M7 4a6 6 0 00-6 6v4a6 6 0 006 6h10a6 6 0 006-6v-4a6 6 0 00-6-6H7zm0 11a1 1 0 01-1-1v-1H5a1 1 0 010-2h1v-1a1 1 0 012 0v1h1a1 1 0 010 2H8v1a1 1 0 01-1 1zm10-4a1 1 0 100-2 1 1 0 000 2zm1 3a1 1 0 11-2 0 1 1 0 012 0zm0-2a1 1 0 102 0 1 1 0 00-2 0zm-3 1a1 1 0 110-2 1 1 0 010 2z", { viewBox: "0 0 24 24", height: 24, width: 24 }), + embeddedvc: Icon("M14.8 2.7 9 3.1V47h3.3c1.7 0 6.2.3 10 .7l6.7.6V2l-4.2.2c-2.4.1-6.9.3-10 .5zm1.8 6.4c1 1.7-1.3 3.6-2.7 2.2C12.7 10.1 13.5 8 15 8c.5 0 1.2.5 1.6 1.1zM16 33c0 6-.4 10-1 10s-1-4-1-10 .4-10 1-10 1 4 1 10zm15-8v23.3l3.8-.7c2-.3 4.7-.6 6-.6H43V3h-2.2c-1.3 0-4-.3-6-.6L31 1.7V25z", { viewBox: "0 0 50 50" }), }; type Platform = keyof typeof Icons; @@ -76,7 +77,10 @@ const PlatformIcon = ({ platform, status, small }: { platform: Platform, status: const tooltip = platform === "embedded" ? "Console" : platform[0].toUpperCase() + platform.slice(1); - const Icon = Icons[platform] ?? Icons.desktop; + let Icon = Icons[platform] ?? Icons.desktop; + if (Settings.plugins.PlatformIndicators.VencordConsoleIcon && platform === "embedded") { + Icon = Icons.embeddedvc; + } return ; }; @@ -298,6 +302,12 @@ export default definePlugin({ description: "Whether to show platform indicators on bots", default: false, restartNeeded: false + }, + VencordConsoleIcon: { + type: OptionType.BOOLEAN, + description: "Use Vencords Console Icon", + default: false, + restartNeeded: false, } } }); diff --git a/src/plugins/roleColorEverywhere/index.tsx b/src/plugins/roleColorEverywhere/index.tsx index c9ededc5..108ed00c 100644 --- a/src/plugins/roleColorEverywhere/index.tsx +++ b/src/plugins/roleColorEverywhere/index.tsx @@ -61,8 +61,7 @@ const settings = definePluginSettings({ type: OptionType.SLIDER, description: "Intensity of message coloring.", markers: makeRange(0, 100, 10), - default: 30, - restartNeeded: true + default: 30 }, }); diff --git a/src/plugins/userVoiceShow/index.tsx b/src/plugins/userVoiceShow/index.tsx index 98386a16..07b18c27 100644 --- a/src/plugins/userVoiceShow/index.tsx +++ b/src/plugins/userVoiceShow/index.tsx @@ -51,6 +51,7 @@ export default definePlugin({ name: "UserVoiceShow", description: "Shows an indicator when a user is in a Voice Channel", authors: [Devs.Nuckyz, Devs.LordElias], + dependencies: ["MemberListDecoratorsAPI", "MessageDecorationsAPI"], settings, patches: [