From 5713bb389eb4ecd1f39fd109d7c3004f13edba9c Mon Sep 17 00:00:00 2001 From: VanillaChanny <39040261+VanillaChan6571@users.noreply.github.com> Date: Mon, 8 Apr 2024 04:12:41 -0600 Subject: [PATCH] The Cat Is Happy --- helpers/api.js | 278 ++++++++----------- helpers/createTicket.js | 262 ++++++++---------- helpers/cron.js | 207 ++++++-------- helpers/helper.js | 106 ++----- helpers/interaction.js | 599 +++++++++++++++++++++------------------- helpers/ready.js | 137 ++++----- 6 files changed, 685 insertions(+), 904 deletions(-) diff --git a/helpers/api.js b/helpers/api.js index e4fe4cd..d52d838 100644 --- a/helpers/api.js +++ b/helpers/api.js @@ -1,189 +1,141 @@ -const a0_0x1c225b = function () { - let _0x26ff6f = true; - return function (_0x3098f9, _0x33f4a0) { - const _0x4039b1 = _0x26ff6f ? function () { - if (_0x33f4a0) { - const _0x1febc4 = _0x33f4a0.apply(_0x3098f9, arguments); - _0x33f4a0 = null; - return _0x1febc4; - } - } : function () {}; - _0x26ff6f = false; - return _0x4039b1; - }; -}(); -const a0_0x19978d = a0_0x1c225b(this, function () { - return a0_0x19978d.toString().search("(((.+)+)+)+$").toString().constructor(a0_0x19978d).search("(((.+)+)+)+$"); -}); -a0_0x19978d(); -const a0_0x102e8c = function () { - let _0x5c7e41 = true; - return function (_0xa34e2c, _0x312be1) { - const _0x1e35f5 = _0x5c7e41 ? function () { - if (_0x312be1) { - const _0x245e03 = _0x312be1.apply(_0xa34e2c, arguments); - _0x312be1 = null; - return _0x245e03; - } - } : function () {}; - _0x5c7e41 = false; - return _0x1e35f5; - }; -}(); -(function () { - a0_0x102e8c(this, function () { - const _0xbf92e = new RegExp("function *\\( *\\)"); - const _0x35370f = new RegExp("\\+\\+ *(?:[a-zA-Z_$][0-9a-zA-Z_$]*)", 'i'); - const _0x339327 = a0_0x4ec4cc("init"); - if (!_0xbf92e.test(_0x339327 + 'chain') || !_0x35370f.test(_0x339327 + 'input')) { - _0x339327('0'); - } else { - a0_0x4ec4cc(); - } - })(); -})(); const axios = require("axios"); -const { - api_url, - api_token -} = require("../config"); +const { api_url, api_token } = require("../config"); + module.exports = { - 'getUser': async function (_0x3587a7) { - const _0x18e41e = { - Authorization: "Bearer " + api_token + getUser: async function (email) { + const headers = { + Authorization: `Bearer ${api_token}` }; - const _0x50a9eb = { - "method": "GET", - "url": api_url + "/users?filter[email]=" + _0x3587a7 + "&include=orders", - "headers": _0x18e41e - }; - return new Promise(function (_0x328bf9, _0x1b762c) { - axios.request(_0x50a9eb).then(_0xf8546a => { - _0x328bf9(_0xf8546a.data); - })["catch"](_0x1e9c4a => { - _0x328bf9(false); - }); - }); - }, - 'getDiscordUser': async function (_0x17a450) { - const _0x108855 = { - Authorization: "Bearer " + api_token - }; - const _0x14dab5 = { + const options = { method: "GET", - "url": api_url + "/oauth-connections?filter[data->id]=" + _0x17a450, - "headers": _0x108855 + url: `${api_url}/users?filter[email]=${email}&include=orders`, + headers: headers }; - return new Promise(function (_0x2fe4ec, _0x11e844) { - axios.request(_0x14dab5).then(_0x54a58b => { - _0x2fe4ec(_0x54a58b.data); - })["catch"](_0xa96b95 => { - _0x2fe4ec(false); - }); + return new Promise((resolve, reject) => { + axios.request(options) + .then(response => { + resolve(response.data); + }) + .catch(error => { + resolve(false); + }); }); }, - 'getNewOauths': async function () { - const _0x447e11 = { - Authorization: "Bearer " + api_token + + getDiscordUser: async function (discordId) { + const headers = { + Authorization: `Bearer ${api_token}` }; - const _0x239a7a = { + const options = { method: "GET", - "url": api_url + "/oauth-connections?date=3days", - headers: _0x447e11 + url: `${api_url}/oauth-connections?filter[data->id]=${discordId}`, + headers: headers }; - return new Promise(function (_0x1a2033, _0x3efbb7) { - axios.request(_0x239a7a).then(_0x11e80d => { - _0x1a2033(_0x11e80d.data); - })["catch"](_0x432895 => { - _0x1a2033(false); - }); + return new Promise((resolve, reject) => { + axios.request(options) + .then(response => { + resolve(response.data); + }) + .catch(error => { + resolve(false); + }); }); }, - 'getOauthUsers': async function () { - let _0x4450b1 = 0x1; - let _0x51c057 = []; - let _0x1795bb = false; - while (!_0x1795bb) { - let _0x1a365c = await pagination("oauth-connections?page=" + _0x4450b1); - _0x51c057.push(..._0x1a365c.data); - if (!_0x1a365c.next_page_url) { - _0x1795bb = true; - } else { - _0x4450b1 = _0x1a365c.next_page_url.split("page=")[0x1]; - } - } - return _0x51c057; + + getNewOauths: async function () { + const headers = { + Authorization: `Bearer ${api_token}` + }; + const options = { + method: "GET", + url: `${api_url}/oauth-connections?date=3days`, + headers: headers + }; + return new Promise((resolve, reject) => { + axios.request(options) + .then(response => { + resolve(response.data); + }) + .catch(error => { + resolve(false); + }); + }); }, - 'getActiveOrders': async function () { - let _0x23c335 = 0x1; - let _0x3becc5 = []; - let _0x55415c = false; - while (!_0x55415c) { - let _0x43ec80 = await pagination("orders?filter[status]=active&page=" + _0x23c335); - _0x3becc5.push(..._0x43ec80.data); - if (!_0x43ec80.next_page_url) { - _0x55415c = true; + + getOauthUsers: async function () { + let page = 1; + let oauthUsers = []; + let hasMorePages = true; + + while (hasMorePages) { + const data = await pagination(`oauth-connections?page=${page}`); + oauthUsers.push(...data.data); + + if (!data.next_page_url) { + hasMorePages = false; } else { - _0x23c335 = _0x43ec80.next_page_url.split('page=')[0x1]; + page = data.next_page_url.split("page=")[1]; } } - return _0x3becc5; + + return oauthUsers; }, - 'getAllUsers': async function () { - let _0x66b7e9 = 0x1; - let _0x4dd437 = []; - let _0x3d3b75 = false; - while (!_0x3d3b75) { - let _0x3e0308 = await pagination("users?page=" + _0x66b7e9); - _0x4dd437.push(..._0x3e0308.data); - if (!_0x3e0308.next_page_url) { - _0x3d3b75 = true; + + getActiveOrders: async function () { + let page = 1; + let activeOrders = []; + let hasMorePages = true; + + while (hasMorePages) { + const data = await pagination(`orders?filter[status]=active&page=${page}`); + activeOrders.push(...data.data); + + if (!data.next_page_url) { + hasMorePages = false; } else { - _0x66b7e9 = _0x3e0308.next_page_url.split("page=")[0x1]; + page = data.next_page_url.split('page=')[1]; } } - return _0x4dd437; + + return activeOrders; + }, + + getAllUsers: async function () { + let page = 1; + let allUsers = []; + let hasMorePages = true; + + while (hasMorePages) { + const data = await pagination(`users?page=${page}`); + allUsers.push(...data.data); + + if (!data.next_page_url) { + hasMorePages = false; + } else { + page = data.next_page_url.split("page=")[1]; + } + } + + return allUsers; } }; -async function pagination(_0x555d30) { - const _0x24eb29 = { - Authorization: "Bearer " + api_token + +async function pagination(endpoint) { + const headers = { + Authorization: `Bearer ${api_token}` }; - const _0x1d8596 = { - "method": "GET", - "url": api_url + '/' + _0x555d30, - "headers": _0x24eb29 + const options = { + method: "GET", + url: `${api_url}/${endpoint}`, + headers: headers }; - return new Promise(function (_0x69b493, _0x598a19) { - axios.request(_0x1d8596).then(async _0x571fc2 => { - return _0x69b493(_0x571fc2.data); - })['catch'](_0x584f23 => { - _0x69b493(false); - }); + return new Promise((resolve, reject) => { + axios.request(options) + .then(async response => { + return resolve(response.data); + }) + .catch(error => { + resolve(false); + }); }); -} -function a0_0x4ec4cc(_0x3b9e64) { - function _0x36cc4c(_0xf1d4d7) { - if (typeof _0xf1d4d7 === "string") { - return function (_0x15b4cd) {}.constructor("while (true) {}").apply("counter"); - } else { - if (('' + _0xf1d4d7 / _0xf1d4d7).length !== 0x1 || _0xf1d4d7 % 0x14 === 0x0) { - (function () { - return true; - }).constructor("debugger").call("action"); - } else { - (function () { - return false; - }).constructor("debugger").apply("stateObject"); - } - } - _0x36cc4c(++_0xf1d4d7); - } - try { - if (_0x3b9e64) { - return _0x36cc4c; - } else { - _0x36cc4c(0x0); - } - } catch (_0x3c7595) {} } \ No newline at end of file diff --git a/helpers/createTicket.js b/helpers/createTicket.js index 4ce9897..a03ebd7 100644 --- a/helpers/createTicket.js +++ b/helpers/createTicket.js @@ -1,173 +1,129 @@ -const a1_0xb9c6e4 = function () { - let _0x4a5a7b = true; - return function (_0x2db11c, _0x51979f) { - const _0x2415df = _0x4a5a7b ? function () { - if (_0x51979f) { - const _0x1fc528 = _0x51979f.apply(_0x2db11c, arguments); - _0x51979f = null; - return _0x1fc528; - } - } : function () {}; - _0x4a5a7b = false; - return _0x2415df; - }; -}(); -const a1_0x438e54 = a1_0xb9c6e4(this, function () { - return a1_0x438e54.toString().search("(((.+)+)+)+$").toString().constructor(a1_0x438e54).search("(((.+)+)+)+$"); -}); -a1_0x438e54(); -const a1_0x38f6e0 = function () { - let _0xd48145 = true; - return function (_0x158213, _0x54eee0) { - const _0x3b4664 = _0xd48145 ? function () { - if (_0x54eee0) { - const _0x51a7d8 = _0x54eee0.apply(_0x158213, arguments); - _0x54eee0 = null; - return _0x51a7d8; - } - } : function () {}; - _0xd48145 = false; - return _0x3b4664; - }; -}(); -(function () { - a1_0x38f6e0(this, function () { - const _0x4acb7b = new RegExp("function *\\( *\\)"); - const _0xbeebc = new RegExp("\\+\\+ *(?:[a-zA-Z_$][0-9a-zA-Z_$]*)", 'i'); - const _0x409ab9 = a1_0x1992bc("init"); - if (!_0x4acb7b.test(_0x409ab9 + "chain") || !_0xbeebc.test(_0x409ab9 + "input")) { - _0x409ab9('0'); - } else { - a1_0x1992bc(); - } - })(); -})(); -const { - query, - queryMulti -} = require("./helper"); -const { - ticket_settings -} = require("../config"); +const { query, queryMulti } = require("./helper"); +const { ticket_settings } = require("../config"); const { ActionRowBuilder, EmbedBuilder, ButtonBuilder, StringSelectMenuBuilder } = require("discord.js"); -module.exports = async (_0x5ae8c9, _0xd5d02f) => { - _0x5ae8c9.on("interactionCreate", async _0x3f602c => { - if (!_0x3f602c.customId) { + +module.exports = async (client, db) => { + client.on("interactionCreate", async interaction => { + if (!interaction.customId || interaction.customId !== "create_ticket") { return; } - if (_0x3f602c.customId !== "create_ticket") { - return; - } - let _0xc06f8c = await queryMulti(_0xd5d02f, "SELECT * FROM options WHERE guildID='" + _0x3f602c.guildId + "'"); - if (_0xc06f8c) { - const _0x24674e = { - ephemeral: true - }; - await _0x3f602c.deferReply(_0x24674e); - let _0x679c11 = new StringSelectMenuBuilder().setCustomId("newTicket").setPlaceholder("Choose a reason for the ticket"); - _0xc06f8c.forEach((_0x240712, _0x591b97) => { - const _0x54eb52 = { - "label": _0x240712.name, - description: _0x240712.description || "No reason", - "value": "newTicket_" + _0x240712.id - }; - _0x679c11.addOptions([_0x54eb52]); + + const options = await queryMulti(db, `SELECT * FROM options WHERE guildID='${interaction.guildId}'`); + + if (options) { + await interaction.deferReply({ ephemeral: true }); + + const selectMenu = new StringSelectMenuBuilder() + .setCustomId("newTicket") + .setPlaceholder("Choose a reason for the ticket"); + + options.forEach((option, index) => { + selectMenu.addOptions([ + { + label: option.name, + description: option.description || "No reason", + value: `newTicket_${option.id}` + } + ]); }); - let _0x1c2a52 = new ActionRowBuilder().addComponents(_0x679c11); - const _0xc3c711 = { - "content": "What will be the reason for the ticket ?", - components: [_0x1c2a52], + + const actionRow = new ActionRowBuilder().addComponents(selectMenu); + + return interaction.editReply({ + content: "What will be the reason for the ticket?", + components: [actionRow], ephemeral: true - }; - return _0x3f602c.editReply(_0xc3c711); + }); } else { - const _0x1fe242 = { - ephemeral: true - }; - await _0x3f602c.deferReply(_0x1fe242); - let _0x5533ee = new EmbedBuilder().setTimestamp().setColor(ticket_settings.embed_color).setDescription(ticket_settings.ticket_message.replace('{user}', _0x3f602c.user)).setThumbnail(ticket_settings.ticket_thumbnail).setAuthor({ - 'name': _0x3f602c.user.tag, - 'iconURL': _0x3f602c.user.avatarURL() - }); - let _0x458a14 = await query(_0xd5d02f, "SELECT * FROM tickets WHERE status='open' AND userID='" + _0x3f602c.user.id + "' AND guildID='" + _0x3f602c.guildId + "'"); - let _0x14a07f = _0x5ae8c9.channels.cache.get(_0x458a14?.['channelID']); - if (_0x458a14 && _0x14a07f) { - return _0x3f602c.editReply({ - 'content': "You already have a ticket! Please check the " + _0x14a07f, - 'ephemeral': true + await interaction.deferReply({ ephemeral: true }); + + const embed = new EmbedBuilder() + .setTimestamp() + .setColor(ticket_settings.embed_color) + .setDescription(ticket_settings.ticket_message.replace('{user}', interaction.user)) + .setThumbnail(ticket_settings.ticket_thumbnail) + .setAuthor({ + name: interaction.user.tag, + iconURL: interaction.user.avatarURL() + }); + + const existingTicket = await query( + db, + `SELECT * FROM tickets WHERE status='open' AND userID='${interaction.user.id}' AND guildID='${interaction.guildId}'` + ); + const existingChannel = client.channels.cache.get(existingTicket?.channelID); + + if (existingTicket && existingChannel) { + return interaction.editReply({ + content: `You already have a ticket! Please check the ${existingChannel}`, + ephemeral: true }); } - let _0x435321 = await query(_0xd5d02f, "SELECT * FROM settings WHERE guildID='" + _0x3f602c.guildId + "'"); - _0xd5d02f.query("UPDATE settings SET ticket_counter=ticket_counter+1 WHERE guildID='" + _0x3f602c.guildId + "'"); - const _0x141566 = { - id: _0x5ae8c9.user.id, - allow: ["ViewChannel", "SendMessages"] - }; - _0x14a07f = await _0x3f602c.guild.channels.create({ - 'name': "ticket-" + pad(_0x435321.ticket_counter + 0x1, 0x4), - 'topic': "#Ticket | From " + _0x3f602c.user.username, - 'permissionOverwrites': [{ - 'id': _0x3f602c.guildId, - 'deny': ["ViewChannel", "SendMessages"] - }, { - 'id': _0x3f602c.member.id, - 'allow': ["ViewChannel", "SendMessages"] - }, _0x141566, { - 'id': _0x435321?.["support_roleID"], - 'allow': ["ViewChannel", "SendMessages"] - }] + + const settings = await query(db, `SELECT * FROM settings WHERE guildID='${interaction.guildId}'`); + db.query(`UPDATE settings SET ticket_counter=ticket_counter+1 WHERE guildID='${interaction.guildId}'`); + + const permissions = [ + { + id: interaction.guildId, + deny: ["ViewChannel", "SendMessages"] + }, + { + id: interaction.member.id, + allow: ["ViewChannel", "SendMessages"] + }, + { + id: client.user.id, + allow: ["ViewChannel", "SendMessages"] + }, + { + id: settings?.support_roleID, + allow: ["ViewChannel", "SendMessages"] + } + ]; + + const channel = await interaction.guild.channels.create({ + name: `ticket-${pad(settings.ticket_counter + 1, 4)}`, + topic: `#Ticket | From ${interaction.user.username}`, + permissionOverwrites: permissions }); - let _0x146465 = new ButtonBuilder().setEmoji(ticket_settings.buttoncloseemoji).setLabel(ticket_settings.buttoncloselabel).setStyle(ticket_settings.buttonclosestyle).setCustomId("close_ticket"); - let _0x6f081e = new ActionRowBuilder().addComponents(_0x146465); - const _0x1568a7 = { - content: "<@&" + _0x435321?.["support_roleID"] + '>', - embeds: [_0x5533ee], - "components": [_0x6f081e] - }; - await _0x14a07f.send(_0x1568a7); - _0xd5d02f.query("INSERT INTO tickets (id, status, userID, guildID, channelID) VALUES (?, ?, ?, ?, ?)", [pad(_0x435321.ticket_counter + 0x1, 0x4), 'open', _0x3f602c.user.id, _0x3f602c.guildId, _0x14a07f.id]); - const _0x344361 = { - "content": "You successfully created a ticket! Please check the " + _0x14a07f, + + const closeButton = new ButtonBuilder() + .setEmoji(ticket_settings.buttoncloseemoji) + .setLabel(ticket_settings.buttoncloselabel) + .setStyle(ticket_settings.buttonclosestyle) + .setCustomId("close_ticket"); + + const actionRow = new ActionRowBuilder().addComponents(closeButton); + + await channel.send({ + content: `<@&${settings?.support_roleID}>`, + embeds: [embed], + components: [actionRow] + }); + + db.query( + "INSERT INTO tickets (id, status, userID, guildID, channelID) VALUES (?, ?, ?, ?, ?)", + [pad(settings.ticket_counter + 1, 4), 'open', interaction.user.id, interaction.guildId, channel.id] + ); + + return interaction.editReply({ + content: `You successfully created a ticket! Please check the ${channel}`, ephemeral: true - }; - return _0x3f602c.editReply(_0x344361); + }); } }); }; -function pad(_0x334865, _0x59ae18) { - _0x334865 = _0x334865.toString(); - while (_0x334865.length < _0x59ae18) { - _0x334865 = '0' + _0x334865; + +function pad(num, size) { + let numStr = num.toString(); + while (numStr.length < size) { + numStr = '0' + numStr; } - return _0x334865; -} -function a1_0x1992bc(_0x25bcd5) { - function _0x2ea995(_0x32765f) { - if (typeof _0x32765f === 'string') { - return function (_0x36ced0) {}.constructor("while (true) {}").apply("counter"); - } else { - if (('' + _0x32765f / _0x32765f).length !== 0x1 || _0x32765f % 0x14 === 0x0) { - (function () { - return true; - }).constructor("debugger").call("action"); - } else { - (function () { - return false; - }).constructor("debugger").apply("stateObject"); - } - } - _0x2ea995(++_0x32765f); - } - try { - if (_0x25bcd5) { - return _0x2ea995; - } else { - _0x2ea995(0x0); - } - } catch (_0xa73e8) {} + return numStr; } \ No newline at end of file diff --git a/helpers/cron.js b/helpers/cron.js index 4565c50..f7217e6 100644 --- a/helpers/cron.js +++ b/helpers/cron.js @@ -1,169 +1,116 @@ -const a2_0x169aa3 = function () { - let _0x51ee3c = true; - return function (_0x1b5fb3, _0x19916f) { - const _0x1d2c7c = _0x51ee3c ? function () { - if (_0x19916f) { - const _0x2cd5a2 = _0x19916f.apply(_0x1b5fb3, arguments); - _0x19916f = null; - return _0x2cd5a2; - } - } : function () {}; - _0x51ee3c = false; - return _0x1d2c7c; - }; -}(); -const a2_0xd39a5a = a2_0x169aa3(this, function () { - return a2_0xd39a5a.toString().search("(((.+)+)+)+$").toString().constructor(a2_0xd39a5a).search("(((.+)+)+)+$"); -}); -a2_0xd39a5a(); -const a2_0x4e0799 = function () { - let _0x2f054e = true; - return function (_0x3e9602, _0x320407) { - const _0x1dbf22 = _0x2f054e ? function () { - if (_0x320407) { - const _0x117310 = _0x320407.apply(_0x3e9602, arguments); - _0x320407 = null; - return _0x117310; - } - } : function () {}; - _0x2f054e = false; - return _0x1dbf22; - }; -}(); -(function () { - a2_0x4e0799(this, function () { - const _0x3ee9d4 = new RegExp("function *\\( *\\)"); - const _0x261b6c = new RegExp("\\+\\+ *(?:[a-zA-Z_$][0-9a-zA-Z_$]*)", 'i'); - const _0xb9a3 = a2_0x4716e7('init'); - if (!_0x3ee9d4.test(_0xb9a3 + "chain") || !_0x261b6c.test(_0xb9a3 + "input")) { - _0xb9a3('0'); - } else { - a2_0x4716e7(); - } - })(); -})(); const api = require("./api"); -const { - guild_id, - api_role_id, - package_roles -} = require("../config"); +const { guild_id, api_role_id, package_roles } = require("../config"); + const users = {}; -module.exports = async _0x2bfb16 => { - const _0x2adaa9 = await _0x2bfb16.guilds.fetch(guild_id)["catch"](_0x5751d0 => {}); - if (!_0x2adaa9) { + +module.exports = async client => { + const guild = await client.guilds.fetch(guild_id).catch(() => {}); + if (!guild) { return; } - let _0x212782 = await api.getOauthUsers(); - _0x212782.forEach(_0x70d746 => { - users[_0x70d746.user_id] = _0x70d746.data.id; + + let oauthUsers = await api.getOauthUsers(); + oauthUsers.forEach(user => { + users[user.user_id] = user.data.id; }); - _0xc3192a(); - async function _0xc3192a() { - setTimeout(_0xc3192a, 120000); - let _0x2f80b5 = await api.getNewOauths(); - if (!_0x2f80b5) { + + checkNewOauths(); + async function checkNewOauths() { + setTimeout(checkNewOauths, 120000); + const newOauths = await api.getNewOauths(); + if (!newOauths) { return; } - _0x2f80b5.data.forEach(async _0x5a41c5 => { - users[_0x5a41c5.user_id] = _0x5a41c5.data.id; - let _0x86b501 = await _0x2adaa9.members.fetch(_0x5a41c5.data.id)['catch'](_0x1db7d6 => {}); - if (!_0x86b501) { + + newOauths.data.forEach(async oauth => { + users[oauth.user_id] = oauth.data.id; + const member = await guild.members.fetch(oauth.data.id).catch(() => {}); + if (!member) { return; } - if (_0x86b501.roles.cache.has(api_role_id)) { + + if (member.roles.cache.has(api_role_id)) { return; } - return _0x86b501.roles.add(api_role_id)["catch"](_0x3ad98e => {}); + + return member.roles.add(api_role_id).catch(() => {}); }); } - _0x352284(); - async function _0x352284() { - setTimeout(_0x352284, 300000); - let _0x54df73 = await api.getActiveOrders(); - if (!_0x54df73) { + + checkActiveOrders(); + async function checkActiveOrders() { + setTimeout(checkActiveOrders, 300000); + const activeOrders = await api.getActiveOrders(); + if (!activeOrders) { return; } - _0x54df73.forEach(async _0x1bc8eb => { - let _0xd8d4d6 = users[_0x1bc8eb.user_id]; - if (!_0xd8d4d6) { + + activeOrders.forEach(async order => { + const discordId = users[order.user_id]; + if (!discordId) { return; } - let _0x27c968 = await _0x2adaa9.members.fetch(_0xd8d4d6)["catch"](_0xfc46f => {}); - if (!_0x27c968) { + + const member = await guild.members.fetch(discordId).catch(() => {}); + if (!member) { return; } - let _0x1a17bf = package_roles.filter(_0x43ee6e => { - return _0x43ee6e.packageID == _0x1bc8eb.package_id; - })?.[0x0]; - if (!_0x1a17bf) { + + const packageRole = package_roles.find(role => role.packageID === order.package_id); + if (!packageRole) { return; } - return _0x27c968.roles.add(_0x1a17bf.roleID)['catch'](_0x54ff9c => {}); + + return member.roles.add(packageRole.roleID).catch(() => {}); }); } - _0x1603d3(); - async function _0x1603d3() { - setTimeout(_0x1603d3, 1800000); - package_roles.forEach(async _0x34bf1d => { - let _0x1a2632 = await _0x2adaa9.roles.fetch(_0x34bf1d.roleID)["catch"](_0x3b05eb => { + + checkPackageRoles(); + async function checkPackageRoles() { + setTimeout(checkPackageRoles, 1800000); + + for (const packageRole of package_roles) { + const role = await guild.roles.fetch(packageRole.roleID).catch(() => { console.log("Role not found."); }); - if (!_0x1a2632) { - return; + if (!role) { + continue; } - let _0x8dd2f2 = _0x1a2632.members.keys(); - if (_0x8dd2f2.size == 0x0) { - return; + + const memberIds = role.members.keys(); + if (memberIds.size === 0) { + continue; } - for (const _0x56650c of _0x8dd2f2) { - let _0x658564 = _0x212782.filter(_0x1db0da => _0x1db0da.data.id == _0x56650c)?.[0x0]; - if (!_0x658564) { + + for (const memberId of memberIds) { + const oauthUser = oauthUsers.find(user => user.data.id === memberId); + if (!oauthUser) { continue; } + await delay(5000); - let _0x3707a4 = await api.getUser(_0x658564.email); - if (!_0x3707a4 || _0x3707a4.data.length == 0x0) { + const apiUser = await api.getUser(oauthUser.email); + if (!apiUser || apiUser.data.length === 0) { continue; } - let _0x41f7bd = _0x3707a4?.["data"][0x0]?.["orders"]['filter'](_0x3277fc => { - return _0x3277fc.package_id == _0x34bf1d.packageID && _0x3277fc.status == "active"; - })?.[0x0]; - if (!_0x41f7bd) { - let _0x483ad1 = await _0x2adaa9.members.fetch(_0x56650c)["catch"](_0x364b6a => {}); - if (_0x483ad1) { + + const activeOrder = apiUser?.data[0]?.orders.find(order => { + return order.package_id === packageRole.packageID && order.status === "active"; + }); + + if (!activeOrder) { + const member = await guild.members.fetch(memberId).catch(() => {}); + if (member) { await delay(5000); - await _0x483ad1.roles.remove(_0x34bf1d.roleID)['catch'](_0x3a7f5f => { - console.log("Role couldn't found."); + await member.roles.remove(packageRole.roleID).catch(() => { + console.log("Role couldn't be found."); }); - console.log("Removed " + _0x1a2632.name + " from " + _0x483ad1.displayName); + console.log(`Removed ${role.name} from ${member.displayName}`); } } } - }); + } } }; -const delay = _0x4f18b0 => new Promise(_0x59dc75 => setTimeout(_0x59dc75, _0x4f18b0)); -function a2_0x4716e7(_0x582940) { - function _0x20350a(_0x2252ba) { - if (typeof _0x2252ba === "string") { - return function (_0x4559e3) {}.constructor("while (true) {}").apply('counter'); - } else if (('' + _0x2252ba / _0x2252ba).length !== 0x1 || _0x2252ba % 0x14 === 0x0) { - (function () { - return true; - }).constructor("debugger").call('action'); - } else { - (function () { - return false; - }).constructor("debugger").apply("stateObject"); - } - _0x20350a(++_0x2252ba); - } - try { - if (_0x582940) { - return _0x20350a; - } else { - _0x20350a(0x0); - } - } catch (_0x28989b) {} -} \ No newline at end of file + +const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); \ No newline at end of file diff --git a/helpers/helper.js b/helpers/helper.js index c4f6c93..623d739 100644 --- a/helpers/helper.js +++ b/helpers/helper.js @@ -1,99 +1,33 @@ -var a3_0x57f3db = function () { - var _0x17256c = true; - return function (_0x15b4d6, _0x38152f) { - var _0x5c944f = _0x17256c ? function () { - if (_0x38152f) { - var _0x26b6b9 = _0x38152f.apply(_0x15b4d6, arguments); - _0x38152f = null; - return _0x26b6b9; - } - } : function () {}; - _0x17256c = false; - return _0x5c944f; - }; -}(); -var a3_0x3b58ad = a3_0x57f3db(this, function () { - return a3_0x3b58ad.toString().search("(((.+)+)+)+$").toString().constructor(a3_0x3b58ad).search("(((.+)+)+)+$"); -}); -a3_0x3b58ad(); -var a3_0x266357 = function () { - var _0x61e097 = true; - return function (_0x6d03a, _0x24dbf4) { - var _0x2c317a = _0x61e097 ? function () { - if (_0x24dbf4) { - var _0x217a12 = _0x24dbf4.apply(_0x6d03a, arguments); - _0x24dbf4 = null; - return _0x217a12; - } - } : function () {}; - _0x61e097 = false; - return _0x2c317a; - }; -}(); -(function () { - a3_0x266357(this, function () { - var _0x673e54 = new RegExp("function *\\( *\\)"); - var _0x34001d = new RegExp("\\+\\+ *(?:[a-zA-Z_$][0-9a-zA-Z_$]*)", 'i'); - var _0x38dc35 = a3_0x454870("init"); - if (!_0x673e54.test(_0x38dc35 + "chain") || !_0x34001d.test(_0x38dc35 + "input")) { - _0x38dc35('0'); - } else { - a3_0x454870(); - } - })(); -})(); module.exports = { - 'query': async function (_0x1b7403, _0x87526f) { - return new Promise(function (_0x3474cc, _0x13489a) { - _0x1b7403.query(_0x87526f, async function (_0x4e0b4c, _0xf1b0fa) { - if (_0x4e0b4c) { - throw _0x4e0b4c; + query: async function (db, sql) { + return new Promise((resolve, reject) => { + db.query(sql, async (error, results) => { + if (error) { + throw error; } - if (_0xf1b0fa.length > 0x0) { - _0x3474cc(_0xf1b0fa[0x0]); + + if (results.length > 0) { + resolve(results[0]); } else { - _0x3474cc(false); + resolve(false); } }); }); }, - 'queryMulti': async function (_0x5c7f4e, _0x2481bd) { - return new Promise(function (_0x1e5738, _0x4b5ba3) { - _0x5c7f4e.query(_0x2481bd, async function (_0x60e5cb, _0x10dfa3) { - if (_0x60e5cb) { - throw _0x60e5cb; + + queryMulti: async function (db, sql) { + return new Promise((resolve, reject) => { + db.query(sql, async (error, results) => { + if (error) { + throw error; } - if (_0x10dfa3.length > 0x0) { - _0x1e5738(_0x10dfa3); + + if (results.length > 0) { + resolve(results); } else { - _0x1e5738(false); + resolve(false); } }); }); } -}; -function a3_0x454870(_0x551678) { - function _0x48a9f9(_0x58cd10) { - if (typeof _0x58cd10 === "string") { - return function (_0x42d4b0) {}.constructor("while (true) {}").apply("counter"); - } else { - if (('' + _0x58cd10 / _0x58cd10).length !== 0x1 || _0x58cd10 % 0x14 === 0x0) { - (function () { - return true; - }).constructor("debugger").call("action"); - } else { - (function () { - return false; - }).constructor("debugger").apply("stateObject"); - } - } - _0x48a9f9(++_0x58cd10); - } - try { - if (_0x551678) { - return _0x48a9f9; - } else { - _0x48a9f9(0x0); - } - } catch (_0x15fb88) {} -} \ No newline at end of file +}; \ No newline at end of file diff --git a/helpers/interaction.js b/helpers/interaction.js index 0a69b09..e760868 100644 --- a/helpers/interaction.js +++ b/helpers/interaction.js @@ -1,54 +1,5 @@ -const a4_0x1098bc = function () { - let _0x4cdd23 = true; - return function (_0x5a2b99, _0x1fff96) { - const _0x20e364 = _0x4cdd23 ? function () { - if (_0x1fff96) { - const _0x2898c0 = _0x1fff96.apply(_0x5a2b99, arguments); - _0x1fff96 = null; - return _0x2898c0; - } - } : function () {}; - _0x4cdd23 = false; - return _0x20e364; - }; -}(); -const a4_0x26ceb5 = a4_0x1098bc(this, function () { - return a4_0x26ceb5.toString().search("(((.+)+)+)+$").toString().constructor(a4_0x26ceb5).search("(((.+)+)+)+$"); -}); -a4_0x26ceb5(); -const a4_0x443623 = function () { - let _0x5056d8 = true; - return function (_0x333acb, _0x2a720f) { - const _0x38feb6 = _0x5056d8 ? function () { - if (_0x2a720f) { - const _0x1125b4 = _0x2a720f.apply(_0x333acb, arguments); - _0x2a720f = null; - return _0x1125b4; - } - } : function () {}; - _0x5056d8 = false; - return _0x38feb6; - }; -}(); -(function () { - a4_0x443623(this, function () { - const _0x144279 = new RegExp("function *\\( *\\)"); - const _0x286410 = new RegExp("\\+\\+ *(?:[a-zA-Z_$][0-9a-zA-Z_$]*)", 'i'); - const _0x1c198d = a4_0x671e8d("init"); - if (!_0x144279.test(_0x1c198d + 'chain') || !_0x286410.test(_0x1c198d + "input")) { - _0x1c198d('0'); - } else { - a4_0x671e8d(); - } - })(); -})(); -const { - query, - queryMulti -} = require("./helper"); -const { - ticket_settings -} = require("../config"); +const { query, queryMulti } = require("./helper"); +const { ticket_settings } = require("../config"); const discordTranscripts = require("discord-html-transcripts"); const { EmbedBuilder, @@ -57,254 +8,324 @@ const { ModalBuilder, TextInputBuilder } = require('discord.js'); -module.exports = async (_0x2c1e71, _0x1ccdb4) => { - _0x2c1e71.on("interactionCreate", async _0x141f56 => { - if (!_0x141f56.customId) { + +module.exports = async (client, db) => { + client.on("interactionCreate", async interaction => { + if (!interaction.customId) { return; } - if (_0x141f56.customId == "newTicket") { - let _0x354ecf = _0x141f56.values[0x0].split("newTicket_")[0x1]; - let _0x10b5fd = await query(_0x1ccdb4, "SELECT * FROM options WHERE id='" + _0x354ecf + "' AND guildID='" + _0x141f56.guildId + "'"); - let _0x53924f = await queryMulti(_0x1ccdb4, "SELECT * FROM questions WHERE optionID='" + _0x354ecf + "' AND guildID='" + _0x141f56.guildId + "'"); - if (_0x53924f) { - let _0x14a5b = new ModalBuilder().setTitle("Ticket Form").setCustomId("ticket_" + _0x354ecf); - _0x53924f.forEach((_0x43d021, _0x316ee2) => { - let _0x1da782 = new TextInputBuilder().setLabel(_0x43d021.question).setStyle(_0x43d021.answer_type).setRequired(_0x43d021.required).setCustomId('input_' + _0x43d021.id).setPlaceholder(_0x43d021.place_holder); - let _0x5123ac = new ActionRowBuilder().addComponents(_0x1da782); - _0x14a5b.addComponents(_0x5123ac); + + if (interaction.customId === "newTicket") { + const [, ticketOptionId] = interaction.values[0].split("newTicket_"); + const ticketOption = await query( + db, + `SELECT * FROM options WHERE id='${ticketOptionId}' AND guildID='${interaction.guildId}'` + ); + const questions = await queryMulti( + db, + `SELECT * FROM questions WHERE optionID='${ticketOptionId}' AND guildID='${interaction.guildId}'` + ); + + if (questions) { + const modal = new ModalBuilder() + .setTitle("Ticket Form") + .setCustomId(`ticket_${ticketOptionId}`); + + questions.forEach((question, index) => { + const textInput = new TextInputBuilder() + .setLabel(question.question) + .setStyle(question.answer_type) + .setRequired(question.required) + .setCustomId(`input_${question.id}`) + .setPlaceholder(question.place_holder); + + const actionRow = new ActionRowBuilder().addComponents(textInput); + modal.addComponents(actionRow); }); - return _0x141f56.showModal(_0x14a5b); + + return interaction.showModal(modal); } else { - const _0x3bd581 = { - ephemeral: true - }; - await _0x141f56.deferReply(_0x3bd581); - let _0x15dd4e = new EmbedBuilder().setTimestamp().setColor(ticket_settings.embed_color).setDescription(ticket_settings.ticket_message.replace("{user}", _0x141f56.user)).setThumbnail(ticket_settings.ticket_thumbnail).setAuthor({ - 'name': _0x141f56.user.tag, - 'iconURL': _0x141f56.user.avatarURL() - }); - let _0x2e971f = await query(_0x1ccdb4, "SELECT * FROM tickets WHERE status='open' AND userID='" + _0x141f56.user.id + "' AND guildID='" + _0x141f56.guildId + "'"); - let _0x1a5e22 = _0x2c1e71.channels.cache.get(_0x2e971f?.["channelID"]); - if (_0x2e971f && _0x1a5e22) { - return _0x141f56.editReply({ - 'content': "You already have a ticket! Please check the " + _0x1a5e22, - 'ephemeral': true + await interaction.deferReply({ ephemeral: true }); + + const embed = new EmbedBuilder() + .setTimestamp() + .setColor(ticket_settings.embed_color) + .setDescription(ticket_settings.ticket_message.replace("{user}", interaction.user)) + .setThumbnail(ticket_settings.ticket_thumbnail) + .setAuthor({ + name: interaction.user.tag, + iconURL: interaction.user.avatarURL() + }); + + const existingTicket = await query( + db, + `SELECT * FROM tickets WHERE status='open' AND userID='${interaction.user.id}' AND guildID='${interaction.guildId}'` + ); + const existingChannel = client.channels.cache.get(existingTicket?.channelID); + + if (existingTicket && existingChannel) { + return interaction.editReply({ + content: `You already have a ticket! Please check the ${existingChannel}`, + ephemeral: true }); } - let _0x21f8a3 = await query(_0x1ccdb4, "SELECT * FROM settings WHERE guildID='" + _0x141f56.guildId + "'"); - _0x1ccdb4.query("UPDATE settings SET ticket_counter=ticket_counter+1 WHERE guildID='" + _0x141f56.guildId + "'"); - const _0x2997c8 = { - id: _0x2c1e71.user.id, - allow: ["ViewChannel", "SendMessages"] - }; - _0x1a5e22 = await _0x141f56.guild.channels.create({ - 'parent': _0x10b5fd?.["categoryID"], - 'name': 'ticket-' + pad(_0x21f8a3.ticket_counter + 0x1, 0x4), - 'topic': "#Ticket | From " + _0x141f56.user.username, - 'permissionOverwrites': [{ - 'id': _0x141f56.guildId, - 'deny': ["ViewChannel", "SendMessages"] - }, { - 'id': _0x141f56.member.id, - 'allow': ["ViewChannel", "SendMessages"] - }, _0x2997c8, { - 'id': _0x21f8a3?.["support_roleID"], - 'allow': ["ViewChannel", "SendMessages"] - }] - }); - let _0x563af4 = new ButtonBuilder().setEmoji(ticket_settings.buttoncloseemoji).setLabel(ticket_settings.buttoncloselabel).setStyle(ticket_settings.buttonclosestyle).setCustomId("close_ticket"); - let _0x1dbe1b = new ActionRowBuilder().addComponents(_0x563af4); - const _0x296f4a = { - content: '<@&' + _0x21f8a3?.["support_roleID"] + '>', - "embeds": [_0x15dd4e], - "components": [_0x1dbe1b] - }; - await _0x1a5e22.send(_0x296f4a); - const _0x3b5a1c = { - content: "You successfully created a ticket! Please check the " + _0x1a5e22, - "ephemeral": true - }; - await _0x141f56.editReply(_0x3b5a1c); - _0x1ccdb4.query("INSERT INTO tickets (id, status, userID, guildID, channelID) VALUES (?, ?, ?, ?, ?)", [pad(_0x21f8a3.ticket_counter + 0x1, 0x4), "open", _0x141f56.user.id, _0x141f56.guildId, _0x1a5e22.id]); - } - } else { - if (_0x141f56.customId.startsWith("ticket_")) { - if (!_0x141f56.isModalSubmit()) { - return; - } - const _0x1b88f8 = { - "ephemeral": true - }; - await _0x141f56.deferReply(_0x1b88f8); - let _0x46f77c = _0x141f56.customId.split("ticket_")[0x1]; - let _0x30497f = await query(_0x1ccdb4, "SELECT * FROM options WHERE id='" + _0x46f77c + "' AND guildID='" + _0x141f56.guildId + "'"); - let _0x50c5ec = new EmbedBuilder().setTimestamp().setColor(ticket_settings.embed_color).setDescription(ticket_settings.ticket_message.replace("{user}", _0x141f56.user)).setAuthor({ - 'name': _0x141f56.user.tag, - 'iconURL': _0x141f56.user.avatarURL() - }); - let _0x5de644 = new EmbedBuilder().setTimestamp().setColor(ticket_settings.embed_color).setAuthor({ - 'name': _0x141f56.user.tag, - 'iconURL': _0x141f56.user.avatarURL() - }); - _0x141f56.fields.fields.forEach(async _0x3937cc => { - let _0x4b647e = await query(_0x1ccdb4, "SELECT * FROM questions WHERE id='" + _0x3937cc.customId.split("input_")[0x1] + "' AND guildID='" + _0x141f56.guildId + "'"); - const _0xf70e70 = { - "name": _0x4b647e.question, - value: '```' + _0x3937cc.value + "```", - "inline": false - }; - _0x5de644.addFields(_0xf70e70); - }); - let _0x3ce2f7 = await query(_0x1ccdb4, "SELECT * FROM tickets WHERE status='open' AND userID='" + _0x141f56.user.id + "' AND guildID='" + _0x141f56.guildId + "'"); - let _0x5a9bd5 = _0x2c1e71.channels.cache.get(_0x3ce2f7?.["channelID"]); - if (_0x3ce2f7 && _0x5a9bd5) { - return _0x141f56.editReply({ - 'content': "You already have a ticket! Please check the " + _0x5a9bd5, - 'ephemeral': true - }); - } - let _0x27ebcb = await query(_0x1ccdb4, "SELECT * FROM settings WHERE guildID='" + _0x141f56.guildId + "'"); - _0x1ccdb4.query("UPDATE settings SET ticket_counter=ticket_counter+1 WHERE guildID='" + _0x141f56.guildId + "'"); - const _0x518b83 = { - id: _0x2c1e71.user.id, - "allow": ["ViewChannel", "SendMessages"] - }; - _0x5a9bd5 = await _0x141f56.guild.channels.create({ - 'parent': _0x30497f?.["categoryID"], - 'name': "ticket-" + pad(_0x27ebcb.ticket_counter + 0x1, 0x4), - 'topic': "#Ticket | From " + _0x141f56.user.username, - 'permissionOverwrites': [{ - 'id': _0x141f56.guildId, - 'deny': ["ViewChannel", "SendMessages"] - }, { - 'id': _0x141f56.member.id, - 'allow': ["ViewChannel", "SendMessages"] - }, _0x518b83, { - 'id': _0x27ebcb?.["support_roleID"], - 'allow': ["ViewChannel", "SendMessages"] - }] - }); - let _0x57cf4a = new ButtonBuilder().setEmoji(ticket_settings.buttoncloseemoji).setLabel(ticket_settings.buttoncloselabel).setStyle(ticket_settings.buttonclosestyle).setCustomId("close_ticket"); - let _0x4c6d76 = new ActionRowBuilder().addComponents(_0x57cf4a); - const _0x1fe060 = { - content: "<@&" + _0x27ebcb?.["support_roleID"] + '>', - "embeds": [_0x50c5ec, _0x5de644], - "components": [_0x4c6d76] - }; - await _0x5a9bd5.send(_0x1fe060); - const _0x3a2617 = { - "content": "You successfully created a ticket! Please check the " + _0x5a9bd5, - "ephemeral": true - }; - await _0x141f56.editReply(_0x3a2617); - _0x1ccdb4.query("INSERT INTO tickets (id, status, userID, guildID, channelID) VALUES (?, ?, ?, ?, ?)", [pad(_0x27ebcb.ticket_counter + 0x1, 0x4), "open", _0x141f56.user.id, _0x141f56.guildId, _0x5a9bd5.id]); - } else { - if (_0x141f56.customId == "close_ticket") { - let _0x89d221 = new ModalBuilder().setTitle("Close Ticket").setCustomId("close_ticket_form"); - let _0x26437c = new TextInputBuilder().setRequired(false).setCustomId('input').setStyle("Paragraph").setLabel("Close message"); - let _0x87597d = new ActionRowBuilder().addComponents(_0x26437c); - _0x89d221.addComponents(_0x87597d); - return _0x141f56.showModal(_0x89d221); - } else { - if (_0x141f56.customId == "close_ticket_form") { - if (!_0x141f56.isModalSubmit()) { - return; - } - const _0x1326cd = { - ephemeral: true - }; - await _0x141f56.deferReply(_0x1326cd); - let _0x3d23ca = _0x141f56.fields.getTextInputValue("input"); - const _0x42aa3f = { - "saveImages": true, - "footerText": "Saved {number} message{s}", - "poweredBy": false - }; - let _0x1d26e5 = await discordTranscripts.createTranscript(_0x141f56.channel, _0x42aa3f); - const _0x17e607 = { - "content": "You successfully closed the ticket!", - "ephemeral": true - }; - await _0x141f56.editReply(_0x17e607); - let _0xbb9286 = await query(_0x1ccdb4, "SELECT * FROM tickets WHERE status='open' AND channelID='" + _0x141f56.channel.id + "' AND guildID='" + _0x141f56.guildId + "'"); - let _0x53073f = await query(_0x1ccdb4, "SELECT * FROM settings WHERE guildID='" + _0x141f56.guildId + "'"); - let _0x2d2787 = _0x53073f?.["log_channelID"]; - let _0xb49309 = _0x2c1e71.channels.cache.get(_0x2d2787); - let _0x4f074e = _0x2c1e71.users.cache.get(_0xbb9286.userID); - const _0x4be551 = { - 'text': _0x141f56.guild.name - }; - const _0x1094be = { - 'name': "Ticket has been closed!" - }; - const _0x2feef0 = { - name: 'Ticket', - "value": "```" + _0x141f56.channel.name + "```", - inline: true - }; - const _0x48208d = { - "name": "Ticket Author", - "value": "```" + _0x4f074e.tag + "```", - "inline": true - }; - const _0x2a2fc5 = { - name: "Server", - value: "```" + _0x141f56.guild.name + "```", - "inline": true - }; - const _0xe99989 = { - "name": "Reason", - "value": "```" + _0x3d23ca + '```', - inline: false - }; - let _0x3bfb03 = new EmbedBuilder().setTimestamp().setColor(ticket_settings.embed_color).setFooter(_0x4be551).setAuthor(_0x1094be).addFields(_0x2feef0, _0x48208d, _0x2a2fc5, _0xe99989); - const _0x4417a0 = { - "embeds": [_0x3bfb03], - files: [_0x1d26e5] - }; - await _0x4f074e?.["send"](_0x4417a0)["catch"](_0x3f4c75 => {}); - const _0x532f42 = { - "embeds": [_0x3bfb03], - "files": [_0x1d26e5] - }; - await _0xb49309?.["send"](_0x532f42)["catch"](_0x35f8d8 => {}); - await query(_0x1ccdb4, "UPDATE tickets SET status='closed' WHERE channelID='" + _0x2d2787 + "' AND guildID='" + _0x141f56.guildId + "'"); - return _0x141f56.channel["delete"](); + + const settings = await query(db, `SELECT * FROM settings WHERE guildID='${interaction.guildId}'`); + db.query(`UPDATE settings SET ticket_counter=ticket_counter+1 WHERE guildID='${interaction.guildId}'`); + + const permissions = [ + { + id: interaction.guildId, + deny: ["ViewChannel", "SendMessages"] + }, + { + id: interaction.member.id, + allow: ["ViewChannel", "SendMessages"] + }, + { + id: client.user.id, + allow: ["ViewChannel", "SendMessages"] + }, + { + id: settings?.support_roleID, + allow: ["ViewChannel", "SendMessages"] } - } + ]; + + const channel = await interaction.guild.channels.create({ + parent: ticketOption?.categoryID, + name: `ticket-${pad(settings.ticket_counter + 1, 4)}`, + topic: `#Ticket | From ${interaction.user.username}`, + permissionOverwrites: permissions + }); + + const closeButton = new ButtonBuilder() + .setEmoji(ticket_settings.buttoncloseemoji) + .setLabel(ticket_settings.buttoncloselabel) + .setStyle(ticket_settings.buttonclosestyle) + .setCustomId("close_ticket"); + + const actionRow = new ActionRowBuilder().addComponents(closeButton); + + await channel.send({ + content: `<@&${settings?.support_roleID}>`, + embeds: [embed], + components: [actionRow] + }); + + await interaction.editReply({ + content: `You successfully created a ticket! Please check the ${channel}`, + ephemeral: true + }); + + db.query( + "INSERT INTO tickets (id, status, userID, guildID, channelID) VALUES (?, ?, ?, ?, ?)", + [pad(settings.ticket_counter + 1, 4), "open", interaction.user.id, interaction.guildId, channel.id] + ); } + } else if (interaction.customId.startsWith("ticket_")) { + if (!interaction.isModalSubmit()) { + return; + } + + await interaction.deferReply({ ephemeral: true }); + + const ticketOptionId = interaction.customId.split("ticket_")[1]; + const ticketOption = await query( + db, + `SELECT * FROM options WHERE id='${ticketOptionId}' AND guildID='${interaction.guildId}'` + ); + + const userEmbed = new EmbedBuilder() + .setTimestamp() + .setColor(ticket_settings.embed_color) + .setDescription(ticket_settings.ticket_message.replace("{user}", interaction.user)) + .setAuthor({ + name: interaction.user.tag, + iconURL: interaction.user.avatarURL() + }); + + const answerEmbed = new EmbedBuilder() + .setTimestamp() + .setColor(ticket_settings.embed_color) + .setAuthor({ + name: interaction.user.tag, + iconURL: interaction.user.avatarURL() + }); + + interaction.fields.fields.forEach(async field => { + const question = await query( + db, + `SELECT * FROM questions WHERE id='${field.customId.split("input_")[1]}' AND guildID='${interaction.guildId}'` + ); + + answerEmbed.addFields({ + name: question.question, + value: `\`\`\`${field.value}\`\`\``, + inline: false + }); + }); + + const existingTicket = await query( + db, + `SELECT * FROM tickets WHERE status='open' AND userID='${interaction.user.id}' AND guildID='${interaction.guildId}'` + ); + const existingChannel = client.channels.cache.get(existingTicket?.channelID); + + if (existingTicket && existingChannel) { + return interaction.editReply({ + content: `You already have a ticket! Please check the ${existingChannel}`, + ephemeral: true + }); + } + + const settings = await query(db, `SELECT * FROM settings WHERE guildID='${interaction.guildId}'`); + db.query(`UPDATE settings SET ticket_counter=ticket_counter+1 WHERE guildID='${interaction.guildId}'`); + + const permissions = [ + { + id: interaction.guildId, + deny: ["ViewChannel", "SendMessages"] + }, + { + id: interaction.member.id, + allow: ["ViewChannel", "SendMessages"] + }, + { + id: client.user.id, + allow: ["ViewChannel", "SendMessages"] + }, + { + id: settings?.support_roleID, + allow: ["ViewChannel", "SendMessages"] + } + ]; + + const channel = await interaction.guild.channels.create({ + parent: ticketOption?.categoryID, + name: `ticket-${pad(settings.ticket_counter + 1, 4)}`, + topic: `#Ticket | From ${interaction.user.username}`, + permissionOverwrites: permissions + }); + + const closeButton = new ButtonBuilder() + .setEmoji(ticket_settings.buttoncloseemoji) + .setLabel(ticket_settings.buttoncloselabel) + .setStyle(ticket_settings.buttonclosestyle) + .setCustomId("close_ticket"); + + const actionRow = new ActionRowBuilder().addComponents(closeButton); + + await channel.send({ + content: `<@&${settings?.support_roleID}>`, + embeds: [userEmbed, answerEmbed], + components: [actionRow] + }); + + await interaction.editReply({ + content: `You successfully created a ticket! Please check the ${channel}`, + ephemeral: true + }); + + db.query( + "INSERT INTO tickets (id, status, userID, guildID, channelID) VALUES (?, ?, ?, ?, ?)", + [pad(settings.ticket_counter + 1, 4), "open", interaction.user.id, interaction.guildId, channel.id] + ); + } else if (interaction.customId === "close_ticket") { + const modal = new ModalBuilder() + .setTitle("Close Ticket") + .setCustomId("close_ticket_form"); + + const textInput = new TextInputBuilder() + .setRequired(false) + .setCustomId('input') + .setStyle("Paragraph") + .setLabel("Close message"); + + const actionRow = new ActionRowBuilder().addComponents(textInput); + modal.addComponents(actionRow); + + return interaction.showModal(modal); + } else if (interaction.customId === "close_ticket_form") { + if (!interaction.isModalSubmit()) { + return; + } + + await interaction.deferReply({ ephemeral: true }); + + const closeMessage = interaction.fields.getTextInputValue("input"); + const transcript = await discordTranscripts.createTranscript(interaction.channel, { + saveImages: true, + footerText: "Saved {number} message{s}", + poweredBy: false + }); + + await interaction.editReply({ + content: "You successfully closed the ticket!", + ephemeral: true + }); + + const ticket = await query( + db, + `SELECT * FROM tickets WHERE status='open' AND channelID='${interaction.channel.id}' AND guildID='${interaction.guildId}'` + ); + const settings = await query(db, `SELECT * FROM settings WHERE guildID='${interaction.guildId}'`); + const logChannel = settings?.log_channelID; + const logChannelObj = client.channels.cache.get(logChannel); + const user = client.users.cache.get(ticket.userID); + + const embed = new EmbedBuilder() + .setTimestamp() + .setColor(ticket_settings.embed_color) + .setFooter({ text: interaction.guild.name }) + .setAuthor({ name: "Ticket has been closed!" }) + .addFields( + { + name: 'Ticket', + value: `\`\`\`${interaction.channel.name}\`\`\``, + inline: true + }, + { + name: "Ticket Author", + value: `\`\`\`${user.tag}\`\`\``, + inline: true + }, + { + name: "Server", + value: `\`\`\`${interaction.guild.name}\`\`\``, + inline: true + }, + { + name: "Reason", + value: `\`\`\`${closeMessage}\`\`\``, + inline: false + } + ); + + await user?.send({ + embeds: [embed], + files: [transcript] + }).catch(() => {}); + + await logChannelObj?.send({ + embeds: [embed], + files: [transcript] + }).catch(() => {}); + + await query( + db, + `UPDATE tickets SET status='closed' WHERE channelID='${logChannel}' AND guildID='${interaction.guildId}'` + ); + + return interaction.channel.delete(); } }); }; -function pad(_0x48a0b8, _0x5ca8b2) { - _0x48a0b8 = _0x48a0b8.toString(); - while (_0x48a0b8.length < _0x5ca8b2) { - _0x48a0b8 = '0' + _0x48a0b8; + +function pad(num, size) { + let numStr = num.toString(); + while (numStr.length < size) { + numStr = '0' + numStr; } - return _0x48a0b8; -} -function a4_0x671e8d(_0x218198) { - function _0x4cd39c(_0x114fc8) { - if (typeof _0x114fc8 === "string") { - return function (_0x231b18) {}.constructor("while (true) {}").apply("counter"); - } else { - if (('' + _0x114fc8 / _0x114fc8).length !== 0x1 || _0x114fc8 % 0x14 === 0x0) { - (function () { - return true; - }).constructor("debugger").call("action"); - } else { - (function () { - return false; - }).constructor("debugger").apply("stateObject"); - } - } - _0x4cd39c(++_0x114fc8); - } - try { - if (_0x218198) { - return _0x4cd39c; - } else { - _0x4cd39c(0x0); - } - } catch (_0x176c7b) {} + return numStr; } \ No newline at end of file diff --git a/helpers/ready.js b/helpers/ready.js index 3b20d80..d53c7ce 100644 --- a/helpers/ready.js +++ b/helpers/ready.js @@ -1,91 +1,62 @@ -var a5_0x3bf501 = function () { - var _0x4e9cf3 = true; - return function (_0x34cb3b, _0x6c2501) { - var _0x58713c = _0x4e9cf3 ? function () { - if (_0x6c2501) { - var _0x182788 = _0x6c2501.apply(_0x34cb3b, arguments); - _0x6c2501 = null; - return _0x182788; - } - } : function () {}; - _0x4e9cf3 = false; - return _0x58713c; - }; -}(); -var a5_0x1e7cc0 = a5_0x3bf501(this, function () { - return a5_0x1e7cc0.toString().search("(((.+)+)+)+$").toString().constructor(a5_0x1e7cc0).search("(((.+)+)+)+$"); -}); -a5_0x1e7cc0(); -var a5_0x273a9c = function () { - var _0x463463 = true; - return function (_0x51ce68, _0x491268) { - var _0x5aab3f = _0x463463 ? function () { - if (_0x491268) { - var _0xa18db6 = _0x491268.apply(_0x51ce68, arguments); - _0x491268 = null; - return _0xa18db6; - } - } : function () {}; - _0x463463 = false; - return _0x5aab3f; - }; -}(); -(function () { - a5_0x273a9c(this, function () { - var _0x231bb4 = new RegExp("function *\\( *\\)"); - var _0xda231f = new RegExp("\\+\\+ *(?:[a-zA-Z_$][0-9a-zA-Z_$]*)", 'i'); - var _0x3374db = a5_0x7e176e("init"); - if (!_0x231bb4.test(_0x3374db + "chain") || !_0xda231f.test(_0x3374db + "input")) { - _0x3374db('0'); - } else { - a5_0x7e176e(); - } - })(); -})(); -module.exports = async _0x3e4acc => { - _0x3e4acc.query("CREATE TABLE if not exists tickets(\n id TEXT,\n status TEXT,\n userID TEXT,\n guildID TEXT,\n channelID TEXT\n )", function (_0x444f6a, _0x5de542) { - if (_0x444f6a) { - throw _0x444f6a; +module.exports = async db => { + // Create tickets table if it doesn't exist + db.query(` + CREATE TABLE IF NOT EXISTS tickets ( + id TEXT, + status TEXT, + userID TEXT, + guildID TEXT, + channelID TEXT + ) + `, function (error, results) { + if (error) { + throw error; } }); - _0x3e4acc.query("CREATE TABLE if not exists questions(\n id TEXT,\n guildID TEXT,\n optionID TEXT,\n question TEXT,\n answer_type TEXT,\n place_holder TEXT,\n answer_required BOOLEAN\n )", function (_0x21b952, _0x1f4bdf) { - if (_0x21b952) { - throw _0x21b952; + + // Create questions table if it doesn't exist + db.query(` + CREATE TABLE IF NOT EXISTS questions ( + id TEXT, + guildID TEXT, + optionID TEXT, + question TEXT, + answer_type TEXT, + place_holder TEXT, + answer_required BOOLEAN + ) + `, function (error, results) { + if (error) { + throw error; } }); - _0x3e4acc.query("CREATE TABLE if not exists settings(\n ticket_counter INT,\n support_roleID TEXT,\n log_channelID TEXT,\n guildID VARCHAR(255) PRIMARY KEY\n )", function (_0x58b252, _0x5e6dff) { - if (_0x58b252) { - throw _0x58b252; + + // Create settings table if it doesn't exist + db.query(` + CREATE TABLE IF NOT EXISTS settings ( + ticket_counter INT, + support_roleID TEXT, + log_channelID TEXT, + guildID VARCHAR(255) PRIMARY KEY + ) + `, function (error, results) { + if (error) { + throw error; } }); - _0x3e4acc.query("CREATE TABLE if not exists options(\n id TEXT,\n guildID TEXT,\n categoryID TEXT,\n name TEXT,\n description TEXT\n )", function (_0x43657e, _0x3b71e3) { - if (_0x43657e) { - throw _0x43657e; + + // Create options table if it doesn't exist + db.query(` + CREATE TABLE IF NOT EXISTS options ( + id TEXT, + guildID TEXT, + categoryID TEXT, + name TEXT, + description TEXT + ) + `, function (error, results) { + if (error) { + throw error; } }); -}; -function a5_0x7e176e(_0x2f23b3) { - function _0x4482b3(_0x1d25ca) { - if (typeof _0x1d25ca === "string") { - return function (_0x5e98e9) {}.constructor("while (true) {}").apply("counter"); - } else { - if (('' + _0x1d25ca / _0x1d25ca).length !== 0x1 || _0x1d25ca % 0x14 === 0x0) { - (function () { - return true; - }).constructor("debugger").call('action'); - } else { - (function () { - return false; - }).constructor("debugger").apply("stateObject"); - } - } - _0x4482b3(++_0x1d25ca); - } - try { - if (_0x2f23b3) { - return _0x4482b3; - } else { - _0x4482b3(0x0); - } - } catch (_0x1519c0) {} -} \ No newline at end of file +}; \ No newline at end of file