Compare commits

...
34 Commits
Author SHA1 Message Date
Xiled Emerald 213f532a3c Merge pull request #114 from Emerald-Services/dev
7.5 push
2022-02-27 04:37:24 +00:00
ItzEmerald 45bd88e4d2 7.5 commit 2022-02-27 04:30:15 +00:00
Xiled Emerald 4eb8658459 Update supportbot.yml 2022-02-27 00:39:36 +00:00
Noah b37118fee2 Fix addon handler 2022-02-25 21:57:54 -06:00
Noah 026caba68a Fix setFooters 2022-02-25 21:55:33 -06:00
Noah 2003f8801a Fixed ticket perms 2022-02-25 21:51:22 -06:00
Noah 473bacf13a Removed Guild 2022-02-17 19:57:37 -06:00
Noah 8b3f2bc61a Fix missing user or subuser 2022-02-17 19:57:11 -06:00
Noah 3aa373c33c fix bad code 2022-02-11 23:47:06 -06:00
Noah 9b6263e583 Fix DM help menu 2022-02-11 23:41:02 -06:00
Noah 3e066d08ce New Departments 2022-02-11 23:34:38 -06:00
Noah aa48e28162 Fix Typos 2022-02-04 20:00:31 -06:00
Noah dc660ed94a Bug Fixes 2022-02-04 17:56:11 -06:00
Noah e02ecf9553 Bug fixes 2022-02-04 17:55:02 -06:00
Noah 23acc0926f Fix BitField Error 2022-02-04 17:49:02 -06:00
Xiled Emerald 3fc1cd18d5 Merge pull request #109 from Emerald-Services/dev
7.4.2 Pull Request
2022-02-03 17:26:54 +00:00
Noah ebe29b403e Prettier 2022-01-30 00:07:04 -06:00
Noah dcba3312dd Misc 2022-01-29 23:57:10 -06:00
Noah 7fddeeec37 Change Max to 100 2022-01-10 17:48:31 -06:00
Noah b5341b023f Fix embed command 2021-12-29 10:20:29 -06:00
Noah bbb7443ef2 Fix suggest command 2021-12-28 19:06:35 -06:00
Noah 22df347bb9 Merge pull request #108 from astranger1k/dev
Updated Documentation URLs + Added invite URL to log upon launch.
2021-12-23 09:18:47 -06:00
Kieran Davies 9aed6b8f35 Updated Documentation URLs + Added invite URL to log upon launch. 2021-12-23 11:48:51 +00:00
Noah 9e7ec9f1bd 7.4.2 2021-12-19 13:06:32 -06:00
Noah 373f43eac5 Channel can now be id or name 2021-12-19 13:03:33 -06:00
Noah 6c91b2791a Fix users can't send messages 2021-12-19 13:02:43 -06:00
Noah bde62a431f Merge branch 'dev' into release 2021-12-18 22:59:41 -06:00
Noah 615a074540 move filter 2021-12-18 22:59:05 -06:00
Noah 09b335ac46 Update ticket.js 2021-12-18 22:42:51 -06:00
Noah 2701880c77 Merge pull request #106 from Emerald-Services/dev
v7.4.1 Release
2021-12-18 22:37:29 -06:00
Noah 24c8f2fb38 v7.4.1 2021-12-18 22:28:08 -06:00
Noah c3ec158ac3 Fix id 2021-12-18 22:23:18 -06:00
Noah b3690222d0 Fixed id 2021-12-18 22:18:05 -06:00
Noah 4d7583785b Fixed ticket id 2021-12-18 22:14:11 -06:00
24 changed files with 471 additions and 484 deletions

No files matched your search

