mirror of
https://github.com/ZeppelinBot/Zeppelin.git
synced 2025-03-16 22:21:51 +00:00
Typed log functions + more
This commit is contained in:
parent
d2ac700143
commit
bed6589d48
166 changed files with 4021 additions and 869 deletions
|
@ -1,12 +1,17 @@
|
||||||
import { Guild, Snowflake } from "discord.js";
|
import { Guild, Snowflake, User } from "discord.js";
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { isDefaultSticker } from "src/utils/isDefaultSticker";
|
import { isDefaultSticker } from "src/utils/isDefaultSticker";
|
||||||
import { getRepository, Repository } from "typeorm";
|
import { getRepository, Repository } from "typeorm";
|
||||||
import { renderTemplate } from "../templateFormatter";
|
import { renderTemplate, TemplateSafeValueContainer } from "../templateFormatter";
|
||||||
import { trimLines } from "../utils";
|
import { trimLines } from "../utils";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository";
|
||||||
import { ArchiveEntry } from "./entities/ArchiveEntry";
|
import { ArchiveEntry } from "./entities/ArchiveEntry";
|
||||||
import { SavedMessage } from "./entities/SavedMessage";
|
import { SavedMessage } from "./entities/SavedMessage";
|
||||||
|
import {
|
||||||
|
channelToTemplateSafeChannel,
|
||||||
|
guildToTemplateSafeGuild,
|
||||||
|
userToTemplateSafeUser,
|
||||||
|
} from "../utils/templateSafeObjects";
|
||||||
|
|
||||||
const DEFAULT_EXPIRY_DAYS = 30;
|
const DEFAULT_EXPIRY_DAYS = 30;
|
||||||
|
|
||||||
|
@ -75,9 +80,9 @@ export class GuildArchives extends BaseGuildRepository {
|
||||||
const msgLines: string[] = [];
|
const msgLines: string[] = [];
|
||||||
for (const msg of savedMessages) {
|
for (const msg of savedMessages) {
|
||||||
const channel = guild.channels.cache.get(msg.channel_id as Snowflake);
|
const channel = guild.channels.cache.get(msg.channel_id as Snowflake);
|
||||||
const user = { ...msg.data.author, id: msg.user_id };
|
const partialUser = new TemplateSafeValueContainer({ ...msg.data.author, id: msg.user_id });
|
||||||
|
|
||||||
const line = await renderTemplate(MESSAGE_ARCHIVE_MESSAGE_FORMAT, {
|
const values = new TemplateSafeValueContainer({
|
||||||
id: msg.id,
|
id: msg.id,
|
||||||
timestamp: moment.utc(msg.posted_at).format("YYYY-MM-DD HH:mm:ss"),
|
timestamp: moment.utc(msg.posted_at).format("YYYY-MM-DD HH:mm:ss"),
|
||||||
content: msg.data.content,
|
content: msg.data.content,
|
||||||
|
@ -87,9 +92,10 @@ export class GuildArchives extends BaseGuildRepository {
|
||||||
stickers: msg.data.stickers?.map(sti => {
|
stickers: msg.data.stickers?.map(sti => {
|
||||||
return JSON.stringify({ name: sti.name, id: sti.id, isDefault: isDefaultSticker(sti.id) });
|
return JSON.stringify({ name: sti.name, id: sti.id, isDefault: isDefaultSticker(sti.id) });
|
||||||
}),
|
}),
|
||||||
user,
|
user: partialUser,
|
||||||
channel,
|
channel: channel ? channelToTemplateSafeChannel(channel) : null,
|
||||||
});
|
});
|
||||||
|
const line = await renderTemplate(MESSAGE_ARCHIVE_MESSAGE_FORMAT, {});
|
||||||
msgLines.push(line);
|
msgLines.push(line);
|
||||||
}
|
}
|
||||||
return msgLines;
|
return msgLines;
|
||||||
|
@ -100,7 +106,9 @@ export class GuildArchives extends BaseGuildRepository {
|
||||||
expiresAt = moment.utc().add(DEFAULT_EXPIRY_DAYS, "days");
|
expiresAt = moment.utc().add(DEFAULT_EXPIRY_DAYS, "days");
|
||||||
}
|
}
|
||||||
|
|
||||||
const headerStr = await renderTemplate(MESSAGE_ARCHIVE_HEADER_FORMAT, { guild });
|
const headerStr = await renderTemplate(MESSAGE_ARCHIVE_HEADER_FORMAT, {
|
||||||
|
guild: guildToTemplateSafeGuild(guild),
|
||||||
|
});
|
||||||
const msgLines = await this.renderLinesFromSavedMessages(savedMessages, guild);
|
const msgLines = await this.renderLinesFromSavedMessages(savedMessages, guild);
|
||||||
const messagesStr = msgLines.join("\n");
|
const messagesStr = msgLines.join("\n");
|
||||||
|
|
||||||
|
|
|
@ -45,9 +45,90 @@ export class GuildSavedMessages extends BaseGuildRepository {
|
||||||
timestamp: msg.createdTimestamp,
|
timestamp: msg.createdTimestamp,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (msg.attachments.size) data.attachments = [...msg.attachments.values()];
|
if (msg.attachments.size) {
|
||||||
if (msg.embeds.length) data.embeds = msg.embeds;
|
data.attachments = Array.from(msg.attachments.values()).map(att => ({
|
||||||
if (msg.stickers?.size) data.stickers = [...msg.stickers.values()];
|
id: att.id,
|
||||||
|
contentType: att.contentType,
|
||||||
|
name: att.name,
|
||||||
|
proxyURL: att.proxyURL,
|
||||||
|
size: att.size,
|
||||||
|
spoiler: att.spoiler,
|
||||||
|
url: att.url,
|
||||||
|
width: att.width,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg.embeds.length) {
|
||||||
|
data.embeds = msg.embeds.map(embed => ({
|
||||||
|
title: embed.title,
|
||||||
|
description: embed.description,
|
||||||
|
url: embed.url,
|
||||||
|
timestamp: embed.timestamp,
|
||||||
|
color: embed.color,
|
||||||
|
|
||||||
|
fields: embed.fields.map(field => ({
|
||||||
|
name: field.name,
|
||||||
|
value: field.value,
|
||||||
|
inline: field.inline,
|
||||||
|
})),
|
||||||
|
|
||||||
|
author: embed.author
|
||||||
|
? {
|
||||||
|
name: embed.author.name,
|
||||||
|
url: embed.author.url,
|
||||||
|
iconURL: embed.author.iconURL,
|
||||||
|
proxyIconURL: embed.author.proxyIconURL,
|
||||||
|
}
|
||||||
|
: undefined,
|
||||||
|
|
||||||
|
thumbnail: embed.thumbnail
|
||||||
|
? {
|
||||||
|
url: embed.thumbnail.url,
|
||||||
|
proxyURL: embed.thumbnail.proxyURL,
|
||||||
|
height: embed.thumbnail.height,
|
||||||
|
width: embed.thumbnail.width,
|
||||||
|
}
|
||||||
|
: undefined,
|
||||||
|
|
||||||
|
image: embed.image
|
||||||
|
? {
|
||||||
|
url: embed.image.url,
|
||||||
|
proxyURL: embed.image.proxyURL,
|
||||||
|
height: embed.image.height,
|
||||||
|
width: embed.image.width,
|
||||||
|
}
|
||||||
|
: undefined,
|
||||||
|
|
||||||
|
video: embed.video
|
||||||
|
? {
|
||||||
|
url: embed.video.url,
|
||||||
|
proxyURL: embed.video.proxyURL,
|
||||||
|
height: embed.video.height,
|
||||||
|
width: embed.video.width,
|
||||||
|
}
|
||||||
|
: undefined,
|
||||||
|
|
||||||
|
footer: embed.footer
|
||||||
|
? {
|
||||||
|
text: embed.footer.text,
|
||||||
|
iconURL: embed.footer.iconURL,
|
||||||
|
proxyIconURL: embed.footer.proxyIconURL,
|
||||||
|
}
|
||||||
|
: undefined,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg.stickers?.size) {
|
||||||
|
data.stickers = Array.from(msg.stickers.values()).map(sticker => ({
|
||||||
|
format: sticker.format,
|
||||||
|
guildId: sticker.guildId,
|
||||||
|
id: sticker.id,
|
||||||
|
name: sticker.name,
|
||||||
|
description: sticker.description,
|
||||||
|
available: sticker.available,
|
||||||
|
type: sticker.type,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,16 +1,79 @@
|
||||||
import { MessageAttachment, Sticker } from "discord.js";
|
import { Snowflake } from "discord.js";
|
||||||
import { Column, Entity, PrimaryColumn } from "typeorm";
|
import { Column, Entity, PrimaryColumn } from "typeorm";
|
||||||
import { createEncryptedJsonTransformer } from "../encryptedJsonTransformer";
|
import { createEncryptedJsonTransformer } from "../encryptedJsonTransformer";
|
||||||
|
|
||||||
|
export interface ISavedMessageAttachmentData {
|
||||||
|
id: Snowflake;
|
||||||
|
contentType: string | null;
|
||||||
|
name: string | null;
|
||||||
|
proxyURL: string;
|
||||||
|
size: number;
|
||||||
|
spoiler: boolean;
|
||||||
|
url: string;
|
||||||
|
width: number | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ISavedMessageEmbedData {
|
||||||
|
title: string | null;
|
||||||
|
description: string | null;
|
||||||
|
url: string | null;
|
||||||
|
timestamp: number | null;
|
||||||
|
color: number | null;
|
||||||
|
fields: Array<{
|
||||||
|
name: string;
|
||||||
|
value: string;
|
||||||
|
inline: boolean;
|
||||||
|
}>;
|
||||||
|
author?: {
|
||||||
|
name?: string;
|
||||||
|
url?: string;
|
||||||
|
iconURL?: string;
|
||||||
|
proxyIconURL?: string;
|
||||||
|
};
|
||||||
|
thumbnail?: {
|
||||||
|
url: string;
|
||||||
|
proxyURL?: string;
|
||||||
|
height?: number;
|
||||||
|
width?: number;
|
||||||
|
};
|
||||||
|
image?: {
|
||||||
|
url: string;
|
||||||
|
proxyURL?: string;
|
||||||
|
height?: number;
|
||||||
|
width?: number;
|
||||||
|
};
|
||||||
|
video?: {
|
||||||
|
url?: string;
|
||||||
|
proxyURL?: string;
|
||||||
|
height?: number;
|
||||||
|
width?: number;
|
||||||
|
};
|
||||||
|
footer?: {
|
||||||
|
text?: string;
|
||||||
|
iconURL?: string;
|
||||||
|
proxyIconURL?: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ISavedMessageStickerData {
|
||||||
|
format: string;
|
||||||
|
guildId: Snowflake | null;
|
||||||
|
id: Snowflake;
|
||||||
|
name: string;
|
||||||
|
description: string | null;
|
||||||
|
available: boolean | null;
|
||||||
|
type: string | null;
|
||||||
|
}
|
||||||
|
|
||||||
export interface ISavedMessageData {
|
export interface ISavedMessageData {
|
||||||
attachments?: MessageAttachment[];
|
attachments?: ISavedMessageAttachmentData[];
|
||||||
author: {
|
author: {
|
||||||
username: string;
|
username: string;
|
||||||
discriminator: string;
|
discriminator: string;
|
||||||
};
|
};
|
||||||
content: string;
|
content: string;
|
||||||
embeds?: object[];
|
embeds?: ISavedMessageEmbedData[];
|
||||||
stickers?: Sticker[];
|
stickers?: ISavedMessageStickerData[];
|
||||||
timestamp: number;
|
timestamp: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Permissions, Snowflake, TextChannel } from "discord.js";
|
import { Permissions, Snowflake, TextChannel } from "discord.js";
|
||||||
import { GuildPluginData } from "knub";
|
import { GuildPluginData } from "knub";
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { channelToConfigAccessibleChannel, userToConfigAccessibleUser } from "../../../utils/configAccessibleObjects";
|
import { channelToTemplateSafeChannel, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { logger } from "../../../logger";
|
import { logger } from "../../../logger";
|
||||||
import { resolveUser, verboseChannelMention } from "../../../utils";
|
import { resolveUser, verboseChannelMention } from "../../../utils";
|
||||||
|
@ -27,7 +27,7 @@ export async function deleteNextItem(pluginData: GuildPluginData<AutoDeletePlugi
|
||||||
const perms = channel.permissionsFor(pluginData.client.user!.id);
|
const perms = channel.permissionsFor(pluginData.client.user!.id);
|
||||||
|
|
||||||
if (!hasDiscordPermissions(perms, Permissions.FLAGS.VIEW_CHANNEL | Permissions.FLAGS.READ_MESSAGE_HISTORY)) {
|
if (!hasDiscordPermissions(perms, Permissions.FLAGS.VIEW_CHANNEL | Permissions.FLAGS.READ_MESSAGE_HISTORY)) {
|
||||||
logs.log(LogType.BOT_ALERT, {
|
logs.logBotAlert({
|
||||||
body: `Missing permissions to read messages or message history in auto-delete channel ${verboseChannelMention(
|
body: `Missing permissions to read messages or message history in auto-delete channel ${verboseChannelMention(
|
||||||
channel,
|
channel,
|
||||||
)}`,
|
)}`,
|
||||||
|
@ -36,7 +36,7 @@ export async function deleteNextItem(pluginData: GuildPluginData<AutoDeletePlugi
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hasDiscordPermissions(perms, Permissions.FLAGS.MANAGE_MESSAGES)) {
|
if (!hasDiscordPermissions(perms, Permissions.FLAGS.MANAGE_MESSAGES)) {
|
||||||
logs.log(LogType.BOT_ALERT, {
|
logs.logBotAlert({
|
||||||
body: `Missing permissions to delete messages in auto-delete channel ${verboseChannelMention(channel)}`,
|
body: `Missing permissions to delete messages in auto-delete channel ${verboseChannelMention(channel)}`,
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
|
@ -59,10 +59,10 @@ export async function deleteNextItem(pluginData: GuildPluginData<AutoDeletePlugi
|
||||||
.inGuildTz(moment.utc(itemToDelete.message.data.timestamp, "x"))
|
.inGuildTz(moment.utc(itemToDelete.message.data.timestamp, "x"))
|
||||||
.format(timeAndDate.getDateFormat("pretty_datetime"));
|
.format(timeAndDate.getDateFormat("pretty_datetime"));
|
||||||
|
|
||||||
pluginData.state.guildLogs.log(LogType.MESSAGE_DELETE_AUTO, {
|
pluginData.getPlugin(LogsPlugin).logMessageDeleteAuto({
|
||||||
message: itemToDelete.message,
|
message: itemToDelete.message,
|
||||||
user: userToConfigAccessibleUser(user),
|
user,
|
||||||
channel: channelToConfigAccessibleChannel(channel),
|
channel,
|
||||||
messageDate,
|
messageDate,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { LogType } from "../../../data/LogType";
|
||||||
import { convertDelayStringToMS, resolveMember } from "../../../utils";
|
import { convertDelayStringToMS, resolveMember } from "../../../utils";
|
||||||
import { AutoDeletePluginType, MAX_DELAY } from "../types";
|
import { AutoDeletePluginType, MAX_DELAY } from "../types";
|
||||||
import { addMessageToDeletionQueue } from "./addMessageToDeletionQueue";
|
import { addMessageToDeletionQueue } from "./addMessageToDeletionQueue";
|
||||||
|
import { LogsPlugin } from "../../Logs/LogsPlugin";
|
||||||
|
|
||||||
export async function onMessageCreate(pluginData: GuildPluginData<AutoDeletePluginType>, msg: SavedMessage) {
|
export async function onMessageCreate(pluginData: GuildPluginData<AutoDeletePluginType>, msg: SavedMessage) {
|
||||||
const member = await resolveMember(pluginData.client, pluginData.guild, msg.user_id);
|
const member = await resolveMember(pluginData.client, pluginData.guild, msg.user_id);
|
||||||
|
@ -14,7 +15,7 @@ export async function onMessageCreate(pluginData: GuildPluginData<AutoDeletePlug
|
||||||
if (delay > MAX_DELAY) {
|
if (delay > MAX_DELAY) {
|
||||||
delay = MAX_DELAY;
|
delay = MAX_DELAY;
|
||||||
if (!pluginData.state.maxDelayWarningSent) {
|
if (!pluginData.state.maxDelayWarningSent) {
|
||||||
pluginData.state.guildLogs.log(LogType.BOT_ALERT, {
|
pluginData.getPlugin(LogsPlugin).logBotAlert({
|
||||||
body: `Clamped auto-deletion delay in <#${msg.channel_id}> to 5 minutes`,
|
body: `Clamped auto-deletion delay in <#${msg.channel_id}> to 5 minutes`,
|
||||||
});
|
});
|
||||||
pluginData.state.maxDelayWarningSent = true;
|
pluginData.state.maxDelayWarningSent = true;
|
||||||
|
|
|
@ -26,7 +26,7 @@ export const AddReactionsEvt = autoReactionsEvt({
|
||||||
);
|
);
|
||||||
if (missingPermissions) {
|
if (missingPermissions) {
|
||||||
const logs = pluginData.getPlugin(LogsPlugin);
|
const logs = pluginData.getPlugin(LogsPlugin);
|
||||||
logs.log(LogType.BOT_ALERT, {
|
logs.logBotAlert({
|
||||||
body: `Cannot apply auto-reactions in <#${message.channel.id}>. ${missingPermissionError(missingPermissions)}`,
|
body: `Cannot apply auto-reactions in <#${message.channel.id}>. ${missingPermissionError(missingPermissions)}`,
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
|
@ -39,11 +39,11 @@ export const AddReactionsEvt = autoReactionsEvt({
|
||||||
if (isDiscordAPIError(e)) {
|
if (isDiscordAPIError(e)) {
|
||||||
const logs = pluginData.getPlugin(LogsPlugin);
|
const logs = pluginData.getPlugin(LogsPlugin);
|
||||||
if (e.code === 10008) {
|
if (e.code === 10008) {
|
||||||
logs.log(LogType.BOT_ALERT, {
|
logs.logBotAlert({
|
||||||
body: `Could not apply auto-reactions in <#${message.channel.id}> for message \`${message.id}\`. Make sure nothing is deleting the message before the reactions are applied.`,
|
body: `Could not apply auto-reactions in <#${message.channel.id}> for message \`${message.id}\`. Make sure nothing is deleting the message before the reactions are applied.`,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
logs.log(LogType.BOT_ALERT, {
|
logs.logBotAlert({
|
||||||
body: `Could not apply auto-reactions in <#${message.channel.id}> for message \`${message.id}\`. Error code ${e.code}.`,
|
body: `Could not apply auto-reactions in <#${message.channel.id}> for message \`${message.id}\`. Error code ${e.code}.`,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ export const AddRolesAction = automodAction({
|
||||||
const missingPermissions = getMissingPermissions(me.permissions, p.MANAGE_ROLES);
|
const missingPermissions = getMissingPermissions(me.permissions, p.MANAGE_ROLES);
|
||||||
if (missingPermissions) {
|
if (missingPermissions) {
|
||||||
const logs = pluginData.getPlugin(LogsPlugin);
|
const logs = pluginData.getPlugin(LogsPlugin);
|
||||||
logs.log(LogType.BOT_ALERT, {
|
logs.logBotAlert({
|
||||||
body: `Cannot add roles in Automod rule **${ruleName}**. ${missingPermissionError(missingPermissions)}`,
|
body: `Cannot add roles in Automod rule **${ruleName}**. ${missingPermissionError(missingPermissions)}`,
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
|
@ -44,7 +44,7 @@ export const AddRolesAction = automodAction({
|
||||||
roleId => pluginData.guild.roles.cache.get(roleId as Snowflake)?.name || roleId,
|
roleId => pluginData.guild.roles.cache.get(roleId as Snowflake)?.name || roleId,
|
||||||
);
|
);
|
||||||
const logs = pluginData.getPlugin(LogsPlugin);
|
const logs = pluginData.getPlugin(LogsPlugin);
|
||||||
logs.log(LogType.BOT_ALERT, {
|
logs.logBotAlert({
|
||||||
body: `Unable to assign the following roles in Automod rule **${ruleName}**: **${roleNamesWeCannotAssign.join(
|
body: `Unable to assign the following roles in Automod rule **${ruleName}**: **${roleNamesWeCannotAssign.join(
|
||||||
"**, **",
|
"**, **",
|
||||||
)}**`,
|
)}**`,
|
||||||
|
|
|
@ -2,6 +2,7 @@ import * as t from "io-ts";
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { CountersPlugin } from "../../Counters/CountersPlugin";
|
import { CountersPlugin } from "../../Counters/CountersPlugin";
|
||||||
import { automodAction } from "../helpers";
|
import { automodAction } from "../helpers";
|
||||||
|
import { LogsPlugin } from "../../Logs/LogsPlugin";
|
||||||
|
|
||||||
export const AddToCounterAction = automodAction({
|
export const AddToCounterAction = automodAction({
|
||||||
configType: t.type({
|
configType: t.type({
|
||||||
|
@ -14,7 +15,7 @@ export const AddToCounterAction = automodAction({
|
||||||
async apply({ pluginData, contexts, actionConfig, matchResult, ruleName }) {
|
async apply({ pluginData, contexts, actionConfig, matchResult, ruleName }) {
|
||||||
const countersPlugin = pluginData.getPlugin(CountersPlugin);
|
const countersPlugin = pluginData.getPlugin(CountersPlugin);
|
||||||
if (!countersPlugin.counterExists(actionConfig.counter)) {
|
if (!countersPlugin.counterExists(actionConfig.counter)) {
|
||||||
pluginData.state.logs.log(LogType.BOT_ALERT, {
|
pluginData.getPlugin(LogsPlugin).logBotAlert({
|
||||||
body: `Unknown counter \`${actionConfig.counter}\` in \`add_to_counter\` action of Automod rule \`${ruleName}\``,
|
body: `Unknown counter \`${actionConfig.counter}\` in \`add_to_counter\` action of Automod rule \`${ruleName}\``,
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -2,17 +2,24 @@ import { Snowflake, TextChannel } from "discord.js";
|
||||||
import * as t from "io-ts";
|
import * as t from "io-ts";
|
||||||
import { erisAllowedMentionsToDjsMentionOptions } from "src/utils/erisAllowedMentionsToDjsMentionOptions";
|
import { erisAllowedMentionsToDjsMentionOptions } from "src/utils/erisAllowedMentionsToDjsMentionOptions";
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { renderTemplate, TemplateParseError } from "../../../templateFormatter";
|
import {
|
||||||
|
createTypedTemplateSafeValueContainer,
|
||||||
|
renderTemplate,
|
||||||
|
TemplateParseError,
|
||||||
|
TemplateSafeValueContainer,
|
||||||
|
} from "../../../templateFormatter";
|
||||||
import {
|
import {
|
||||||
createChunkedMessage,
|
createChunkedMessage,
|
||||||
messageLink,
|
messageLink,
|
||||||
stripObjectToScalars,
|
stripObjectToScalars,
|
||||||
tAllowedMentions,
|
tAllowedMentions,
|
||||||
tNormalizedNullOptional,
|
tNormalizedNullOptional,
|
||||||
|
isTruthy,
|
||||||
verboseChannelMention,
|
verboseChannelMention,
|
||||||
} from "../../../utils";
|
} from "../../../utils";
|
||||||
import { LogsPlugin } from "../../Logs/LogsPlugin";
|
import { LogsPlugin } from "../../Logs/LogsPlugin";
|
||||||
import { automodAction } from "../helpers";
|
import { automodAction } from "../helpers";
|
||||||
|
import { TemplateSafeUser, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
export const AlertAction = automodAction({
|
export const AlertAction = automodAction({
|
||||||
configType: t.type({
|
configType: t.type({
|
||||||
|
@ -32,33 +39,39 @@ export const AlertAction = automodAction({
|
||||||
const theMessageLink =
|
const theMessageLink =
|
||||||
contexts[0].message && messageLink(pluginData.guild.id, contexts[0].message.channel_id, contexts[0].message.id);
|
contexts[0].message && messageLink(pluginData.guild.id, contexts[0].message.channel_id, contexts[0].message.id);
|
||||||
|
|
||||||
const safeUsers = contexts.map(c => c.user && stripObjectToScalars(c.user)).filter(Boolean);
|
const safeUsers = contexts.map(c => (c.user ? userToTemplateSafeUser(c.user) : null)).filter(isTruthy);
|
||||||
const safeUser = safeUsers[0];
|
const safeUser = safeUsers[0];
|
||||||
const actionsTaken = Object.keys(pluginData.config.get().rules[ruleName].actions).join(", ");
|
const actionsTaken = Object.keys(pluginData.config.get().rules[ruleName].actions).join(", ");
|
||||||
|
|
||||||
const logMessage = await logs.getLogMessage(LogType.AUTOMOD_ACTION, {
|
const logMessage = await logs.getLogMessage(
|
||||||
rule: ruleName,
|
LogType.AUTOMOD_ACTION,
|
||||||
user: safeUser,
|
createTypedTemplateSafeValueContainer({
|
||||||
users: safeUsers,
|
|
||||||
actionsTaken,
|
|
||||||
matchSummary: matchResult.summary,
|
|
||||||
});
|
|
||||||
|
|
||||||
let rendered;
|
|
||||||
try {
|
|
||||||
rendered = await renderTemplate(actionConfig.text, {
|
|
||||||
rule: ruleName,
|
rule: ruleName,
|
||||||
user: safeUser,
|
user: safeUser,
|
||||||
users: safeUsers,
|
users: safeUsers,
|
||||||
text,
|
|
||||||
actionsTaken,
|
actionsTaken,
|
||||||
matchSummary: matchResult.summary,
|
matchSummary: matchResult.summary ?? "",
|
||||||
messageLink: theMessageLink,
|
}),
|
||||||
logMessage,
|
);
|
||||||
});
|
|
||||||
|
let rendered;
|
||||||
|
try {
|
||||||
|
rendered = await renderTemplate(
|
||||||
|
actionConfig.text,
|
||||||
|
new TemplateSafeValueContainer({
|
||||||
|
rule: ruleName,
|
||||||
|
user: safeUser,
|
||||||
|
users: safeUsers,
|
||||||
|
text,
|
||||||
|
actionsTaken,
|
||||||
|
matchSummary: matchResult.summary,
|
||||||
|
messageLink: theMessageLink,
|
||||||
|
logMessage: logMessage?.content,
|
||||||
|
}),
|
||||||
|
);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err instanceof TemplateParseError) {
|
if (err instanceof TemplateParseError) {
|
||||||
pluginData.getPlugin(LogsPlugin).log(LogType.BOT_ALERT, {
|
pluginData.getPlugin(LogsPlugin).logBotAlert({
|
||||||
body: `Error in alert format of automod rule ${ruleName}: ${err.message}`,
|
body: `Error in alert format of automod rule ${ruleName}: ${err.message}`,
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
|
@ -75,13 +88,13 @@ export const AlertAction = automodAction({
|
||||||
);
|
);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err.code === 50001) {
|
if (err.code === 50001) {
|
||||||
logs.log(LogType.BOT_ALERT, {
|
logs.logBotAlert({
|
||||||
body: `Missing access to send alert to channel ${verboseChannelMention(
|
body: `Missing access to send alert to channel ${verboseChannelMention(
|
||||||
channel,
|
channel,
|
||||||
)} in automod rule **${ruleName}**`,
|
)} in automod rule **${ruleName}**`,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
logs.log(LogType.BOT_ALERT, {
|
logs.logBotAlert({
|
||||||
body: `Error ${err.code || "UNKNOWN"} when sending alert to channel ${verboseChannelMention(
|
body: `Error ${err.code || "UNKNOWN"} when sending alert to channel ${verboseChannelMention(
|
||||||
channel,
|
channel,
|
||||||
)} in automod rule **${ruleName}**`,
|
)} in automod rule **${ruleName}**`,
|
||||||
|
@ -89,7 +102,7 @@ export const AlertAction = automodAction({
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logs.log(LogType.BOT_ALERT, {
|
logs.logBotAlert({
|
||||||
body: `Invalid channel id \`${actionConfig.channel}\` for alert action in automod rule **${ruleName}**`,
|
body: `Invalid channel id \`${actionConfig.channel}\` for alert action in automod rule **${ruleName}**`,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ export const ChangeNicknameAction = automodAction({
|
||||||
const newName = typeof actionConfig === "string" ? actionConfig : actionConfig.name;
|
const newName = typeof actionConfig === "string" ? actionConfig : actionConfig.name;
|
||||||
|
|
||||||
member.edit({ nick: newName }).catch(err => {
|
member.edit({ nick: newName }).catch(err => {
|
||||||
pluginData.getPlugin(LogsPlugin).log(LogType.BOT_ALERT, {
|
pluginData.getPlugin(LogsPlugin).logBotAlert({
|
||||||
body: `Failed to change the nickname of \`${member.id}\``,
|
body: `Failed to change the nickname of \`${member.id}\``,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,24 +1,23 @@
|
||||||
import * as t from "io-ts";
|
import * as t from "io-ts";
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { stripObjectToScalars, unique } from "../../../utils";
|
import { isTruthy, stripObjectToScalars, unique } from "../../../utils";
|
||||||
import { LogsPlugin } from "../../Logs/LogsPlugin";
|
import { LogsPlugin } from "../../Logs/LogsPlugin";
|
||||||
import { automodAction } from "../helpers";
|
import { automodAction } from "../helpers";
|
||||||
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
export const LogAction = automodAction({
|
export const LogAction = automodAction({
|
||||||
configType: t.boolean,
|
configType: t.boolean,
|
||||||
defaultConfig: true,
|
defaultConfig: true,
|
||||||
|
|
||||||
async apply({ pluginData, contexts, ruleName, matchResult }) {
|
async apply({ pluginData, contexts, ruleName, matchResult }) {
|
||||||
const safeUsers = unique(contexts.map(c => c.user))
|
const users = unique(contexts.map(c => c.user)).filter(isTruthy);
|
||||||
.filter(Boolean)
|
const user = users[0];
|
||||||
.map(user => stripObjectToScalars(user));
|
|
||||||
const safeUser = safeUsers[0];
|
|
||||||
const actionsTaken = Object.keys(pluginData.config.get().rules[ruleName].actions).join(", ");
|
const actionsTaken = Object.keys(pluginData.config.get().rules[ruleName].actions).join(", ");
|
||||||
|
|
||||||
pluginData.getPlugin(LogsPlugin).log(LogType.AUTOMOD_ACTION, {
|
pluginData.getPlugin(LogsPlugin).logAutomodAction({
|
||||||
rule: ruleName,
|
rule: ruleName,
|
||||||
user: safeUser,
|
user,
|
||||||
users: safeUsers,
|
users,
|
||||||
actionsTaken,
|
actionsTaken,
|
||||||
matchSummary: matchResult.summary,
|
matchSummary: matchResult.summary,
|
||||||
});
|
});
|
||||||
|
|
|
@ -55,7 +55,7 @@ export const MuteAction = automodAction({
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e instanceof RecoverablePluginError && e.code === ERRORS.NO_MUTE_ROLE_IN_CONFIG) {
|
if (e instanceof RecoverablePluginError && e.code === ERRORS.NO_MUTE_ROLE_IN_CONFIG) {
|
||||||
pluginData.getPlugin(LogsPlugin).log(LogType.BOT_ALERT, {
|
pluginData.getPlugin(LogsPlugin).logBotAlert({
|
||||||
body: `Failed to mute <@!${userId}> in Automod rule \`${ruleName}\` because a mute role has not been specified in server config`,
|
body: `Failed to mute <@!${userId}> in Automod rule \`${ruleName}\` because a mute role has not been specified in server config`,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -24,7 +24,7 @@ export const RemoveRolesAction = automodAction({
|
||||||
const missingPermissions = getMissingPermissions(me.permissions, p.MANAGE_ROLES);
|
const missingPermissions = getMissingPermissions(me.permissions, p.MANAGE_ROLES);
|
||||||
if (missingPermissions) {
|
if (missingPermissions) {
|
||||||
const logs = pluginData.getPlugin(LogsPlugin);
|
const logs = pluginData.getPlugin(LogsPlugin);
|
||||||
logs.log(LogType.BOT_ALERT, {
|
logs.logBotAlert({
|
||||||
body: `Cannot add roles in Automod rule **${ruleName}**. ${missingPermissionError(missingPermissions)}`,
|
body: `Cannot add roles in Automod rule **${ruleName}**. ${missingPermissionError(missingPermissions)}`,
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
|
@ -45,7 +45,7 @@ export const RemoveRolesAction = automodAction({
|
||||||
roleId => pluginData.guild.roles.cache.get(roleId as Snowflake)?.name || roleId,
|
roleId => pluginData.guild.roles.cache.get(roleId as Snowflake)?.name || roleId,
|
||||||
);
|
);
|
||||||
const logs = pluginData.getPlugin(LogsPlugin);
|
const logs = pluginData.getPlugin(LogsPlugin);
|
||||||
logs.log(LogType.BOT_ALERT, {
|
logs.logBotAlert({
|
||||||
body: `Unable to remove the following roles in Automod rule **${ruleName}**: **${roleNamesWeCannotRemove.join(
|
body: `Unable to remove the following roles in Automod rule **${ruleName}**: **${roleNamesWeCannotRemove.join(
|
||||||
"**, **",
|
"**, **",
|
||||||
)}**`,
|
)}**`,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { MessageOptions, Permissions, Snowflake, TextChannel, User } from "discord.js";
|
import { MessageOptions, Permissions, Snowflake, TextChannel, User } from "discord.js";
|
||||||
import * as t from "io-ts";
|
import * as t from "io-ts";
|
||||||
import { userToConfigAccessibleUser } from "../../../utils/configAccessibleObjects";
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { renderTemplate } from "../../../templateFormatter";
|
import { renderTemplate } from "../../../templateFormatter";
|
||||||
import {
|
import {
|
||||||
|
@ -16,6 +16,7 @@ import {
|
||||||
import { hasDiscordPermissions } from "../../../utils/hasDiscordPermissions";
|
import { hasDiscordPermissions } from "../../../utils/hasDiscordPermissions";
|
||||||
import { automodAction } from "../helpers";
|
import { automodAction } from "../helpers";
|
||||||
import { AutomodContext } from "../types";
|
import { AutomodContext } from "../types";
|
||||||
|
import { LogsPlugin } from "../../Logs/LogsPlugin";
|
||||||
|
|
||||||
export const ReplyAction = automodAction({
|
export const ReplyAction = automodAction({
|
||||||
configType: t.union([
|
configType: t.union([
|
||||||
|
@ -48,7 +49,7 @@ export const ReplyAction = automodAction({
|
||||||
|
|
||||||
const renderReplyText = async str =>
|
const renderReplyText = async str =>
|
||||||
renderTemplate(str, {
|
renderTemplate(str, {
|
||||||
user: userToConfigAccessibleUser(user),
|
user: userToTemplateSafeUser(user),
|
||||||
});
|
});
|
||||||
const formatted =
|
const formatted =
|
||||||
typeof actionConfig === "string"
|
typeof actionConfig === "string"
|
||||||
|
@ -65,7 +66,7 @@ export const ReplyAction = automodAction({
|
||||||
Permissions.FLAGS.SEND_MESSAGES | Permissions.FLAGS.VIEW_CHANNEL,
|
Permissions.FLAGS.SEND_MESSAGES | Permissions.FLAGS.VIEW_CHANNEL,
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
pluginData.state.logs.log(LogType.BOT_ALERT, {
|
pluginData.getPlugin(LogsPlugin).logBotAlert({
|
||||||
body: `Missing permissions to reply in ${verboseChannelMention(channel)} in Automod rule \`${ruleName}\``,
|
body: `Missing permissions to reply in ${verboseChannelMention(channel)} in Automod rule \`${ruleName}\``,
|
||||||
});
|
});
|
||||||
continue;
|
continue;
|
||||||
|
@ -76,7 +77,7 @@ export const ReplyAction = automodAction({
|
||||||
typeof formatted !== "string" &&
|
typeof formatted !== "string" &&
|
||||||
!hasDiscordPermissions(channel.permissionsFor(pluginData.client.user!.id), Permissions.FLAGS.EMBED_LINKS)
|
!hasDiscordPermissions(channel.permissionsFor(pluginData.client.user!.id), Permissions.FLAGS.EMBED_LINKS)
|
||||||
) {
|
) {
|
||||||
pluginData.state.logs.log(LogType.BOT_ALERT, {
|
pluginData.getPlugin(LogsPlugin).logBotAlert({
|
||||||
body: `Missing permissions to reply **with an embed** in ${verboseChannelMention(
|
body: `Missing permissions to reply **with an embed** in ${verboseChannelMention(
|
||||||
channel,
|
channel,
|
||||||
)} in Automod rule \`${ruleName}\``,
|
)} in Automod rule \`${ruleName}\``,
|
||||||
|
|
|
@ -2,6 +2,7 @@ import * as t from "io-ts";
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { CountersPlugin } from "../../Counters/CountersPlugin";
|
import { CountersPlugin } from "../../Counters/CountersPlugin";
|
||||||
import { automodAction } from "../helpers";
|
import { automodAction } from "../helpers";
|
||||||
|
import { LogsPlugin } from "../../Logs/LogsPlugin";
|
||||||
|
|
||||||
export const SetCounterAction = automodAction({
|
export const SetCounterAction = automodAction({
|
||||||
configType: t.type({
|
configType: t.type({
|
||||||
|
@ -14,7 +15,7 @@ export const SetCounterAction = automodAction({
|
||||||
async apply({ pluginData, contexts, actionConfig, matchResult, ruleName }) {
|
async apply({ pluginData, contexts, actionConfig, matchResult, ruleName }) {
|
||||||
const countersPlugin = pluginData.getPlugin(CountersPlugin);
|
const countersPlugin = pluginData.getPlugin(CountersPlugin);
|
||||||
if (!countersPlugin.counterExists(actionConfig.counter)) {
|
if (!countersPlugin.counterExists(actionConfig.counter)) {
|
||||||
pluginData.state.logs.log(LogType.BOT_ALERT, {
|
pluginData.getPlugin(LogsPlugin).logBotAlert({
|
||||||
body: `Unknown counter \`${actionConfig.counter}\` in \`add_to_counter\` action of Automod rule \`${ruleName}\``,
|
body: `Unknown counter \`${actionConfig.counter}\` in \`add_to_counter\` action of Automod rule \`${ruleName}\``,
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { ChannelTypeStrings } from "src/types";
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { convertDelayStringToMS, isDiscordAPIError, tDelayString, tNullable } from "../../../utils";
|
import { convertDelayStringToMS, isDiscordAPIError, tDelayString, tNullable } from "../../../utils";
|
||||||
import { automodAction } from "../helpers";
|
import { automodAction } from "../helpers";
|
||||||
|
import { LogsPlugin } from "../../Logs/LogsPlugin";
|
||||||
|
|
||||||
export const SetSlowmodeAction = automodAction({
|
export const SetSlowmodeAction = automodAction({
|
||||||
configType: t.type({
|
configType: t.type({
|
||||||
|
@ -53,7 +54,7 @@ export const SetSlowmodeAction = automodAction({
|
||||||
? `Duration is greater than maximum native slowmode duration`
|
? `Duration is greater than maximum native slowmode duration`
|
||||||
: e.message;
|
: e.message;
|
||||||
|
|
||||||
pluginData.state.logs.log(LogType.BOT_ALERT, {
|
pluginData.getPlugin(LogsPlugin).logBotAlert({
|
||||||
body: `Unable to set slowmode for channel ${channel.id} to ${slowmodeSeconds} seconds: ${errorMessage}`,
|
body: `Unable to set slowmode for channel ${channel.id} to ${slowmodeSeconds} seconds: ${errorMessage}`,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { User } from "discord.js";
|
import { User } from "discord.js";
|
||||||
import { GuildPluginData } from "knub";
|
import { GuildPluginData } from "knub";
|
||||||
import { userToConfigAccessibleUser } from "../../../utils/configAccessibleObjects";
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { LogsPlugin } from "../../Logs/LogsPlugin";
|
import { LogsPlugin } from "../../Logs/LogsPlugin";
|
||||||
import { runAutomodOnAntiraidLevel } from "../events/runAutomodOnAntiraidLevel";
|
import { runAutomodOnAntiraidLevel } from "../events/runAutomodOnAntiraidLevel";
|
||||||
|
@ -19,12 +19,12 @@ export async function setAntiraidLevel(
|
||||||
const logs = pluginData.getPlugin(LogsPlugin);
|
const logs = pluginData.getPlugin(LogsPlugin);
|
||||||
|
|
||||||
if (user) {
|
if (user) {
|
||||||
logs.log(LogType.SET_ANTIRAID_USER, {
|
logs.logSetAntiraidUser({
|
||||||
level: newLevel ?? "off",
|
level: newLevel ?? "off",
|
||||||
user: userToConfigAccessibleUser(user),
|
user,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
logs.log(LogType.SET_ANTIRAID_AUTO, {
|
logs.logSetAntiraidAuto({
|
||||||
level: newLevel ?? "off",
|
level: newLevel ?? "off",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ import { getRecentCasesByMod } from "./functions/getRecentCasesByMod";
|
||||||
import { getTotalCasesByMod } from "./functions/getTotalCasesByMod";
|
import { getTotalCasesByMod } from "./functions/getTotalCasesByMod";
|
||||||
import { postCaseToCaseLogChannel } from "./functions/postToCaseLogChannel";
|
import { postCaseToCaseLogChannel } from "./functions/postToCaseLogChannel";
|
||||||
import { CaseArgs, CaseNoteArgs, CasesPluginType, ConfigSchema } from "./types";
|
import { CaseArgs, CaseNoteArgs, CasesPluginType, ConfigSchema } from "./types";
|
||||||
|
import { LogsPlugin } from "../Logs/LogsPlugin";
|
||||||
|
|
||||||
const defaultOptions = {
|
const defaultOptions = {
|
||||||
config: {
|
config: {
|
||||||
|
@ -38,7 +39,7 @@ export const CasesPlugin = zeppelinGuildPlugin<CasesPluginType>()({
|
||||||
`),
|
`),
|
||||||
},
|
},
|
||||||
|
|
||||||
dependencies: [TimeAndDatePlugin],
|
dependencies: [TimeAndDatePlugin, LogsPlugin],
|
||||||
configSchema: ConfigSchema,
|
configSchema: ConfigSchema,
|
||||||
defaultOptions,
|
defaultOptions,
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import { isDiscordAPIError } from "../../../utils";
|
||||||
import { CasesPluginType } from "../types";
|
import { CasesPluginType } from "../types";
|
||||||
import { getCaseEmbed } from "./getCaseEmbed";
|
import { getCaseEmbed } from "./getCaseEmbed";
|
||||||
import { resolveCaseId } from "./resolveCaseId";
|
import { resolveCaseId } from "./resolveCaseId";
|
||||||
|
import { LogsPlugin } from "../../Logs/LogsPlugin";
|
||||||
|
|
||||||
export async function postToCaseLogChannel(
|
export async function postToCaseLogChannel(
|
||||||
pluginData: GuildPluginData<CasesPluginType>,
|
pluginData: GuildPluginData<CasesPluginType>,
|
||||||
|
@ -26,7 +27,7 @@ export async function postToCaseLogChannel(
|
||||||
result = await caseLogChannel.send({ ...content });
|
result = await caseLogChannel.send({ ...content });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (isDiscordAPIError(e) && (e.code === 50013 || e.code === 50001)) {
|
if (isDiscordAPIError(e) && (e.code === 50013 || e.code === 50001)) {
|
||||||
pluginData.state.logs.log(LogType.BOT_ALERT, {
|
pluginData.getPlugin(LogsPlugin).logBotAlert({
|
||||||
body: `Missing permissions to post mod cases in <#${caseLogChannel.id}>`,
|
body: `Missing permissions to post mod cases in <#${caseLogChannel.id}>`,
|
||||||
});
|
});
|
||||||
return null;
|
return null;
|
||||||
|
@ -67,7 +68,7 @@ export async function postCaseToCaseLogChannel(
|
||||||
}
|
}
|
||||||
return postedMessage;
|
return postedMessage;
|
||||||
} catch {
|
} catch {
|
||||||
pluginData.state.logs.log(LogType.BOT_ALERT, {
|
pluginData.getPlugin(LogsPlugin).logBotAlert({
|
||||||
body: `Failed to post case #${theCase.case_number} to the case log channel`,
|
body: `Failed to post case #${theCase.case_number} to the case log channel`,
|
||||||
});
|
});
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import { Snowflake, TextChannel } from "discord.js";
|
import { BaseGuildTextChannel, Snowflake, TextChannel, ThreadChannel } from "discord.js";
|
||||||
import { GuildPluginData } from "knub";
|
import { GuildPluginData } from "knub";
|
||||||
import { deactivateMentions, disableCodeBlocks } from "knub/dist/helpers";
|
import { channelToTemplateSafeChannel, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
import { channelToConfigAccessibleChannel, userToConfigAccessibleUser } from "../../../utils/configAccessibleObjects";
|
|
||||||
import { SavedMessage } from "../../../data/entities/SavedMessage";
|
import { SavedMessage } from "../../../data/entities/SavedMessage";
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { resolveUser } from "../../../utils";
|
import { resolveUser } from "../../../utils";
|
||||||
import { CensorPluginType } from "../types";
|
import { CensorPluginType } from "../types";
|
||||||
|
import { LogsPlugin } from "../../Logs/LogsPlugin";
|
||||||
|
|
||||||
export async function censorMessage(
|
export async function censorMessage(
|
||||||
pluginData: GuildPluginData<CensorPluginType>,
|
pluginData: GuildPluginData<CensorPluginType>,
|
||||||
|
@ -22,13 +22,14 @@ export async function censorMessage(
|
||||||
}
|
}
|
||||||
|
|
||||||
const user = await resolveUser(pluginData.client, savedMessage.user_id);
|
const user = await resolveUser(pluginData.client, savedMessage.user_id);
|
||||||
const channel = pluginData.guild.channels.resolve(savedMessage.channel_id as Snowflake)!;
|
const channel = pluginData.guild.channels.resolve(savedMessage.channel_id as Snowflake)! as
|
||||||
|
| BaseGuildTextChannel
|
||||||
|
| ThreadChannel;
|
||||||
|
|
||||||
pluginData.state.serverLogs.log(LogType.CENSOR, {
|
pluginData.getPlugin(LogsPlugin).logCensor({
|
||||||
user: userToConfigAccessibleUser(user),
|
user,
|
||||||
channel: channelToConfigAccessibleChannel(channel),
|
channel,
|
||||||
reason,
|
reason,
|
||||||
message: savedMessage,
|
message: savedMessage,
|
||||||
messageText: disableCodeBlocks(deactivateMentions(savedMessage.data.content)),
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,7 +70,7 @@ export async function handleCompanionPermissions(
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (isDiscordAPIError(e) && e.code === 50001) {
|
if (isDiscordAPIError(e) && e.code === 50001) {
|
||||||
const logs = pluginData.getPlugin(LogsPlugin);
|
const logs = pluginData.getPlugin(LogsPlugin);
|
||||||
logs.log(LogType.BOT_ALERT, {
|
logs.logBotAlert({
|
||||||
body: `Missing permissions to handle companion channels. Pausing companion channels for 5 minutes or until the bot is reloaded on this server.`,
|
body: `Missing permissions to handle companion channels. Pausing companion channels for 5 minutes or until the bot is reloaded on this server.`,
|
||||||
});
|
});
|
||||||
pluginData.state.errorCooldownManager.setCooldown(ERROR_COOLDOWN_KEY, ERROR_COOLDOWN);
|
pluginData.state.errorCooldownManager.setCooldown(ERROR_COOLDOWN_KEY, ERROR_COOLDOWN);
|
||||||
|
|
|
@ -41,7 +41,7 @@ export async function cleanAction(
|
||||||
interaction.followUp({ ephemeral: true, content: "Plugin error, please check your BOT_ALERTs" });
|
interaction.followUp({ ephemeral: true, content: "Plugin error, please check your BOT_ALERTs" });
|
||||||
|
|
||||||
if (e instanceof RecoverablePluginError && e.code === ERRORS.NO_MUTE_ROLE_IN_CONFIG) {
|
if (e instanceof RecoverablePluginError && e.code === ERRORS.NO_MUTE_ROLE_IN_CONFIG) {
|
||||||
pluginData.getPlugin(LogsPlugin).log(LogType.BOT_ALERT, {
|
pluginData.getPlugin(LogsPlugin).logBotAlert({
|
||||||
body: `Failed to clean in <#${interaction.channelId}> in ContextMenu action \`clean\`:_ ${e}`,
|
body: `Failed to clean in <#${interaction.channelId}> in ContextMenu action \`clean\`:_ ${e}`,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -56,7 +56,7 @@ export async function muteAction(
|
||||||
interaction.followUp({ ephemeral: true, content: "Plugin error, please check your BOT_ALERTs" });
|
interaction.followUp({ ephemeral: true, content: "Plugin error, please check your BOT_ALERTs" });
|
||||||
|
|
||||||
if (e instanceof RecoverablePluginError && e.code === ERRORS.NO_MUTE_ROLE_IN_CONFIG) {
|
if (e instanceof RecoverablePluginError && e.code === ERRORS.NO_MUTE_ROLE_IN_CONFIG) {
|
||||||
pluginData.getPlugin(LogsPlugin).log(LogType.BOT_ALERT, {
|
pluginData.getPlugin(LogsPlugin).logBotAlert({
|
||||||
body: `Failed to mute <@!${userId}> in ContextMenu action \`mute\` because a mute role has not been specified in server config`,
|
body: `Failed to mute <@!${userId}> in ContextMenu action \`mute\` because a mute role has not been specified in server config`,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -27,7 +27,7 @@ export async function loadAllCommands(pluginData: GuildPluginData<ContextMenuPlu
|
||||||
}
|
}
|
||||||
|
|
||||||
const setCommands = await comms.set(newCommands, pluginData.guild.id).catch(e => {
|
const setCommands = await comms.set(newCommands, pluginData.guild.id).catch(e => {
|
||||||
pluginData.getPlugin(LogsPlugin).log(LogType.BOT_ALERT, `Unable to overwrite context menus: ${e}`);
|
pluginData.getPlugin(LogsPlugin).logBotAlert({ body: `Unable to overwrite context menus: ${e}` });
|
||||||
return undefined;
|
return undefined;
|
||||||
});
|
});
|
||||||
if (!setCommands) return;
|
if (!setCommands) return;
|
||||||
|
|
|
@ -30,13 +30,85 @@ import {
|
||||||
import { LogsThreadCreateEvt, LogsThreadDeleteEvt, LogsThreadUpdateEvt } from "./events/LogsThreadModifyEvts";
|
import { LogsThreadCreateEvt, LogsThreadDeleteEvt, LogsThreadUpdateEvt } from "./events/LogsThreadModifyEvts";
|
||||||
import { LogsGuildMemberUpdateEvt } from "./events/LogsUserUpdateEvts";
|
import { LogsGuildMemberUpdateEvt } from "./events/LogsUserUpdateEvts";
|
||||||
import { LogsVoiceStateUpdateEvt } from "./events/LogsVoiceChannelEvts";
|
import { LogsVoiceStateUpdateEvt } from "./events/LogsVoiceChannelEvts";
|
||||||
import { ConfigSchema, FORMAT_NO_TIMESTAMP, LogsPluginType } from "./types";
|
import { ConfigSchema, FORMAT_NO_TIMESTAMP, ILogTypeData, LogsPluginType, TLogChannel } from "./types";
|
||||||
import { getLogMessage } from "./util/getLogMessage";
|
import { getLogMessage } from "./util/getLogMessage";
|
||||||
import { log } from "./util/log";
|
import { log } from "./util/log";
|
||||||
import { onMessageDelete } from "./util/onMessageDelete";
|
import { onMessageDelete } from "./util/onMessageDelete";
|
||||||
import { onMessageDeleteBulk } from "./util/onMessageDeleteBulk";
|
import { onMessageDeleteBulk } from "./util/onMessageDeleteBulk";
|
||||||
import { onMessageUpdate } from "./util/onMessageUpdate";
|
import { onMessageUpdate } from "./util/onMessageUpdate";
|
||||||
import { Util } from "discord.js";
|
import { Util } from "discord.js";
|
||||||
|
import { TemplateSafeValueContainer, TypedTemplateSafeValueContainer } from "../../templateFormatter";
|
||||||
|
import { mapToPublicFn } from "../../pluginUtils";
|
||||||
|
|
||||||
|
import { logAutomodAction } from "./logFunctions/logAutomodAction";
|
||||||
|
import { logBotAlert } from "./logFunctions/logBotAlert";
|
||||||
|
import { logCaseCreate } from "./logFunctions/logCaseCreate";
|
||||||
|
import { logCaseDelete } from "./logFunctions/logCaseDelete";
|
||||||
|
import { logCaseUpdate } from "./logFunctions/logCaseUpdate";
|
||||||
|
import { logCensor } from "./logFunctions/logCensor";
|
||||||
|
import { logChannelCreate } from "./logFunctions/logChannelCreate";
|
||||||
|
import { logChannelDelete } from "./logFunctions/logChannelDelete";
|
||||||
|
import { logChannelUpdate } from "./logFunctions/logChannelUpdate";
|
||||||
|
import { logClean } from "./logFunctions/logClean";
|
||||||
|
import { logEmojiCreate } from "./logFunctions/logEmojiCreate";
|
||||||
|
import { logEmojiDelete } from "./logFunctions/logEmojiDelete";
|
||||||
|
import { logEmojiUpdate } from "./logFunctions/logEmojiUpdate";
|
||||||
|
import { logMassBan } from "./logFunctions/logMassBan";
|
||||||
|
import { logMassMute } from "./logFunctions/logMassMute";
|
||||||
|
import { logMassUnban } from "./logFunctions/logMassUnban";
|
||||||
|
import { logMemberBan } from "./logFunctions/logMemberBan";
|
||||||
|
import { logMemberForceban } from "./logFunctions/logMemberForceban";
|
||||||
|
import { logMemberJoin } from "./logFunctions/logMemberJoin";
|
||||||
|
import { logMemberJoinWithPriorRecords } from "./logFunctions/logMemberJoinWithPriorRecords";
|
||||||
|
import { logMemberKick } from "./logFunctions/logMemberKick";
|
||||||
|
import { logMemberLeave } from "./logFunctions/logMemberLeave";
|
||||||
|
import { logMemberMute } from "./logFunctions/logMemberMute";
|
||||||
|
import { logMemberMuteExpired } from "./logFunctions/logMemberMuteExpired";
|
||||||
|
import { logMemberMuteRejoin } from "./logFunctions/logMemberMuteRejoin";
|
||||||
|
import { logMemberNickChange } from "./logFunctions/logMemberNickChange";
|
||||||
|
import { logMemberNote } from "./logFunctions/logMemberNote";
|
||||||
|
import { logMemberRestore } from "./logFunctions/logMemberRestore";
|
||||||
|
import { logMemberRoleAdd } from "./logFunctions/logMemberRoleAdd";
|
||||||
|
import { logMemberRoleChanges } from "./logFunctions/logMemberRoleChanges";
|
||||||
|
import { logMemberRoleRemove } from "./logFunctions/logMemberRoleRemove";
|
||||||
|
import { logMemberTimedBan } from "./logFunctions/logMemberTimedBan";
|
||||||
|
import { logMemberTimedMute } from "./logFunctions/logMemberTimedMute";
|
||||||
|
import { logMemberTimedUnmute } from "./logFunctions/logMemberTimedUnmute";
|
||||||
|
import { logMemberUnban } from "./logFunctions/logMemberUnban";
|
||||||
|
import { logMemberUnmute } from "./logFunctions/logMemberUnmute";
|
||||||
|
import { logMemberWarn } from "./logFunctions/logMemberWarn";
|
||||||
|
import { logMessageDelete } from "./logFunctions/logMessageDelete";
|
||||||
|
import { logMessageDeleteAuto } from "./logFunctions/logMessageDeleteAuto";
|
||||||
|
import { logMessageDeleteBare } from "./logFunctions/logMessageDeleteBare";
|
||||||
|
import { logMessageDeleteBulk } from "./logFunctions/logMessageDeleteBulk";
|
||||||
|
import { logMessageEdit } from "./logFunctions/logMessageEdit";
|
||||||
|
import { logMessageSpamDetected } from "./logFunctions/logMessageSpamDetected";
|
||||||
|
import { logOtherSpamDetected } from "./logFunctions/logOtherSpamDetected";
|
||||||
|
import { logPostedScheduledMessage } from "./logFunctions/logPostedScheduledMessage";
|
||||||
|
import { logRepeatedMessage } from "./logFunctions/logRepeatedMessage";
|
||||||
|
import { logRoleCreate } from "./logFunctions/logRoleCreate";
|
||||||
|
import { logRoleDelete } from "./logFunctions/logRoleDelete";
|
||||||
|
import { logRoleUpdate } from "./logFunctions/logRoleUpdate";
|
||||||
|
import { logScheduledMessage } from "./logFunctions/logScheduledMessage";
|
||||||
|
import { logScheduledRepeatedMessage } from "./logFunctions/logScheduledRepeatedMessage";
|
||||||
|
import { logSetAntiraidAuto } from "./logFunctions/logSetAntiraidAuto";
|
||||||
|
import { logSetAntiraidUser } from "./logFunctions/logSetAntiraidUser";
|
||||||
|
import { logStageInstanceCreate } from "./logFunctions/logStageInstanceCreate";
|
||||||
|
import { logStageInstanceDelete } from "./logFunctions/logStageInstanceDelete";
|
||||||
|
import { logStageInstanceUpdate } from "./logFunctions/logStageInstanceUpdate";
|
||||||
|
import { logStickerCreate } from "./logFunctions/logStickerCreate";
|
||||||
|
import { logStickerDelete } from "./logFunctions/logStickerDelete";
|
||||||
|
import { logStickerUpdate } from "./logFunctions/logStickerUpdate";
|
||||||
|
import { logThreadCreate } from "./logFunctions/logThreadCreate";
|
||||||
|
import { logThreadDelete } from "./logFunctions/logThreadDelete";
|
||||||
|
import { logThreadUpdate } from "./logFunctions/logThreadUpdate";
|
||||||
|
import { logVoiceChannelForceDisconnect } from "./logFunctions/logVoiceChannelForceDisconnect";
|
||||||
|
import { logVoiceChannelForceMove } from "./logFunctions/logVoiceChannelForceMove";
|
||||||
|
import { logVoiceChannelJoin } from "./logFunctions/logVoiceChannelJoin";
|
||||||
|
import { logVoiceChannelLeave } from "./logFunctions/logVoiceChannelLeave";
|
||||||
|
import { logVoiceChannelMove } from "./logFunctions/logVoiceChannelMove";
|
||||||
|
import { logMemberTimedUnban } from "./logFunctions/logMemberTimedUnban";
|
||||||
|
import { logDmFailed } from "./logFunctions/logDmFailed";
|
||||||
|
|
||||||
const defaultOptions: PluginOptions<LogsPluginType> = {
|
const defaultOptions: PluginOptions<LogsPluginType> = {
|
||||||
config: {
|
config: {
|
||||||
|
@ -98,17 +170,85 @@ export const LogsPlugin = zeppelinGuildPlugin<LogsPluginType>()({
|
||||||
],
|
],
|
||||||
|
|
||||||
public: {
|
public: {
|
||||||
log(pluginData) {
|
getLogMessage: pluginData => {
|
||||||
return (type: LogType, data: any) => {
|
return <TLogType extends keyof ILogTypeData>(
|
||||||
return log(pluginData, type, data);
|
type: TLogType,
|
||||||
|
data: TypedTemplateSafeValueContainer<ILogTypeData[TLogType]>,
|
||||||
|
opts?: Pick<TLogChannel, "format" | "timestamp_format" | "include_embed_timestamp">,
|
||||||
|
) => {
|
||||||
|
return getLogMessage(pluginData, type, data, opts);
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
getLogMessage(pluginData) {
|
logAutomodAction: mapToPublicFn(logAutomodAction),
|
||||||
return (type: LogType, data: any) => {
|
logBotAlert: mapToPublicFn(logBotAlert),
|
||||||
return getLogMessage(pluginData, type, data);
|
logCaseCreate: mapToPublicFn(logCaseCreate),
|
||||||
};
|
logCaseDelete: mapToPublicFn(logCaseDelete),
|
||||||
},
|
logCaseUpdate: mapToPublicFn(logCaseUpdate),
|
||||||
|
logCensor: mapToPublicFn(logCensor),
|
||||||
|
logChannelCreate: mapToPublicFn(logChannelCreate),
|
||||||
|
logChannelDelete: mapToPublicFn(logChannelDelete),
|
||||||
|
logChannelUpdate: mapToPublicFn(logChannelUpdate),
|
||||||
|
logClean: mapToPublicFn(logClean),
|
||||||
|
logEmojiCreate: mapToPublicFn(logEmojiCreate),
|
||||||
|
logEmojiDelete: mapToPublicFn(logEmojiDelete),
|
||||||
|
logEmojiUpdate: mapToPublicFn(logEmojiUpdate),
|
||||||
|
logMassBan: mapToPublicFn(logMassBan),
|
||||||
|
logMassMute: mapToPublicFn(logMassMute),
|
||||||
|
logMassUnban: mapToPublicFn(logMassUnban),
|
||||||
|
logMemberBan: mapToPublicFn(logMemberBan),
|
||||||
|
logMemberForceban: mapToPublicFn(logMemberForceban),
|
||||||
|
logMemberJoin: mapToPublicFn(logMemberJoin),
|
||||||
|
logMemberJoinWithPriorRecords: mapToPublicFn(logMemberJoinWithPriorRecords),
|
||||||
|
logMemberKick: mapToPublicFn(logMemberKick),
|
||||||
|
logMemberLeave: mapToPublicFn(logMemberLeave),
|
||||||
|
logMemberMute: mapToPublicFn(logMemberMute),
|
||||||
|
logMemberMuteExpired: mapToPublicFn(logMemberMuteExpired),
|
||||||
|
logMemberMuteRejoin: mapToPublicFn(logMemberMuteRejoin),
|
||||||
|
logMemberNickChange: mapToPublicFn(logMemberNickChange),
|
||||||
|
logMemberNote: mapToPublicFn(logMemberNote),
|
||||||
|
logMemberRestore: mapToPublicFn(logMemberRestore),
|
||||||
|
logMemberRoleAdd: mapToPublicFn(logMemberRoleAdd),
|
||||||
|
logMemberRoleChanges: mapToPublicFn(logMemberRoleChanges),
|
||||||
|
logMemberRoleRemove: mapToPublicFn(logMemberRoleRemove),
|
||||||
|
logMemberTimedBan: mapToPublicFn(logMemberTimedBan),
|
||||||
|
logMemberTimedMute: mapToPublicFn(logMemberTimedMute),
|
||||||
|
logMemberTimedUnban: mapToPublicFn(logMemberTimedUnban),
|
||||||
|
logMemberTimedUnmute: mapToPublicFn(logMemberTimedUnmute),
|
||||||
|
logMemberUnban: mapToPublicFn(logMemberUnban),
|
||||||
|
logMemberUnmute: mapToPublicFn(logMemberUnmute),
|
||||||
|
logMemberWarn: mapToPublicFn(logMemberWarn),
|
||||||
|
logMessageDelete: mapToPublicFn(logMessageDelete),
|
||||||
|
logMessageDeleteAuto: mapToPublicFn(logMessageDeleteAuto),
|
||||||
|
logMessageDeleteBare: mapToPublicFn(logMessageDeleteBare),
|
||||||
|
logMessageDeleteBulk: mapToPublicFn(logMessageDeleteBulk),
|
||||||
|
logMessageEdit: mapToPublicFn(logMessageEdit),
|
||||||
|
logMessageSpamDetected: mapToPublicFn(logMessageSpamDetected),
|
||||||
|
logOtherSpamDetected: mapToPublicFn(logOtherSpamDetected),
|
||||||
|
logPostedScheduledMessage: mapToPublicFn(logPostedScheduledMessage),
|
||||||
|
logRepeatedMessage: mapToPublicFn(logRepeatedMessage),
|
||||||
|
logRoleCreate: mapToPublicFn(logRoleCreate),
|
||||||
|
logRoleDelete: mapToPublicFn(logRoleDelete),
|
||||||
|
logRoleUpdate: mapToPublicFn(logRoleUpdate),
|
||||||
|
logScheduledMessage: mapToPublicFn(logScheduledMessage),
|
||||||
|
logScheduledRepeatedMessage: mapToPublicFn(logScheduledRepeatedMessage),
|
||||||
|
logSetAntiraidAuto: mapToPublicFn(logSetAntiraidAuto),
|
||||||
|
logSetAntiraidUser: mapToPublicFn(logSetAntiraidUser),
|
||||||
|
logStageInstanceCreate: mapToPublicFn(logStageInstanceCreate),
|
||||||
|
logStageInstanceDelete: mapToPublicFn(logStageInstanceDelete),
|
||||||
|
logStageInstanceUpdate: mapToPublicFn(logStageInstanceUpdate),
|
||||||
|
logStickerCreate: mapToPublicFn(logStickerCreate),
|
||||||
|
logStickerDelete: mapToPublicFn(logStickerDelete),
|
||||||
|
logStickerUpdate: mapToPublicFn(logStickerUpdate),
|
||||||
|
logThreadCreate: mapToPublicFn(logThreadCreate),
|
||||||
|
logThreadDelete: mapToPublicFn(logThreadDelete),
|
||||||
|
logThreadUpdate: mapToPublicFn(logThreadUpdate),
|
||||||
|
logVoiceChannelForceDisconnect: mapToPublicFn(logVoiceChannelForceDisconnect),
|
||||||
|
logVoiceChannelForceMove: mapToPublicFn(logVoiceChannelForceMove),
|
||||||
|
logVoiceChannelJoin: mapToPublicFn(logVoiceChannelJoin),
|
||||||
|
logVoiceChannelLeave: mapToPublicFn(logVoiceChannelLeave),
|
||||||
|
logVoiceChannelMove: mapToPublicFn(logVoiceChannelMove),
|
||||||
|
logDmFailed: mapToPublicFn(logDmFailed),
|
||||||
},
|
},
|
||||||
|
|
||||||
beforeLoad(pluginData) {
|
beforeLoad(pluginData) {
|
||||||
|
|
|
@ -1,14 +1,17 @@
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { differenceToString, getScalarDifference } from "../../../utils";
|
import { differenceToString, getScalarDifference } from "../../../utils";
|
||||||
import { channelToConfigAccessibleChannel } from "../../../utils/configAccessibleObjects";
|
import { channelToTemplateSafeChannel } from "../../../utils/templateSafeObjects";
|
||||||
import { logsEvt } from "../types";
|
import { logsEvt } from "../types";
|
||||||
|
import { logChannelCreate } from "../logFunctions/logChannelCreate";
|
||||||
|
import { logChannelDelete } from "../logFunctions/logChannelDelete";
|
||||||
|
import { logChannelUpdate } from "../logFunctions/logChannelUpdate";
|
||||||
|
|
||||||
export const LogsChannelCreateEvt = logsEvt({
|
export const LogsChannelCreateEvt = logsEvt({
|
||||||
event: "channelCreate",
|
event: "channelCreate",
|
||||||
|
|
||||||
async listener(meta) {
|
async listener(meta) {
|
||||||
meta.pluginData.state.guildLogs.log(LogType.CHANNEL_CREATE, {
|
logChannelCreate(meta.pluginData, {
|
||||||
channel: channelToConfigAccessibleChannel(meta.args.channel),
|
channel: meta.args.channel,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -17,8 +20,8 @@ export const LogsChannelDeleteEvt = logsEvt({
|
||||||
event: "channelDelete",
|
event: "channelDelete",
|
||||||
|
|
||||||
async listener(meta) {
|
async listener(meta) {
|
||||||
meta.pluginData.state.guildLogs.log(LogType.CHANNEL_DELETE, {
|
logChannelDelete(meta.pluginData, {
|
||||||
channel: channelToConfigAccessibleChannel(meta.args.channel),
|
channel: meta.args.channel,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -30,14 +33,10 @@ export const LogsChannelUpdateEvt = logsEvt({
|
||||||
const diff = getScalarDifference(meta.args.oldChannel, meta.args.newChannel);
|
const diff = getScalarDifference(meta.args.oldChannel, meta.args.newChannel);
|
||||||
const differenceString = differenceToString(diff);
|
const differenceString = differenceToString(diff);
|
||||||
|
|
||||||
meta.pluginData.state.guildLogs.log(
|
logChannelUpdate(meta.pluginData, {
|
||||||
LogType.CHANNEL_UPDATE,
|
oldChannel: meta.args.oldChannel,
|
||||||
{
|
newChannel: meta.args.newChannel,
|
||||||
oldChannel: channelToConfigAccessibleChannel(meta.args.oldChannel),
|
differenceString,
|
||||||
newChannel: channelToConfigAccessibleChannel(meta.args.newChannel),
|
});
|
||||||
differenceString,
|
|
||||||
},
|
|
||||||
meta.args.newChannel.id,
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
import { LogType } from "../../../data/LogType";
|
|
||||||
import { differenceToString, getScalarDifference } from "../../../utils";
|
import { differenceToString, getScalarDifference } from "../../../utils";
|
||||||
import {
|
|
||||||
channelToConfigAccessibleChannel,
|
|
||||||
emojiToConfigAccessibleEmoji,
|
|
||||||
stickerToConfigAccessibleSticker,
|
|
||||||
} from "../../../utils/configAccessibleObjects";
|
|
||||||
import { logsEvt } from "../types";
|
import { logsEvt } from "../types";
|
||||||
|
import { logEmojiCreate } from "../logFunctions/logEmojiCreate";
|
||||||
|
import { logEmojiDelete } from "../logFunctions/logEmojiDelete";
|
||||||
|
import { logEmojiUpdate } from "../logFunctions/logEmojiUpdate";
|
||||||
|
import { logStickerCreate } from "../logFunctions/logStickerCreate";
|
||||||
|
import { logStickerDelete } from "../logFunctions/logStickerDelete";
|
||||||
|
import { logStickerUpdate } from "../logFunctions/logStickerUpdate";
|
||||||
|
|
||||||
export const LogsEmojiCreateEvt = logsEvt({
|
export const LogsEmojiCreateEvt = logsEvt({
|
||||||
event: "emojiCreate",
|
event: "emojiCreate",
|
||||||
|
|
||||||
async listener(meta) {
|
async listener(meta) {
|
||||||
meta.pluginData.state.guildLogs.log(LogType.EMOJI_CREATE, {
|
logEmojiCreate(meta.pluginData, {
|
||||||
emoji: emojiToConfigAccessibleEmoji(meta.args.emoji),
|
emoji: meta.args.emoji,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -21,8 +21,8 @@ export const LogsEmojiDeleteEvt = logsEvt({
|
||||||
event: "emojiDelete",
|
event: "emojiDelete",
|
||||||
|
|
||||||
async listener(meta) {
|
async listener(meta) {
|
||||||
meta.pluginData.state.guildLogs.log(LogType.EMOJI_DELETE, {
|
logEmojiDelete(meta.pluginData, {
|
||||||
emoji: emojiToConfigAccessibleEmoji(meta.args.emoji),
|
emoji: meta.args.emoji,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -34,9 +34,9 @@ export const LogsEmojiUpdateEvt = logsEvt({
|
||||||
const diff = getScalarDifference(meta.args.oldEmoji, meta.args.newEmoji);
|
const diff = getScalarDifference(meta.args.oldEmoji, meta.args.newEmoji);
|
||||||
const differenceString = differenceToString(diff);
|
const differenceString = differenceToString(diff);
|
||||||
|
|
||||||
meta.pluginData.state.guildLogs.log(LogType.EMOJI_UPDATE, {
|
logEmojiUpdate(meta.pluginData, {
|
||||||
oldEmoji: emojiToConfigAccessibleEmoji(meta.args.oldEmoji),
|
oldEmoji: meta.args.oldEmoji,
|
||||||
newEmoji: emojiToConfigAccessibleEmoji(meta.args.newEmoji),
|
newEmoji: meta.args.newEmoji,
|
||||||
differenceString,
|
differenceString,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -46,8 +46,8 @@ export const LogsStickerCreateEvt = logsEvt({
|
||||||
event: "stickerCreate",
|
event: "stickerCreate",
|
||||||
|
|
||||||
async listener(meta) {
|
async listener(meta) {
|
||||||
meta.pluginData.state.guildLogs.log(LogType.STICKER_CREATE, {
|
logStickerCreate(meta.pluginData, {
|
||||||
sticker: stickerToConfigAccessibleSticker(meta.args.sticker),
|
sticker: meta.args.sticker,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -56,8 +56,8 @@ export const LogsStickerDeleteEvt = logsEvt({
|
||||||
event: "stickerDelete",
|
event: "stickerDelete",
|
||||||
|
|
||||||
async listener(meta) {
|
async listener(meta) {
|
||||||
meta.pluginData.state.guildLogs.log(LogType.STICKER_DELETE, {
|
logStickerDelete(meta.pluginData, {
|
||||||
sticker: stickerToConfigAccessibleSticker(meta.args.sticker),
|
sticker: meta.args.sticker,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -69,14 +69,10 @@ export const LogsStickerUpdateEvt = logsEvt({
|
||||||
const diff = getScalarDifference(meta.args.oldSticker, meta.args.newSticker);
|
const diff = getScalarDifference(meta.args.oldSticker, meta.args.newSticker);
|
||||||
const differenceString = differenceToString(diff);
|
const differenceString = differenceToString(diff);
|
||||||
|
|
||||||
meta.pluginData.state.guildLogs.log(
|
logStickerUpdate(meta.pluginData, {
|
||||||
LogType.STICKER_UPDATE,
|
oldSticker: meta.args.oldSticker,
|
||||||
{
|
newSticker: meta.args.newSticker,
|
||||||
oldSticker: stickerToConfigAccessibleSticker(meta.args.oldSticker),
|
differenceString,
|
||||||
newSticker: stickerToConfigAccessibleSticker(meta.args.newSticker),
|
});
|
||||||
differenceString,
|
|
||||||
},
|
|
||||||
meta.args.newSticker.id,
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
import { GuildAuditLogs } from "discord.js";
|
import { GuildAuditLogs } from "discord.js";
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { userToConfigAccessibleUser } from "../../../utils/configAccessibleObjects";
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
import { safeFindRelevantAuditLogEntry } from "../../../utils/safeFindRelevantAuditLogEntry";
|
import { safeFindRelevantAuditLogEntry } from "../../../utils/safeFindRelevantAuditLogEntry";
|
||||||
import { logsEvt } from "../types";
|
import { logsEvt } from "../types";
|
||||||
|
import { logMemberBan } from "../logFunctions/logMemberBan";
|
||||||
|
import { isLogIgnored } from "../util/isLogIgnored";
|
||||||
|
import { logMemberUnban } from "../logFunctions/logMemberUnban";
|
||||||
|
|
||||||
export const LogsGuildBanAddEvt = logsEvt({
|
export const LogsGuildBanAddEvt = logsEvt({
|
||||||
event: "guildBanAdd",
|
event: "guildBanAdd",
|
||||||
|
@ -11,21 +14,22 @@ export const LogsGuildBanAddEvt = logsEvt({
|
||||||
const pluginData = meta.pluginData;
|
const pluginData = meta.pluginData;
|
||||||
const user = meta.args.ban.user;
|
const user = meta.args.ban.user;
|
||||||
|
|
||||||
|
if (isLogIgnored(pluginData, LogType.MEMBER_BAN, user.id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const relevantAuditLogEntry = await safeFindRelevantAuditLogEntry(
|
const relevantAuditLogEntry = await safeFindRelevantAuditLogEntry(
|
||||||
pluginData,
|
pluginData,
|
||||||
GuildAuditLogs.Actions.MEMBER_BAN_ADD as number,
|
GuildAuditLogs.Actions.MEMBER_BAN_ADD as number,
|
||||||
user.id,
|
user.id,
|
||||||
);
|
);
|
||||||
const mod = relevantAuditLogEntry?.executor ?? null;
|
const mod = relevantAuditLogEntry?.executor ?? null;
|
||||||
|
logMemberBan(meta.pluginData, {
|
||||||
pluginData.state.guildLogs.log(
|
mod,
|
||||||
LogType.MEMBER_BAN,
|
user,
|
||||||
{
|
caseNumber: 0,
|
||||||
mod: mod ? userToConfigAccessibleUser(mod) : {},
|
reason: "",
|
||||||
user: userToConfigAccessibleUser(user),
|
});
|
||||||
},
|
|
||||||
user.id,
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -36,6 +40,10 @@ export const LogsGuildBanRemoveEvt = logsEvt({
|
||||||
const pluginData = meta.pluginData;
|
const pluginData = meta.pluginData;
|
||||||
const user = meta.args.ban.user;
|
const user = meta.args.ban.user;
|
||||||
|
|
||||||
|
if (isLogIgnored(pluginData, LogType.MEMBER_UNBAN, user.id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const relevantAuditLogEntry = await safeFindRelevantAuditLogEntry(
|
const relevantAuditLogEntry = await safeFindRelevantAuditLogEntry(
|
||||||
pluginData,
|
pluginData,
|
||||||
GuildAuditLogs.Actions.MEMBER_BAN_REMOVE as number,
|
GuildAuditLogs.Actions.MEMBER_BAN_REMOVE as number,
|
||||||
|
@ -43,13 +51,11 @@ export const LogsGuildBanRemoveEvt = logsEvt({
|
||||||
);
|
);
|
||||||
const mod = relevantAuditLogEntry?.executor ?? null;
|
const mod = relevantAuditLogEntry?.executor ?? null;
|
||||||
|
|
||||||
pluginData.state.guildLogs.log(
|
logMemberUnban(pluginData, {
|
||||||
LogType.MEMBER_UNBAN,
|
mod,
|
||||||
{
|
userId: user.id,
|
||||||
mod: mod ? userToConfigAccessibleUser(mod) : {},
|
caseNumber: 0,
|
||||||
userId: user.id,
|
reason: "",
|
||||||
},
|
});
|
||||||
user.id,
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
import humanizeDuration from "humanize-duration";
|
import humanizeDuration from "humanize-duration";
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { memberToConfigAccessibleMember } from "../../../utils/configAccessibleObjects";
|
import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
|
||||||
import { CasesPlugin } from "../../Cases/CasesPlugin";
|
import { CasesPlugin } from "../../Cases/CasesPlugin";
|
||||||
import { logsEvt } from "../types";
|
import { logsEvt } from "../types";
|
||||||
|
import { logMemberJoin } from "../logFunctions/logMemberJoin";
|
||||||
|
import { logMemberJoinWithPriorRecords } from "../logFunctions/logMemberJoinWithPriorRecords";
|
||||||
|
|
||||||
export const LogsGuildMemberAddEvt = logsEvt({
|
export const LogsGuildMemberAddEvt = logsEvt({
|
||||||
event: "guildMemberAdd",
|
event: "guildMemberAdd",
|
||||||
|
@ -12,16 +14,8 @@ export const LogsGuildMemberAddEvt = logsEvt({
|
||||||
const pluginData = meta.pluginData;
|
const pluginData = meta.pluginData;
|
||||||
const member = meta.args.member;
|
const member = meta.args.member;
|
||||||
|
|
||||||
const newThreshold = moment.utc().valueOf() - 1000 * 60 * 60;
|
logMemberJoin(pluginData, {
|
||||||
const accountAge = humanizeDuration(moment.utc().valueOf() - member.user.createdTimestamp, {
|
member,
|
||||||
largest: 2,
|
|
||||||
round: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
pluginData.state.guildLogs.log(LogType.MEMBER_JOIN, {
|
|
||||||
member: memberToConfigAccessibleMember(member),
|
|
||||||
new: member.user.createdTimestamp >= newThreshold ? " :new:" : "",
|
|
||||||
account_age: accountAge,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const cases = (await pluginData.state.cases.with("notes").getByUserId(member.id)).filter(c => !c.is_hidden);
|
const cases = (await pluginData.state.cases.with("notes").getByUserId(member.id)).filter(c => !c.is_hidden);
|
||||||
|
@ -45,8 +39,8 @@ export const LogsGuildMemberAddEvt = logsEvt({
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pluginData.state.guildLogs.log(LogType.MEMBER_JOIN_WITH_PRIOR_RECORDS, {
|
logMemberJoinWithPriorRecords(pluginData, {
|
||||||
member: memberToConfigAccessibleMember(member),
|
member,
|
||||||
recentCaseSummary,
|
recentCaseSummary,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { memberToConfigAccessibleMember } from "../../../utils/configAccessibleObjects";
|
import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
|
||||||
import { logsEvt } from "../types";
|
import { logsEvt } from "../types";
|
||||||
|
import { logMemberLeave } from "../logFunctions/logMemberLeave";
|
||||||
|
|
||||||
export const LogsGuildMemberRemoveEvt = logsEvt({
|
export const LogsGuildMemberRemoveEvt = logsEvt({
|
||||||
event: "guildMemberRemove",
|
event: "guildMemberRemove",
|
||||||
|
|
||||||
async listener(meta) {
|
async listener(meta) {
|
||||||
meta.pluginData.state.guildLogs.log(LogType.MEMBER_LEAVE, {
|
logMemberLeave(meta.pluginData, {
|
||||||
member: memberToConfigAccessibleMember(meta.args.member),
|
member: meta.args.member,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,14 +1,17 @@
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { differenceToString, getScalarDifference } from "../../../utils";
|
import { differenceToString, getScalarDifference } from "../../../utils";
|
||||||
import { roleToConfigAccessibleRole } from "../../../utils/configAccessibleObjects";
|
import { roleToTemplateSafeRole } from "../../../utils/templateSafeObjects";
|
||||||
import { logsEvt } from "../types";
|
import { logsEvt } from "../types";
|
||||||
|
import { logRoleCreate } from "../logFunctions/logRoleCreate";
|
||||||
|
import { logRoleDelete } from "../logFunctions/logRoleDelete";
|
||||||
|
import { logRoleUpdate } from "../logFunctions/logRoleUpdate";
|
||||||
|
|
||||||
export const LogsRoleCreateEvt = logsEvt({
|
export const LogsRoleCreateEvt = logsEvt({
|
||||||
event: "roleCreate",
|
event: "roleCreate",
|
||||||
|
|
||||||
async listener(meta) {
|
async listener(meta) {
|
||||||
meta.pluginData.state.guildLogs.log(LogType.ROLE_CREATE, {
|
logRoleCreate(meta.pluginData, {
|
||||||
role: roleToConfigAccessibleRole(meta.args.role),
|
role: meta.args.role,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -17,8 +20,8 @@ export const LogsRoleDeleteEvt = logsEvt({
|
||||||
event: "roleDelete",
|
event: "roleDelete",
|
||||||
|
|
||||||
async listener(meta) {
|
async listener(meta) {
|
||||||
meta.pluginData.state.guildLogs.log(LogType.ROLE_DELETE, {
|
logRoleDelete(meta.pluginData, {
|
||||||
role: roleToConfigAccessibleRole(meta.args.role),
|
role: meta.args.role,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -30,9 +33,9 @@ export const LogsRoleUpdateEvt = logsEvt({
|
||||||
const diff = getScalarDifference(meta.args.oldRole, meta.args.newRole);
|
const diff = getScalarDifference(meta.args.oldRole, meta.args.newRole);
|
||||||
const differenceString = differenceToString(diff);
|
const differenceString = differenceToString(diff);
|
||||||
|
|
||||||
meta.pluginData.state.guildLogs.log(LogType.ROLE_UPDATE, {
|
logRoleUpdate(meta.pluginData, {
|
||||||
newRole: roleToConfigAccessibleRole(meta.args.newRole),
|
newRole: meta.args.newRole,
|
||||||
oldRole: roleToConfigAccessibleRole(meta.args.oldRole),
|
oldRole: meta.args.oldRole,
|
||||||
differenceString,
|
differenceString,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { differenceToString, getScalarDifference } from "../../../utils";
|
import { differenceToString, getScalarDifference } from "../../../utils";
|
||||||
import { channelToConfigAccessibleChannel, stageToConfigAccessibleStage } from "../../../utils/configAccessibleObjects";
|
import { channelToTemplateSafeChannel, stageToTemplateSafeStage } from "../../../utils/templateSafeObjects";
|
||||||
import { logsEvt } from "../types";
|
import { logsEvt } from "../types";
|
||||||
|
import { logStageInstanceCreate } from "../logFunctions/logStageInstanceCreate";
|
||||||
|
import { StageChannel } from "discord.js";
|
||||||
|
import { logStageInstanceDelete } from "../logFunctions/logStageInstanceDelete";
|
||||||
|
import { logStageInstanceUpdate } from "../logFunctions/logStageInstanceUpdate";
|
||||||
|
|
||||||
export const LogsStageInstanceCreateEvt = logsEvt({
|
export const LogsStageInstanceCreateEvt = logsEvt({
|
||||||
event: "stageInstanceCreate",
|
event: "stageInstanceCreate",
|
||||||
|
@ -9,11 +13,11 @@ export const LogsStageInstanceCreateEvt = logsEvt({
|
||||||
async listener(meta) {
|
async listener(meta) {
|
||||||
const stageChannel =
|
const stageChannel =
|
||||||
meta.args.stageInstance.channel ??
|
meta.args.stageInstance.channel ??
|
||||||
(await meta.pluginData.guild.channels.fetch(meta.args.stageInstance.channelId))!;
|
((await meta.pluginData.guild.channels.fetch(meta.args.stageInstance.channelId)) as StageChannel);
|
||||||
|
|
||||||
meta.pluginData.state.guildLogs.log(LogType.STAGE_INSTANCE_CREATE, {
|
logStageInstanceCreate(meta.pluginData, {
|
||||||
stageInstance: stageToConfigAccessibleStage(meta.args.stageInstance),
|
stageInstance: meta.args.stageInstance,
|
||||||
stageChannel: channelToConfigAccessibleChannel(stageChannel),
|
stageChannel,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -24,11 +28,11 @@ export const LogsStageInstanceDeleteEvt = logsEvt({
|
||||||
async listener(meta) {
|
async listener(meta) {
|
||||||
const stageChannel =
|
const stageChannel =
|
||||||
meta.args.stageInstance.channel ??
|
meta.args.stageInstance.channel ??
|
||||||
(await meta.pluginData.guild.channels.fetch(meta.args.stageInstance.channelId))!;
|
((await meta.pluginData.guild.channels.fetch(meta.args.stageInstance.channelId)) as StageChannel);
|
||||||
|
|
||||||
meta.pluginData.state.guildLogs.log(LogType.STAGE_INSTANCE_DELETE, {
|
logStageInstanceDelete(meta.pluginData, {
|
||||||
stageInstance: stageToConfigAccessibleStage(meta.args.stageInstance),
|
stageInstance: meta.args.stageInstance,
|
||||||
stageChannel: channelToConfigAccessibleChannel(stageChannel),
|
stageChannel,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -39,15 +43,15 @@ export const LogsStageInstanceUpdateEvt = logsEvt({
|
||||||
async listener(meta) {
|
async listener(meta) {
|
||||||
const stageChannel =
|
const stageChannel =
|
||||||
meta.args.newStageInstance.channel ??
|
meta.args.newStageInstance.channel ??
|
||||||
(await meta.pluginData.guild.channels.fetch(meta.args.newStageInstance.channelId))!;
|
((await meta.pluginData.guild.channels.fetch(meta.args.newStageInstance.channelId)) as StageChannel);
|
||||||
|
|
||||||
const diff = getScalarDifference(meta.args.oldStageInstance, meta.args.newStageInstance);
|
const diff = getScalarDifference(meta.args.oldStageInstance, meta.args.newStageInstance);
|
||||||
const differenceString = differenceToString(diff);
|
const differenceString = differenceToString(diff);
|
||||||
|
|
||||||
meta.pluginData.state.guildLogs.log(LogType.STAGE_INSTANCE_UPDATE, {
|
logStageInstanceUpdate(meta.pluginData, {
|
||||||
oldStageInstance: stageToConfigAccessibleStage(meta.args.oldStageInstance),
|
oldStageInstance: meta.args.oldStageInstance,
|
||||||
newStageInstance: stageToConfigAccessibleStage(meta.args.newStageInstance),
|
newStageInstance: meta.args.newStageInstance,
|
||||||
stageChannel: channelToConfigAccessibleChannel(stageChannel),
|
stageChannel,
|
||||||
differenceString,
|
differenceString,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,14 +1,17 @@
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { differenceToString, getScalarDifference } from "../../../utils";
|
import { differenceToString, getScalarDifference } from "../../../utils";
|
||||||
import { channelToConfigAccessibleChannel } from "../../../utils/configAccessibleObjects";
|
import { channelToTemplateSafeChannel } from "../../../utils/templateSafeObjects";
|
||||||
import { logsEvt } from "../types";
|
import { logsEvt } from "../types";
|
||||||
|
import { logThreadCreate } from "../logFunctions/logThreadCreate";
|
||||||
|
import { logThreadDelete } from "../logFunctions/logThreadDelete";
|
||||||
|
import { logThreadUpdate } from "../logFunctions/logThreadUpdate";
|
||||||
|
|
||||||
export const LogsThreadCreateEvt = logsEvt({
|
export const LogsThreadCreateEvt = logsEvt({
|
||||||
event: "threadCreate",
|
event: "threadCreate",
|
||||||
|
|
||||||
async listener(meta) {
|
async listener(meta) {
|
||||||
meta.pluginData.state.guildLogs.log(LogType.THREAD_CREATE, {
|
logThreadCreate(meta.pluginData, {
|
||||||
thread: channelToConfigAccessibleChannel(meta.args.thread),
|
thread: meta.args.thread,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -17,8 +20,8 @@ export const LogsThreadDeleteEvt = logsEvt({
|
||||||
event: "threadDelete",
|
event: "threadDelete",
|
||||||
|
|
||||||
async listener(meta) {
|
async listener(meta) {
|
||||||
meta.pluginData.state.guildLogs.log(LogType.THREAD_DELETE, {
|
logThreadDelete(meta.pluginData, {
|
||||||
thread: channelToConfigAccessibleChannel(meta.args.thread),
|
thread: meta.args.thread,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -30,14 +33,10 @@ export const LogsThreadUpdateEvt = logsEvt({
|
||||||
const diff = getScalarDifference(meta.args.oldThread, meta.args.newThread, ["messageCount", "archiveTimestamp"]);
|
const diff = getScalarDifference(meta.args.oldThread, meta.args.newThread, ["messageCount", "archiveTimestamp"]);
|
||||||
const differenceString = differenceToString(diff);
|
const differenceString = differenceToString(diff);
|
||||||
|
|
||||||
meta.pluginData.state.guildLogs.log(
|
logThreadUpdate(meta.pluginData, {
|
||||||
LogType.THREAD_UPDATE,
|
oldThread: meta.args.oldThread,
|
||||||
{
|
newThread: meta.args.newThread,
|
||||||
oldThread: channelToConfigAccessibleChannel(meta.args.oldThread),
|
differenceString,
|
||||||
newThread: channelToConfigAccessibleChannel(meta.args.newThread),
|
});
|
||||||
differenceString,
|
|
||||||
},
|
|
||||||
meta.args.newThread.id,
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
import { GuildAuditLogs } from "discord.js";
|
import { GuildAuditLogs } from "discord.js";
|
||||||
import diff from "lodash.difference";
|
import diff from "lodash.difference";
|
||||||
import isEqual from "lodash.isequal";
|
import isEqual from "lodash.isequal";
|
||||||
import { memberToConfigAccessibleMember, userToConfigAccessibleUser } from "../../../utils/configAccessibleObjects";
|
import { memberToTemplateSafeMember, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { safeFindRelevantAuditLogEntry } from "../../../utils/safeFindRelevantAuditLogEntry";
|
import { safeFindRelevantAuditLogEntry } from "../../../utils/safeFindRelevantAuditLogEntry";
|
||||||
import { logsEvt } from "../types";
|
import { logsEvt } from "../types";
|
||||||
|
import { logMemberNickChange } from "../logFunctions/logMemberNickChange";
|
||||||
|
import { logMemberRoleChanges } from "../logFunctions/logMemberRoleChanges";
|
||||||
|
import { logMemberRoleAdd } from "../logFunctions/logMemberRoleAdd";
|
||||||
|
import { logMemberRoleRemove } from "../logFunctions/logMemberRoleRemove";
|
||||||
|
|
||||||
export const LogsGuildMemberUpdateEvt = logsEvt({
|
export const LogsGuildMemberUpdateEvt = logsEvt({
|
||||||
event: "guildMemberUpdate",
|
event: "guildMemberUpdate",
|
||||||
|
@ -16,11 +20,9 @@ export const LogsGuildMemberUpdateEvt = logsEvt({
|
||||||
|
|
||||||
if (!oldMember) return;
|
if (!oldMember) return;
|
||||||
|
|
||||||
const logMember = memberToConfigAccessibleMember(member);
|
|
||||||
|
|
||||||
if (member.nickname !== oldMember.nickname) {
|
if (member.nickname !== oldMember.nickname) {
|
||||||
pluginData.state.guildLogs.log(LogType.MEMBER_NICK_CHANGE, {
|
logMemberNickChange(pluginData, {
|
||||||
member: logMember,
|
member,
|
||||||
oldNick: oldMember.nickname != null ? oldMember.nickname : "<none>",
|
oldNick: oldMember.nickname != null ? oldMember.nickname : "<none>",
|
||||||
newNick: member.nickname != null ? member.nickname : "<none>",
|
newNick: member.nickname != null ? member.nickname : "<none>",
|
||||||
});
|
});
|
||||||
|
@ -56,50 +58,38 @@ export const LogsGuildMemberUpdateEvt = logsEvt({
|
||||||
|
|
||||||
if (addedRoles.length && removedRoles.length) {
|
if (addedRoles.length && removedRoles.length) {
|
||||||
// Roles added *and* removed
|
// Roles added *and* removed
|
||||||
pluginData.state.guildLogs.log(
|
logMemberRoleChanges(pluginData, {
|
||||||
LogType.MEMBER_ROLE_CHANGES,
|
member,
|
||||||
{
|
addedRoles: addedRoles
|
||||||
member: logMember,
|
.map(roleId => pluginData.guild.roles.cache.get(roleId) ?? { id: roleId, name: `Unknown (${roleId})` })
|
||||||
addedRoles: addedRoles
|
.map(r => r.name)
|
||||||
.map(roleId => pluginData.guild.roles.cache.get(roleId) ?? { id: roleId, name: `Unknown (${roleId})` })
|
.join(", "),
|
||||||
.map(r => r.name)
|
removedRoles: removedRoles
|
||||||
.join(", "),
|
.map(roleId => pluginData.guild.roles.cache.get(roleId) ?? { id: roleId, name: `Unknown (${roleId})` })
|
||||||
removedRoles: removedRoles
|
.map(r => r.name)
|
||||||
.map(roleId => pluginData.guild.roles.cache.get(roleId) ?? { id: roleId, name: `Unknown (${roleId})` })
|
.join(", "),
|
||||||
.map(r => r.name)
|
mod,
|
||||||
.join(", "),
|
});
|
||||||
mod: mod ? userToConfigAccessibleUser(mod) : {},
|
|
||||||
},
|
|
||||||
member.id,
|
|
||||||
);
|
|
||||||
} else if (addedRoles.length) {
|
} else if (addedRoles.length) {
|
||||||
// Roles added
|
// Roles added
|
||||||
pluginData.state.guildLogs.log(
|
logMemberRoleAdd(pluginData, {
|
||||||
LogType.MEMBER_ROLE_ADD,
|
member,
|
||||||
{
|
roles: addedRoles
|
||||||
member: logMember,
|
.map(roleId => pluginData.guild.roles.cache.get(roleId) ?? { id: roleId, name: `Unknown (${roleId})` })
|
||||||
roles: addedRoles
|
.map(r => r.name)
|
||||||
.map(roleId => pluginData.guild.roles.cache.get(roleId) ?? { id: roleId, name: `Unknown (${roleId})` })
|
.join(", "),
|
||||||
.map(r => r.name)
|
mod,
|
||||||
.join(", "),
|
});
|
||||||
mod: mod ? userToConfigAccessibleUser(mod) : {},
|
|
||||||
},
|
|
||||||
member.id,
|
|
||||||
);
|
|
||||||
} else if (removedRoles.length && !addedRoles.length) {
|
} else if (removedRoles.length && !addedRoles.length) {
|
||||||
// Roles removed
|
// Roles removed
|
||||||
pluginData.state.guildLogs.log(
|
logMemberRoleRemove(pluginData, {
|
||||||
LogType.MEMBER_ROLE_REMOVE,
|
member,
|
||||||
{
|
roles: removedRoles
|
||||||
member: logMember,
|
.map(roleId => pluginData.guild.roles.cache.get(roleId) ?? { id: roleId, name: `Unknown (${roleId})` })
|
||||||
roles: removedRoles
|
.map(r => r.name)
|
||||||
.map(roleId => pluginData.guild.roles.cache.get(roleId) ?? { id: roleId, name: `Unknown (${roleId})` })
|
.join(", "),
|
||||||
.map(r => r.name)
|
mod,
|
||||||
.join(", "),
|
});
|
||||||
mod: mod ? userToConfigAccessibleUser(mod) : {},
|
|
||||||
},
|
|
||||||
member.id,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import {
|
import { channelToTemplateSafeChannel, memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
|
||||||
channelToConfigAccessibleChannel,
|
|
||||||
memberToConfigAccessibleMember,
|
|
||||||
} from "../../../utils/configAccessibleObjects";
|
|
||||||
import { LogType } from "../../../data/LogType";
|
import { LogType } from "../../../data/LogType";
|
||||||
import { logsEvt } from "../types";
|
import { logsEvt } from "../types";
|
||||||
|
import { logVoiceChannelLeave } from "../logFunctions/logVoiceChannelLeave";
|
||||||
|
import { logVoiceChannelJoin } from "../logFunctions/logVoiceChannelJoin";
|
||||||
|
import { logVoiceChannelMove } from "../logFunctions/logVoiceChannelMove";
|
||||||
|
|
||||||
export const LogsVoiceStateUpdateEvt = logsEvt({
|
export const LogsVoiceStateUpdateEvt = logsEvt({
|
||||||
event: "voiceStateUpdate",
|
event: "voiceStateUpdate",
|
||||||
|
@ -15,21 +15,21 @@ export const LogsVoiceStateUpdateEvt = logsEvt({
|
||||||
|
|
||||||
if (!newChannel && oldChannel) {
|
if (!newChannel && oldChannel) {
|
||||||
// Leave evt
|
// Leave evt
|
||||||
meta.pluginData.state.guildLogs.log(LogType.VOICE_CHANNEL_LEAVE, {
|
logVoiceChannelLeave(meta.pluginData, {
|
||||||
member: memberToConfigAccessibleMember(member),
|
member,
|
||||||
channel: channelToConfigAccessibleChannel(oldChannel!),
|
channel: oldChannel,
|
||||||
});
|
});
|
||||||
} else if (!oldChannel && newChannel) {
|
} else if (!oldChannel && newChannel) {
|
||||||
// Join Evt
|
// Join Evt
|
||||||
meta.pluginData.state.guildLogs.log(LogType.VOICE_CHANNEL_JOIN, {
|
logVoiceChannelJoin(meta.pluginData, {
|
||||||
member: memberToConfigAccessibleMember(member),
|
member,
|
||||||
channel: channelToConfigAccessibleChannel(newChannel),
|
channel: newChannel,
|
||||||
});
|
});
|
||||||
} else {
|
} else if (oldChannel && newChannel) {
|
||||||
meta.pluginData.state.guildLogs.log(LogType.VOICE_CHANNEL_MOVE, {
|
logVoiceChannelMove(meta.pluginData, {
|
||||||
member: memberToConfigAccessibleMember(member),
|
member,
|
||||||
oldChannel: channelToConfigAccessibleChannel(oldChannel!),
|
oldChannel,
|
||||||
newChannel: channelToConfigAccessibleChannel(newChannel!),
|
newChannel,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
33
backend/src/plugins/Logs/logFunctions/logAutomodAction.ts
Normal file
33
backend/src/plugins/Logs/logFunctions/logAutomodAction.ts
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { User } from "discord.js";
|
||||||
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogAutomodActionData {
|
||||||
|
rule: string;
|
||||||
|
user: User;
|
||||||
|
users: User[];
|
||||||
|
actionsTaken: string;
|
||||||
|
matchSummary: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logAutomodAction(pluginData: GuildPluginData<LogsPluginType>, data: LogAutomodActionData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.AUTOMOD_ACTION,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
rule: data.rule,
|
||||||
|
user: userToTemplateSafeUser(data.user),
|
||||||
|
users: data.users.map(user => userToTemplateSafeUser(user)),
|
||||||
|
actionsTaken: data.actionsTaken,
|
||||||
|
matchSummary: data.matchSummary,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.user.id,
|
||||||
|
bot: data.user.bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
20
backend/src/plugins/Logs/logFunctions/logBotAlert.ts
Normal file
20
backend/src/plugins/Logs/logFunctions/logBotAlert.ts
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
|
||||||
|
interface LogBotAlertData {
|
||||||
|
body: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logBotAlert(pluginData: GuildPluginData<LogsPluginType>, data: LogBotAlertData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.BOT_ALERT,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
body: data.body,
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
32
backend/src/plugins/Logs/logFunctions/logCaseCreate.ts
Normal file
32
backend/src/plugins/Logs/logFunctions/logCaseCreate.ts
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { User } from "discord.js";
|
||||||
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogCaseCreateData {
|
||||||
|
mod: User;
|
||||||
|
userId: string;
|
||||||
|
caseNum: number;
|
||||||
|
caseType: string;
|
||||||
|
reason: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logCaseCreate(pluginData: GuildPluginData<LogsPluginType>, data: LogCaseCreateData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.CASE_CREATE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: userToTemplateSafeUser(data.mod),
|
||||||
|
userId: data.userId,
|
||||||
|
caseNum: data.caseNum,
|
||||||
|
caseType: data.caseType,
|
||||||
|
reason: data.reason,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.userId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
25
backend/src/plugins/Logs/logFunctions/logCaseDelete.ts
Normal file
25
backend/src/plugins/Logs/logFunctions/logCaseDelete.ts
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember } from "discord.js";
|
||||||
|
import { caseToTemplateSafeCase, memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
|
||||||
|
import { Case } from "../../../data/entities/Case";
|
||||||
|
|
||||||
|
interface LogCaseDeleteData {
|
||||||
|
mod: GuildMember;
|
||||||
|
case: Case;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logCaseDelete(pluginData: GuildPluginData<LogsPluginType>, data: LogCaseDeleteData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.CASE_DELETE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: memberToTemplateSafeMember(data.mod),
|
||||||
|
case: caseToTemplateSafeCase(data.case),
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
28
backend/src/plugins/Logs/logFunctions/logCaseUpdate.ts
Normal file
28
backend/src/plugins/Logs/logFunctions/logCaseUpdate.ts
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { User } from "discord.js";
|
||||||
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogCaseUpdateData {
|
||||||
|
mod: User;
|
||||||
|
caseNumber: number;
|
||||||
|
caseType: string;
|
||||||
|
note: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logCaseUpdate(pluginData: GuildPluginData<LogsPluginType>, data: LogCaseUpdateData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.CASE_UPDATE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: userToTemplateSafeUser(data.mod),
|
||||||
|
caseNumber: data.caseNumber,
|
||||||
|
caseType: data.caseType,
|
||||||
|
note: data.note,
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
41
backend/src/plugins/Logs/logFunctions/logCensor.ts
Normal file
41
backend/src/plugins/Logs/logFunctions/logCensor.ts
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { BaseGuildTextChannel, ThreadChannel, User } from "discord.js";
|
||||||
|
import {
|
||||||
|
channelToTemplateSafeChannel,
|
||||||
|
savedMessageToTemplateSafeSavedMessage,
|
||||||
|
userToTemplateSafeUser,
|
||||||
|
} from "../../../utils/templateSafeObjects";
|
||||||
|
import { SavedMessage } from "../../../data/entities/SavedMessage";
|
||||||
|
import { UnknownUser } from "../../../utils";
|
||||||
|
import { deactivateMentions, disableCodeBlocks } from "knub/dist/helpers";
|
||||||
|
|
||||||
|
interface LogCensorData {
|
||||||
|
user: User | UnknownUser;
|
||||||
|
channel: BaseGuildTextChannel | ThreadChannel;
|
||||||
|
reason: string;
|
||||||
|
message: SavedMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logCensor(pluginData: GuildPluginData<LogsPluginType>, data: LogCensorData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.CENSOR,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
user: userToTemplateSafeUser(data.user),
|
||||||
|
channel: channelToTemplateSafeChannel(data.channel),
|
||||||
|
reason: data.reason,
|
||||||
|
message: savedMessageToTemplateSafeSavedMessage(data.message),
|
||||||
|
messageText: disableCodeBlocks(deactivateMentions(data.message.data.content)),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.user.id,
|
||||||
|
channel: data.channel.id,
|
||||||
|
category: data.channel.parentId,
|
||||||
|
bot: data.user instanceof User ? data.user.bot : false,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
25
backend/src/plugins/Logs/logFunctions/logChannelCreate.ts
Normal file
25
backend/src/plugins/Logs/logFunctions/logChannelCreate.ts
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildChannel, NewsChannel } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogChannelCreateData {
|
||||||
|
channel: GuildChannel | NewsChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logChannelCreate(pluginData: GuildPluginData<LogsPluginType>, data: LogChannelCreateData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.CHANNEL_CREATE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
channel: channelToTemplateSafeChannel(data.channel),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
channel: data.channel.id,
|
||||||
|
category: data.channel.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
25
backend/src/plugins/Logs/logFunctions/logChannelDelete.ts
Normal file
25
backend/src/plugins/Logs/logFunctions/logChannelDelete.ts
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildChannel, NewsChannel } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogChannelDeleteData {
|
||||||
|
channel: GuildChannel | NewsChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logChannelDelete(pluginData: GuildPluginData<LogsPluginType>, data: LogChannelDeleteData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.CHANNEL_DELETE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
channel: channelToTemplateSafeChannel(data.channel),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
channel: data.channel.id,
|
||||||
|
category: data.channel.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
29
backend/src/plugins/Logs/logFunctions/logChannelUpdate.ts
Normal file
29
backend/src/plugins/Logs/logFunctions/logChannelUpdate.ts
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildChannel, NewsChannel } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogChannelUpdateData {
|
||||||
|
oldChannel: GuildChannel | NewsChannel;
|
||||||
|
newChannel: GuildChannel | NewsChannel;
|
||||||
|
differenceString: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logChannelUpdate(pluginData: GuildPluginData<LogsPluginType>, data: LogChannelUpdateData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.CHANNEL_UPDATE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
oldChannel: channelToTemplateSafeChannel(data.oldChannel),
|
||||||
|
newChannel: channelToTemplateSafeChannel(data.newChannel),
|
||||||
|
differenceString: data.differenceString,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
channel: data.newChannel.id,
|
||||||
|
category: data.newChannel.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
31
backend/src/plugins/Logs/logFunctions/logClean.ts
Normal file
31
backend/src/plugins/Logs/logFunctions/logClean.ts
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { BaseGuildTextChannel, User } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogCleanData {
|
||||||
|
mod: User;
|
||||||
|
channel: BaseGuildTextChannel;
|
||||||
|
count: number;
|
||||||
|
archiveUrl: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logClean(pluginData: GuildPluginData<LogsPluginType>, data: LogCleanData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.CLEAN,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: userToTemplateSafeUser(data.mod),
|
||||||
|
channel: channelToTemplateSafeChannel(data.channel),
|
||||||
|
count: data.count,
|
||||||
|
archiveUrl: data.archiveUrl,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
channel: data.channel.id,
|
||||||
|
category: data.channel.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
28
backend/src/plugins/Logs/logFunctions/logDmFailed.ts
Normal file
28
backend/src/plugins/Logs/logFunctions/logDmFailed.ts
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { UnknownUser } from "../../../utils";
|
||||||
|
import { User } from "discord.js";
|
||||||
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogDmFailedData {
|
||||||
|
source: string;
|
||||||
|
user: User | UnknownUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logDmFailed(pluginData: GuildPluginData<LogsPluginType>, data: LogDmFailedData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.DM_FAILED,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
source: data.source,
|
||||||
|
user: userToTemplateSafeUser(data.user),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.user.id,
|
||||||
|
bot: data.user instanceof User ? data.user.bot : false,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
22
backend/src/plugins/Logs/logFunctions/logEmojiCreate.ts
Normal file
22
backend/src/plugins/Logs/logFunctions/logEmojiCreate.ts
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { Emoji } from "discord.js";
|
||||||
|
import { emojiToTemplateSafeEmoji } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogEmojiCreateData {
|
||||||
|
emoji: Emoji;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logEmojiCreate(pluginData: GuildPluginData<LogsPluginType>, data: LogEmojiCreateData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.EMOJI_CREATE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
emoji: emojiToTemplateSafeEmoji(data.emoji),
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
22
backend/src/plugins/Logs/logFunctions/logEmojiDelete.ts
Normal file
22
backend/src/plugins/Logs/logFunctions/logEmojiDelete.ts
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { Emoji } from "discord.js";
|
||||||
|
import { emojiToTemplateSafeEmoji } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogEmojiDeleteData {
|
||||||
|
emoji: Emoji;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logEmojiDelete(pluginData: GuildPluginData<LogsPluginType>, data: LogEmojiDeleteData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.EMOJI_DELETE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
emoji: emojiToTemplateSafeEmoji(data.emoji),
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
26
backend/src/plugins/Logs/logFunctions/logEmojiUpdate.ts
Normal file
26
backend/src/plugins/Logs/logFunctions/logEmojiUpdate.ts
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { Emoji } from "discord.js";
|
||||||
|
import { emojiToTemplateSafeEmoji } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogEmojiUpdateData {
|
||||||
|
oldEmoji: Emoji;
|
||||||
|
newEmoji: Emoji;
|
||||||
|
differenceString: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logEmojiUpdate(pluginData: GuildPluginData<LogsPluginType>, data: LogEmojiUpdateData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.EMOJI_UPDATE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
oldEmoji: emojiToTemplateSafeEmoji(data.oldEmoji),
|
||||||
|
newEmoji: emojiToTemplateSafeEmoji(data.newEmoji),
|
||||||
|
differenceString: data.differenceString,
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
26
backend/src/plugins/Logs/logFunctions/logMassBan.ts
Normal file
26
backend/src/plugins/Logs/logFunctions/logMassBan.ts
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { User } from "discord.js";
|
||||||
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMassBanData {
|
||||||
|
mod: User;
|
||||||
|
count: number;
|
||||||
|
reason: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMassBan(pluginData: GuildPluginData<LogsPluginType>, data: LogMassBanData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MASSBAN,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: userToTemplateSafeUser(data.mod),
|
||||||
|
count: data.count,
|
||||||
|
reason: data.reason,
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
24
backend/src/plugins/Logs/logFunctions/logMassMute.ts
Normal file
24
backend/src/plugins/Logs/logFunctions/logMassMute.ts
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { User } from "discord.js";
|
||||||
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMassMuteData {
|
||||||
|
mod: User;
|
||||||
|
count: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMassMute(pluginData: GuildPluginData<LogsPluginType>, data: LogMassMuteData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MASSMUTE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: userToTemplateSafeUser(data.mod),
|
||||||
|
count: data.count,
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
26
backend/src/plugins/Logs/logFunctions/logMassUnban.ts
Normal file
26
backend/src/plugins/Logs/logFunctions/logMassUnban.ts
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { User } from "discord.js";
|
||||||
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMassUnbanData {
|
||||||
|
mod: User;
|
||||||
|
count: number;
|
||||||
|
reason: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMassUnban(pluginData: GuildPluginData<LogsPluginType>, data: LogMassUnbanData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MASSUNBAN,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: userToTemplateSafeUser(data.mod),
|
||||||
|
count: data.count,
|
||||||
|
reason: data.reason,
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
32
backend/src/plugins/Logs/logFunctions/logMemberBan.ts
Normal file
32
backend/src/plugins/Logs/logFunctions/logMemberBan.ts
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { User } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
import { UnknownUser } from "../../../utils";
|
||||||
|
|
||||||
|
interface LogMemberBanData {
|
||||||
|
mod: User | UnknownUser | null;
|
||||||
|
user: User | UnknownUser;
|
||||||
|
caseNumber: number;
|
||||||
|
reason: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberBan(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberBanData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_BAN,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: data.mod ? userToTemplateSafeUser(data.mod) : null,
|
||||||
|
user: userToTemplateSafeUser(data.user),
|
||||||
|
caseNumber: data.caseNumber,
|
||||||
|
reason: data.reason,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.user.id,
|
||||||
|
bot: data.user instanceof User ? data.user.bot : false,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
30
backend/src/plugins/Logs/logFunctions/logMemberForceban.ts
Normal file
30
backend/src/plugins/Logs/logFunctions/logMemberForceban.ts
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember, Snowflake } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMemberForcebanData {
|
||||||
|
mod: GuildMember;
|
||||||
|
userId: Snowflake;
|
||||||
|
caseNumber: number;
|
||||||
|
reason: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberForceban(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberForcebanData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_FORCEBAN,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: memberToTemplateSafeMember(data.mod),
|
||||||
|
userId: data.userId,
|
||||||
|
caseNumber: data.caseNumber,
|
||||||
|
reason: data.reason,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.userId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
35
backend/src/plugins/Logs/logFunctions/logMemberJoin.ts
Normal file
35
backend/src/plugins/Logs/logFunctions/logMemberJoin.ts
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
|
||||||
|
import moment from "moment-timezone";
|
||||||
|
import humanizeDuration from "humanize-duration";
|
||||||
|
|
||||||
|
interface LogMemberJoinData {
|
||||||
|
member: GuildMember;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberJoin(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberJoinData) {
|
||||||
|
const newThreshold = moment.utc().valueOf() - 1000 * 60 * 60;
|
||||||
|
const accountAge = humanizeDuration(moment.utc().valueOf() - data.member.user.createdTimestamp, {
|
||||||
|
largest: 2,
|
||||||
|
round: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_JOIN,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
member: memberToTemplateSafeMember(data.member),
|
||||||
|
new: data.member.user.createdTimestamp >= newThreshold ? " :new:" : "",
|
||||||
|
account_age: accountAge,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.member.id,
|
||||||
|
bot: data.member.user.bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMemberJoinWithPriorRecordsData {
|
||||||
|
member: GuildMember;
|
||||||
|
recentCaseSummary: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberJoinWithPriorRecords(
|
||||||
|
pluginData: GuildPluginData<LogsPluginType>,
|
||||||
|
data: LogMemberJoinWithPriorRecordsData,
|
||||||
|
) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_JOIN_WITH_PRIOR_RECORDS,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
member: memberToTemplateSafeMember(data.member),
|
||||||
|
recentCaseSummary: data.recentCaseSummary,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.member.id,
|
||||||
|
bot: data.member.user.bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
32
backend/src/plugins/Logs/logFunctions/logMemberKick.ts
Normal file
32
backend/src/plugins/Logs/logFunctions/logMemberKick.ts
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember, User } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
import { UnknownUser } from "../../../utils";
|
||||||
|
|
||||||
|
interface LogMemberKickData {
|
||||||
|
mod: User | UnknownUser | null;
|
||||||
|
user: User;
|
||||||
|
caseNumber: number;
|
||||||
|
reason: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberKick(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberKickData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_KICK,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: data.mod ? userToTemplateSafeUser(data.mod) : null,
|
||||||
|
user: userToTemplateSafeUser(data.user),
|
||||||
|
caseNumber: data.caseNumber,
|
||||||
|
reason: data.reason,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.user.id,
|
||||||
|
bot: data.user.bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
25
backend/src/plugins/Logs/logFunctions/logMemberLeave.ts
Normal file
25
backend/src/plugins/Logs/logFunctions/logMemberLeave.ts
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember, PartialGuildMember } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMemberLeaveData {
|
||||||
|
member: GuildMember | PartialGuildMember;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberLeave(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberLeaveData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_LEAVE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
member: memberToTemplateSafeMember(data.member),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.member.id,
|
||||||
|
bot: data.member.user?.bot ?? false,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
32
backend/src/plugins/Logs/logFunctions/logMemberMute.ts
Normal file
32
backend/src/plugins/Logs/logFunctions/logMemberMute.ts
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember, User } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
import { UnknownUser } from "../../../utils";
|
||||||
|
|
||||||
|
interface LogMemberMuteData {
|
||||||
|
mod: User | UnknownUser;
|
||||||
|
user: User | UnknownUser;
|
||||||
|
caseNumber: number;
|
||||||
|
reason: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberMute(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberMuteData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_MUTE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: userToTemplateSafeUser(data.mod),
|
||||||
|
user: userToTemplateSafeUser(data.user),
|
||||||
|
caseNumber: data.caseNumber,
|
||||||
|
reason: data.reason,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.user.id,
|
||||||
|
bot: data.user instanceof User ? data.user.bot : false,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember } from "discord.js";
|
||||||
|
import {
|
||||||
|
memberToTemplateSafeMember,
|
||||||
|
TemplateSafeUnknownMember,
|
||||||
|
TemplateSafeUnknownUser,
|
||||||
|
} from "../../../utils/templateSafeObjects";
|
||||||
|
import { UnknownUser } from "../../../utils";
|
||||||
|
|
||||||
|
interface LogMemberMuteExpiredData {
|
||||||
|
member: GuildMember | UnknownUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberMuteExpired(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberMuteExpiredData) {
|
||||||
|
const member =
|
||||||
|
data.member instanceof GuildMember
|
||||||
|
? memberToTemplateSafeMember(data.member)
|
||||||
|
: new TemplateSafeUnknownMember({ ...data.member, user: new TemplateSafeUnknownUser({ ...data.member }) });
|
||||||
|
|
||||||
|
const roles = data.member instanceof GuildMember ? Array.from(data.member.roles.cache.keys()) : [];
|
||||||
|
|
||||||
|
const bot = data.member instanceof GuildMember ? data.member.user.bot : false;
|
||||||
|
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_MUTE_EXPIRED,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
member,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.member.id,
|
||||||
|
roles,
|
||||||
|
bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
25
backend/src/plugins/Logs/logFunctions/logMemberMuteRejoin.ts
Normal file
25
backend/src/plugins/Logs/logFunctions/logMemberMuteRejoin.ts
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMemberMuteRejoinData {
|
||||||
|
member: GuildMember;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberMuteRejoin(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberMuteRejoinData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_MUTE_REJOIN,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
member: memberToTemplateSafeMember(data.member),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.member.id,
|
||||||
|
bot: data.member.user.bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
30
backend/src/plugins/Logs/logFunctions/logMemberNickChange.ts
Normal file
30
backend/src/plugins/Logs/logFunctions/logMemberNickChange.ts
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMemberNickChangeData {
|
||||||
|
member: GuildMember;
|
||||||
|
oldNick: string;
|
||||||
|
newNick: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberNickChange(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberNickChangeData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_NICK_CHANGE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
member: memberToTemplateSafeMember(data.member),
|
||||||
|
oldNick: data.oldNick,
|
||||||
|
newNick: data.newNick,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.member.id,
|
||||||
|
roles: Array.from(data.member.roles.cache.keys()),
|
||||||
|
bot: data.member.user.bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
32
backend/src/plugins/Logs/logFunctions/logMemberNote.ts
Normal file
32
backend/src/plugins/Logs/logFunctions/logMemberNote.ts
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { User } from "discord.js";
|
||||||
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
import { UnknownUser } from "../../../utils";
|
||||||
|
|
||||||
|
interface LogMemberNoteData {
|
||||||
|
mod: User;
|
||||||
|
user: User | UnknownUser;
|
||||||
|
caseNumber: number;
|
||||||
|
reason: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberNote(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberNoteData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_NOTE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: userToTemplateSafeUser(data.mod),
|
||||||
|
user: userToTemplateSafeUser(data.user),
|
||||||
|
caseNumber: data.caseNumber,
|
||||||
|
reason: data.reason,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.user.id,
|
||||||
|
bot: data.user instanceof User ? data.user.bot : false,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
28
backend/src/plugins/Logs/logFunctions/logMemberRestore.ts
Normal file
28
backend/src/plugins/Logs/logFunctions/logMemberRestore.ts
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMemberRestoreData {
|
||||||
|
member: GuildMember;
|
||||||
|
restoredData: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberRestore(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberRestoreData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_RESTORE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
member: memberToTemplateSafeMember(data.member),
|
||||||
|
restoredData: data.restoredData,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.member.id,
|
||||||
|
roles: Array.from(data.member.roles.cache.keys()),
|
||||||
|
bot: data.member.user.bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
30
backend/src/plugins/Logs/logFunctions/logMemberRoleAdd.ts
Normal file
30
backend/src/plugins/Logs/logFunctions/logMemberRoleAdd.ts
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember, Role, User } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMemberRoleAddData {
|
||||||
|
mod: User | null;
|
||||||
|
member: GuildMember;
|
||||||
|
roles: Role[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberRoleAdd(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberRoleAddData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_ROLE_ADD,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: userToTemplateSafeUser(data.mod),
|
||||||
|
member: memberToTemplateSafeMember(data.member),
|
||||||
|
roles: data.roles.map(r => r.name).join(", "),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.member.id,
|
||||||
|
roles: Array.from(data.member.roles.cache.keys()),
|
||||||
|
bot: data.member.user.bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember, User } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
import { UnknownUser } from "../../../utils";
|
||||||
|
|
||||||
|
interface LogMemberRoleChangesData {
|
||||||
|
mod: User | UnknownUser | null;
|
||||||
|
member: GuildMember;
|
||||||
|
addedRoles: string;
|
||||||
|
removedRoles: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberRoleChanges(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberRoleChangesData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_ROLE_CHANGES,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: data.mod ? userToTemplateSafeUser(data.mod) : null,
|
||||||
|
member: memberToTemplateSafeMember(data.member),
|
||||||
|
addedRoles: data.addedRoles,
|
||||||
|
removedRoles: data.removedRoles,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.member.id,
|
||||||
|
bot: data.member.user.bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
30
backend/src/plugins/Logs/logFunctions/logMemberRoleRemove.ts
Normal file
30
backend/src/plugins/Logs/logFunctions/logMemberRoleRemove.ts
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember, Role, User } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMemberRoleRemoveData {
|
||||||
|
mod: User | null;
|
||||||
|
member: GuildMember;
|
||||||
|
roles: Role[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberRoleRemove(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberRoleRemoveData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_ROLE_REMOVE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: userToTemplateSafeUser(data.mod),
|
||||||
|
member: memberToTemplateSafeMember(data.member),
|
||||||
|
roles: data.roles.map(r => r.name).join(", "),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.member.id,
|
||||||
|
roles: Array.from(data.member.roles.cache.keys()),
|
||||||
|
bot: data.member.user.bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
34
backend/src/plugins/Logs/logFunctions/logMemberTimedBan.ts
Normal file
34
backend/src/plugins/Logs/logFunctions/logMemberTimedBan.ts
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { User } from "discord.js";
|
||||||
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
import { UnknownUser } from "../../../utils";
|
||||||
|
|
||||||
|
interface LogMemberTimedBanData {
|
||||||
|
mod: User | UnknownUser;
|
||||||
|
user: User | UnknownUser;
|
||||||
|
banTime: string;
|
||||||
|
caseNumber: number;
|
||||||
|
reason: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberTimedBan(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberTimedBanData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_TIMED_BAN,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: userToTemplateSafeUser(data.mod),
|
||||||
|
user: userToTemplateSafeUser(data.user),
|
||||||
|
banTime: data.banTime,
|
||||||
|
caseNumber: data.caseNumber,
|
||||||
|
reason: data.reason,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.user.id,
|
||||||
|
bot: data.user instanceof User ? data.user.bot : false,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
31
backend/src/plugins/Logs/logFunctions/logMemberTimedMute.ts
Normal file
31
backend/src/plugins/Logs/logFunctions/logMemberTimedMute.ts
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { User } from "discord.js";
|
||||||
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
import { UnknownUser } from "../../../utils";
|
||||||
|
|
||||||
|
interface LogMemberTimedMuteData {
|
||||||
|
mod: User | UnknownUser;
|
||||||
|
user: User | UnknownUser;
|
||||||
|
time: string;
|
||||||
|
caseNumber: number;
|
||||||
|
reason: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberTimedMute(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberTimedMuteData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_TIMED_MUTE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: userToTemplateSafeUser(data.mod),
|
||||||
|
user: userToTemplateSafeUser(data.user),
|
||||||
|
time: data.time,
|
||||||
|
caseNumber: data.caseNumber,
|
||||||
|
reason: data.reason,
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
33
backend/src/plugins/Logs/logFunctions/logMemberTimedUnban.ts
Normal file
33
backend/src/plugins/Logs/logFunctions/logMemberTimedUnban.ts
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { User } from "discord.js";
|
||||||
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
import { UnknownUser } from "../../../utils";
|
||||||
|
|
||||||
|
interface LogMemberTimedUnbanData {
|
||||||
|
mod: User | UnknownUser;
|
||||||
|
userId: string;
|
||||||
|
banTime: string;
|
||||||
|
caseNumber: number;
|
||||||
|
reason: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberTimedUnban(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberTimedUnbanData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_TIMED_UNBAN,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: userToTemplateSafeUser(data.mod),
|
||||||
|
userId: data.userId,
|
||||||
|
banTime: data.banTime,
|
||||||
|
caseNumber: data.caseNumber,
|
||||||
|
reason: data.reason,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.userId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { User } from "discord.js";
|
||||||
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMemberTimedUnmuteData {
|
||||||
|
mod: User;
|
||||||
|
user: User;
|
||||||
|
time: string;
|
||||||
|
caseNumber: number;
|
||||||
|
reason: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberTimedUnmute(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberTimedUnmuteData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_TIMED_UNMUTE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: userToTemplateSafeUser(data.mod),
|
||||||
|
user: userToTemplateSafeUser(data.user),
|
||||||
|
time: data.time,
|
||||||
|
caseNumber: data.caseNumber,
|
||||||
|
reason: data.reason,
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
31
backend/src/plugins/Logs/logFunctions/logMemberUnban.ts
Normal file
31
backend/src/plugins/Logs/logFunctions/logMemberUnban.ts
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember, Snowflake, User } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
import { UnknownUser } from "../../../utils";
|
||||||
|
|
||||||
|
interface LogMemberUnbanData {
|
||||||
|
mod: User | UnknownUser | null;
|
||||||
|
userId: Snowflake;
|
||||||
|
caseNumber: number;
|
||||||
|
reason: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberUnban(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberUnbanData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_UNBAN,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: data.mod ? userToTemplateSafeUser(data.mod) : null,
|
||||||
|
userId: data.userId,
|
||||||
|
caseNumber: data.caseNumber,
|
||||||
|
reason: data.reason,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.userId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
31
backend/src/plugins/Logs/logFunctions/logMemberUnmute.ts
Normal file
31
backend/src/plugins/Logs/logFunctions/logMemberUnmute.ts
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember, User } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMemberUnmuteData {
|
||||||
|
mod: GuildMember;
|
||||||
|
user: User;
|
||||||
|
caseNumber: number;
|
||||||
|
reason: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberUnmute(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberUnmuteData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_UNMUTE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: memberToTemplateSafeMember(data.mod),
|
||||||
|
user: userToTemplateSafeUser(data.user),
|
||||||
|
caseNumber: data.caseNumber,
|
||||||
|
reason: data.reason,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.user.id,
|
||||||
|
bot: data.user.bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
32
backend/src/plugins/Logs/logFunctions/logMemberWarn.ts
Normal file
32
backend/src/plugins/Logs/logFunctions/logMemberWarn.ts
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMemberWarnData {
|
||||||
|
mod: GuildMember;
|
||||||
|
member: GuildMember;
|
||||||
|
caseNumber: number;
|
||||||
|
reason: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMemberWarn(pluginData: GuildPluginData<LogsPluginType>, data: LogMemberWarnData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MEMBER_WARN,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: memberToTemplateSafeMember(data.mod),
|
||||||
|
member: memberToTemplateSafeMember(data.member),
|
||||||
|
caseNumber: data.caseNumber,
|
||||||
|
reason: data.reason,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.member.id,
|
||||||
|
roles: Array.from(data.member.roles.cache.keys()),
|
||||||
|
bot: data.member.user.bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
56
backend/src/plugins/Logs/logFunctions/logMessageDelete.ts
Normal file
56
backend/src/plugins/Logs/logFunctions/logMessageDelete.ts
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { FORMAT_NO_TIMESTAMP, LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { BaseGuildTextChannel, ThreadChannel, User } from "discord.js";
|
||||||
|
import {
|
||||||
|
channelToTemplateSafeChannel,
|
||||||
|
savedMessageToTemplateSafeSavedMessage,
|
||||||
|
userToTemplateSafeUser,
|
||||||
|
} from "../../../utils/templateSafeObjects";
|
||||||
|
import moment from "moment-timezone";
|
||||||
|
import { ISavedMessageAttachmentData, SavedMessage } from "../../../data/entities/SavedMessage";
|
||||||
|
import { TimeAndDatePlugin } from "../../TimeAndDate/TimeAndDatePlugin";
|
||||||
|
import { UnknownUser, useMediaUrls } from "../../../utils";
|
||||||
|
|
||||||
|
interface LogMessageDeleteData {
|
||||||
|
user: User | UnknownUser;
|
||||||
|
channel: BaseGuildTextChannel | ThreadChannel;
|
||||||
|
message: SavedMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMessageDelete(pluginData: GuildPluginData<LogsPluginType>, data: LogMessageDeleteData) {
|
||||||
|
// Replace attachment URLs with media URLs
|
||||||
|
if (data.message.data.attachments) {
|
||||||
|
for (const attachment of data.message.data.attachments as ISavedMessageAttachmentData[]) {
|
||||||
|
attachment.url = useMediaUrls(attachment.url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// See comment on FORMAT_NO_TIMESTAMP in types.ts
|
||||||
|
const config = pluginData.config.get();
|
||||||
|
const timestampFormat =
|
||||||
|
(config.format.timestamp !== FORMAT_NO_TIMESTAMP ? config.format.timestamp : null) ?? config.timestamp_format;
|
||||||
|
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MESSAGE_DELETE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
user: userToTemplateSafeUser(data.user),
|
||||||
|
channel: channelToTemplateSafeChannel(data.channel),
|
||||||
|
message: savedMessageToTemplateSafeSavedMessage(data.message),
|
||||||
|
messageDate: pluginData
|
||||||
|
.getPlugin(TimeAndDatePlugin)
|
||||||
|
.inGuildTz(moment.utc(data.message.data.timestamp, "x"))
|
||||||
|
.format(timestampFormat),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.user.id,
|
||||||
|
channel: data.channel.id,
|
||||||
|
category: data.channel.parentId,
|
||||||
|
messageTextContent: data.message.data.content,
|
||||||
|
bot: data.user instanceof User ? data.user.bot : false,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { BaseGuildTextChannel, User } from "discord.js";
|
||||||
|
import {
|
||||||
|
channelToTemplateSafeChannel,
|
||||||
|
savedMessageToTemplateSafeSavedMessage,
|
||||||
|
userToTemplateSafeUser,
|
||||||
|
} from "../../../utils/templateSafeObjects";
|
||||||
|
import { SavedMessage } from "../../../data/entities/SavedMessage";
|
||||||
|
import { UnknownUser } from "../../../utils";
|
||||||
|
|
||||||
|
interface LogMessageDeleteAutoData {
|
||||||
|
message: SavedMessage;
|
||||||
|
user: User | UnknownUser;
|
||||||
|
channel: BaseGuildTextChannel;
|
||||||
|
messageDate: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMessageDeleteAuto(pluginData: GuildPluginData<LogsPluginType>, data: LogMessageDeleteAutoData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MESSAGE_DELETE_AUTO,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
message: savedMessageToTemplateSafeSavedMessage(data.message),
|
||||||
|
user: userToTemplateSafeUser(data.user),
|
||||||
|
channel: channelToTemplateSafeChannel(data.channel),
|
||||||
|
messageDate: data.messageDate,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.user.id,
|
||||||
|
bot: data.user.bot,
|
||||||
|
channel: data.channel.id,
|
||||||
|
category: data.channel.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { BaseGuildTextChannel, ThreadChannel } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMessageDeleteBareData {
|
||||||
|
messageId: string;
|
||||||
|
channel: BaseGuildTextChannel | ThreadChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMessageDeleteBare(pluginData: GuildPluginData<LogsPluginType>, data: LogMessageDeleteBareData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MESSAGE_DELETE_BARE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
messageId: data.messageId,
|
||||||
|
channel: channelToTemplateSafeChannel(data.channel),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
channel: data.channel.id,
|
||||||
|
category: data.channel.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { BaseGuildTextChannel, ThreadChannel } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMessageDeleteBulkData {
|
||||||
|
count: number;
|
||||||
|
authorIds: string[];
|
||||||
|
channel: BaseGuildTextChannel | ThreadChannel;
|
||||||
|
archiveUrl: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMessageDeleteBulk(pluginData: GuildPluginData<LogsPluginType>, data: LogMessageDeleteBulkData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MESSAGE_DELETE_BULK,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
count: data.count,
|
||||||
|
authorIds: data.authorIds,
|
||||||
|
channel: channelToTemplateSafeChannel(data.channel),
|
||||||
|
archiveUrl: data.archiveUrl,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
channel: data.channel.id,
|
||||||
|
category: data.channel.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
39
backend/src/plugins/Logs/logFunctions/logMessageEdit.ts
Normal file
39
backend/src/plugins/Logs/logFunctions/logMessageEdit.ts
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { BaseGuildTextChannel, ThreadChannel, User } from "discord.js";
|
||||||
|
import {
|
||||||
|
channelToTemplateSafeChannel,
|
||||||
|
savedMessageToTemplateSafeSavedMessage,
|
||||||
|
userToTemplateSafeUser,
|
||||||
|
} from "../../../utils/templateSafeObjects";
|
||||||
|
import { SavedMessage } from "../../../data/entities/SavedMessage";
|
||||||
|
import { UnknownUser } from "../../../utils";
|
||||||
|
|
||||||
|
interface LogMessageEditData {
|
||||||
|
user: User | UnknownUser;
|
||||||
|
channel: BaseGuildTextChannel | ThreadChannel;
|
||||||
|
before: SavedMessage;
|
||||||
|
after: SavedMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMessageEdit(pluginData: GuildPluginData<LogsPluginType>, data: LogMessageEditData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MESSAGE_EDIT,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
user: userToTemplateSafeUser(data.user),
|
||||||
|
channel: channelToTemplateSafeChannel(data.channel),
|
||||||
|
before: savedMessageToTemplateSafeSavedMessage(data.before),
|
||||||
|
after: savedMessageToTemplateSafeSavedMessage(data.after),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.user.id,
|
||||||
|
channel: data.channel.id,
|
||||||
|
messageTextContent: data.after.data.content,
|
||||||
|
bot: data.user instanceof User ? data.user.bot : false,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { BaseGuildTextChannel, GuildChannel, GuildMember, ThreadChannel } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel, memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogMessageSpamDetectedData {
|
||||||
|
member: GuildMember;
|
||||||
|
channel: GuildChannel | ThreadChannel;
|
||||||
|
description: string;
|
||||||
|
limit: number;
|
||||||
|
interval: number;
|
||||||
|
archiveUrl: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logMessageSpamDetected(pluginData: GuildPluginData<LogsPluginType>, data: LogMessageSpamDetectedData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.MESSAGE_SPAM_DETECTED,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
member: memberToTemplateSafeMember(data.member),
|
||||||
|
channel: channelToTemplateSafeChannel(data.channel),
|
||||||
|
description: data.description,
|
||||||
|
limit: data.limit,
|
||||||
|
interval: data.interval,
|
||||||
|
archiveUrl: data.archiveUrl,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.member.id,
|
||||||
|
roles: Array.from(data.member.roles.cache.keys()),
|
||||||
|
channel: data.channel.id,
|
||||||
|
category: data.channel.parentId,
|
||||||
|
bot: data.member.user.bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { GuildMember } from "discord.js";
|
||||||
|
import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogOtherSpamDetectedData {
|
||||||
|
member: GuildMember;
|
||||||
|
description: string;
|
||||||
|
limit: number;
|
||||||
|
interval: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logOtherSpamDetected(pluginData: GuildPluginData<LogsPluginType>, data: LogOtherSpamDetectedData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.OTHER_SPAM_DETECTED,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
member: memberToTemplateSafeMember(data.member),
|
||||||
|
description: data.description,
|
||||||
|
limit: data.limit,
|
||||||
|
interval: data.interval,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.member.id,
|
||||||
|
bot: data.member.user.bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { BaseGuildTextChannel, User } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogPostedScheduledMessageData {
|
||||||
|
author: User;
|
||||||
|
channel: BaseGuildTextChannel;
|
||||||
|
messageId: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logPostedScheduledMessage(
|
||||||
|
pluginData: GuildPluginData<LogsPluginType>,
|
||||||
|
data: LogPostedScheduledMessageData,
|
||||||
|
) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.POSTED_SCHEDULED_MESSAGE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
author: userToTemplateSafeUser(data.author),
|
||||||
|
channel: channelToTemplateSafeChannel(data.channel),
|
||||||
|
messageId: data.messageId,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.author.id,
|
||||||
|
bot: data.author.bot,
|
||||||
|
channel: data.channel.id,
|
||||||
|
category: data.channel.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
39
backend/src/plugins/Logs/logFunctions/logRepeatedMessage.ts
Normal file
39
backend/src/plugins/Logs/logFunctions/logRepeatedMessage.ts
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { BaseGuildTextChannel, User } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogRepeatedMessageData {
|
||||||
|
author: User;
|
||||||
|
channel: BaseGuildTextChannel;
|
||||||
|
datetime: string;
|
||||||
|
date: string;
|
||||||
|
time: string;
|
||||||
|
repeatInterval: string;
|
||||||
|
repeatDetails: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logRepeatedMessage(pluginData: GuildPluginData<LogsPluginType>, data: LogRepeatedMessageData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.REPEATED_MESSAGE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
author: userToTemplateSafeUser(data.author),
|
||||||
|
channel: channelToTemplateSafeChannel(data.channel),
|
||||||
|
datetime: data.datetime,
|
||||||
|
date: data.date,
|
||||||
|
time: data.time,
|
||||||
|
repeatInterval: data.repeatInterval,
|
||||||
|
repeatDetails: data.repeatDetails,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.author.id,
|
||||||
|
bot: data.author.bot,
|
||||||
|
channel: data.channel.id,
|
||||||
|
category: data.channel.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
22
backend/src/plugins/Logs/logFunctions/logRoleCreate.ts
Normal file
22
backend/src/plugins/Logs/logFunctions/logRoleCreate.ts
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { Role } from "discord.js";
|
||||||
|
import { roleToTemplateSafeRole } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogRoleCreateData {
|
||||||
|
role: Role;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logRoleCreate(pluginData: GuildPluginData<LogsPluginType>, data: LogRoleCreateData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.ROLE_CREATE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
role: roleToTemplateSafeRole(data.role),
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
22
backend/src/plugins/Logs/logFunctions/logRoleDelete.ts
Normal file
22
backend/src/plugins/Logs/logFunctions/logRoleDelete.ts
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { Role } from "discord.js";
|
||||||
|
import { roleToTemplateSafeRole } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogRoleDeleteData {
|
||||||
|
role: Role;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logRoleDelete(pluginData: GuildPluginData<LogsPluginType>, data: LogRoleDeleteData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.ROLE_DELETE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
role: roleToTemplateSafeRole(data.role),
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
26
backend/src/plugins/Logs/logFunctions/logRoleUpdate.ts
Normal file
26
backend/src/plugins/Logs/logFunctions/logRoleUpdate.ts
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { Role } from "discord.js";
|
||||||
|
import { roleToTemplateSafeRole } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogRoleUpdateData {
|
||||||
|
oldRole: Role;
|
||||||
|
newRole: Role;
|
||||||
|
differenceString: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logRoleUpdate(pluginData: GuildPluginData<LogsPluginType>, data: LogRoleUpdateData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.ROLE_UPDATE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
oldRole: roleToTemplateSafeRole(data.oldRole),
|
||||||
|
newRole: roleToTemplateSafeRole(data.newRole),
|
||||||
|
differenceString: data.differenceString,
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
35
backend/src/plugins/Logs/logFunctions/logScheduledMessage.ts
Normal file
35
backend/src/plugins/Logs/logFunctions/logScheduledMessage.ts
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { BaseGuildTextChannel, User } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogScheduledMessageData {
|
||||||
|
author: User;
|
||||||
|
channel: BaseGuildTextChannel;
|
||||||
|
datetime: string;
|
||||||
|
date: string;
|
||||||
|
time: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logScheduledMessage(pluginData: GuildPluginData<LogsPluginType>, data: LogScheduledMessageData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.SCHEDULED_MESSAGE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
author: userToTemplateSafeUser(data.author),
|
||||||
|
channel: channelToTemplateSafeChannel(data.channel),
|
||||||
|
datetime: data.datetime,
|
||||||
|
date: data.date,
|
||||||
|
time: data.time,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.author.id,
|
||||||
|
bot: data.author.bot,
|
||||||
|
channel: data.channel.id,
|
||||||
|
category: data.channel.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { BaseGuildTextChannel, User } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogScheduledRepeatedMessageData {
|
||||||
|
author: User;
|
||||||
|
channel: BaseGuildTextChannel;
|
||||||
|
datetime: string;
|
||||||
|
date: string;
|
||||||
|
time: string;
|
||||||
|
repeatInterval: string;
|
||||||
|
repeatDetails: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logScheduledRepeatedMessage(
|
||||||
|
pluginData: GuildPluginData<LogsPluginType>,
|
||||||
|
data: LogScheduledRepeatedMessageData,
|
||||||
|
) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.SCHEDULED_REPEATED_MESSAGE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
author: userToTemplateSafeUser(data.author),
|
||||||
|
channel: channelToTemplateSafeChannel(data.channel),
|
||||||
|
datetime: data.datetime,
|
||||||
|
date: data.date,
|
||||||
|
time: data.time,
|
||||||
|
repeatInterval: data.repeatInterval,
|
||||||
|
repeatDetails: data.repeatDetails,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.author.id,
|
||||||
|
bot: data.author.bot,
|
||||||
|
channel: data.channel.id,
|
||||||
|
category: data.channel.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
20
backend/src/plugins/Logs/logFunctions/logSetAntiraidAuto.ts
Normal file
20
backend/src/plugins/Logs/logFunctions/logSetAntiraidAuto.ts
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
|
||||||
|
interface LogSetAntiraidAutoData {
|
||||||
|
level: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logSetAntiraidAuto(pluginData: GuildPluginData<LogsPluginType>, data: LogSetAntiraidAutoData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.SET_ANTIRAID_AUTO,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
level: data.level,
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
27
backend/src/plugins/Logs/logFunctions/logSetAntiraidUser.ts
Normal file
27
backend/src/plugins/Logs/logFunctions/logSetAntiraidUser.ts
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { User } from "discord.js";
|
||||||
|
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogSetAntiraidUserData {
|
||||||
|
level: string;
|
||||||
|
user: User;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logSetAntiraidUser(pluginData: GuildPluginData<LogsPluginType>, data: LogSetAntiraidUserData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.SET_ANTIRAID_USER,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
level: data.level,
|
||||||
|
user: userToTemplateSafeUser(data.user),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.user.id,
|
||||||
|
bot: data.user.bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { StageChannel, StageInstance } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel, stageToTemplateSafeStage } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogStageInstanceCreateData {
|
||||||
|
stageInstance: StageInstance;
|
||||||
|
stageChannel: StageChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logStageInstanceCreate(pluginData: GuildPluginData<LogsPluginType>, data: LogStageInstanceCreateData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.STAGE_INSTANCE_CREATE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
stageInstance: stageToTemplateSafeStage(data.stageInstance),
|
||||||
|
stageChannel: channelToTemplateSafeChannel(data.stageChannel),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
channel: data.stageInstance.channel!.id,
|
||||||
|
category: data.stageInstance.channel!.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { StageChannel, StageInstance } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel, stageToTemplateSafeStage } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogStageInstanceDeleteData {
|
||||||
|
stageInstance: StageInstance;
|
||||||
|
stageChannel: StageChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logStageInstanceDelete(pluginData: GuildPluginData<LogsPluginType>, data: LogStageInstanceDeleteData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.STAGE_INSTANCE_DELETE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
stageInstance: stageToTemplateSafeStage(data.stageInstance),
|
||||||
|
stageChannel: channelToTemplateSafeChannel(data.stageChannel),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
channel: data.stageInstance.channel!.id,
|
||||||
|
category: data.stageInstance.channel!.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { StageChannel, StageInstance } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel, stageToTemplateSafeStage } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogStageInstanceUpdateData {
|
||||||
|
oldStageInstance: StageInstance;
|
||||||
|
newStageInstance: StageInstance;
|
||||||
|
stageChannel: StageChannel;
|
||||||
|
differenceString: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logStageInstanceUpdate(pluginData: GuildPluginData<LogsPluginType>, data: LogStageInstanceUpdateData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.STAGE_INSTANCE_UPDATE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
oldStageInstance: stageToTemplateSafeStage(data.oldStageInstance),
|
||||||
|
newStageInstance: stageToTemplateSafeStage(data.newStageInstance),
|
||||||
|
stageChannel: channelToTemplateSafeChannel(data.stageChannel),
|
||||||
|
differenceString: data.differenceString,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
channel: data.newStageInstance.channel!.id,
|
||||||
|
category: data.newStageInstance.channel!.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
22
backend/src/plugins/Logs/logFunctions/logStickerCreate.ts
Normal file
22
backend/src/plugins/Logs/logFunctions/logStickerCreate.ts
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { Sticker } from "discord.js";
|
||||||
|
import { stickerToTemplateSafeSticker } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogStickerCreateData {
|
||||||
|
sticker: Sticker;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logStickerCreate(pluginData: GuildPluginData<LogsPluginType>, data: LogStickerCreateData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.STICKER_CREATE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
sticker: stickerToTemplateSafeSticker(data.sticker),
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
22
backend/src/plugins/Logs/logFunctions/logStickerDelete.ts
Normal file
22
backend/src/plugins/Logs/logFunctions/logStickerDelete.ts
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { Sticker } from "discord.js";
|
||||||
|
import { stickerToTemplateSafeSticker } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogStickerDeleteData {
|
||||||
|
sticker: Sticker;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logStickerDelete(pluginData: GuildPluginData<LogsPluginType>, data: LogStickerDeleteData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.STICKER_DELETE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
sticker: stickerToTemplateSafeSticker(data.sticker),
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
26
backend/src/plugins/Logs/logFunctions/logStickerUpdate.ts
Normal file
26
backend/src/plugins/Logs/logFunctions/logStickerUpdate.ts
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { Sticker } from "discord.js";
|
||||||
|
import { stickerToTemplateSafeSticker } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogStickerUpdateData {
|
||||||
|
oldSticker: Sticker;
|
||||||
|
newSticker: Sticker;
|
||||||
|
differenceString: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logStickerUpdate(pluginData: GuildPluginData<LogsPluginType>, data: LogStickerUpdateData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.STICKER_UPDATE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
oldSticker: stickerToTemplateSafeSticker(data.oldSticker),
|
||||||
|
newSticker: stickerToTemplateSafeSticker(data.newSticker),
|
||||||
|
differenceString: data.differenceString,
|
||||||
|
}),
|
||||||
|
{},
|
||||||
|
);
|
||||||
|
}
|
25
backend/src/plugins/Logs/logFunctions/logThreadCreate.ts
Normal file
25
backend/src/plugins/Logs/logFunctions/logThreadCreate.ts
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { ThreadChannel } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogThreadCreateData {
|
||||||
|
thread: ThreadChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logThreadCreate(pluginData: GuildPluginData<LogsPluginType>, data: LogThreadCreateData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.THREAD_CREATE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
thread: channelToTemplateSafeChannel(data.thread),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
channel: data.thread.parentId,
|
||||||
|
category: data.thread.parent?.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
25
backend/src/plugins/Logs/logFunctions/logThreadDelete.ts
Normal file
25
backend/src/plugins/Logs/logFunctions/logThreadDelete.ts
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { ThreadChannel } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogThreadDeleteData {
|
||||||
|
thread: ThreadChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logThreadDelete(pluginData: GuildPluginData<LogsPluginType>, data: LogThreadDeleteData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.THREAD_DELETE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
thread: channelToTemplateSafeChannel(data.thread),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
channel: data.thread.parentId,
|
||||||
|
category: data.thread.parent?.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
29
backend/src/plugins/Logs/logFunctions/logThreadUpdate.ts
Normal file
29
backend/src/plugins/Logs/logFunctions/logThreadUpdate.ts
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { ThreadChannel } from "discord.js";
|
||||||
|
import { channelToTemplateSafeChannel } from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogThreadUpdateData {
|
||||||
|
oldThread: ThreadChannel;
|
||||||
|
newThread: ThreadChannel;
|
||||||
|
differenceString: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logThreadUpdate(pluginData: GuildPluginData<LogsPluginType>, data: LogThreadUpdateData) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.THREAD_UPDATE,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
oldThread: channelToTemplateSafeChannel(data.oldThread),
|
||||||
|
newThread: channelToTemplateSafeChannel(data.newThread),
|
||||||
|
differenceString: data.differenceString,
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
channel: data.newThread.parentId,
|
||||||
|
category: data.newThread.parent?.parentId,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
import { GuildPluginData } from "knub";
|
||||||
|
import { LogsPluginType } from "../types";
|
||||||
|
import { LogType } from "../../../data/LogType";
|
||||||
|
import { log } from "../util/log";
|
||||||
|
import { createTypedTemplateSafeValueContainer } from "../../../templateFormatter";
|
||||||
|
import { BaseGuildVoiceChannel, GuildMember, User } from "discord.js";
|
||||||
|
import {
|
||||||
|
channelToTemplateSafeChannel,
|
||||||
|
memberToTemplateSafeMember,
|
||||||
|
userToTemplateSafeUser,
|
||||||
|
} from "../../../utils/templateSafeObjects";
|
||||||
|
|
||||||
|
interface LogVoiceChannelForceDisconnectData {
|
||||||
|
mod: User;
|
||||||
|
member: GuildMember;
|
||||||
|
oldChannel: BaseGuildVoiceChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logVoiceChannelForceDisconnect(
|
||||||
|
pluginData: GuildPluginData<LogsPluginType>,
|
||||||
|
data: LogVoiceChannelForceDisconnectData,
|
||||||
|
) {
|
||||||
|
return log(
|
||||||
|
pluginData,
|
||||||
|
LogType.VOICE_CHANNEL_FORCE_DISCONNECT,
|
||||||
|
createTypedTemplateSafeValueContainer({
|
||||||
|
mod: userToTemplateSafeUser(data.mod),
|
||||||
|
member: memberToTemplateSafeMember(data.member),
|
||||||
|
oldChannel: channelToTemplateSafeChannel(data.oldChannel),
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
userId: data.member.id,
|
||||||
|
roles: Array.from(data.member.roles.cache.keys()),
|
||||||
|
channel: data.oldChannel.id,
|
||||||
|
category: data.oldChannel.parentId,
|
||||||
|
bot: data.member.user.bot,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue