mirror of https://github.com/clickscodes/nucleus
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
303 lines
14 KiB
303 lines
14 KiB
import { LinkCheck, MalwareCheck, NSFWCheck, SizeCheck, TestString, TestImage } from '../reflex/scanners.js'
|
|
import logAttachment from '../premium/attachmentLogs.js'
|
|
import createLogException from '../utils/createLogException.js'
|
|
import getEmojiByName from '../utils/getEmojiByName.js'
|
|
|
|
export const event = 'messageCreate'
|
|
|
|
export async function callback(client, message) {
|
|
if(!message) return;
|
|
if (message.author.bot) return
|
|
if (message.channel.type === 'dm') return
|
|
|
|
const { log, NucleusColors, entry, renderUser, renderDelta, renderChannel } = client.logger
|
|
|
|
let fileNames = await logAttachment(message);
|
|
|
|
let content = message.content.toLowerCase() || ''
|
|
let config = await client.memory.readGuildInfo(message.guild.id);
|
|
const filter = getEmojiByName("ICONS.FILTER")
|
|
let attachmentJump = ""
|
|
if (config.logging.attachments.saved[message.channel.id + message.id]) { attachmentJump = ` [[View attachments]](${config.logging.attachments.saved[message.channel.id + message.id]})` }
|
|
let list = {
|
|
messageId: entry(message.id, `\`${message.id}\``),
|
|
sentBy: entry(message.author.id, renderUser(message.author)),
|
|
sentIn: entry(message.channel.id, renderChannel(message.channel)),
|
|
deleted: entry(new Date().getTime(), renderDelta(new Date().getTime())),
|
|
mentions: message.mentions.users.size,
|
|
attachments: entry(message.attachments.size, message.attachments.size + attachmentJump),
|
|
repliedTo: entry(
|
|
message.reference ? message.reference.messageId : null,
|
|
message.reference ? `[[Jump to message]](https://discord.com/channels/${message.guild.id}/${message.channel.id}/${message.reference.messageId})` : "None"
|
|
)
|
|
}
|
|
|
|
if (config.filters.invite.enabled) {
|
|
if (!config.filters.invite.allowed.users.includes(message.author.id) ||
|
|
!config.filters.invite.allowed.channels.includes(message.channel.id) ||
|
|
!message.author.roles.cache.some(role => config.filters.invite.allowed.roles.includes(role.id))
|
|
) {
|
|
if ((/(?:https?:\/\/)?discord(?:app)?\.(?:com\/invite|gg)\/[a-zA-Z0-9]+\/?/.test(content))) {
|
|
createLogException(message.guild.id, message.channel.id, message.id)
|
|
message.delete();
|
|
let data = {
|
|
meta: {
|
|
type: 'messageDelete',
|
|
displayName: 'Message Deleted (Automated, Contained Invite)',
|
|
calculateType: 'autoModeratorDeleted',
|
|
color: NucleusColors.red,
|
|
emoji: 'MESSAGE.DELETE',
|
|
timestamp: new Date().getTime()
|
|
},
|
|
separate: {
|
|
start: filter + " Contained invite\n\n" + (content ? `**Message:**\n\`\`\`${content}\`\`\`` : '**Message:** *Message had no content*'),
|
|
},
|
|
list: list,
|
|
hidden: {
|
|
guild: message.channel.guild.id
|
|
}
|
|
}
|
|
return log(data);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (fileNames.files.length > 0) {
|
|
for (let element of fileNames.files) {
|
|
if(!message) return;
|
|
let 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 (config.filters.images.NSFW && !message.channel.nsfw) {
|
|
if (await NSFWCheck(url)) {
|
|
createLogException(message.guild.id, message.channel.id, message.id)
|
|
await message.delete()
|
|
let 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) {
|
|
let text = await TestImage(url)
|
|
if (config.filters.wordFilter.enabled) {
|
|
let check = TestString(text, config.filters.wordFilter.words.loose, config.filters.wordFilter.words.strict)
|
|
if(check !== null) {
|
|
createLogException(message.guild.id, message.channel.id, message.id)
|
|
await message.delete()
|
|
let data = {
|
|
meta: {
|
|
type: 'messageDelete',
|
|
displayName: 'Message Deleted',
|
|
calculateType: 'autoModeratorDeleted',
|
|
color: NucleusColors.red,
|
|
emoji: 'MESSAGE.DELETE',
|
|
timestamp: new Date().getTime()
|
|
},
|
|
separate: {
|
|
start: filter + " Image contained filtered word\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.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()
|
|
let 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 (!MalwareCheck(url)) {
|
|
createLogException(message.guild.id, message.channel.id, message.id)
|
|
await message.delete()
|
|
let 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;
|
|
|
|
let linkDetectionTypes = await LinkCheck(message)
|
|
if (linkDetectionTypes.length > 0) {
|
|
createLogException(message.guild.id, message.channel.id, message.id)
|
|
await message.delete()
|
|
let data = {
|
|
meta: {
|
|
type: 'messageDelete',
|
|
displayName: `Message Deleted`,
|
|
calculateType: 'autoModeratorDeleted',
|
|
color: NucleusColors.red,
|
|
emoji: 'MESSAGE.DELETE',
|
|
timestamp: new Date().getTime()
|
|
},
|
|
separate: {
|
|
start: filter + ` Link filtered as ${linkDetectionTypes[0].toLowerCase()}\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) {
|
|
let check = TestString(content, config.filters.wordFilter.words.loose, config.filters.wordFilter.words.strict)
|
|
if(check !== null) {
|
|
createLogException(message.guild.id, message.channel.id, message.id)
|
|
await message.delete()
|
|
let data = {
|
|
meta: {
|
|
type: 'messageDelete',
|
|
displayName: 'Message Deleted',
|
|
calculateType: 'autoModeratorDeleted',
|
|
color: NucleusColors.red,
|
|
emoji: 'MESSAGE.DELETE',
|
|
timestamp: new Date().getTime()
|
|
},
|
|
separate: {
|
|
start: filter + ` Message contained filtered word\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.pings.allowed.users.includes(message.author.id) ||
|
|
!config.filters.pings.allowed.channels.includes(message.channel.id) ||
|
|
!message.author.roles.cache.some(role => config.filters.pings.allowed.roles.includes(role.id))
|
|
) {
|
|
if (config.filters.pings.everyone && message.mentions.everyone) {
|
|
let data = {
|
|
meta: {
|
|
type: 'everyonePing',
|
|
displayName: 'Everyone Pinged',
|
|
calculateType: 'messageMassPing',
|
|
color: NucleusColors.yellow,
|
|
emoji: 'MESSAGE.PING.EVERYONE',
|
|
timestamp: new Date().getTime()
|
|
},
|
|
separate: {
|
|
start: content ? `**Message:**\n\`\`\`${content}\`\`\`` : '**Message:** *Message had no content*',
|
|
},
|
|
list: list,
|
|
hidden: {
|
|
guild: message.channel.guild.id
|
|
}
|
|
}
|
|
return log(data);
|
|
}
|
|
if (config.filters.pings.roles) {
|
|
for(let role of message.mentions.roles) {
|
|
if(!message) return;
|
|
if (!config.filters.pings.allowed.roles.includes(role.id)) {
|
|
createLogException(message.guild.id, message.channel.id, message.id)
|
|
await message.delete()
|
|
let data = {
|
|
meta: {
|
|
type: 'rolePing',
|
|
displayName: 'Role Pinged',
|
|
calculateType: 'messageMassPing',
|
|
color: NucleusColors.yellow,
|
|
emoji: 'MESSAGE.PING.ROLE',
|
|
timestamp: new Date().getTime()
|
|
},
|
|
separate: {
|
|
start: content ? `**Message:**\n\`\`\`${content}\`\`\`` : '**Message:** *Message had no content*',
|
|
},
|
|
list: list,
|
|
hidden: {
|
|
guild: message.channel.guild.id
|
|
}
|
|
}
|
|
return log(data);
|
|
}
|
|
}
|
|
}
|
|
if (message.mentions.users.size >= config.filters.pings.mass && config.filters.pings.mass) {
|
|
createLogException(message.guild.id, message.channel.id, message.id)
|
|
await message.delete()
|
|
let data = {
|
|
meta: {
|
|
type: 'massPing',
|
|
displayName: `Mass Ping`,
|
|
calculateType: 'messageMassPing',
|
|
color: NucleusColors.yellow,
|
|
emoji: 'MESSAGE.PING.MASS',
|
|
timestamp: new Date().getTime()
|
|
},
|
|
separate: {
|
|
start: content ? `**Message:**\n\`\`\`${content}\`\`\`` : '**Message:** *Message had no content*',
|
|
},
|
|
list: list,
|
|
hidden: {
|
|
guild: message.channel.guild.id
|
|
}
|
|
}
|
|
return log(data);
|
|
}
|
|
}
|
|
}
|