+1 -1
View File
@@ -1,4 +1,4 @@
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node # This workflow will do a clean installation of node dependencies, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
name: Node.js CI name: Node.js CI
+5 -5
View File
@@ -26,7 +26,7 @@ module.exports = new Command({
permissions: ["SEND_MESSAGES"], permissions: ["SEND_MESSAGES"],
async run(interaction) { async run(interaction) {
const { getRole, getChannel, getCategory } = interaction.client; const { getRole } = interaction.client;
let SupportStaff = await getRole(supportbot.Staff, interaction.guild); let SupportStaff = await getRole(supportbot.Staff, interaction.guild);
let Admin = await getRole(supportbot.Admin, interaction.guild); let Admin = await getRole(supportbot.Admin, interaction.guild);
if (!SupportStaff || !Admin) if (!SupportStaff || !Admin)
@@ -51,12 +51,12 @@ module.exports = new Command({
fs.readFileSync("./Data/TicketData.json", "utf8") fs.readFileSync("./Data/TicketData.json", "utf8")
); );
let ticket = await TicketData.tickets.findIndex( let ticket = await TicketData.tickets.findIndex(
(t) => t.id == interaction.channel.id (t) => t.id === interaction.channel.id
); );
if (ticket == -1) { if (ticket === -1) {
const Exists = new Discord.MessageEmbed() const Exists = new Discord.MessageEmbed()
.setTitle("No Ticket Found!") .setTitle("No Ticket Found!")
.setDescription(`${supportbot.NoValidTicket}`) .setDescription(supportbot.NoValidTicket)
.setColor(supportbot.WarningColour); .setColor(supportbot.WarningColour);
return interaction.reply({ embeds: [Exists] }); return interaction.reply({ embeds: [Exists] });
} }
@@ -71,7 +71,7 @@ module.exports = new Command({
if (!uMember) return interaction.reply({ embeds: [UserNotExist] }); if (!uMember) return interaction.reply({ embeds: [UserNotExist] });
interaction.channel.permissionOverwrites.edit(uMember.id, { await interaction.channel.permissionOverwrites.edit(uMember.id, {
VIEW_CHANNEL: true, VIEW_CHANNEL: true,
}); });
const Complete = new Discord.MessageEmbed() const Complete = new Discord.MessageEmbed()
+37 -20
View File
@@ -25,7 +25,7 @@ module.exports = new Command({
permissions: ["SEND_MESSAGES"], permissions: ["SEND_MESSAGES"],
async run(interaction) { async run(interaction) {
const { getRole, getChannel, getCategory } = interaction.client; const { getRole, getChannel } = interaction.client;
if (supportbot.StaffOnly) { if (supportbot.StaffOnly) {
let SupportStaff = await getRole(supportbot.Staff, interaction.guild); let SupportStaff = await getRole(supportbot.Staff, interaction.guild);
let Admin = await getRole(supportbot.Admin, interaction.guild); let Admin = await getRole(supportbot.Admin, interaction.guild);
@@ -49,18 +49,19 @@ module.exports = new Command({
await interaction.deferReply(); await interaction.deferReply();
let tickets = await JSON.parse( let tickets = await JSON.parse(
fs.readFileSync("./Data/TicketData.json", "utf8") fs.readFileSync("./Data/TicketData.json", "utf8")
).tickets.find((t) => t.id === interaction.channel.id);
let TicketData = await tickets.tickets.findIndex(
(t) => t.id == ticketChannel.id
); );
if (!TicketData) { let TicketData = await tickets.tickets.findIndex(
(t) => t.id === interaction.channel.id
);
let ticket = tickets.tickets[TicketData];
if (TicketData === -1) {
const Exists = new Discord.MessageEmbed() const Exists = new Discord.MessageEmbed()
.setTitle("No Ticket Found!") .setTitle("No Ticket Found!")
.setDescription(`${supportbot.NoValidTicket}`) .setDescription(supportbot.NoValidTicket)
.setColor(supportbot.WarningColour); .setColor(supportbot.WarningColour);
return interaction.followUp({ embeds: [Exists] }); return interaction.followUp({ embeds: [Exists] });
} }
let tUser = interaction.client.users.cache.get(TicketData.user); let tUser = interaction.client.users.cache.get(ticket.user);
let transcriptChannel = await getChannel( let transcriptChannel = await getChannel(
supportbot.TranscriptLog, supportbot.TranscriptLog,
interaction.guild interaction.guild
@@ -80,8 +81,8 @@ module.exports = new Command({
.setColor(supportbot.EmbedColour); .setColor(supportbot.EmbedColour);
await interaction.followUp({ embeds: [CloseTicketRequest] }); await interaction.followUp({ embeds: [CloseTicketRequest] });
let filter = (m) => let filter = (m) =>
m.content.toLowerCase() == supportbot.ClosingConfirmation_Word && m.content.toLowerCase() === supportbot.ClosingConfirmation_Word &&
m.author.id == interaction.user.id; m.author.id === interaction.user.id;
await interaction.channel.awaitMessages({ await interaction.channel.awaitMessages({
filter, filter,
max: 1, max: 1,
@@ -102,32 +103,42 @@ module.exports = new Command({
const transcriptEmbed = new Discord.MessageEmbed() const transcriptEmbed = new Discord.MessageEmbed()
.setTitle(supportbot.TranscriptTitle) .setTitle(supportbot.TranscriptTitle)
.setColor(supportbot.EmbedColour) .setColor(supportbot.EmbedColour)
.setFooter(supportbot.EmbedFooter) .setFooter({
text: supportbot.EmbedFooter,
iconURL: interaction.user.displayAvatarURL(),
})
.addField( .addField(
"Ticket", "Ticket",
`${interaction.channel.name} (${interaction.channel.id})` `${interaction.channel.name} (${interaction.channel.id})`
) )
.addField( .addField(
"User", "User",
`${tUser.username}#${tUser.discriminator} (${tUser.id})` `${tUser?.username || "N/A"}#${tUser?.discriminator || "N/A"} (${
tUser?.id || ticket.user
})`
) )
.addField("Closed By", interaction.user.tag) .addField("Closed By", interaction.user.tag)
.addField("Reason", reason); .addField("Reason", reason);
const logEmbed = new Discord.MessageEmbed() const logEmbed = new Discord.MessageEmbed()
.setTitle(supportbot.TicketLog_Title) .setTitle(supportbot.TicketLog_Title)
.setColor(supportbot.EmbedColour) .setColor(supportbot.EmbedColour)
.setFooter(supportbot.EmbedFooter) .setFooter({
text: supportbot.EmbedFooter,
iconURL: interaction.user.displayAvatarURL(),
})
.addField( .addField(
"Ticket", "Ticket",
`${interaction.channel.name} (${interaction.channel.id})` `${interaction.channel.name} (${interaction.channel.id})`
) )
.addField( .addField(
"User", "User",
`${tUser.username}#${tUser.discriminator} (${tUser.id})` `${tUser?.username || "N/A"}#${tUser?.discriminator || "N/A"} (${
tUser?.id || ticket.user
})`
) )
.addField("Closed By", interaction.user.tag) .addField("Closed By", interaction.user.tag)
.addField("Reason", reason); .addField("Reason", reason);
let msgs = await interaction.channel.messages.fetch(); let msgs = await interaction.channel.messages.fetch({ limit: 100 });
let html = ""; let html = "";
msgs = msgs.sort((a, b) => a.createdTimestamp - b.createdTimestamp); msgs = msgs.sort((a, b) => a.createdTimestamp - b.createdTimestamp);
@@ -157,18 +168,24 @@ module.exports = new Command({
.catch(async (err) => { .catch(async (err) => {
console.error(err); console.error(err);
}); });
await tUser
.send({ embeds: [transcriptEmbed], files: [file] }) if (supportbot.DMTranscripts) {
await tUser
?.send({ embeds: [transcriptEmbed], files: [file] })
.catch(async (err) => { .catch(async (err) => {
console.error(err); console.error(err);
}); });
if (TicketData.subUsers) { if (ticket.subUsers) {
TicketData.subUsers.forEach(async (subUser) => { ticket.subUsers.forEach(async (subUser) => {
interaction.client.users.cache await interaction.client.users.cache
.get(subUser) .get(subUser)
.send({ embeds: [transcriptEmbed], files: [file] }); ?.send({ embeds: [transcriptEmbed], files: [file] });
}); });
} }
}
await interaction.channel.delete().catch(async (error) => { await interaction.channel.delete().catch(async (error) => {
console.error(error); console.error(error);
if (error.code !== Discord.Constants.APIErrors.UNKNOWN_CHANNEL) { if (error.code !== Discord.Constants.APIErrors.UNKNOWN_CHANNEL) {
+48 -2
View File
@@ -20,18 +20,55 @@ module.exports = new Command({
name: "title", name: "title",
description: "Embed Title", description: "Embed Title",
type: "STRING", type: "STRING",
required: true,
}, },
{ {
name: "message", name: "message",
description: "Embed Message", description: "Embed Message",
type: "STRING", type: "STRING",
required: true,
},
{
name: "color",
description: "Embed HEX Color",
type: "STRING",
required: false,
},
{
name: "fieldtitle",
description: "Add an additional Embed Field",
type: "STRING",
required: false,
},
{
name: "fieldcontent",
description: "Add an additional Embed Field",
type: "STRING",
required: false,
},
{
name: "thumbnail",
description: "Embed Thumbnail URL",
type: "STRING",
required: false,
},
{
name: "image",
description: "Embed Image URL",
type: "STRING",
required: false,
}, },
], ],
permissions: ["SEND_MESSAGES"], permissions: ["SEND_MESSAGES"],
async run(interaction) { async run(interaction) {
const { getRole, getChannel, getCategory } = interaction.client; const { getRole } = interaction.client;
let SupportStaff = await getRole(supportbot.Staff, interaction.guild); let SupportStaff = await getRole(supportbot.Staff, interaction.guild);
let Admin = await getRole(supportbot.Admin, interaction.guild); let Admin = await getRole(supportbot.Admin, interaction.guild);
@@ -52,10 +89,19 @@ module.exports = new Command({
) { ) {
const EmbedTitle = interaction.options.getString("title"); const EmbedTitle = interaction.options.getString("title");
const EmbedSubject = interaction.options.getString("message"); const EmbedSubject = interaction.options.getString("message");
const EmbedColour = interaction.options.getString("color");
const EmbedThumbnail = interaction.options.getString("thumbnail");
const EmbedImage = interaction.options.getString("image");
const EmbedFieldContent = interaction.options.getString("fieldcontent");
const EmbedFieldTitle = interaction.options.getString("fieldtitle");
const EmbedMsg = new Discord.MessageEmbed() const EmbedMsg = new Discord.MessageEmbed()
.setTitle(EmbedTitle) .setTitle(EmbedTitle)
.setDescription(EmbedSubject); .setDescription(EmbedSubject)
.addField(EmbedFieldTitle, EmbedFieldContent)
.setColor(EmbedColour)
.setThumbnail(EmbedThumbnail)
.setImage(EmbedImage);
interaction.reply({ interaction.reply({
embeds: [EmbedMsg], embeds: [EmbedMsg],
+6 -9
View File
@@ -12,12 +12,6 @@ const cmdconfig = yaml.load(fs.readFileSync("./Configs/commands.yml", "utf8"));
const Command = require("../Structures/Command.js"); const Command = require("../Structures/Command.js");
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}
module.exports = new Command({ module.exports = new Command({
name: cmdconfig.HelpCommand, name: cmdconfig.HelpCommand,
description: cmdconfig.HelpCommandDesc, description: cmdconfig.HelpCommandDesc,
@@ -25,7 +19,7 @@ module.exports = new Command({
permissions: ["SEND_MESSAGES"], permissions: ["SEND_MESSAGES"],
async run(interaction) { async run(interaction) {
const { getRole, getChannel, getCategory } = interaction.client; const { getRole } = interaction.client;
let SupportStaff = await getRole(supportbot.Staff, interaction.guild); let SupportStaff = await getRole(supportbot.Staff, interaction.guild);
let Admin = await getRole(supportbot.Admin, interaction.guild); let Admin = await getRole(supportbot.Admin, interaction.guild);
if (!SupportStaff || !Admin) if (!SupportStaff || !Admin)
@@ -64,7 +58,10 @@ module.exports = new Command({
) )
.setColor(supportbot.EmbedColour) .setColor(supportbot.EmbedColour)
.setFooter(supportbot.EmbedFooter, interaction.user.displayAvatarURL()); .setFooter({
text: supportbot.EmbedFooter,
iconURL: interaction.user.displayAvatarURL(),
});
if ( if (
interaction.member.roles.cache.has(SupportStaff.id) || interaction.member.roles.cache.has(SupportStaff.id) ||
@@ -78,7 +75,7 @@ module.exports = new Command({
} }
if (supportbot.SendHelpPage === "dm") { if (supportbot.SendHelpPage === "dm") {
interaction.user.reply({ interaction.user.send({
embeds: [HelpEmbed1], embeds: [HelpEmbed1],
}); });
} }
+6 -12
View File
@@ -12,12 +12,6 @@ const cmdconfig = yaml.load(fs.readFileSync("./Configs/commands.yml", "utf8"));
const Command = require("../Structures/Command.js"); const Command = require("../Structures/Command.js");
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}
module.exports = new Command({ module.exports = new Command({
name: cmdconfig.TicketRemove, name: cmdconfig.TicketRemove,
description: cmdconfig.TicketRemoveDesc, description: cmdconfig.TicketRemoveDesc,
@@ -32,7 +26,7 @@ module.exports = new Command({
permissions: ["SEND_MESSAGES"], permissions: ["SEND_MESSAGES"],
async run(interaction) { async run(interaction) {
const { getRole, getChannel, getCategory } = interaction.client; const { getRole } = interaction.client;
let Staff = await getRole(supportbot.Staff, interaction.guild); let Staff = await getRole(supportbot.Staff, interaction.guild);
let Admin = await getRole(supportbot.Admin, interaction.guild); let Admin = await getRole(supportbot.Admin, interaction.guild);
if (!Staff || !Admin) if (!Staff || !Admin)
@@ -56,12 +50,12 @@ module.exports = new Command({
fs.readFileSync("./Data/TicketData.json", "utf8") fs.readFileSync("./Data/TicketData.json", "utf8")
); );
let ticket = await TicketData.tickets.findIndex( let ticket = await TicketData.tickets.findIndex(
(t) => t.id == interaction.channel.id (t) => t.id === interaction.channel.id
); );
if (ticket == -1) { if (ticket === -1) {
const Exists = new Discord.MessageEmbed() const Exists = new Discord.MessageEmbed()
.setTitle("No Ticket Found!") .setTitle("No Ticket Found!")
.setDescription(`${supportbot.NoValidTicket}`) .setDescription(supportbot.NoValidTicket)
.setColor(supportbot.WarningColour); .setColor(supportbot.WarningColour);
return interaction.reply({ embeds: [Exists] }); return interaction.reply({ embeds: [Exists] });
} }
@@ -76,7 +70,7 @@ module.exports = new Command({
if (!uMember) return interaction.reply({ embeds: [UserNotExist] }); if (!uMember) return interaction.reply({ embeds: [UserNotExist] });
interaction.channel.permissionOverwrites.edit(uMember.id, { await interaction.channel.permissionOverwrites.edit(uMember.id, {
VIEW_CHANNEL: false, VIEW_CHANNEL: false,
}); });
@@ -88,7 +82,7 @@ module.exports = new Command({
interaction.reply({ embeds: [Complete] }); interaction.reply({ embeds: [Complete] });
TicketData.tickets[ticket].subUsers = TicketData.tickets[ TicketData.tickets[ticket].subUsers = TicketData.tickets[
ticket ticket
].subUsers.filter((u) => u != uMember.id); ].subUsers.filter((u) => u !== uMember.id);
fs.writeFileSync( fs.writeFileSync(
"./Data/TicketData.json", "./Data/TicketData.json",
JSON.stringify(TicketData, null, 4), JSON.stringify(TicketData, null, 4),
+9 -5
View File
@@ -20,12 +20,13 @@ module.exports = new Command({
name: "suggestion", name: "suggestion",
description: "Create a Suggestion", description: "Create a Suggestion",
type: "STRING", type: "STRING",
required: true,
}, },
], ],
permissions: ["SEND_MESSAGES"], permissions: ["SEND_MESSAGES"],
async run(interaction) { async run(interaction) {
const { getRole, getChannel, getCategory } = interaction.client; const { getChannel } = interaction.client;
const suggestChannel = await getChannel( const suggestChannel = await getChannel(
supportbot.SuggestionChannel, supportbot.SuggestionChannel,
interaction.guild interaction.guild
@@ -33,7 +34,7 @@ module.exports = new Command({
const NoChannel = new Discord.MessageEmbed() const NoChannel = new Discord.MessageEmbed()
.setTitle("Missing Channel!") .setTitle("Missing Channel!")
.setDescription(`${supportbot.InvalidChannel}`) .setDescription(supportbot.InvalidChannel)
.setColor(supportbot.ErrorColour); .setColor(supportbot.ErrorColour);
if (!suggestChannel) return interaction.reply({ embeds: [NoChannel] }); if (!suggestChannel) return interaction.reply({ embeds: [NoChannel] });
@@ -44,13 +45,16 @@ module.exports = new Command({
.addField("Suggestion", suggestion, true) .addField("Suggestion", suggestion, true)
.addField("From", `<@${interaction.user.id}>`) .addField("From", `<@${interaction.user.id}>`)
.setThumbnail(interaction.user.displayAvatarURL()) .setThumbnail(interaction.user.displayAvatarURL())
.setFooter(supportbot.EmbedFooter, interaction.user.displayAvatarURL()) .setFooter({
text: supportbot.EmbedFooter,
iconURL: interaction.user.displayAvatarURL(),
})
.setColor(supportbot.EmbedColour); .setColor(supportbot.EmbedColour);
const suggestionMsg = await suggestChannel.send({ embeds: [SuggestEmbed] }); const suggestionMsg = await suggestChannel.send({ embeds: [SuggestEmbed] });
if (supportbot.SuggestionUpvote && supportbot.SuggestionDownvote) { if (supportbot.SuggestionUpvote && supportbot.SuggestionDownvote) {
suggestionMsg.react(supportbot.SuggestionUpvote); await suggestionMsg.react(supportbot.SuggestionUpvote);
suggestionMsg.react(supportbot.SuggestionDownvote); await suggestionMsg.react(supportbot.SuggestionDownvote);
} }
const Submitted = new Discord.MessageEmbed() const Submitted = new Discord.MessageEmbed()
+85 -78
View File
@@ -31,15 +31,22 @@ module.exports = new Command({
permissions: ["SEND_MESSAGES"], permissions: ["SEND_MESSAGES"],
async run(interaction) { async run(interaction) {
let disableCommand = true;
if (interaction.isCommand() && disableCommand)
return interaction.reply({
content: "This command is disabled",
ephemeral: true,
});
let department = interaction.customId?.split("-")[1] || null;
let TicketData = await JSON.parse( let TicketData = await JSON.parse(
fs.readFileSync("./Data/TicketData.json", "utf8") fs.readFileSync("./Data/TicketData.json", "utf8")
); );
const { getRole, getChannel, getCategory } = interaction.client; const { getRole, getCategory } = interaction.client;
let User = interaction.guild.members.cache.get(interaction.user.id); let User = interaction.guild.members.cache.get(interaction.user.id);
if ( if (
supportbot.MaxAllowedTickets && supportbot.MaxAllowedTickets &&
TicketData.tickets.filter((t) => t.user == interaction.user.id && t.open) TicketData.tickets.filter((t) => t.user === interaction.user.id && t.open)
.length >= supportbot.MaxAllowedTickets .length >= supportbot.MaxAllowedTickets
) { ) {
return interaction.reply({ return interaction.reply({
@@ -73,39 +80,29 @@ module.exports = new Command({
const TicketExists = new MessageEmbed() const TicketExists = new MessageEmbed()
.setTitle("Ticket Exists!") .setTitle("Ticket Exists!")
.setDescription(`${supportbot.TicketExists}`) .setDescription(supportbot.TicketExists);
.setColor(supportbot.WarningColour);
if ( if (
await interaction.guild.channels.cache.find((ticketChannel) => { await interaction.guild.channels.cache.find(
ticketChannel.name === `${supportbot.TicketPrefix}${ticketNumberID}`; (ticketChannel) =>
}) ticketChannel.name === `${supportbot.TicketPrefix}${ticketNumberID}`
)
) { ) {
return await interaction.reply({ embeds: [TicketExists] }); return await interaction.reply({
embeds: [TicketExists],
ephemeral: true,
});
} }
const Staff = await getRole(supportbot.Staff, interaction.guild); const Staff = await getRole(supportbot.Staff, interaction.guild);
const Admin = await getRole(supportbot.Admin, interaction.guild); const Admin = await getRole(supportbot.Admin, interaction.guild);
const DeptRole1 = await getRole( if (!Staff || !Admin)
supportbot.DepartmentRole_1,
interaction.guild
);
const DeptRole2 = await getRole(
supportbot.DepartmentRole_2,
interaction.guild
);
const DeptRole3 = await getRole(
supportbot.DepartmentRole_3,
interaction.guild
);
if (!Staff || !Admin || !DeptRole1 || !DeptRole2 || !DeptRole3)
return interaction.reply({ return interaction.reply({
content: content:
"Some roles seem to be missing!\nPlease check for errors when starting the bot.", "Some roles seem to be missing!\nPlease check for errors when starting the bot.",
ephemeral: true, ephemeral: true,
}); });
const Author = interaction.user;
let TicketCategory = await getCategory( let TicketCategory = await getCategory(
supportbot.TicketCategory, supportbot.Departments[department].category || supportbot.TicketCategory,
interaction.guild interaction.guild
); );
const ticketChannel = await interaction.guild.channels.create( const ticketChannel = await interaction.guild.channels.create(
@@ -119,9 +116,8 @@ module.exports = new Command({
allow: [Permissions.FLAGS.VIEW_CHANNEL], allow: [Permissions.FLAGS.VIEW_CHANNEL],
}, },
{ {
id: Author.id, id: interaction.user.id,
allow: [Permissions.FLAGS.VIEW_CHANNEL], allow: [Permissions.FLAGS.VIEW_CHANNEL],
deny: [Permissions.FLAGS.SEND_MESSAGES],
}, },
{ {
id: interaction.guild.id, id: interaction.guild.id,
@@ -130,15 +126,20 @@ module.exports = new Command({
], ],
} }
); );
if (supportbot.AllowStaff) { if (supportbot.AllowAllStaff) {
ticketChannel.permissionOverwrites.edit(Staff.id, { await ticketChannel.permissionOverwrites.edit(Staff.id, {
VIEW_CHANNEL: true, VIEW_CHANNEL: true,
}); });
} }
if (supportbot.TicketDepartments && !department) {
await ticketChannel.permissionOverwrites.edit(interaction.user.id, {
SEND_MESSAGES: false,
});
}
await TicketData.tickets.push({ await TicketData.tickets.push({
id: ticketChannel.id, id: ticketChannel.id,
name: ticketChannel.name, name: ticketChannel.name,
user: Author.id, user: interaction.user.id,
number: ticketNumberID, number: ticketNumberID,
reason: TicketSubject, reason: TicketSubject,
open: true, open: true,
@@ -182,23 +183,23 @@ module.exports = new Command({
.setColor(supportbot.EmbedColour); .setColor(supportbot.EmbedColour);
if (supportbot.TicketSubject === "embed") { if (supportbot.TicketSubject === "embed") {
if (TicketSubject != "No Reason Provided.") { if (TicketSubject !== "No Reason Provided.") {
TicketMessage.addFields({ name: "Reason", value: TicketSubject }); TicketMessage.addFields({ name: "Reason", value: TicketSubject });
} }
} }
if (supportbot.TicketSubject === "description") { if (supportbot.TicketSubject === "description") {
if (TicketSubject != "No Reason Provided.") { if (TicketSubject !== "No Reason Provided.") {
await ticketChannel.setTopic( await ticketChannel.setTopic(
`Reason: ${TicketSubject} - User ID: ${interaction.user.id} - Ticket: ${ticketChannel.name}` `Reason: ${TicketSubject} - User ID: ${interaction.user.id} - Ticket: ${ticketChannel.name}`
); );
} }
} }
if (supportbot.TicketDepartments) { if (supportbot.TicketDepartments && !department) {
TicketMessage.addFields({ TicketMessage.addFields({
name: "Departments", name: "Departments",
value: ` **${supportbot.DepartmentTitle_1}**\n **${supportbot.DepartmentTitle_2}**\n **${supportbot.DepartmentTitle_3}**`, value: ` **${supportbot.Departments.map((X) => X.title).join("\n")}**`,
}); });
} }
const CloseButton = new MessageButton() const CloseButton = new MessageButton()
@@ -214,41 +215,24 @@ module.exports = new Command({
.setEmoji(supportbot.TicketLockEmoji); .setEmoji(supportbot.TicketLockEmoji);
const row2 = new MessageActionRow().addComponents(CloseButton, LockButton); const row2 = new MessageActionRow().addComponents(CloseButton, LockButton);
if (supportbot.TicketDepartments && !department) {
if (supportbot.TicketDepartments) {
try { try {
const Department1Button = new MessageButton() let buttons = await supportbot.Departments.map((x) =>
.setCustomId("Department1") new MessageButton()
.setLabel(supportbot.DepartmentTitle_1) .setCustomId("Department" + supportbot.Departments.indexOf(x))
.setStyle(supportbot.TicketDept1Colour) .setLabel(x.title)
.setEmoji(supportbot.TicketDept1Emoji); .setStyle(x.color)
.setEmoji(x.emoji)
const Department2Button = new MessageButton()
.setCustomId("Department2")
.setLabel(supportbot.DepartmentTitle_2)
.setStyle(supportbot.TicketDept2Colour)
.setEmoji(supportbot.TicketDept2Emoji);
const Department3Button = new MessageButton()
.setCustomId("Department3")
.setLabel(supportbot.DepartmentTitle_3)
.setStyle(supportbot.TicketDept3Colour)
.setEmoji(supportbot.TicketDept3Emoji);
const row = new MessageActionRow().addComponents(
Department1Button,
Department2Button,
Department3Button
); );
const row = new MessageActionRow().addComponents(buttons);
const m = await ticketChannel.send({ const m = await ticketChannel.send({
embeds: [TicketMessage], embeds: [TicketMessage],
components: [row], components: [row],
}); });
const filter = (i) => i.user.id === interaction.user.id;
let collector; let collector;
try { try {
const filter = (i) => i.user.id === interaction.user.id;
collector = await m.awaitMessageComponent({ collector = await m.awaitMessageComponent({
filter, filter,
max: 1, max: 1,
@@ -256,10 +240,13 @@ module.exports = new Command({
time: supportbot.Timeout * 60000, time: supportbot.Timeout * 60000,
}); });
} catch (e) { } catch (e) {
if (e.code == "INTERACTION_COLLECTOR_ERROR") if (e.code === "INTERACTION_COLLECTOR_ERROR") {
try { try {
TicketData = await JSON.parse(
fs.readFileSync("./Data/TicketData.json", "utf8")
);
let ticket = await TicketData.tickets.findIndex( let ticket = await TicketData.tickets.findIndex(
(t) => t.id == ticketChannel.id (t) => t.id === ticketChannel.id
); );
TicketData.tickets[ticket].open = false; TicketData.tickets[ticket].open = false;
fs.writeFileSync( fs.writeFileSync(
@@ -273,27 +260,17 @@ module.exports = new Command({
"Your ticket has timed out. Please open a new one, and select a department." "Your ticket has timed out. Please open a new one, and select a department."
); );
} catch (e) {} } catch (e) {}
return await ticketChannel.delete(); return await ticketChannel.delete();
} }
let role;
let title;
if (collector.customId === "Department1") {
role = DeptRole1;
title = supportbot.DepartmentTitle_1;
}
if (collector.customId === "Department2") {
role = DeptRole2;
title = supportbot.DepartmentTitle_2;
}
if (collector.customId === "Department3") {
role = DeptRole3;
title = supportbot.DepartmentTitle_3;
} }
let num = collector.customId.split("Department")[1];
let role = getRole(supportbot.Departments[num].role, interaction.guild);
let title = supportbot.Departments[num].title;
ticketChannel.permissionOverwrites.edit(role.id, { await ticketChannel.permissionOverwrites.edit(role.id, {
VIEW_CHANNEL: true, VIEW_CHANNEL: true,
}); });
ticketChannel.permissionOverwrites.edit(Author.id, { await ticketChannel.permissionOverwrites.edit(interaction.user.id, {
SEND_MESSAGES: true, SEND_MESSAGES: true,
}); });
@@ -315,7 +292,37 @@ module.exports = new Command({
}); });
} catch (error) {} } catch (error) {}
} else { } else {
await ticketChannel.send({ embeds: [TicketMessage], components: [row2] }); await ticketChannel.send({
embeds: [TicketMessage],
components: [row2],
});
if (department) {
let role = await getRole(
supportbot.Departments[department].role,
interaction.guild
);
let title = supportbot.Departments[department].title;
await ticketChannel.permissionOverwrites.edit(role.id, {
VIEW_CHANNEL: true,
});
let TicketCat = await getCategory(
supportbot.Departments[department].category ||
supportbot.TicketCategory,
interaction.guild
);
await ticketChannel.setParent(TicketCat.id, { lockPermissions: false });
await ticketChannel.send({
embeds: [
{
description: `> Thank for reaching out to the **${title} Department**. Please provide us information regarding your query.`,
color: supportbot.EmbedColour,
},
],
});
}
if (supportbot.AllowTicketMentions) {
await ticketChannel.send("@here");
}
} }
}, },
}); });
+26 -29
View File
@@ -10,7 +10,7 @@
# Discord Support: https://emeraldsrv.dev/discord # Discord Support: https://emeraldsrv.dev/discord
# Community Resources: https://emeraldsrv.dev/resources # Community Resources: https://emeraldsrv.dev/resources
SupportBot_Version: "7.4.0" SupportBot_Version: "7.5"
# ------------------------- # -------------------------
# General Configuration # General Configuration
@@ -18,8 +18,6 @@ SupportBot_Version: "7.4.0"
Name: "SupportBot" Name: "SupportBot"
Token: "BOT_TOKEN" Token: "BOT_TOKEN"
# Guild ID Ex: 123456789123456789
Guild: ""
# ------------------------- # -------------------------
# Activity Configuration # Activity Configuration
@@ -84,12 +82,13 @@ SuggestionDownvote: "❌"
# Tickets Configuration # Tickets Configuration
# ------------------------- # -------------------------
TicketCategory: "Tickets" TicketCategory: "Tickets" # Only for tickets without a category
TicketPrefix: "ticket-" # The prefix for ticket channel names TicketPrefix: "ticket-" # The prefix for ticket channel names
TicketLog: "logs" TicketLog: "ticket-logs"
TranscriptLog: "transcripts" TranscriptLog: "transcripts"
DMTranscripts: true
TranscriptTitle: "Ticket Transcript" TranscriptTitle: "Ticket Transcript"
TicketLog_Title: "Ticket Closed" TicketLog_Title: "Ticket Closed"
TicketBlackListMessage: "You are not allowed to open a ticket" TicketBlackListMessage: "You are not allowed to open a ticket"
@@ -97,12 +96,12 @@ TicketBlackListMessage: "You are not allowed to open a ticket"
MaxAllowedTickets: 2 MaxAllowedTickets: 2
TicketSubject: "description" TicketSubject: "description"
# "description" will displays the ticket reason within the channel description # "description" will display the ticket reason within the channel description
# "embed" will displays the ticket reason within the ticket embed # "embed" will display the ticket reason within the ticket embed
AllowTicketMentions: true AllowTicketMentions: true
# Set to true to allow the ticket to mention the author and the support team. # Set to true to allow the ticket to mention the author and the support team.
# Set to false to dis-allow mentions within tickets. # Set false to dis-allow mentions within tickets.
# --- Creation Config --- # --- Creation Config ---
# --- Start --- # --- Start ---
@@ -143,14 +142,6 @@ TicketCloseColour: "DANGER"
TicketDeleteColour: "DANGER" TicketDeleteColour: "DANGER"
TicketLockColour: "PRIMARY" TicketLockColour: "PRIMARY"
TicketDept1Colour: "PRIMARY"
TicketDept2Colour: "PRIMARY"
TicketDept3Colour: "PRIMARY"
TicketDept1Emoji: "1️⃣"
TicketDept2Emoji: "2️⃣"
TicketDept3Emoji: "3️⃣"
TranscriptSavedMessage: "📝 **Transcript Saved!**" TranscriptSavedMessage: "📝 **Transcript Saved!**"
TicketLockMessage: "❌ **Ticket Locked!**" TicketLockMessage: "❌ **Ticket Locked!**"
TicketDeleteMessage: "⚠ **Ticket Deleting!**" # Tickets deleting after 5 seconds by default. TicketDeleteMessage: "⚠ **Ticket Deleting!**" # Tickets deleting after 5 seconds by default.
@@ -161,22 +152,28 @@ TicketDeleteMessage: "⚠ **Ticket Deleting!**" # Tickets deleting after 5 secon
TicketDepartments: true TicketDepartments: true
# Delete the ticket if no department selected. TIME IN MINUTES # Delete the ticket if no department selected. TIME IN MINUTES
Timeout: 5 Timeout: 5
AllowStaff: true # Set to true to allow all staff to access the ticket
# If set to false users with the "Staff" role will not be able to view tickets AllowAllStaff: false
# without a valid department role set below.
# Set to false to allow "Staff" to see tickets whether its a department for them or not.
DepartmentTitle_1: "General Support"
DepartmentTitle_2: "Billing Support"
DepartmentTitle_3: "Admin Team"
# Ticket department title, This is the title for a ticket department to help users know what is available.
DepartmentRole_1: "Support"
DepartmentRole_2: "Support"
DepartmentRole_3: "Admin"
# Ticket roles are the roles that will be able to gain access to tickets depending on what department has been chosen. # Ticket roles are the roles that will be able to gain access to tickets depending on what department has been chosen.
Departments:
- title: "General Support"
role: "Support"
color: "PRIMARY"
emoji: "1️⃣"
category: "Tickets"
- title: "Billing Support"
role: "Support"
color: "PRIMARY"
emoji: "2️⃣"
category: "Billing"
- title: "Admin Team"
role: "Admin"
color: "PRIMARY"
emoji: "3️⃣"
category: "Tickets"
# --- Closing Config --- # --- Closing Config ---
# --- Start --- # --- Start ---
+1 -1
View File
@@ -25,7 +25,7 @@ ButtonEmoji: "📩"
ButtonLabel: "Open Ticket" ButtonLabel: "Open Ticket"
ButtonColour: "SUCCESS" ButtonColour: "SUCCESS"
# Colour Options: # Colour Options:
# -> PRIMARY - Blurple # -> PRIMARY - Purple
# -> SECONDARY - Grey # -> SECONDARY - Grey
# -> SUCCESS - Green # -> SUCCESS - Green
# -> DANGER - Red # -> DANGER - Red
-1
View File
@@ -1,4 +1,3 @@
{ {
"id": 0,
"tickets": [] "tickets": []
} }
+1 -1
View File
@@ -1 +1 @@
{"TicketPanelID":""} {"id":0,"TicketPanelID":"947337678720999458"}
+1 -1
View File
@@ -1,5 +1,5 @@
const Event = require("../Structures/Event.js"); const Event = require("../Structures/Event.js");
module.exports = new Event("guildCreate", async (client, guild) => { module.exports = new Event("guildCreate", async (client) => {
console.log( console.log(
`\u001b[31m`, `\u001b[31m`,
`${client.user.username} is not in the correct server set in your config. Please leave all other servers and restart the bot.` `${client.user.username} is not in the correct server set in your config. Please leave all other servers and restart the bot.`
+1 -1
View File
@@ -1,6 +1,6 @@
const Event = require("../Structures/Event.js"); const Event = require("../Structures/Event.js");
module.exports = new Event("guildDelete", async (client, guild) => { module.exports = new Event("guildDelete", async (client) => {
console.log( console.log(
`\u001b[31m`, `\u001b[31m`,
`${client.user.username} is not in the correct server set in your config. Please join the server and restart the bot.` `${client.user.username} is not in the correct server set in your config. Please join the server and restart the bot.`
+32
View File
@@ -0,0 +1,32 @@
const Discord = require('discord.js');
const fs = require("fs");
const Event = require("../Structures/Event.js");
const yaml = require("js-yaml");
const supportbot = yaml.load(
fs.readFileSync("./Configs/supportbot.yml", "utf8")
);
module.exports = new Event("guildMemberAdd", async (client, member, interaction, guild) => {
const WelcomeChannel = interaction.guild.channels.get(supportbot.WelcomeChannel)
const WelcomeEmbed = new Discord.MessageEmbed()
.setColor(supportbot.WelcomeColour)
.setTitle(supportbot.WelcomeTitle)
.setDescription(supportbot.WelcomeMessage.replace(/%joined_user%/g, member.user))
.setThumbnail(member.user.displayAvatarURL())
.setTimestamp();
member.guild.channels.cache.get(
supportbot.WelcomeChannel).send({
embeds: [WelcomeEmbed]
})
const WelcomeMsg = await WelcomeChannel.send({
embeds: [WelcomeEmbed]
});
});
+18 -13
View File
@@ -15,7 +15,7 @@ const Event = require("../Structures/Event.js");
module.exports = new Event("interactionCreate", async (client, interaction) => { module.exports = new Event("interactionCreate", async (client, interaction) => {
if (interaction.isCommand()) { if (interaction.isCommand()) {
const command = client.commands.find( const command = client.commands.find(
(cmd) => cmd.name.toLowerCase() == interaction.commandName (cmd) => cmd.name.toLowerCase() === interaction.commandName
); );
if (interaction.user.bot || !interaction.guild) return; if (interaction.user.bot || !interaction.guild) return;
@@ -29,7 +29,7 @@ module.exports = new Event("interactionCreate", async (client, interaction) => {
embeds: [NotValid], embeds: [NotValid],
}); });
const permission = interaction.member.permissions.has(command.permission); const permission = interaction.member.permissions.has(command.permissions);
const ValidPerms = new Discord.MessageEmbed() const ValidPerms = new Discord.MessageEmbed()
.setDescription( .setDescription(
@@ -41,11 +41,13 @@ module.exports = new Event("interactionCreate", async (client, interaction) => {
return interaction.reply({ return interaction.reply({
embeds: [ValidPerms], embeds: [ValidPerms],
}); });
interaction.user = interaction.user;
command.run(interaction); command.run(interaction);
} }
if (interaction.isButton()) { if (interaction.isButton()) {
if (interaction.customId === "openticket") { if (
interaction.customId === "openticket" ||
interaction.customId.includes("department-")
) {
try { try {
const cmd = client.commands.get(cmdconfig.OpenTicket); const cmd = client.commands.get(cmdconfig.OpenTicket);
if (!cmd) return; if (!cmd) return;
@@ -65,7 +67,7 @@ module.exports = new Event("interactionCreate", async (client, interaction) => {
} }
} }
if (interaction.customId === "ticketlock") { if (interaction.customId === "ticketlock") {
if (interaction.channel.name.startsWith(`${supportbot.TicketPrefix}`)) { if (interaction.channel.name.startsWith(supportbot.TicketPrefix)) {
interaction.message.fetch(); interaction.message.fetch();
let Admin = let Admin =
interaction.guild.roles.cache.find( interaction.guild.roles.cache.find(
@@ -84,25 +86,28 @@ module.exports = new Event("interactionCreate", async (client, interaction) => {
let parent = let parent =
interaction.guild.channels.cache.find( interaction.guild.channels.cache.find(
(c) => c.name === `${supportbot.LockTicketCategory}` (c) => c.name === supportbot.LockTicketCategory
) || ) ||
interaction.guild.channels.cache.find( interaction.guild.channels.cache.find(
(c) => c.id === `${supportbot.LockTicketCategory}` (c) => c.id === supportbot.LockTicketCategory
); );
if (parent) { if (parent) {
interaction.channel.setParent(parent.id); await interaction.channel.setParent(parent.id);
} }
all.forEach((perm) => { all.forEach((perm) => {
interaction.channel.permissionOverwrites.delete(perm.id); interaction.channel.permissionOverwrites.delete(perm.id);
}); });
interaction.channel.permissionOverwrites.create(Admin.id, { await interaction.channel.permissionOverwrites.create(Admin.id, {
VIEW_CHANNEL: true, VIEW_CHANNEL: true,
}); });
interaction.channel.permissionOverwrites.create(interaction.guild.id, { await interaction.channel.permissionOverwrites.create(
VIEW_CHANNEL: false, interaction.guild.id,
}); {
VIEW_CHANNEL: false,
}
);
const ticketDeleteButton = new Discord.MessageButton() const ticketDeleteButton = new Discord.MessageButton()
.setCustomId("ticketclose") .setCustomId("ticketclose")
@@ -116,7 +121,7 @@ module.exports = new Event("interactionCreate", async (client, interaction) => {
const ArchiveEmbed = new Discord.MessageEmbed() const ArchiveEmbed = new Discord.MessageEmbed()
.setTitle("Archived") .setTitle("Archived")
.setDescription(`Archived ${interaction.channel.name}`) .setDescription(`Archived ${interaction.channel.name}`)
.setColor(`${supportbot.SuccessColour}`); .setColor(supportbot.SuccessColour);
interaction.reply({ embeds: [ArchiveEmbed] }); interaction.reply({ embeds: [ArchiveEmbed] });
interaction.message.edit({ components: [row] }); interaction.message.edit({ components: [row] });
+43 -25
View File
@@ -14,7 +14,7 @@ const panelconfig = yaml.load(
const Event = require("../Structures/Event.js"); const Event = require("../Structures/Event.js");
module.exports = new Event("ready", async (client) => { module.exports = new Event("ready", async (client, interaction) => {
const { getRole, getChannel, getCategory } = client; const { getRole, getChannel, getCategory } = client;
client.user.setActivity(supportbot.BotActivity, { client.user.setActivity(supportbot.BotActivity, {
type: supportbot.ActivityType, type: supportbot.ActivityType,
@@ -38,6 +38,14 @@ module.exports = new Event("ready", async (client) => {
`\u001b[36m`, `\u001b[36m`,
`Connected to Discord` `Connected to Discord`
); );
console.log(
`\u001b[33m`,
`Invite to your server:`,
`\u001b[36m`,
`https://discord.com/api/oauth2/authorize?client_id=` +
client.user.id +
`&permissions=8&scope=bot%20applications.commands`
);
console.log( console.log(
`\u001b[33m`, `\u001b[33m`,
`Resources:`, `Resources:`,
@@ -48,7 +56,7 @@ module.exports = new Event("ready", async (client) => {
`\u001b[33m`, `\u001b[33m`,
`Documentation:`, `Documentation:`,
`\u001b[36m`, `\u001b[36m`,
`https://supportbot.emeraldsrv.dev` `https://emeraldsrv.dev/wiki/supportbot`
); );
console.log( console.log(
`\u001b[33m`, `\u001b[33m`,
@@ -66,14 +74,10 @@ module.exports = new Event("ready", async (client) => {
console.log(`\u001b[37m`, `SupportBot proudly created by Emerald Services`); console.log(`\u001b[37m`, `SupportBot proudly created by Emerald Services`);
console.log(` `); console.log(` `);
console.log(`\u001b[31m`, `――――――――――――――――――――――――――――――――――――――――――――`); console.log(`\u001b[31m`, `――――――――――――――――――――――――――――――――――――――――――――`);
if ( if (client.guilds.cache.size !== 1) {
!supportbot.Guild ||
(await client.guilds.cache.size) !== 1 ||
(await client.guilds.cache.first().id) !== supportbot.Guild
) {
console.log( console.log(
`\u001b[31m`, `\u001b[31m`,
`${client.user.username} is not in the correct server set in your config. Please join the server and restart the bot.` `${client.user.username} must be in only 1 server. Please join this server, leave any others, and restart the bot.`
); );
console.log(`\u001b[31m`, `${client.user.username} will now exit.`); console.log(`\u001b[31m`, `${client.user.username} will now exit.`);
return process.exit(1); return process.exit(1);
@@ -82,10 +86,10 @@ module.exports = new Event("ready", async (client) => {
supportbot.Admin, supportbot.Admin,
supportbot.Staff, supportbot.Staff,
supportbot.TicketBlackListRole, supportbot.TicketBlackListRole,
supportbot.DepartmentRole_1,
supportbot.DepartmentRole_2,
supportbot.DepartmentRole_3,
]; ];
if (supportbot.TicketDepartments) {
supportbot.Departments.forEach((department) => roles.push(department.role));
}
if (supportbot.AutoRole) roles.push(supportbot.AutoRole_Role); if (supportbot.AutoRole) roles.push(supportbot.AutoRole_Role);
const channels = [ const channels = [
supportbot.SuggestionChannel, supportbot.SuggestionChannel,
@@ -137,8 +141,9 @@ module.exports = new Event("ready", async (client) => {
); );
} }
if (panelconfig.TicketPanel) { if (panelconfig.TicketPanel) {
let chan1 = client.channels.cache.find( let chan1 = await client.getChannel(
(channel) => channel.name === panelconfig.Channel panelconfig.Channel,
client.guilds.cache.first()
); );
if (!chan1) { if (!chan1) {
@@ -153,11 +158,14 @@ module.exports = new Event("ready", async (client) => {
fs.readFileSync("./Data/ticket-panel-id.json", "utf8") fs.readFileSync("./Data/ticket-panel-id.json", "utf8")
); );
chan1.messages.fetch(panelid.TicketPanelID).catch(async (r) => { chan1.messages.fetch(panelid.TicketPanelID).catch(async () => {
let embed = new Discord.MessageEmbed() let embed = new Discord.MessageEmbed()
.setTitle(`${panelconfig.PanelTitle}`) .setTitle(panelconfig.PanelTitle)
.setColor(supportbot.SuccessColour) .setColor(supportbot.SuccessColour)
.setFooter(supportbot.EmbedFooter); .setFooter({
text: supportbot.EmbedFooter,
iconURL: interaction.user.displayAvatarURL(),
});
if (panelconfig.TicketPanel_Description) { if (panelconfig.TicketPanel_Description) {
embed.setDescription(panelconfig.PanelMessage); embed.setDescription(panelconfig.PanelMessage);
@@ -170,13 +178,22 @@ module.exports = new Event("ready", async (client) => {
if (panelconfig.TicketPanel_Image) { if (panelconfig.TicketPanel_Image) {
embed.setImage(panelconfig.PanelImage); embed.setImage(panelconfig.PanelImage);
} }
let button;
let button = new Discord.MessageButton() if (supportbot.TicketDepartments) {
.setLabel(panelconfig.ButtonLabel) button = supportbot.Departments.map((x) =>
.setCustomId("openticket") new Discord.MessageButton()
.setStyle(panelconfig.ButtonColour) .setCustomId("department-" + supportbot.Departments.indexOf(x))
.setEmoji(panelconfig.ButtonEmoji); .setLabel(x.title)
.setStyle(x.color)
.setEmoji(x.emoji)
);
} else {
button = new Discord.MessageButton()
.setLabel(panelconfig.ButtonLabel)
.setCustomId("openticket")
.setStyle(panelconfig.ButtonColour)
.setEmoji(panelconfig.ButtonEmoji);
}
let row = new Discord.MessageActionRow().addComponents(button); let row = new Discord.MessageActionRow().addComponents(button);
await chan1 await chan1
@@ -186,7 +203,8 @@ module.exports = new Event("ready", async (client) => {
}) })
.then((r) => { .then((r) => {
let data = { let data = {
TicketPanelID: `${r.id}`, id: panelid.id,
TicketPanelID: r.id,
}; };
fs.writeFileSync( fs.writeFileSync(
"./Data/ticket-panel-id.json", "./Data/ticket-panel-id.json",
@@ -195,7 +213,7 @@ module.exports = new Event("ready", async (client) => {
); );
}) })
.catch((e) => { .catch((e) => {
console.log("Raw" + e); console.log("Raw: " + e);
}); });
}); });
} }
+1 -1
View File
@@ -8,6 +8,6 @@ SupportBot is an open-sourced support system for discord. It's completely free t
**|** [Discord](https://emeraldsrv.dev/discord) **|** **|** [Discord](https://emeraldsrv.dev/discord) **|**
[Hosting](https://emeraldsrv.dev/hosting) **|** [Hosting](https://emeraldsrv.dev/hosting) **|**
[Documentation](https://docs.emeraldsrv.dev) **|** [Documentation](https://emeraldsrv.dev/wiki/supportbot) **|**
[Download via Polymart](https://polymart.org/resource/supportbot-1-discord-ticket-bot.518) **|** [Download via Polymart](https://polymart.org/resource/supportbot-1-discord-ticket-bot.518) **|**
[Download via MC-Market](https://www.mc-market.org/resources/8940/) **|** [Download via MC-Market](https://www.mc-market.org/resources/8940/) **|**
+6 -6
View File
@@ -37,7 +37,7 @@ class Client extends Discord.Client {
); );
} }
start(token) { async start(token) {
const commandFiles = fs const commandFiles = fs
.readdirSync("./Commands") .readdirSync("./Commands")
.filter((file) => file.endsWith(".js")); .filter((file) => file.endsWith(".js"));
@@ -76,10 +76,10 @@ class Client extends Discord.Client {
`\u001b[32;1m`, `\u001b[32;1m`,
"Loaded" "Loaded"
); );
addon.commands.forEach((command) => { addon.commands?.forEach((command) => {
this.commands.set(command.name, command); this.commands.set(command.name, command);
}); });
addon.events.forEach((event) => { addon.events?.forEach((event) => {
this.on(event.event, (...args) => event.run(this, ...args)); this.on(event.event, (...args) => event.run(this, ...args));
}); });
}); });
@@ -89,7 +89,7 @@ class Client extends Discord.Client {
// Slash Commands // Slash Commands
this.once("ready", async () => { this.once("ready", async () => {
await this.application?.commands.set(this.commands, supportbot.Guild); await this.guilds.cache.first()?.commands.set(this.commands);
console.log( console.log(
`\u001b[32;1m`, `\u001b[32;1m`,
`Slash Commands Registered for ${this.guilds.cache.first().name}` `Slash Commands Registered for ${this.guilds.cache.first().name}`
@@ -108,8 +108,8 @@ class Client extends Discord.Client {
}); });
console.log(`\u001b[34;1m`, "▬▬▬▬▬▬▬ Events ▬▬▬▬▬▬▬"); console.log(`\u001b[34;1m`, "▬▬▬▬▬▬▬ Events ▬▬▬▬▬▬▬");
if (process.argv[2] != "test") { if (process.argv[2] !== "test") {
this.login(token); await this.login(token);
} else { } else {
console.log( console.log(
`\u001b[31;1m`, `\u001b[31;1m`,
+1 -6
View File
@@ -1,19 +1,14 @@
// SupportBot | Emerald Services // SupportBot | Emerald Services
// Command Structure // Command Structure
const fs = require("fs");
const yaml = require("js-yaml");
class Command { class Command {
constructor(options) { constructor(options) {
this.name = options.name; this.name = options.name;
this.description = options.description; this.description = options.description;
this.permissions = options.permissions; this.permissions = options.permissions || [];
this.options = options.options || []; this.options = options.options || [];
this.run = options.run; this.run = options.run;
this.defaultPermission = true; this.defaultPermission = true;
} }
} }
module.exports = Command; module.exports = Command;
+14 -41
View File
@@ -5,44 +5,31 @@ const fs = require("fs");
class TicketNumberID { class TicketNumberID {
static async pad() { static async pad() {
let n = this.get() + ""; let num = await this.get();
let z = "0"; let n = num + "";
let width = 4; await this.set(num + 1);
await this.set(this.get() + 1); return n.length >= 4 ? n : new Array(4 - n.length + 1).join("0") + n;
return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
} }
static get() { static async get() {
let ticketnumberID = JSON.parse( let ticketnumberID = await JSON.parse(
fs.readFileSync("./Data/TicketData.json", "utf8") fs.readFileSync("./Data/ticket-panel-id.json", "utf8")
); );
if (!ticketnumberID.id) { if (!ticketnumberID.id) {
ticketnumberID.id = 0; return this.set(0);
fs.writeFileSync(
"./Data/TicketData.json",
JSON.stringify(ticketnumberID, null, 4),
(err) => {
if (err) console.error(err);
}
);
return 0;
} else { } else {
return ticketnumberID.id; return ticketnumberID.id;
} }
} }
static set(value) { static async set(value) {
let ticketnumberID = JSON.parse( let ticketnumberID = await JSON.parse(
fs.readFileSync("./Data/TicketData.json", "utf8") fs.readFileSync("./Data/ticket-panel-id.json", "utf8")
); );
ticketnumberID.id = value; ticketnumberID.id = value;
fs.writeFileSync( fs.writeFileSync(
"./Data/TicketData.json", "./Data/ticket-panel-id.json",
JSON.stringify(ticketnumberID, null, 4), JSON.stringify(ticketnumberID, null, 4),
(err) => { (err) => {
if (err) console.error(err); if (err) console.error(err);
@@ -52,22 +39,8 @@ class TicketNumberID {
return value; return value;
} }
static reset() { static async reset() {
let ticketnumberID = JSON.parse( return await this.set(0);
fs.readFileSync("./Data/TicketData.json", "utf8")
);
ticketnumberID.id = 0;
fs.writeFileSync(
"./Data/TicketData.json",
JSON.stringify(ticketnumberID, null, 4),
(err) => {
if (err) console.error(err);
}
);
return 0;
} }
} }
-1
View File
@@ -12,7 +12,6 @@
const fs = require("fs"); const fs = require("fs");
const Discord = require("discord.js");
const yaml = require("js-yaml"); const yaml = require("js-yaml");
const supportbot = yaml.load( const supportbot = yaml.load(
fs.readFileSync("./Configs/supportbot.yml", "utf8") fs.readFileSync("./Configs/supportbot.yml", "utf8")
+127 -223
View File
@@ -1,28 +1,28 @@
{ {
"name": "supportbot", "name": "supportbot",
"version": "7.4.0", "version": "7.4.2",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "supportbot", "name": "supportbot",
"version": "7.4.0", "version": "7.4.2",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"discord.js": "^13.3.1", "discord.js": "^13.6.0",
"js-yaml": "^4.1.0" "js-yaml": "^4.1.0"
} }
}, },
"node_modules/@discordjs/builders": { "node_modules/@discordjs/builders": {
"version": "0.8.2", "version": "0.11.0",
"resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.8.2.tgz", "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.11.0.tgz",
"integrity": "sha512-/YRd11SrcluqXkKppq/FAVzLIPRVlIVmc6X8ZklspzMIHDtJ+A4W37D43SHvLdH//+NnK+SHW/WeOF4Ts54PeQ==", "integrity": "sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg==",
"dependencies": { "dependencies": {
"@sindresorhus/is": "^4.2.0", "@sindresorhus/is": "^4.2.0",
"discord-api-types": "^0.24.0", "discord-api-types": "^0.26.0",
"ow": "^0.27.0",
"ts-mixer": "^6.0.0", "ts-mixer": "^6.0.0",
"tslib": "^2.3.1" "tslib": "^2.3.1",
"zod": "^3.11.6"
}, },
"engines": { "engines": {
"node": ">=16.0.0", "node": ">=16.0.0",
@@ -30,40 +30,27 @@
} }
}, },
"node_modules/@discordjs/collection": { "node_modules/@discordjs/collection": {
"version": "0.3.2", "version": "0.4.0",
"resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.3.2.tgz", "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.4.0.tgz",
"integrity": "sha512-dMjLl60b2DMqObbH1MQZKePgWhsNe49XkKBZ0W5Acl5uVV43SN414i2QfZwRI7dXAqIn8pEWD2+XXQFn9KWxqg==", "integrity": "sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw==",
"engines": { "engines": {
"node": ">=16.0.0", "node": ">=16.0.0",
"npm": ">=7.0.0" "npm": ">=7.0.0"
} }
}, },
"node_modules/@discordjs/form-data": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz",
"integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/@sapphire/async-queue": { "node_modules/@sapphire/async-queue": {
"version": "1.1.9", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.9.tgz", "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.2.0.tgz",
"integrity": "sha512-CbXaGwwlEMq+l1TRu01FJCvySJ1CEFKFclHT48nIfNeZXaAAmmwwy7scUKmYHPUa3GhoMp6Qr1B3eAJux6XgOQ==", "integrity": "sha512-O5ND5Ljpef86X5oy8zXorQ754TMjWALcPSAgPBu4+76HLtDTrNoDyzU2uGE2G4A8Wv51u0MXHzGQ0WZ4GMtpIw==",
"engines": { "engines": {
"node": ">=v14.0.0", "node": ">=v14.0.0",
"npm": ">=7.0.0" "npm": ">=7.0.0"
} }
}, },
"node_modules/@sindresorhus/is": { "node_modules/@sindresorhus/is": {
"version": "4.2.0", "version": "4.4.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.4.0.tgz",
"integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==", "integrity": "sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ==",
"engines": { "engines": {
"node": ">=10" "node": ">=10"
}, },
@@ -72,9 +59,9 @@
} }
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "17.0.0", "version": "17.0.17",
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.17.tgz",
"integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==" "integrity": "sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw=="
}, },
"node_modules/@types/node-fetch": { "node_modules/@types/node-fetch": {
"version": "2.5.12", "version": "2.5.12",
@@ -85,6 +72,19 @@
"form-data": "^3.0.0" "form-data": "^3.0.0"
} }
}, },
"node_modules/@types/node-fetch/node_modules/form-data": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/@types/ws": { "node_modules/@types/ws": {
"version": "8.2.2", "version": "8.2.2",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz",
@@ -103,14 +103,6 @@
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
}, },
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"engines": {
"node": ">=6"
}
},
"node_modules/combined-stream": { "node_modules/combined-stream": {
"version": "1.0.8", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -131,51 +123,37 @@
} }
}, },
"node_modules/discord-api-types": { "node_modules/discord-api-types": {
"version": "0.24.0", "version": "0.26.1",
"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.24.0.tgz", "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz",
"integrity": "sha512-X0uA2a92cRjowUEXpLZIHWl4jiX1NsUpDhcEOpa1/hpO1vkaokgZ8kkPtPih9hHth5UVQ3mHBu/PpB4qjyfJ4A==", "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==",
"engines": { "engines": {
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/discord.js": { "node_modules/discord.js": {
"version": "13.3.1", "version": "13.6.0",
"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.3.1.tgz", "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.6.0.tgz",
"integrity": "sha512-zn4G8tL5+tMV00+0aSsVYNYcIfMSdT2g0nudKny+Ikd+XKv7m6bqI7n3Vji0GIRqXDr5ArPaw+iYFM2I1Iw3vg==", "integrity": "sha512-tXNR8zgsEPxPBvGk3AQjJ9ljIIC6/LOPjzKwpwz8Y1Q2X66Vi3ZqFgRHYwnHKC0jC0F+l4LzxlhmOJsBZDNg9g==",
"dependencies": { "dependencies": {
"@discordjs/builders": "^0.8.1", "@discordjs/builders": "^0.11.0",
"@discordjs/collection": "^0.3.2", "@discordjs/collection": "^0.4.0",
"@discordjs/form-data": "^3.0.1", "@sapphire/async-queue": "^1.1.9",
"@sapphire/async-queue": "^1.1.8",
"@types/node-fetch": "^2.5.12", "@types/node-fetch": "^2.5.12",
"@types/ws": "^8.2.0", "@types/ws": "^8.2.2",
"discord-api-types": "^0.24.0", "discord-api-types": "^0.26.0",
"form-data": "^4.0.0",
"node-fetch": "^2.6.1", "node-fetch": "^2.6.1",
"ws": "^8.2.3" "ws": "^8.4.0"
}, },
"engines": { "engines": {
"node": ">=16.6.0", "node": ">=16.6.0",
"npm": ">=7.0.0" "npm": ">=7.0.0"
} }
}, },
"node_modules/dot-prop": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz",
"integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==",
"dependencies": {
"is-obj": "^2.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/form-data": { "node_modules/form-data": {
"version": "3.0.1", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dependencies": { "dependencies": {
"asynckit": "^0.4.0", "asynckit": "^0.4.0",
"combined-stream": "^1.0.8", "combined-stream": "^1.0.8",
@@ -185,14 +163,6 @@
"node": ">= 6" "node": ">= 6"
} }
}, },
"node_modules/is-obj": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
"integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
"engines": {
"node": ">=8"
}
},
"node_modules/js-yaml": { "node_modules/js-yaml": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -204,11 +174,6 @@
"js-yaml": "bin/js-yaml.js" "js-yaml": "bin/js-yaml.js"
} }
}, },
"node_modules/lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
"integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
},
"node_modules/mime-db": { "node_modules/mime-db": {
"version": "1.51.0", "version": "1.51.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
@@ -229,33 +194,22 @@
} }
}, },
"node_modules/node-fetch": { "node_modules/node-fetch": {
"version": "2.6.6", "version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
"integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
"dependencies": { "dependencies": {
"whatwg-url": "^5.0.0" "whatwg-url": "^5.0.0"
}, },
"engines": { "engines": {
"node": "4.x || >=6.0.0" "node": "4.x || >=6.0.0"
}
},
"node_modules/ow": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/ow/-/ow-0.27.0.tgz",
"integrity": "sha512-SGnrGUbhn4VaUGdU0EJLMwZWSupPmF46hnTRII7aCLCrqixTAC5eKo8kI4/XXf1eaaI8YEVT+3FeGNJI9himAQ==",
"dependencies": {
"@sindresorhus/is": "^4.0.1",
"callsites": "^3.1.0",
"dot-prop": "^6.0.1",
"lodash.isequal": "^4.5.0",
"type-fest": "^1.2.1",
"vali-date": "^1.0.0"
}, },
"engines": { "peerDependencies": {
"node": ">=12" "encoding": "^0.1.0"
}, },
"funding": { "peerDependenciesMeta": {
"url": "https://github.com/sponsors/sindresorhus" "encoding": {
"optional": true
}
} }
}, },
"node_modules/tr46": { "node_modules/tr46": {
@@ -273,25 +227,6 @@
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
}, },
"node_modules/type-fest": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
"integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/vali-date": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
"integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/webidl-conversions": { "node_modules/webidl-conversions": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
@@ -307,9 +242,9 @@
} }
}, },
"node_modules/ws": { "node_modules/ws": {
"version": "8.3.0", "version": "8.5.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz",
"integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==",
"engines": { "engines": {
"node": ">=10.0.0" "node": ">=10.0.0"
}, },
@@ -325,50 +260,48 @@
"optional": true "optional": true
} }
} }
},
"node_modules/zod": {
"version": "3.11.6",
"resolved": "https://registry.npmjs.org/zod/-/zod-3.11.6.tgz",
"integrity": "sha512-daZ80A81I3/9lIydI44motWe6n59kRBfNzTuS2bfzVh1nAXi667TOTWWtatxyG+fwgNUiagSj/CWZwRRbevJIg==",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
} }
}, },
"dependencies": { "dependencies": {
"@discordjs/builders": { "@discordjs/builders": {
"version": "0.8.2", "version": "0.11.0",
"resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.8.2.tgz", "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.11.0.tgz",
"integrity": "sha512-/YRd11SrcluqXkKppq/FAVzLIPRVlIVmc6X8ZklspzMIHDtJ+A4W37D43SHvLdH//+NnK+SHW/WeOF4Ts54PeQ==", "integrity": "sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg==",
"requires": { "requires": {
"@sindresorhus/is": "^4.2.0", "@sindresorhus/is": "^4.2.0",
"discord-api-types": "^0.24.0", "discord-api-types": "^0.26.0",
"ow": "^0.27.0",
"ts-mixer": "^6.0.0", "ts-mixer": "^6.0.0",
"tslib": "^2.3.1" "tslib": "^2.3.1",
"zod": "^3.11.6"
} }
}, },
"@discordjs/collection": { "@discordjs/collection": {
"version": "0.3.2", "version": "0.4.0",
"resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.3.2.tgz", "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.4.0.tgz",
"integrity": "sha512-dMjLl60b2DMqObbH1MQZKePgWhsNe49XkKBZ0W5Acl5uVV43SN414i2QfZwRI7dXAqIn8pEWD2+XXQFn9KWxqg==" "integrity": "sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw=="
},
"@discordjs/form-data": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz",
"integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
}
}, },
"@sapphire/async-queue": { "@sapphire/async-queue": {
"version": "1.1.9", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.9.tgz", "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.2.0.tgz",
"integrity": "sha512-CbXaGwwlEMq+l1TRu01FJCvySJ1CEFKFclHT48nIfNeZXaAAmmwwy7scUKmYHPUa3GhoMp6Qr1B3eAJux6XgOQ==" "integrity": "sha512-O5ND5Ljpef86X5oy8zXorQ754TMjWALcPSAgPBu4+76HLtDTrNoDyzU2uGE2G4A8Wv51u0MXHzGQ0WZ4GMtpIw=="
}, },
"@sindresorhus/is": { "@sindresorhus/is": {
"version": "4.2.0", "version": "4.4.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.4.0.tgz",
"integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==" "integrity": "sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ=="
}, },
"@types/node": { "@types/node": {
"version": "17.0.0", "version": "17.0.17",
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.17.tgz",
"integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==" "integrity": "sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw=="
}, },
"@types/node-fetch": { "@types/node-fetch": {
"version": "2.5.12", "version": "2.5.12",
@@ -377,6 +310,18 @@
"requires": { "requires": {
"@types/node": "*", "@types/node": "*",
"form-data": "^3.0.0" "form-data": "^3.0.0"
},
"dependencies": {
"form-data": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
}
}
} }
}, },
"@types/ws": { "@types/ws": {
@@ -397,11 +342,6 @@
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
}, },
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
},
"combined-stream": { "combined-stream": {
"version": "1.0.8", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -416,49 +356,36 @@
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
}, },
"discord-api-types": { "discord-api-types": {
"version": "0.24.0", "version": "0.26.1",
"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.24.0.tgz", "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz",
"integrity": "sha512-X0uA2a92cRjowUEXpLZIHWl4jiX1NsUpDhcEOpa1/hpO1vkaokgZ8kkPtPih9hHth5UVQ3mHBu/PpB4qjyfJ4A==" "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ=="
}, },
"discord.js": { "discord.js": {
"version": "13.3.1", "version": "13.6.0",
"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.3.1.tgz", "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.6.0.tgz",
"integrity": "sha512-zn4G8tL5+tMV00+0aSsVYNYcIfMSdT2g0nudKny+Ikd+XKv7m6bqI7n3Vji0GIRqXDr5ArPaw+iYFM2I1Iw3vg==", "integrity": "sha512-tXNR8zgsEPxPBvGk3AQjJ9ljIIC6/LOPjzKwpwz8Y1Q2X66Vi3ZqFgRHYwnHKC0jC0F+l4LzxlhmOJsBZDNg9g==",
"requires": { "requires": {
"@discordjs/builders": "^0.8.1", "@discordjs/builders": "^0.11.0",
"@discordjs/collection": "^0.3.2", "@discordjs/collection": "^0.4.0",
"@discordjs/form-data": "^3.0.1", "@sapphire/async-queue": "^1.1.9",
"@sapphire/async-queue": "^1.1.8",
"@types/node-fetch": "^2.5.12", "@types/node-fetch": "^2.5.12",
"@types/ws": "^8.2.0", "@types/ws": "^8.2.2",
"discord-api-types": "^0.24.0", "discord-api-types": "^0.26.0",
"form-data": "^4.0.0",
"node-fetch": "^2.6.1", "node-fetch": "^2.6.1",
"ws": "^8.2.3" "ws": "^8.4.0"
}
},
"dot-prop": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz",
"integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==",
"requires": {
"is-obj": "^2.0.0"
} }
}, },
"form-data": { "form-data": {
"version": "3.0.1", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"requires": { "requires": {
"asynckit": "^0.4.0", "asynckit": "^0.4.0",
"combined-stream": "^1.0.8", "combined-stream": "^1.0.8",
"mime-types": "^2.1.12" "mime-types": "^2.1.12"
} }
}, },
"is-obj": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
"integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
},
"js-yaml": { "js-yaml": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -467,11 +394,6 @@
"argparse": "^2.0.1" "argparse": "^2.0.1"
} }
}, },
"lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
"integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
},
"mime-db": { "mime-db": {
"version": "1.51.0", "version": "1.51.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
@@ -486,26 +408,13 @@
} }
}, },
"node-fetch": { "node-fetch": {
"version": "2.6.6", "version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
"integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
"requires": { "requires": {
"whatwg-url": "^5.0.0" "whatwg-url": "^5.0.0"
} }
}, },
"ow": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/ow/-/ow-0.27.0.tgz",
"integrity": "sha512-SGnrGUbhn4VaUGdU0EJLMwZWSupPmF46hnTRII7aCLCrqixTAC5eKo8kI4/XXf1eaaI8YEVT+3FeGNJI9himAQ==",
"requires": {
"@sindresorhus/is": "^4.0.1",
"callsites": "^3.1.0",
"dot-prop": "^6.0.1",
"lodash.isequal": "^4.5.0",
"type-fest": "^1.2.1",
"vali-date": "^1.0.0"
}
},
"tr46": { "tr46": {
"version": "0.0.3", "version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
@@ -521,16 +430,6 @@
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
}, },
"type-fest": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
"integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="
},
"vali-date": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
"integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY="
},
"webidl-conversions": { "webidl-conversions": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
@@ -546,10 +445,15 @@
} }
}, },
"ws": { "ws": {
"version": "8.3.0", "version": "8.5.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz",
"integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==",
"requires": {} "requires": {}
},
"zod": {
"version": "3.11.6",
"resolved": "https://registry.npmjs.org/zod/-/zod-3.11.6.tgz",
"integrity": "sha512-daZ80A81I3/9lIydI44motWe6n59kRBfNzTuS2bfzVh1nAXi667TOTWWtatxyG+fwgNUiagSj/CWZwRRbevJIg=="
} }
} }
} }
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "supportbot", "name": "supportbot",
"version": "7.4.0", "version": "7.4.2",
"description": "SupportBot is an open-sourced support system for discord. It's completely free to use with high amounts of customization to match your own brand.", "description": "SupportBot is an open-sourced support system for discord. It's completely free to use with high amounts of customization to match your own brand.",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
@@ -18,7 +18,7 @@
}, },
"homepage": "https://github.com/Emerald-Services/SupportBot#readme", "homepage": "https://github.com/Emerald-Services/SupportBot#readme",
"dependencies": { "dependencies": {
"discord.js": "^13.3.1", "discord.js": "^13.6.0",
"js-yaml": "^4.1.0" "js-yaml": "^4.1.0"
} }
} }