Compare commits

..
6 Commits
Author SHA1 Message Date
Jasper 2603a7bdd0 Merge pull request #21 from DJj123dj/dev
v2.3.3
2022-07-25 20:10:15 +02:00
DJj123dj c1ba677b82 v2.3.3 2022-07-25 20:09:52 +02:00
Jasper 7e6ac6a4b9 Merge pull request #20 from DJj123dj/dev
v2.3.2
2022-07-23 14:41:27 +02:00
DJj123dj 0ee9a312eb v2.3.2 2022-07-23 14:39:55 +02:00
Jasper d282a516e6 Merge pull request #19 from DJj123dj/dev
v2.3.1
2022-07-21 11:57:04 +02:00
DJj123dj 9638179d45 v2.3.1 push 1 2022-07-21 10:32:36 +02:00
30 changed files with 468 additions and 154 deletions
+3 -6
View File
@@ -7,7 +7,7 @@ make a ticket in our server to start!
*if you translate, you will come in the credits*
# open-ticket
[![discord](https://img.shields.io/badge/discord-join%20our%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-2.3.0%20stable-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v2.3.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.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)
This is an open-source discord ticket bot, you can configure it and it comes with cool features like transcripts & custom options!
@@ -62,7 +62,7 @@ if there are any errors, you can open an **issue on github** or **contact me in
### config
Our config documentation is moved to another file:
[click here to view](https://www.github.com/DJj123dj/open-ticket/wiki/config-v2.3.0)
[click here to view](https://www.github.com/DJj123dj/open-ticket/wiki/config-v2.4.0)
### 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
@@ -74,11 +74,8 @@ You can also configure your own permissions
## information
_v2.3.0 stable_
_v2.4.0 stable_
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)
### large announcement:
[![open moderation](./openmod.png)](https://www.dj-dj.be/projects/open-moderation)
+6 -2
View File
@@ -11,9 +11,13 @@ module.exports = () => {
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 (!msg.member.permissions.has("MANAGE_CHANNELS") && !msg.member.permissions.has("ADMINISTRATOR") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){
if (!msg.member.permissions.has("ManageChannels") && !msg.member.permissions.has("Administrator") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){
try {
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]})
}catch{
return msg.channel.send({embeds:[bot.errorLog.noPermsMessage]})
}
}
msg.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
@@ -36,7 +40,7 @@ module.exports = () => {
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 (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("MANAGE_GUILD")){
interaction.reply({embeds:[bot.errorLog.noPermsMessage],ephemeral:true})
return
}
+6 -2
View File
@@ -9,9 +9,13 @@ module.exports = () => {
client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"delete")) return
if (!msg.member.permissions.has("MANAGE_CHANNELS") && !msg.member.permissions.has("ADMINISTRATOR") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){
if (!msg.member.permissions.has("ManageChannels") && !msg.member.permissions.has("Administrator") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){
try {
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]})
}catch{
return msg.channel.send({embeds:[bot.errorLog.noPermsMessage]})
}
}
msg.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
@@ -41,7 +45,7 @@ module.exports = () => {
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)
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("MANAGE_GUILD")){
interaction.reply({embeds:[bot.errorLog.noPermsMessage],ephemeral:true})
return
}
+6 -2
View File
@@ -11,9 +11,13 @@ module.exports = () => {
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 (!msg.member.permissions.has("MANAGE_CHANNELS") && !msg.member.permissions.has("ADMINISTRATOR") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){
if (!msg.member.permissions.has("ManageChannels") && !msg.member.permissions.has("Administrator") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){
try {
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]})
}catch{
return msg.channel.send({embeds:[bot.errorLog.noPermsMessage]})
}
}
msg.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
@@ -37,7 +41,7 @@ module.exports = () => {
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 (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("MANAGE_GUILD")){
interaction.reply({embeds:[bot.errorLog.noPermsMessage],ephemeral:true})
return
}
+6 -2
View File
@@ -14,9 +14,13 @@ module.exports = () => {
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
if (!msg.member.permissions.has("MANAGE_CHANNELS") && !msg.member.permissions.has("ADMINISTRATOR") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){
if (!msg.member.permissions.has("ManageChannels") && !msg.member.permissions.has("Administrator") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){
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)
@@ -54,7 +58,7 @@ module.exports = () => {
if (firstmsg == undefined || firstmsg.author.id != client.user.id)return interaction.reply({embeds:[bot.errorLog.notInATicket]})
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("MANAGE_GUILD")){
interaction.reply({embeds:[bot.errorLog.noPermsMessage],ephemeral:true})
return
}
+6 -2
View File
@@ -16,9 +16,13 @@ module.exports = () => {
client.on("messageCreate", msg => {
if (msg.content.startsWith(config.prefix+"msg"||config.prefix+"message")){
if (!msg.member.permissions.has("MANAGE_CHANNELS") && !msg.member.permissions.has("ADMINISTRATOR") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){
if (!msg.member.permissions.has("ManageChannels") && !msg.member.permissions.has("Administrator") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){
try {
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]})
}catch{
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
@@ -39,7 +43,7 @@ module.exports = () => {
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 (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("MANAGE_GUILD")){
interaction.reply({embeds:[bot.errorLog.noPermsMessage],ephemeral:true})
return
}
+3 -3
View File
@@ -77,9 +77,9 @@
{
"id":"1",
"name":"Choose Your Ticket",
"description":"You can click one of the buttons below!\nYou can also customize all the embeds now!",
"enableFooter":true,
"footer":"Open Ticket v2.3.0 - I'm a footer!",
"description":"You can click one of the buttons below!",
"enableFooter":false,
"footer":"Open Ticket v2.4.0 - I'm a footer!",
"enableThumbnail":false,
"thumbnail":"https://www.example.com/catmemes/cat.png",
"color":"#ffffff",
+56
View File
@@ -0,0 +1,56 @@
# 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(...)
...
+3
View File
@@ -0,0 +1,3 @@
{
"version":"1.0.0"
}
+26
View File
@@ -0,0 +1,26 @@
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
/** FOR DEVELOPERS ONLY!!
* Don't change anything in this file, read the api documentation first!
* look into "api docs.md" for the docs!
*/
//used when creating plugins!
exports.enableApiLogs = false
//this is used when embedding open ticket into another bot
exports.embeddedMode = false
exports.clientLocation = require("../../../index").client
/** !! WARNING !!
* 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!
*/
+9
View File
@@ -0,0 +1,9 @@
const discord = require("discord.js")
const client = require("../../../index").client
module.exports = () => {
//this code will run when the bot starts!
}
+55
View File
@@ -0,0 +1,55 @@
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 {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.onTicketOpen = (user,channel,guild,date,ticketdata) => {
//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)}])
//custom code
}
/**
*
* @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.onTicketClose = (user,channel,guild,date,ticketdata) => {
//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)}])
//custom code
}
/**
*
* @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.onTicketDelete = (user,channel,guild,date,ticketdata) => {
//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)}])
//custom code
}
-2
View File
@@ -343,5 +343,3 @@ exports.checker = async () => {
}
}
this.checker()
+54 -20
View File
@@ -131,17 +131,25 @@ module.exports = () => {
interaction.deferUpdate()
interaction.message.edit({components:[closeRowNormal]})
})
client.on("interactionCreate",interaction => {
var closeTicketButtonChecker = false
client.on("interactionCreate",async interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "closeTicketTrue") return
interaction.deferUpdate()
if (closeTicketButtonChecker == true) return
closeTicketButtonChecker = true
if (config.system.closeMode == "adminonly"){
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("ADMINISTRATOR") && !permsmember.permissions.has("MANAGE_GUILD")){
interaction.channel.send({embeds:[bot.errorLog.noPermsMessage]})
return
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("MANAGE_GUILD")){
try {
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]})
}catch{
return msg.channel.send({embeds:[bot.errorLog.noPermsMessage]})
}
}
}
@@ -159,20 +167,28 @@ module.exports = () => {
}
})
require("./ticketCloser").closeTicket(interaction,prefix,"close")
await require("./ticketCloser").closeTicket(interaction,prefix,"close")
closeTicketButtonChecker = false
})
client.on("interactionCreate",interaction => {
var closeTicket1ButtonChecker = false
client.on("interactionCreate",async interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "closeTicketTrue1") return
interaction.deferUpdate()
if (closeTicket1ButtonChecker == true) return
closeTicket1ButtonChecker = true
if (config.system.closeMode == "adminonly"){
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("ADMINISTRATOR") && !permsmember.permissions.has("MANAGE_GUILD")){
interaction.channel.send({embeds:[bot.errorLog.noPermsMessage]})
return
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]})
}
}
}
@@ -202,7 +218,8 @@ module.exports = () => {
}
})
require("./ticketCloser").closeTicket(interaction,prefix,"close")
await require("./ticketCloser").closeTicket(interaction,prefix,"close")
closeTicket1ButtonChecker = false
})
@@ -222,16 +239,23 @@ module.exports = () => {
interaction.deferUpdate()
interaction.message.edit({components:[closeRowNormal]})
})
client.on("interactionCreate",interaction => {
var deleteTicketButtonChecker = false
client.on("interactionCreate",async interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "deleteTicketTrue") return
interaction.deferUpdate()
if (deleteTicketButtonChecker == true) return
deleteTicketButtonChecker = true
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("ADMINISTRATOR") && !permsmember.permissions.has("MANAGE_GUILD")){
interaction.channel.send({embeds:[bot.errorLog.noPermsMessage]})
return
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]})
}
}
/**
@@ -246,7 +270,8 @@ module.exports = () => {
}
})
require("./ticketCloser").closeTicket(interaction,prefix,"delete")
await require("./ticketCloser").closeTicket(interaction,prefix,"delete")
deleteTicketButtonChecker = false
})
@@ -268,16 +293,24 @@ module.exports = () => {
interaction.deferUpdate()
interaction.message.edit({components:[closeRowClosed]})
})
client.on("interactionCreate",interaction => {
var deleteTicket1ButtonChecker = false
client.on("interactionCreate",async interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "deleteTicketTrue1") return
interaction.deferUpdate()
if (deleteTicket1ButtonChecker == true) return
deleteTicket1ButtonChecker = true
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("ADMINISTRATOR") && !permsmember.permissions.has("MANAGE_GUILD")){
interaction.channel.send({embeds:[bot.errorLog.noPermsMessage]})
return
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]})
}
}
/**
@@ -292,6 +325,7 @@ module.exports = () => {
}
})
require("./ticketCloser").closeTicket(interaction,prefix,"deletenotranscript")
await require("./ticketCloser").closeTicket(interaction,prefix,"deletenotranscript")
deleteTicket1ButtonChecker = false
})
}
+8 -2
View File
@@ -88,11 +88,12 @@ const normalLog = (debugString) => {
/**
*
* @param {"system"|"command"|"info"} type
* @param {"system"|"command"|"info"|"api"} type
* @param {String} message
* @param {[{key:String,value:String}]} params
*/
exports.log = async (type,message,params) => {
exports.log = async (ptype,message,params) => {
var type = ptype
const chalk = await loadChalk()
var paramstring = ""
if (params){
@@ -110,6 +111,11 @@ exports.log = async (type,message,params) => {
console.log(chalk.blue("[info] ")+message+" "+chalk.yellow(parameters))
}else if (type == "system"){
console.log(chalk.green("[system] ")+message+" "+chalk.yellow(parameters))
}else if (type == "api"){
if (require("./api/base").enableApiLogs == true){
console.log(chalk.red("[api v"+require("./api/api.json").version+"] ")+message+" "+chalk.yellow(parameters))
}
type = "api v"+require("./api/api.json").version
}
const cd = new Date()
+3 -2
View File
@@ -21,7 +21,7 @@ module.exports = async () => {
interaction.reply({embeds:[bot.errorLog.serverError(l.errors.roleDoesntExist)]})
return
}
}
try {
const option = require("./utils/getButton").getOption(optionid)
@@ -56,7 +56,8 @@ module.exports = async () => {
}
}catch{
interaction.replyinteraction.channel.send({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrong)]})
interaction.channel.send({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrong)]})
}
}
})
}
Regular → Executable
+51 -18
View File
@@ -41,25 +41,34 @@ exports.closeTicket = async (interaction,prefix,mode) => {
}
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")){
interaction.channel.send({embeds:[bot.errorLog.noPermsMessage]})
return
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]})
}
interaction.channel.delete()
}
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
interaction.channel.messages.fetchPinned().then(msglist => {
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
@@ -77,24 +86,29 @@ exports.closeTicket = async (interaction,prefix,mode) => {
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")){
interaction.channel.send({embeds:[bot.errorLog.noPermsMessage]})
return
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.id,
id:getusernameStep1,
type:"member",
allow:["VIEW_CHANNEL"],
deny:["ADD_REACTIONS","ATTACH_FILES","EMBED_LINKS","SEND_MESSAGES"]
allow:[pfb.ViewChannel],
deny:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages]
})
permissionArray.push({
id:interaction.guild.id,
id:interaction.guild.roles.everyone,
type:"role",
deny:["ADD_REACTIONS","ATTACH_FILES","EMBED_LINKS","SEND_MESSAGES","VIEW_CHANNEL"]
deny:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
})
interaction.channel.permissionOverwrites.set(permissionArray)
@@ -134,11 +148,16 @@ exports.closeTicket = async (interaction,prefix,mode) => {
log("system","closed a ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name}])
//getID & send DM
interaction.channel.messages.fetchPinned().then(msglist => {
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
@@ -156,23 +175,29 @@ exports.closeTicket = async (interaction,prefix,mode) => {
}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")){
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
interaction.channel.delete()
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
interaction.channel.messages.fetchPinned().then(msglist => {
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
@@ -222,6 +247,14 @@ exports.closeTicket = async (interaction,prefix,mode) => {
})
}
}
if (deleteRequired){
const timer = () => {return new Promise((resolve,reject) => {
setTimeout(() => {resolve(true)},7000)
})}
await timer()
await interaction.channel.delete()
}
}
exports.runThis = () => {
Regular → Executable
+41 -17
View File
@@ -45,6 +45,7 @@ module.exports = () => {
}
}
if (getconfigoptions.getTicketValues("id").includes(customId)){
//ticketoptions from config
@@ -68,7 +69,6 @@ module.exports = () => {
catch{log("system","can't send DM to member, member doesn't allow dm's")}
//update storage
storage.set("ticketStorage",interaction.member.id,Number(storage.get("ticketStorage",interaction.member.id))+1)
var ticketNumber = interaction.member.user.username
@@ -85,17 +85,19 @@ module.exports = () => {
}
var permissionsArray = []
const pfb = discord.PermissionFlagsBits
const guild = client.guilds.cache.find(g => g.id == interaction.guild.id)
//set everyone allowed
if (config.system['has@everyoneaccess']){
var everyoneAllowPerms = ["ADD_REACTIONS","ATTACH_FILES","EMBED_LINKS","SEND_MESSAGES","VIEW_CHANNEL"]
var everyoneAllowPerms = [pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
var everyoneDenyPerms = []
}else{
var everyoneAllowPerms = []
var everyoneDenyPerms = ["VIEW_CHANNEL"]
var everyoneDenyPerms = [pfb.ViewChannel]
}
permissionsArray.push({
id:interaction.guild.id,
id:interaction.guild.roles.everyone,
type:"role",
allow:everyoneAllowPerms,
deny:everyoneDenyPerms
@@ -103,18 +105,25 @@ module.exports = () => {
//add the user that created the ticket
permissionsArray.push({
id:interaction.member.id,
id:interaction.member.user,
type:"member",
allow:["ADD_REACTIONS","ATTACH_FILES","EMBED_LINKS","SEND_MESSAGES","VIEW_CHANNEL"]
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
})
//add main adminroles
config.main_adminroles.forEach((role) => {
config.main_adminroles.forEach((role,index) => {
try {
const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return
permissionsArray.push({
id:role,
id:adminrole,
type:"role",
allow:["ADD_REACTIONS","ATTACH_FILES","EMBED_LINKS","SEND_MESSAGES","VIEW_CHANNEL"]
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
@@ -122,29 +131,42 @@ module.exports = () => {
* @type {String[]}
*/
const ticketadmin = currentTicketOptions.adminroles
ticketadmin.forEach((role) => {
ticketadmin.forEach((role,index) => {
if (!config.main_adminroles.includes(role)){
try {
const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return
permissionsArray.push({
id:role,
id:adminrole,
type:"role",
allow:["ADD_REACTIONS","ATTACH_FILES","EMBED_LINKS","SEND_MESSAGES","VIEW_CHANNEL"]
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
})
}catch{
log("system","invalid role! At 'config.json => options/ticket/...:"+index)
}
}
})
//add member role
if (config.system.member_role != "" && config.system.member_role != " " && config.system.member_role != "false" && config.system.member_role != "null" && config.system.member_role != "0"){
try {
const userrole = guild.roles.cache.find(r => r.id == config.system.member_role)
if (!userrole) return
permissionsArray.push({
id:config.system.member_role,
id:userrole,
type:"role",
deny:["VIEW_CHANNEL"]
deny:[pfb.ViewChannel]
})
}catch{
log("system","invalid role! At 'config.json => system/member_role")
}
}
//create the channel
interaction.guild.channels.create(ticketName,{
type:"GUILD_TEXT",
interaction.guild.channels.create({
name:ticketName,
type:discord.ChannelType.GuildText,
parent:newTicketCategory,
reason:"A new ticket is created",
permissionOverwrites:permissionsArray
@@ -156,6 +178,7 @@ module.exports = () => {
.setAuthor({name:interaction.user.id})
.setColor(config.main_color)
.setTitle(currentTicketOptions.name)
.setFooter({text:"Ticket Type: "+currentTicketOptions.id})
if (currentTicketOptions.ticketmessage.length > 0) ticketEmbed.setDescription(currentTicketOptions.ticketmessage)
ticketChannel.send({
@@ -168,6 +191,7 @@ module.exports = () => {
})
log("system","created new ticket",[{key:"ticket",value:ticketName},{key:"user",value:interaction.user.tag}])
require("./api/modules/events").onTicketOpen(interaction.user,ticketChannel,interaction.guild,new Date(),{name:ticketName,status:"open",ticketOptions:currentTicketOptions})
})
}else{
try {
Regular → Executable
+52 -8
View File
@@ -111,6 +111,8 @@ module.exports = () => {
})
const pfb = discord.PermissionFlagsBits
client.on("interactionCreate",(interaction) => {
if (!interaction.isButton()) return
if (interaction.customId != "reopenTicketTrue") return
@@ -131,14 +133,14 @@ module.exports = () => {
//set everyone allowed
if (config.system['has@everyoneaccess']){
var everyoneAllowPerms = ["ADD_REACTIONS","ATTACH_FILES","EMBED_LINKS","SEND_MESSAGES","VIEW_CHANNEL"]
var everyoneAllowPerms = [pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
var everyoneDenyPerms = []
}else{
var everyoneAllowPerms = []
var everyoneDenyPerms = ["VIEW_CHANNEL"]
var everyoneDenyPerms = [pfb.ViewChannel]
}
permissionsArray.push({
id:interaction.guild.id,
id:interaction.guild.roles.everyone,
type:"role",
allow:everyoneAllowPerms,
deny:everyoneDenyPerms
@@ -149,7 +151,7 @@ module.exports = () => {
permissionsArray.push({
id:p.id,
type:"member",
allow:["ADD_REACTIONS","ATTACH_FILES","EMBED_LINKS","SEND_MESSAGES","VIEW_CHANNEL"],
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel],
deny:[]
})
}
@@ -198,14 +200,14 @@ module.exports = () => {
//set everyone allowed
if (config.system['has@everyoneaccess']){
var everyoneAllowPerms = ["ADD_REACTIONS","ATTACH_FILES","EMBED_LINKS","SEND_MESSAGES","VIEW_CHANNEL"]
var everyoneAllowPerms = [pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
var everyoneDenyPerms = []
}else{
var everyoneAllowPerms = []
var everyoneDenyPerms = ["VIEW_CHANNEL"]
var everyoneDenyPerms = [pfb.ViewChannel]
}
permissionsArray.push({
id:interaction.guild.id,
id:interaction.guild.roles.everyone,
type:"role",
allow:everyoneAllowPerms,
deny:everyoneDenyPerms
@@ -216,7 +218,7 @@ module.exports = () => {
permissionsArray.push({
id:p.id,
type:"member",
allow:["ADD_REACTIONS","ATTACH_FILES","EMBED_LINKS","SEND_MESSAGES","VIEW_CHANNEL"],
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel],
deny:[]
})
}
@@ -242,4 +244,46 @@ module.exports = () => {
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)
}
}
Regular → Executable
+2 -2
View File
@@ -39,7 +39,7 @@ const getUserInfo = (channel) => {
*
* @param {discord.Message[]} messagecollection
* @param {discord.Channel} channel
* @returns new `discord.messageAttachment`
* @returns new `discord.attachmentBuilder`
*/
exports.createTranscript = async (messagecollection,channel) => {
@@ -64,7 +64,7 @@ exports.createTranscript = async (messagecollection,channel) => {
if (filearray.length < 2) filearray.push("transcript is empty")
const filestring = filearray.join("\n")
const filebuff = Buffer.from(filestring,"utf-8")
return new discord.MessageAttachment(filebuff,"transcript_"+ticketuserdata.ticketname+".txt")
return new discord.AttachmentBuilder(filebuff,{name:"transcript_"+ticketuserdata.ticketname+".txt",description:"An Open Ticket transcript"})
}catch(err){
console.log("[error] "+err)
return false
+5 -4
View File
@@ -3,7 +3,7 @@
"missingArgsTitle":"حجج باطلة",
"missingArgsDescription":"حجة مفقودة",
"noPermsTitle":"ليس لديك إذن",
"noPermsDescription":"ليس لديك إذن لاستخدام هذا\nأنت بحاجة إلى إذن "ADMINISTRATOR" أو أن تكون في قائمة الأدوار المسموح بها!",
"noPermsDescription":"ليس لديك إذن لاستخدام هذا\nأنت بحاجة إلى إذن 'ADMINISTRATOR' أو أن تكون في قائمة الأدوار المسموح بها!",
"chooseFromListTitle":"بطاقة التعريف غير صالحة",
"chooseFromListDescription":"اختر أحد المعرفات أدناه:",
"boterror":"مشكلة في الروبوت",
@@ -14,8 +14,8 @@
"anotherOption":"هذا الخيار ليس تذكرة بل نوع آخر!",
"maxAmountTitle":"بلغ الحد الأقصى!",
"maxAmountDescription":"لقد وصلت إلى الحد الأقصى لعدد التذاكر المسموح بها!\nلذلك لا يمكنك إنشاء واحدة جديدة!",
"somethingWentWrong":"هناك خطأ ما!**\nالرجاء المحاولة مرة أخرى!",
"somethingWentWrongTranscript":"حدث خطأ ما أثناء كتابة النص!**\nالرجاء المحاولة مرة أخرى!"
"somethingWentWrong":"**هناك خطأ ما!**\nالرجاء المحاولة مرة أخرى!",
"somethingWentWrongTranscript":"**حدث خطأ ما أثناء كتابة النص!**\nالرجاء المحاولة مرة أخرى!"
},
"commands":{
"userAddedTitle":"تمت إضافة المستخدم!",
@@ -74,6 +74,7 @@
"newTranscriptDescription":"يمكنك العثور على النص في الملف النصي أعلاه!",
"hereIsTheTranscript":"هذا هو النص:",
"chooseCategory":"اختر فئة:"
"chooseCategory":"اختر فئة:",
"gettingdeleted":"...يتم حذف التذكرة"
}
}
+3 -2
View File
@@ -14,7 +14,7 @@
"anotherOption":"This option is not a ticket but another type!",
"maxAmountTitle":"Max amount reached!",
"maxAmountDescription":"You reached the maximum number of tickets allowed!\nSo you can't create a new one!",
"somethingWentWrong":"Something went wrong!**\nPlease try again another time!",
"somethingWentWrong":"**Something went wrong!**\nPlease try again another time!",
"somethingWentWrongTranscript":"Something went wrong while making the transcript!**\nPlease try again another time!"
},
"commands":{
@@ -74,6 +74,7 @@
"newTranscriptDescription":"You can find the transcript in the text file above!",
"hereIsTheTranscript":"Here is the transcript:",
"chooseCategory":"choose a category:"
"chooseCategory":"choose a category:",
"gettingdeleted":"Ticket is getting deleted..."
}
}
+3 -2
View File
@@ -14,7 +14,7 @@
"anotherOption":"Deze optie is geen ticket maar een ander type!",
"maxAmountTitle":"Max aantal bereikt!",
"maxAmountDescription":"Je hebt het maximum aantal openstaande ticket bereikt!\nDus je kan er geen nieuwe 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!"
},
"commands":{
@@ -74,6 +74,7 @@
"newTranscriptDescription":"Je kan het transcript vinden in het bestand hierboven!",
"hereIsTheTranscript":"Hier is het transcript:",
"chooseCategory":"kies een categorie:"
"chooseCategory":"kies een categorie:",
"gettingdeleted":"Ticket wordt verwijderd..."
}
}
+3 -2
View File
@@ -14,7 +14,7 @@
"anotherOption":"This option is not a ticket but another type!",
"maxAmountTitle":"Max amount reached!",
"maxAmountDescription":"You reached the maximum number of tickets allowed!\nSo you can't create a new one!",
"somethingWentWrong":"Something went wrong!**\nPlease try again another time!",
"somethingWentWrong":"**Something went wrong!**\nPlease try again another time!",
"somethingWentWrongTranscript":"Something went wrong while making the transcript!**\nPlease try again another time!"
},
"commands":{
@@ -74,6 +74,7 @@
"newTranscriptDescription":"You can find the transcript in the text file above!",
"hereIsTheTranscript":"Here is the transcript:",
"chooseCategory":"choose a category:"
"chooseCategory":"choose a category:",
"gettingdeleted":"Ticket is getting deleted..."
}
}
+3 -2
View File
@@ -14,7 +14,7 @@
"anotherOption":"Cette option n'est pas un ticket mais un autre type !",
"maxAmountTitle":"Montant max atteint !",
"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":"**Une erreur s'est produite !**\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":{
@@ -68,6 +68,7 @@
"newTranscriptDescription":"Vous pouvez trouver la transcription dans le fichier texte ci-dessus !",
"hereIsTheTranscript":"Voici la transcription :",
"chooseCategory":"choisissez une catégorie:"
"chooseCategory":"choisissez une catégorie:",
"gettingdeleted":"Le ticket est en cours de suppression..."
}
}
+3 -2
View File
@@ -14,7 +14,7 @@
"anotherOption":"Diese Option ist kein Ticket, sondern eine andere Art!",
"maxAmountTitle":"Das Limit wurde erreicht!",
"maxAmountDescription":"Sie haben die maximal zulässige Anzahl von Tickets erreicht!\nSie können also keine neue erstellen.!",
"somethingWentWrong":"Etwas ist schief gelaufen!**\nBitte versuchen Sie es ein anderes Mal!",
"somethingWentWrong":"**Etwas ist 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":{
@@ -74,6 +74,7 @@
"newTranscriptDescription":"Die Abschrift finden Sie in der obigen Textdatei!",
"hereIsTheTranscript":"Hier ist das Transscript:",
"chooseCategory":"Wähle eine Kategorie:"
"chooseCategory":"Wähle eine Kategorie:",
"gettingdeleted":"Ticket wird gelöscht..."
}
}
+2 -1
View File
@@ -74,6 +74,7 @@
"newTranscriptDescription":"Poti vedea copia ticket-ului in fisierul .txt de mai sus!",
"hereIsTheTranscript":"Aceasta este copia ticket-ului:",
"chooseCategory":"Alege o categorie:"
"chooseCategory":"Alege o categorie:",
"gettingdeleted":"Ticket-ul se sterge..."
}
}
+2 -1
View File
@@ -74,6 +74,7 @@
"newTranscriptDescription":"¡Puedes encontrar el transcript en el archivo de texto que se muestra arriba!",
"hereIsTheTranscript":"Aquí está el transcript:",
"chooseCategory":"elije una categoría:"
"chooseCategory":"elije una categoría:",
"gettingdeleted":"El ticket se está viendo eliminado..."
}
}
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 161 KiB

+2 -2
View File
@@ -1,11 +1,11 @@
{
"name": "open-ticket",
"version": "2.3.0",
"version": "2.4.0",
"description": "This is an open-source discord ticket bot, you can configure it and it comes with cool features like a transcript.",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1",
"test": "node index.js d",
"slashEnable": "node index.js slash enable",
"slashDisable": "node index.js slash disable",
"cleardata": "node ./core/dynamicdatabase/cleardata.js"