2022-08-28 17:04:31 +02:00
/ * T O D O :
* Make this shit work .
* /
import { EmbedBuilder , PermissionFlagsBits } from 'discord.js' ;
import db from '../../models/index.js' ;
import { rand } from '../../utils/rand.js' ;
const ratelimit = { } ;
const { ownerId , prefix } = process . env ;
const prefixs = prefix . split ( ',' ) ;
export default {
name : 'messageCreate' ,
async execute ( message , client ) {
if ( message . partials ) {
await message . fetch ( ) ;
}
if ( message . author . bot ) return ;
/ * A u t o r e s p o n s e f e a t u r e & t a g
*
* This section contains autoresponse and tag feature
*
* /
// auto responses
if ( message . guild ) {
const autoresponseStat = await db . autoresponseStat . findOne ( { where : { serverID : message . guild . id , stat : 'enable' } } ) ;
if ( autoresponseStat ) {
// Infinite haha very yes
if ( message . content . toLowerCase ( ) . startsWith ( 'haha very' ) && message . content . toLowerCase ( ) . endsWith ( 'yes' ) ) {
let yes = message . content . toLowerCase ( ) . replace ( 'haha' , '' ) ;
yes = yes . replace ( 'yes' , '' ) ;
yes += 'very' ;
return message . channel . send ( ` haha ${ yes } yes ` ) ;
}
else if ( message . content . toLowerCase ( ) == 'haha yes' ) {
return message . channel . send ( 'haha very yes' ) ;
}
// Reply with images as attachement
const autoresponse = await db . autoresponse . findOne ( { where : { trigger : message . content . toLowerCase ( ) } } ) ;
if ( autoresponse ) {
db . autoresponse . findOne ( { where : { trigger : message . content . toLowerCase ( ) } } ) ;
const trigger = autoresponse . get ( 'trigger' ) ;
const type = autoresponse . get ( 'type' ) ;
const content = autoresponse . get ( 'response' ) ;
if ( trigger == message . content . toLowerCase ( ) && type == 'text' ) {
return message . channel . send ( content ) ;
}
else if ( trigger == message . content . toLowerCase ( ) && type == 'react' ) {
return message . react ( content ) ;
}
else if ( trigger == message . content . toLowerCase ( ) && type == 'image' ) {
return message . channel . send ( { files : [ content ] } ) ;
}
}
}
// User autoresponse
const tag = await db . Tag . findOne ( { where : { trigger : message . content . toLowerCase ( ) , serverID : message . guild . id } } ) ;
if ( tag ) {
db . Tag . findOne ( { where : { trigger : message . content . toLowerCase ( ) , serverID : message . guild . id } } ) ;
let text = tag . get ( 'response' ) ;
if ( text . includes ( '[ban]' ) ) {
message . member . ban ( 'Tag ban :^)' ) ;
}
else if ( text . includes ( '[kick]' ) ) {
message . member . kick ( 'Tag kick :^)' ) ;
}
else if ( text . includes ( '[delete]' ) ) {
message . delete ( ) ;
}
2022-09-04 02:26:02 +02:00
text = rand ( text , message ) ;
2022-08-28 17:04:31 +02:00
let attach = '' ;
if ( text . includes ( '[attach:' ) ) {
attach = text . split ( /(\[attach:.*?])/ ) ;
for ( let i = 0 , l = attach . length ; i < l ; i ++ ) {
if ( attach [ i ] . includes ( '[attach:' ) ) {
attach = attach [ i ] . replace ( '[attach:' , '' ) . slice ( 0 , - 1 ) ;
i = attach . length ;
}
}
text = text . replace ( /(\[attach:.*?])/ , '' ) ;
}
// THIS SECTION IS VERY VERY BAD MUST CHANGE
if ( text . includes ( '[embed]' ) ) {
text = text . replace ( /\[embed\]/ , ' ' ) ;
let title = '' ;
let desc = '' ;
let image ;
let thumbnail ;
let footer = '' ;
let color ;
if ( text . includes ( '[embedImage:' ) ) {
image = text . split ( /(\[embedImage:.*?])/ ) ;
for ( let i = 0 , l = image . length ; i < l ; i ++ ) {
if ( image [ i ] . includes ( '[embedImage:' ) ) {
image = image [ i ] . replace ( '[embedImage:' , '' ) . slice ( 0 , - 1 ) ;
text = text . replace ( /(\[embedimage:.*?])/g , '' ) ;
i = image . length ;
}
}
}
if ( text . includes ( '[embedThumbnail:' ) ) {
thumbnail = text . split ( /(\[embedThumbnail:.*?])/ ) ;
for ( let i = 0 , l = thumbnail . length ; i < l ; i ++ ) {
if ( thumbnail [ i ] . includes ( '[embedThumbnail:' ) ) {
thumbnail = thumbnail [ i ] . replace ( '[embedThumbnail:' , '' ) . slice ( 0 , - 1 ) ;
text = text . replace ( /(\[embedThumbnail:.*?])/g , '' ) ;
i = thumbnail . length ;
}
}
}
if ( text . includes ( '[embedColor:' ) ) {
color = text . split ( /(\[embedColor:.*?])/ ) ;
for ( let i = 0 , l = color . length ; i < l ; i ++ ) {
if ( color [ i ] . includes ( '[embedColor:' ) ) {
color = color [ i ] . replace ( '[embedColor:' , '' ) . slice ( 0 , - 1 ) ;
text = text . replace ( /(\[embedColor:.*?])/g , '' ) ;
i = color . length ;
}
}
}
if ( text . includes ( '[embedTitle:' ) ) {
title = text . split ( /(\[embedTitle:.*?])/ ) ;
for ( let i = 0 , l = title . length ; i < l ; i ++ ) {
if ( title [ i ] . includes ( '[embedTitle:' ) ) {
title = title [ i ] . replace ( '[embedTitle:' , '' ) . slice ( 0 , - 1 ) ;
text = text . replace ( /(\[embedTitle:.*?])/g , '' ) ;
i = title . length ;
}
}
}
if ( text . includes ( '[embedFooter:' ) ) {
footer = text . split ( /(\[embedFooter:.*?])/ ) ;
for ( let i = 0 , l = footer . length ; i < l ; i ++ ) {
if ( footer [ i ] . includes ( '[embedFooter:' ) ) {
footer = footer [ i ] . replace ( '[embedFooter:' , '' ) . slice ( 0 , - 1 ) ;
text = text . replace ( /(\[embedFooter:.*?])/g , '' ) ;
i = footer . length ;
}
}
}
if ( text . includes ( '[embedDesc:' ) ) {
desc = text . split ( /(\[embedDesc:.*?])/ ) ;
for ( let i = 0 , l = desc . length ; i < l ; i ++ ) {
if ( desc [ i ] . includes ( '[embedDesc:' ) ) {
desc = desc [ i ] . replace ( '[embedDesc:' , '' ) . slice ( 0 , - 1 ) ;
i = desc . length ;
}
}
}
const embed = new EmbedBuilder ( )
. setColor ( color )
. setTitle ( title )
. setImage ( image )
. setThumbnail ( thumbnail )
. setDescription ( desc )
. setFooter ( footer )
. setTimestamp ( ) ;
if ( attach ) {
return message . channel . send ( embed , { files : [ attach ] } ) ;
}
else {
return message . channel . send ( embed ) ;
}
}
if ( attach ) {
return message . channel . send ( text , { files : [ attach ] } ) ;
}
else {
return message . channel . send ( text ) ;
}
}
/ * Q u o t a t i o n f e a t u r e
*
* This section will contain the code for the quotation feature , it will detect link for it and send it as embed
*
* /
2022-08-29 20:56:26 +02:00
const isOptOut = await db . optout . findOne ( { where : { userID : message . author . id } } ) ;
if ( ! isOptOut ) {
const quotationstat = await db . quotationStat . findOne ( { where : { serverID : message . guild . id , stat : 'enable' } } ) ;
if ( quotationstat && ( message . content . includes ( 'discordapp.com/channels/' ) || message . content . includes ( 'discord.com/channels/' ) ) ) {
const url = message . content . split ( '/' ) ;
const guildID = url [ 4 ] ;
const channelID = url [ 5 ] ;
const messageID = url [ 6 ] . split ( ' ' ) [ 0 ] ;
// Verify if the guild, channel and message exist
const guild = client . guilds . resolve ( guildID ) ;
if ( ! guild ) return ;
const channel = client . channels . resolve ( channelID ) ;
if ( ! channel ) return ;
const quote = await channel . messages . fetch ( messageID )
. catch ( ( ) => {
return ;
} ) ;
if ( ! quote ) return ;
const Embed = new EmbedBuilder ( )
. setAuthor ( { name : quote . author . username , iconURL : quote . author . displayAvatarURL ( ) } )
. setColor ( message . member ? message . member . displayHexColor : 'NAVY' )
. addFields (
{ name : 'Jump to' , value : ` [message](https://discordapp.com/channels/ ${ message . guild . id } / ${ channelID } / ${ messageID } ) ` , inline : true } ,
{ name : 'In channel' , value : quote . channel . name . toString ( ) , inline : true } ,
{ name : 'Quoted by' , value : message . author . toString ( ) , inline : true } ,
)
. setDescription ( quote . content )
. setTimestamp ( quote . createdTimestamp ) ;
if ( quote . member ) Embed . setAuthor ( { name : ` ${ quote . author . username } # ${ quote . author . discriminator } ` , iconURL : quote . author . displayAvatarURL ( ) } ) ;
if ( quote . author . bot ) Embed . setAuthor ( { name : ` ${ quote . author . username } # ${ quote . author . discriminator } (BOT) ` , iconURL : quote . author . displayAvatarURL ( ) } ) ;
if ( guild . id != message . guild . id ) Embed . addFields ( { name : 'In guild' , value : guild . name , inline : true } ) ;
const Attachment = Array . from ( message . attachments . values ( ) ) ;
if ( Attachment [ 0 ] ) Embed . setImage ( Attachment [ 0 ] . url ) ;
return message . channel . send ( { embeds : [ Embed ] } ) ;
}
2022-08-28 17:04:31 +02:00
}
}
// Command handling from message
let hasPrefix = false ;
prefixs . forEach ( p => {
if ( message . content . toLowerCase ( ) . startsWith ( p ) ) {
hasPrefix = true ;
}
} ) ;
if ( ! hasPrefix ) return ;
const messageArray = message . content . match ( /"[^"]*"|\S+/g ) . map ( m => m . slice ( 0 , 1 ) === '"' ? m . slice ( 1 , - 1 ) : m ) ;
2022-08-29 20:37:38 +02:00
let commandName = messageArray [ 1 ] . toLowerCase ( ) ;
2022-09-01 01:43:59 +02:00
const messageArgs = messageArray . splice ( 2 , messageArray . length ) ;
2022-08-28 17:04:31 +02:00
2022-08-29 20:37:38 +02:00
// Search for alias
client . commands . find ( c => {
if ( c . alias ) {
if ( c . alias . includes ( commandName ) ) {
commandName = c . data . name ;
}
}
} ) ;
const command = client . commands . get ( commandName ) ;
if ( ! command ) return ;
2022-08-28 17:04:31 +02:00
const globalBlacklist = await db . Blacklists . findOne ( { where : { type : 'global' , uid : message . author . id } } ) ;
const commandBlacklist = await db . Blacklists . findOne ( { where : { type : commandName , uid : message . author . id } } ) ;
if ( globalBlacklist ) {
return message . reply ( { content : ` You are globally blacklisted for the following reason: \` ${ globalBlacklist . reason } \` ` , ephemeral : true } ) ;
}
else if ( commandBlacklist ) {
return message . reply ( { content : ` You are blacklisted for the following reason: \` ${ commandBlacklist . reason } \` ` , ephemeral : true } ) ;
}
const userTag = message . author . tag ;
const userID = message . author . id ;
console . log ( ` \x 1b[33m ${ userTag } ( ${ userID } ) \x 1b[0m launched command \x 1b[33m ${ commandName } \x 1b[0m ` ) ;
// Owner only check
if ( command . ownerOnly && message . author . id !== ownerId ) {
return message . reply ( { content : '❌ This command is reserved for the owner!' , ephemeral : true } ) ;
}
// Check if the bot has the needed permissions
if ( command . clientPermissions ) {
const clientMember = await message . guild . members . fetch ( client . user . id ) ;
if ( ! clientMember . permissions . has ( command . clientPermissions ) ) {
return message . reply ( { content : ` ❌ I am missing one of the following permission(s): \` ${ new PermissionFlagsBits ( command . clientPermissions ) . toArray ( ) } \` ` , ephemeral : true } ) ;
}
}
// Check if the user has the needed permissions
2022-08-30 22:58:23 +02:00
if ( command . default _member _permissions ) {
if ( ! message . member . permissions . has ( command . default _member _permissions ) ) {
2022-08-28 17:04:31 +02:00
return message . reply ( { content : ` ❌ You are missing one of the following permission(s): \` ${ new PermissionFlagsBits ( command . userPermissions ) . toArray ( ) } \` ` , ephemeral : true } ) ;
}
}
try {
const date = new Date ( ) ;
if ( ratelimit [ userID ] ) {
if ( ratelimit [ userID ] . cooldown ) {
if ( commandName === ratelimit [ userID ] . command && date > ratelimit [ userID ] . cooldown ) {
ratelimit [ userID ] . limit = 0 ;
ratelimit [ userID ] . cooldown = undefined ;
}
}
if ( commandName === ratelimit [ userID ] . command && command . ratelimit === ratelimit [ userID ] . limit ) {
return await message . reply ( { content : ` You are being rate limited. You can try again in ${ Math . floor ( ( ratelimit [ userID ] . cooldown - date ) / 1000 ) } seconds. ` , ephemeral : true } ) ;
}
}
if ( command . ratelimit ) {
ratelimit [ userID ] = { command : commandName , limit : ratelimit [ userID ] ? ratelimit [ userID ] . limit + 1 : 1 } ;
if ( command . ratelimit === ratelimit [ userID ] . limit ) {
date . setSeconds ( date . getSeconds ( ) + command . cooldown ) ;
ratelimit [ userID ] = { command : commandName , limit : ratelimit [ userID ] . limit , cooldown : date } ;
}
}
message . user = message . author ;
message . isMessage = true ;
let waitingmsg ;
const toDelete = [ ] ;
message . deferReply = async function ( ) {
waitingmsg = await message . reply ( 'The bot is thinking...' ) ;
} ;
message . followUp = async function ( payload ) {
if ( payload . ephemeral ) {
toDelete . push ( await message . channel . send ( payload ) ) ;
}
else {
await message . channel . send ( payload ) ;
}
} ;
message . editReply = async function ( payload ) {
if ( waitingmsg ) {
await waitingmsg . delete ( ) ;
}
await message . channel . send ( payload ) ;
} ;
message . deleteReply = async function ( ) {
if ( waitingmsg ) {
await waitingmsg . delete ( )
. catch ( ( ) => { return ; } ) ;
}
} ;
message . cleanUp = async function ( ) {
toDelete . forEach ( async msg => {
msg . delete ( ) ;
} ) ;
} ;
2022-09-01 01:43:59 +02:00
const args = { } ;
for ( let i = 0 ; i < command . data . options . length ; i ++ ) {
2022-09-02 22:31:53 +02:00
if ( ! messageArgs [ i ] ) continue ;
2022-09-01 01:43:59 +02:00
const arg = command . data . options [ i ] ;
const type = arg . constructor . name . toLowerCase ( ) ;
let payload = messageArgs [ i ] ;
if ( type . includes ( 'mentionable' ) ) {
payload = message . mentions . members . first ( ) ;
2022-08-28 17:04:31 +02:00
}
2022-09-01 01:43:59 +02:00
else if ( type . includes ( 'attachment' ) ) {
payload = message . attachments . first ( ) ;
2022-08-28 17:04:31 +02:00
}
2022-09-10 09:36:07 +02:00
if ( payload . startsWith ( '--' ) ) {
arg . name = payload . substring ( 2 ) ;
payload = true ;
2022-09-02 09:18:52 +02:00
}
2022-09-01 01:43:59 +02:00
args [ arg . name ] = payload ;
2022-08-28 17:04:31 +02:00
}
2022-09-01 01:43:59 +02:00
await command . execute ( message , args , client ) ;
2022-08-28 17:04:31 +02:00
}
catch ( error ) {
console . error ( error ) ;
await message . reply ( { content : 'There was an error while executing this command!' , ephemeral : true } ) ;
}
} ,
} ;