76 lines
2.1 KiB
TypeScript
76 lines
2.1 KiB
TypeScript
// src/core/plugins/NoDelete/index.ts
|
|
import { defineCorePlugin } from "..";
|
|
import { findByStoreName } from "@metro";
|
|
import { before } from "@lib/api/patcher";
|
|
import { logger } from "@lib/utils/logger";
|
|
import { FluxDispatcher } from "@metro/common";
|
|
|
|
type PatchCleanupFn = () => void;
|
|
|
|
let patches: PatchCleanupFn[] = [];
|
|
let MessageStore: any = null;
|
|
let deleteable: string[] = [];
|
|
|
|
function patchDispatcher(): PatchCleanupFn {
|
|
return before("dispatch", FluxDispatcher, (args: any[]) => {
|
|
try {
|
|
if (!MessageStore) MessageStore = findByStoreName("MessageStore");
|
|
|
|
const event = args[0];
|
|
if (!event || event?.type !== "MESSAGE_DELETE") return;
|
|
if (!event?.id || !event?.channelId) return;
|
|
|
|
if (deleteable.includes(event.id)) {
|
|
deleteable.splice(deleteable.indexOf(event.id), 1);
|
|
return;
|
|
}
|
|
|
|
deleteable.push(event.id);
|
|
|
|
args[0] = {
|
|
type: "MESSAGE_EDIT_FAILED_AUTOMOD",
|
|
messageData: {
|
|
type: 1,
|
|
message: {
|
|
channelId: event.channelId,
|
|
messageId: event.id,
|
|
},
|
|
},
|
|
errorResponseBody: {
|
|
code: 200000,
|
|
message: "[deleted]",
|
|
},
|
|
};
|
|
} catch (e) {
|
|
logger.error("NoDelete: dispatcher patch failed", e);
|
|
}
|
|
});
|
|
}
|
|
|
|
export default defineCorePlugin({
|
|
manifest: {
|
|
id: "bunny.nodelete",
|
|
version: "1.0.0",
|
|
type: "plugin",
|
|
spec: 3,
|
|
main: "",
|
|
display: {
|
|
name: "NoDelete",
|
|
description: "Prevents messages from being deleted from your view",
|
|
authors: [{ name: "meqativ" }],
|
|
},
|
|
},
|
|
|
|
start() {
|
|
patches = [patchDispatcher()].filter(Boolean);
|
|
logger.log("NoDelete: Enabled");
|
|
},
|
|
|
|
stop() {
|
|
patches.forEach((p) => p?.());
|
|
patches = [];
|
|
deleteable = [];
|
|
MessageStore = null;
|
|
logger.log("NoDelete: Disabled");
|
|
},
|
|
});
|