Haha-Yes/event/listeners/message.js

292 lines
9.7 KiB
JavaScript
Raw Normal View History

2018-12-30 01:20:24 +01:00
const { Listener } = require('discord-akairo');
2019-02-08 19:06:29 +01:00
const rand = require('../../rand.js');
2019-08-21 19:58:51 +02:00
const Sequelize = require('sequelize');
2020-03-29 18:49:20 +02:00
const safe = require('safe-regex');
// Database
2019-07-08 22:10:14 +02:00
const Tag = require('../../models').Tag;
const autoResponse = require('../../models').autoresponse;
const autoResponseStat = require('../../models').autoresponseStat;
2019-08-21 19:58:51 +02:00
const BannedWords = require('../../models').bannedWords;
2020-02-24 14:31:52 +01:00
const WhitelistWord = require('../../models').whitelistWord;
2020-03-05 21:50:16 +01:00
const quotationStat = require('../../models').quotationStat;
2020-03-29 18:49:20 +02:00
const userBlacklist = require('../../models').userBlacklist;
2018-12-30 01:20:24 +01:00
2019-01-02 21:46:12 +01:00
class messageListener extends Listener {
2019-01-02 08:09:45 +01:00
constructor() {
super('message', {
emitter: 'client',
2019-01-02 21:46:12 +01:00
event: 'message'
2019-01-02 08:09:45 +01:00
});
}
2018-12-30 01:20:24 +01:00
2019-12-27 22:28:52 +01:00
async exec(message) {
2020-03-29 18:49:20 +02:00
const blacklist = await userBlacklist.findOne({where: {userID:message.author.id}});
if (blacklist) return;
2019-12-27 22:28:52 +01:00
if (message.partial) {
await message.fetch()
.catch(() => {
return;
});
}
2019-07-08 22:10:14 +02:00
if (message.author.bot) return;
2020-03-05 21:50:16 +01:00
/* Banned words section
*
* This section contains code about the banned words features
*
*/
2019-08-30 00:20:47 +02:00
// Banned words
const bannedWords = await BannedWords.findAll({where: {word: Sequelize.where(Sequelize.fn('LOCATE', Sequelize.col('word'), message.content.replace(/\u200B/g, '').replace(/[\u0250-\ue007]/g, '')), Sequelize.Op.ne, 0), serverID: message.guild.id}});
2020-02-24 14:31:52 +01:00
const whitelistWord = await WhitelistWord.findAll({where: {word: Sequelize.where(Sequelize.fn('LOCATE', Sequelize.col('word'), message.content.replace(/\u200B/g, '').replace(/[\u0250-\ue007]/g, '')), Sequelize.Op.ne, 0), serverID: message.guild.id}});
if (whitelistWord[0]) {
return; // If word is whitelisted just return
}
2019-08-30 00:23:00 +02:00
if (bannedWords[0]) {
2019-08-30 00:20:47 +02:00
// Remove accent
let censoredMessage = message.content.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
// Remove zero width space character
censoredMessage = censoredMessage.replace(/\u200B/g, '');
// Remove non latin character
censoredMessage = censoredMessage.replace(/[\u0250-\ue007]/g, '');
for (let i = 0; i < bannedWords.length; i++) {
2020-03-29 18:49:20 +02:00
if (!safe(bannedWords[i].get('word'))) return;
2019-08-30 00:20:47 +02:00
let regex = new RegExp(bannedWords[i].get('word'), 'g');
censoredMessage = censoredMessage.replace(regex, '█'.repeat(bannedWords[i].get('word').length));
2019-07-14 11:19:05 +02:00
}
2019-11-22 12:30:20 +01:00
let Embed = this.client.util.embed()
2019-11-02 00:54:40 +01:00
.setColor(message.member.displayHexColor)
2019-08-30 00:20:47 +02:00
.setAuthor(message.author.username, message.author.displayAvatarURL())
.setDescription(censoredMessage);
message.channel.send(Embed);
return message.delete({reason: `Deleted message: ${message.content}`});
2020-02-24 14:31:52 +01:00
2019-08-30 00:20:47 +02:00
} else {
2020-03-05 21:50:16 +01:00
/* Autoresponse feature & tag
*
* This section contains autoresponse and tag feature
*
*/
2019-08-30 00:20:47 +02:00
// auto responses
2020-03-05 21:50:16 +01:00
const autoresponseStat = await autoResponseStat.findOne({where: {serverID: message.guild.id, stat: 'enable'}});
2019-08-30 00:20:47 +02:00
if (autoresponseStat) {
// Infinit 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');
}
2019-07-14 11:19:05 +02:00
2019-07-08 22:10:14 +02:00
// Reply with images as attachement
2020-03-05 21:50:16 +01:00
const autoresponse = await autoResponse.findOne({where: {trigger: message.content.toLowerCase()}});
if (autoresponse) {
autoResponse.findOne({where: {trigger: message.content.toLowerCase()}});
let trigger = autoresponse.get('trigger');
let type = autoresponse.get('type');
let content = autoresponse.get('response');
2019-07-08 22:10:14 +02:00
2020-03-05 21:50:16 +01:00
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]});
}
2019-08-30 00:20:47 +02:00
}
}
2020-03-05 21:50:16 +01:00
2019-08-30 00:20:47 +02:00
// User autoresponse
const tag = await Tag.findOne({where: {trigger: message.content.toLowerCase(), serverID: message.guild.id}});
if (tag) {
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]')) {
2020-03-12 23:10:59 +01:00
message.delete();
2019-08-30 00:20:47 +02:00
}
2019-06-28 17:05:01 +02:00
2019-08-30 00:20:47 +02:00
text = rand.random(text, message);
2019-02-10 16:23:49 +01:00
2019-08-30 00:20:47 +02:00
let attach = '';
2019-02-10 16:23:49 +01:00
2019-08-30 00:20:47 +02:00
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;
}
2019-07-01 21:15:45 +02:00
}
2019-08-30 00:20:47 +02:00
text = text.replace(/(\[attach:.*?])/, '');
2019-07-08 22:10:14 +02:00
}
2019-02-10 16:23:49 +01:00
2019-08-30 00:20:47 +02:00
// THIS SECTION IS VERY VERY BAD MUST CHANGE
if (text.includes('[embed]')) {
text = text.replace(/\[embed\]/, ' ');
2019-06-28 17:05:01 +02:00
2019-08-30 00:20:47 +02:00
let title = '';
let desc = '';
let image;
let thumbnail;
let footer = '';
let color;
2019-06-28 17:05:01 +02:00
2019-08-30 00:20:47 +02:00
if (text.includes('[embedImage:')) {
image = text.split(/(\[embedImage:.*?])/);
2019-06-28 17:05:01 +02:00
2019-08-30 00:20:47 +02:00
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;
}
2019-07-01 21:15:45 +02:00
}
2019-07-08 22:10:14 +02:00
}
2019-06-28 17:05:01 +02:00
2019-08-30 00:20:47 +02:00
if (text.includes('[embedThumbnail:')) {
thumbnail = text.split(/(\[embedThumbnail:.*?])/);
2019-06-28 17:05:01 +02:00
2019-08-30 00:20:47 +02:00
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;
}
2019-07-01 21:15:45 +02:00
}
2019-07-08 22:10:14 +02:00
}
2019-06-28 17:05:01 +02:00
2019-08-30 00:20:47 +02:00
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;
}
2019-07-01 21:15:45 +02:00
}
2019-07-08 22:10:14 +02:00
}
2019-06-28 17:05:01 +02:00
2019-08-30 00:20:47 +02:00
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;
}
2019-07-01 21:15:45 +02:00
}
2019-07-08 22:10:14 +02:00
}
2019-06-28 17:05:01 +02:00
2019-08-30 00:20:47 +02:00
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;
}
2019-07-01 21:15:45 +02:00
}
2019-07-08 22:10:14 +02:00
}
2019-06-28 17:05:01 +02:00
2019-08-30 00:20:47 +02:00
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;
}
2019-07-01 21:15:45 +02:00
}
2019-07-08 22:10:14 +02:00
}
2019-06-28 17:05:01 +02:00
2019-11-22 12:30:20 +01:00
const embed = this.client.util.embed()
2019-08-30 00:20:47 +02:00
.setColor(color)
.setTitle(title)
.setImage(image)
.setThumbnail(thumbnail)
.setDescription(desc)
.setFooter(footer)
.setTimestamp();
2019-06-28 17:05:01 +02:00
2019-08-30 00:20:47 +02:00
if (attach) {
return message.channel.send(embed, {files: [attach]});
} else {
return message.channel.send(embed);
}
}
2019-07-09 09:49:37 +02:00
if (attach) {
2019-08-30 00:20:47 +02:00
return message.channel.send(text, {files: [attach]});
2019-07-09 09:49:37 +02:00
} else {
2019-08-30 00:20:47 +02:00
return message.channel.send(text);
2019-07-09 09:49:37 +02:00
}
2019-07-09 04:54:56 +02:00
2019-02-10 16:23:49 +01:00
}
2020-03-05 21:50:16 +01:00
/* Quotation feature
*
* This section will contain the code for the quotation feature, it will detect link for it and send it as embed
*
*/
const quotationstat = await quotationStat.findOne({where: {serverID: message.guild.id, stat: 'enable'}});
if (quotationstat && message.content.includes('discordapp.com/channels/')) {
let url = message.content.split('/');
let guildID = url[4];
let channelID = url[5];
let messageID = url[6].split(' ')[0];
2020-03-05 21:50:16 +01:00
// Verify if the guild, channel and message exist
let guild = this.client.guilds.resolve(guildID);
if (!guild) return;
let channel = this.client.channels.resolve(channelID);
if (!channel) return;
let quote = await channel.messages.fetch(messageID)
.catch(() => {
return;
});
if (!quote) return;
let Embed = this.client.util.embed()
.setAuthor(quote.author.username, quote.author.displayAvatarURL())
.setColor(message.member ? message.member.displayHexColor : 'NAVY')
2020-03-05 21:50:16 +01:00
.addField('Jump to', `[message](https://discordapp.com/channels/${message.guild.id}/${channelID}/${messageID})`, true)
2020-03-05 22:43:11 +01:00
.addField('In channel', quote.channel.name, true)
2020-03-05 21:50:16 +01:00
.addField('Quoted by', message.author, true)
.setDescription(quote.content)
2020-03-05 22:26:53 +01:00
.setTimestamp(quote.createdTimestamp);
2020-03-05 21:50:16 +01:00
if (quote.member) Embed.setAuthor(`${quote.author.username}#${quote.author.discriminator}`, quote.author.displayAvatarURL());
if (quote.author.bot) Embed.setAuthor(`${quote.author.username}#${quote.author.discriminator} (bot)`, quote.author.displayAvatarURL());
2020-03-07 13:15:06 +01:00
2020-03-05 21:50:16 +01:00
if (guild.id != message.guild.id) Embed.addField('In guild', guild.name, true);
let Attachment = (quote.attachments).array();
if (Attachment[0]) Embed.setImage(Attachment[0].url);
2020-03-05 21:50:16 +01:00
return message.channel.send(Embed);
2020-03-05 21:50:16 +01:00
}
2019-08-30 00:13:43 +02:00
}
2019-01-02 08:09:45 +01:00
}
2018-12-30 01:20:24 +01:00
}
2019-01-02 21:46:12 +01:00
module.exports = messageListener;