Compare commits

...
38 Commits
Author SHA1 Message Date
1tzEmerald 4af9759700 Update SupportBot version to v8.5 2026-02-14 13:32:59 +00:00
1tzEmerald 835cbbe937 Delete package-lock.json 2026-02-14 13:32:10 +00:00
1tzEmerald 491bb9ba65 . 2026-02-14 13:14:05 +00:00
1tzEmerald ced29535f9 Merge pull request #201 from Emerald-Services/8.5
8.5 Update
2026-02-14 13:11:56 +00:00
1tzEmerald d99e9a105b 8.5 Update
Added TicketRename command
2026-02-14 13:05:07 +00:00
1tzEmerald c72c7c5c34 Merge pull request #200 from Emerald-Services/1tzemerald-patch-3
Delete .idea directory
2026-02-03 16:37:22 +00:00
1tzEmerald 23960bc30d Delete .idea directory 2026-02-03 16:37:08 +00:00
1tzEmerald abb48c281b Merge branch 'release' of https://github.com/Emerald-Services/SupportBot into release 2026-02-03 16:33:08 +00:00
1tzEmerald 7acb825713 Added rename command 2026-02-03 16:33:02 +00:00
1tzEmerald dd2f329485 Merge pull request #199 from Emerald-Services/1tzemerald-patch-2
Update Node.JS version for SupportBot 8.x
2025-11-22 12:52:33 +00:00
1tzEmerald 75577ec0bd Update Node.JS version for SupportBot 8.x 2025-11-22 12:52:23 +00:00
1tzEmerald 7366bcda71 Merge pull request #198 from Emerald-Services/1tzemerald-patch-1
Change support status for SupportBot 7.7.3
2025-11-22 12:51:59 +00:00
1tzEmerald 23e43cfad3 Change support status for SupportBot 7.7.3
Updated support status for SupportBot versions.
2025-11-22 12:51:47 +00:00
Nyo ad9a8085aa Merge pull request #197 from Emerald-Services/ItsNyoty-patch-1
Fix link format for BuiltByBit in README.md
2025-09-30 18:50:12 +02:00
Nyo 2f23e8f23d Fix link format for BuiltByBit in README.md 2025-09-30 18:49:52 +02:00
1tzEmerald 4c07b8a236 Merge pull request #196 from Emerald-Services/dev
8.4.1 guilldMemberAdd update.
2025-09-25 13:16:42 +01:00
1tzEmerald 571bd586fa 8.4.1 guilldMemberAdd update.
Added if statement to .setAccentColor allowing you to remove the color from the config.
2025-09-25 13:16:20 +01:00
1tzEmerald eac2d88873 Merge pull request #195 from Emerald-Services/dev
8.4.1 small fix
2025-09-25 13:10:23 +01:00
1tzEmerald 93c793f393 Merge branch 'dev' of https://github.com/Emerald-Services/SupportBot into dev 2025-09-25 13:09:09 +01:00
1tzEmerald 1aa97b63f9 8.4.1 small fix 2025-09-25 13:09:00 +01:00
1tzEmerald c1b76a2b84 Merge pull request #194 from Emerald-Services/dev
8.4 from Dev to Release
2025-09-23 23:26:30 +01:00
1tzEmerald a1429aa723 Merge branch 'release' into dev 2025-09-23 23:26:13 +01:00
1tzEmerald 2de7c7b19c 8.4 2025-09-23 23:23:19 +01:00
1tzEmerald dc88f6c51a Merge pull request #186 from chorimethod/release
Added "InvalidChannel" message (required by suggest.js), fixed a double quote that was preventing the bot to start correctly.
2025-07-14 16:37:45 +01:00
Nyo d69fb0e26d Update supportbot.yml 2025-05-22 20:30:06 +02:00
chorisancio3d 4b2d53d3f4 Added "InvalidChannel" message (required by suggest.js)
Fixed a double quote that was preventing the bot to start correctly.
2025-02-03 21:43:03 -03:00
1tzEmerald e3fa8b6d72 Merge pull request #185 from Emerald-Services/dev
Update close.js
2024-11-10 13:31:17 +00:00
1tzEmerald 71e33dbf66 Update close.js 2024-11-10 13:30:27 +00:00
1tzEmerald d468ab1575 Delete Data/Profiles directory 2024-11-10 13:18:50 +00:00
1tzEmerald 74482af471 Merge pull request #184 from Emerald-Services/dev
Dev
2024-11-09 13:04:16 +00:00
1tzEmerald 3cdfaef942 Update profile.js 2024-11-09 13:03:41 +00:00
1tzEmerald fcf441a190 Update close.js 2024-11-09 02:46:35 +00:00
1tzEmerald 58eb37124e Update close.js 2024-11-09 02:44:39 +00:00
1tzEmerald afeeda3a8d Merge pull request #183 from Emerald-Services/dev
Dev
2024-11-09 02:38:20 +00:00
1tzEmerald 357a85fa3d Update close.js 2024-11-09 02:37:14 +00:00
1tzEmerald 1bb343e49a Update ticket.js 2024-11-09 02:32:28 +00:00
1tzEmerald dffa5d4161 Update close.js 2024-11-09 02:32:06 +00:00
1tzEmerald 6e14ce209d Merge pull request #182 from Emerald-Services/dev
8.3 Dev -> Release
2024-11-09 00:45:40 +00:00
14 changed files with 397 additions and 148 deletions

