MessageLinkEmbeds: Prevent infinite cycles (#488)
This commit is contained in:
parent
2489bc6831
commit
614234ad20
|
@ -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
|
||||||
};
|
};
|
||||||
|
@ -267,7 +282,7 @@ export default definePlugin({
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
renderDescription={() => {
|
renderDescription={() => {
|
||||||
return <div key={message.id} className={classNames.join(" ")} >
|
return <div key={message.id} className={classNames.join(" ")}>
|
||||||
<ChannelMessage
|
<ChannelMessage
|
||||||
id={`message-link-embeds-${message.id}`}
|
id={`message-link-embeds-${message.id}`}
|
||||||
message={message}
|
message={message}
|
||||||
|
|
Loading…
Reference in a new issue