Compare commits

...
18 Commits
Author SHA1 Message Date
Jasper e7f05b4ed5 Merge pull request #26 from DJj123dj/dev
Update 2.5!
2022-08-15 15:03:37 +02:00
DJj123dj 697594b311 added french & czech translation 2022-08-15 14:55:34 +02:00
DJj123dj 6823b96114 fixed the last bugs & added czech translation 2022-08-14 22:13:51 +02:00
DJj123dj 0845390569 v2.5 (added translation for 2 new languages) 2022-08-14 21:23:04 +02:00
DJj123dj 568b2c9bee v2.5.0 push 2 2022-08-12 11:20:42 +02:00
DJj123dj 034247ea99 v2.5.0 first push 2022-08-10 19:35:10 +02:00
Jasper ad10a98f33 Merge pull request #24 from DJj123dj/dev
v2.4.0 pre release
2022-08-02 14:15:24 +02:00
DJj123dj 8aee358081 last push 2022-08-01 18:23:01 +02:00
DJj123dj e2f237e7b6 api events ready, now only the actions 2022-08-01 18:00:54 +02:00
DJj123dj 210923d29e v2.4.0 push 5 (almost the last one) 2022-07-29 19:41:25 +02:00
DJj123dj a69f2ee5a1 v2.4.0 push 4 2022-07-29 18:17:26 +02:00
DJj123dj ffa075d177 v2.4.0 push 3 2022-07-26 16:33:56 +02:00
DJj123dj e7a331b969 v2.4.0 push 2 (first working api) 2022-07-26 14:51:51 +02:00
DJj123dj 6b32fc9d5d v2.4.0 push 1 2022-07-26 12:25:33 +02:00
Jasper 7603dbcc47 Merge pull request #23 from DJj123dj/dev
fixed ANOTHER bug
2022-07-25 21:01:58 +02:00
DJj123dj 512e564c60 fixed ANOTHER bug 2022-07-25 21:01:36 +02:00
Jasper 5a731e6336 Merge pull request #22 from DJj123dj/dev
small bug fix
2022-07-25 20:54:50 +02:00
DJj123dj d02bf2b826 small bug fix 2022-07-25 20:54:21 +02:00
58 changed files with 2254 additions and 949 deletions
+2 -1
View File
@@ -10,4 +10,5 @@ devConfig5.json
openticketdebug.txt openticketdebug.txt
developerChangelog.md developerChangelog.md
storage/dynamicDB/ storage/dynamicDB/
storage/.DS_Store storage/.DS_Store
.vscode/
+27 -21
View File
@@ -7,7 +7,7 @@ make a ticket in our server to start!
*if you translate, you will come in the credits* *if you translate, you will come in the credits*
# open-ticket # 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.4.0%20stable-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v2.4.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.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)
This is an open-source discord ticket bot, you can configure it and it comes with cool features like transcripts & custom options! This is an open-source discord ticket bot, you can configure it and it comes with cool features like transcripts & custom options!
@@ -18,51 +18,57 @@ This is an open-source discord ticket bot, you can configure it and it comes wit
### Thanks to these people: ### Thanks to these people:
- DJ-Lite: for doing the administration - DJ-Lite: for doing the administration
- Sanke: for translation & new ideas - Sanke: for translation & new ideas
- Everyone that reported a bug
#### And our translators!
- ExothDE: for translation - ExothDE: for translation
- 1x1: for translation - 1x1: for translation
- R0JO: for translation - R0JO: for translation
- Everyone that reported a bug - t0miiis for translation
## features ## features
- discord buttons - discord interaction buttons
- slash & text commands - slash & text commands
- close, delete & re-open tickets - close, delete & re-open tickets
- translation (we are searching for translators!) - translation in 8 different languages
- dynamic database system - dynamic database system
- advanced transcripts - transcripts
- add/remove users from a ticket - add/remove users from a ticket
- large embed customisation - custom colors & name for embeds
- create custom ticket names, icons & colors - customise your ticket
- create url's & reaction roles! - create url buttons for websites
- uses discord.js v13 - create reaction roles
- configure your own ticket options - build with discord.js v14
- remove credits if you want (don't do it please 😉) - configure everything per ticket
- unlimited tickets at the same time - remove credits if you want :(
- unlimited tickets spread over multiple messages
*comming soon:*
- dashboard
- view transcripts in dashboard
- share transcripts
- close with reason
- more translation
## installation ## installation
**You need `node.js 16` to run this project!** **You need `node.js 16` to run this project!**
**At this moment you still need discord.js v13!**
This will change soon!
You can clone or download this project.
### packages ### packages
- chalk => version `latest` - chalk => version `latest`
- discord.js => version `latest` - discord.js => version `latest`
- express => version `latest` - express => version `latest`
- node-localstorage => version `latest` - node-localstorage => version `latest`
- axios => version `latest`
You can install all of them by running `npm install` You can install all of them by running `npm install`
## running ## running
you can run `node index.js` but i would recommend you to use `npm start` you can run `node index.js` but i would recommend you to use `npm start`
if there are any errors, you can open an **issue on github** or **contact me in the discord server**. if there are any errors, you can open an **issue on github** or **contact me in our discord server**.
### config ### config
Our config documentation is moved to another file: Our config documentation is moved to another file:
[click here to view](https://www.github.com/DJj123dj/open-ticket/wiki/config-v2.4.0) [click here to view](https://www.github.com/DJj123dj/open-ticket/wiki/config-v2.5.0)
### intents & permissions ### 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 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
@@ -74,8 +80,8 @@ You can also configure your own permissions
## information ## information
_v2.4.0 stable_ _v2.5.0 stable_
changelog: [click here](https://www.github.com/DJj123dj/open-ticket/wiki/Changelog) changelog: [click here](https://www.github.com/DJj123dj/open-ticket/wiki/Changelog)
© 2022 - DJdj Development | [website](https://www.dj-dj.be) | [discord](https://discord.com/invite/26vT9wt3n3) © 2022 - DJdj Development | [website](https://www.dj-dj.be) | [discord](https://discord.dj-dj.be) | [terms of service](https://www.dj-dj.be/terms)
+30 -17
View File
@@ -4,6 +4,9 @@ const client = bot.client
const config = bot.config const config = bot.config
const log = bot.errorLog.log const log = bot.errorLog.log
const l = bot.language const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
@@ -11,25 +14,29 @@ module.exports = () => {
var user = msg.mentions.users.first() var user = msg.mentions.users.first()
if (!user) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<user>`:\n`"+config.prefix+"add <user>`")]}) if (!user) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<user>`:\n`"+config.prefix+"add <user>`")]})
if (!msg.member.permissions.has("ManageChannels") && !msg.member.permissions.has("Administrator") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){ if (!msg.guild) return
try { if (!permsChecker.command(msg.author.id,msg.guild.id)){
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]}) permsChecker.sendUserNoPerms(msg.author)
}catch{ return
return msg.channel.send({embeds:[bot.errorLog.noPermsMessage]})
}
} }
msg.channel.messages.fetchPinned().then(msglist => { msg.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
msg.channel.permissionOverwrites.create(user.id, { VIEW_CHANNEL:true, ADD_REACTIONS:true,ATTACH_FILES:true, EMBED_LINKS:true, SEND_MESSAGES:true}) msg.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true})
msg.channel.send({embeds:[bot.errorLog.success(l.commands.userAddedTitle,l.commands.userAddedDescription.replace("{0}",user.tag))]}) msg.channel.send({embeds:[bot.embeds.commands.addEmbed(user)]})
var loguser = msg.mentions.users.first() var loguser = msg.mentions.users.first()
log("command","someone used the 'add' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'add' command",[{key:"user",value:msg.author.tag}])
log("system","user added to ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"added_user",value:loguser.tag}]) log("system","user added to ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"added_user",value:loguser.tag}])
const ticketData = require("../core/getoptions").getOptionsById("OTnewT"+ticketId)
APIEvents.onTicketAdd(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("add",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
}) })
}) })
@@ -39,23 +46,29 @@ module.exports = () => {
if (interaction.commandName != "add") return if (interaction.commandName != "add") return
const user = interaction.options.getUser("user") const user = interaction.options.getUser("user")
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id) if (!interaction.guild) return
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("MANAGE_GUILD")){ if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
interaction.reply({embeds:[bot.errorLog.noPermsMessage],ephemeral:true}) permsChecker.sendUserNoPerms(interaction.user)
return return
} }
interaction.channel.messages.fetchPinned().then(msglist => { interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
interaction.channel.permissionOverwrites.create(user.id, { VIEW_CHANNEL:true, ADD_REACTIONS:true,ATTACH_FILES:true, EMBED_LINKS:true, SEND_MESSAGES:true}) interaction.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true})
interaction.reply({embeds:[bot.errorLog.success(l.commands.userAddedTitle,l.commands.userAddedDescription.replace("{0}",user.tag))]}) interaction.reply({embeds:[bot.embeds.commands.addEmbed(user)]})
var loguser = user var loguser = user
log("command","someone used the 'add' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'add' command",[{key:"user",value:interaction.user.tag}])
log("system","user added to ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"added_user",value:loguser.tag}]) log("system","user added to ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"added_user",value:loguser.tag}])
const ticketData = require("../core/getoptions").getOptionsById("OTnewT"+ticketId)
APIEvents.onTicketAdd(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("add",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
+35 -22
View File
@@ -4,6 +4,9 @@ const client = bot.client
const config = bot.config const config = bot.config
const log = bot.errorLog.log const log = bot.errorLog.log
const l = bot.language const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
@@ -12,21 +15,25 @@ module.exports = () => {
msg.channel.messages.fetchPinned().then(msglist => { msg.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const closebutton = new discord.ActionRowBuilder() const ticketId = hiddendata.data.find(d => d.key == "type").value
.addComponents([
new discord.ButtonBuilder()
.setCustomId("closeTicketTrue1")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("🔒")
])
msg.channel.send({embeds:[bot.errorLog.success(l.commands.closeTitle,l.commands.closeDescription)],components:[closebutton]}) msg.channel.send({embeds:[bot.embeds.commands.closeEmbed(msg.author)],components:[bot.buttons.close.closeCommandRow]})
var name = msg.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
require("../core/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"close",false,true)
log("command","someone used the 'close' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'close' command",[{key:"user",value:msg.author.tag}])
APIEvents.onCommand("close",true,msg.author,msg.channel,msg.guild,new Date())
}) })
@@ -37,23 +44,29 @@ module.exports = () => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "close") return if (interaction.commandName != "close") return
//interaction.deferReply()
interaction.channel.messages.fetchPinned().then(msglist => { interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const closebutton = new discord.ActionRowBuilder() const ticketId = hiddendata.data.find(d => d.key == "type").value
.addComponents([
new discord.ButtonBuilder()
.setCustomId("closeTicketTrue1")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("🔒")
])
interaction.reply({embeds:[bot.errorLog.success(l.commands.closeTitle,l.commands.closeDescription)],components:[closebutton]}) interaction.reply({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]})
var name = interaction.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
require("../core/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",false,true)
log("command","someone used the 'close' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'close' command",[{key:"user",value:interaction.user.tag}])
APIEvents.onCommand("close",true,interaction.user,interaction.channel,interaction.guild,new Date())
}) })
}) })
+46 -36
View File
@@ -4,37 +4,41 @@ const client = bot.client
const config = bot.config const config = bot.config
const log = bot.errorLog.log const log = bot.errorLog.log
const l = bot.language const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"delete")) return if (!msg.content.startsWith(config.prefix+"delete")) return
if (!msg.member.permissions.has("ManageChannels") && !msg.member.permissions.has("Administrator") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){ if (!msg.guild) return
try { if (!permsChecker.command(msg.author.id,msg.guild.id)){
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]}) permsChecker.sendUserNoPerms(msg.author)
}catch{ return
return msg.channel.send({embeds:[bot.errorLog.noPermsMessage]})
}
} }
msg.channel.messages.fetchPinned().then(msglist => { msg.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const closebutton = new discord.ActionRowBuilder() const ticketId = hiddendata.data.find(d => d.key == "type").value
.addComponents([
new discord.ButtonBuilder()
.setCustomId("deleteTicketTrue")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("❌")
])
msg.channel.send({embeds:[bot.errorLog.success(l.commands.deleteTitle,l.commands.deleteDescription)],components:[closebutton]}) msg.channel.send({embeds:[bot.embeds.commands.deleteEmbed(msg.author)]})
var name = msg.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
require("../core/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"delete",false,true)
log("command","someone used the 'delete' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'delete' command",[{key:"user",value:msg.author.tag}])
APIEvents.onCommand("delete",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
}) })
@@ -44,29 +48,35 @@ module.exports = () => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "delete") return if (interaction.commandName != "delete") return
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id) //interaction.deferReply()
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("MANAGE_GUILD")){
interaction.reply({embeds:[bot.errorLog.noPermsMessage],ephemeral:true})
return
}
interaction.channel.messages.fetchPinned().then(msglist => { if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
permsChecker.sendUserNoPerms(interaction.user)
return interaction.reply({embeds:[bot.errorLog.noPermsDelete]})
}
interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const closebutton = new discord.ActionRowBuilder() const ticketId = hiddendata.data.find(d => d.key == "type").value
.addComponents([
new discord.ButtonBuilder()
.setCustomId("deleteTicketTrue")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("❌")
])
interaction.reply({embeds:[bot.errorLog.success(l.commands.deleteTitle,l.commands.deleteDescription)],components:[closebutton]}) interaction.reply({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
log("command","someone used the 'close' command",[{key:"user",value:interaction.user.tag}]) var name = interaction.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
require("../core/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true)
log("command","someone used the 'delete' command",[{key:"user",value:interaction.user.tag}])
APIEvents.onCommand("delete",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
}) })
+13 -6
View File
@@ -5,10 +5,12 @@ const config = bot.config
const log = bot.errorLog.log const log = bot.errorLog.log
const l = bot.language const l = bot.language
const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
const helpEmbed = new discord.EmbedBuilder() const helpEmbed = new discord.EmbedBuilder()
.setColor(config.main_color) .setColor(config.main_color)
.setTitle(l.helpMenu.title) .setTitle("❔ "+l.helpMenu.title)
const prefix = config.prefix const prefix = config.prefix
const header = config.system.ticket_channel ? l.helpMenu.header1.replace("{0}","<#"+config.system.ticket_channel+">") : l.helpMenu.header2 const header = config.system.ticket_channel ? l.helpMenu.header1.replace("{0}","<#"+config.system.ticket_channel+">") : l.helpMenu.header2
@@ -16,21 +18,25 @@ module.exports = () => {
if (config.credits) helpEmbed.setFooter({text:"Open-Ticket by DJdj Development | view on github for source code",iconURL:"https://raw.githubusercontent.com/DJj123dj/open-ticket/main/logo.png"}) if (config.credits) helpEmbed.setFooter({text:"Open-Ticket by DJdj Development | view on github for source code",iconURL:"https://raw.githubusercontent.com/DJj123dj/open-ticket/main/logo.png"})
var otherprefix = prefix.endsWith(" ") ? prefix.substring(0,prefix.length-1) : prefix
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix)) return if (!msg.content.startsWith(config.prefix)) return
var args = msg.content.split(config.prefix) var args = msg.content.split(config.prefix)
if (!args[1]){ if (msg.content == config.prefix || msg.content == config.prefix+" " || msg.content == otherprefix){
msg.channel.send({embeds:[helpEmbed]}) msg.channel.send({embeds:[helpEmbed]})
log("command","someone used the 'help' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'help' command",[{key:"user",value:msg.author.tag}])
APIEvents.onCommand("help",true,msg.author,msg.channel,msg.guild,new Date())
return return
} }
if (!args[1].startsWith("close") && !args[1].startsWith("delete") && !args[1].startsWith("remove") && !args[1].startsWith("add") && !args[1].startsWith("msg") && !args[1].startsWith("remove") && !args[1].startsWith("rename") && !args[1].startsWith("reopen")){ if (args[1]){
if (!args[1].startsWith("close") && !args[1].startsWith("delete") && !args[1].startsWith("remove") && !args[1].startsWith("add") && !args[1].startsWith("msg") && !args[1].startsWith("remove") && !args[1].startsWith("rename") && !args[1].startsWith("reopen")){
msg.channel.send({embeds:[helpEmbed]}) msg.channel.send({embeds:[helpEmbed]})
log("command","someone used the 'help' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'help' command",[{key:"user",value:msg.author.tag}])
APIEvents.onCommand("help",true,msg.author,msg.channel,msg.guild,new Date())
}
} }
}) })
@@ -40,5 +46,6 @@ module.exports = () => {
interaction.reply({embeds:[helpEmbed]}) interaction.reply({embeds:[helpEmbed]})
log("command","someone used the 'help' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'help' command",[{key:"user",value:interaction.user.tag}])
APIEvents.onCommand("help",true,interaction.user,interaction.channel,interaction.guild,new Date())
}) })
} }
+28 -21
View File
@@ -4,6 +4,9 @@ const client = bot.client
const config = bot.config const config = bot.config
const log = bot.errorLog.log const log = bot.errorLog.log
const l = bot.language const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
@@ -11,57 +14,61 @@ module.exports = () => {
var user = msg.mentions.users.first() var user = msg.mentions.users.first()
if (!user) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<user>`:\n`"+config.prefix+"remove <user>`")]}) if (!user) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<user>`:\n`"+config.prefix+"remove <user>`")]})
if (!msg.member.permissions.has("ManageChannels") && !msg.member.permissions.has("Administrator") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){ if (!msg.guild) return
try { if (!permsChecker.command(msg.author.id,msg.guild.id)){
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]}) permsChecker.sendUserNoPerms(msg.author)
}catch{ return
return msg.channel.send({embeds:[bot.errorLog.noPermsMessage]})
}
} }
msg.channel.messages.fetchPinned().then(msglist => { msg.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
msg.channel.permissionOverwrites.delete(user.id) msg.channel.permissionOverwrites.delete(user.id)
msg.channel.send({embeds:[bot.errorLog.success(l.commands.userRemovedTitle,l.commands.userRemovedDescription.replace("{0}",user.tag))]}) msg.channel.send({embeds:[bot.embeds.commands.removeEmbed(user)]})
var loguser = msg.mentions.users.first() var loguser = msg.mentions.users.first()
log("command","someone used the 'remove' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'remove' command",[{key:"user",value:msg.author.tag}])
log("system","user removed from ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"removed_user",value:loguser.tag}]) log("system","user removed from ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"removed_user",value:loguser.tag}])
const ticketData = require("../core/getoptions").getOptionsById("OTnewT"+ticketId)
APIEvents.onTicketRemove(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("remove",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
}) })
}) })
client.on("interactionCreate",(interaction) => { client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "remove") return if (interaction.commandName != "remove") return
const user = interaction.options.getUser("user") const user = interaction.options.getUser("user")
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id) if (!interaction.guild) return
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("MANAGE_GUILD")){ if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
interaction.reply({embeds:[bot.errorLog.noPermsMessage],ephemeral:true}) permsChecker.sendUserNoPerms(interaction.user)
return return
} }
await interaction.channel.messages.fetchPinned().then(msglist => {
interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
interaction.channel.permissionOverwrites.delete(user.id) interaction.channel.permissionOverwrites.delete(user.id)
interaction.reply({embeds:[bot.errorLog.success(l.commands.userRemovedTitle,l.commands.userRemovedDescription.replace("{0}",user.tag))]}) interaction.reply({embeds:[bot.embeds.commands.removeEmbed(user)]})
var loguser = user var loguser = user
log("command","someone used the 'remove' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'remove' command",[{key:"user",value:interaction.user.tag}])
log("system","user removed from ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"removed_user",value:loguser.tag}]) log("system","user removed from ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"removed_user",value:loguser.tag}])
})
const ticketData = require("../core/getoptions").getOptionsById("OTnewT"+ticketId)
APIEvents.onTicketRemove(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("remove",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
})
}) })
} }
+27 -21
View File
@@ -4,23 +4,25 @@ const client = bot.client
const config = bot.config const config = bot.config
const log = bot.errorLog.log const log = bot.errorLog.log
const l = bot.language const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"rename")) return if (!msg.content.startsWith(config.prefix+"rename")) return
if (!msg.guild) return
if (!permsChecker.command(msg.author.id,msg.guild.id)){
permsChecker.sendUserNoPerms(msg.author)
return
}
msg.channel.messages.fetchPinned().then(msglist => { msg.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
if (!msg.member.permissions.has("ManageChannels") && !msg.member.permissions.has("Administrator") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){ const ticketId = hiddendata.data.find(d => d.key == "type").value
try {
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]})
}catch{
return msg.channel.send({embeds:[bot.errorLog.noPermsMessage]})
}
}
var newname = msg.content.split(config.prefix+"rename")[1].substring(1) var newname = msg.content.split(config.prefix+"rename")[1].substring(1)
@@ -38,11 +40,11 @@ module.exports = () => {
if (!prefix) prefix = "noprefix-" if (!prefix) prefix = "noprefix-"
msg.channel.setName(prefix+newname) msg.channel.setName(prefix+newname)
msg.channel.send({embeds:[bot.errorLog.success(l.commands.renameTitle,l.commands.renameWarning)]}) msg.channel.send({embeds:[bot.embeds.commands.renameEmbed(msg.author,prefix+newname)]})
log("command","someone used the 'rename' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'rename' command",[{key:"user",value:msg.author.tag}])
log("system","ticket renamed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newname",value:newname}]) log("system","ticket renamed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newname",value:newname}])
APIEvents.onCommand("rename",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
}) })
@@ -52,16 +54,19 @@ module.exports = () => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "rename") return if (interaction.commandName != "rename") return
if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
permsChecker.sendUserNoPerms(interaction.user)
return
}
//interaction.deferReply()
interaction.channel.messages.fetchPinned().then(msglist => { interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
if (firstmsg == undefined || firstmsg.author.id != client.user.id)return interaction.reply({embeds:[bot.errorLog.notInATicket]}) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
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("MANAGE_GUILD")){
interaction.reply({embeds:[bot.errorLog.noPermsMessage],ephemeral:true})
return
}
var newname = interaction.options.getString("name") var newname = interaction.options.getString("name")
var name = interaction.channel.name var name = interaction.channel.name
@@ -76,11 +81,12 @@ module.exports = () => {
if (!prefix) prefix = "noprefix-" if (!prefix) prefix = "noprefix-"
interaction.channel.setName(prefix+newname) interaction.channel.setName(prefix+newname)
interaction.reply({embeds:[bot.errorLog.success(l.commands.renameTitle,l.commands.renameWarning)]}) interaction.reply({embeds:[bot.embeds.commands.renameEmbed(interaction.user,prefix+newname)]})
log("command","someone used the 'rename' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'rename' command",[{key:"user",value:interaction.user.tag}])
log("system","ticket renamed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newname",value:newname}]) log("system","ticket renamed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newname",value:newname}])
APIEvents.onCommand("rename",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
}) })
} }
+18 -16
View File
@@ -4,46 +4,48 @@ const client = bot.client
const config = bot.config const config = bot.config
const log = bot.errorLog.log const log = bot.errorLog.log
const l = bot.language const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
var reopenCommandBar = new discord.ActionRowBuilder()
.addComponents(
new discord.ButtonBuilder()
.setCustomId("reopenTicket1")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("🔓")
)
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"reopen")) return if (!msg.content.startsWith(config.prefix+"reopen")) return
msg.channel.messages.fetchPinned().then(msglist => { msg.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
msg.channel.send({embeds:[bot.errorLog.success(l.commands.reopenTitle,l.commands.reopenDescription)],components:[reopenCommandBar]}) msg.channel.send({embeds:[bot.embeds.commands.reopenEmbed(msg.author)],components:[bot.buttons.close.openRowNormal]})
require("../core/ticketReopener").reopenTicket(msg.guild,msg.channel,msg.author)
log("command","someone used the 'reopen' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'reopen' command",[{key:"user",value:msg.author.tag}])
APIEvents.onCommand("reopen",true,msg.author,msg.channel,msg.guild,new Date())
}) })
}) })
client.on("interactionCreate",(interaction) => { client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "reopen") return if (interaction.commandName != "reopen") return
interaction.channel.messages.fetchPinned().then(msglist => { //interaction.deferReply()
interaction.channel.messages.fetchPinned().then(async msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) await interaction.reply({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]})
interaction.reply({embeds:[bot.errorLog.success(l.commands.reopenTitle,l.commands.reopenDescription)],components:[reopenCommandBar]})
require("../core/ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user)
log("command","someone used the 'reopen' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'reopen' command",[{key:"user",value:interaction.user.tag}])
APIEvents.onCommand("reopen",true,interaction.user,interaction.channel,interaction.guild,new Date())
}) })
+17 -13
View File
@@ -4,6 +4,9 @@ const client = bot.client
const config = bot.config const config = bot.config
const log = bot.errorLog.log const log = bot.errorLog.log
const l = bot.language const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
/**@type {String[]} */ /**@type {String[]} */
@@ -16,12 +19,10 @@ module.exports = () => {
client.on("messageCreate", msg => { client.on("messageCreate", msg => {
if (msg.content.startsWith(config.prefix+"msg"||config.prefix+"message")){ if (msg.content.startsWith(config.prefix+"msg"||config.prefix+"message")){
if (!msg.member.permissions.has("ManageChannels") && !msg.member.permissions.has("Administrator") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){ if (!msg.guild) return
try { if (!permsChecker.command(msg.author.id,msg.guild.id)){
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]}) permsChecker.sendUserNoPerms(msg.author)
}catch{ return
return msg.channel.send({embeds:[bot.errorLog.noPermsMessage]})
}
} }
const id = msg.content.split(config.prefix+"msg")[1].substring(1) ? msg.content.split(config.prefix+"msg")[1].substring(1) : false const id = msg.content.split(config.prefix+"msg")[1].substring(1) ? msg.content.split(config.prefix+"msg")[1].substring(1) : false
@@ -34,7 +35,8 @@ module.exports = () => {
msg.channel.send({embeds:[embed],components:componentRows}) msg.channel.send({embeds:[embed],components:componentRows})
log("command","someone used the 'msg' command",[{key:"user",value:msg.author.tag},{key:"id",value:id}]) log("command","someone used the 'message' command",[{key:"user",value:msg.author.tag},{key:"id",value:id}])
APIEvents.onCommand("message",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
} }
}) })
@@ -42,11 +44,11 @@ module.exports = () => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "message") return if (interaction.commandName != "message") return
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id) if (!interaction.guild) return
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("MANAGE_GUILD")){ if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
interaction.reply({embeds:[bot.errorLog.noPermsMessage],ephemeral:true}) permsChecker.sendUserNoPerms(interaction.user)
return return
} }
const id = interaction.options.getString("id") const id = interaction.options.getString("id")
@@ -57,7 +59,9 @@ module.exports = () => {
interaction.reply({content:l.commands.ticketWarning}) interaction.reply({content:l.commands.ticketWarning})
interaction.channel.send({embeds:[embed],components:componentRows}) interaction.channel.send({embeds:[embed],components:componentRows})
log("command","someone used the 'msg' command",[{key:"user",value:interaction.user.tag},{key:"id",value:id}]) log("command","someone used the 'message' command",[{key:"user",value:interaction.user.tag},{key:"id",value:id}])
APIEvents.onCommand("message",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
} }
+6 -2
View File
@@ -1,5 +1,4 @@
{ {
"bot_name":"Wumpus",
"main_color":"#ffffff", "main_color":"#ffffff",
"server_id":"server id (for slash cmds)", "server_id":"server id (for slash cmds)",
"auth_token":"auth token", "auth_token":"auth token",
@@ -78,11 +77,16 @@
"id":"1", "id":"1",
"name":"Choose Your Ticket", "name":"Choose Your Ticket",
"description":"You can click one of the buttons below!", "description":"You can click one of the buttons below!",
"enableFooter":false, "enableFooter":false,
"footer":"Open Ticket v2.4.0 - I'm a footer!", "footer":"Open Ticket v2.5.0 - I'm a footer!",
"enableThumbnail":false, "enableThumbnail":false,
"thumbnail":"https://www.example.com/catmemes/cat.png", "thumbnail":"https://www.example.com/catmemes/cat.png",
"enableCustomColor":false,
"color":"#ffffff", "color":"#ffffff",
"options":["general","apply"], "options":["general","apply"],
"enableTicketExplaination":true, "enableTicketExplaination":true,
"enableMaxTicketsWarning":true "enableMaxTicketsWarning":true
-56
View File
@@ -1,56 +0,0 @@
# OT-API Documentation
Extend open ticket with your own features!
The api is made for EXTENDING open ticket, not replacing! So with this api you are not able to replace existing features! You can only add your own features!
### DISCLAIMER:
Only edit or extend the code when you know what you are doing!
If open ticket crashes while you change the code, then we can't help you!
**DO IT ON YOUR OWN RISK!**
## Events:
Everything in the `events.js` file!
### onTicketOpen(...)
This function is executed when a new ticket is created. It happens after everything else is done, so the channel is already created!
Parameters:
- user: `discord.User`
- channel: `discord.TextChannel`
- guild: `discord.Guild`
- date: `Date`
- ticketdata: `OT TicketData` or `false` (more info further down this document)
### onTicketClose(...)
This function is executed when a ticket gets closed, it can happen multiple times with one ticket (because of reopen).
Parameters:
- user: `discord.User`
- channel: `discord.TextChannel`
- guild: `discord.Guild`
- date: `Date`
- ticketdata: `OT TicketData` or `false` (more info further down this document)
### onTicketDelete(...)
This function is executed when a ticket gets deleted, it can happen only 1 time.
Parameters:
- user: `discord.User`
- channel: `discord.TextChannel`
- guild: `discord.Guild`
- date: `Date`
- ticketdata: `OT TicketData` or `false` (more info further down this document)
### onTicketReopen(...)
...
### onTranscriptCreation(...)
...
### onCommand(...)
...
### onReactionRole(...)
...
+18
View File
@@ -0,0 +1,18 @@
//base
const bot = require("../../index")
exports.client = bot.client
exports.config = bot.config
exports.utils = {
log:bot.errorLog.log(),
storage:bot.storage
}
//events
const events = require("./modules/events").events
exports.events = events
//actions
const actions = require("./modules/actions").actions
//comming soon
//exports.actions = actions
+44 -1
View File
@@ -1,3 +1,46 @@
{ {
"version":"1.0.0" "version":"1.0.0",
"disclaimer":"DISABLE doesn't work yet! Below this message!",
"disable":{
"messages":{
"ticketCreated":false,
"ticketClosed":false,
"ticketDeleted":false,
"ticketReopened":false
},
"transcripts":{
"server":false,
"dm":false
},
"commands":{
"text":{
"help":false,
"msg":false,
"close":false,
"delete":false,
"reopen":false,
"new":false,
"add":false,
"remove":false,
"rename":false
},
"slash":{
"help":false,
"msg":false,
"close":false,
"delete":false,
"reopen":false,
"new":false,
"add":false,
"remove":false,
"rename":false
}
},
"checkerjs":{
"token":false,
"all":false
}
}
} }
+7
View File
@@ -0,0 +1,7 @@
//ACTIONS:
//EXPORT ACTIONS:
exports.actions = {
}
+2
View File
@@ -14,6 +14,8 @@ const storage = bot.storage
//used when creating plugins! //used when creating plugins!
exports.enableApiLogs = false exports.enableApiLogs = false
//DOESN'T WORK YET
//this is used when embedding open ticket into another bot //this is used when embedding open ticket into another bot
exports.embeddedMode = false exports.embeddedMode = false
exports.clientLocation = require("../../../index").client exports.clientLocation = require("../../../index").client
-9
View File
@@ -1,9 +0,0 @@
const discord = require("discord.js")
const client = require("../../../index").client
module.exports = () => {
//this code will run when the bot starts!
}
+311 -5
View File
@@ -6,6 +6,22 @@ const log = bot.errorLog.log
const l = bot.language const l = bot.language
const storage = bot.storage const storage = bot.storage
//EVENT API:
const ticketOpenListeners = []
const ticketCloseListeners = []
const ticketDeleteListeners = []
const ticketReopenListeners = []
const ticketAddListeners = []
const ticketRemoveListeners = []
const transcriptCreationListeners = []
const commandListeners = []
const reactionRoleListeners = []
const errorListeners = []
/** /**
* *
* @param {discord.User} user * @param {discord.User} user
@@ -18,7 +34,11 @@ exports.onTicketOpen = (user,channel,guild,date,ticketdata) => {
//system //system
bot.errorLog.log("api","new ticket created",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}]) bot.errorLog.log("api","new ticket created",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
//custom code ticketOpenListeners.forEach((func) => {
try {
func(user,channel,guild,date,ticketdata)
}catch{}
})
} }
@@ -29,12 +49,17 @@ exports.onTicketOpen = (user,channel,guild,date,ticketdata) => {
* @param {discord.Guild} guild * @param {discord.Guild} guild
* @param {Date} date * @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata
* @param {String} reason
*/ */
exports.onTicketClose = (user,channel,guild,date,ticketdata) => { exports.onTicketClose = (user,channel,guild,date,ticketdata,reason) => {
//system //system
bot.errorLog.log("api","ticket closed",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}]) bot.errorLog.log("api","ticket closed",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)},{key:"reason",value:reason}])
//custom code ticketCloseListeners.forEach((func) => {
try {
func(user,channel,guild,date,ticketdata,reason)
}catch{}
})
} }
@@ -50,6 +75,287 @@ exports.onTicketDelete = (user,channel,guild,date,ticketdata) => {
//system //system
bot.errorLog.log("api","ticket deleted",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}]) bot.errorLog.log("api","ticket deleted",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
//custom code ticketDeleteListeners.forEach((func) => {
try {
func(user,channel,guild,date,ticketdata)
}catch{}
})
}
/**
*
* @param {discord.User} user
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata
*/
exports.onTicketReopen = (user,channel,guild,date,ticketdata) => {
//system
bot.errorLog.log("api","ticket reopened",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
ticketReopenListeners.forEach((func) => {
try {
func(user,channel,guild,date,ticketdata)
}catch{}
})
}
/**
*
* @param {discord.User} user
* @param {discord.User} editeduser
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata
*/
exports.onTicketAdd = (user,editeduser,channel,guild,date,ticketdata) => {
//system
bot.errorLog.log("api","user added to ticket",[{key:"userid",value:user.id},{key:"editeduser",value:editeduser.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
ticketAddListeners.forEach((func) => {
try {
func(user,editeduser,channel,guild,date,ticketdata)
}catch{}
})
}
/**
*
* @param {discord.User} user
* @param {discord.User} editeduser
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata
*/
exports.onTicketRemove = (user,editeduser,channel,guild,date,ticketdata) => {
//system
bot.errorLog.log("api","user removed from ticket",[{key:"userid",value:user.id},{key:"editeduser",value:editeduser.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
ticketRemoveListeners.forEach((func) => {
try {
func(user,editeduser,channel,guild,date,ticketdata)
}catch{}
})
}
/**
*
* @param {discord.Message[]} messages
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
*/
exports.onTranscriptCreation = (messages,channel,guild,date) => {
//system
bot.errorLog.log("api","transcript created",[{key:"messages",value:JSON.stringify(messages)},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id}])
transcriptCreationListeners.forEach((func) => {
try {
func(messages,channel,guild,date)
}catch{}
})
}
/**@typedef {"help"|"message"|"close"|"delete"|"reopen"|"rename"|"add"|"remove"} OTCommandType */
/**
*
* @param {OTCommandType} type
* @param {Boolean} hasPerms
* @param {discord.User} user
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
*/
exports.onCommand = (type,hasPerms,user,channel,guild,date) => {
const newguild = guild ? guild : false
//system
bot.errorLog.log("api","someone used a command",[{key:"type",value:type},{key:"hasPerms",value:hasPerms},{key:"userid",value:user},{key:"channelid",value:channel.id},{key:"guildid",value:newguild.id}])
commandListeners.forEach((func) => {
try {
func(type,hasPerms,user,channel,newguild,date)
}catch{}
})
}
/**@typedef {"add"|"remove"|"add&remove"} OTReactionRoleType */
/**@typedef {"add"|"remove"} OTReactionRoleMode */
/**
* @param {OTReactionRoleMode} mode
* @param {OTReactionRoleType} type
* @param {discord.Role} role
* @param {discord.User} user
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
*/
exports.onReactionRole = (mode,type,role,user,channel,guild,date) => {
//system
bot.errorLog.log("api","someone used a reaction role",[{key:"mode",value:mode},{key:"type",value:type},{key:"roleid",value:role.id},{key:"userid",value:user},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id}])
reactionRoleListeners.forEach((func) => {
try {
func(mode,type,role,user,channel,guild,date)
}catch{}
})
}
/**
* @param {String} err
* @param {Date} date
*/
exports.onError = (err,date) => {
//system
bot.errorLog.log("api","there is an error",[{key:"error",value:err}])
errorListeners.forEach((func) => {
try {
func(err,date)
}catch{}
})
}
//EVENT CALLBACKS:
/**
* @callback TicketActionEvent
* @param {discord.User} user
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata
*/
/**
* @callback TicketCloseEvent
* @param {discord.User} user
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata
* @param {String} reason
*/
/**
* @callback TranscriptCreationEvent
* @param {discord.Message[]} messages
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
*/
/**
* @callback TicketUserChangeEvent
* @param {discord.User} user
* @param {discord.User} editeduser
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata
*/
/**
* @callback CommandEvent
* @param {OTCommandType} type
* @param {Boolean} hasPerms
* @param {discord.User} user
* @param {discord.TextChannel} channel
* @param {discord.Guild|false} guild
* @param {Date} date
*/
/**
* @callback ReactionRoleEvent
* @param {OTReactionRoleMode} mode
* @param {OTReactionRoleType} type
* @param {discord.Role} role
* @param {discord.User} user
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
*/
/**
* @callback ErrorEvent
* @param {String} error
* @param {Date} date
*/
//EVENT EXPORT:
/**@param {TicketActionEvent} callback */
const onTicketOpen = (callback) => {
ticketOpenListeners.push(callback)
}
/**@param {TicketCloseEvent} callback */
const onTicketClose = (callback) => {
ticketCloseListeners.push(callback)
}
/**@param {TicketActionEvent} callback */
const onTicketDelete = (callback) => {
ticketDeleteListeners.push(callback)
}
/**@param {TicketActionEvent} callback */
const onTicketReopen = (callback) => {
ticketReopenListeners.push(callback)
}
/**@param {TicketUserChangeEvent} callback */
const onTicketAdd = (callback) => {
ticketAddListeners.push(callback)
}
/**@param {TicketUserChangeEvent} callback */
const onTicketRemove = (callback) => {
ticketRemoveListeners.push(callback)
}
/**@param {TranscriptCreationEvent} callback */
const onTranscriptCreation = (callback) => {
transcriptCreationListeners.push(callback)
}
/**@param {CommandEvent} callback */
const onCommand = (callback) => {
commandListeners.push(callback)
}
/**@param {ReactionRoleEvent} callback */
const onReactionRole = (callback) => {
commandListeners.push(callback)
}
/**@param {ErrorEvent} callback */
const onError = (callback) => {
errorListeners.push(callback)
}
exports.events = {
onTicketOpen,
onTicketClose,
onTicketDelete,
onTicketReopen,
onTicketAdd,
onTicketRemove,
onTranscriptCreation,
onCommand,
onReactionRole,
onError
} }
+26
View File
@@ -0,0 +1,26 @@
const fs = require("fs")
const bot = require("../../index")
const log = bot.errorLog.log
module.exports = () => {
const files = fs.readdirSync("./plugins")
var totalcount = 0
var successcount = 0
var failcount = 0
files.forEach((file) => {
if (file.endsWith(".plugin.js")){
try {
require("../../plugins/"+file)()
successcount++
totalcount++
}catch{
failcount++
totalcount++
}
}
})
log("info","loaded plugins",[{key:"success",value:successcount},{key:"error",value:failcount},{key:"total",value:totalcount}])
}
+26 -5
View File
@@ -25,7 +25,7 @@ exports.checker = async () => {
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){ if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
createError("'"+path+"' | this channel id is invalid") createError("'"+path+"' | this channel id is invalid")
} }
}else if (mode == "roleid"){ }else if (mode == "roleid"){
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){ if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
createError("'"+path+"' | this role id is invalid") createError("'"+path+"' | this role id is invalid")
} }
@@ -41,7 +41,7 @@ exports.checker = async () => {
} }
/**@param {String} value */ /**@param {String} value */
const checkToken = (value) => { const checkToken = (value) => {
if (value.includes(" ") || value.length < 40 || value.length > 70){ if (value.includes(" ") || value.length < 40){
createError("'auth_token' | your token is invalid") createError("'auth_token' | your token is invalid")
} }
} }
@@ -245,14 +245,13 @@ exports.checker = async () => {
//--------------------------| //--------------------------|
//--------------------------| //--------------------------|
var configArray = ["bot_name","main_color","server_id","auth_token","main_adminroles","prefix","languagefile","credits","status","system","options","messages"] var configArray = ["main_color","server_id","auth_token","main_adminroles","prefix","languagefile","credits","status","system","options","messages"]
configArray.forEach((item) => { configArray.forEach((item) => {
if (config[item] == undefined){ if (config[item] == undefined){
throw new Error("\n\nMAIN ERROR: the item '"+item+"' doesn't exist in config.json") throw new Error("\n\nMAIN ERROR: the item '"+item+"' doesn't exist in config.json")
} }
}) })
checkType(config.bot_name,"string","bot_name")
checkHexColor(config.main_color,"main_color") checkHexColor(config.main_color,"main_color")
checkDiscord("serverid",config.server_id,"server_id") checkDiscord("serverid",config.server_id,"server_id")
checkToken(config.auth_token) checkToken(config.auth_token)
@@ -310,6 +309,28 @@ exports.checker = async () => {
checkOption(option,"options/"+index) checkOption(option,"options/"+index)
}) })
//discord check
/**
const discord = require("discord.js")
const {GatewayIntentBits,Partials} = discord
const client = new discord.Client({
intents:[
GatewayIntentBits.DirectMessages,
GatewayIntentBits.GuildInvites,
GatewayIntentBits.GuildMembers,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.Guilds,
GatewayIntentBits.MessageContent
],
partials:[Partials.Channel,Partials.Message]
})
await client.guilds.fetch()
if (!client.guilds.cache.find(g => g.id == config.server_id)){
createError("'server_id' | i'm not in a server with this id!")
}
*/
//the end //the end
+8 -8
View File
@@ -144,7 +144,7 @@ module.exports = () => {
if (config.system.closeMode == "adminonly"){ 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) 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("MANAGE_GUILD")){ if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
try { try {
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]}) return msg.member.send({embeds:[bot.errorLog.noPermsMessage]})
}catch{ }catch{
@@ -167,7 +167,7 @@ module.exports = () => {
} }
}) })
await require("./ticketCloser").closeTicket(interaction,prefix,"close") await require("./ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close")
closeTicketButtonChecker = false closeTicketButtonChecker = false
}) })
@@ -183,7 +183,7 @@ module.exports = () => {
if (config.system.closeMode == "adminonly"){ 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) 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("MANAGE_GUILD")){ if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
try { try {
return interaction.member.send({embeds:[bot.errorLog.noPermsMessage]}) return interaction.member.send({embeds:[bot.errorLog.noPermsMessage]})
}catch{ }catch{
@@ -218,7 +218,7 @@ module.exports = () => {
} }
}) })
await require("./ticketCloser").closeTicket(interaction,prefix,"close") await require("./ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close")
closeTicket1ButtonChecker = false closeTicket1ButtonChecker = false
}) })
@@ -250,7 +250,7 @@ module.exports = () => {
deleteTicketButtonChecker = true deleteTicketButtonChecker = true
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id) 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("MANAGE_GUILD")){ if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
try { try {
return interaction.member.send({embeds:[bot.errorLog.noPermsMessage]}) return interaction.member.send({embeds:[bot.errorLog.noPermsMessage]})
}catch{ }catch{
@@ -270,7 +270,7 @@ module.exports = () => {
} }
}) })
await require("./ticketCloser").closeTicket(interaction,prefix,"delete") await require("./ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete")
deleteTicketButtonChecker = false deleteTicketButtonChecker = false
}) })
@@ -305,7 +305,7 @@ module.exports = () => {
deleteTicket1ButtonChecker = true deleteTicket1ButtonChecker = true
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id) 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("MANAGE_GUILD")){ if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
try { try {
return interaction.member.send({embeds:[bot.errorLog.noPermsMessage]}) return interaction.member.send({embeds:[bot.errorLog.noPermsMessage]})
}catch{ }catch{
@@ -325,7 +325,7 @@ module.exports = () => {
} }
}) })
await require("./ticketCloser").closeTicket(interaction,prefix,"deletenotranscript") await require("./ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"deletenotranscript")
deleteTicket1ButtonChecker = false deleteTicket1ButtonChecker = false
}) })
} }
+1 -21
View File
@@ -10,24 +10,4 @@ try {
process.exit(1) process.exit(1)
} }
module.exports = db module.exports = db
/** =============================
** NOT READY YET
** must be dynamic
** =============================*/
//const LocalStorage = require("node-localstorage")
//
//const ticketStorage = new LocalStorage.LocalStorage("./storage/tickets")
//exports.ticketStorage = ticketStorage
//
//const userTicketStorage = new LocalStorage.LocalStorage("./storage/userTickets")
//exports.userTicketStorage = userTicketStorage
//
//const transcriptStorage = new LocalStorage.LocalStorage("./storage/transcripts")
//exports.transcriptStorage = transcriptStorage
//const ticketNumberStorage = new LocalStorage.LocalStorage("./storage/ticketNumbers")
//exports.ticketNumberStorage = ticketNumberStorage
+22 -17
View File
@@ -12,14 +12,19 @@ const c = discord.Colors
exports.noPermsMessage = new embed() exports.noPermsMessage = new embed()
.setColor(c.Red) .setColor(c.Red)
.setTitle(":x: "+l.errors.noPermsTitle+" :x:") .setTitle(":x: "+l.errors.noPermsTitle)
.setDescription(l.errors.noPermsDescription) .setDescription(l.errors.noPermsDescription)
exports.noPermsDelete = new embed()
.setColor(c.Red)
.setTitle(":x: "+l.errors.noPermsTitle)
.setDescription(l.errors.noPermsDelete)
/**@param {String} message */ /**@param {String} message */
exports.invalidArgsMessage = (message) => { exports.invalidArgsMessage = (message) => {
var x = new embed() var x = new embed()
.setColor(c.Red) .setColor(c.Red)
.setTitle(":x: "+l.errors.missingArgsTitle+" :x:") .setTitle(":x: "+l.errors.missingArgsTitle)
.setDescription(message) .setDescription(message)
return x return x
@@ -29,7 +34,7 @@ exports.invalidArgsMessage = (message) => {
exports.serverError = (message) => { exports.serverError = (message) => {
var x = new embed() var x = new embed()
.setColor(c.Orange) .setColor(c.Orange)
.setTitle(":warning: "+l.errors.boterror+" :warning:") .setTitle(":warning: "+l.errors.boterror)
.setDescription(message) .setDescription(message)
return x return x
@@ -39,14 +44,14 @@ exports.serverError = (message) => {
exports.invalidIdChooseFromList = (list) => { exports.invalidIdChooseFromList = (list) => {
var x = new embed() var x = new embed()
.setColor(c.Red) .setColor(c.Red)
.setTitle(":x: "+l.errors.chooseFromListTitle+" :x:") .setTitle(":x: "+l.errors.chooseFromListTitle)
.setDescription(l.errors.chooseFromListDescription+"\n`"+list.join("`\n`")+"`") .setDescription(l.errors.chooseFromListDescription+"\n`"+list.join("`\n`")+"`")
return x return x
} }
exports.notInATicket = new embed() exports.notInATicket = new embed()
.setColor(c.Red) .setColor(c.Red)
.setTitle(":x: "+l.errors.notInTicketTitle+" :x:") .setTitle(":x: "+l.errors.notInTicketTitle)
.setDescription(l.errors.notInTicketDescription) .setDescription(l.errors.notInTicketDescription)
@@ -54,7 +59,7 @@ exports.notInATicket = new embed()
exports.success = (title,message) => { exports.success = (title,message) => {
var x = new embed() var x = new embed()
.setColor(config.main_color) .setColor(config.main_color)
.setTitle(":white_check_mark: "+title+" :white_check_mark:") .setTitle(":white_check_mark: "+title)
.setDescription(message) .setDescription(message)
return x return x
@@ -64,7 +69,7 @@ exports.success = (title,message) => {
exports.warning = (title,message) => { exports.warning = (title,message) => {
var x = new embed() var x = new embed()
.setColor(c.Orange) .setColor(c.Orange)
.setTitle(":warning: "+title+" :warning:") .setTitle(":warning: "+title)
.setDescription(message) .setDescription(message)
return x return x
@@ -74,7 +79,7 @@ exports.warning = (title,message) => {
exports.custom = (title,message,emoji,color) => { exports.custom = (title,message,emoji,color) => {
var x = new embed() var x = new embed()
.setColor(color) .setColor(color)
.setTitle(emoji+" "+title+" "+emoji) .setTitle(emoji+" "+title)
.setDescription(message) .setDescription(message)
return x return x
@@ -92,8 +97,8 @@ const normalLog = (debugString) => {
* @param {String} message * @param {String} message
* @param {[{key:String,value:String}]} params * @param {[{key:String,value:String}]} params
*/ */
exports.log = async (ptype,message,params) => { exports.log = async (type,message,params) => {
var type = ptype var ptype = type
const chalk = await loadChalk() const chalk = await loadChalk()
var paramstring = "" var paramstring = ""
if (params){ if (params){
@@ -105,20 +110,20 @@ exports.log = async (ptype,message,params) => {
} }
const parameters = params ? "("+paramstring+")" : " " const parameters = params ? "("+paramstring+")" : " "
if (type == "command"){ if (ptype == "command"){
console.log(chalk.green("[command] ")+message+" "+chalk.yellow(parameters)) console.log(chalk.green("[command] ")+message+" "+chalk.yellow(parameters))
}else if (type == "info"){ }else if (ptype == "info"){
console.log(chalk.blue("[info] ")+message+" "+chalk.yellow(parameters)) console.log(chalk.blue("[info] ")+message+" "+chalk.yellow(parameters))
}else if (type == "system"){ }else if (ptype == "system"){
console.log(chalk.green("[system] ")+message+" "+chalk.yellow(parameters)) console.log(chalk.green("[system] ")+message+" "+chalk.yellow(parameters))
}else if (type == "api"){ }else if (ptype == "api"){
if (require("./api/base").enableApiLogs == true){ if (require("./api/modules/base").enableApiLogs == true){
console.log(chalk.red("[api v"+require("./api/api.json").version+"] ")+message+" "+chalk.yellow(parameters)) console.log(chalk.red("[api v"+require("./api/api.json").version+"] ")+message+" "+chalk.yellow(parameters))
} }
type = "api v"+require("./api/api.json").version ptype = "api v"+require("./api/api.json").version
} }
const cd = new Date() const cd = new Date()
const months = ["January","February","March","April","May","June","July","August","September","October","November","December"] const months = ["January","February","March","April","May","June","July","August","September","October","November","December"]
normalLog("["+cd.getDate()+" "+months[cd.getMonth()-1]+" "+cd.getFullYear()+" - "+cd.getSeconds()+":"+cd.getMinutes()+":"+cd.getHours()+"] ["+type+"] "+message+" "+parameters) normalLog("["+cd.getDate()+" "+months[cd.getMonth()-1]+" "+cd.getFullYear()+" - "+cd.getSeconds()+":"+cd.getMinutes()+":"+cd.getHours()+"] ["+ptype+"] "+message+" "+parameters)
} }
+3 -3
View File
@@ -7,7 +7,7 @@ const config = bot.config
*/ */
exports.getTicketValue = (index,value) => { exports.getTicketValue = (index,value) => {
if (value == "id"){ if (value == "id"){
return "newT"+config.options[index][value] return "OTnewT"+config.options[index][value]
} }
return config.options[index][value] return config.options[index][value]
} }
@@ -35,7 +35,7 @@ exports.getRoleValue = (index,value) => {
var result = [] var result = []
config.options.forEach((o) => { config.options.forEach((o) => {
if (value == "id"){ if (value == "id"){
result.push("newT"+o[value]) result.push("OTnewT"+o[value])
}else{ }else{
result.push(o[value]) result.push(o[value])
} }
@@ -90,7 +90,7 @@ class TicketOptions {
exports.getOptionsById = (id) => { exports.getOptionsById = (id) => {
var result = false var result = false
config.options.forEach((option) => { config.options.forEach((option) => {
if ("newT"+option.id == id){ if ("OTnewT"+option.id == id){
result = option result = option
} }
}) })
+78
View File
@@ -0,0 +1,78 @@
const discord = require('discord.js')
const bot = require('../../../index')
const client = bot.client
const config = bot.config
const l = bot.language
const log = bot.errorLog.log
const getconfigoptions = require("../../getoptions")
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
const bs = discord.ButtonStyle
exports.closeCommandRow = new arb()
.addComponents(
new button()
.setCustomId("OTdeleteTicket1")
.setDisabled(false)
.setStyle(bs.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
.addComponents(
new button()
.setCustomId("OTsendTranscript")
.setDisabled(false)
.setStyle(bs.Secondary)
.setLabel(l.buttons.sendTranscript)
.setEmoji("📄")
)
.addComponents(
new button()
.setCustomId("OTreopenTicket")
.setDisabled(false)
.setStyle(bs.Success)
.setLabel(l.buttons.reopen)
.setEmoji("✔")
)
exports.openRowNormal = new arb()
.addComponents(
new button()
.setCustomId("OTcloseTicket")
.setDisabled(false)
.setStyle(bs.Secondary)
.setLabel(l.buttons.close)
.setEmoji("🔒")
)
.addComponents(
new button()
.setCustomId("OTdeleteTicket")
.setDisabled(false)
.setStyle(bs.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
exports.openRowDisabled = new arb()
.addComponents(
new button()
.setCustomId("OTcloseTicket")
.setDisabled(true)
.setStyle(bs.Secondary)
.setLabel(l.buttons.close)
.setEmoji("🔒")
)
.addComponents(
new button()
.setCustomId("OTdeleteTicket")
.setDisabled(true)
.setStyle(bs.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
@@ -0,0 +1,52 @@
const discord = require('discord.js')
const bot = require('../../../index')
const client = bot.client
const config = bot.config
const l = bot.language
const log = bot.errorLog.log
const getconfigoptions = require("../../getoptions")
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
const bs = discord.ButtonStyle
exports.firstmsgRowNormal = new arb()
.addComponents(
new button()
.setCustomId("OTcloseTicket")
.setDisabled(false)
.setStyle(bs.Secondary)
.setLabel(l.buttons.close)
.setEmoji("🔒")
)
.addComponents(
new button()
.setCustomId("OTdeleteTicket")
.setDisabled(false)
.setStyle(bs.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
exports.firstmsgRowDisabled = new arb()
.addComponents(
new button()
.setCustomId("OTcloseTicket")
.setDisabled(true)
.setStyle(bs.Secondary)
.setLabel(l.buttons.close)
.setEmoji("🔒")
)
.addComponents(
new button()
.setCustomId("OTdeleteTicket")
.setDisabled(true)
.setStyle(bs.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
@@ -0,0 +1,63 @@
const discord = require('discord.js')
const bot = require('../../../index')
const client = bot.client
const config = bot.config
const l = bot.language
const log = bot.errorLog.log
const getconfigoptions = require("../../getoptions")
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
const bs = discord.ButtonStyle
exports.closeVerifyBar = new arb()
.addComponents(
new button()
.setCustomId("OTcloseTicketTrue")
.setDisabled(false)
.setStyle(bs.Secondary)
.setEmoji("✅")
)
.addComponents(
new button()
.setCustomId("OTcloseTicketFalse")
.setDisabled(false)
.setStyle(bs.Secondary)
.setEmoji("❌")
)
exports.deleteVerifyBar = new arb()
.addComponents(
new button()
.setCustomId("OTdeleteTicketTrue")
.setDisabled(false)
.setStyle(bs.Secondary)
.setEmoji("✅")
)
.addComponents(
new button()
.setCustomId("OTdeleteTicketFalse")
.setDisabled(false)
.setStyle(bs.Secondary)
.setEmoji("❌")
)
exports.delete1VerifyBar = new arb()
.addComponents(
new button()
.setCustomId("OTdeleteTicketTrue1")
.setDisabled(false)
.setStyle(bs.Secondary)
.setEmoji("✅")
)
.addComponents(
new button()
.setCustomId("OTdeleteTicketFalse1")
.setDisabled(false)
.setStyle(bs.Secondary)
.setEmoji("❌")
)
+107
View File
@@ -0,0 +1,107 @@
const discord = require('discord.js')
const bot = require('../../../index')
const client = bot.client
const config = bot.config
const l = bot.language
const log = bot.errorLog.log
const getconfigoptions = require("../../getoptions")
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
/**
*
* @param {discord.User} addedUser
* @returns {discord.EmbedBuilder}
*/
exports.addEmbed = (addedUser) => {
return new embed()
.setTitle("⬆️ "+l.commands.userAddedTitle.replace("{0}",addedUser.username))
.setColor(mc)
.setFooter({text:addedUser.tag,iconURL:addedUser.displayAvatarURL()})
}
/**
*
* @param {discord.User} removedUser
* @returns {discord.EmbedBuilder}
*/
exports.removeEmbed = (removedUser) => {
return new embed()
.setTitle("⬇️ "+l.commands.userRemovedTitle.replace("{0}",removedUser.username))
.setColor(mc)
.setFooter({text:removedUser.tag,iconURL:removedUser.displayAvatarURL()})
}
/**
*
* @param {discord.User} closer
* @returns {discord.EmbedBuilder}
*/
exports.closeEmbed = (closer) => {
return new embed()
.setTitle("🔒 "+l.commands.closeTitle)
.setColor(mc)
.setFooter({text:closer.tag,iconURL:closer.displayAvatarURL()})
}
/**
*
* @param {discord.User} deleter
* @returns {discord.EmbedBuilder}
*/
exports.deleteEmbed = (deleter) => {
return new embed()
.setTitle("❌ "+l.commands.deleteTitle)
.setColor(mc)
.setFooter({text:deleter.tag,iconURL:deleter.displayAvatarURL()})
}
/**
*
* @param {discord.User} renamer
* @param {String} newname
* @returns {discord.EmbedBuilder}
*/
exports.renameEmbed = (renamer,newname) => {
return new embed()
.setTitle("🔄 "+l.commands.renameTitle.replace("{0}",newname))
.setColor(mc)
.setFooter({text:renamer.tag,iconURL:renamer.displayAvatarURL()})
}
/**
*
* @param {discord.User} reopener
* @returns {discord.EmbedBuilder}
*/
exports.reopenEmbed = (reopener) => {
return new embed()
.setTitle("🔓 "+l.commands.reopenTitle)
.setColor(mc)
.setFooter({text:reopener.tag,iconURL:reopener.displayAvatarURL()})
}
/**
*
* @param {Boolean} done
* @param {discord.TextChannel} channel
* @param {discord.User} author
* @returns {discord.EmbedBuilder}
*/
exports.sendTranscriptEmbed = (done,channel,author) => {
if (done){
return new embed()
.setTitle("📄 "+l.messages.hereIsTheTranscript)
.setColor(mc)
.setDescription("Ticket: "+channel.name)
.setFooter({text:author.tag,iconURL:author.displayAvatarURL()})
}else{
return new embed()
.setTitle("📄 "+l.messages.hereIsTheTranscript)
.setColor(mc)
.setDescription("Loading...")
.setFooter({text:author.tag,iconURL:author.displayAvatarURL()})
}
}
@@ -0,0 +1,62 @@
const discord = require('discord.js')
const bot = require('../../../../index')
const client = bot.client
const config = bot.config
const l = bot.language
const log = bot.errorLog.log
const getconfigoptions = require("../../../getoptions")
const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
const bs = discord.ButtonStyle
module.exports = () => {
//CLOSE
var closeTicketButtonChecker = false
client.on("interactionCreate",async interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "OTcloseTicketTrue") return
interaction.deferUpdate()
if (closeTicketButtonChecker == true) return
closeTicketButtonChecker = true
const firstcomponents = interaction.message.components
if (config.system.closeMode == "adminonly"){
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
if (!permissionChecker.sendUserNoPerms(interaction.user)){
permissionChecker.sendChannelNoPerms(interaction.channel)
}
interaction.message.edit({components:[firstcomponents]})
closeTicketButtonChecker = false
return
}
}
interaction.message.edit({components:[bot.buttons.close.openRowDisabled]})
/**
* @type {String}
*/
const name = interaction.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
interaction.channel.send({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]})
await require("../../../ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",false,true)
closeTicketButtonChecker = false
})
}
@@ -0,0 +1,99 @@
const discord = require('discord.js')
const bot = require('../../../../index')
const client = bot.client
const config = bot.config
const l = bot.language
const log = bot.errorLog.log
const getconfigoptions = require("../../../getoptions")
const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
const bs = discord.ButtonStyle
module.exports = () => {
//DELETE
var deleteTicketButtonChecker = false
client.on("interactionCreate",async interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "OTdeleteTicketTrue") return
interaction.deferUpdate()
if (deleteTicketButtonChecker == true) return
deleteTicketButtonChecker = true
const firstcomponents = bot.buttons.close.openRowNormal
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
if (!permissionChecker.sendUserNoDelete(interaction.user)){
permissionChecker.sendChannelNoDelete(interaction.channel)
}
await interaction.message.edit({components:[firstcomponents]})
deleteTicketButtonChecker = false
return
}
/**
* @type {String}
*/
const name = interaction.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
await interaction.message.edit({components:[bot.buttons.close.openRowDisabled]})
await require("../../../ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true)
deleteTicketButtonChecker = false
})
//DELETE NO TRANSCRIPT
var deleteTicketButtonChecker1 = false
client.on("interactionCreate",async interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "OTdeleteTicketTrue1") return
interaction.deferUpdate()
if (deleteTicketButtonChecker1 == true) return
deleteTicketButtonChecker1 = true
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)
}
await interaction.message.edit({components:[firstcomponents]})
deleteTicketButtonChecker1 = false
return
}
/**
* @type {String}
*/
const name = interaction.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
await require("../../../ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"deletenotranscript",false,true)
deleteTicketButtonChecker1 = false
})
}
@@ -0,0 +1,29 @@
const discord = require('discord.js')
const bot = require('../../../../index')
const client = bot.client
const config = bot.config
const l = bot.language
const log = bot.errorLog.log
const getconfigoptions = require("../../../getoptions")
const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
const bs = discord.ButtonStyle
module.exports = () => {
//REOPEN
client.on("interactionCreate",(interaction) => {
if (!interaction.isButton()) return
if (interaction.customId != "OTreopenTicket") return
interaction.deferUpdate()
interaction.message.edit({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]})
require("../../../ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user)
})
}
@@ -0,0 +1,21 @@
const discord = require('discord.js')
const bot = require('../../../index')
const client = bot.client
const config = bot.config
const l = bot.language
const log = bot.errorLog.log
const getconfigoptions = require("../../getoptions")
const storage = bot.storage
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
const bs = discord.ButtonStyle
module.exports = () => {
}
@@ -0,0 +1,10 @@
module.exports = () => {
require("./firstmsg")()
require("./sendTranscript")()
require("./verifyBars")()
//accepted
require("./accepted/closing")()
require("./accepted/reopening")()
require("./accepted/deleting")()
}
@@ -0,0 +1,45 @@
const discord = require('discord.js')
const bot = require('../../../index')
const client = bot.client
const config = bot.config
const l = bot.language
const log = bot.errorLog.log
const getconfigoptions = require("../../getoptions")
const storage = bot.storage
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
const bs = discord.ButtonStyle
module.exports = () => {
client.on("interactionCreate",async (interaction) => {
if (!interaction.isButton()) return
if (interaction.customId != "OTsendTranscript") return
interaction.deferUpdate()
const tsmsg = await interaction.channel.send({embeds:[bot.embeds.commands.sendTranscriptEmbed(false,interaction.channel,interaction.user)]})
const channelmessages = await interaction.channel.messages.fetch()
channelmessages.sweep((msgSweep) => {
return msgSweep.author.id == client.user.id
})
var fileattachment = await require("../../transcript").createTranscript(channelmessages,interaction.channel)
if (fileattachment == false){
log("system","internal error: transcript is not created!")
tsmsg.edit({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrongTranscript)]})
return
}
try {
tsmsg.edit({embeds:[bot.embeds.commands.sendTranscriptEmbed(true,interaction.channel,interaction.user)],files:[fileattachment]})
}catch{}
})
}
@@ -0,0 +1,69 @@
const discord = require('discord.js')
const bot = require('../../../index')
const client = bot.client
const config = bot.config
const l = bot.language
const log = bot.errorLog.log
const getconfigoptions = require("../../getoptions")
const storage = bot.storage
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
const bs = discord.ButtonStyle
module.exports = () => {
//CLOSE
client.on("interactionCreate",interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "OTcloseTicket") return
interaction.deferUpdate()
interaction.message.edit({components:[bot.buttons.verifybars.closeVerifyBar]})
})
client.on("interactionCreate",interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "OTcloseTicketFalse") return
interaction.deferUpdate()
interaction.message.edit({components:[bot.buttons.close.openRowNormal]})
})
//DELETE
client.on("interactionCreate",interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "OTdeleteTicket") return
interaction.deferUpdate()
interaction.message.edit({components:[bot.buttons.verifybars.deleteVerifyBar]})
})
client.on("interactionCreate",interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "OTdeleteTicketFalse") return
interaction.deferUpdate()
interaction.message.edit({components:[bot.buttons.close.openRowNormal]})
})
//DELETE NO TRANSCRIPT
client.on("interactionCreate",interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "OTdeleteTicket1") return
interaction.deferUpdate()
interaction.message.edit({components:[bot.buttons.verifybars.delete1VerifyBar]})
})
client.on("interactionCreate",interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "OTdeleteTicketFalse1") return
interaction.deferUpdate()
interaction.message.edit({components:[bot.buttons.close.closeCommandRow]})
})
}
+12
View File
@@ -6,6 +6,8 @@ const log = bot.errorLog.log
const l = bot.language const l = bot.language
const storage = bot.storage const storage = bot.storage
const APIEvents = require("./api/modules/events")
module.exports = async () => { module.exports = async () => {
const chalk = await (await import("chalk")).default const chalk = await (await import("chalk")).default
@@ -34,23 +36,33 @@ module.exports = async () => {
interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role) interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role)
log("system","added role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}]) log("system","added role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}])
const apirole = interaction.guild.roles.cache.find(r => r.id == role)
APIEvents.onReactionRole("add","add",apirole,interaction.user,interaction.channel,interaction.guild,new Date())
}) })
}else if (mode == "remove"){ }else if (mode == "remove"){
option.roles.forEach((role) => { option.roles.forEach((role) => {
interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role) interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role)
log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}]) log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}])
const apirole = interaction.guild.roles.cache.find(r => r.id == role)
APIEvents.onReactionRole("remove","remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date())
}) })
}else if (mode == "add&remove"){ }else if (mode == "add&remove"){
option.roles.forEach((role) => { option.roles.forEach((role) => {
if (interaction.guild.members.cache.find(u => u.id == user.id).roles.cache.has(role)){ if (interaction.guild.members.cache.find(u => u.id == user.id).roles.cache.has(role)){
interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role) interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role)
log("system","added role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}]) log("system","added role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}])
const apirole = interaction.guild.roles.cache.find(r => r.id == role)
APIEvents.onReactionRole("add","add&remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date())
}else { }else {
interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role) interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role)
log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}]) log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}])
const apirole = interaction.guild.roles.cache.find(r => r.id == role)
APIEvents.onReactionRole("remove","add&remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date())
} }
}) })
} }
+2 -2
View File
@@ -29,10 +29,10 @@ module.exports = async () => {
var readystats = 0 var readystats = 0
process.stdout.write("[status] there are "+chalk.blue("0 out of 10")+" commands ready! (this can take up to 40 seconds)") //process.stdout.write("[status] there are "+chalk.blue("0 out of 10")+" commands ready! (this can take up to 40 seconds)")
setInterval(() => { setInterval(() => {
process.stdout.cursorTo(0) process.stdout.cursorTo(0)
process.stdout.write("[status] there are "+chalk.blue(readystats+" out of 9")+" commands ready! (this can take up to 40 seconds)") process.stdout.write("[status] there are "+chalk.blue(readystats+" out of 10")+" commands ready! (this can take up to 40 seconds)")
if (readystats >= 10){ if (readystats >= 10){
console.log(chalk.green("\nready!")) console.log(chalk.green("\nready!"))
console.log(chalk.bgBlue("you can now start the bot with 'npm start'!")) console.log(chalk.bgBlue("you can now start the bot with 'npm start'!"))
+314 -251
View File
@@ -5,257 +5,7 @@ const config = bot.config
const log = bot.errorLog.log const log = bot.errorLog.log
const l = bot.language const l = bot.language
const storage = bot.storage const storage = bot.storage
const permsChecker = require("./utils/permisssionChecker")
/**
*
* @param {discord.Interaction} interaction
* @param {String} prefix
* @param {"delete"|"close"|"deletenotranscript"} mode
*/
exports.closeTicket = async (interaction,prefix,mode) => {
const chalk = await (await import("chalk")).default
const channelmessages = await interaction.channel.messages.fetch()
const channel = interaction.channel
channelmessages.sweep((msgSweep) => {
return msgSweep.author.id == client.user.id
})
/**
* @type {String} ticketuserarray
*/
const ticketuserarray = interaction.channel.name
const ticketusername = ticketuserarray.split(prefix)[1]
var getuserID = storage.get("userTicketStorage",interaction.channel.id)
try {
var getusernameStep1 = client.users.cache.find(u => u.id === getuserID)
var isDatabaseError = false
}catch{
var isDatabaseError = true
}
if (!getusernameStep1){
console.log(chalk.red("[database error]"),"something went wrong when getting the data in the database.\nNo panic, this error fixes itself!")
var isDatabaseError = true
}
var enableTranscript = true
var deleteRequired = false
if (mode == "delete"){
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("MANAGE_GUILD")){
try {
return interaction.member.send({embeds:[bot.errorLog.noPermsMessage]})
}catch{
return interaction.channel.send({embeds:[bot.errorLog.noPermsMessage]})
}
}
deleteRequired = true
await interaction.channel.send({content:"**"+l.messages.gettingdeleted+"**"})
log("system","deleted a ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name}])
if (!isDatabaseError) storage.set("ticketStorage",getuserID,Number(storage.get("ticketStorage",getuserID)) - 1)
//getID & send DM
await interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1]
const ticketData = require("./getoptions").getOptionsById("newT"+ticketId)
require("./api/modules/events").onTicketDelete(interaction.user,interaction.channel,interaction.guild,new Date(),{name:interaction.channel.name,status:"deleted",ticketOptions:ticketData})
if (!firstmsg.embeds[0].author) return false
const id = firstmsg.embeds[0].author.name
if (!id) return false
try{
if (config.system.enable_DM_Messages){
interaction.member.send({embeds:[bot.errorLog.custom(l.messages.deletedTicketDmTitle,l.messages.deletedTicketDmDescription,":ticket:",config.main_color)]})
}
}
catch{log("system","can't send DM to member, member doesn't allow dm's")}
})
}else if (mode == "close"){
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("MANAGE_GUILD")){
try {
return interaction.member.send({embeds:[bot.errorLog.noPermsMessage]})
}catch{
return interaction.channel.send({embeds:[bot.errorLog.noPermsMessage]})
}
}
}
var permissionArray = []
const pfb = discord.PermissionFlagsBits
if (!isDatabaseError) permissionArray.push({
id:getusernameStep1,
type:"member",
allow:[pfb.ViewChannel],
deny:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages]
})
permissionArray.push({
id:interaction.guild.roles.everyone,
type:"role",
deny:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
})
interaction.channel.permissionOverwrites.set(permissionArray)
//message
var closeButtonRow = 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("✔")
)
const embed = new discord.EmbedBuilder()
.setColor(config.main_color)
.setTitle(":lock: "+l.messages.closedTitle+" :lock:")
.setDescription(l.messages.closedDescription)
interaction.channel.send({embeds:[embed],components:[closeButtonRow]})
log("system","closed a ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name}])
//getID & send DM
await interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1]
const ticketData = require("./getoptions").getOptionsById("newT"+ticketId)
require("./api/modules/events").onTicketClose(interaction.user,interaction.channel,interaction.guild,new Date(),{name:interaction.channel.name,status:"closed",ticketOptions:ticketData})
const id = firstmsg.embeds[0].author.name
if (!id) return false
try{
if (config.system.enable_DM_Messages){
interaction.member.send({embeds:[bot.errorLog.custom(l.messages.closedTicketDmTitle,l.messages.closedTicketDmDescription,":ticket:",config.main_color)]})
}
}
catch{log("system","can't send DM to member, member doesn't allow dm's")}
})
}else if (mode == "deletenotranscript"){
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("MANAGE_GUILD")){
interaction.channel.send({embeds:[bot.errorLog.noPermsMessage]})
return
}
enableTranscript = false
deleteRequired = true
interaction.channel.send({content:"**"+l.messages.gettingdeleted+"**"})
log("system","deleted a ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name}])
if (!isDatabaseError) storage.set("ticketStorage",getuserID,Number(storage.get("ticketStorage",getuserID)) - 1)
//getID & send DM
await interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1]
const ticketData = require("./getoptions").getOptionsById("newT"+ticketId)
require("./api/modules/events").onTicketDelete(interaction.user,interaction.channel,interaction.guild,new Date(),{name:interaction.channel.name,status:"deleted",ticketOptions:ticketData})
const id = firstmsg.embeds[0].author.name
if (!id) return false
try{
if (config.system.enable_DM_Messages){
interaction.member.send({embeds:[bot.errorLog.custom(l.messages.deletedTicketDmTitle,l.messages.deletedTicketDmDescription,":ticket:",config.main_color)]})
}
}
catch{log("system","can't send DM to member, member doesn't allow dm's")}
})
}
if (enableTranscript == true && mode != "deletenotranscript"){
if (config.system.enable_transcript || config.system.enable_DM_transcript){
var fileattachment = await require("./transcript").createTranscript(channelmessages,channel)
if (fileattachment == false){log("system","internal error: transcript is not created!");return}
}
if (config.system.enable_transcript){
const transcriptEmbed = new discord.EmbedBuilder()
.setColor(config.main_color)
.setTitle(l.messages.newTranscriptTitle)
.setAuthor({name:interaction.user.username,iconURL:interaction.user.displayAvatarURL({format:"png"})})
.setDescription(l.messages.newTranscriptDescription)
.setFooter({text:"ticket: "+ticketuserarray})
interaction.guild.channels.cache.find(c => c.id == config.system.transcript_channel).send({
embeds:[transcriptEmbed],
files:[fileattachment]
})
}
if (config.system.enable_DM_transcript){
const transcriptEmbed = new discord.EmbedBuilder()
.setColor(config.main_color)
.setTitle(l.messages.newTranscriptTitle)
.setDescription(l.messages.newTranscriptDescription)
.setFooter({text:"ticket: "+ticketuserarray})
if (!isDatabaseError) getusernameStep1.send({
embeds:[transcriptEmbed],
files:[fileattachment]
})
}
}
if (deleteRequired){
const timer = () => {return new Promise((resolve,reject) => {
setTimeout(() => {resolve(true)},7000)
})}
await timer()
await interaction.channel.delete()
}
}
exports.runThis = () => { exports.runThis = () => {
client.on("interactionCreate",async (interaction) => { client.on("interactionCreate",async (interaction) => {
@@ -280,4 +30,317 @@ exports.runThis = () => {
interaction.channel.send({content:"**"+l.messages.hereIsTheTranscript+"**",files:[fileattachment]}) interaction.channel.send({content:"**"+l.messages.hereIsTheTranscript+"**",files:[fileattachment]})
}) })
}
/**
*
* @param {discord.GuildMember} member
* @param {discord.TextChannel} channel
* @param {String} prefix
* @param {"delete"|"close"|"deletenotranscript"} mode
* @param {Boolean} nomessage
* @param {String} reason only when closing, not when deleting!
*/
exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => {
const guild = channel.guild
const user = member.user
const chalk = await (await import("chalk")).default
const channelmessages = await channel.messages.fetch()
const newReason = reason ? reason : "none"
//start code
//remove ot bot from transcript
channelmessages.sweep((msgSweep) => {return msgSweep.author.id == client.user.id})
/**@type {String}*/
const channelname = channel.name
const ticketOpenerChannelName = channelname.split(prefix)[1]
//get user that opened the ticket
var getuserID = storage.get("userTicketStorage",channel.id)
try {
var ticketOpener = client.users.cache.find(u => u.id === getuserID)
var isDatabaseError = false
}catch{var isDatabaseError = true}
if (!ticketOpener){
console.log(chalk.red("[database error]"),"something went wrong when getting the data in the database.\nNo panic, this error fixes itself!")
var isDatabaseError = true
}
var enableTranscript = true
var deleteRequired = false
if (mode == "delete"){
//delete
//check perms
if (!guild) return
if (!permsChecker.command(user.id,guild.id)){
permsChecker.sendUserNoPerms(user)
return
}
//start delete proccess
deleteRequired = true
if (!nomessage){
await channel.send({content:"**"+l.messages.gettingdeleted+"**"})
}
log("system","deleted a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}])
if (!isDatabaseError) storage.set("ticketStorage",getuserID,Number(storage.get("ticketStorage",getuserID)) - 1)
//getID & send DM & send api event
await channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value.value
const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId)
require("./api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData})
const id = hiddendata.data.find(d => d.key == "openerid").value
if (!id) return false
try{
if (config.system.enable_DM_Messages){
member.send({embeds:[bot.errorLog.custom(l.messages.deletedTicketDmTitle,l.messages.deletedTicketDmDescription,":ticket:",config.main_color)]})
}
}
catch{log("system","can't send DM to member, member doesn't allow dm's")}
})
}else if (mode == "close"){
//close
//check perms
if (config.system.closeMode == "adminonly"){
if (!guild) return
if (!permsChecker.command(user.id,guild.id)){
permsChecker.sendUserNoPerms(user)
return
}
}
//set new permissions
var permissionArray = []
const pfb = discord.PermissionFlagsBits
if (!isDatabaseError) permissionArray.push({
id:ticketOpener,
type:"member",
allow:[pfb.ViewChannel],
deny:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages]
})
permissionArray.push({
id:guild.roles.everyone,
type:"role",
deny:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
})
//add main adminroles
config.main_adminroles.forEach((role,index) => {
try {
const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return
permissionArray.push({
id:adminrole,
type:"role",
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
})
}catch{
log("system","invalid role! At 'config.json => main_adminroles:"+index)
}
})
//add ticket adminroles
await channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId)
if (!ticketData) return
/**
* @type {String[]}
*/
const ticketadmin = ticketData.adminroles
ticketadmin.forEach((role,index) => {
if (!config.main_adminroles.includes(role)){
try {
const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return
permissionArray.push({
id:adminrole,
type:"role",
allow:[pfb.AddReactions,pfb.ViewChannel],
deny:[pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages]
})
}catch{
log("system","invalid role! At 'config.json => options/ticket/...:"+index)
}
}
})
})
channel.permissionOverwrites.set(permissionArray)
if (!nomessage){
//message
var closeButtonRow = new discord.ActionRowBuilder()
.addComponents(
new discord.ButtonBuilder()
.setCustomId("OTdeleteTicket1")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("OTsendTranscript")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setLabel(l.buttons.sendTranscript)
.setEmoji("📄")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("OTreopenTicket")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Success)
.setLabel(l.buttons.reopen)
.setEmoji("✔")
)
const embed = new discord.EmbedBuilder()
.setColor(config.main_color)
.setTitle(":lock: "+l.messages.closedTitle+" :lock:")
.setDescription(l.messages.closedDescription)
channel.send({embeds:[embed],components:[closeButtonRow]})
}
log("system","closed a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}])
//getID & send DM & send api event
await channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId)
require("./api/modules/events").onTicketClose(user,channel,guild,new Date(),{name:channel.name,status:"closed",ticketOptions:ticketData},newReason)
const id = hiddendata.data.find(d => d.key == "openerid").value
if (!id) return false
try{
if (config.system.enable_DM_Messages){
member.send({embeds:[bot.errorLog.custom(l.messages.closedTicketDmTitle,l.messages.closedTicketDmDescription+"\n\n**reason:** "+newReason,":ticket:",config.main_color)]})
}
}
catch{log("system","can't send DM to member, member doesn't allow dm's")}
})
}else if (mode == "deletenotranscript"){
//delete with no transcript
//check perms
if (!guild) return
if (!permsChecker.command(user.id,guild.id)){
permsChecker.sendUserNoPerms(user)
return
}
//start delete proccess
enableTranscript = false
deleteRequired = true
if (!nomessage){
await channel.send({content:"**"+l.messages.gettingdeleted+"**"})
}
log("system","deleted a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}])
if (!isDatabaseError) storage.set("ticketStorage",getuserID,Number(storage.get("ticketStorage",getuserID)) - 1)
//getID & send DM & send api event
await channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId)
require("./api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData})
const id = hiddendata.data.find(d => d.key == "openerid").value
if (!id) return false
try{
if (config.system.enable_DM_Messages){
member.send({embeds:[bot.errorLog.custom(l.messages.deletedTicketDmTitle,l.messages.deletedTicketDmDescription,":ticket:",config.main_color)]})
}
}
catch{log("system","can't send DM to member, member doesn't allow dm's")}
})
}
if (enableTranscript == true && mode != "deletenotranscript"){
const transcriptReason = (mode == "close") ? "**reason:** "+newReason : "**reason:** none"
if (config.system.enable_transcript || config.system.enable_DM_transcript){
var fileattachment = await require("./transcript").createTranscript(channelmessages,channel)
if (fileattachment == false){log("system","internal error: transcript is not created!");return}
}
if (config.system.enable_transcript){
const transcriptEmbed = new discord.EmbedBuilder()
.setColor(config.main_color)
.setTitle("📄 "+l.messages.newTranscriptTitle)
.setDescription(transcriptReason)
.setFooter({text:"closed by: "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()})
guild.channels.cache.find(c => c.id == config.system.transcript_channel).send({
embeds:[transcriptEmbed],
files:[fileattachment]
})
}
if (config.system.enable_DM_transcript){
const transcriptEmbed = new discord.EmbedBuilder()
.setColor(config.main_color)
.setTitle("📄 "+l.messages.newTranscriptTitle)
.setDescription(transcriptReason)
.setFooter({text:"closed by: "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()})
if (!isDatabaseError) ticketOpener.send({
embeds:[transcriptEmbed],
files:[fileattachment]
})
}
}
if (deleteRequired){
//const timer = () => {return new Promise((resolve,reject) => {
// setTimeout(() => {resolve(true)},7000)
//})}
//await timer()
setTimeout(async () => {
await channel.delete()
},6000)
}
} }
+7 -5
View File
@@ -33,11 +33,16 @@ exports.createEmbed = (id) => {
//----------------------------------- //-----------------------------------
//create the embed //create the embed
const embed = new discord.EmbedBuilder() const embed = new discord.EmbedBuilder()
.setColor(data.color)
.setTitle(data.name) .setTitle(data.name)
if (data.enableFooter) embed.setFooter({text:data.footer}) if (data.enableFooter) embed.setFooter({text:data.footer})
if (data.enableThumbnail) embed.setThumbnail(data.thumbnail) if (data.enableThumbnail) embed.setThumbnail(data.thumbnail)
if (data.enableCustomColor){
embed.setColor(data.color)
}else{
embed.setColor(config.main_color)
}
var description = data.description var description = data.description
if (data.enableTicketExplaination){ if (data.enableTicketExplaination){
description = description+"\n\n__"+l.messages.chooseCategory+"__\n" description = description+"\n\n__"+l.messages.chooseCategory+"__\n"
@@ -90,7 +95,4 @@ exports.createEmbed = (id) => {
*/ */
const returnedData = {embed:embed,componentRows:componentRows} const returnedData = {embed:embed,componentRows:componentRows}
return returnedData return returnedData
} }
this.createEmbed()
+13 -23
View File
@@ -9,35 +9,19 @@ const getconfigoptions = require("./getoptions")
const storage = bot.storage const storage = bot.storage
module.exports = () => { module.exports = () => {
var closeButton = new discord.ActionRowBuilder() var closeButton = bot.buttons.firstmsg.firstmsgRowNormal
.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("✖️")
)
//ticket button click / create ticket //ticket button click / create ticket
client.on("interactionCreate",(interaction) => { client.on("interactionCreate",(interaction) => {
if (interaction.isChatInputCommand() && (interaction.commandName == "new" || interaction.commandName == "ticket")){ if (interaction.isChatInputCommand() && (interaction.commandName == "new" || interaction.commandName == "ticket")){
var customId = "newT"+interaction.options.getString("type") var customId = "OTnewT"+interaction.options.getString("type")
}else if (interaction.isButton()){ }else if (interaction.isButton()){
var customId = interaction.customId var customId = interaction.customId
}else return }else return
if (interaction.isButton()){ if (interaction.isButton()){
if (interaction.customId.startsWith("newT")){ if (interaction.customId.startsWith("OTnewT")){
const optionid = interaction.customId.split("newT")[1] const optionid = interaction.customId.split("OTnewT")[1]
if (!optionid){ if (!optionid){
interaction.reply({embeds:[bot.errorLog.serverError(l.errors.ticketDoesntExist)]}) interaction.reply({embeds:[bot.errorLog.serverError(l.errors.ticketDoesntExist)]})
return return
@@ -173,13 +157,19 @@ module.exports = () => {
}).then((ticketChannel) => { }).then((ticketChannel) => {
storage.set("userTicketStorage",ticketChannel.id,interaction.member.id) storage.set("userTicketStorage",ticketChannel.id,interaction.member.id)
const hiddendata = bot.hiddenData.writeHiddenData("ticketdata",[{key:"type",value:currentTicketOptions.id},{key:"openerid",value:interaction.user.id},{key:"createdms",value:new Date().getTime()}])
var ticketEmbed = new discord.EmbedBuilder() var ticketEmbed = new discord.EmbedBuilder()
.setAuthor({name:interaction.user.id}) //.setAuthor({name:interaction.user.id})
.setColor(config.main_color) .setColor(config.main_color)
.setTitle(currentTicketOptions.name) .setTitle(currentTicketOptions.name)
.setFooter({text:"Ticket Type: "+currentTicketOptions.id}) //.setFooter({text:"Ticket Type: "+currentTicketOptions.id})
if (currentTicketOptions.ticketmessage.length > 0) ticketEmbed.setDescription(currentTicketOptions.ticketmessage) if (currentTicketOptions.ticketmessage.length > 0){
ticketEmbed.setDescription(currentTicketOptions.ticketmessage+hiddendata)
}else{
ticketEmbed.setDescription(hiddendata)
}
ticketChannel.send({ ticketChannel.send({
content:"<@"+interaction.member.id+"> @here", content:"<@"+interaction.member.id+"> @here",
+52 -127
View File
@@ -5,8 +5,53 @@ const config = bot.config
const log = bot.errorLog.log const log = bot.errorLog.log
const l = bot.language const l = bot.language
const storage = bot.storage const storage = bot.storage
const pfb = discord.PermissionFlagsBits
module.exports = () => { /**
*
* @param {discord.Guild} guild
* @param {discord.TextBasedChannel} channel
* @param {discord.User} user
* @returns
*/
const reopenTicket = (guild,channel,user) => {
log("system","re-opened a ticket",[{key:"ticket",value:channel.name},{key:"user",value:user.tag}])
var permissionsArray = []
//set everyone allowed
if (config.system['has@everyoneaccess']){
var everyoneAllowPerms = [pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
var everyoneDenyPerms = []
}else{
var everyoneAllowPerms = []
var everyoneDenyPerms = [pfb.ViewChannel]
}
permissionsArray.push({
id:guild.roles.everyone,
type:"role",
allow:everyoneAllowPerms,
deny:everyoneDenyPerms
})
channel.permissionOverwrites.cache.forEach((p) => {
if (p.type == 1){
permissionsArray.push({
id:p.id,
type:"member",
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel],
deny:[]
})
}
})
channel.permissionOverwrites.set(permissionsArray)
require("./api/modules/events").onTicketReopen(user,channel,guild,new Date(),{name:channel.name,status:"reopened",ticketOptions:false})
}
exports.reopenTicket = reopenTicket
exports.runThis = () => {
var closeRowNormal = new discord.ActionRowBuilder() var closeRowNormal = new discord.ActionRowBuilder()
.addComponents( .addComponents(
new discord.ButtonBuilder() new discord.ButtonBuilder()
@@ -92,6 +137,10 @@ module.exports = () => {
.setEmoji("🔓") .setEmoji("🔓")
) )
//NORMAL WAY //NORMAL WAY
client.on("interactionCreate",(interaction) => { client.on("interactionCreate",(interaction) => {
if (!interaction.isButton()) return if (!interaction.isButton()) return
@@ -111,8 +160,6 @@ module.exports = () => {
}) })
const pfb = discord.PermissionFlagsBits
client.on("interactionCreate",(interaction) => { client.on("interactionCreate",(interaction) => {
if (!interaction.isButton()) return if (!interaction.isButton()) return
if (interaction.customId != "reopenTicketTrue") return if (interaction.customId != "reopenTicketTrue") return
@@ -126,38 +173,7 @@ module.exports = () => {
interaction.message.edit({embeds:[embed],components:[closeRowNormal]}) interaction.message.edit({embeds:[embed],components:[closeRowNormal]})
log("system","re-opened a ticket",[{key:"ticket",value:interaction.channel.name},{key:"user",value:interaction.user.tag}]) reopenTicket(interaction.guild,interaction.channel,interaction.user)
var permissionsArray = []
//set everyone allowed
if (config.system['has@everyoneaccess']){
var everyoneAllowPerms = [pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
var everyoneDenyPerms = []
}else{
var everyoneAllowPerms = []
var everyoneDenyPerms = [pfb.ViewChannel]
}
permissionsArray.push({
id:interaction.guild.roles.everyone,
type:"role",
allow:everyoneAllowPerms,
deny:everyoneDenyPerms
})
interaction.channel.permissionOverwrites.cache.forEach((p) => {
if (p.type == "member"){
permissionsArray.push({
id:p.id,
type:"member",
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel],
deny:[]
})
}
})
interaction.channel.permissionOverwrites.set(permissionsArray)
}) })
@@ -193,97 +209,6 @@ module.exports = () => {
interaction.message.edit({content:null,embeds:[embed],components:[closeRowNormal]}) interaction.message.edit({content:null,embeds:[embed],components:[closeRowNormal]})
log("system","re-opened a ticket",[{key:"ticket",value:interaction.channel.name},{key:"user",value:interaction.user.tag}]) reopenTicket(interaction.guild,interaction.channel,interaction.user)
var permissionsArray = []
//set everyone allowed
if (config.system['has@everyoneaccess']){
var everyoneAllowPerms = [pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
var everyoneDenyPerms = []
}else{
var everyoneAllowPerms = []
var everyoneDenyPerms = [pfb.ViewChannel]
}
permissionsArray.push({
id:interaction.guild.roles.everyone,
type:"role",
allow:everyoneAllowPerms,
deny:everyoneDenyPerms
})
interaction.channel.permissionOverwrites.cache.forEach((p) => {
if (p.type == "member"){
permissionsArray.push({
id:p.id,
type:"member",
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel],
deny:[]
})
}
})
interaction.channel.permissionOverwrites.set(permissionsArray)
//getID & send DM
interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
const id = firstmsg.embeds[0].author.name
if (!id) return false
try{
if (config.system.enable_DM_Messages){
interaction.member.send({embeds:[bot.errorLog.custom(l.messages.reopenTicketDmTitle,l.messages.reopenTicketDmDescription,":ticket:",config.main_color)]})
}
}
catch{log("system","can't send DM to member, member doesn't allow dm's")}
})
}) })
//DASHBOARD (comming soon!)
/**
*
* @param {discord.Guild} guild
* @param {discord.TextBasedChannel} channel
* @param {discord.User} user
* @returns
*/
const reopenTicket = (guild,channel,user) => {
log("system","re-opened a ticket",[{key:"ticket",value:channel.name},{key:"user",value:user.tag}])
var permissionsArray = []
//set everyone allowed
if (config.system['has@everyoneaccess']){
var everyoneAllowPerms = [pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
var everyoneDenyPerms = []
}else{
var everyoneAllowPerms = []
var everyoneDenyPerms = [pfb.ViewChannel]
}
permissionsArray.push({
id:guild.roles.everyone,
type:"role",
allow:everyoneAllowPerms,
deny:everyoneDenyPerms
})
channel.permissionOverwrites.cache.forEach((p) => {
if (p.type == "member"){
permissionsArray.push({
id:p.id,
type:"member",
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel],
deny:[]
})
}
})
channel.permissionOverwrites.set(permissionsArray)
}
} }
+7 -4
View File
@@ -18,10 +18,11 @@ const getUserInfo = (channel) => {
} }
channel.messages.fetchPinned().then(msglist => { channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type")
const id = firstmsg.embeds[0].author.name ? firstmsg.embeds[0].author.name : false const id = hiddendata.data.find(d => d.key == "openerid").value
result.ticketopener.id = id result.ticketopener.id = id
@@ -44,6 +45,8 @@ const getUserInfo = (channel) => {
exports.createTranscript = async (messagecollection,channel) => { exports.createTranscript = async (messagecollection,channel) => {
const ticketuserdata = await getUserInfo(channel) const ticketuserdata = await getUserInfo(channel)
require("./api/modules/events").onTranscriptCreation(messagecollection,channel,channel.guild,new Date())
try { try {
const cd = new Date() const cd = new Date()
const months = ["January","February","March","April","May","June","July","August","September","October","November","December"] const months = ["January","February","March","April","May","June","July","August","September","October","November","December"]
@@ -57,8 +60,8 @@ exports.createTranscript = async (messagecollection,channel) => {
if (msg.content){var content = msg.content}else{var content = "*empty message*"} if (msg.content){var content = msg.content}else{var content = "*empty message*"}
const msgstats = "files: "+msg.attachments.size+" | embeds: "+msg.embeds.length+" | isbot: "+msg.author.bot const msgstats = "files: "+msg.attachments.size+", embeds: "+msg.embeds.length
filearray.push("["+timestamp.getDate()+"/"+timestamp.getMonth()+"/"+timestamp.getFullYear()+" | "+timestamp.getHours()+":"+timestamp.getMinutes()+":"+timestamp.getSeconds()+" | "+msg.author.tag+" ] ["+msgstats+"]\n"+content+"\n") filearray.push("["+timestamp.getDate()+"/"+timestamp.getMonth()+"/"+timestamp.getFullYear()+", "+timestamp.getHours()+":"+timestamp.getMinutes()+":"+timestamp.getSeconds()+"|"+msg.author.tag+"] ["+msgstats+"]\n"+content+"\n")
}) })
if (filearray.length < 2) filearray.push("transcript is empty") if (filearray.length < 2) filearray.push("transcript is empty")
+1 -1
View File
@@ -37,7 +37,7 @@ exports.getButton = (id) => {
if (!option) return false if (!option) return false
if (option.type == "ticket"){ if (option.type == "ticket"){
var button = new discord.ButtonBuilder() var button = new discord.ButtonBuilder()
.setCustomId("newT"+option.id) .setCustomId("OTnewT"+option.id)
.setDisabled(false) .setDisabled(false)
.setStyle(getColor(option.color)) .setStyle(getColor(option.color))
+52
View File
@@ -0,0 +1,52 @@
/**@typedef {{type:String,data:[{key:String,value:String}]}} hiddenData */
/**
*
* @param {String} messageContent
* @returns {hiddenData}
*/
exports.readHiddenData = (messageContent) => {
//ticketdata//type:123|userid:456)
const rawhidden = messageContent.split("[ ](OTDATA|")[1]
const rawhidden2 = rawhidden.split("//")
const datatype = rawhidden2[0]
var rawhiddendata = rawhidden2[1]
var rawhiddendataArray = rawhiddendata.split("")
rawhiddendataArray.pop()
rawhiddendata = rawhiddendataArray.join("")
const splittedData = rawhiddendata.split("|")
const resultData = []
splittedData.forEach((data) => {
// type:123
const dataresult = data.split(":")
resultData.push({key:dataresult[0],value:dataresult[1]})
})
return {type:datatype,data:resultData}
}
/**
*
* @param {String} type
* @param {[{key:String,value:String}]} data
* @returns {String}
*/
exports.writeHiddenData = (type,data) => {
const dataValues = []
data.forEach((d) => {
dataValues.push(d.key+":"+d.value)
})
const datastring = dataValues.join("|")
const result = "[ ](OTDATA|"+type+"//"+datastring+")"
return result
}
+104
View File
@@ -0,0 +1,104 @@
const discord = require('discord.js')
const bot = require('../../index')
const client = bot.client
const config = bot.config
const log = bot.errorLog.log
const l = bot.language
const storage = bot.storage
/**
*
* @param {String} memberid
* @param {String} guildid
* @returns {Boolean} has permissions?
*/
exports.command = (memberid,guildid) => {
const permsmember = client.guilds.cache.find(g => g.id == guildid).members.cache.find(m => m.id == memberid)
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
return false
}else {return true}
}
/**
*
* @param {discord.User} user
* @returns {Boolean}
*/
exports.sendUserNoPerms = (user) => {
try {
user.send({embeds:[bot.errorLog.noPermsMessage]})
return true
}catch{
return false
}
}
/**
*
* @param {discord.User} user
* @returns {Boolean}
*/
exports.sendUserNoTicket = (user) => {
try {
user.send({embeds:[bot.errorLog.notInATicket]})
return true
}catch{
return false
}
}
/**
*
* @param {discord.User} user
* @returns {Boolean}
*/
exports.sendUserNoDelete = (user) => {
try {
user.send({embeds:[bot.errorLog.noPermsDelete]})
return true
}catch{
return false
}
}
/**
*
* @param {discord.TextChannel} channel
* @returns {Boolean}
*/
exports.sendChannelNoPerms = (channel) => {
try {
channel.send({embeds:[bot.errorLog.noPermsMessage]})
return true
}catch{
return false
}
}
/**
*
* @param {discord.TextChannel} channel
* @returns {Boolean}
*/
exports.sendChannelNoTicket = (channel) => {
try {
channel.send({embeds:[bot.errorLog.notInATicket]})
return true
}catch{
return false
}
}
/**
*
* @param {discord.TextChannel} channel
* @returns {Boolean}
*/
exports.sendChannelNoDelete = (channel) => {
try {
channel.send({embeds:[bot.errorLog.noPermsDelete]})
return true
}catch{
return false
}
}
+19
View File
@@ -0,0 +1,19 @@
const discord = require('discord.js')
const bot = require('../../index')
const client = bot.client
const config = bot.config
const log = bot.errorLog.log
const loadChalk = async () => {
return await (await import("chalk")).default
}
//ENABLE message for when there is too less translation
const enableNoTranslationMessage = true
module.exports = async () => {
const chalk = await loadChalk()
if (enableNoTranslationMessage){
console.log(chalk.red("[warning]"),"WARNING!!\n"+chalk.blue("We have a small problem with translation atm, so it can be that "+chalk.redBright("some translations are in English!")+"\n\nYou can help us if you want by joining our server!\n"))
}
}
+28 -5
View File
@@ -26,7 +26,7 @@ const client = new discord.Client({
}) })
exports.client = client exports.client = client
client.setMaxListeners(30) client.setMaxListeners(50)
if (process.argv[2]){ if (process.argv[2]){
if (process.argv[2].endsWith("d")){ if (process.argv[2].endsWith("d")){
@@ -48,9 +48,22 @@ if (isDev){
} }
}else{var config = require('./config.json')} }else{var config = require('./config.json')}
exports.config = config exports.config = config
exports.storage = require('./core/dynamicdatabase/storage')
exports.errorLog = require("./core/errorLogSystem") exports.errorLog = require("./core/errorLogSystem")
const log = this.errorLog.log const log = this.errorLog.log
exports.hiddenData = require("./core/utils/hiddendata")
exports.embeds = {
commands:require("./core/interactionHandlers/embeds/commands")
}
exports.buttons = {
close:require("./core/interactionHandlers/buttons/close"),
firstmsg:require("./core/interactionHandlers/buttons/firstmsg"),
verifybars:require("./core/interactionHandlers/buttons/verifyBars")
}
client.on('ready',async () => { client.on('ready',async () => {
var statusSet = false var statusSet = false
const setStatus = (type,text) => { const setStatus = (type,text) => {
@@ -71,6 +84,7 @@ client.on('ready',async () => {
if (!process.argv[2]){ if (!process.argv[2]){
console.log(chalk.red("WELCOME TO OPEN TICKET!")) console.log(chalk.red("WELCOME TO OPEN TICKET!"))
log("info","open ticket ready",[{key:"version",value:require("./package.json").version},{key:"language",value:config.languagefile}]) log("info","open ticket ready",[{key:"version",value:require("./package.json").version},{key:"language",value:config.languagefile}])
require("./core/utils/warningManager")()
console.log(chalk.blue("\n\nlogs:")+"\n============") console.log(chalk.blue("\n\nlogs:")+"\n============")
if (config.status.enabled){ if (config.status.enabled){
@@ -92,6 +106,7 @@ client.on('ready',async () => {
if (!process.argv[2].startsWith("slash")){ if (!process.argv[2].startsWith("slash")){
console.log(chalk.red("WELCOME TO OPEN TICKET!")) console.log(chalk.red("WELCOME TO OPEN TICKET!"))
log("info","open ticket ready",[{key:"version",value:require("./package.json").version},{key:"language",value:config.languagefile}]) log("info","open ticket ready",[{key:"version",value:require("./package.json").version},{key:"language",value:config.languagefile}])
require("./core/utils/warningManager")()
console.log(chalk.blue("\n\nlogs:")+"\n============") console.log(chalk.blue("\n\nlogs:")+"\n============")
if (config.status.enabled){ if (config.status.enabled){
@@ -117,6 +132,9 @@ client.on('ready',async () => {
process.exit(1) process.exit(1)
} }
} }
//load plugins
require("./core/api/pluginlauncher")()
}) })
if (!isDev){ if (!isDev){
@@ -126,8 +144,6 @@ if (!isDev){
if (process.argv[2] && process.argv[2].startsWith("slash")){ if (process.argv[2] && process.argv[2].startsWith("slash")){
//do nothing //do nothing
}else{ }else{
var storage = require('./core/dynamicdatabase/storage')
exports.storage = storage
//commands //commands
require('./commands/ticket')() require('./commands/ticket')()
@@ -142,12 +158,17 @@ if (process.argv[2] && process.argv[2].startsWith("slash")){
//core //core
require('./core/ticketOpener')() require('./core/ticketOpener')()
require("./core/ticketCloser").runThis() require("./core/ticketCloser").runThis()
require("./core/closebuttons")() //require("./core/closebuttons")() // => everything is now in ./core/interactionHandlers/
require("./core/reactionRoles")() require("./core/reactionRoles")()
require("./core/ticketReopener")() require("./core/ticketReopener").runThis()
//InteractionHandlers
require("./core/interactionHandlers/handlers/handlers")()
} }
const APIEvents = require("./core/api/modules/events")
const debugLog = (debugString) => { const debugLog = (debugString) => {
const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n<OPEN TICKET DEBUG FILE:>\n==========================" const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n<OPEN TICKET DEBUG FILE:>\n=========================="
fs.writeFileSync("./openticketdebug.txt",content+"\nDEBUG: "+debugString) fs.writeFileSync("./openticketdebug.txt",content+"\nDEBUG: "+debugString)
@@ -169,6 +190,8 @@ process.on("uncaughtException",async (error,origin) => {
const chalk = await (await import("chalk")).default const chalk = await (await import("chalk")).default
console.log(chalk.red("\nOPEN TICKET ERROR: ")+error+"\n"+chalk.green("\nCreate a ticket in our support server for more information!\nIf you do this, you might help us to avoid a future bug!\n")) console.log(chalk.red("\nOPEN TICKET ERROR: ")+error+"\n"+chalk.green("\nCreate a ticket in our support server for more information!\nIf you do this, you might help us to avoid a future bug!\n"))
errorLog(error.name+": "+error.message+" | origin: "+origin,error.stack) errorLog(error.name+": "+error.message+" | origin: "+origin,error.stack)
APIEvents.onError(error.name+": "+error.message,new Date())
}) })
client.login(config.auth_token) client.login(config.auth_token)
+15 -20
View File
@@ -3,7 +3,8 @@
"missingArgsTitle":"حجج باطلة", "missingArgsTitle":"حجج باطلة",
"missingArgsDescription":"حجة مفقودة", "missingArgsDescription":"حجة مفقودة",
"noPermsTitle":"ليس لديك إذن", "noPermsTitle":"ليس لديك إذن",
"noPermsDescription":"ليس لديك إذن لاستخدام هذا\nأنت بحاجة إلى إذن 'ADMINISTRATOR' أو أن تكون في قائمة الأدوار المسموح بها!", "noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!",
"noPermsDelete":"Only admins can delete a ticket!",
"chooseFromListTitle":"بطاقة التعريف غير صالحة", "chooseFromListTitle":"بطاقة التعريف غير صالحة",
"chooseFromListDescription":"اختر أحد المعرفات أدناه:", "chooseFromListDescription":"اختر أحد المعرفات أدناه:",
"boterror":"مشكلة في الروبوت", "boterror":"مشكلة في الروبوت",
@@ -18,26 +19,18 @@
"somethingWentWrongTranscript":"**حدث خطأ ما أثناء كتابة النص!**\nالرجاء المحاولة مرة أخرى!" "somethingWentWrongTranscript":"**حدث خطأ ما أثناء كتابة النص!**\nالرجاء المحاولة مرة أخرى!"
}, },
"commands":{ "commands":{
"userAddedTitle":"تمت إضافة المستخدم!", "userAddedTitle":"Added {0} to this ticket!",
"userAddedDescription":"{0} يضاف إلى هذه التذكرة!", "userRemovedTitle":"Removed {0} from this ticket!",
"userRemovedTitle":"تمت إزالة المستخدم!", "renameTitle":"Changed the name to {0}!",
"userRemovedDescription":"{0} تمت إزالته من هذه التذكرة!", "closeTitle":"Closed this ticket!",
"deleteTitle":"Deleting this ticket...",
"reopenTitle":"Re-Opened this ticket!",
"renameTitle":"تم تغيير الاسم!", "ticketWarning":"The embed is in the message below!",
"renameWarning":"تحذير: يمكنك فقط تغيير اسم القناة مرتين في الدقيقة!\n(هذا يرجع إلى حدود معدل الخلاف)", "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_"
"closeTitle":"أغلق هذه التذكرة!",
"closeDescription":"يمكنك إغلاق هذه التذكرة بالضغط على الزر أدناه!",
"deleteTitle":"احذف هذه التذكرة!",
"deleteDescription":"يمكنك حذف هذه التذكرة بالضغط على الزر أدناه!",
"reopenTitle":"أعد فتح هذه التذكرة!",
"reopenDescription":"يمكنك إعادة فتح هذه التذكرة بالضغط على الزر أدناه!",
"ticketWarning":"التضمين في الرسالة أدناه!",
"maxTicketWarning":"**تحذير:** _يمكنك فقط إنشاء ملفات {0} تذكرة في كل مرة!_"
}, },
"helpMenu":{ "helpMenu":{
"title":"قائمة التعليمات:", "title":"Available Commands:",
"header1":"**اذهب إلى {0} لإنشاء تذكرة!**\n\n", "header1":"**اذهب إلى {0} لإنشاء تذكرة!**\n\n",
"header2":"**قم بتشغيل الأمر `/new` أو `/ticket` لإنشاء تذكرة!**\n\n", "header2":"**قم بتشغيل الأمر `/new` أو `/ticket` لإنشاء تذكرة!**\n\n",
@@ -71,10 +64,12 @@
"reopenTicketDmTitle":"أعيد فتح التذكرة!", "reopenTicketDmTitle":"أعيد فتح التذكرة!",
"reopenTicketDmDescription":"تم إعادة فتح تذكرتك!", "reopenTicketDmDescription":"تم إعادة فتح تذكرتك!",
"newTranscriptTitle":"نسخة جديدة هنا!", "newTranscriptTitle":"نسخة جديدة هنا!",
"newTranscriptDescription":"يمكنك العثور على النص في الملف النصي أعلاه!",
"hereIsTheTranscript":"هذا هو النص:", "hereIsTheTranscript":"هذا هو النص:",
"chooseCategory":"اختر فئة:", "chooseCategory":"اختر فئة:",
"gettingdeleted":"...يتم حذف التذكرة" "gettingdeleted":"...يتم حذف التذكرة",
"none":"none",
"reason":"reason"
} }
} }
+14 -19
View File
@@ -3,7 +3,8 @@
"missingArgsTitle":"Invalid Arguments!", "missingArgsTitle":"Invalid Arguments!",
"missingArgsDescription":"Missing Argument", "missingArgsDescription":"Missing Argument",
"noPermsTitle":"No Permissions!", "noPermsTitle":"No Permissions!",
"noPermsDescription":"You don't have the correct roles to run this command!\nYou need the `ADMINISTRATOR` permission or be in the list of allowed roles!", "noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!",
"noPermsDelete":"Only admins can delete a ticket!",
"chooseFromListTitle":"Invalid ID", "chooseFromListTitle":"Invalid ID",
"chooseFromListDescription":"Choose one of the id's below:", "chooseFromListDescription":"Choose one of the id's below:",
"boterror":"Bot Error!", "boterror":"Bot Error!",
@@ -18,26 +19,18 @@
"somethingWentWrongTranscript":"Something went wrong while making the transcript!**\nPlease try again another time!" "somethingWentWrongTranscript":"Something went wrong while making the transcript!**\nPlease try again another time!"
}, },
"commands":{ "commands":{
"userAddedTitle":"User Added!", "userAddedTitle":"Added {0} to this ticket!",
"userAddedDescription":"{0} is added to this ticket!", "userRemovedTitle":"Removed {0} from this ticket!",
"userRemovedTitle":"User Removed!", "renameTitle":"Changed the name to {0}!",
"userRemovedDescription":"{0} is removed from this ticket!", "closeTitle":"Closed this ticket!",
"deleteTitle":"Deleting this ticket...",
"renameTitle":"The name is changed!", "reopenTitle":"Re-Opened this ticket!",
"renameWarning":"Warning: you can only change the channel name 2 times per minute!\n(this is due discord rate limits)",
"closeTitle":"Close this ticket!",
"closeDescription":"You can close this ticket by clicking on the button below!",
"deleteTitle":"Delete this ticket!",
"deleteDescription":"You can delete this ticket by clicking on the button below!",
"reopenTitle":"Re-Open this ticket!",
"reopenDescription":"You can re-open this ticket by clicking on the button below!",
"ticketWarning":"The embed is in the message below!", "ticketWarning":"The embed is in the message below!",
"maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_" "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_"
}, },
"helpMenu":{ "helpMenu":{
"title":"Help Menu:", "title":"Available Commands:",
"header1":"**Go to {0} to create a ticket!**\n\n", "header1":"**Go to {0} to create a ticket!**\n\n",
"header2":"**Run the command `/new` or `/ticket` to create a ticket!**\n\n", "header2":"**Run the command `/new` or `/ticket` to create a ticket!**\n\n",
@@ -53,7 +46,7 @@
"close":"Close Ticket", "close":"Close Ticket",
"delete":"Delete Ticket", "delete":"Delete Ticket",
"reopen":"Re-Open Ticket", "reopen":"Re-Open Ticket",
"sendTranscript":"Send Transcript File" "sendTranscript":"Transcript"
}, },
"messages":{ "messages":{
"reopenTitle":"Re-Opened this ticket!", "reopenTitle":"Re-Opened this ticket!",
@@ -71,10 +64,12 @@
"reopenTicketDmTitle":"Ticket Re-opened!", "reopenTicketDmTitle":"Ticket Re-opened!",
"reopenTicketDmDescription":"Your ticket is re-opened!", "reopenTicketDmDescription":"Your ticket is re-opened!",
"newTranscriptTitle":"A new transcript is here!", "newTranscriptTitle":"A new transcript is here!",
"newTranscriptDescription":"You can find the transcript in the text file above!",
"hereIsTheTranscript":"Here is the transcript:", "hereIsTheTranscript":"Here is the transcript:",
"chooseCategory":"choose a category:", "chooseCategory":"choose a category:",
"gettingdeleted":"Ticket is getting deleted..." "gettingdeleted":"Ticket is getting deleted...",
"none":"none",
"reason":"reason"
} }
} }
+75
View File
@@ -0,0 +1,75 @@
{
"errors":{
"missingArgsTitle":"Neplatné argumenty",
"missingArgsDescription":"Chybí argumenty",
"noPermsTitle":"Nemáš práva!",
"noPermsDescription":"Nemáš dostatečné práva na tento příkaz!\n Potřebuješ ADMINISTRATOR aby jsi mohl provést příkaz!",
"noPermsDelete":"Pouze admin může smazat ticket!",
"chooseFromListTitle":"Neplatné ID",
"chooseFromListDescription":"Vyber si z těchto ID:",
"boterror":"Error!",
"notInTicketTitle":"Nejsi v ticketu!",
"notInTicketDescription":"Tento příkaz nefunguje mimo tickety!",
"ticketDoesntExist":"Tento ticket už bohužel neexistuje!",
"roleDoesntExist":"Tato role bohužel neexistuje!",
"anotherOption":"Tato možnost není ticket ale něco jiného!",
"maxAmountTitle":"Maximální počet ticketů dosažen!",
"maxAmountDescription":"Dosáhl jsi maximálního povoleného počtu ticketů!\n Nemůžeš si vytvořit nový!",
"somethingWentWrong":"**Něco je špatně**\nProsím zkus to příště znovu!",
"somethingWentWrongTranscript":"Něco je špatně s transcriptem!**\nProsím zkus to příště znovu!"
},
"commands":{
"userAddedTitle":"{0} byl přidán do ticketu!",
"userRemovedTitle":"{0} byl odebrám z ticketu!",
"renameTitle":"Jméno bylo změněno!",
"closeTitle":"Zavři tento ticket!",
"deleteTitle":"Smaž tento ticket!",
"reopenTitle":"Znovu otevři ticket!",
"ticketWarning":"The embed is in the message below!",
"maxTicketWarning":"**Varovaní:** _Můžeš si vytvořit použe {0} ticket(s) v jednu chvíli!_"
},
"helpMenu":{
"title":"Příkazy:",
"header1":"**Běž {0} vytvořit si ticket!**\n\n",
"header2":"**Použij příkaz `/new` nebo `/ticket` k vytvoření ticketu!**\n\n",
"msgCmd":"Vytvoř možnost otevírat tickety přes tlačítko. (ADMIN)",
"renameCmd":"Přejmenovat ticket. (Žádné mezery)",
"closeCmd":"Zavři ticket.",
"deleteCmd":"Smaž ticket.",
"addCmd":"Přidej člena do ticketu.",
"removeCmd":"Odebere člena z ticketu.",
"reopenCmd":"Znovu otevři ticket po uzavření."
},
"buttons":{
"close":"Zavři ticket",
"delete":"Smaž ticket",
"reopen":"Znovu otevři ticket",
"sendTranscript":"Odešli log ticketu"
},
"messages":{
"reopenTitle":"Ticket znovu otevřen!",
"reopenDescription":"Cítím se skvěle že si můžeme zase povídat!",
"closedTitle":"Zavřený ticket!",
"closedDescription":"Pouze admin team zde může nyní komunikovat!\n\n*Klikni na tlačítko níže pro smazání nebo znovu otevření ticketu!*",
"createdTitle":"Ticket vytvořen!",
"createdDescription":"Váš tiket je vytvořen, můžete ho zjistit pomocí pingu!",
"newTicketDmTitle":"Nový ticket!",
"closedTicketDmTitle":"Ticket uzavřen!",
"deletedTicketDmTitle":"Ticket smazán!",
"closedTicketDmDescription":"Tvůj ticket byl uzavřen!",
"deletedTicketDmDescription":"Tvůj ticket byl smazán!",
"reopenTicketDmTitle":"Ticket znovu otevřen!",
"reopenTicketDmDescription":"Tvůj ticket byl znovu otevřen!",
"newTranscriptTitle":"Nový log ticketu je zde!",
"hereIsTheTranscript":"Zde je log:",
"chooseCategory":"Vyber kategorii:",
"gettingdeleted":"Ticket bude smazán",
"none":"nic",
"reason":"důvod"
}
}
+34 -39
View File
@@ -1,67 +1,60 @@
{ {
"errors":{ "errors":{
"missingArgsTitle":"Ongeldige Argumenten!", "missingArgsTitle":"Onjuiste parameters!",
"missingArgsDescription":"Geen Argument", "missingArgsDescription":"Er missen parameters",
"noPermsTitle":"Geen permissies!", "noPermsTitle":"Geen permissies!",
"noPermsDescription":"Je hebt niet de juiste rollen om deze command uit te voeren!\nJe hebt de `ADMINISTRATOR` permissie nodig of je moet in de lijst van toegestane rollen zitten!", "noPermsDescription":"Je hebt de `ADMINISTRATOR` permissie nodig of je moet in de lijst van toegestane users staan!",
"chooseFromListTitle":"Ongeldig ID", "noPermsDelete":"Alleen admins kunnen een ticket verwijderen!",
"chooseFromListDescription":"Kies een van deze id's:", "chooseFromListTitle":"Onjuist ID",
"chooseFromListDescription":"Kies een van de id's hier onder:",
"boterror":"Bot Error!", "boterror":"Bot Error!",
"notInTicketTitle":"Je bent niet in een ticket!", "notInTicketTitle":"Je bent niet in een ticket!",
"notInTicketDescription":"Deze command werkt niet buiten tickets!", "notInTicketDescription":"Deze command werkt niet buiten tickets!",
"ticketDoesntExist":"Dit ticket bestaat niet meer!", "ticketDoesntExist":"Dit ticket bestaat niet meer!",
"roleDoesntExist":"Deze rol bestaat niet meer!", "roleDoesntExist":"Deze rol bestaat niet meer!",
"anotherOption":"Deze optie is geen ticket maar een ander type!", "anotherOption":"Deze optie is niet een ticket, maar een ander type!",
"maxAmountTitle":"Max aantal bereikt!", "maxAmountTitle":"Maximum numer bereikt!",
"maxAmountDescription":"Je hebt het maximum aantal openstaande ticket bereikt!\nDus je kan er geen nieuwe maken!", "maxAmountDescription":"Je hebt het maximum aantal openstaande tickets bereikt!\nDus je kan geen nieuwe meer maken!",
"somethingWentWrong":"**Iets ging fout!**\nProbeer een andere keer opnieuw!", "somethingWentWrong":"**Iets ging fout!**\nProbeer een andere keer opnieuw!",
"somethingWentWrongTranscript":"Iets ging fout bij het maken van het transcript!**\nProbeer een andere keer opnieuw!" "somethingWentWrongTranscript":"Iets ging fout terwijl het transcript gemaakt werd!**\nProbeer een andere keer opnieuw!"
}, },
"commands":{ "commands":{
"userAddedTitle":"User Toegevoegd!", "userAddedTitle":"{0} is toegevoegd aan dit ticket!",
"userAddedDescription":"{0} is toegevoegd aan dit ticket!", "userRemovedTitle":"{0} is verwijderd van dit ticket!",
"userRemovedTitle":"User Verwijderd!", "renameTitle":"De naam is veranderd naar {0}!",
"userRemovedDescription":"{0} is verwijderd van dit ticket!", "closeTitle":"Ticket gesloten!",
"deleteTitle":"Ticket aan het verwijderen...",
"renameTitle":"De naam is veranderd!", "reopenTitle":"Ticket heropend!",
"renameWarning":"Waarschuwing: je kan de kanaalnaam maar 2 keer per minuut veranderen!\n(dit heeft te maken met discord rate limits)",
"closeTitle":"Sluit dit ticket!",
"closeDescription":"Je kan dit ticket sluiten door op de knop hier onder te duwen!",
"deleteTitle":"Verwijder dit ticket!",
"deleteDescription":"Je kan dit ticket verwijderen door op de knop hier onder te duwen!",
"reopenTitle":"Heropen dit ticket!",
"reopenDescription":"Je kan dit ticket heropenen door op de knop hier onder te duwen!",
"ticketWarning":"De embed is in het bericht hier onder!", "ticketWarning":"De embed is in het bericht hier onder!",
"maxTicketWarning":"**Waarschuwing:** _Je kan maar {0} ticket(s) tegelijkertijd aanmaken!_" "maxTicketWarning":"**Waarschuwing:** _Je kan maar {0} ticket(s) tegelijkertijd maken!_"
}, },
"helpMenu":{ "helpMenu":{
"title":"Help Menu:", "title":"Beschikbare Commands:",
"header1":"**Ga naar {0} om een ticket te maken!**\n\n", "header1":"**Ga naar {0} om een ticket te maken!**\n\n",
"header2":"**Run de command `/new` of `/ticket` om een ticket te maken!**\n\n", "header2":"**Run de command `/new` of `/ticket` om een ticket te maken!**\n\n",
"msgCmd":"Spawn een embed met knoppen. (admins only)", "msgCmd":"Spawn een embed met knoppen. (alleen admins)",
"renameCmd":"Hernoem een ticket. (geen spaties)", "renameCmd":"Hernoem een ticket. (geen spaties)",
"closeCmd":"Sluit een ticket.", "closeCmd":"Sluit een ticket.",
"deleteCmd":"Verwijder een ticket.", "deleteCmd":"Verijder een ticket.",
"addCmd":"Voeg een user toe aan een ticket.", "addCmd":"Voeg een user aan een ticket.",
"removeCmd":"Verwijder een user van een ticket.", "removeCmd":"Verwijder een user van een ticket.",
"reopenCmd":"Heropen een ticket nadat het gesloten wordt." "reopenCmd":"Heropen een ticket nadat het gesloten is."
}, },
"buttons":{ "buttons":{
"close":"Sluit Ticket", "close":"Sluit Ticket",
"delete":"Verwijder Ticket", "delete":"Verwijder Ticket",
"reopen":"Heropen Ticket", "reopen":"Heropen Ticket",
"sendTranscript":"Stuur Transcript Bestand" "sendTranscript":"Transcript"
}, },
"messages":{ "messages":{
"reopenTitle":"Dit ticket is terug geopend!", "reopenTitle":"Ticket heropend!",
"reopenDescription":"Voel vrij om terug te praten!", "reopenDescription":"Voel vrij om weer te praten!",
"closedTitle":"Dit ticket is gesloten!", "closedTitle":"Ticket gesloten!",
"closedDescription":"Nu kunnen alleen nog admins praten in dit ticket!\n\n*Klik op de knop hier onder om het ticket terug te openen of te verwijderen!*", "closedDescription":"Alleen admins kunnen nog praten.\n\n*Klik op de knoppen hieronder voor meer acties!*",
"createdTitle":"Ticket Gemaakt!", "createdTitle":"Ticket Aangemaakt!",
"createdDescription":"Je ticket is gemaakt, je kan het detecteren bij een ping!", "createdDescription":"U ticket is gemaakt, je kan het detecteren bij een ping!",
"newTicketDmTitle":"Nieuw Ticket!", "newTicketDmTitle":"Nieuw Ticket!",
"closedTicketDmTitle":"Ticket Gesloten!", "closedTicketDmTitle":"Ticket Gesloten!",
@@ -70,11 +63,13 @@
"deletedTicketDmDescription":"Je ticket is verwijderd!", "deletedTicketDmDescription":"Je ticket is verwijderd!",
"reopenTicketDmTitle":"Ticket Heropend!", "reopenTicketDmTitle":"Ticket Heropend!",
"reopenTicketDmDescription":"Je ticket is heropend!", "reopenTicketDmDescription":"Je ticket is heropend!",
"newTranscriptTitle":"Een nieuw transcript is hier!", "newTranscriptTitle":"Er is een nieuw transcript!",
"newTranscriptDescription":"Je kan het transcript vinden in het bestand hierboven!",
"hereIsTheTranscript":"Hier is het transcript:", "hereIsTheTranscript":"Hier is het transcript:",
"chooseCategory":"kies een categorie:", "chooseCategory":"kies een categorie:",
"gettingdeleted":"Ticket wordt verwijderd..." "gettingdeleted":"Ticket wordt verwijderd...",
"none":"geen",
"reason":"reden"
} }
} }
+14 -19
View File
@@ -3,7 +3,8 @@
"missingArgsTitle":"Invalid Arguments!", "missingArgsTitle":"Invalid Arguments!",
"missingArgsDescription":"Missing Argument", "missingArgsDescription":"Missing Argument",
"noPermsTitle":"No Permissions!", "noPermsTitle":"No Permissions!",
"noPermsDescription":"You don't have the correct roles to run this command!\nYou need the `ADMINISTRATOR` permission or be in the list of allowed roles!", "noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!",
"noPermsDelete":"Only admins can delete a ticket!",
"chooseFromListTitle":"Invalid ID", "chooseFromListTitle":"Invalid ID",
"chooseFromListDescription":"Choose one of the id's below:", "chooseFromListDescription":"Choose one of the id's below:",
"boterror":"Bot Error!", "boterror":"Bot Error!",
@@ -18,26 +19,18 @@
"somethingWentWrongTranscript":"Something went wrong while making the transcript!**\nPlease try again another time!" "somethingWentWrongTranscript":"Something went wrong while making the transcript!**\nPlease try again another time!"
}, },
"commands":{ "commands":{
"userAddedTitle":"User Added!", "userAddedTitle":"Added {0} to this ticket!",
"userAddedDescription":"{0} is added to this ticket!", "userRemovedTitle":"Removed {0} from this ticket!",
"userRemovedTitle":"User Removed!", "renameTitle":"Changed the name to {0}!",
"userRemovedDescription":"{0} is removed from this ticket!", "closeTitle":"Closed this ticket!",
"deleteTitle":"Deleting this ticket...",
"renameTitle":"The name is changed!", "reopenTitle":"Re-Opened this ticket!",
"renameWarning":"Warning: you can only change the channel name 2 times per minute!\n(this is due discord rate limits)",
"closeTitle":"Close this ticket!",
"closeDescription":"You can close this ticket by clicking on the button below!",
"deleteTitle":"Delete this ticket!",
"deleteDescription":"You can delete this ticket by clicking on the button below!",
"reopenTitle":"Re-Open this ticket!",
"reopenDescription":"You can re-open this ticket by clicking on the button below!",
"ticketWarning":"The embed is in the message below!", "ticketWarning":"The embed is in the message below!",
"maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_" "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_"
}, },
"helpMenu":{ "helpMenu":{
"title":"Help Menu:", "title":"Available Commands:",
"header1":"**Go to {0} to create a ticket!**\n\n", "header1":"**Go to {0} to create a ticket!**\n\n",
"header2":"**Run the command `/new` or `/ticket` to create a ticket!**\n\n", "header2":"**Run the command `/new` or `/ticket` to create a ticket!**\n\n",
@@ -53,7 +46,7 @@
"close":"Close Ticket", "close":"Close Ticket",
"delete":"Delete Ticket", "delete":"Delete Ticket",
"reopen":"Re-Open Ticket", "reopen":"Re-Open Ticket",
"sendTranscript":"Send Transcript File" "sendTranscript":"Transcript"
}, },
"messages":{ "messages":{
"reopenTitle":"Re-Opened this ticket!", "reopenTitle":"Re-Opened this ticket!",
@@ -71,10 +64,12 @@
"reopenTicketDmTitle":"Ticket Re-opened!", "reopenTicketDmTitle":"Ticket Re-opened!",
"reopenTicketDmDescription":"Your ticket is re-opened!", "reopenTicketDmDescription":"Your ticket is re-opened!",
"newTranscriptTitle":"A new transcript is here!", "newTranscriptTitle":"A new transcript is here!",
"newTranscriptDescription":"You can find the transcript in the text file above!",
"hereIsTheTranscript":"Here is the transcript:", "hereIsTheTranscript":"Here is the transcript:",
"chooseCategory":"choose a category:", "chooseCategory":"choose a category:",
"gettingdeleted":"Ticket is getting deleted..." "gettingdeleted":"Ticket is getting deleted...",
"none":"none",
"reason":"reason"
} }
} }
+38 -37
View File
@@ -1,74 +1,75 @@
{ {
"errors":{ "errors":{
"missingArgsTitle":"Arguments invalides !", "missingArgsTitle":"Arguments invalides!",
"missingArgsDescription":"Argument manquant", "missingArgsDescription":"Argument manquant",
"noPermsTitle":"Pas de permissions!", "noPermsTitle":"Pas de permissions!",
"noPermsDescription":"Vous n'avez pas les bons rôles pour exécuter cette commande !\nVous avez besoin de la permission `ADMINISTRATOR` ou d'être dans la liste des rôles autorisés !", "noPermsDescription":"Vous avez besoin de la permission `ADMINISTRATOR` ou être dans la liste des rôles autorisés!",
"noPermsDelete":"Seuls les administrateurs peuvent supprimer un ticket!",
"chooseFromListTitle":"Invalid ID", "chooseFromListTitle":"Invalid ID",
"chooseFromListDescription":"Choisissez l'un des identifiants ci-dessous:", "chooseFromListDescription":"Choisissez l'un des identifiants ci-dessous:",
"boterror":"Bot Error!", "boterror":"Bot Error!",
"notInTicketTitle":"Vous n'êtes pas dans un ticket !", "notInTicketTitle":"Vous n'êtes pas dans un ticket!",
"notInTicketDescription":"Cette commande ne fonctionne pas en dehors des tickets !", "notInTicketDescription":"Cette commande ne fonctionne pas en dehors des tickets!",
"ticketDoesntExist":"Ce billet n'existe plus !", "ticketDoesntExist":"Ce ticket n'existe plus!",
"roleDoesntExist":"Ce rôle n'existe plus !", "roleDoesntExist":"Ce rôle n'existe plus!",
"anotherOption":"Cette option n'est pas un ticket mais un autre type !", "anotherOption":"Cette option n'est pas un ticket mais un autre type!",
"maxAmountTitle":"Montant max atteint !", "maxAmountTitle":"Montant maximum atteint!",
"maxAmountDescription":"Vous avez atteint le nombre maximum de tickets autorisés !\nVous ne pouvez donc pas en créer un nouveau !", "maxAmountDescription":"Vous avez atteint le nombre maximum de tickets autorisés!\nVous ne pouvez donc pas en créer un nouveau!",
"somethingWentWrong":"**Une erreur s'est produite !**\nVeuillez réessayer une autre fois !", "somethingWentWrong":"**Quelque chose s'est mal passé!**\nVeuillez réessayer une autre fois!",
"somethingWentWrongTranscript":"Une erreur s'est produite lors de la création de la transcription !**\nVeuillez réessayer une autre fois !" "somethingWentWrongTranscript":"Une erreur s'est produite lors de la création de la transcription!**\nVeuillez réessayer une autre fois!"
}, },
"commands":{ "commands":{
"userAddedTitle":"Utilisateur ajouté !", "userAddedTitle":"{0} a été ajouté à ce ticket!",
"userAddedDescription":"{0} est ajouté à ce billet !", "userRemovedTitle":"Supprimé {0} de ce ticket!",
"userRemovedTitle":"Utilisateur supprimé!", "renameTitle":"Changement du nom en {0}!",
"userRemovedDescription":"{0} est supprimé de ce ticket!", "closeTitle":"Fermé ce ticket!",
"deleteTitle":"Suppression de ce ticket...",
"reopenTitle":"A rouvert ce ticket!",
"renameTitle":"Le nom est changé !", "ticketWarning":"L'intégration est dans le message ci-dessous!",
"renameWarning":"Attention : vous ne pouvez modifier le nom de la chaîne que 2 fois par minute !\n(ceci est dû aux limites du taux de discorde)", "maxTicketWarning":"**Attention :** _Vous ne pouvez créer que {0} ticket(s) à la fois !_"
"closeTitle":"Fermez ce ticket !",
"closeDescription":"Vous pouvez fermer ce ticket en cliquant sur le bouton ci-dessous !",
"deleteTitle":"Supprimez ce billet !",
"deleteDescription":"Vous pouvez supprimer ce ticket en cliquant sur le bouton ci-dessous !",
"reopenTitle":"Ré-ouvrez ce ticket !",
"reopenDescription":"Vous pouvez rouvrir ce ticket en cliquant sur le bouton ci-dessous !",
"ticketWarning":"L'intégration est dans le message ci-dessous !",
"maxTicketWarning":"**Attention :** _Vous ne pouvez créer que {0} billet(s) à la fois !_"
}, },
"helpMenu":{ "helpMenu":{
"title":"Menu d'aide:", "title":"Commandes disponibles :",
"header1":"**Allez à {0} pour créer un ticket !**\n\n", "header1":"**Allez à {0} pour créer un ticket !**\n\n",
"header2":"**Exécutez la commande `/new` ou `/ticket` pour créer un ticket!**\n\n", "header2":"**Exécutez la commande `/new` ou `/ticket` pour créer un ticket !**\n\n",
"msgCmd":"Créez une intégration avec des boutons. (administrateurs uniquement)", "msgCmd":"Faire apparaître une intégration avec des boutons. (administrateurs uniquement)",
"renameCmd":"Renommer un ticket. (sans espaces)", "renameCmd":"Renommer un ticket. (sans espaces)",
"closeCmd":"Fermer un ticket.", "closeCmd":"Fermer un ticket.",
"deleteCmd":"Supprimer un billet.", "deleteCmd":"Supprimer un billet.",
"addCmd":"Ajouter un utilisateur au ticket.", "addCmd":"Ajouter un utilisateur au ticket.",
"removeCmd":"Supprimer un utilisateur du ticket.", "removeCmd":"Supprimer un utilisateur du ticket.",
"reopenCmd":"Re-Open a ticket after it was closed." "reopenCmd":"Rouvrir un ticket après sa clôture."
}, },
"buttons":{ "buttons":{
"close":"Fermer le ticket", "close":"Fermer le ticket",
"delete":"Supprimer le billet", "delete":"Supprimer le billet",
"reopen":"Billet de réouverture", "reopen":"Billet de réouverture",
"sendTranscript":"Envoyer le fichier de transcription" "sendTranscript":"Transcript"
}, },
"messages":{ "messages":{
"reopenTitle":"A rouvert ce ticket!", "reopenTitle":"A rouvert ce ticket!",
"reopenDescription":"N'hésitez pas à reparler!", "reopenDescription":"N'hésitez pas à reparler!",
"closedTitle":"Fermé ce ticket", "closedTitle":"Fermé ce ticket!",
"closedDescription":"Seuls les administrateurs peuvent parler dans ce ticket maintenant !\n\n*Cliquez sur le bouton ci-dessous pour supprimer ou rouvrir ce ticket !*", "closedDescription":"Seuls les administrateurs peuvent parler dans ce ticket maintenant !\n\n*Cliquez sur le bouton ci-dessous pour supprimer ou rouvrir ce ticket !*",
"createdTitle":"Ticket créé !", "createdTitle":"Ticket créé !",
"createdDescription":"Votre ticket est créé, vous pouvez le détecter par un ping !", "createdDescription":"Votre ticket est créé, vous pouvez le détecter par un ping !",
"newTicketDmTitle":"Nouveau ticket!", "newTicketDmTitle":"Nouveau billet!",
"closedTicketDmTitle":"Billet fermé!",
"deletedTicketDmTitle":"Billet supprimé !",
"closedTicketDmDescription":"Votre billet est fermé !",
"deletedTicketDmDescription":"Votre billet est supprimé !",
"reopenTicketDmTitle":"Billet rouvert!",
"reopenTicketDmDescription":"Votre billet est rouvert !",
"newTranscriptTitle":"Une nouvelle transcription est ici!", "newTranscriptTitle":"Une nouvelle transcription est ici!",
"newTranscriptDescription":"Vous pouvez trouver la transcription dans le fichier texte ci-dessus !", "hereIsTheTranscript":"Voici la transcription :",
"hereIsTheTranscript":"Voici la transcription :",
"chooseCategory":"choisissez une catégorie:", "chooseCategory":"choisissez une catégorie:",
"gettingdeleted":"Le ticket est en cours de suppression..." "gettingdeleted":"Le ticket est en cours de suppression...",
"none":"rien",
"reason":"raison"
} }
} }
+15 -20
View File
@@ -3,7 +3,8 @@
"missingArgsTitle":"Ungültiges Argument!", "missingArgsTitle":"Ungültiges Argument!",
"missingArgsDescription":"Fehlendes Argument!", "missingArgsDescription":"Fehlendes Argument!",
"noPermsTitle":"Du hast keine Rechte!", "noPermsTitle":"Du hast keine Rechte!",
"noPermsDescription":"Sie haben nicht die richtigen Rollen, um diesen Befehl auszuführen!\nSie benötigen die `ADMINISTRATOR` Erlaubnis oder in der Liste der erlaubten Rollen sein!", "noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!",
"noPermsDelete":"Only admins can delete a ticket!",
"chooseFromListTitle":"Ungültige ID", "chooseFromListTitle":"Ungültige ID",
"chooseFromListDescription":"Wählen Sie eine der folgenden ID:", "chooseFromListDescription":"Wählen Sie eine der folgenden ID:",
"boterror":"Bot Fehler!", "boterror":"Bot Fehler!",
@@ -18,26 +19,18 @@
"somethingWentWrongTranscript":"Bei der Erstellung der Transcript ist etwas schief gelaufen!**\nBitte versuchen Sie es ein anderes Mal!" "somethingWentWrongTranscript":"Bei der Erstellung der Transcript ist etwas schief gelaufen!**\nBitte versuchen Sie es ein anderes Mal!"
}, },
"commands":{ "commands":{
"userAddedTitle":"User geaddet!", "userAddedTitle":"Added {0} to this ticket!",
"userAddedDescription":"{0} wird zu diesem Ticket hinzugefügt!", "userRemovedTitle":"Removed {0} from this ticket!",
"userRemovedTitle":"User entfernt!", "renameTitle":"Changed the name to {0}!",
"userRemovedDescription":"{0} wird aus diesem Ticket entfernt!", "closeTitle":"Closed this ticket!",
"deleteTitle":"Deleting this ticket...",
"reopenTitle":"Re-Opened this ticket!",
"renameTitle":"Der Name wurde geändert!", "ticketWarning":"The embed is in the message below!",
"renameWarning":"Achtung: Sie können den Kanalnamen nur 2 Mal pro Minute ändern!\n(dies ist auf die Begrenzung der Diskordrate zurückzuführen)", "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_"
"closeTitle":"Dieses Ticket schließen!",
"closeDescription":"Sie können dieses Ticket schließen, indem Sie auf die Schaltfläche unten klicken!",
"deleteTitle":"Löschen Sie dieses Ticket!",
"deleteDescription":"Sie können dieses Ticket löschen, indem Sie auf die Schaltfläche unten klicken!",
"reopenTitle":"Öffne dieses Ticket erneut!",
"reopenDescription":"Sie können dieses Ticket erneut öffnen, indem Sie auf die Schaltfläche unten klicken!",
"ticketWarning":"Die Einbettung befindet sich in der Nachricht unten!",
"maxTicketWarning":"**Warnung:** _Sie können nur {0} ticket(s) erstellen zu einer Zeit!_"
}, },
"helpMenu":{ "helpMenu":{
"title":"Hilfe Menu:", "title":"Available Commands:",
"header1":"**Gehe zu {0} um ein Ticket zu erstellen!**\n\n", "header1":"**Gehe zu {0} um ein Ticket zu erstellen!**\n\n",
"header2":"**Führen Sie den Befehl `/new` oder `/ticket` um ein Ticket zu erstellen!**\n\n", "header2":"**Führen Sie den Befehl `/new` oder `/ticket` um ein Ticket zu erstellen!**\n\n",
@@ -71,10 +64,12 @@
"reopenTicketDmTitle":"Ticket neu Eröffnen!", "reopenTicketDmTitle":"Ticket neu Eröffnen!",
"reopenTicketDmDescription":"Dein Ticket ist Neu eröffnet!", "reopenTicketDmDescription":"Dein Ticket ist Neu eröffnet!",
"newTranscriptTitle":"Eine neue Transscript finden Sie hier!", "newTranscriptTitle":"Eine neue Transscript finden Sie hier!",
"newTranscriptDescription":"Die Abschrift finden Sie in der obigen Textdatei!",
"hereIsTheTranscript":"Hier ist das Transscript:", "hereIsTheTranscript":"Hier ist das Transscript:",
"chooseCategory":"Wähle eine Kategorie:", "chooseCategory":"Wähle eine Kategorie:",
"gettingdeleted":"Ticket wird gelöscht..." "gettingdeleted":"Ticket wird gelöscht...",
"none":"none",
"reason":"reason"
} }
} }
+50 -55
View File
@@ -1,80 +1,75 @@
{ {
"errors":{ "errors":{
"missingArgsTitle":"Argumente invalide!", "missingArgsTitle":"Argumente Invalide",
"missingArgsDescription":"Argument lipsa", "missingArgsDescription":"Argument Lipsa",
"noPermsTitle":"Nu ai permisiunile necesare!", "noPermsTitle":"Nu ai permisiunea necesara!",
"noPermsDescription":"Nu ai rolurile necesare!\nAi nevoie de permisiunea `ADMINISTRATOR` sau sa fii in lista rolurilor permise!", "noPermsDescription":"Ai nevoie de permisiunea de `ADMINISTRATOR`!",
"chooseFromListTitle":"ID invalid", "noPermsDelete":"Doar adminii pot inchide un ticket!",
"chooseFromListTitle":"Invalid ID",
"chooseFromListDescription":"Alege unul dintre id-urile urmatoare:", "chooseFromListDescription":"Alege unul dintre id-urile urmatoare:",
"boterror":"Eroare bot!", "boterror":"Eroare bot!",
"notInTicketTitle":"Nu esti intr-un ticket!", "notInTicketTitle":"Nu esti intr-un ticket!",
"notInTicketDescription":"Aceasta comanda nu functioneaza in afara ticket-urilor!", "notInTicketDescription":"Aceasta comanda nu merge inafara unui ticket!",
"ticketDoesntExist":"Acest ticket nu mai exista!", "ticketDoesntExist":"Acest ticket nu mai exista!",
"roleDoesntExist":"Acest rol nu mai exista", "roleDoesntExist":"Acest rol nu mai exista!",
"anotherOption":"Aceasta optiune nu este un ticket ci doar alt tip!", "anotherOption":"Aceasta optiune este altceva decat un tip de ticket!",
"maxAmountTitle":"Limita a fost atinsa", "maxAmountTitle":"Limita atinsa!",
"maxAmountDescription":"Ai atins limita maxima de tickete\nNu mai poti creea altele!", "maxAmountDescription":"Ai atins limita de tickets!\nAsa ca nu mai poti creea altele noi!",
"somethingWentWrong":"**Ceva nu a mers bine :(**\nTe rugam sa incerci din nou mai tarziu", "somethingWentWrong":"**Ceva nu a mers bine!**\nTe rugam sa incerci mai tarziu!",
"somethingWentWrongTranscript":"**Ceva nu a mers bine in timpul creerii copiei a ticket-ului!**\nTe rugam sa incerci din nou mai tarziu!" "somethingWentWrongTranscript":"Ceva nu aa mers bine in timpul creeari transcript-ului!**\nTe rugam sa incerci mai tarziu!"
}, },
"commands":{ "commands":{
"userAddedTitle":"Utilizator adaugat!", "userAddedTitle":"{0} a fost adaugat in acest ticket!",
"userAddedDescription":"{0} este adaugat la acest ticket!", "userRemovedTitle":"{0} a fost scos din acest ticket!",
"userRemovedTitle":"Utilizator eliminat!", "renameTitle":"Nume schimbat in {0}!",
"userRemovedDescription":"{0} este eliminat din acest ticket!", "closeTitle":"Ticket inchis!",
"deleteTitle":"Se sterge ticket-ul...",
"reopenTitle":"Ticket Re-deschis!",
"renameTitle":"Numele este schimbat!", "ticketWarning":"Embed-ul se afla in mesajul de mai jos!",
"renameWarning":"ATENTIE: poti schimba numele acestui ticket doar de 2 ori pe minut!\n(se datoreaza limitarii discord-ului)", "maxTicketWarning":"**Avertizare:** _Poti creea doar {0} tickete active!_"
"closeTitle":"Inchide acest ticket",
"closeDescription":"Poti inchide acest ticket doar apasand butonul de mai jos!",
"deleteTitle":"Sterge acest ticket!",
"deleteDescription":"Poti sterge acest ticket doar apasand butonul de mai jos",
"reopenTitle":"Re-deschide acest ticket!",
"reopenDescription":"Poti redeschide acest ticket doar apasand butonul de mai jos!",
"ticketWarning":"Embed-ul se afla in mesajul de mai jos:",
"maxTicketWarning":"**ATENTIE:** _Poti creea doar {0} ticket-e odata!_"
}, },
"helpMenu":{ "helpMenu":{
"title":"Meniu de ajutor:", "title":"Comenzi disponibile:",
"header1":"**Deschide {0} pentru a creea un ticket!**\n\n", "header1":"**Mergi la {0} pentru a creea un ticket!**\n\n",
"header2":"**Ruleaza comanda `/new` ori `/ticket` pentru a creea un ticket!**\n\n", "header2":"**Ruleaza comanda `/new` ori `/ticket` pentru a creea un ticket!**\n\n",
"msgCmd":"Afiseaza embed-ul cu tickete. (doar administratorii)", "msgCmd":"Trimite embed-ul cu tickete. (doar admini)",
"renameCmd":"Redenumeste un ticket. (fara spatii)", "renameCmd":"Redenumeste un ticket. (fara spatii)",
"closeCmd":"Redenumeste un ticket ticket.", "closeCmd":"Inchide un ticket.",
"deleteCmd":"Sterge un ticket a ticket.", "deleteCmd":"Sterge un ticket.",
"addCmd":"adauga un utilizator la ticket.", "addCmd":"Adauga un utilizator in ticket.",
"removeCmd":"Elimina un utilizator de la ticket.", "removeCmd":"Sterge un utilizator din ticket.",
"reopenCmd":"Re-deschide un ticket dupa ce a fost inchis." "reopenCmd":"Re-deschide un ticket dupa ce a fost deschis."
}, },
"buttons":{ "buttons":{
"close":"Inchide Ticket-ul", "close":"Inchide ticket-ul",
"delete":"Sterge Ticket-ul", "delete":"Sterge ticket-ul",
"reopen":"Re-deschide Ticket-ul", "reopen":"Re-deschide un ticket",
"sendTranscript":"Trimite copia chat-ului ticket-ului" "sendTranscript":"Transcript"
}, },
"messages":{ "messages":{
"reopenTitle":"Ticket re-deschis", "reopenTitle":"Ticket Re-deschis!",
"reopenDescription":"Simte-te comfortabil sa vorbesti din nou!", "reopenDescription":"Poti vorbi din nou!",
"closedTitle":"Inchide acest ticket ticket!", "closedTitle":"Ticket inchis!",
"closedDescription":"Doar administratorii pot vorbi in acest ticket de acum!\n\n*Apasa pe butonele de mai jos pentru a inchide/deschide ticket-ul!*", "closedDescription":"Doar adminii pot vorbi in acest ticket acum!\n\n*Apasa pe butonul de mai jos pentru a re-deschide ori sterge ticket-ul!*",
"createdTitle":"Ticket Creat!", "createdTitle":"Ticket Creat!",
"createdDescription":"Ticket-ul tau a fost creat, il poti vedea dupa mentionarea ta!", "createdDescription":"Ticket-ul tau a fost creat, poti sa il vezi in canalul pe care ai fost mentionat!",
"newTicketDmTitle":"Ticket Nou!", "newTicketDmTitle":"Ticket nou!",
"closedTicketDmTitle":"Ticket închis!", "closedTicketDmTitle":"Ticket Inchis!",
"deletedTicketDmTitle":"Ticket șters!", "deletedTicketDmTitle":"Ticket Sters!",
"closedTicketDmDescription":"Ticket-ul tau este închis!", "closedTicketDmDescription":"Ticket-ul tau este inchis!",
"deletedTicketDmDescription":"Ticket-ul tau este șters!", "deletedTicketDmDescription":"Ticket-ul tau este sters!",
"reopenTicketDmTitle":"Ticket Re-deschis!", "reopenTicketDmTitle":"Ticket Re-deschis!",
"reopenTicketDmDescription":"Ticket-ul tau este re-deschis!", "reopenTicketDmDescription":"Ticket-ul tau este re-deschis!",
"newTranscriptTitle":"O noua copie a ticket-ului este aici!", "newTranscriptTitle":"Un nou transcript este aici!",
"newTranscriptDescription":"Poti vedea copia ticket-ului in fisierul .txt de mai sus!", "hereIsTheTranscript":"Aici este transcriptul:",
"hereIsTheTranscript":"Aceasta este copia ticket-ului:",
"chooseCategory":"Alege o categorie:", "chooseCategory":"Alege o categorie:",
"gettingdeleted":"Ticket-ul se sterge..." "gettingdeleted":"Ticket-ul se sterge...",
"none":"niciunul",
"reason":"Motiv"
} }
} }
+15 -20
View File
@@ -3,7 +3,8 @@
"missingArgsTitle":"¡Argumentos inválidos!", "missingArgsTitle":"¡Argumentos inválidos!",
"missingArgsDescription":"Argumento faltante.", "missingArgsDescription":"Argumento faltante.",
"noPermsTitle":"¡Sin permisos!", "noPermsTitle":"¡Sin permisos!",
"noPermsDescription":"¡No tienes permiso para usar este comando.!\n¡Necesitas el permiso `ADMINISTRATOR` permiso o tener uno de los roles permitidos!", "noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!",
"noPermsDelete":"Only admins can delete a ticket!",
"chooseFromListTitle":"ID Invalida", "chooseFromListTitle":"ID Invalida",
"chooseFromListDescription":"Elije una de las ID de abajo:", "chooseFromListDescription":"Elije una de las ID de abajo:",
"boterror":"¡Error del bot!", "boterror":"¡Error del bot!",
@@ -18,26 +19,18 @@
"somethingWentWrongTranscript":"**¡Algo salió mal al hacer el transcript!**\n¡Prueba en otro momento!" "somethingWentWrongTranscript":"**¡Algo salió mal al hacer el transcript!**\n¡Prueba en otro momento!"
}, },
"commands":{ "commands":{
"userAddedTitle":"¡Usuario agregado!", "userAddedTitle":"Added {0} to this ticket!",
"userAddedDescription":"¡{0} fué agregado al ticket!", "userRemovedTitle":"Removed {0} from this ticket!",
"userRemovedTitle":"¡Usuario eliminado!", "renameTitle":"Changed the name to {0}!",
"userRemovedDescription":"¡{0} fué eliminado del ticket!", "closeTitle":"Closed this ticket!",
"deleteTitle":"Deleting this ticket...",
"reopenTitle":"Re-Opened this ticket!",
"renameTitle":"¡El nombre fué cambiado!", "ticketWarning":"The embed is in the message below!",
"renameWarning":"Aviso: Solo puedes cambiar el nombre 2 veces por minuto.\n(Esto es por limitaciones de Discord)", "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_"
"closeTitle":"¡Cierra el ticket!",
"closeDescription":"¡Puedes cerrar el ticket con el botón de abajo!",
"deleteTitle":"¡Elimina el ticket!",
"deleteDescription":"¡Puedes eliminar el ticket con el botón de abajo!",
"reopenTitle":"¡Re-Abre el ticket!",
"reopenDescription":"¡Puedes re-abrir el ticket con el botón de abajo!",
"ticketWarning":"¡El emblema está en el mensaje de abajo!",
"maxTicketWarning":"**Aviso:** _Solo puedes poseer {0} ticket(s) al mismo tiempo!_"
}, },
"helpMenu":{ "helpMenu":{
"title":"Menú de ayuda:", "title":"Available Commands:",
"header1":"**¡Dirígete a {0} para crear un nuevo ticket!**\n\n", "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", "header2":"**¡Ejecuta el comando `/new` o `/ticket` para crear un ticket!**\n\n",
@@ -71,10 +64,12 @@
"reopenTicketDmTitle":"¡Ticket re-abierto!", "reopenTicketDmTitle":"¡Ticket re-abierto!",
"reopenTicketDmDescription":"¡Tu ticket se vió abierto de nuevo!", "reopenTicketDmDescription":"¡Tu ticket se vió abierto de nuevo!",
"newTranscriptTitle":"¡Un nuevo transcript está aquí!", "newTranscriptTitle":"¡Un nuevo transcript está aquí!",
"newTranscriptDescription":"¡Puedes encontrar el transcript en el archivo de texto que se muestra arriba!",
"hereIsTheTranscript":"Aquí está el transcript:", "hereIsTheTranscript":"Aquí está el transcript:",
"chooseCategory":"elije una categoría:", "chooseCategory":"elije una categoría:",
"gettingdeleted":"El ticket se está viendo eliminado..." "gettingdeleted":"El ticket se está viendo eliminado...",
"none":"none",
"reason":"reason"
} }
} }
+2 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "open-ticket", "name": "open-ticket",
"version": "2.4.0", "version": "2.5.0",
"description": "This is an open-source discord ticket bot, you can configure it and it comes with cool features like a transcript.", "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", "main": "index.js",
"scripts": { "scripts": {
@@ -13,6 +13,7 @@
"author": "DJdj Development", "author": "DJdj Development",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"axios": "^0.27.2",
"chalk": "^5.0.1", "chalk": "^5.0.1",
"discord.js": "^14.0.2", "discord.js": "^14.0.2",
"express": "^4.17.1", "express": "^4.17.1",
+19
View File
@@ -0,0 +1,19 @@
const discord = require("discord.js")
const api = require("../core/api/api.js")
module.exports = () => {
const {client,config,events,utils,actions} = api
//this code will run when the bot starts!
//in this example, we will say "hello" in the console when someone opens a ticket!
/**
events.onTicketOpen((user,channel,guild,date,ticketdata) => {
console.log("hello, someone opened a ticket!")
})
*/
}