No files matched your search

+26
View File
@@ -0,0 +1,26 @@
const Discord = require("discord.js");
const fs = require("fs");
const yaml = require("js-yaml");
const { Command } = require('../Structures/Addon.js'); // Adjust the path as needed
const supportbot = yaml.load(fs.readFileSync("./Configs/supportbot.yml", "utf8"));
module.exports = new Command({
name: "addon",
description: "This is a sample addon!",
options: [],
permissions: ["Administrator"],
async run(interaction) {
let disableCommand = true;
const PingEmbed = new Discord.EmbedBuilder()
.setDescription(
`This is a sample addon.\n\nPong! \`${interaction.client.ws.ping} ms\``
)
.setColor(supportbot.Embed.Colours.General);
interaction.reply({
embeds: [PingEmbed],
});
},
});
+70 -43
View File
@@ -289,112 +289,141 @@ function parseMarkdown(content) {
function createTranscriptHTML(ticket, reason) {
return `
<!DOCTYPE html>
<html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ticket Transcript</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
<style>
body {
background: url('file-EWLgzFEYsq16ANVg6ENJrP.png') no-repeat center center fixed;
background-size: cover;
background: linear-gradient(135deg, #0f2027, #203a43, #2c5364);
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
color: #ffffff;
color: #e5e7eb;
margin: 0;
padding: 20px;
padding: 40px;
}
.container {
max-width: 1000px;
margin: 0 auto;
padding: 20px;
backdrop-filter: blur(10px);
background: rgba(0,0,0,0.4);
margin: auto;
padding: 25px;
border-radius: 20px;
box-shadow: 0 8px 32px rgba(0,0,0,0.5);
backdrop-filter: blur(18px) saturate(180%);
background: rgba(17, 25, 40, 0.75);
box-shadow: 0 8px 32px rgba(0,0,0,0.6);
border: 1px solid rgba(255, 255, 255, 0.1);
}
h1 {
font-size: 2.5rem;
font-weight: bold;
font-size: 2rem;
font-weight: 700;
text-align: center;
color: #22c55e; /* green accent */
margin-bottom: 20px;
text-shadow: 0 0 4px rgba(34,197,94,0.4); /* subtle glow */
}
.ticket-info {
margin-bottom: 25px;
padding: 15px;
border-radius: 12px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255,255,255,0.1);
}
.ticket-info p {
margin: 5px 0;
margin: 6px 0;
font-size: 0.95rem;
}
.message {
backdrop-filter: blur(15px);
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.2);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 15px;
padding: 15px;
padding: 16px;
margin-bottom: 15px;
transition: transform 0.2s;
transition: all 0.2s ease-in-out;
}
.message:hover {
transform: scale(1.02);
background: rgba(255, 255, 255, 0.08);
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(0,0,0,0.4);
}
.message-header {
display: flex;
align-items: center;
margin-bottom: 10px;
margin-bottom: 12px;
}
.avatar {
width: 50px;
height: 50px;
width: 45px;
height: 45px;
border-radius: 50%;
margin-right: 15px;
border: 2px solid rgba(255,255,255,0.3);
margin-right: 12px;
border: 2px solid rgba(34,197,94,0.6);
}
.username {
font-weight: bold;
color: #00ffe4;
font-size: 1.1rem;
font-weight: 600;
color: #22c55e;
}
.timestamp {
margin-left: auto;
color: #aaa;
font-size: 0.85rem;
color: #9ca3af;
}
.content {
word-break: break-word;
font-size: 1rem;
font-size: 0.95rem;
line-height: 1.4rem;
}
.embed {
border-left: 4px solid #00ffe4;
padding-left: 10px;
margin: 10px 0;
background: rgba(255, 255, 255, 0.05);
border-radius: 10px;
margin-top: 12px;
border-left: 4px solid #22c55e;
padding-left: 12px;
border-radius: 6px;
background: rgba(34,197,94,0.1);
}
.embed strong {
color: #f9fafb;
}
.attachment {
display: inline-block;
background-color: rgba(0, 255, 228, 0.1);
border: 1px solid #00ffe4;
border-radius: 5px;
padding: 5px 10px;
margin: 5px 0;
color: #00ffe4;
background: rgba(34,197,94,0.1);
border: 1px solid #22c55e;
border-radius: 6px;
padding: 6px 12px;
margin: 6px 0;
color: #22c55e;
text-decoration: none;
font-size: 0.9rem;
}
.attachment:hover {
background: rgba(34,197,94,0.2);
}
code, pre {
background: rgba(0,0,0,0.4);
color: #f8fafc;
padding: 4px 8px;
border-radius: 6px;
font-family: 'Consolas', 'Monaco', monospace;
}
</style>
</head>
<body>
<div class="container">
<h1>Ticket Transcript</h1>
<div class="ticket-info mb-6">
<div class="ticket-info">
<p><strong>Channel:</strong> ${ticket.name}</p>
<p><strong>Ticket ID:</strong> ${ticket.id}</p>
<p><strong>Message Count:</strong> ${ticket.messages.length}</p>
@@ -426,9 +455,7 @@ function createTranscriptHTML(ticket, reason) {
`).join('')}
${msg.attachments.map(att => `
<a href="${att.url}" class="attachment" target="_blank">
📎 ${att.name}
</a>
<a href="${att.url}" class="attachment" target="_blank">📎 ${att.name}</a>
`).join('')}
</div>
</div>
+64
View File
@@ -0,0 +1,64 @@
// SupportBot | Emerald Services
// Info Command
const fs = require("fs");
const {
EmbedBuilder,
ApplicationCommandOptionType,
ApplicationCommandType,
ChannelType,
ActionRowBuilder,
ButtonBuilder,
StringSelectMenuBuilder,
StringSelectMenuOptionBuilder,
ButtonStyle,
MessageCollector,
MessageFlags,
ModalBuilder,
TextInputBuilder,
TextInputStyle,
SeparatorBuilder,
ContainerBuilder,
TextDisplayBuilder
} = require("discord.js");
const yaml = require("js-yaml");
const supportbot = yaml.load(
fs.readFileSync("./Configs/supportbot.yml", "utf8")
);
const cmdconfig = yaml.load(
fs.readFileSync("./Configs/commands.yml", "utf8")
);
const msgconfig = yaml.load(
fs.readFileSync("./Configs/messages.yml", "utf8")
);
const Command = require("../../Structures/Command.js");
module.exports = new Command({
name: cmdconfig.TicketRename.Command,
description: cmdconfig.TicketRename.Description,
options: [],
permissions: cmdconfig.TicketRename.Permission,
async run(interaction) {
const modal = new ModalBuilder()
.setCustomId("renameTicketModal")
.setTitle("Rename Channel")
.addComponents(
new ActionRowBuilder().addComponents(
new TextInputBuilder()
.setCustomId("renameTicket")
.setLabel("New Channel Name")
.setStyle(TextInputStyle.Short)
.setRequired(true)
)
);
return interaction.showModal(modal);
},
});
+58 -24
View File
@@ -11,6 +11,9 @@ const {
ButtonStyle,
MessageCollector,
MessageFlags,
SeparatorBuilder,
ContainerBuilder,
TextDisplayBuilder
} = require("discord.js");
const yaml = require("js-yaml");
@@ -455,32 +458,61 @@ module.exports = new Command({
.setColor(supportbot.Embed.Colours.General);
await interaction.reply({ embeds: [CreatedTicket], flags: MessageFlags.Ephemeral });
const TicketMessage = new EmbedBuilder()
.setAuthor({
name: msgconfig.Ticket.TicketAuthorTitle.replace(/%ticketauthor%/g, interaction.user.id)
.replace(/%ticketid%/g, ticketChannel.id)
.replace(/%ticketusername%/g, interaction.user.username),
iconURL: interaction.user.displayAvatarURL(),
})
.setTitle(
msgconfig.Ticket.TicketTitle.replace(/%ticketauthor%/g, interaction.user.id)
.replace(/%ticketid%/g, ticketChannel.id)
.replace(/%ticketusername%/g, interaction.user.username)
// TICKET MESSAGE - UPDATED WITH COMPONENTS V2
const ticketMsgContainer = new ContainerBuilder()
if (supportbot.Embed.Colours.General) {
ticketMsgContainer.setAccentColor(
parseInt(supportbot.Embed.Colours.General.replace("#", ""), 16)
)
.setDescription(
msgconfig.Ticket.TicketMessage.replace(/%ticketauthor%/g, interaction.user.id)
.replace(/%ticketid%/g, ticketChannel.id)
.replace(/%ticketusername%/g, interaction.user.username)
.replace(/%ticketreason%/g, TicketSubject)
)
.setColor(supportbot.Embed.Colours.General);
}
const ticketAuthor = new TextDisplayBuilder().setContent(
msgconfig.Ticket.TicketAuthorTitle.replace(/%ticketauthor%/g, interaction.user.id)
.replace(/%ticketid%/g, ticketChannel.id)
.replace(/%ticketusername%/g, interaction.user.username),
);
ticketMsgContainer.addTextDisplayComponents(ticketAuthor)
const ticketTitle = new TextDisplayBuilder().setContent(
msgconfig.Ticket.TicketTitle.replace(/%ticketauthor%/g, interaction.user.id)
.replace(/%ticketid%/g, ticketChannel.id)
.replace(/%ticketusername%/g, interaction.user.username)
);
ticketMsgContainer.addTextDisplayComponents(ticketTitle)
const seperator2 = new SeparatorBuilder()
.setDivider(true)
ticketMsgContainer.addSeparatorComponents(seperator2)
const ticketDescription = new TextDisplayBuilder().setContent(
msgconfig.Ticket.TicketMessage.replace(/%ticketauthor%/g, interaction.user.id)
.replace(/%ticketid%/g, ticketChannel.id)
.replace(/%ticketusername%/g, interaction.user.username)
.replace(/%ticketreason%/g, TicketSubject)
);
ticketMsgContainer.addTextDisplayComponents(ticketDescription)
const seperator3 = new SeparatorBuilder()
.setDivider(true)
ticketMsgContainer.addSeparatorComponents(seperator3)
const ticketReason = new TextDisplayBuilder().setContent(
`**Reason:**\n ${TicketReason}`
);
if (supportbot.Ticket.TicketReason && TicketReason) {
TicketMessage.addFields(
{ name: "Reason", value: TicketReason, inline: false }
);
ticketMsgContainer.addTextDisplayComponents(ticketReason)
}
const selectMenuRow = new ActionRowBuilder();
const SelectMenus = new StringSelectMenuBuilder()
.setCustomId("ticketcontrolpanel")
.setPlaceholder("Ticket Control Panel")
@@ -529,11 +561,13 @@ module.exports = new Command({
);
}
const row2 = new ActionRowBuilder().addComponents(SelectMenus);
selectMenuRow.addComponents(SelectMenus)
ticketMsgContainer.addActionRowComponents(selectMenuRow)
await ticketChannel.send({
embeds: [TicketMessage],
components: [row2],
flags: MessageFlags.IsComponentsV2,
components: [ticketMsgContainer],
});
if (supportbot.Ticket.Questions.Enabled) {
+84 -16
View File
@@ -5,6 +5,12 @@ const {
ActionRowBuilder,
ButtonBuilder,
MessageFlags,
ContainerBuilder,
TextDisplayBuilder,
MediaGalleryBuilder,
SeparatorBuilder,
ThumbnailBuilder,
SectionBuilder
} = require("discord.js");
const yaml = require("js-yaml");
@@ -52,6 +58,7 @@ module.exports = new Command({
}
const panelRow = db.getTicketPanel();
if (panelRow) {
try {
await channel.messages.fetch(panelRow.message_id);
@@ -62,24 +69,35 @@ module.exports = new Command({
} catch (err) {}
}
let embed = new EmbedBuilder()
.setTitle(panelconfig.PanelTitle)
.setColor(panelconfig.PanelColour)
.setFooter({
text: supportbot.Embed.Footer,
iconURL: interaction.user.displayAvatarURL(),
});
const panelContainer = new ContainerBuilder()
if (panelconfig.TicketPanel_Description) {
embed.setDescription(panelconfig.PanelMessage);
if (panelconfig.Style.Color) {
panelContainer.setAccentColor(
parseInt(panelconfig.Style.Color.replace("#", ""), 16)
)
}
if (panelconfig.TicketPanel_Thumbnail) {
embed.setThumbnail(panelconfig.PanelThumbnail);
const panelTitle = new TextDisplayBuilder().setContent(
panelconfig.Style.Title,
);
const topSeperator = new SeparatorBuilder()
.setDivider(true)
if (panelconfig.Settings.TopTitle) {
panelContainer.addTextDisplayComponents(panelTitle)
}
if (panelconfig.TicketPanel_Image) {
embed.setImage(panelconfig.PanelImage);
if (panelconfig.Settings.TopDivider) {
panelContainer.addSeparatorComponents(topSeperator)
}
const panelDesc = new TextDisplayBuilder().setContent(
panelconfig.Style.Description,
);
if (panelconfig.Style.Layout === "3") {
panelContainer.addTextDisplayComponents(panelDesc)
}
const createTicketButton = new ButtonBuilder()
@@ -88,12 +106,62 @@ module.exports = new Command({
.setEmoji(panelconfig.Button.Emoji)
.setStyle(panelconfig.Button.Color);
let row = new ActionRowBuilder().addComponents(createTicketButton);
const middleSection = new SectionBuilder()
.addTextDisplayComponents(panelDesc)
.setButtonAccessory(createTicketButton)
if (panelconfig.Style.Layout === "1") {
panelContainer.addSectionComponents(middleSection)
}
const panelImage = new MediaGalleryBuilder()
.addItems([
{
media: {
url: panelconfig.Style.Image,
},
}
])
if (panelconfig.Settings.Image) {
panelContainer.addMediaGalleryComponents(panelImage)
}
// START OF STYLE 2 - TEXT UNDER THE IMAGE
const bottomSeperator = new SeparatorBuilder()
.setDivider(true)
if (panelconfig.Settings.BottomTitle) {
panelContainer.addTextDisplayComponents(panelTitle)
}
if (panelconfig.Settings.BottomDivider) {
panelContainer.addSeparatorComponents(bottomSeperator)
}
if (panelconfig.Style.Layout === "2") {
panelContainer.addSectionComponents(middleSection)
}
// START OF STYLE 3
const buttonRow = new ActionRowBuilder();
const ticketButtonRow = new ButtonBuilder()
.setCustomId("createticket")
.setLabel(panelconfig.Button.Text)
.setEmoji(panelconfig.Button.Emoji)
.setStyle(panelconfig.Button.Color);
buttonRow.addComponents(ticketButtonRow)
if (panelconfig.Style.Layout === "3") {
panelContainer.addActionRowComponents(buttonRow)
}
try {
const message = await channel.send({
embeds: [embed],
components: [row],
flags: MessageFlags.IsComponentsV2,
components: [panelContainer],
});
db.saveTicketPanel(message.id, channel.id);
+9
View File
@@ -37,12 +37,21 @@ Profile:
Permission: ["SendMessages"]
# Command is automatically disabled when the TicketClaims is disabled.
OpenTicket:
Command: "ticket"
Description: "Create a support ticket."
Permission: ["SendMessages"]
Enabled: true
TicketRename:
Command: "rename"
Description: "Rename a support ticket."
Permission: ["SendMessages"]
Enabled: true
AddUser:
Command: "add"
Description: "Add a user to a support ticket."
+13 -8
View File
@@ -117,8 +117,18 @@ Ticket:
# <@%ticketauthor%> - Tags the user who created the ticket.
# <#%ticketid%> - Mentions the ticket channel.
TicketAuthorTitle: "%ticketusername%'s Ticket"
TicketTitle: "Support Ticket"
# You can use Markdown formatting in this message:
# # Heading 1
# ## Heading 2
# ### Heading 3
# **Bold** text
# *Italic* text
# -# Small text
# - Bullet points
# Links: [text](https://example.com)
TicketAuthorTitle: "-# %ticketusername%'s Ticket"
TicketTitle: "## Support Ticket"
TicketMessage: "Hello <@%ticketauthor%>, Thank you for creating a support ticket\nPlease wait patiently whilst a member of our team reaches out to you."
TicketThumbnail: "https://images.emojiterra.com/google/android-pie/512px/1f39f.png"
TicketCreatedAlert: ":ticket: Ticked Created: <#%ticketid%>"
@@ -315,9 +325,4 @@ Error:
EntryAlreadyExists: ":warning: Cannot complete the action, as the entry already exists."
EntryDoesNotExist: ":warning: Cannot complete the action, as the entry does not exist."
ActionFailed: ":x: **Error!** An error occurred while processing your request. Please try again later."
InvalidChannel: ":x: **Error!** The suggestions channel has not been set up correctly."
+33 -34
View File
@@ -13,7 +13,7 @@
#
# SupportBot Configuration (supportbot.yml)
SupportBot_Version: "v8.4-DEV-2"
SupportBot_Version: "v8.5"
# -------------------------
# General
@@ -21,7 +21,7 @@ SupportBot_Version: "v8.4-DEV-2"
General:
Name: "SupportBot"
Token: ""
Token: "BBOT_TOKEN_HERE"
Addons:
Enabled: true
@@ -50,10 +50,10 @@ Activity:
Embed:
Colours:
General: 0x0cc559
Success: 0x04b545
Error: 0xd13030
Warn: 0xfca117
General: "#0cc559"
Success: "#04b545"
Error: "#d13030"
Warn: "#fca117"
Footer: "SupportBot | Developed by Emerald Development"
@@ -66,12 +66,12 @@ Embed:
Roles:
AutoRole:
Enabled: true
Role: "1202669457751801917"
Role: "ROLE_ID"
StaffMember:
Staff: "996420644373811371"
Admin: "996419960442208326"
Moderator: "996420644373811371"
Staff: "ROLE_ID"
Admin: "ROLE_ID"
Moderator: "ROLE_ID"
Mod:
AllowSupportStaff: false
@@ -84,11 +84,11 @@ Roles:
Welcome:
Enabled: true
Channel: "1295788797065166869"
Channel: "WELCOME_CHANNEL_ID"
Leave:
Enabled: true
Channel: "1295788797065166869"
Channel: "LEAVE_CHANNEL_ID "
# ----------------------------
# Suggestions
@@ -96,8 +96,8 @@ Leave:
Suggestions:
Mode: "Channel" # Channel or Forum
ForumChannel: "1402655496477081671"
Channel: "1295788900094316706"
ForumChannel: "FORUM_CHANNEL_ID" # A forum channel, disabled if mode is set to Channel.
Channel: "SUGGESTIONS_CHANNEL_ID" # A text channel, disabled if mode is set to Forum.
UpvoteEmoji: "✅"
DownvoteEmoji: "❌"
@@ -130,10 +130,10 @@ Suggestions:
# 4 - Red
Tags:
Created: "1418937323118137435"
Considering: "1418937237156139130"
Solved: "1418937168029679697"
Denied: "1418937185469464647"
Created: "TAG_ID"
Considering: "TAG_ID"
Solved: "TAG_ID"
Denied: "TAG_ID"
# -------------------------
# Tickets
@@ -141,25 +141,25 @@ Suggestions:
VoiceTickets:
Name: "%username%'s VC"
Category: "1419062819688550460"
Category: "VC_CATEGORY_ID"
Ticket:
TicketType: "threads"
TicketType: "channels"
# Available TicketTypes:
# channels - Tickets will be created as channels in the TicketChannelsCategory
# threads - Tickets will be created as threads through the "TicketHome" channel.
TicketHome: "1295784943204700171"
TicketHome: "TICKET_HOME_CHANNEL_ID"
# What is TicketHome?
# - Channel where the Ticket creation panel is sent.
# - Channel where ticket threads are made. (only if ticket threads is enabled above.)
# For TicketType: channels
TicketChannelsCategory: "1418988408193155112"
TicketChannelsCategory2: "1418988456167870615" # This will be used if the first category has reached the max channel limit.
TicketArchiveCategory: "1418988434600759348"
TicketChannelsCategory: "TICKET_CHANNELS_CATEGORY_ID"
TicketChannelsCategory2: "TICKET_CHANNELS_CATEGORY_ID_2" # This will be used if the first category has reached the max channel limit.
TicketArchiveCategory: "TICKET_ARCHIVE_CATEGORY_ID"
# ---
Channel: "ticket-" # The prefix for ticket channel names
@@ -197,8 +197,8 @@ Ticket:
StaffOnly: true
ClaimTickets:
Enabled: true
Channel: "1295789389619793961"
Enabled: false
Channel: "CLAIM_TICKETS_CHANNEL_ID"
# Channel where the ticket assignments are sent for staff to claim.
ClaimAcceptTime: 120000
@@ -220,8 +220,8 @@ Ticket:
# 4 - Red
ReviewSystem:
Enabled: false
Channel: "1304480728884445225"
Enabled: true
Channel: "REVIEW_CHANNEL_ID"
UseModal: true
Questions:
@@ -232,9 +232,9 @@ Ticket:
- "Have you tried resolving the issue yourself?"
Log:
TicketDataLog: "1339271338761650290"
TicketDataLog: "TICKKET_DATA_LOG_CHANNEL_ID"
TickeDataTitle: "Ticket Data"
TicketBlacklistLog: "1339271338761650290"
TicketBlacklistLog: "TICKET_BLACKLIST_LOG_CHANNEL_ID"
# -------------------------
# Buttons
@@ -258,7 +258,6 @@ Buttons:
Unlock: "Unlock Ticket"
Unlock_Emoji: "🔓"
Unlock_Style: "2"
# Available Button Styles
# 1 - Blurple
# 2 - Grey
@@ -287,12 +286,12 @@ SelectMenus:
# -------------------------
MessageDelete:
Channel: "1202671982932402246"
Channel: "LOG_CHANNEL_ID"
Colour: "#d92525"
MessageUpdate:
Channel: "1202671982932402246"
Channel: "LOG_CHANNEL_ID"
Colour: "#f2a024"
Translate:
TranslateLog: "1202671982932402246"
TranslateLog: "LOG_CHANNEL_ID"
+25 -11
View File
@@ -19,19 +19,28 @@
Panel: true
LayoutStyle: modern
# ----------------------------------------
# Ticket Panel Message Configuration #2b2d31
# ----------------------------------------
PanelTitle: "SupportBot"
PanelColour: "#0cc559"
Style:
Title: "## SupportBot Ticket Creation"
Description: "Click on the button to file a `Ticket` and our team will try their best to assist you in the best way we can!"
Image: "https://i.imgur.com/dejQvkg.png"
Color: "#45b463"
# Leave Color empty to remove the color from the embed/container.
Layout: "3"
# Available Layout Styles
# "1" - Style 1 - Title & Text, Button at the top -- Image at the bottom
# "2" - Style 2 - Title & Text, Button at the bottom -- Image at the top
# "3" - Style 3 - The classic look - Title & Text at the top -- Image in the middle -- Button at the bottom
Button:
Text: "Create Ticket"
Emoji: "🎫"
Color: "2"
Color: "3"
# Available Button Styles
# 1 - Blurple
@@ -39,10 +48,15 @@ Button:
# 3 - Red
# 4 - Green
TicketPanel_Description: true
TicketPanel_Thumbnail: false
TicketPanel_Image: true
Settings:
Image: true
PanelMessage: "Click on the button to file a `Ticket` and our team will try their best to assist you in the best way we can!"
PanelThumbnail: "https://i.imgur.com/ieeZejl.png"
PanelImage: "https://i.imgur.com/dejQvkg.png"
# Text and divider will appear above the image.
TopTitle: true
TopDivider: true
# Text and divider will appear below the image.
BottomTitle: false
BottomDivider: false
# Note: If Image is set to false, the bottom and top settings will look the samme.
+1 -1
View File
@@ -1 +1 @@
{}
+6 -3
View File
@@ -35,10 +35,12 @@ function getWelcomeThumbnail(client, member, iconCfg) {
}
function buildModernComponents(client, member) {
const container = new ContainerBuilder().setAccentColor(
parseInt(msgconfig.Welcome.Modern.Colour.replace("#", ""), 16)
);
const container = new ContainerBuilder()
if (msgconfig.Welcome.Modern.Colour) {
container .setAccentColor(parseInt(msgconfig.Welcome.Modern.Colour.replace("#", ""), 16));
}
const section = new SectionBuilder().addTextDisplayComponents(
new TextDisplayBuilder().setContent(
msgconfig.Welcome.Modern.Title.replace(/%joined_user%/g, member.user)
@@ -79,6 +81,7 @@ function buildModernComponents(client, member) {
});
container.addActionRowComponents(row);
}
return [container];
+1 -1
View File
@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2025 Emerald Services
Copyright (c) 2026 Emerald Services
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+3 -3
View File
@@ -28,8 +28,8 @@
| SupportBot | Node.JS | Discord.JS | Supported |
|------------|---------|------------|------------|
| 8.x | 20.x | 14.x. | ✅ Yes
| 7.7.3 | 16.x | 13.x. | ✅ Yes
| 8.x | 22.x | 14.x. | ✅ Yes
| 7.7.3 | 16.x | 13.x. | ❌ No
| 7.x | 16.x | 13.x. | ❌ No
| 6.x | 14.x | 13.x. | ❌ No
| 5.x | 12.x | 13.x. | ❌ No
@@ -74,7 +74,7 @@ Released under the [MIT](https://opensource.org/licenses/MIT) license.
- [Official addons repository](https://github.com/Emerald-Services/Addons/)
- [Syphers Addons](https://github.com/SypherRed/SB_Addons_Unofficial)
- [BuiltByBit](https://builtbybit.com/supportbot)
- [BuiltByBit]([https://builtbybit.com/supportbot](https://builtbybit.com/resources/supportbot-advanced-ticket-bot.8940/))
- [Polymart](https://polymart.org/resource/supportbot-1-discord-ticket-bot.518)
+4 -4
View File
@@ -41,26 +41,26 @@ logTypes.forEach((type) => {
function logToFile(type, data) {
const date = new Date().toISOString().split("T")[0];
const file = path.join(`./logs/${type}`, `${type}-${date}.log`);
const file = path.join(`./Logs/${type}`, `${type}-${date}.log`);
fs.appendFileSync(file, `[${new Date().toISOString()}] ${data}\n`);
}
const origLog = console.log;
console.log = (...args) => {
origLog(...args);
logToFile("output", args.join(" "));
logToFile("Output", args.join(" "));
};
const origWarn = console.warn;
console.warn = (...args) => {
origWarn(...args);
logToFile("warn", args.join(" "));
logToFile("Warn", args.join(" "));
};
const origError = console.error;
console.error = (...args) => {
origError(...args);
logToFile("error", args.join(" "));
logToFile("Error", args.join(" "));
};
process.on("unhandledRejection", (reason) => {