|
|
|
@ -1,4 +1,3 @@
|
|
|
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
|
|
|
|
|
|
// @ts-expect-error
|
|
|
|
// @ts-expect-error
|
|
|
|
import { HaikuClient } from "jshaiku";
|
|
|
|
import { HaikuClient } from "jshaiku";
|
|
|
|
import {
|
|
|
|
import {
|
|
|
|
@ -14,12 +13,11 @@ import createLogException from "../utils/createLogException.js";
|
|
|
|
import getEmojiByName from "../utils/getEmojiByName.js";
|
|
|
|
import getEmojiByName from "../utils/getEmojiByName.js";
|
|
|
|
import client from "../utils/client.js";
|
|
|
|
import client from "../utils/client.js";
|
|
|
|
import { callback as a } from "../reflex/statsChannelUpdate.js";
|
|
|
|
import { callback as a } from "../reflex/statsChannelUpdate.js";
|
|
|
|
import type { Message } from "discord.js";
|
|
|
|
import { Message, ThreadChannel } from "discord.js";
|
|
|
|
|
|
|
|
|
|
|
|
export const event = "messageCreate";
|
|
|
|
export const event = "messageCreate";
|
|
|
|
|
|
|
|
|
|
|
|
export async function callback(_client: HaikuClient, message: Message) {
|
|
|
|
export async function callback(_client: HaikuClient, message: Message) {
|
|
|
|
if (!message) return;
|
|
|
|
|
|
|
|
if (!message.guild) return;
|
|
|
|
if (!message.guild) return;
|
|
|
|
if (message.author.bot) return;
|
|
|
|
if (message.author.bot) return;
|
|
|
|
if (message.channel.type === "DM") return;
|
|
|
|
if (message.channel.type === "DM") return;
|
|
|
|
@ -112,129 +110,56 @@ export async function callback(_client: HaikuClient, message: Message) {
|
|
|
|
|
|
|
|
|
|
|
|
if (fileNames.files.length > 0) {
|
|
|
|
if (fileNames.files.length > 0) {
|
|
|
|
for (const element of fileNames.files) {
|
|
|
|
for (const element of fileNames.files) {
|
|
|
|
if (!message) return;
|
|
|
|
|
|
|
|
const url = element.url ? element.url : element.local;
|
|
|
|
const url = element.url ? element.url : element.local;
|
|
|
|
if (url !== undefined) {
|
|
|
|
if (
|
|
|
|
|
|
|
|
/\.(jpg|jpeg|png|gif|gifv|webm|webp|mp4|wav|mp3|ogg)$/.test(url)
|
|
|
|
|
|
|
|
) {
|
|
|
|
if (
|
|
|
|
if (
|
|
|
|
/\.(jpg|jpeg|png|gif|gifv|webm|webp|mp4|wav|mp3|ogg)$/.test(
|
|
|
|
config.filters.images.NSFW &&
|
|
|
|
url
|
|
|
|
!(message.channel instanceof ThreadChannel
|
|
|
|
)
|
|
|
|
? message.channel.parent?.nsfw
|
|
|
|
|
|
|
|
: message.channel.nsfw)
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
if (
|
|
|
|
if (await NSFWCheck(url)) {
|
|
|
|
config.filters.images.NSFW &&
|
|
|
|
createLogException(
|
|
|
|
!(message.channel.type === "GUILD_PUBLIC_THREAD"
|
|
|
|
message.guild.id,
|
|
|
|
? false
|
|
|
|
message.channel.id,
|
|
|
|
: message.channel.nsfw)
|
|
|
|
message.id
|
|
|
|
) {
|
|
|
|
|
|
|
|
if (await NSFWCheck(url)) {
|
|
|
|
|
|
|
|
createLogException(
|
|
|
|
|
|
|
|
message.guild.id,
|
|
|
|
|
|
|
|
message.channel.id,
|
|
|
|
|
|
|
|
message.id
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
await message.delete();
|
|
|
|
|
|
|
|
const data = {
|
|
|
|
|
|
|
|
meta: {
|
|
|
|
|
|
|
|
type: "messageDelete",
|
|
|
|
|
|
|
|
displayName: "Message Deleted",
|
|
|
|
|
|
|
|
calculateType: "autoModeratorDeleted",
|
|
|
|
|
|
|
|
color: NucleusColors.red,
|
|
|
|
|
|
|
|
emoji: "MESSAGE.DELETE",
|
|
|
|
|
|
|
|
timestamp: new Date().getTime()
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
separate: {
|
|
|
|
|
|
|
|
start:
|
|
|
|
|
|
|
|
filter +
|
|
|
|
|
|
|
|
" Image detected as NSFW\n\n" +
|
|
|
|
|
|
|
|
(content
|
|
|
|
|
|
|
|
? `**Message:**\n\`\`\`${content}\`\`\``
|
|
|
|
|
|
|
|
: "**Message:** *Message had no content*")
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
list: list,
|
|
|
|
|
|
|
|
hidden: {
|
|
|
|
|
|
|
|
guild: message.channel.guild.id
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
return log(data);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (config.filters.wordFilter.enabled) {
|
|
|
|
|
|
|
|
const text = await TestImage(url);
|
|
|
|
|
|
|
|
const check = TestString(
|
|
|
|
|
|
|
|
text ?? "",
|
|
|
|
|
|
|
|
config.filters.wordFilter.words.loose,
|
|
|
|
|
|
|
|
config.filters.wordFilter.words.strict
|
|
|
|
|
|
|
|
);
|
|
|
|
);
|
|
|
|
if (check !== null) {
|
|
|
|
await message.delete();
|
|
|
|
createLogException(
|
|
|
|
const data = {
|
|
|
|
message.guild.id,
|
|
|
|
meta: {
|
|
|
|
message.channel.id,
|
|
|
|
type: "messageDelete",
|
|
|
|
message.id
|
|
|
|
displayName: "Message Deleted",
|
|
|
|
);
|
|
|
|
calculateType: "autoModeratorDeleted",
|
|
|
|
await message.delete();
|
|
|
|
color: NucleusColors.red,
|
|
|
|
const data = {
|
|
|
|
emoji: "MESSAGE.DELETE",
|
|
|
|
meta: {
|
|
|
|
timestamp: new Date().getTime()
|
|
|
|
type: "messageDelete",
|
|
|
|
},
|
|
|
|
displayName: "Message Deleted",
|
|
|
|
separate: {
|
|
|
|
calculateType: "autoModeratorDeleted",
|
|
|
|
start:
|
|
|
|
color: NucleusColors.red,
|
|
|
|
filter +
|
|
|
|
emoji: "MESSAGE.DELETE",
|
|
|
|
" Image detected as NSFW\n\n" +
|
|
|
|
timestamp: new Date().getTime()
|
|
|
|
(content
|
|
|
|
},
|
|
|
|
? `**Message:**\n\`\`\`${content}\`\`\``
|
|
|
|
separate: {
|
|
|
|
: "**Message:** *Message had no content*")
|
|
|
|
start:
|
|
|
|
},
|
|
|
|
filter +
|
|
|
|
list: list,
|
|
|
|
" Image contained filtered word\n\n" +
|
|
|
|
hidden: {
|
|
|
|
(content
|
|
|
|
guild: message.channel.guild.id
|
|
|
|
? `**Message:**\n\`\`\`${content}\`\`\``
|
|
|
|
|
|
|
|
: "**Message:** *Message had no content*")
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
list: list,
|
|
|
|
|
|
|
|
hidden: {
|
|
|
|
|
|
|
|
guild: message.channel.guild.id
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
return log(data);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (config.filters.images.size) {
|
|
|
|
|
|
|
|
if (url.match(/\.+(webp|png|jpg)$/gi)) {
|
|
|
|
|
|
|
|
if (!(await SizeCheck(element))) {
|
|
|
|
|
|
|
|
createLogException(
|
|
|
|
|
|
|
|
message.guild.id,
|
|
|
|
|
|
|
|
message.channel.id,
|
|
|
|
|
|
|
|
message.id
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
await message.delete();
|
|
|
|
|
|
|
|
const data = {
|
|
|
|
|
|
|
|
meta: {
|
|
|
|
|
|
|
|
type: "messageDelete",
|
|
|
|
|
|
|
|
displayName: "Message Deleted",
|
|
|
|
|
|
|
|
calculateType: "autoModeratorDeleted",
|
|
|
|
|
|
|
|
color: NucleusColors.red,
|
|
|
|
|
|
|
|
emoji: "MESSAGE.DELETE",
|
|
|
|
|
|
|
|
timestamp: new Date().getTime()
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
separate: {
|
|
|
|
|
|
|
|
start:
|
|
|
|
|
|
|
|
filter +
|
|
|
|
|
|
|
|
" Image was too small\n\n" +
|
|
|
|
|
|
|
|
(content
|
|
|
|
|
|
|
|
? `**Message:**\n\`\`\`${content}\`\`\``
|
|
|
|
|
|
|
|
: "**Message:** *Message had no content*")
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
list: list,
|
|
|
|
|
|
|
|
hidden: {
|
|
|
|
|
|
|
|
guild: message.channel.guild.id
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
return log(data);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return log(data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (config.filters.malware) {
|
|
|
|
if (config.filters.wordFilter.enabled) {
|
|
|
|
if (!MalwareCheck(url)) {
|
|
|
|
const text = await TestImage(url);
|
|
|
|
|
|
|
|
const check = TestString(
|
|
|
|
|
|
|
|
text ?? "",
|
|
|
|
|
|
|
|
config.filters.wordFilter.words.loose,
|
|
|
|
|
|
|
|
config.filters.wordFilter.words.strict
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
if (check !== null) {
|
|
|
|
createLogException(
|
|
|
|
createLogException(
|
|
|
|
message.guild.id,
|
|
|
|
message.guild.id,
|
|
|
|
message.channel.id,
|
|
|
|
message.channel.id,
|
|
|
|
@ -253,7 +178,7 @@ export async function callback(_client: HaikuClient, message: Message) {
|
|
|
|
separate: {
|
|
|
|
separate: {
|
|
|
|
start:
|
|
|
|
start:
|
|
|
|
filter +
|
|
|
|
filter +
|
|
|
|
" File detected as malware\n\n" +
|
|
|
|
" Image contained filtered word\n\n" +
|
|
|
|
(content
|
|
|
|
(content
|
|
|
|
? `**Message:**\n\`\`\`${content}\`\`\``
|
|
|
|
? `**Message:**\n\`\`\`${content}\`\`\``
|
|
|
|
: "**Message:** *Message had no content*")
|
|
|
|
: "**Message:** *Message had no content*")
|
|
|
|
@ -266,10 +191,77 @@ export async function callback(_client: HaikuClient, message: Message) {
|
|
|
|
return log(data);
|
|
|
|
return log(data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (config.filters.images.size) {
|
|
|
|
|
|
|
|
if (url.match(/\.+(webp|png|jpg)$/gi)) {
|
|
|
|
|
|
|
|
if (!(await SizeCheck(element))) {
|
|
|
|
|
|
|
|
createLogException(
|
|
|
|
|
|
|
|
message.guild.id,
|
|
|
|
|
|
|
|
message.channel.id,
|
|
|
|
|
|
|
|
message.id
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
await message.delete();
|
|
|
|
|
|
|
|
const data = {
|
|
|
|
|
|
|
|
meta: {
|
|
|
|
|
|
|
|
type: "messageDelete",
|
|
|
|
|
|
|
|
displayName: "Message Deleted",
|
|
|
|
|
|
|
|
calculateType: "autoModeratorDeleted",
|
|
|
|
|
|
|
|
color: NucleusColors.red,
|
|
|
|
|
|
|
|
emoji: "MESSAGE.DELETE",
|
|
|
|
|
|
|
|
timestamp: new Date().getTime()
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
separate: {
|
|
|
|
|
|
|
|
start:
|
|
|
|
|
|
|
|
filter +
|
|
|
|
|
|
|
|
" Image was too small\n\n" +
|
|
|
|
|
|
|
|
(content
|
|
|
|
|
|
|
|
? `**Message:**\n\`\`\`${content}\`\`\``
|
|
|
|
|
|
|
|
: "**Message:** *Message had no content*")
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
list: list,
|
|
|
|
|
|
|
|
hidden: {
|
|
|
|
|
|
|
|
guild: message.channel.guild.id
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
return log(data);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (config.filters.malware) {
|
|
|
|
|
|
|
|
if (!(await MalwareCheck(url))) {
|
|
|
|
|
|
|
|
createLogException(
|
|
|
|
|
|
|
|
message.guild.id,
|
|
|
|
|
|
|
|
message.channel.id,
|
|
|
|
|
|
|
|
message.id
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
await message.delete();
|
|
|
|
|
|
|
|
const data = {
|
|
|
|
|
|
|
|
meta: {
|
|
|
|
|
|
|
|
type: "messageDelete",
|
|
|
|
|
|
|
|
displayName: "Message Deleted",
|
|
|
|
|
|
|
|
calculateType: "autoModeratorDeleted",
|
|
|
|
|
|
|
|
color: NucleusColors.red,
|
|
|
|
|
|
|
|
emoji: "MESSAGE.DELETE",
|
|
|
|
|
|
|
|
timestamp: new Date().getTime()
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
separate: {
|
|
|
|
|
|
|
|
start:
|
|
|
|
|
|
|
|
filter +
|
|
|
|
|
|
|
|
" File detected as malware\n\n" +
|
|
|
|
|
|
|
|
(content
|
|
|
|
|
|
|
|
? `**Message:**\n\`\`\`${content}\`\`\``
|
|
|
|
|
|
|
|
: "**Message:** *Message had no content*")
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
list: list,
|
|
|
|
|
|
|
|
hidden: {
|
|
|
|
|
|
|
|
guild: message.channel.guild.id
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
return log(data);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!message) return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const linkDetectionTypes = await LinkCheck(message);
|
|
|
|
const linkDetectionTypes = await LinkCheck(message);
|
|
|
|
if (linkDetectionTypes.length > 0) {
|
|
|
|
if (linkDetectionTypes.length > 0) {
|
|
|
|
@ -363,7 +355,6 @@ export async function callback(_client: HaikuClient, message: Message) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (config.filters.pings.roles) {
|
|
|
|
if (config.filters.pings.roles) {
|
|
|
|
for (const roleId in message.mentions.roles) {
|
|
|
|
for (const roleId in message.mentions.roles) {
|
|
|
|
if (!message) return;
|
|
|
|
|
|
|
|
if (!config.filters.pings.allowed.roles.includes(roleId)) {
|
|
|
|
if (!config.filters.pings.allowed.roles.includes(roleId)) {
|
|
|
|
createLogException(
|
|
|
|
createLogException(
|
|
|
|
message.guild.id,
|
|
|
|
message.guild.id,
|
|
|
|
|