diff --git a/.eslintrc.js b/.eslintrc.js index 9ba76e1..97d7070 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -32,6 +32,9 @@ module.exports = { ], 'no-control-regex': [ 'off' + ], + 'no-console': [ + 'off' ] } }; \ No newline at end of file diff --git a/README.md b/README.md index 8ffd98c..0336ab3 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,10 @@ DiscordTickets is a Discord bot for managing support ticket channels, to allow y - Highly customisable - Ticket "panel" / "widget" (react to embed to create ticket) - Simple commands -- SQLite (easy, default) **or** MySQL (recommend) storage +- Supports multiple databases: SQLite (easy, default), MySQL (recommend) storage, MariaDB, PostgresSQL and Microsoft SQL Server - Most (all of the best) features of the premium bots, for free - Self-hosted with your bot application, your logo and guild name -- Optional express.js server for web archvies: [DiscordTickets-Portal](https://github.com/eartharoid/DiscordTickets-Portal/) +- Optional express.js server for web archives: [DiscordTickets-Portal](https://github.com/eartharoid/DiscordTickets-Portal/) ## Screenshot @@ -31,4 +31,4 @@ For installation, configuration, usage, and other information, **go to the [wiki ## Donate -[![ko-fi](https://www.ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/B0B214BHI) +[![ko-fi](https://www.ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/eartharoid) diff --git a/package.json b/package.json index e1e3b3b..7c6a81c 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,10 @@ "sqlite3": "^5.0.0" }, "peerDependencies": { - "mysql2": "2.x" + "mysql2": "2.x", + "mariadb": "2.x", + "pg": "8.x", + "tedious": "9.x" }, "devDependencies": { "eslint": "^7.10.0", diff --git a/src/commands/add.js b/src/commands/add.js index dc500d7..aa8e91b 100644 --- a/src/commands/add.js +++ b/src/commands/add.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const { MessageEmbed } = require('discord.js'); @@ -34,17 +34,15 @@ module.exports = { let channel = message.mentions.channels.first(); - if(!channel) { - + if (!channel) { channel = message.channel; ticket = await Ticket.findOne({ where: { channel: message.channel.id } }); - if(!ticket) + if(!ticket) return message.channel.send(notTicket); } else { - ticket = await Ticket.findOne({ where: { channel: channel.id } }); - if(!ticket) { + if (!ticket) { notTicket .setTitle(':x: **Channel is not a ticket**') .setDescription(`${channel} is not a ticket channel.`); @@ -63,12 +61,10 @@ module.exports = { .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) .setFooter(guild.name, guild.iconURL()) ); - - let member = guild.member(message.mentions.users.first() || guild.members.cache.get(args[0])); - - if(!member) + + if (!member) return message.channel.send( new MessageEmbed() .setColor(config.err_colour) @@ -88,7 +84,7 @@ module.exports = { READ_MESSAGE_HISTORY: true }); - if(channel.id !== message.channel.id) + if (channel.id !== message.channel.id) channel.send( new MessageEmbed() .setColor(config.colour) @@ -99,7 +95,6 @@ module.exports = { ); - message.channel.send( new MessageEmbed() .setColor(config.colour) @@ -108,7 +103,7 @@ module.exports = { .setDescription(`${member} has been added to <#${ticket.channel}>`) .setFooter(guild.name, guild.iconURL()) ); - + log.info(`${message.author.tag} added a user to a ticket (#${message.channel.id})`); } catch (error) { log.error(error); diff --git a/src/commands/close.js b/src/commands/close.js index 3bd2841..127d9c1 100644 --- a/src/commands/close.js +++ b/src/commands/close.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const ChildLogger = require('leekslazylogger').ChildLogger; @@ -153,10 +153,9 @@ module.exports = { fs.existsSync(`user/transcripts/raw/${ticket.get('channel')}.log`) && fs.existsSync(`user/transcripts/raw/entities/${ticket.get('channel')}.json`) - ) + ) embed.addField('Web archive', await archive.export(Ticket, channel)); - - + if (embed.fields.length < 1) embed.setDescription(`No text transcripts or archive data exists for ticket ${ticket.id}`); diff --git a/src/commands/delete.js b/src/commands/delete.js index d06a51e..b509aa9 100644 --- a/src/commands/delete.js +++ b/src/commands/delete.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const ChildLogger = require('leekslazylogger').ChildLogger; @@ -124,13 +124,13 @@ module.exports = { raw = `user/transcripts/raw/${ticket.get('channel')}.log`, json = `user/transcripts/raw/entities/${ticket.get('channel')}.json`; - if (fs.existsSync(txt)) + if (fs.existsSync(txt)) fs.unlinkSync(txt); - if (fs.existsSync(raw)) + if (fs.existsSync(raw)) fs.unlinkSync(raw); - if (fs.existsSync(json)) + if (fs.existsSync(json)) fs.unlinkSync(json); // update database diff --git a/src/commands/help.js b/src/commands/help.js index a9af45b..a03d3a6 100644 --- a/src/commands/help.js +++ b/src/commands/help.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const ChildLogger = require('leekslazylogger').ChildLogger; @@ -20,7 +20,7 @@ module.exports = { execute(client, message, args, {config}) { const guild = client.guilds.cache.get(config.guild); - + const commands = Array.from(client.commands.values()); if (!args.length) { @@ -29,7 +29,7 @@ module.exports = { for (let command of commands) { if (command.hide) continue; - if (command.permission && !message.member.hasPermission(command.permission)) + if (command.permission && !message.member.hasPermission(command.permission)) continue; let desc = command.description; @@ -38,7 +38,7 @@ module.exports = { desc = desc.substring(0, 50) + '...'; cmds.push(`**${config.prefix}${command.name}** **ยท** ${desc}`); } - + message.channel.send( new MessageEmbed() .setTitle('Commands') @@ -58,13 +58,13 @@ module.exports = { const name = args[0].toLowerCase(); const command = client.commands.get(name) || client.commands.find(c => c.aliases && c.aliases.includes(name)); - if (!command) + if (!command) return message.channel.send( new MessageEmbed() .setColor(config.err_colour) .setDescription(`:x: **Invalid command name** (\`${config.prefix}help\`)`) ); - + const cmd = new MessageEmbed() .setColor(config.colour) @@ -88,7 +88,7 @@ module.exports = { } else { cmd.addField('Required Permission', `\`${command.permission || 'none'}\``, true); } - + message.channel.send(cmd); } diff --git a/src/commands/new.js b/src/commands/new.js index 162d7aa..bbd4b09 100644 --- a/src/commands/new.js +++ b/src/commands/new.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const ChildLogger = require('leekslazylogger').ChildLogger; @@ -19,9 +19,9 @@ module.exports = { example: 'new my server won\'t start', args: false, async execute(client, message, args, {config, Ticket}) { - + const guild = client.guilds.cache.get(config.guild); - + const supportRole = guild.roles.cache.get(config.staff_role); if (!supportRole) return message.channel.send( @@ -47,8 +47,8 @@ module.exports = { let desc = tickets.rows[t].topic.substring(0, 30); ticketList .push(`<#${tickets.rows[t].channel}>: \`${desc}${desc.length > 30 ? '...' : ''}\``); - } - + } + let m = await message.channel.send( new MessageEmbed() .setColor(config.err_colour) @@ -63,7 +63,7 @@ module.exports = { await m.delete(); }, 15000); } - + let topic = args.join(' '); if (topic.length > 256) @@ -100,7 +100,7 @@ module.exports = { { id: client.user, allow: ['VIEW_CHANNEL', 'SEND_MESSAGES', 'ATTACH_FILES', 'READ_MESSAGE_HISTORY'] - }, + }, { id: message.member, allow: ['VIEW_CHANNEL', 'SEND_MESSAGES', 'ATTACH_FILES', 'READ_MESSAGE_HISTORY'] @@ -134,7 +134,7 @@ module.exports = { await message.delete(); await m.delete(); }, 15000); - + // require('../modules/archive').create(client, c); // create files let ping; diff --git a/src/commands/panel.js b/src/commands/panel.js index 987f053..6492adc 100644 --- a/src/commands/panel.js +++ b/src/commands/panel.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const ChildLogger = require('leekslazylogger').ChildLogger; @@ -26,13 +26,13 @@ module.exports = { let chanID = await Setting.findOne({ where: { key: 'panel_chan_id' } }); let panel; - if(!chanID) + if (!chanID) chanID = await Setting.create({ key: 'panel_chan_id', value: message.channel.id, }); - if(!msgID) { + if (!msgID) { msgID = await Setting.create({ key: 'panel_msg_id', value: '', @@ -45,7 +45,7 @@ module.exports = { } catch (e) { log.warn('Couldn\'t delete old panel'); } - + } message.delete(); diff --git a/src/commands/remove.js b/src/commands/remove.js index 48b2de3..6cd0d0b 100644 --- a/src/commands/remove.js +++ b/src/commands/remove.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const { MessageEmbed } = require('discord.js'); @@ -34,15 +34,15 @@ module.exports = { let channel = message.mentions.channels.first(); - if(!channel) { + if (!channel) { channel = message.channel; ticket = await Ticket.findOne({ where: { channel: message.channel.id } }); - if(!ticket) + if (!ticket) return message.channel.send(notTicket); } else { - + ticket = await Ticket.findOne({ where: { channel: channel.id } }); if(!ticket) { notTicket @@ -52,7 +52,7 @@ module.exports = { } } - if(message.author.id !== ticket.creator && !message.member.roles.cache.has(config.staff_role)) + if (message.author.id !== ticket.creator && !message.member.roles.cache.has(config.staff_role)) return message.channel.send( new MessageEmbed() .setColor(config.err_colour) @@ -63,11 +63,11 @@ module.exports = { .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) .setFooter(guild.name, guild.iconURL()) ); - - + + let member = guild.member(message.mentions.users.first() || guild.members.cache.get(args[0])); - + if(!member || member.id === message.author.id || member.id === guild.me.id) return message.channel.send( new MessageEmbed() @@ -99,7 +99,7 @@ module.exports = { ); - + message.channel.send( new MessageEmbed() .setColor(config.colour) @@ -108,7 +108,7 @@ module.exports = { .setDescription(`${member} has been removed from <#${ticket.channel}>`) .setFooter(guild.name, guild.iconURL()) ); - + log.info(`${message.author.tag} removed a user from a ticket (#${message.channel.id})`); } catch (error) { log.error(error); diff --git a/src/commands/stats.js b/src/commands/stats.js index 762028f..6ed838d 100644 --- a/src/commands/stats.js +++ b/src/commands/stats.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const { MessageEmbed } = require('discord.js'); diff --git a/src/commands/tickets.js b/src/commands/tickets.js index d125865..1464962 100644 --- a/src/commands/tickets.js +++ b/src/commands/tickets.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const { MessageEmbed } = require('discord.js'); @@ -19,7 +19,7 @@ module.exports = { async execute(client, message, args, {config, Ticket}) { const guild = client.guilds.cache.get(config.guild); - + const supportRole = guild.roles.cache.get(config.staff_role); if (!supportRole) return message.channel.send( @@ -32,7 +32,7 @@ module.exports = { let context = 'self'; let user = message.mentions.users.first() || guild.members.cache.get(args[0]); - + if(user) { if(!message.member.roles.cache.has(config.staff_role)) return message.channel.send( @@ -76,17 +76,15 @@ module.exports = { if(config.transcripts.web.enabled) embed.setDescription(`You can access all of your ticket archives on the [web portal](${config.transcripts.web.server}/${user.id}).`); - + let open = [], closed = []; - for (let t in openTickets.rows) { let desc = openTickets.rows[t].topic.substring(0, 30); open.push(`> <#${openTickets.rows[t].channel}>: \`${desc}${desc.length > 20 ? '...' : ''}\``); - } - + for (let t in closedTickets.rows) { let desc = closedTickets.rows[t].topic.substring(0, 30); let transcript = ''; @@ -95,12 +93,12 @@ module.exports = { transcript = `\n> Type \`${config.prefix}transcript ${closedTickets.rows[t].id}\` to view.`; closed.push(`> **#${closedTickets.rows[t].id}**: \`${desc}${desc.length > 20 ? '...' : ''}\`${transcript}`); - + } let pre = context === 'self' ? 'You have' : user.username + ' has'; embed.addField('Open tickets', openTickets.count === 0 ? `${pre} no open tickets.` : open.join('\n\n'), false); embed.addField('Closed tickets', closedTickets.count === 0 ? `${pre} no old tickets` : closed.join('\n\n'), false); - + message.delete({timeout: 15000}); let channel; diff --git a/src/commands/topic.js b/src/commands/topic.js index 1b7261e..b865329 100644 --- a/src/commands/topic.js +++ b/src/commands/topic.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const { MessageEmbed } = require('discord.js'); @@ -47,10 +47,10 @@ module.exports = { .setTitle(':x: **Description too long**') .setDescription('Please limit your ticket topic to less than 256 characters. A short sentence will do.') .setFooter(guild.name, guild.iconURL()) - ); + ); message.channel.setTopic(`<@${ticket.creator}> | ` + topic); - + Ticket.update({ topic: topic }, { diff --git a/src/commands/transcript.js b/src/commands/transcript.js index 5c6be40..6523026 100644 --- a/src/commands/transcript.js +++ b/src/commands/transcript.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const fs = require('fs'); @@ -66,7 +66,7 @@ module.exports = { } ]; } - + const BASE_URL = config.transcripts.web.server; if (config.transcripts.web.enabled) @@ -83,7 +83,7 @@ module.exports = { } catch (e) { channel = message.channel; } - + channel.send(res).then(m => { if (channel.id === message.channel.id) m.delete({timeout: 15000}); diff --git a/src/events/debug.js b/src/events/debug.js index 09e3463..177af72 100644 --- a/src/events/debug.js +++ b/src/events/debug.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const ChildLogger = require('leekslazylogger').ChildLogger; diff --git a/src/events/error.js b/src/events/error.js index 2791d1d..cbb3020 100644 --- a/src/events/error.js +++ b/src/events/error.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const ChildLogger = require('leekslazylogger').ChildLogger; diff --git a/src/events/message.js b/src/events/message.js index d115901..2bebb97 100644 --- a/src/events/message.js +++ b/src/events/message.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const { Collection, MessageEmbed } = require('discord.js'); @@ -23,19 +23,19 @@ module.exports = { I am the support bot for **${guild}**. Type \`${config.prefix}new\` on the server to create a new ticket.`); } // stop here if is DM - + /** * Ticket transcripts * (bots currently still allowed) */ - + let ticket = await Ticket.findOne({ where: { channel: message.channel.id } }); - if(ticket) + if(ticket) archive.add(message); // add message to archive if (message.author.bot || message.author.id === client.user.id) return; // goodbye bots - + /** * Command handler * (no bots / self) @@ -49,7 +49,7 @@ Type \`${config.prefix}new\` on the server to create a new ticket.`); const commandName = args.shift().toLowerCase(); const command = client.commands.get(commandName) || client.commands.find(cmd => cmd.aliases && cmd.aliases.includes(commandName)); - + if (!command || commandName === 'none') return; // not an existing command if (message.guild.id !== guild.id) @@ -76,7 +76,7 @@ Type \`${config.prefix}new\` on the server to create a new ticket.`); ); if (!client.cooldowns.has(command.name)) client.cooldowns.set(command.name, new Collection()); - + const now = Date.now(); const timestamps = client.cooldowns.get(command.name); const cooldownAmount = (command.cooldown || config.cooldown) * 1000; diff --git a/src/events/messageDelete.js b/src/events/messageDelete.js index 9c102f0..456b0ff 100644 --- a/src/events/messageDelete.js +++ b/src/events/messageDelete.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const ChildLogger = require('leekslazylogger').ChildLogger; @@ -16,7 +16,7 @@ module.exports = { if(!config.transcripts.web.enabled) return; - if (message.partial) + if (message.partial) try { await message.fetch(); } catch (err) { @@ -27,7 +27,7 @@ module.exports = { let ticket = await Ticket.findOne({ where: { channel: message.channel.id } }); if(!ticket) return; - + let path = `user/transcripts/raw/${message.channel.id}.log`; let embeds = []; diff --git a/src/events/messageReactionAdd.js b/src/events/messageReactionAdd.js index a1c212e..67952ea 100644 --- a/src/events/messageReactionAdd.js +++ b/src/events/messageReactionAdd.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const ChildLogger = require('leekslazylogger').ChildLogger; @@ -15,7 +15,7 @@ module.exports = { event: 'messageReactionAdd', async execute(client, [r, u], {config, Ticket, Setting}) { - if (r.partial) + if (r.partial) try { await r.fetch(); } catch (err) { @@ -56,7 +56,7 @@ module.exports = { }, limit: config.tickets.max }); - + if (tickets.count >= config.tickets.max) { let ticketList = []; for (let t in tickets.rows) { @@ -76,7 +76,7 @@ module.exports = { .setDescription(`Use \`${config.prefix}close\` in a server channel to close unneeded tickets.\n\n${ticketList.join(',\n')}`) .setFooter(channel.guild.name, channel.guild.iconURL()) ); - + } catch (e) { @@ -88,11 +88,11 @@ module.exports = { .setDescription(`Use \`${config.prefix}close\` to close unneeded tickets.\n\n${ticketList.join(',\n')}`) .setFooter(channel.guild.name + ' | This message will be deleted in 15 seconds', channel.guild.iconURL()) ); - + return m.delete({ timeout: 15000 }); } - - + + } let topic = 'No topic given (created via panel)'; diff --git a/src/events/messageUpdate.js b/src/events/messageUpdate.js index fa1f2e1..6d24f55 100644 --- a/src/events/messageUpdate.js +++ b/src/events/messageUpdate.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const ChildLogger = require('leekslazylogger').ChildLogger; @@ -16,7 +16,7 @@ module.exports = { if(!config.transcripts.web.enabled) return; - if (o.partial) + if (o.partial) try { await o.fetch(); } catch (err) { @@ -24,7 +24,7 @@ module.exports = { return; } - if (n.partial) + if (n.partial) try { await n.fetch(); } catch (err) { @@ -33,7 +33,7 @@ module.exports = { } let ticket = await Ticket.findOne({ where: { channel: n.channel.id } }); - if(!ticket) return; + if(!ticket) return; let path = `user/transcripts/raw/${n.channel.id}.log`; let embeds = []; @@ -49,7 +49,6 @@ module.exports = { attachments: [...n.attachments.values()], edited: true }) + '\n'); - } }; \ No newline at end of file diff --git a/src/events/rateLimit.js b/src/events/rateLimit.js index 3899ae9..6e99a4f 100644 --- a/src/events/rateLimit.js +++ b/src/events/rateLimit.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const ChildLogger = require('leekslazylogger').ChildLogger; diff --git a/src/events/ready.js b/src/events/ready.js index d3c83c8..d8a386e 100644 --- a/src/events/ready.js +++ b/src/events/ready.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const ChildLogger = require('leekslazylogger').ChildLogger; @@ -15,7 +15,7 @@ module.exports = { execute(client) { log.success(`Authenticated as ${client.user.tag}`); - + const updatePresence = () => { let num = Math.floor(Math.random() * config.activities.length); client.user.setPresence({ @@ -26,17 +26,17 @@ module.exports = { }).catch(log.error); log.debug(`Updated presence: ${config.activity_types[num]} ${config.activities[num]}`); }; - + updatePresence(); setInterval(() => { updatePresence(); }, 60000); - - - if (client.guilds.cache.get(config.guild).member(client.user).hasPermission('ADMINISTRATOR', false)) + + + if (client.guilds.cache.get(config.guild).member(client.user).hasPermission('ADMINISTRATOR', false)) log.success('\'ADMINISTRATOR\' permission has been granted'); else log.warn('Bot does not have \'ADMINISTRATOR\' permission'); - + } }; diff --git a/src/events/warn.js b/src/events/warn.js index 77d7ac8..0f712db 100644 --- a/src/events/warn.js +++ b/src/events/warn.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const ChildLogger = require('leekslazylogger').ChildLogger; diff --git a/src/index.js b/src/index.js index 744d890..33cdfe9 100644 --- a/src/index.js +++ b/src/index.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const fs = require('fs'); const path = require('path'); @@ -40,7 +40,6 @@ log.multi(log); // required to allow other files to access the logger require('./modules/updater')(); // check for updates - /** * storage */ @@ -48,14 +47,40 @@ const { Sequelize, Model, DataTypes } = require('sequelize'); let sequelize; -if(config.storage.type === 'mysql') { +switch (config.storage.type) { +case 'mysql': log.info('Connecting to MySQL database...'); sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, { dialect: 'mysql', host: process.env.DB_HOST, logging: log.debug }); -} else { + break; +case 'mariadb': + log.info('Connecting to MariaDB database...'); + sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, { + dialect: 'mariadb', + host: process.env.DB_HOST, + logging: log.debug + }); + break; +case 'postgres': + log.info('Connecting to PostgresSQL database...'); + sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, { + dialect: 'postgres', + host: process.env.DB_HOST, + logging: log.debug + }); + break; +case 'microsoft': + log.info('Connecting to Microsoft SQL Server database...'); + sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, { + dialect: 'mssql', + host: process.env.DB_HOST, + logging: log.debug + }); + break; +default: log.info('Using SQLite storage'); sequelize = new Sequelize({ dialect: 'sqlite', @@ -90,7 +115,7 @@ Setting.sync(); /** * event loader */ -const events = fs.readdirSync('src/events').filter(file => file.endsWith('.js')); +const events = fs.readdirSync('src/events').filter(file => file.endsWith('.js')); for (const file of events) { const event = require(`./events/${file}`); client.events.set(event.event, event); @@ -102,12 +127,12 @@ for (const file of events) { /** * command loader */ -const commands = fs.readdirSync('src/commands').filter(file => file.endsWith('.js')); +const commands = fs.readdirSync('src/commands').filter(file => file.endsWith('.js')); for (const file of commands) { const command = require(`./commands/${file}`); client.commands.set(command.name, command); log.console(log.format(`> Loaded &7${config.prefix}${command.name}&f command`)); -} +} log.info(`Loaded ${events.length} events and ${commands.length} commands`); diff --git a/src/modules/archive.js b/src/modules/archive.js index 8f995cd..e2fd5f4 100644 --- a/src/modules/archive.js +++ b/src/modules/archive.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ @@ -17,7 +17,7 @@ const fetch = require('node-fetch'); module.exports.add = (message) => { - if(message.type !== 'DEFAULT') return; + if (message.type !== 'DEFAULT') return; if (config.transcripts.text.enabled) { // text transcripts let path = `user/transcripts/text/${message.channel.id}.txt`, @@ -100,15 +100,15 @@ module.exports.export = (Ticket, channel) => new Promise((resolve, reject) => { channel: channel.id } }); - + let raw = `user/transcripts/raw/${channel.id}.log`, json = `user/transcripts/raw/entities/${channel.id}.json`; if (!config.transcripts.web.enabled || !fs.existsSync(raw) || !fs.existsSync(json)) return reject(false); - + let data = JSON.parse(fs.readFileSync(json)); - + data.ticket = { id: ticket.id, name: channel.name, @@ -125,7 +125,7 @@ module.exports.export = (Ticket, channel) => new Promise((resolve, reject) => { if (index === -1) data.messages.push(message); else - data.messages[index] = message; + data.messages[index] = message; }, () => { let endpoint = config.transcripts.web.server; @@ -156,8 +156,8 @@ module.exports.export = (Ticket, channel) => new Promise((resolve, reject) => { log.warn(e); return resolve(e); }); - }); - + }); + })(); }); diff --git a/src/modules/banner.js b/src/modules/banner.js index 2397c84..e686532 100644 --- a/src/modules/banner.js +++ b/src/modules/banner.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const { version, homepage } = require('../../package.json'); diff --git a/src/modules/updater.js b/src/modules/updater.js index 987e443..b0d6d4a 100644 --- a/src/modules/updater.js +++ b/src/modules/updater.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ const ChildLogger = require('leekslazylogger').ChildLogger; @@ -15,32 +15,28 @@ version = 'v' + version; const boxen = require('boxen'); const link = require('terminal-link'); -module.exports = () => { +module.exports = async () => { if(!config.updater) return; - - fetch('https://api.github.com/repos/eartharoid/DiscordTickets/releases') - .then(res => res.json()) - .then(json => { - const update = json[0]; - let notice = []; + const json = await (await fetch('https://api.github.com/repos/eartharoid/DiscordTickets/releases')).json(); + const update = json[0]; + let notice = []; - if (version !== update.tag_name) { - log.notice(log.f(`There is an update available for Discord Tickets (${version} -> ${update.tag_name})`)); + if (version !== update.tag_name) { + log.notice(log.f(`There is an update available for Discord Tickets (${version} -> ${update.tag_name})`)); - notice.push(`&6You are currently using &c${version}&6, the latest is &a${update.tag_name}&6.`); - notice.push(`&6Download "&f${update.name}&6" from`); - notice.push(link('&6the GitHub releases page', 'https://github.com/eartharoid/DiscordTickets/releases/')); + notice.push(`&6You are currently using &c${version}&6, the latest is &a${update.tag_name}&6.`); + notice.push(`&6Download "&f${update.name}&6" from`); + notice.push(link('&6the GitHub releases page', 'https://github.com/eartharoid/DiscordTickets/releases/')); - console.log( - boxen(log.f(notice.join('\n')), { - padding: 1, - margin: 1, - align: 'center', - borderColor: 'yellow', - borderStyle: 'round' - }) - ); - } - }); + console.log( + boxen(log.f(notice.join('\n')), { + padding: 1, + margin: 1, + align: 'center', + borderColor: 'yellow', + borderStyle: 'round' + }) + ); + } }; \ No newline at end of file diff --git a/src/modules/utils.js b/src/modules/utils.js index d86de48..3eeecc1 100644 --- a/src/modules/utils.js +++ b/src/modules/utils.js @@ -1,9 +1,9 @@ /** - * + * * @name DiscordTickets * @author eartharoid * @license GNU-GPLv3 - * + * */ module.exports = { diff --git a/user/config.js b/user/config.js index ead0ac6..0b60aad 100644 --- a/user/config.js +++ b/user/config.js @@ -5,24 +5,24 @@ * | | | | | | / __| / __| / _ \ | '__| / _` | | | | | / __| | |/ / / _ \ | __| / __| * | |_| | | | \__ \ | (__ | (_) | | | | (_| | | | | | | (__ | < | __/ | |_ \__ \ * |____/ |_| |___/ \___| \___/ |_| \__,_| |_| |_| \___| |_|\_\ \___| \__| |___/ - * + * * --------------------- * Quick Start * --------------------- - * + * * > For detailed instructions, visit the GitHub repository and read the documentation: * https://github.com/eartharoid/DiscordTickets/wiki - * + * * > IMPORTANT: Also edit the TOKEN in 'user/.env' - * + * * --------------------- * Support * --------------------- - * + * * > Information: https://github.com/eartharoid/DiscordTickets/#readme * > Discord Support Server: https://go.eartharoid.me/discord * > Wiki: https://github.com/eartharoid/DiscordTickets/wiki - * + * * ############################################################################################### */ @@ -80,7 +80,7 @@ module.exports = { channel: '' // ID of your log channel } }, - + debug: false, updater: true }; diff --git a/user/images/how-can-i-help-1.gif b/user/images/how-can-i-help-1.gif index 703b5e8..185fde1 100644 Binary files a/user/images/how-can-i-help-1.gif and b/user/images/how-can-i-help-1.gif differ diff --git a/user/images/how-can-i-help-2.gif b/user/images/how-can-i-help-2.gif index ef8d279..181a57e 100644 Binary files a/user/images/how-can-i-help-2.gif and b/user/images/how-can-i-help-2.gif differ diff --git a/user/images/how-can-we-help.gif b/user/images/how-can-we-help.gif index 171836b..b57bd7d 100644 Binary files a/user/images/how-can-we-help.gif and b/user/images/how-can-we-help.gif differ