Migrate AutoDelete to new Plugin structure

This commit is contained in:
Dark 2020-07-23 02:06:50 +02:00
parent ebcb28261b
commit e682e9b8c5
9 changed files with 194 additions and 0 deletions

View file

@ -0,0 +1,17 @@
import { PluginData } from "knub";
import { AutoDeletePluginType } from "../types";
import { SavedMessage } from "src/data/entities/SavedMessage";
import { scheduleNextDeletion } from "./scheduleNextDeletion";
import { sorter } from "src/utils";
export function addMessageToDeletionQueue(
pluginData: PluginData<AutoDeletePluginType>,
msg: SavedMessage,
delay: number,
) {
const deleteAt = Date.now() + delay;
pluginData.state.deletionQueue.push({ deleteAt, message: msg });
pluginData.state.deletionQueue.sort(sorter("deleteAt"));
scheduleNextDeletion(pluginData);
}

View file

@ -0,0 +1,28 @@
import { PluginData } from "knub";
import { AutoDeletePluginType } from "../types";
import moment from "moment-timezone";
import { LogType } from "src/data/LogType";
import { stripObjectToScalars, resolveUser } from "src/utils";
import { logger } from "src/logger";
import { scheduleNextDeletion } from "./scheduleNextDeletion";
export async function deleteNextItem(pluginData: PluginData<AutoDeletePluginType>) {
const [itemToDelete] = pluginData.state.deletionQueue.splice(0, 1);
if (!itemToDelete) return;
pluginData.state.guildLogs.ignoreLog(LogType.MESSAGE_DELETE, itemToDelete.message.id);
pluginData.client.deleteMessage(itemToDelete.message.channel_id, itemToDelete.message.id).catch(logger.warn);
scheduleNextDeletion(pluginData);
const user = await resolveUser(pluginData.client, itemToDelete.message.user_id);
const channel = pluginData.guild.channels.get(itemToDelete.message.channel_id);
const messageDate = moment(itemToDelete.message.data.timestamp, "x").format("YYYY-MM-DD HH:mm:ss");
pluginData.state.guildLogs.log(LogType.MESSAGE_DELETE_AUTO, {
message: itemToDelete.message,
user: stripObjectToScalars(user),
channel: stripObjectToScalars(channel),
messageDate,
});
}

View file

@ -0,0 +1,26 @@
import { AutoDeletePluginType, MAX_DELAY } from "../types";
import { PluginData } from "knub";
import { SavedMessage } from "src/data/entities/SavedMessage";
import { convertDelayStringToMS, resolveMember } from "src/utils";
import { LogType } from "src/data/LogType";
import { addMessageToDeletionQueue } from "./addMessageToDeletionQueue";
export async function onMessageCreate(pluginData: PluginData<AutoDeletePluginType>, msg: SavedMessage) {
const member = await resolveMember(pluginData.client, pluginData.guild, msg.user_id);
const config = pluginData.config.getMatchingConfig({ member, channelId: msg.channel_id });
if (config.enabled) {
let delay = convertDelayStringToMS(config.delay);
if (delay > MAX_DELAY) {
delay = MAX_DELAY;
if (!pluginData.state.maxDelayWarningSent) {
pluginData.state.guildLogs.log(LogType.BOT_ALERT, {
body: `Clamped auto-deletion delay in <#${msg.channel_id}> to 5 minutes`,
});
pluginData.state.maxDelayWarningSent = true;
}
}
addMessageToDeletionQueue(pluginData, msg, delay);
}
}

View file

@ -0,0 +1,12 @@
import { PluginData } from "knub";
import { AutoDeletePluginType } from "../types";
import { SavedMessage } from "src/data/entities/SavedMessage";
import { scheduleNextDeletion } from "./scheduleNextDeletion";
export function onMessageDelete(pluginData: PluginData<AutoDeletePluginType>, msg: SavedMessage) {
const indexToDelete = pluginData.state.deletionQueue.findIndex(item => item.message.id === msg.id);
if (indexToDelete > -1) {
pluginData.state.deletionQueue.splice(indexToDelete, 1);
scheduleNextDeletion(pluginData);
}
}

View file

@ -0,0 +1,10 @@
import { AutoDeletePluginType } from "../types";
import { PluginData } from "knub";
import { SavedMessage } from "src/data/entities/SavedMessage";
import { onMessageDelete } from "./onMessageDelete";
export function onMessageDeleteBulk(pluginData: PluginData<AutoDeletePluginType>, messages: SavedMessage[]) {
for (const msg of messages) {
onMessageDelete(pluginData, msg);
}
}

View file

@ -0,0 +1,14 @@
import { PluginData } from "knub";
import { AutoDeletePluginType } from "../types";
import { deleteNextItem } from "./deleteNextItem";
export function scheduleNextDeletion(pluginData: PluginData<AutoDeletePluginType>) {
if (pluginData.state.deletionQueue.length === 0) {
clearTimeout(pluginData.state.nextDeletionTimeout);
return;
}
const firstDeleteAt = pluginData.state.deletionQueue[0].deleteAt;
clearTimeout(pluginData.state.nextDeletionTimeout);
pluginData.state.nextDeletionTimeout = setTimeout(() => deleteNextItem(pluginData), firstDeleteAt - Date.now());
}