From c653e361378888b8d460805ab9d0aface5e7b161 Mon Sep 17 00:00:00 2001 From: sadan4 <117494111+sadan4@users.noreply.github.com> Date: Thu, 3 Jul 2025 20:14:59 -0400 Subject: [PATCH] fix Expression Cloner, ServerInfo & SeeSummaries plugins (#3536) --- src/plugins/expressionCloner/index.tsx | 14 ++++++++++---- src/plugins/pauseInvitesForever/index.tsx | 6 +++--- src/plugins/seeSummaries/index.tsx | 8 +++++--- src/plugins/serverInfo/GuildInfoModal.tsx | 4 ++-- src/utils/discord.tsx | 13 +++++++++++++ 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/plugins/expressionCloner/index.tsx b/src/plugins/expressionCloner/index.tsx index c1244fae..6f84e7f7 100644 --- a/src/plugins/expressionCloner/index.tsx +++ b/src/plugins/expressionCloner/index.tsx @@ -20,12 +20,13 @@ import { findGroupChildrenByChildId, NavContextMenuPatchCallback } from "@api/Co import { migratePluginSettings } from "@api/Settings"; import { CheckedTextInput } from "@components/CheckedTextInput"; import { Devs } from "@utils/constants"; +import { getGuildAcronym } from "@utils/discord"; import { Logger } from "@utils/Logger"; import { Margins } from "@utils/margins"; import { ModalContent, ModalHeader, ModalRoot, openModalLazy } from "@utils/modal"; import definePlugin from "@utils/types"; import { findByCodeLazy, findStoreLazy } from "@webpack"; -import { Constants, EmojiStore, FluxDispatcher, Forms, GuildStore, Menu, PermissionsBits, PermissionStore, React, RestAPI, Toasts, Tooltip, UserStore } from "@webpack/common"; +import { Constants, EmojiStore, FluxDispatcher, Forms, GuildStore, IconUtils, Menu, PermissionsBits, PermissionStore, React, RestAPI, Toasts, Tooltip, UserStore } from "@webpack/common"; import { Guild } from "discord-types/general"; import { Promisable } from "type-fest"; @@ -250,13 +251,18 @@ function CloneModal({ data }: { data: Sticker | Emoji; }) { width: "100%", height: "100%", }} - src={g.getIconURL(512, true)} + src={IconUtils.getGuildIconURL({ + id: g.id, + icon: g.icon, + canAnimate: true, + size: 512 + })} alt={g.name} /> ) : ( - {g.acronym} + {getGuildAcronym(g)} )} diff --git a/src/plugins/pauseInvitesForever/index.tsx b/src/plugins/pauseInvitesForever/index.tsx index 432d1c1c..577d8bd7 100644 --- a/src/plugins/pauseInvitesForever/index.tsx +++ b/src/plugins/pauseInvitesForever/index.tsx @@ -18,7 +18,7 @@ import ErrorBoundary from "@components/ErrorBoundary"; import { Devs } from "@utils/constants"; -import { getIntlMessage } from "@utils/discord"; +import { getIntlMessage, hasGuildFeature } from "@utils/discord"; import definePlugin from "@utils/types"; import { Constants, GuildStore, PermissionStore, RestAPI } from "@webpack/common"; @@ -27,8 +27,8 @@ function showDisableInvites(guildId: string) { if (!guild) return false; return ( - // @ts-ignore - !guild.hasFeature("INVITES_DISABLED") && + // @ts-expect-error + !hasGuildFeature(guild, "INVITES_DISABLED") && PermissionStore.getGuildPermissionProps(guild).canManageRoles ); } diff --git a/src/plugins/seeSummaries/index.tsx b/src/plugins/seeSummaries/index.tsx index de50e0a9..343348f1 100644 --- a/src/plugins/seeSummaries/index.tsx +++ b/src/plugins/seeSummaries/index.tsx @@ -7,6 +7,7 @@ import { DataStore } from "@api/index"; import { definePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; +import { hasGuildFeature } from "@utils/discord"; import definePlugin, { OptionType } from "@utils/types"; import { findByCodeLazy, findByPropsLazy } from "@webpack"; import { ChannelStore, GuildStore } from "@webpack/common"; @@ -57,7 +58,7 @@ export default definePlugin({ { find: "SUMMARIZEABLE.has", replacement: { - match: /\i\.hasFeature\(\i\.\i\.SUMMARIES_ENABLED\w+?\)/g, + match: /\i\.features\.has\(\i\.\i\.SUMMARIES_ENABLED\w+?\)/g, replace: "true" } }, @@ -109,7 +110,8 @@ export default definePlugin({ const channel = ChannelStore.getChannel(channelId); // SUMMARIES_ENABLED feature is not in discord-types const guild = GuildStore.getGuild(channel.guild_id); - // @ts-ignore - return guild.hasFeature("SUMMARIES_ENABLED_GA"); + + // @ts-expect-error + return hasGuildFeature(guild, "SUMMARIES_ENABLED_GA"); } }); diff --git a/src/plugins/serverInfo/GuildInfoModal.tsx b/src/plugins/serverInfo/GuildInfoModal.tsx index c62352f2..359590cf 100644 --- a/src/plugins/serverInfo/GuildInfoModal.tsx +++ b/src/plugins/serverInfo/GuildInfoModal.tsx @@ -7,7 +7,7 @@ import "./styles.css"; import { classNameFactory } from "@api/Styles"; -import { openImageModal, openUserProfile } from "@utils/discord"; +import { getGuildAcronym, openImageModal, openUserProfile } from "@utils/discord"; import { classes } from "@utils/misc"; import { ModalRoot, ModalSize, openModal } from "@utils/modal"; import { useAwaiter } from "@utils/react"; @@ -103,7 +103,7 @@ function GuildInfoModal({ guild }: GuildProps) { width: 512, })} /> - :
{guild.acronym}
+ :
{getGuildAcronym(guild)}
}
diff --git a/src/utils/discord.tsx b/src/utils/discord.tsx index e04ad201..fce909c3 100644 --- a/src/utils/discord.tsx +++ b/src/utils/discord.tsx @@ -19,6 +19,7 @@ import { MessageObject } from "@api/MessageEvents"; import { ChannelActionCreators, ChannelStore, ComponentDispatch, Constants, FluxDispatcher, GuildStore, i18n, IconUtils, InviteActions, MessageActions, RestAPI, SelectedChannelStore, SelectedGuildStore, UserProfileActions, UserProfileStore, UserSettingsActionCreators, UserUtils } from "@webpack/common"; import { Channel, Guild, Message, User } from "discord-types/general"; +import GuildFeatures from "discord-types/other/Constants"; import { Except } from "type-fest"; import { runtimeHashMessageKey } from "./intlHash"; @@ -218,3 +219,15 @@ export function getEmojiURL(id: string, animated: boolean, size: number) { const url = IconUtils.getEmojiURL({ id, animated, size }); return animated ? url.replace(".webp", ".gif") : url; } + +// Discord has a similar function in their code +export function getGuildAcronym(guild: Guild): string { + return guild.name + .replaceAll("'s ", " ") + .replace(/\w+/g, m => m[0]) + .replace(/\s/g, ""); +} + +export function hasGuildFeature(guild: Guild, feature: keyof GuildFeatures["GuildFeatures"]): boolean { + return guild.features?.has(feature) ?? false; +}