mirror of
https://github.com/Hessenuk/DiscordTickets.git
synced 2024-12-23 00:03:09 +02:00
Ticket message storage, added entity stuff
This commit is contained in:
parent
2e9217f30d
commit
1a4a3c1a33
@ -18,7 +18,7 @@ module.exports = class NewCommand extends Command {
|
|||||||
name: i18n('commands.new.args.topic.name'),
|
name: i18n('commands.new.args.topic.name'),
|
||||||
description: i18n('commands.new.args.topic.description'),
|
description: i18n('commands.new.args.topic.description'),
|
||||||
example: i18n('commands.new.args.topic.example'),
|
example: i18n('commands.new.args.topic.example'),
|
||||||
required: true,
|
required: false,
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
@ -66,7 +66,7 @@ const { selectPresence } = require('./utils/discord');
|
|||||||
const I18n = require('@eartharoid/i18n');
|
const I18n = require('@eartharoid/i18n');
|
||||||
const CommandManager = require('./modules/commands/manager');
|
const CommandManager = require('./modules/commands/manager');
|
||||||
const PluginManager = require('./modules/plugins/manager');
|
const PluginManager = require('./modules/plugins/manager');
|
||||||
const TicketManager = require('./modules/tickets');
|
const TicketManager = require('./modules/tickets/manager');
|
||||||
|
|
||||||
require('./modules/structures')(); // load extended structures before creating the client
|
require('./modules/structures')(); // load extended structures before creating the client
|
||||||
|
|
||||||
|
@ -4,32 +4,9 @@ module.exports = {
|
|||||||
|
|
||||||
let settings = await message.guild?.settings;
|
let settings = await message.guild?.settings;
|
||||||
|
|
||||||
// message collection for t_row archiving
|
|
||||||
if (settings?.log_messages) {
|
if (settings?.log_messages) {
|
||||||
if (message.system) return;
|
if (message.system) return;
|
||||||
|
client.tickets.archives.addMessage(message);
|
||||||
let t_row = await client.db.models.Ticket.findOne({
|
|
||||||
where: {
|
|
||||||
id: message.channel.id
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (t_row) {
|
|
||||||
let embeds = [];
|
|
||||||
for (let embed in message.embeds) embeds.push({ ...message.embeds[embed] });
|
|
||||||
|
|
||||||
await client.db.models.Message.create({
|
|
||||||
id: message.id,
|
|
||||||
ticket: t_row.id,
|
|
||||||
author: message.author.id,
|
|
||||||
data: {
|
|
||||||
content: message.content,
|
|
||||||
// time: message.createdTimestamp,
|
|
||||||
embeds,
|
|
||||||
attachments: [...message.attachments.values()]
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
client.commands.handle(message);
|
client.commands.handle(message);
|
||||||
|
@ -6,17 +6,7 @@ module.exports = {
|
|||||||
|
|
||||||
if (settings?.log_messages) {
|
if (settings?.log_messages) {
|
||||||
if (message.system) return;
|
if (message.system) return;
|
||||||
|
client.tickets.archives.deleteMessage(message);
|
||||||
let msg = await client.db.models.Message.findOne({
|
|
||||||
where: {
|
|
||||||
id: message.id
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (msg) {
|
|
||||||
msg.deleted = true;
|
|
||||||
await msg.save(); // save changes to message row
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
@ -14,30 +14,7 @@ module.exports = {
|
|||||||
|
|
||||||
if (settings?.log_messages) {
|
if (settings?.log_messages) {
|
||||||
if (newm.system) return;
|
if (newm.system) return;
|
||||||
|
client.tickets.archives.updateMessage(newm);
|
||||||
let m_row = await client.db.models.Message.findOne({
|
|
||||||
where: {
|
|
||||||
id: newm.id
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (m_row) {
|
|
||||||
let embeds = [];
|
|
||||||
for (let embed in newm.embeds) embeds.push({ ...newm.embeds[embed] });
|
|
||||||
|
|
||||||
m_row.data = {
|
|
||||||
content: newm.content,
|
|
||||||
// time: newm.editedTimestamp,
|
|
||||||
embeds: newm.embeds.map(embed => {
|
|
||||||
return { ...newm.embeds[embed] };
|
|
||||||
}),
|
|
||||||
attachments: [...newm.attachments.values()]
|
|
||||||
};
|
|
||||||
|
|
||||||
if (newm.editedTimestamp) m_row.edited = true;
|
|
||||||
|
|
||||||
await m_row.save(); // save changes
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
@ -8,7 +8,7 @@
|
|||||||
"example": "**Example:**"
|
"example": "**Example:**"
|
||||||
},
|
},
|
||||||
"description": "**Usage:**\n`%s`\n\n**Example:**\n`%s`\n\nRequired arguments are prefixed with `❗`.",
|
"description": "**Usage:**\n`%s`\n\n**Example:**\n`%s`\n\nRequired arguments are prefixed with `❗`.",
|
||||||
"named_args_description": "This command uses named arguments.\n\n",
|
"named_args": "This command uses named arguments.\n\n",
|
||||||
"title": "`%s` command usage"
|
"title": "`%s` command usage"
|
||||||
},
|
},
|
||||||
"commands": {
|
"commands": {
|
||||||
|
@ -99,7 +99,7 @@ module.exports = class CommandManager {
|
|||||||
let embed = new MessageEmbed()
|
let embed = new MessageEmbed()
|
||||||
.setColor(settings.error_colour)
|
.setColor(settings.error_colour)
|
||||||
.setTitle(i18n('cmd_usage.title', cmd_name))
|
.setTitle(i18n('cmd_usage.title', cmd_name))
|
||||||
.setDescription(i18n('cmd_usage.named_args_description') + i18n('cmd_usage.description', usage, example));
|
.setDescription(i18n('cmd_usage.named_args') + i18n('cmd_usage.description', usage, example));
|
||||||
cmd.args.forEach(a => addArgs(embed, a));
|
cmd.args.forEach(a => addArgs(embed, a));
|
||||||
return message.channel.send(embed);
|
return message.channel.send(embed);
|
||||||
}
|
}
|
||||||
|
165
src/modules/tickets/archives.js
Normal file
165
src/modules/tickets/archives.js
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
/** Manages ticket archiving */
|
||||||
|
module.exports = class TicketArchives {
|
||||||
|
/**
|
||||||
|
* Create a TicketArchives instance
|
||||||
|
* @param {Client} client
|
||||||
|
*/
|
||||||
|
constructor(client) {
|
||||||
|
|
||||||
|
/** The Discord Client */
|
||||||
|
this.client = client;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async addMessage(message) {
|
||||||
|
let t_row = await this.client.db.models.Ticket.findOne({
|
||||||
|
where: {
|
||||||
|
id: message.channel.id
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (t_row) {
|
||||||
|
let embeds = [];
|
||||||
|
for (let embed in message.embeds) embeds.push({ ...message.embeds[embed] });
|
||||||
|
|
||||||
|
await this.client.db.models.Message.create({
|
||||||
|
id: message.id,
|
||||||
|
ticket: t_row.id,
|
||||||
|
author: message.author.id,
|
||||||
|
data: {
|
||||||
|
content: message.content,
|
||||||
|
// time: message.createdTimestamp,
|
||||||
|
embeds,
|
||||||
|
attachments: [...message.attachments.values()]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.updateEntities(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async updateMessage(message) {
|
||||||
|
let m_row = await this.client.db.models.Message.findOne({
|
||||||
|
where: {
|
||||||
|
id: message.id
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (m_row) {
|
||||||
|
let embeds = [];
|
||||||
|
for (let embed in message.embeds) embeds.push({ ...message.embeds[embed] });
|
||||||
|
|
||||||
|
m_row.data = {
|
||||||
|
content: message.content,
|
||||||
|
// time: message.editedTimestamp,
|
||||||
|
embeds: message.embeds.map(embed => {
|
||||||
|
return { ...message.embeds[embed] };
|
||||||
|
}),
|
||||||
|
attachments: [...message.attachments.values()]
|
||||||
|
};
|
||||||
|
|
||||||
|
if (message.editedTimestamp) {
|
||||||
|
m_row.edited = true;
|
||||||
|
this.updateEntities(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
await m_row.save(); // save changes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async deleteMessage(message) {
|
||||||
|
let msg = await this.client.db.models.Message.findOne({
|
||||||
|
where: {
|
||||||
|
id: message.id
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (msg) {
|
||||||
|
msg.deleted = true;
|
||||||
|
await msg.save(); // save changes to message row
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async updateEntities(message) {
|
||||||
|
let m_row = await this.client.db.models.Message.findOne({
|
||||||
|
where: {
|
||||||
|
id: message.id
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (m_row) {
|
||||||
|
// 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: message.author.username,
|
||||||
|
discriminator: message.author.discriminator,
|
||||||
|
display_name: message.member.displayName,
|
||||||
|
colour: message.member.displayColor === 0 ? null : message.member.displayColor,
|
||||||
|
bot: message.author.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
|
||||||
|
});
|
||||||
|
await m_row.update({
|
||||||
|
avatar: member.user.displayAvatarURL(),
|
||||||
|
username: member.user.username,
|
||||||
|
discriminator: member.user.discriminator,
|
||||||
|
display_name: member.displayName,
|
||||||
|
colour: member.displayColor === 0 ? null : member.displayColor,
|
||||||
|
bot: member.user.bot
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 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: channel.name
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 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
|
||||||
|
});
|
||||||
|
await r_row.update({
|
||||||
|
name: role.name,
|
||||||
|
colour: role.color === 0 ? 7506394 : role.color
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
@ -1,12 +1,11 @@
|
|||||||
const EventEmitter = require('events');
|
const EventEmitter = require('events');
|
||||||
// eslint-disable-next-line no-unused-vars
|
const TicketArchives = require('./archives');
|
||||||
const { Client } = require('discord.js');
|
|
||||||
|
|
||||||
/** Manages tickets */
|
/** Manages tickets */
|
||||||
module.exports = class TicketManager extends EventEmitter {
|
module.exports = class TicketManager extends EventEmitter {
|
||||||
/**
|
/**
|
||||||
* Create a TicketManager instance
|
* Create a TicketManager instance
|
||||||
* @param {Client} client
|
* @param {Client} client
|
||||||
*/
|
*/
|
||||||
constructor(client) {
|
constructor(client) {
|
||||||
super();
|
super();
|
||||||
@ -15,6 +14,8 @@ module.exports = class TicketManager extends EventEmitter {
|
|||||||
this.client = client;
|
this.client = client;
|
||||||
|
|
||||||
this.setMaxListeners(this.client.config.max_listeners);
|
this.setMaxListeners(this.client.config.max_listeners);
|
||||||
|
|
||||||
|
this.archives = new TicketArchives(this.client);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -55,6 +56,13 @@ module.exports = class TicketManager extends EventEmitter {
|
|||||||
reason: `${member.tag} requested a new ticket channel`
|
reason: `${member.tag} requested a new ticket channel`
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await t_channel.updateOverwrite(creator_id, {
|
||||||
|
VIEW_CHANNEL: true,
|
||||||
|
READ_MESSAGE_HISTORY: true,
|
||||||
|
SEND_MESSAGES: true,
|
||||||
|
ATTACH_FILES: true
|
||||||
|
}, `Ticket channel created by ${member.user.tag}`);
|
||||||
|
|
||||||
let t_row = await this.client.db.models.Ticket.create({
|
let t_row = await this.client.db.models.Ticket.create({
|
||||||
id: t_channel.id,
|
id: t_channel.id,
|
||||||
number,
|
number,
|
||||||
@ -69,60 +77,54 @@ module.exports = class TicketManager extends EventEmitter {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a ticket
|
* Get a ticket
|
||||||
* @param {(string|number)} ticket - The channel ID, or the ticket number
|
* @param {(string|number)} ticket_id - The channel ID, or the ticket number
|
||||||
* @param {string} guild_id - The ID of the ticket's guild (used if a ticket number is provided instead of ID)
|
* @param {string} guild_id - The ID of the ticket's guild (used if a ticket number is provided instead of ID)
|
||||||
*/
|
*/
|
||||||
async get(ticket, guild_id) {
|
async get(ticket_id, guild_id) {
|
||||||
let row = await this.resolveTicket(ticket, guild_id);
|
return await this.resolve(ticket_id, guild_id);
|
||||||
if (!row) throw new Error(`Could not find a ticket with ID ${ticket}`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close a ticket
|
* Close a ticket
|
||||||
* @param {(string|number)} ticket - The channel ID, or the ticket number
|
* @param {(string|number)} ticket_id - The channel ID, or the ticket number
|
||||||
* @param {(string|null)} closer_id - ID of the member who is closing the ticket, or null
|
* @param {string?} closer_id - ID of the member who is closing the ticket, or null
|
||||||
* @param {string} [guild_id] - The ID of the ticket's guild (used if a ticket number is provided instead of ID)
|
* @param {string} [guild_id] - The ID of the ticket's guild (used if a ticket number is provided instead of ID)
|
||||||
*/
|
*/
|
||||||
async close(ticket, closer_id, guild_id) {
|
async close(ticket_id, closer_id, guild_id) {
|
||||||
let row = await this.resolveTicket(ticket, guild_id);
|
let t_row = await this.resolve(ticket_id, guild_id);
|
||||||
if (!row) throw new Error(`Could not find a ticket with ID ${ticket}`);
|
if (!t_row) throw new Error(`Could not find a ticket with ID ${ticket_id}`);
|
||||||
|
ticket_id = t_row.id;
|
||||||
|
|
||||||
this.emit('beforeClose', ticket, closer_id);
|
this.emit('beforeClose', ticket_id, closer_id);
|
||||||
|
|
||||||
/**
|
// ...
|
||||||
*
|
|
||||||
*
|
|
||||||
* for each message of ticket, create entities
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
this.emit('close', ticket, closer_id);
|
this.emit('close', ticket_id, closer_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {(string|number)} ticket - ID or number of the ticket
|
* @param {(string|number)} ticket_id - ID or number of the ticket
|
||||||
* @param {string} [guild_id] - The ID of the ticket's guild (used if a ticket number is provided instead of ID)
|
* @param {string} [guild_id] - The ID of the ticket's guild (used if a ticket number is provided instead of ID)
|
||||||
*/
|
*/
|
||||||
async resolve(ticket, guild_id) {
|
async resolve(ticket_id, guild_id) {
|
||||||
if (!this.client.channels.resolve(ticket)) {
|
if (!this.client.channels.resolve(ticket_id)) {
|
||||||
let row = await this.client.db.models.Ticket.findOne({
|
let t_row = await this.client.db.models.Ticket.findOne({
|
||||||
where: {
|
where: {
|
||||||
number: ticket,
|
number: ticket_id,
|
||||||
guild_id
|
guild_id
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ticket = row?.id;
|
ticket_id = t_row?.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
let row = await this.client.db.models.Ticket.findOne({
|
let t_row = await this.client.db.models.Ticket.findOne({
|
||||||
where: {
|
where: {
|
||||||
id: ticket
|
id: ticket_id
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return row;
|
return t_row;
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
@ -16,11 +16,13 @@
|
|||||||
* ###############################################################################################
|
* ###############################################################################################
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const prefix = '-';
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
debug: false,
|
debug: false,
|
||||||
defaults: {
|
defaults: {
|
||||||
colour: '#009999', // https://discord.js.org/#/docs/main/stable/typedef/ColorResolvable
|
colour: '#009999', // https://discord.js.org/#/docs/main/stable/typedef/ColorResolvable
|
||||||
command_prefix: 'tickets/',
|
command_prefix: prefix,
|
||||||
log_messages: true, // transcripts/archives will be empty if false
|
log_messages: true, // transcripts/archives will be empty if false
|
||||||
name_format: 'ticket-{number}',
|
name_format: 'ticket-{number}',
|
||||||
ticket_welcome: 'Hello {name}, thank you for creating a ticket. A member of staff will soon be available to assist you.\n\n__All messages in this channel are stored for future reference.__',
|
ticket_welcome: 'Hello {name}, thank you for creating a ticket. A member of staff will soon be available to assist you.\n\n__All messages in this channel are stored for future reference.__',
|
||||||
@ -36,9 +38,8 @@ module.exports = {
|
|||||||
presence: {
|
presence: {
|
||||||
presences: [
|
presences: [
|
||||||
{
|
{
|
||||||
activity: '/new',
|
activity: `${prefix}new`,
|
||||||
type: 'PLAYING',
|
type: 'PLAYING'
|
||||||
status: 'online'
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
activity: 'with tickets',
|
activity: 'with tickets',
|
||||||
|
Loading…
Reference in New Issue
Block a user