mirror of
https://github.com/Hessenuk/DiscordTickets.git
synced 2025-09-03 00:41:27 +03:00
Fixes and improvements for database and other things
Also continued to add to ticket creation stuff - now includes opening questions
This commit is contained in:
@@ -61,6 +61,27 @@ module.exports = class CommandManager {
|
||||
* @param {Message} message - Command message
|
||||
*/
|
||||
async handle(message) {
|
||||
let is_blacklisted = false;
|
||||
if (settings.blacklist.includes(message.author.id)) {
|
||||
is_blacklisted = true;
|
||||
this.client.log.info(`Ignoring blacklisted member ${message.author.tag}`);
|
||||
} else {
|
||||
settings.blacklist.forEach(element => {
|
||||
if (message.guild.roles.cache.has(element) && message.member.roles.cache.has(element)) {
|
||||
is_blacklisted = true;
|
||||
this.client.log.info(`Ignoring member ${message.author.tag} with blacklisted role`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (is_blacklisted) {
|
||||
try {
|
||||
return message.react('❌');
|
||||
} catch (error) {
|
||||
return this.client.log.warn('Failed to react to a message');
|
||||
}
|
||||
}
|
||||
|
||||
let settings = await message.guild.settings;
|
||||
|
||||
const i18n = this.client.i18n.get(settings.locale);
|
||||
|
@@ -17,150 +17,184 @@ module.exports = class TicketArchives {
|
||||
}
|
||||
|
||||
async addMessage(message) {
|
||||
let t_row = await this.client.db.models.Ticket.findOne({
|
||||
where: {
|
||||
id: message.channel.id
|
||||
}
|
||||
});
|
||||
try {
|
||||
await this.client.db.transaction(async t => {
|
||||
let t_row = await this.client.db.models.Ticket.findOne({
|
||||
where: {
|
||||
id: message.channel.id
|
||||
},
|
||||
transaction: t
|
||||
});
|
||||
|
||||
if (t_row) {
|
||||
await this.client.db.models.Message.create({
|
||||
id: message.id,
|
||||
ticket: t_row.id,
|
||||
author: message.author.id,
|
||||
data: this.encrypt(JSON.stringify({
|
||||
content: message.content,
|
||||
// time: message.createdTimestamp,
|
||||
embeds: message.embeds.map(embed => {
|
||||
return { embed };
|
||||
}),
|
||||
attachments: [...message.attachments.values()]
|
||||
}))
|
||||
if (t_row) {
|
||||
await this.client.db.models.Message.create({
|
||||
id: message.id,
|
||||
ticket: t_row.id,
|
||||
author: message.author.id,
|
||||
data: this.encrypt(JSON.stringify({
|
||||
content: message.content,
|
||||
embeds: message.embeds.map(embed => {
|
||||
return { embed };
|
||||
}),
|
||||
attachments: [...message.attachments.values()]
|
||||
})),
|
||||
createdAt: new Date(message.createdTimestamp)
|
||||
}, { transaction: t });
|
||||
|
||||
this.updateEntities(message);
|
||||
}
|
||||
});
|
||||
|
||||
this.updateEntities(message);
|
||||
} catch (e) {
|
||||
this.client.log.warn('Failed to add a message to the ticket archive');
|
||||
this.client.log.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
async updateMessage(message) {
|
||||
let m_row = await this.client.db.models.Message.findOne({
|
||||
where: {
|
||||
id: message.id
|
||||
}
|
||||
});
|
||||
try {
|
||||
await this.client.db.transaction(async t => {
|
||||
let m_row = await this.client.db.models.Message.findOne({
|
||||
where: {
|
||||
id: message.id
|
||||
},
|
||||
transaction: t
|
||||
});
|
||||
|
||||
if (m_row) {
|
||||
m_row.data = this.encrypt(JSON.stringify({
|
||||
content: message.content,
|
||||
embeds: message.embeds.map(embed => {
|
||||
return { embed };
|
||||
}),
|
||||
attachments: [...message.attachments.values()]
|
||||
}));
|
||||
if (m_row) {
|
||||
m_row.data = this.encrypt(JSON.stringify({
|
||||
content: message.content,
|
||||
embeds: message.embeds.map(embed => {
|
||||
return { embed };
|
||||
}),
|
||||
attachments: [...message.attachments.values()]
|
||||
}));
|
||||
|
||||
if (message.editedTimestamp) {
|
||||
m_row.edited = true;
|
||||
this.updateEntities(message);
|
||||
}
|
||||
if (message.editedTimestamp) {
|
||||
m_row.edited = true;
|
||||
this.updateEntities(message);
|
||||
}
|
||||
|
||||
await m_row.save(); // save changes
|
||||
await m_row.save({ transaction: t }); // save changes
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
this.client.log.warn('Failed to update message in the ticket archive');
|
||||
this.client.log.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
async deleteMessage(message) {
|
||||
let msg = await this.client.db.models.Message.findOne({
|
||||
where: {
|
||||
id: message.id
|
||||
}
|
||||
});
|
||||
try {
|
||||
await this.client.db.transaction(async t => {
|
||||
let msg = await this.client.db.models.Message.findOne({
|
||||
where: {
|
||||
id: message.id
|
||||
},
|
||||
transaction: t
|
||||
});
|
||||
|
||||
if (msg) {
|
||||
msg.deleted = true;
|
||||
await msg.save(); // save changes to message row
|
||||
if (msg) {
|
||||
msg.deleted = true;
|
||||
await msg.save({ transaction: t }); // save changes to message row
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
this.client.log.warn('Failed to delete message in ticket archive');
|
||||
this.client.log.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async updateEntities(message) {
|
||||
let m_row = await this.client.db.models.Message.findOne({
|
||||
where: {
|
||||
id: message.id
|
||||
}
|
||||
});
|
||||
try {
|
||||
await this.client.db.transaction(async t => {
|
||||
let m_row = await this.client.db.models.Message.findOne({
|
||||
where: {
|
||||
id: message.id
|
||||
},
|
||||
transaction: t
|
||||
});
|
||||
|
||||
if (!m_row) return;
|
||||
if (!m_row) return;
|
||||
|
||||
// message author
|
||||
let u_model_data = {
|
||||
user: message.author.id,
|
||||
ticket: message.channel.id
|
||||
};
|
||||
let [u_row] = await this.client.db.models.UserEntity.findOrCreate({
|
||||
where: u_model_data,
|
||||
defaults: u_model_data
|
||||
});
|
||||
await u_row.update({
|
||||
avatar: message.author.displayAvatarURL(),
|
||||
username: this.encrypt(message.author.username),
|
||||
discriminator: message.author.discriminator,
|
||||
display_name: this.encrypt(message.member.displayName),
|
||||
colour: message.member.displayColor === 0 ? null : int2hex(message.member.displayColor),
|
||||
bot: message.author.bot
|
||||
});
|
||||
// message author
|
||||
let u_model_data = {
|
||||
user: message.author.id,
|
||||
ticket: message.channel.id
|
||||
};
|
||||
let [u_row] = await this.client.db.models.UserEntity.findOrCreate({
|
||||
where: u_model_data,
|
||||
defaults: u_model_data,
|
||||
transaction: t
|
||||
});
|
||||
|
||||
// mentioned members
|
||||
message.mentions.members.forEach(async member => {
|
||||
let m_model_data = {
|
||||
user: member.user.id,
|
||||
ticket: message.channel.id
|
||||
};
|
||||
let [m_row] = await this.client.db.models.UserEntity.findOrCreate({
|
||||
where: m_model_data,
|
||||
defaults: m_model_data
|
||||
});
|
||||
await u_row.update({
|
||||
avatar: message.author.displayAvatarURL(),
|
||||
username: this.encrypt(message.author.username),
|
||||
discriminator: message.author.discriminator,
|
||||
display_name: this.encrypt(message.member.displayName),
|
||||
colour: message.member.displayColor === 0 ? null : int2hex(message.member.displayColor),
|
||||
bot: message.author.bot
|
||||
}, { transaction: t });
|
||||
|
||||
await m_row.update({
|
||||
avatar: member.user.displayAvatarURL(),
|
||||
username: this.encrypt(member.user.username),
|
||||
discriminator: member.user.discriminator,
|
||||
display_name: this.encrypt(member.displayName),
|
||||
colour: member.displayColor === 0 ? null : int2hex(member.displayColor),
|
||||
bot: member.user.bot
|
||||
});
|
||||
});
|
||||
// mentioned members
|
||||
message.mentions.members.forEach(async member => {
|
||||
let m_model_data = {
|
||||
user: member.user.id,
|
||||
ticket: message.channel.id
|
||||
};
|
||||
let [m_row] = await this.client.db.models.UserEntity.findOrCreate({
|
||||
where: m_model_data,
|
||||
defaults: m_model_data,
|
||||
transaction: t
|
||||
});
|
||||
|
||||
// mentioned channels
|
||||
message.mentions.channels.forEach(async channel => {
|
||||
let c_model_data = {
|
||||
channel: channel.id,
|
||||
ticket: message.channel.id
|
||||
};
|
||||
let [c_row] = await this.client.db.models.ChannelEntity.findOrCreate({
|
||||
where: c_model_data,
|
||||
defaults: c_model_data
|
||||
});
|
||||
await c_row.update({
|
||||
name: this.encrypt(channel.name)
|
||||
});
|
||||
});
|
||||
await m_row.update({
|
||||
avatar: member.user.displayAvatarURL(),
|
||||
username: this.encrypt(member.user.username),
|
||||
discriminator: member.user.discriminator,
|
||||
display_name: this.encrypt(member.displayName),
|
||||
colour: member.displayColor === 0 ? null : int2hex(member.displayColor),
|
||||
bot: member.user.bot
|
||||
}, { transaction: t });
|
||||
});
|
||||
|
||||
// mentioned roles
|
||||
message.mentions.roles.forEach(async role => {
|
||||
let r_model_data = {
|
||||
role: role.id,
|
||||
ticket: message.channel.id
|
||||
};
|
||||
let [r_row] = await this.client.db.models.RoleEntity.findOrCreate({
|
||||
where: r_model_data,
|
||||
defaults: r_model_data
|
||||
// mentioned channels
|
||||
message.mentions.channels.forEach(async channel => {
|
||||
let c_model_data = {
|
||||
channel: channel.id,
|
||||
ticket: message.channel.id
|
||||
};
|
||||
let [c_row] = await this.client.db.models.ChannelEntity.findOrCreate({
|
||||
where: c_model_data,
|
||||
defaults: c_model_data,
|
||||
transaction: t
|
||||
});
|
||||
await c_row.update({
|
||||
name: this.encrypt(channel.name)
|
||||
}, { transaction: t });
|
||||
});
|
||||
|
||||
// mentioned roles
|
||||
message.mentions.roles.forEach(async role => {
|
||||
let r_model_data = {
|
||||
role: role.id,
|
||||
ticket: message.channel.id
|
||||
};
|
||||
let [r_row] = await this.client.db.models.RoleEntity.findOrCreate({
|
||||
where: r_model_data,
|
||||
defaults: r_model_data,
|
||||
transaction: t
|
||||
});
|
||||
await r_row.update({
|
||||
name: this.encrypt(role.name),
|
||||
colour: role.color === 0 ? '7289DA' : int2hex(role.color) // 7289DA = 7506394
|
||||
}, { transaction: t });
|
||||
});
|
||||
});
|
||||
await r_row.update({
|
||||
name: this.encrypt(role.name),
|
||||
colour: role.color === 0 ? '7289DA' : int2hex(role.color) // 7289DA = 7506394
|
||||
});
|
||||
});
|
||||
|
||||
} catch (e) {
|
||||
this.client.log.warn('Failed to update message entities in ticket archive');
|
||||
this.client.log.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
};
|
@@ -2,6 +2,7 @@ const EventEmitter = require('events');
|
||||
const TicketArchives = require('./archives');
|
||||
const { MessageEmbed } = require('discord.js');
|
||||
const { int2hex } = require('../../utils');
|
||||
const { footer } = require('../../utils/discord');
|
||||
|
||||
/** Manages tickets */
|
||||
module.exports = class TicketManager extends EventEmitter {
|
||||
@@ -69,13 +70,17 @@ module.exports = class TicketManager extends EventEmitter {
|
||||
.catch(() => this.client.log.warn('Failed to delete system pin message'));
|
||||
}
|
||||
|
||||
let questions = cat_row.opening_questions
|
||||
.map((q, index) => `**${index + 1}.** ${q}`)
|
||||
.join('\n\n');
|
||||
|
||||
if (cat_row.require_topic && topic.length === 0) {
|
||||
let collector_message = await t_channel.send(
|
||||
new MessageEmbed()
|
||||
.setColor(settings.colour)
|
||||
.setTitle(i18n('commands.new.request_topic.title'))
|
||||
.setTitle('⚠️ ' + i18n('commands.new.request_topic.title'))
|
||||
.setDescription(i18n('commands.new.request_topic.description'))
|
||||
.setFooter(settings.footer)
|
||||
.setFooter(footer(settings.footer, i18n('collector_expires_in', 120)), guild.iconURL())
|
||||
);
|
||||
|
||||
const collector_filter = (message) => message.author.id === t_row.creator;
|
||||
@@ -99,17 +104,29 @@ module.exports = class TicketManager extends EventEmitter {
|
||||
.setFooter(settings.footer)
|
||||
);
|
||||
await message.react('✅');
|
||||
collector.stop();
|
||||
});
|
||||
|
||||
collector.on('end', async (collected) => {
|
||||
if (collected.size === 0) {
|
||||
collector_message
|
||||
.delete()
|
||||
.catch(() => this.client.log.warn('Failed to delete topic collector message'));
|
||||
}
|
||||
collector.on('end', async () => {
|
||||
collector_message
|
||||
.delete()
|
||||
.catch(() => this.client.log.warn('Failed to delete topic collector message'));
|
||||
await t_channel.send(
|
||||
new MessageEmbed()
|
||||
.setColor(settings.colour)
|
||||
.setDescription(i18n('commands.new.questions', questions))
|
||||
.setFooter(settings.footer)
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
} else {
|
||||
if (cat_row.opening_questions.length > 0) {
|
||||
await t_channel.send(
|
||||
new MessageEmbed()
|
||||
.setColor(settings.colour)
|
||||
.setDescription(i18n('commands.new.questions', questions))
|
||||
.setFooter(settings.footer)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user