This commit is contained in:
DJj123dj
2022-08-16 13:00:17 +02:00
parent 697594b311
commit c990257c02
11 changed files with 110 additions and 430 deletions
+8 -7
View File
@@ -7,7 +7,7 @@ make a ticket in our server to start!
*if you translate, you will come in the credits*
# open-ticket
[![discord](https://img.shields.io/badge/discord-join%20our%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-2.5.0-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v2.5.0) [![npm](https://img.shields.io/badge/npm-external%20libraries%20needed-CB3837.svg?style=flat-square&logo=npm)](#packages) [![license](https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE)
[![discord](https://img.shields.io/badge/discord-join%20our%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-2.5.1-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v2.5.1) [![npm](https://img.shields.io/badge/npm-external%20libraries%20needed-CB3837.svg?style=flat-square&logo=npm)](#packages) [![license](https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE)
This is an open-source discord ticket bot, you can configure it and it comes with cool features like transcripts & custom options!
@@ -20,10 +20,11 @@ This is an open-source discord ticket bot, you can configure it and it comes wit
- Sanke: for translation & new ideas
- Everyone that reported a bug
#### And our translators!
- ExothDE: for translation
- 1x1: for translation
- R0JO: for translation
- t0miiis for translation
- ExothDE
- 1x1
- R0JO
- t0miiis
- josuens14
## features
- discord interaction buttons
@@ -68,7 +69,7 @@ if there are any errors, you can open an **issue on github** or **contact me in
### config
Our config documentation is moved to another file:
[click here to view](https://www.github.com/DJj123dj/open-ticket/wiki/config-v2.5.0)
[click here to view](https://www.github.com/DJj123dj/open-ticket/wiki/config-v2.5.1)
### intents & permissions
In the discord developer portal in the "bot" panel you will find 3 switches under the title "Gateaway Intents". The following switches should always be turned on
@@ -80,7 +81,7 @@ You can also configure your own permissions
## information
_v2.5.0 stable_
_v2.5.1 stable_
changelog: [click here](https://www.github.com/DJj123dj/open-ticket/wiki/Changelog)
+1 -1
View File
@@ -53,7 +53,7 @@ module.exports = () => {
if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
permsChecker.sendUserNoPerms(interaction.user)
return interaction.reply({embeds:[bot.errorLog.noPermsDelete]})
return interaction.reply({embeds:[bot.errorLog.noPermsDelete(interaction.user)]})
}
interaction.channel.messages.fetchPinned().then(msglist => {
+1 -1
View File
@@ -79,7 +79,7 @@
"description":"You can click one of the buttons below!",
"enableFooter":false,
"footer":"Open Ticket v2.5.0 - I'm a footer!",
"footer":"Open Ticket v2.5.1 - I'm a footer!",
"enableThumbnail":false,
"thumbnail":"https://www.example.com/catmemes/cat.png",
-331
View File
@@ -1,331 +0,0 @@
const discord = require('discord.js')
const bot = require('../index')
const client = bot.client
const config = bot.config
const l = bot.language
module.exports = () => {
//closebar
var closeBar = new discord.ActionRowBuilder()
.addComponents(
new discord.ButtonBuilder()
.setCustomId("closeTicketTrue")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("✅")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("closeTicketFalse")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("❌")
)
var deleteBar = new discord.ActionRowBuilder()
.addComponents(
new discord.ButtonBuilder()
.setCustomId("deleteTicketTrue")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("✅")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("deleteTicketFalse")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("❌")
)
var deleteBar1 = new discord.ActionRowBuilder()
.addComponents(
new discord.ButtonBuilder()
.setCustomId("deleteTicketTrue1")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("✅")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("deleteTicketFalse1")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("❌")
)
//closebutton
var closeRowNormal = new discord.ActionRowBuilder()
.addComponents(
new discord.ButtonBuilder()
.setCustomId("closeTicket")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setLabel(l.buttons.close)
.setEmoji("🔒")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("deleteTicket")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
var closeRowClosed = new discord.ActionRowBuilder()
.addComponents(
new discord.ButtonBuilder()
.setCustomId("deleteTicket1")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("sendTranscript")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setLabel(l.buttons.sendTranscript)
.setEmoji("📄")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("reopenTicket")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Success)
.setLabel(l.buttons.reopen)
.setEmoji("✔")
)
var closeRowDisabled = new discord.ActionRowBuilder()
.addComponents(
new discord.ButtonBuilder()
.setCustomId("closeTicket")
.setDisabled(true)
.setStyle(discord.ButtonStyle.Secondary)
.setLabel(l.buttons.close)
.setEmoji("🔒")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("deleteTicket")
.setDisabled(true)
.setStyle(discord.ButtonStyle.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
//NORMAL CLOSE
client.on("interactionCreate",interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "closeTicket") return
interaction.deferUpdate()
interaction.message.edit({components:[closeBar]})
})
client.on("interactionCreate",interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "closeTicketFalse") return
interaction.deferUpdate()
interaction.message.edit({components:[closeRowNormal]})
})
var closeTicketButtonChecker = false
client.on("interactionCreate",async interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "closeTicketTrue") return
interaction.deferUpdate()
if (closeTicketButtonChecker == true) return
closeTicketButtonChecker = true
if (config.system.closeMode == "adminonly"){
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
try {
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]})
}catch{
return msg.channel.send({embeds:[bot.errorLog.noPermsMessage]})
}
}
}
interaction.message.edit({components:[closeRowDisabled]})
/**
* @type {String}
*/
const name = interaction.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
await require("./ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close")
closeTicketButtonChecker = false
})
var closeTicket1ButtonChecker = false
client.on("interactionCreate",async interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "closeTicketTrue1") return
interaction.deferUpdate()
if (closeTicket1ButtonChecker == true) return
closeTicket1ButtonChecker = true
if (config.system.closeMode == "adminonly"){
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
try {
return interaction.member.send({embeds:[bot.errorLog.noPermsMessage]})
}catch{
return interaction.channel.send({embeds:[bot.errorLog.noPermsMessage]})
}
}
}
const closedButtonDisabled = new discord.ActionRowBuilder()
.addComponents([
new discord.ButtonBuilder()
.setCustomId("closeTicketTrue1")
.setDisabled(true)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("🔒")
])
interaction.message.edit({components:[closedButtonDisabled]})
interaction.channel.messages.fetchPinned().then((messages) => {
messages.first().edit({components:[closeRowDisabled]})
})
/**
* @type {String}
*/
const name = interaction.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
await require("./ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close")
closeTicket1ButtonChecker = false
})
//NORMAL DELETE
client.on("interactionCreate",interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "deleteTicket") return
interaction.deferUpdate()
interaction.message.edit({components:[deleteBar]})
})
client.on("interactionCreate",interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "deleteTicketFalse") return
interaction.deferUpdate()
interaction.message.edit({components:[closeRowNormal]})
})
var deleteTicketButtonChecker = false
client.on("interactionCreate",async interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "deleteTicketTrue") return
interaction.deferUpdate()
if (deleteTicketButtonChecker == true) return
deleteTicketButtonChecker = true
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
try {
return interaction.member.send({embeds:[bot.errorLog.noPermsMessage]})
}catch{
return interaction.channel.send({embeds:[bot.errorLog.noPermsMessage]})
}
}
/**
* @type {String}
*/
const name = interaction.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
await require("./ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete")
deleteTicketButtonChecker = false
})
//CLOSED DELETE
client.on("interactionCreate",interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "deleteTicket1") return
interaction.deferUpdate()
interaction.message.edit({components:[deleteBar1]})
})
client.on("interactionCreate",interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "deleteTicketFalse1") return
interaction.deferUpdate()
interaction.message.edit({components:[closeRowClosed]})
})
var deleteTicket1ButtonChecker = false
client.on("interactionCreate",async interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "deleteTicketTrue1") return
interaction.deferUpdate()
if (deleteTicket1ButtonChecker == true) return
deleteTicket1ButtonChecker = true
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
try {
return interaction.member.send({embeds:[bot.errorLog.noPermsMessage]})
}catch{
return interaction.channel.send({embeds:[bot.errorLog.noPermsMessage]})
}
}
/**
* @type {String}
*/
const name = interaction.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
await require("./ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"deletenotranscript")
deleteTicket1ButtonChecker = false
})
}
+10 -2
View File
@@ -10,15 +10,23 @@ const loadChalk = async () => {
const embed = discord.EmbedBuilder
const c = discord.Colors
exports.noPermsMessage = new embed()
/**@param {discord.User} user*/
exports.noPermsMessage = (user) => {
return new embed()
.setColor(c.Red)
.setTitle(":x: "+l.errors.noPermsTitle)
.setDescription(l.errors.noPermsDescription)
.setFooter({iconURL:user.displayAvatarURL(),text:user.tag})
}
exports.noPermsDelete = new embed()
/**@param {discord.User} user*/
exports.noPermsDelete = (user) => {
return new embed()
.setColor(c.Red)
.setTitle(":x: "+l.errors.noPermsTitle)
.setDescription(l.errors.noPermsDelete)
.setFooter({iconURL:user.displayAvatarURL(),text:user.tag})
}
/**@param {String} message */
exports.invalidArgsMessage = (message) => {
@@ -33,7 +33,7 @@ module.exports = () => {
if (config.system.closeMode == "adminonly"){
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
if (!permissionChecker.sendUserNoPerms(interaction.user)){
permissionChecker.sendChannelNoPerms(interaction.channel)
permissionChecker.sendChannelNoPerms(interaction.channel,interaction.user)
}
interaction.message.edit({components:[firstcomponents]})
closeTicketButtonChecker = false
@@ -32,7 +32,7 @@ module.exports = () => {
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
if (!permissionChecker.sendUserNoDelete(interaction.user)){
permissionChecker.sendChannelNoDelete(interaction.channel)
permissionChecker.sendChannelNoDelete(interaction.channel,interaction.user)
}
await interaction.message.edit({components:[firstcomponents]})
deleteTicketButtonChecker = false
@@ -70,10 +70,9 @@ module.exports = () => {
const firstcomponents = bot.buttons.close.closeCommandRow
console.log("closed with NO TRANSCRIPT")
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
if (!permissionChecker.sendUserNoDelete(interaction.user)){
permissionChecker.sendChannelNoDelete(interaction.channel)
permissionChecker.sendChannelNoDelete(interaction.channel,interaction.user)
}
await interaction.message.edit({components:[firstcomponents]})
deleteTicketButtonChecker1 = false
+2 -2
View File
@@ -47,7 +47,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
const chalk = await (await import("chalk")).default
const channelmessages = await channel.messages.fetch()
const newReason = reason ? reason : "none"
const newReason = reason ? reason : l.messages.none
//start code
@@ -298,7 +298,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
if (enableTranscript == true && mode != "deletenotranscript"){
const transcriptReason = (mode == "close") ? "**reason:** "+newReason : "**reason:** none"
const transcriptReason = (mode == "close") ? "**"+l.messages.reason+":** "+newReason : "**"+l.messages.reason+":** none"
if (config.system.enable_transcript || config.system.enable_DM_transcript){
var fileattachment = await require("./transcript").createTranscript(channelmessages,channel)
+10 -7
View File
@@ -26,7 +26,7 @@ exports.command = (memberid,guildid) => {
*/
exports.sendUserNoPerms = (user) => {
try {
user.send({embeds:[bot.errorLog.noPermsMessage]})
user.send({embeds:[bot.errorLog.noPermsMessage(user)]})
return true
}catch{
return false
@@ -54,7 +54,7 @@ exports.sendUserNoPerms = (user) => {
*/
exports.sendUserNoDelete = (user) => {
try {
user.send({embeds:[bot.errorLog.noPermsDelete]})
user.send({embeds:[bot.errorLog.noPermsDelete(user)]})
return true
}catch{
return false
@@ -64,11 +64,12 @@ exports.sendUserNoPerms = (user) => {
/**
*
* @param {discord.TextChannel} channel
* @param {discord.User} user
* @returns {Boolean}
*/
exports.sendChannelNoPerms = (channel) => {
exports.sendChannelNoPerms = (channel,user) => {
try {
channel.send({embeds:[bot.errorLog.noPermsMessage]})
channel.send({embeds:[bot.errorLog.noPermsMessage(user)]})
return true
}catch{
return false
@@ -78,9 +79,10 @@ exports.sendUserNoPerms = (user) => {
/**
*
* @param {discord.TextChannel} channel
* @param {discord.User} user
* @returns {Boolean}
*/
exports.sendChannelNoTicket = (channel) => {
exports.sendChannelNoTicket = (channel,user) => {
try {
channel.send({embeds:[bot.errorLog.notInATicket]})
return true
@@ -92,11 +94,12 @@ exports.sendUserNoPerms = (user) => {
/**
*
* @param {discord.TextChannel} channel
* @param {discord.User} user
* @returns {Boolean}
*/
exports.sendChannelNoDelete = (channel) => {
exports.sendChannelNoDelete = (channel,user) => {
try {
channel.send({embeds:[bot.errorLog.noPermsDelete]})
channel.send({embeds:[bot.errorLog.noPermsDelete(user)]})
return true
}catch{
return false
+14 -14
View File
@@ -3,8 +3,8 @@
"missingArgsTitle":"¡Argumentos inválidos!",
"missingArgsDescription":"Argumento faltante.",
"noPermsTitle":"¡Sin permisos!",
"noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!",
"noPermsDelete":"Only admins can delete a ticket!",
"noPermsDescription":"Necesitas el permiso de `ADMINISTRADOR` o estar en la lista de roles permitidos!",
"noPermsDelete":"Solo los administradores pueden eliminar un ticket.!",
"chooseFromListTitle":"ID Invalida",
"chooseFromListDescription":"Elije una de las ID de abajo:",
"boterror":"¡Error del bot!",
@@ -19,18 +19,18 @@
"somethingWentWrongTranscript":"**¡Algo salió mal al hacer el transcript!**\n¡Prueba en otro momento!"
},
"commands":{
"userAddedTitle":"Added {0} to this ticket!",
"userRemovedTitle":"Removed {0} from this ticket!",
"renameTitle":"Changed the name to {0}!",
"closeTitle":"Closed this ticket!",
"deleteTitle":"Deleting this ticket...",
"reopenTitle":"Re-Opened this ticket!",
"userAddedTitle":"Se agregó {0} al ticket!",
"userRemovedTitle":"Se eliminó {0} del ticket!",
"renameTitle":"Cambió el nombre a {0}!",
"closeTitle":"Cerró este ticket!",
"deleteTitle":"Eliminando este ticket...",
"reopenTitle":"Re-abrió este boleto!",
"ticketWarning":"The embed is in the message below!",
"maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_"
"ticketWarning":"La inserción está en el mensaje a continuación!",
"maxTicketWarning":"**Advertencia:** _Solo puedes crear {0} ticket(s) a la vez!_"
},
"helpMenu":{
"title":"Available Commands:",
"title":"Comandos disponibles:",
"header1":"**¡Dirígete a {0} para crear un nuevo ticket!**\n\n",
"header2":"**¡Ejecuta el comando `/new` o `/ticket` para crear un ticket!**\n\n",
@@ -66,10 +66,10 @@
"newTranscriptTitle":"¡Un nuevo transcript está aquí!",
"hereIsTheTranscript":"Aquí está el transcript:",
"chooseCategory":"elije una categoría:",
"chooseCategory":"Elije una categoría:",
"gettingdeleted":"El ticket se está viendo eliminado...",
"none":"none",
"reason":"reason"
"none":"Ninguna.",
"reason":"Razón"
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "open-ticket",
"version": "2.5.0",
"version": "2.5.1",
"description": "This is an open-source discord ticket bot, you can configure it and it comes with cool features like a transcript.",
"main": "index.js",
"scripts": {