MessageLinkEmbeds: Prevent infinite cycles (#488)

This commit is contained in:
Ven 2023-02-12 19:43:57 +01:00 committed by GitHub
parent 2489bc6831
commit 614234ad20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -139,6 +139,16 @@ interface MessageEmbedProps {
guildID: string; guildID: string;
} }
function withEmbeddedBy(message: Message, embeddedBy: string[]) {
return new Proxy(message, {
get(_, prop) {
if (prop === "vencordEmbeddedBy") return embeddedBy;
// @ts-ignore ts so bad
return Reflect.get(...arguments);
}
});
}
export default definePlugin({ export default definePlugin({
name: "MessageLinkEmbeds", name: "MessageLinkEmbeds",
description: "Adds a preview to messages that link another message", description: "Adds a preview to messages that link another message",
@ -194,19 +204,24 @@ export default definePlugin({
messageEmbedAccessory(props) { messageEmbedAccessory(props) {
const { message }: { message: Message; } = props; const { message }: { message: Message; } = props;
// @ts-ignore
const embeddedBy: string[] = message.vencordEmbeddedBy ?? [];
const accessories = [] as (JSX.Element | null)[]; const accessories = [] as (JSX.Element | null)[];
let match = null as RegExpMatchArray | null; let match = null as RegExpMatchArray | null;
while ((match = this.messageLinkRegex.exec(message.content!)) !== null) { while ((match = this.messageLinkRegex.exec(message.content!)) !== null) {
const [_, guildID, channelID, messageID] = match; const [_, guildID, channelID, messageID] = match;
if (embeddedBy.includes(messageID)) {
continue;
}
const linkedChannel = ChannelStore.getChannel(channelID); const linkedChannel = ChannelStore.getChannel(channelID);
if (!linkedChannel || (guildID !== "@me" && !PermissionStore.can(1024n /* view channel */, linkedChannel))) { if (!linkedChannel || (guildID !== "@me" && !PermissionStore.can(1024n /* view channel */, linkedChannel))) {
continue; continue;
} }
let linkedMessage = messageCache[messageID]?.message as Message; let linkedMessage = messageCache[messageID]?.message;
if (!linkedMessage) { if (!linkedMessage) {
linkedMessage ??= MessageStore.getMessage(channelID, messageID); linkedMessage ??= MessageStore.getMessage(channelID, messageID);
if (linkedMessage) messageCache[messageID] = { message: linkedMessage, fetched: true }; if (linkedMessage) messageCache[messageID] = { message: linkedMessage, fetched: true };
@ -223,7 +238,7 @@ export default definePlugin({
} }
} }
const messageProps: MessageEmbedProps = { const messageProps: MessageEmbedProps = {
message: linkedMessage, message: withEmbeddedBy(linkedMessage, [...embeddedBy, message.id]),
channel: linkedChannel, channel: linkedChannel,
guildID guildID
}; };