3.0 update first beta

This commit is contained in:
DJj123dj
2022-09-24 08:56:34 +02:00
parent 69de612d1e
commit ed9c98e2f0
45 changed files with 623 additions and 595 deletions
+3 -1
View File
@@ -11,4 +11,6 @@ openticketdebug.txt
developerChangelog.md developerChangelog.md
storage/dynamicDB/ storage/dynamicDB/
storage/.DS_Store storage/.DS_Store
.vscode/ .vscode/
livestatus.json
test.js
+5 -6
View File
@@ -25,6 +25,7 @@ This is an open-source discord ticket bot, you can configure it and it comes wit
- R0JO - R0JO
- t0miiis - t0miiis
- josuens14 - josuens14
- M4
## features ## features
- discord interaction buttons - discord interaction buttons
@@ -42,13 +43,11 @@ This is an open-source discord ticket bot, you can configure it and it comes wit
- configure everything per ticket - configure everything per ticket
- remove credits if you want :( - remove credits if you want :(
- unlimited tickets spread over multiple messages - unlimited tickets spread over multiple messages
*comming soon:*
- dashboard
- view transcripts in dashboard
- share transcripts
- close with reason - close with reason
- more translation
*comming soon*
- share transcripts
- view transcripts in html
## installation ## installation
**You need `node.js 16` to run this project!** **You need `node.js 16` to run this project!**
+6 -4
View File
@@ -9,6 +9,8 @@ const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events") const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
bot.errorLog.log("debug","COMMANDS: loaded add.js")
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"add")) return if (!msg.content.startsWith(config.prefix+"add")) return
var user = msg.mentions.users.first() var user = msg.mentions.users.first()
@@ -27,13 +29,13 @@ module.exports = () => {
const ticketId = hiddendata.data.find(d => d.key == "type").value const ticketId = hiddendata.data.find(d => d.key == "type").value
msg.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true}) msg.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true})
msg.channel.send({embeds:[bot.embeds.commands.addEmbed(user)]}) msg.channel.send({embeds:[bot.embeds.commands.addEmbed(user,msg.author)]})
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) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
APIEvents.onTicketAdd(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData}) 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()) APIEvents.onCommand("add",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
@@ -59,13 +61,13 @@ module.exports = () => {
const ticketId = hiddendata.data.find(d => d.key == "type").value const ticketId = hiddendata.data.find(d => d.key == "type").value
interaction.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true}) interaction.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true})
interaction.reply({embeds:[bot.embeds.commands.addEmbed(user)]}) interaction.reply({embeds:[bot.embeds.commands.addEmbed(user,interaction.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) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
APIEvents.onTicketAdd(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData}) 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()) APIEvents.onCommand("add",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
+22 -4
View File
@@ -9,9 +9,19 @@ const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events") const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
bot.errorLog.log("debug","COMMANDS: loaded close.js")
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"close")) return if (!msg.content.startsWith(config.prefix+"close")) return
const args = msg.content.substring((config.prefix+"close").length).split(" ")
args.shift()
/**@type {String|false} */
var tempreason = args.join(" ")
if (!tempreason || tempreason == " " || tempreason == " "){
tempreason = false
}
const reason = tempreason
msg.channel.messages.fetchPinned().then(msglist => { msg.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
@@ -19,7 +29,10 @@ module.exports = () => {
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value const ticketId = hiddendata.data.find(d => d.key == "type").value
msg.channel.send({embeds:[bot.embeds.commands.closeEmbed(msg.author)],components:[bot.buttons.close.closeCommandRow]}) if (hiddendata.data.find(h => h.key == "pendingdelete")) return msg.channel.send({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]})
const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false
msg.channel.send({embeds:[bot.embeds.commands.closeEmbed(msg.author,descriptionReason)],components:[bot.buttons.close.closeCommandRow]})
var name = msg.channel.name var name = msg.channel.name
var prefix = "" var prefix = ""
@@ -30,7 +43,7 @@ module.exports = () => {
} }
}) })
require("../core/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"close",false,true) require("../core/ticketActions/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"close",reason,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()) APIEvents.onCommand("close",true,msg.author,msg.channel,msg.guild,new Date())
@@ -46,13 +59,18 @@ module.exports = () => {
//interaction.deferReply() //interaction.deferReply()
const reason = interaction.options.getString("reason") ? interaction.options.getString("reason") : false
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 hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value const ticketId = hiddendata.data.find(d => d.key == "type").value
interaction.reply({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]}) if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.reply({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]})
const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false
interaction.reply({embeds:[bot.embeds.commands.closeEmbed(interaction.user,descriptionReason)],components:[bot.buttons.close.closeCommandRow]})
var name = interaction.channel.name var name = interaction.channel.name
var prefix = "" var prefix = ""
@@ -63,7 +81,7 @@ module.exports = () => {
} }
}) })
require("../core/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",false,true) require("../core/ticketActions/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()) APIEvents.onCommand("close",true,interaction.user,interaction.channel,interaction.guild,new Date())
+4 -2
View File
@@ -9,6 +9,8 @@ const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events") const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
bot.errorLog.log("debug","COMMANDS: loaded delete.js")
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"delete")) return if (!msg.content.startsWith(config.prefix+"delete")) return
@@ -35,7 +37,7 @@ module.exports = () => {
} }
}) })
require("../core/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"delete",false,true) require("../core/ticketActions/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()) APIEvents.onCommand("delete",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
@@ -73,7 +75,7 @@ module.exports = () => {
} }
}) })
require("../core/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true) require("../core/ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true)
log("command","someone used the 'delete' command",[{key:"user",value:interaction.user.tag}]) 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()) APIEvents.onCommand("delete",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
+2
View File
@@ -8,6 +8,8 @@ const l = bot.language
const APIEvents = require("../core/api/modules/events") const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
bot.errorLog.log("debug","COMMANDS: loaded help.js")
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)
+6 -4
View File
@@ -9,6 +9,8 @@ const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events") const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
bot.errorLog.log("debug","COMMANDS: loaded remove.js")
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"remove")) return if (!msg.content.startsWith(config.prefix+"remove")) return
var user = msg.mentions.users.first() var user = msg.mentions.users.first()
@@ -27,14 +29,14 @@ module.exports = () => {
const ticketId = hiddendata.data.find(d => d.key == "type").value 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.embeds.commands.removeEmbed(user)]}) msg.channel.send({embeds:[bot.embeds.commands.removeEmbed(user,msg.author)]})
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) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
APIEvents.onTicketRemove(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData}) 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()) APIEvents.onCommand("remove",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
}) })
@@ -59,14 +61,14 @@ module.exports = () => {
const ticketId = hiddendata.data.find(d => d.key == "type").value 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.embeds.commands.removeEmbed(user)]}) interaction.reply({embeds:[bot.embeds.commands.removeEmbed(user,interaction.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) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
APIEvents.onTicketRemove(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData}) 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()) APIEvents.onCommand("remove",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
+2
View File
@@ -9,6 +9,8 @@ const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events") const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
bot.errorLog.log("debug","COMMANDS: loaded rename.js")
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"rename")) return if (!msg.content.startsWith(config.prefix+"rename")) return
+8 -2
View File
@@ -9,6 +9,8 @@ const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events") const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
bot.errorLog.log("debug","COMMANDS: loaded reopen.js")
client.on("messageCreate",msg => { client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"reopen")) return if (!msg.content.startsWith(config.prefix+"reopen")) return
@@ -18,9 +20,11 @@ module.exports = () => {
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value const ticketId = hiddendata.data.find(d => d.key == "type").value
if (hiddendata.data.find(h => h.key == "pendingdelete")) return msg.channel.send({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]})
msg.channel.send({embeds:[bot.embeds.commands.reopenEmbed(msg.author)],components:[bot.buttons.close.openRowNormal]}) 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) require("../core/ticketActions/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()) APIEvents.onCommand("reopen",true,msg.author,msg.channel,msg.guild,new Date())
@@ -40,9 +44,11 @@ module.exports = () => {
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value const ticketId = hiddendata.data.find(d => d.key == "type").value
if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.reply({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]})
await interaction.reply({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]}) await interaction.reply({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]})
require("../core/ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user) require("../core/ticketActions/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()) APIEvents.onCommand("reopen",true,interaction.user,interaction.channel,interaction.guild,new Date())
+4 -2
View File
@@ -9,6 +9,8 @@ const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events") const APIEvents = require("../core/api/modules/events")
module.exports = () => { module.exports = () => {
bot.errorLog.log("debug","COMMANDS: loaded ticket.js")
/**@type {String[]} */ /**@type {String[]} */
var msgIds = [] var msgIds = []
config.messages.forEach((msg) => { config.messages.forEach((msg) => {
@@ -31,7 +33,7 @@ module.exports = () => {
if (!msgIds.includes(id)) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds)]}) if (!msgIds.includes(id)) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds)]})
const {embed,componentRows} = require("../core/ticketMessageEmbed").createEmbed(id) const {embed,componentRows} = require("../core/utils/getEmbed").createEmbed(id)
msg.channel.send({embeds:[embed],components:componentRows}) msg.channel.send({embeds:[embed],components:componentRows})
@@ -54,7 +56,7 @@ module.exports = () => {
if (!msgIds.includes(id)) return interaction.reply({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds)]}) if (!msgIds.includes(id)) return interaction.reply({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds)]})
const {embed,componentRows} = require("../core/ticketMessageEmbed").createEmbed(id) const {embed,componentRows} = require("../core/utils/getEmbed").createEmbed(id)
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})
+3 -2
View File
@@ -41,7 +41,7 @@
"channelprefix":"question-", "channelprefix":"question-",
"category":"category id", "category":"category id",
"message":"You created a ticket!", "message":"You created a ticket!",
"enableDMMessage":true, "enableDmOnOpen":true,
"ticketmessage":"The staff will help you soon!\n\n*Click on the button below to close the ticket!*" "ticketmessage":"The staff will help you soon!\n\n*Click on the button below to close the ticket!*"
}, },
@@ -67,7 +67,7 @@
"color":"red", "color":"red",
"roles":["discord role id"], "roles":["discord role id"],
"mode":"add&remove|remove|add", "mode":"add&remove|remove|add",
"enableDMMessage":true "enableDmOnOpen":true
} }
], ],
@@ -77,6 +77,7 @@
"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!",
"dropdown":false,
"enableFooter":false, "enableFooter":false,
"footer":"Open Ticket v3.0.0 - I'm a footer!", "footer":"Open Ticket v3.0.0 - I'm a footer!",
+1
View File
@@ -3,6 +3,7 @@
"disclaimer":"DISABLE doesn't work yet! Below this message!", "disclaimer":"DISABLE doesn't work yet! Below this message!",
"enableAPIdebug":false,
"disable":{ "disable":{
"messages":{ "messages":{
"ticketCreated":false, "ticketCreated":false,
+9 -2
View File
@@ -4,7 +4,7 @@ const log = bot.errorLog.log
module.exports = () => { module.exports = () => {
const files = fs.readdirSync("./plugins") const files = fs.readdirSync("./plugins")
const api = require("./api.json")
var totalcount = 0 var totalcount = 0
var successcount = 0 var successcount = 0
var failcount = 0 var failcount = 0
@@ -15,7 +15,14 @@ module.exports = () => {
successcount++ successcount++
totalcount++ totalcount++
}catch{ }catch(err){
/**@type {Error} */
const theError = err
if (api.enableAPIdebug){
const data = fs.readFileSync("./apiDebug.txt")
const newData = data ? data.toString() : ""
fs.writeFileSync("./apiDebug.txt",newData+"ERROR: "+theError.name+": "+theError.message+"\n"+theError.stack+"\n\n")
}
failcount++ failcount++
totalcount++ totalcount++
} }
+17 -6
View File
@@ -1,6 +1,17 @@
exports.checker = async () => { exports.checker = async () => {
const chalk = await (await import("chalk")).default const chalk = await (await import("chalk")).default
const config = require("../config.json")
if (process.argv.some((v) => v == "--nochecker")) return
if (process.argv.some((v) => v == "--devconfig")){
//console.log(chalk.blue("=> used dev config instead of normal config"))
try{
var tempconfig = require("../devConfig.json")
}catch(err){console.log(err);var tempconfig = require("../config.json")}
}else{
var tempconfig = require("../config.json")
}
const config = tempconfig
var errorList = [] var errorList = []
var isError = false var isError = false
var warnList = [] var warnList = []
@@ -195,8 +206,8 @@ exports.checker = async () => {
//message //message
checkType(option.message,"string",path+"/message") checkType(option.message,"string",path+"/message")
//enableDMmessage //enableDmOnOpen
checkType(option.enableDMMessage,"boolean",path+"/enableDMMessage") checkType(option.enableDmOnOpen,"boolean",path+"/enableDmOnOpen")
//ticketmessage //ticketmessage
checkType(option.ticketmessage,"string",path+"/ticketmessage") checkType(option.ticketmessage,"string",path+"/ticketmessage")
@@ -230,8 +241,8 @@ exports.checker = async () => {
createError("'"+path+"/mode' | mode must be one of these: add, remove, add&remove") createError("'"+path+"/mode' | mode must be one of these: add, remove, add&remove")
} }
//enableDMmessage //enableDmOnOpen
checkType(option.enableDMMessage,"boolean",path+"/enableDMMessage") checkType(option.enableDmOnOpen,"boolean",path+"/enableDmOnOpen")
} }
} }
@@ -260,7 +271,7 @@ exports.checker = async () => {
//languagefile //languagefile
checkType(config.languagefile,"string","languagefile") checkType(config.languagefile,"string","languagefile")
const lf = config.languagefile const lf = config.languagefile
if (!lf.startsWith("custom") && !lf.startsWith("english") && !lf.startsWith("dutch") && !lf.startsWith("romanian") && !lf.startsWith("german") && !lf.startsWith("arabic") && !lf.startsWith("spanish") && !lf.startsWith("portuguese")){ if (!lf.startsWith("custom") && !lf.startsWith("english") && !lf.startsWith("dutch") && !lf.startsWith("romanian") && !lf.startsWith("german") && !lf.startsWith("arabic") && !lf.startsWith("spanish") && !lf.startsWith("portuguese") && !lf.startsWith("french")){
createError("'languagefile' | invalid language, more info in the wiki") createError("'languagefile' | invalid language, more info in the wiki")
} }
+4 -1
View File
@@ -101,7 +101,7 @@ const normalLog = (debugString) => {
/** /**
* *
* @param {"system"|"command"|"info"|"api"} type * @param {"system"|"command"|"info"|"api"|"debug"} type
* @param {String} message * @param {String} message
* @param {[{key:String,value:String}]} params * @param {[{key:String,value:String}]} params
*/ */
@@ -129,6 +129,9 @@ exports.log = async (type,message,params) => {
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))
} }
ptype = "api v"+require("./api/api.json").version ptype = "api v"+require("./api/api.json").version
}else if (ptype == "debug"){
if (!process.argv.some((v) => v == "--debug")) return
console.log(chalk.redBright("[DEBUG] ")+message+" "+chalk.yellow(parameters))
} }
const cd = new Date() const cd = new Date()
-116
View File
@@ -1,116 +0,0 @@
const bot = require("../index")
const config = bot.config
/**
* @param {Number} index
* @param {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDMMessage"|"ticketmessage"} value
*/
exports.getTicketValue = (index,value) => {
if (value == "id"){
return "OTnewT"+config.options[index][value]
}
return config.options[index][value]
}
/**
* @param {Number} index
* @param {"id"|"name"|"description"|"icon"|"label"|"type"|"url"} value
*/
exports.getWebsiteValue = (index,value) => {
return config.options[index][value]
}
/**
* @param {Number} index
* @param {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"roles"|"mode"|"enableDMMessage"} value
*/
exports.getRoleValue = (index,value) => {
return config.options[index][value]
}
/**
* @param {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDMMessage"|"ticketmessage"} value
*/
exports.getTicketValues = (value) => {
var result = []
config.options.forEach((o) => {
if (value == "id"){
result.push("OTnewT"+o[value])
}else{
result.push(o[value])
}
})
return result
}
/**
* @param {"id"|"name"|"description"|"icon"|"label"|"type"|"url"} value
*/
exports.getWebsiteValues = (value) => {
var result = []
config.options.forEach((o) => {
result.push(o[value])
})
return result
}
/**
* @param {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"roles"|"mode"|"enableDMMessage""} value
*/
exports.getRoleValues = (value) => {
var result = []
config.options.forEach((o) => {
result.push(o[value])
})
return result
}
class TicketOptions {
constructor() {
this.id = ""
this.name = ""
this.description = ""
this.icon = ""
this.label = ""
this.type = ""
this.color = ""
this.adminroles = ["",""]
this.channelprefix = ""
this.category = ""
this.message = ""
this.enableDMMessage = true
this.ticketmessage = ""
}
}
/**
*
* @param {String} id
* @returns {TicketOptions|false}
*/
exports.getOptionsById = (id) => {
var result = false
config.options.forEach((option) => {
if ("OTnewT"+option.id == id){
result = option
}
})
return result
}
exports.exportedOptionClass = class {
constructor() {
this.id = ""
this.name = ""
this.description = ""
this.icon = ""
this.label = ""
this.type = ""
this.color = ""
this.adminroles = ["",""]
this.channelprefix = ""
this.category = ""
this.message = ""
this.enableDMMessage = true
this.ticketmessage = ""
}
}
@@ -5,7 +5,6 @@ const config = bot.config
const l = bot.language const l = bot.language
const log = bot.errorLog.log const log = bot.errorLog.log
const getconfigoptions = require("../../getoptions")
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.main_color
@@ -5,7 +5,6 @@ const config = bot.config
const l = bot.language const l = bot.language
const log = bot.errorLog.log const log = bot.errorLog.log
const getconfigoptions = require("../../getoptions")
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.main_color
@@ -5,7 +5,7 @@ const config = bot.config
const l = bot.language const l = bot.language
const log = bot.errorLog.log const log = bot.errorLog.log
const getconfigoptions = require("../../getoptions")
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.main_color
+14 -7
View File
@@ -5,7 +5,6 @@ const config = bot.config
const l = bot.language const l = bot.language
const log = bot.errorLog.log const log = bot.errorLog.log
const getconfigoptions = require("../../getoptions")
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.main_color
@@ -13,37 +12,45 @@ const mc = config.main_color
/** /**
* *
* @param {discord.User} addedUser * @param {discord.User} addedUser
* @param {discord.User} adder
* @returns {discord.EmbedBuilder} * @returns {discord.EmbedBuilder}
*/ */
exports.addEmbed = (addedUser) => { exports.addEmbed = (addedUser,adder) => {
return new embed() return new embed()
.setTitle("⬆️ "+l.commands.userAddedTitle.replace("{0}",addedUser.username)) .setTitle("⬆️ "+l.commands.userAddedTitle.replace("{0}",addedUser.username))
.setColor(mc) .setColor(mc)
.setFooter({text:addedUser.tag,iconURL:addedUser.displayAvatarURL()}) .setFooter({text:adder.tag,iconURL:adder.displayAvatarURL()})
.setThumbnail(addedUser.displayAvatarURL({extension:"png"}))
} }
/** /**
* *
* @param {discord.User} removedUser * @param {discord.User} removedUser
* @param {discord.User} remover
* @returns {discord.EmbedBuilder} * @returns {discord.EmbedBuilder}
*/ */
exports.removeEmbed = (removedUser) => { exports.removeEmbed = (removedUser,remover) => {
return new embed() return new embed()
.setTitle("⬇️ "+l.commands.userRemovedTitle.replace("{0}",removedUser.username)) .setTitle("⬇️ "+l.commands.userRemovedTitle.replace("{0}",removedUser.username))
.setColor(mc) .setColor(mc)
.setFooter({text:removedUser.tag,iconURL:removedUser.displayAvatarURL()}) .setFooter({text:remover.tag,iconURL:remover.displayAvatarURL()})
.setThumbnail(removedUser.displayAvatarURL({extension:"png"}))
} }
/** /**
* *
* @param {discord.User} closer * @param {discord.User} closer
* @param {String} description
* @returns {discord.EmbedBuilder} * @returns {discord.EmbedBuilder}
*/ */
exports.closeEmbed = (closer) => { exports.closeEmbed = (closer,description) => {
return new embed() const embd = new embed()
.setTitle("🔒 "+l.commands.closeTitle) .setTitle("🔒 "+l.commands.closeTitle)
.setColor(mc) .setColor(mc)
.setFooter({text:closer.tag,iconURL:closer.displayAvatarURL()}) .setFooter({text:closer.tag,iconURL:closer.displayAvatarURL()})
if (description) embd.setDescription(description)
return embd
} }
/** /**
@@ -5,7 +5,6 @@ const config = bot.config
const l = bot.language const l = bot.language
const log = bot.errorLog.log const log = bot.errorLog.log
const getconfigoptions = require("../../../getoptions")
const permissionChecker = require("../../../utils/permisssionChecker") const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
@@ -56,7 +55,7 @@ module.exports = () => {
}) })
interaction.channel.send({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]}) 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) await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",false,true)
closeTicketButtonChecker = false closeTicketButtonChecker = false
}) })
} }
@@ -5,7 +5,6 @@ const config = bot.config
const l = bot.language const l = bot.language
const log = bot.errorLog.log const log = bot.errorLog.log
const getconfigoptions = require("../../../getoptions")
const permissionChecker = require("../../../utils/permisssionChecker") const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
@@ -94,7 +93,7 @@ module.exports = () => {
}) })
//interaction.channel.send({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]}) //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",reason,true) await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",reason,true)
closeTicketButtonChecker = false closeTicketButtonChecker = false
}) })
} }
@@ -5,7 +5,6 @@ const config = bot.config
const l = bot.language const l = bot.language
const log = bot.errorLog.log const log = bot.errorLog.log
const getconfigoptions = require("../../../getoptions")
const permissionChecker = require("../../../utils/permisssionChecker") const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
@@ -53,7 +52,7 @@ module.exports = () => {
interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
await interaction.message.edit({components:[bot.buttons.close.openRowDisabled]}) await interaction.message.edit({components:[bot.buttons.close.openRowDisabled]})
await require("../../../ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true) await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true)
deleteTicketButtonChecker = false deleteTicketButtonChecker = false
}) })
@@ -92,7 +91,7 @@ module.exports = () => {
}) })
interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
await require("../../../ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"deletenotranscript",false,true) await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"deletenotranscript",false,true)
deleteTicketButtonChecker1 = false deleteTicketButtonChecker1 = false
}) })
} }
@@ -5,7 +5,6 @@ const config = bot.config
const l = bot.language const l = bot.language
const log = bot.errorLog.log const log = bot.errorLog.log
const getconfigoptions = require("../../../getoptions")
const permissionChecker = require("../../../utils/permisssionChecker") const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
@@ -24,6 +23,6 @@ module.exports = () => {
interaction.deferUpdate() interaction.deferUpdate()
interaction.message.edit({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]}) interaction.message.edit({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]})
require("../../../ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user) require("../../../ticketActions/ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user)
}) })
} }
@@ -5,7 +5,6 @@ const config = bot.config
const l = bot.language const l = bot.language
const log = bot.errorLog.log const log = bot.errorLog.log
const getconfigoptions = require("../../getoptions")
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
@@ -5,7 +5,6 @@ const config = bot.config
const l = bot.language const l = bot.language
const log = bot.errorLog.log const log = bot.errorLog.log
const getconfigoptions = require("../../getoptions")
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
@@ -5,7 +5,6 @@ const config = bot.config
const l = bot.language const l = bot.language
const log = bot.errorLog.log const log = bot.errorLog.log
const getconfigoptions = require("../../getoptions")
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
+1 -1
View File
@@ -1,6 +1,6 @@
const index = require("../index") const index = require("../index")
if (index.developerMode){ if (index.developerConfig){
var config = require("../devConfig.json") var config = require("../devConfig.json")
}else{var config = require("../config.json")} }else{var config = require("../config.json")}
-1
View File
@@ -2,7 +2,6 @@ const discord = require("discord.js")
const bot = require("../../index") const bot = require("../../index")
const client = require("../../index").client const client = require("../../index").client
const config = bot.config const config = bot.config
const getoptions = require("../getoptions")
module.exports = async () => { module.exports = async () => {
const chalk = (await import("chalk")).default const chalk = (await import("chalk")).default
+13 -6
View File
@@ -2,7 +2,7 @@ const discord = require("discord.js")
const bot = require("../../index") const bot = require("../../index")
const client = require("../../index").client const client = require("../../index").client
const config = bot.config const config = bot.config
const getoptions = require("../getoptions") const configParser = require("../utils/configParser")
const act = discord.ApplicationCommandType const act = discord.ApplicationCommandType
const acot = discord.ApplicationCommandOptionType const acot = discord.ApplicationCommandOptionType
@@ -11,12 +11,12 @@ module.exports = async () => {
const chalk = (await import("chalk")).default const chalk = (await import("chalk")).default
const sid = config.server_id const sid = config.server_id
const ids = getoptions.getTicketValues("id") const ids = configParser.getTicketValuesArray("id")
/**@type {[{name:String,value:String}]} */ /**@type {[{name:String,value:String}]} */
var choices = [] var choices = []
ids.forEach((id) => { ids.forEach((id) => {
const option = getoptions.getOptionsById(id) const option = configParser.getTicketById(id)
if (option.type == "ticket"){ if (option){
choices.push({name:option.name,value:option.id}) choices.push({name:option.name,value:option.id})
} }
}) })
@@ -82,7 +82,7 @@ module.exports = async () => {
//help //help
client.application.commands.create({ client.application.commands.create({
name:"help", name:"help",
description:"The help menu", description:"View the available commands.",
defaultPermission:true, defaultPermission:true,
type:act.ChatInput type:act.ChatInput
},sid).then(() => { },sid).then(() => {
@@ -95,7 +95,14 @@ module.exports = async () => {
name:"close", name:"close",
description:"Close the current ticket.", description:"Close the current ticket.",
defaultPermission:true, defaultPermission:true,
type:act.ChatInput type:act.ChatInput,
options:[{
name:"reason",
type:discord.ApplicationCommandOptionType.String,
required:false,
description:"The reason to close this ticket.",
maxLength:100
}]
},sid).then(() => { },sid).then(() => {
readystats++ readystats++
}) })
@@ -1,36 +1,13 @@
const discord = require('discord.js') const discord = require('discord.js')
const bot = require('../index') const bot = require('../../index')
const client = bot.client 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 storage = bot.storage const storage = bot.storage
const permsChecker = require("./utils/permisssionChecker") const permsChecker = require("../utils/permisssionChecker")
exports.runThis = () => { const pendingDelete = []
client.on("interactionCreate",async (interaction) => {
if (!interaction.isButton()) return
if (interaction.customId != "sendTranscript") return
interaction.deferUpdate()
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!")
interaction.channel.send({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrongTranscript)]})
return
}
interaction.channel.send({content:"**"+l.messages.hereIsTheTranscript+"**",files:[fileattachment]})
})
}
/** /**
* *
@@ -51,6 +28,9 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
//start code //start code
//FIX CHANNEL COULD BE CLOSED AFTER DELETE:
if (pendingDelete.includes(channel.id)) return false
//remove ot bot from transcript //remove ot bot from transcript
channelmessages.sweep((msgSweep) => {return msgSweep.author.id == client.user.id}) channelmessages.sweep((msgSweep) => {return msgSweep.author.id == client.user.id})
@@ -88,21 +68,28 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
await channel.send({content:"**"+l.messages.gettingdeleted+"**"}) await channel.send({content:"**"+l.messages.gettingdeleted+"**"})
} }
log("system","deleted a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}]) log("system","deleted a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}])
pendingDelete.push(channel.id)
if (!isDatabaseError) storage.set("ticketStorage",getuserID,Number(storage.get("ticketStorage",getuserID)) - 1) if (!isDatabaseError) storage.set("ticketStorage",getuserID,Number(storage.get("ticketStorage",getuserID)) - 1)
//getID & send DM & send api event //getID & send DM & send api event
await channel.messages.fetchPinned().then(msglist => { await channel.messages.fetchPinned().then(async 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 hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value.value const ticketId = hiddendata.data.find(d => d.key == "type").value.value
const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId) const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
require("./api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData}) 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 const id = hiddendata.data.find(d => d.key == "openerid").value
const sphd = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description)
sphd.hiddenData.data.push({key:"pendingdelete",value:"true"})
const newEmbed = new discord.EmbedBuilder(firstmsg.embeds[0].data)
newEmbed.setDescription(sphd.description + bot.hiddenData.writeHiddenData(sphd.hiddenData.type,sphd.hiddenData.data))
await firstmsg.edit({embeds:[newEmbed]})
if (!id) return false if (!id) return false
try{ try{
@@ -163,7 +150,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
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 hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value const ticketId = hiddendata.data.find(d => d.key == "type").value
const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId) const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
if (!ticketData) return if (!ticketData) return
@@ -236,9 +223,9 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
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 hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value const ticketId = hiddendata.data.find(d => d.key == "type").value
const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId) const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
require("./api/modules/events").onTicketClose(user,channel,guild,new Date(),{name:channel.name,status:"closed",ticketOptions:ticketData},newReason) 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 const id = hiddendata.data.find(d => d.key == "openerid").value
@@ -278,9 +265,9 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
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 hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value const ticketId = hiddendata.data.find(d => d.key == "type").value
const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId) const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
require("./api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData}) 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 const id = hiddendata.data.find(d => d.key == "openerid").value
@@ -298,10 +285,11 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
if (enableTranscript == true && mode != "deletenotranscript"){ if (enableTranscript == true && mode != "deletenotranscript"){
const transcriptReason = (mode == "close") ? "**"+l.messages.reason+":** "+newReason : "**"+l.messages.reason+":** none" const transcriptReason = (mode == "close") ? "**"+l.messages.reason+":** "+newReason : "**"+l.messages.reason+":** "+l.messages.none
const closedByPrefix = (mode.startsWith("delete")) ? "deleted by" : "closed by"
if (config.system.enable_transcript || config.system.enable_DM_transcript){ if (config.system.enable_transcript || config.system.enable_DM_transcript){
var fileattachment = await require("./transcript").createTranscript(channelmessages,channel) var fileattachment = await require("../transcript").createTranscript(channelmessages,channel)
if (fileattachment == false){log("system","internal error: transcript is not created!");return} if (fileattachment == false){log("system","internal error: transcript is not created!");return}
} }
@@ -311,7 +299,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
.setColor(config.main_color) .setColor(config.main_color)
.setTitle("📄 "+l.messages.newTranscriptTitle) .setTitle("📄 "+l.messages.newTranscriptTitle)
.setDescription(transcriptReason) .setDescription(transcriptReason)
.setFooter({text:"closed by: "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()}) .setFooter({text:closedByPrefix+": "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()})
guild.channels.cache.find(c => c.id == config.system.transcript_channel).send({ guild.channels.cache.find(c => c.id == config.system.transcript_channel).send({
embeds:[transcriptEmbed], embeds:[transcriptEmbed],
@@ -324,7 +312,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
.setColor(config.main_color) .setColor(config.main_color)
.setTitle("📄 "+l.messages.newTranscriptTitle) .setTitle("📄 "+l.messages.newTranscriptTitle)
.setDescription(transcriptReason) .setDescription(transcriptReason)
.setFooter({text:"closed by: "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()}) .setFooter({text:closedByPrefix+": "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()})
if (!isDatabaseError) ticketOpener.send({ if (!isDatabaseError) ticketOpener.send({
embeds:[transcriptEmbed], embeds:[transcriptEmbed],
@@ -340,6 +328,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
//await timer() //await timer()
setTimeout(async () => { setTimeout(async () => {
pendingDelete.shift()
await channel.delete() await channel.delete()
},6000) },6000)
} }
@@ -1,22 +1,34 @@
const discord = require('discord.js') const discord = require('discord.js')
const bot = require('../index') const bot = require('../../index')
const client = bot.client const client = bot.client
const config = bot.config const config = bot.config
const l = bot.language const l = bot.language
const log = bot.errorLog.log const log = bot.errorLog.log
const getconfigoptions = require("./getoptions") const configParser = require("../utils/configParser")
const storage = bot.storage const storage = bot.storage
module.exports = () => { module.exports = () => {
//dropdown placeholder
client.on("interactionCreate",(interaction) => {
if (!interaction.isSelectMenu()) return
if (interaction.customId != "OTdropdownMenu") return
if (interaction.values.includes("OTChooseTicket")) interaction.deferUpdate()
})
var closeButton = bot.buttons.firstmsg.firstmsgRowNormal var closeButton = bot.buttons.firstmsg.firstmsgRowNormal
//ticket button click / create ticket //ticket button click / create ticket
client.on("interactionCreate",(interaction) => { client.on("interactionCreate",async (interaction) => {
if (interaction.isChatInputCommand() && (interaction.commandName == "new" || interaction.commandName == "ticket")){ if (interaction.isChatInputCommand() && (interaction.commandName == "new" || interaction.commandName == "ticket")){
var customId = "OTnewT"+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 if (interaction.isSelectMenu() && (interaction.customId == "OTdropdownMenu")){
var customId = interaction.values[0]
}else return }else return
if (interaction.isButton()){ if (interaction.isButton()){
@@ -30,17 +42,19 @@ module.exports = () => {
} }
if (getconfigoptions.getTicketValues("id").includes(customId)){ if (configParser.getTicketValuesArray("id").includes(customId)){
//ticketoptions from config //ticketoptions from config
const currentTicketOptions = getconfigoptions.getOptionsById(customId) const currentTicketOptions = configParser.getTicketById(customId)
if (currentTicketOptions == false || currentTicketOptions.type != "ticket") return interaction.reply({embeds:[bot.errorLog.serverError(l.errors.anotherOption)]}) if (currentTicketOptions == false) return interaction.reply({embeds:[bot.errorLog.serverError(l.errors.anotherOption)]})
if (interaction.isButton()){ if (interaction.isButton()){
interaction.deferUpdate() interaction.deferUpdate()
}else if (interaction.isChatInputCommand()){ }else if (interaction.isChatInputCommand()){
interaction.reply({embeds:[bot.errorLog.success(l.messages.createdTitle,l.messages.createdDescription)]}) interaction.reply({embeds:[bot.errorLog.success(l.messages.createdTitle,l.messages.createdDescription)]})
}else if (interaction.isSelectMenu()){
await interaction.deferUpdate()
} }
if (storage.get("ticketStorage",interaction.member.id) == null || storage.get("ticketStorage",interaction.member.id) == "false"|| Number(storage.get("ticketStorage",interaction.member.id)) < config.system.max_allowed_tickets){ if (storage.get("ticketStorage",interaction.member.id) == null || storage.get("ticketStorage",interaction.member.id) == "false"|| Number(storage.get("ticketStorage",interaction.member.id)) < config.system.max_allowed_tickets){
@@ -181,7 +195,7 @@ module.exports = () => {
}) })
log("system","created new ticket",[{key:"ticket",value:ticketName},{key:"user",value:interaction.user.tag}]) 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}) require("../api/modules/events").onTicketOpen(interaction.user,ticketChannel,interaction.guild,new Date(),{name:ticketName,status:"open",ticketOptions:currentTicketOptions})
}) })
}else{ }else{
try { try {
+52
View File
@@ -0,0 +1,52 @@
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
const pfb = discord.PermissionFlagsBits
/**
*
* @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
-214
View File
@@ -1,214 +0,0 @@
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
const pfb = discord.PermissionFlagsBits
/**
*
* @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()
.addComponents(
new discord.ButtonBuilder()
.setCustomId("closeTicket")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setLabel(l.buttons.close)
.setEmoji("🔒")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("deleteTicket")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
var closeRowClosed = new discord.ActionRowBuilder()
.addComponents(
new discord.ButtonBuilder()
.setCustomId("deleteTicket1")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("sendTranscript")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setLabel(l.buttons.sendTranscript)
.setEmoji("📄")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("reopenTicket")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Success)
.setLabel(l.buttons.reopen)
.setEmoji("✔")
)
var reopenBar = new discord.ActionRowBuilder()
.addComponents(
new discord.ButtonBuilder()
.setCustomId("reopenTicketTrue")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("✅")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("reopenTicketFalse")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("❌")
)
var reopenBar1 = new discord.ActionRowBuilder()
.addComponents(
new discord.ButtonBuilder()
.setCustomId("reopenTicketTrue1")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("✅")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("reopenTicketFalse1")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("❌")
)
var reopenCommandBar = new discord.ActionRowBuilder()
.addComponents(
new discord.ButtonBuilder()
.setCustomId("reopenTicket1")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setEmoji("🔓")
)
//NORMAL WAY
client.on("interactionCreate",(interaction) => {
if (!interaction.isButton()) return
if (interaction.customId != "reopenTicket") return
interaction.deferUpdate()
interaction.message.edit({components:[reopenBar]})
})
client.on("interactionCreate",(interaction) => {
if (!interaction.isButton()) return
if (interaction.customId != "reopenTicketFalse") return
interaction.deferUpdate()
interaction.message.edit({components:[closeRowClosed]})
})
client.on("interactionCreate",(interaction) => {
if (!interaction.isButton()) return
if (interaction.customId != "reopenTicketTrue") return
interaction.deferUpdate()
const embed = new discord.EmbedBuilder()
.setColor(config.main_color)
.setTitle(":unlock: "+l.messages.reopenTitle+" :unlock:")
.setDescription(l.messages.reopenDescription)
interaction.message.edit({embeds:[embed],components:[closeRowNormal]})
reopenTicket(interaction.guild,interaction.channel,interaction.user)
})
//COMMAND WAY
client.on("interactionCreate",(interaction) => {
if (!interaction.isButton()) return
if (interaction.customId != "reopenTicket1") return
interaction.deferUpdate()
interaction.message.edit({components:[reopenBar1]})
})
client.on("interactionCreate",(interaction) => {
if (!interaction.isButton()) return
if (interaction.customId != "reopenTicketFalse1") return
interaction.deferUpdate()
interaction.message.edit({components:[reopenCommandBar]})
})
client.on("interactionCreate",(interaction) => {
if (!interaction.isButton()) return
if (interaction.customId != "reopenTicketTrue1") return
interaction.deferUpdate()
const embed = new discord.EmbedBuilder()
.setColor(config.main_color)
.setTitle(":unlock: "+l.messages.reopenTitle+" :unlock:")
.setDescription(l.messages.reopenDescription)
interaction.message.edit({content:null,embeds:[embed],components:[closeRowNormal]})
reopenTicket(interaction.guild,interaction.channel,interaction.user)
})
}
+156
View File
@@ -0,0 +1,156 @@
const bot = require("../../index")
const config = bot.config
const l = bot.language
//TYPEDEFS:
//==================
//OTTicketOptions
/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",color: String,adminroles: String[],channelprefix: String,category: String,message: String,enableDmOnOpen: Boolean,ticketmessage: String}} OTTicketOptions */
//OTRoleOptions
/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",color:"red"|"green"|"blue"|"gray"|"none",roles:String[],mode:"add&remove"|"remove"|"add",enableDmOnOpen:Boolean}} OTRoleOptions */
//OTWebsiteOptions
/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",url:String}} OTWebsiteOptions */
//OTConfigMessage
/**@typedef {{id: string, name: string, description: string, dropdown: boolean, enableFooter: boolean, footer: string, enableThumbnail: boolean, thumbnail: string, enableCustomColor: boolean, color: string, options: string[], enableTicketExplaination: boolean, enableMaxTicketsWarning: boolean}} OTConfigMessage*/
//StringOptions
/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDmOnOpen"|"ticketmessage"} OTTicketStringOptions */
/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"roles"|"mode"|"enableDmOnOpen"} OTRoleStringOptions */
/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"url"} OTWebsiteStringOptions */
//FUNCTIONS:
//==================
/** @param {String} id the id of the embed @returns {OTConfigMessage}*/
exports.getConfigMessage = (id) => {
var returned = config.messages.find(a => a.id == id)
if (returned){
return returned
}
var result = config.messages[0]
if (!result){
throw new Error("'messages' object in config.json is empty")
return
}
return result
}
/**
*
* @param {String} id
* @param {Boolean} withoutOTnewT
* @returns {OTTicketOptions|false}
*/
exports.getTicketById = (id,withoutOTnewT) => {
var result = false
if (withoutOTnewT){
config.options.forEach((option) => {
if (option.id == id && option.type == "ticket"){
result = option
}
})
}else{
config.options.forEach((option) => {
if ("OTnewT"+option.id == id && option.type == "ticket"){
result = option
}
})
}
return result
}
/**
*
* @param {String} id
* @param {Boolean} withoutOTnewR
* @returns {OTRoleOptions|false}
*/
exports.getRoleById = (id,withoutOTnewR) => {
var result = false
if (withoutOTnewR){
config.options.forEach((option) => {
if (option.id == id && option.type == "role"){
result = option
}
})
}else{
config.options.forEach((option) => {
if ("OTnewR"+option.id == id && option.type == "role"){
result = option
}
})
}
return result
}
/**
*
* @param {String} id
* @returns {OTWebsiteOptions|false}
*/
exports.getWebsiteById = (id) => {
var result = false
config.options.forEach((option) => {
if (option.id == id && option.type == "website"){
result = option
}
})
return result
}
/**
* @param {OTTicketStringOptions} value
* @returns {String[]}
*/
exports.getTicketValuesArray = (value,idWithoutOTnewT) => {
var result = []
const prefix = idWithoutOTnewT ? "" : "OTnewT"
config.options.forEach((opt) => {
if (opt.type == "ticket"){
if (value == "id"){
result.push(prefix+opt[value])
}else{
result.push(opt[value])
}
}
})
return result
}
/**
* @param {OTRoleStringOptions} value
* @returns {String[]}
*/
exports.getRoleValuesArray = (value,idWithoutOTnewR) => {
var result = []
const prefix = idWithoutOTnewR ? "" : "OTnewR"
config.options.forEach((opt) => {
if (o.type == "role"){
if (value == "id"){
result.push(prefix+opt[value])
}else{
result.push(opt[value])
}
}
})
return result
}
/**
* @param {OTWebsiteStringOptions} value
* @returns {String[]}
*/
exports.getWebsiteValuesArray = (value) => {
var result = []
config.options.forEach((opt) => {
if (o.type == "website"){
result.push(opt[value])
}
})
return result
}
+1 -2
View File
@@ -1,7 +1,6 @@
const discord = require("discord.js") const discord = require("discord.js")
const bot = require("../../index") const bot = require("../../index")
const config = bot.config const config = bot.config
const getoptions = require("../getoptions")
const l = bot.language const l = bot.language
/**@returns {"DANGER"|"SUCCESS"|"PRIMARY"|"SECONDARY"} */ /**@returns {"DANGER"|"SUCCESS"|"PRIMARY"|"SECONDARY"} */
@@ -81,7 +80,7 @@ exports.rawButtonData = class {
this.type = "" this.type = ""
this.color = "" this.color = ""
this.enableDMMessage = true this.enableDmOnOpen = true
this.url = "" this.url = ""
this.roles = ["",""] this.roles = ["",""]
this.mode = "" this.mode = ""
+46
View File
@@ -0,0 +1,46 @@
const discord = require("discord.js")
const bot = require("../../index")
const config = bot.config
const l = bot.language
const configParser = require("./configParser")
/**
*
* @param {String[]} ids
* @returns {discord.SelectMenuBuilder|false}
*/
exports.getDropdown = (ids) => {
const dropdown = new discord.SelectMenuBuilder()
.setCustomId("OTdropdownMenu")
.setDisabled(false)
.setMaxValues(1)
.setMinValues(1)
.setPlaceholder("Choose a ticket")
.addOptions(
new discord.SelectMenuOptionBuilder()
.setDefault(true)
.setLabel("Choose a ticket")
.setValue("OTChooseTicket")
)
ids.forEach((id) => {
const option = configParser.getTicketById(id,true)
if (option){
const selectComponent = new discord.SelectMenuOptionBuilder()
.setDefault(false)
.setValue("OTnewT"+option.id)
if (!option.label && !option.icon){
selectComponent.setLabel("OT ERROR: no description/emoji")
}else{
if (option.label) selectComponent.setLabel(option.label)
if (option.icon) selectComponent.setEmoji(option.icon)
}
dropdown.addOptions(selectComponent)
}
})
return dropdown
}
@@ -1,8 +1,8 @@
const discord = require('discord.js') const discord = require('discord.js')
const bot = require('../index') const bot = require('../../index')
const client = bot.client const client = bot.client
const config = bot.config const config = bot.config
const getButton = require("./utils/getButton") const getButton = require("./getButton")
const l = bot.language const l = bot.language
/** /**
@@ -16,7 +16,7 @@ const l = bot.language
exports.createEmbed = (id) => { exports.createEmbed = (id) => {
//----------------------------------- //-----------------------------------
//general importing //general importing
const data = require("./utils/getTicketMessages").getTicketMessage(id) const data = require("./configParser").getConfigMessage(id)
/**@type {discord.ButtonBuilder[]}*/ /**@type {discord.ButtonBuilder[]}*/
var buttons = [] var buttons = []
/**@type {getButton.rawButtonData[]} */ /**@type {getButton.rawButtonData[]} */
@@ -63,28 +63,40 @@ exports.createEmbed = (id) => {
embed.setDescription(description) embed.setDescription(description)
//----------------------------------- //-----------------------------------
//----------------------------------- //-----------------------------------
//create the components //create the components IF DROPDOWN IS FALSE
var AmountOfRows = Math.ceil(buttons.length / 4) if (!data.dropdown){
var currentRow = 0 var AmountOfRows = Math.ceil(buttons.length / 4)
var currentRow = 0
/** /**
* @type {discord.MessageActionRow[]} * @type {discord.MessageActionRow[]}
*/ */
var componentRows = [] var componentRows = []
for (let i = AmountOfRows; i > 0; i--){ for (let i = AmountOfRows; i > 0; i--){
componentRows.push(new discord.ActionRowBuilder()) componentRows.push(new discord.ActionRowBuilder())
}
buttons.forEach((button,index) => {
componentRows[currentRow].addComponents([button])
if (index == 3 || index == 7 || index == 11 || index == 15 || index == 19 || index == 23 || index == 27 || index == 31 || index == 35 || index == 39){
currentRow = currentRow + 1
} }
})
buttons.forEach((button,index) => {
componentRows[currentRow].addComponents([button])
if (index == 3 || index == 7 || index == 11 || index == 15 || index == 19 || index == 23 || index == 27 || index == 31 || index == 35 || index == 39){
currentRow = currentRow + 1
}
})
//create the component IF DROPDOWN is true
}else{
const ids = data.options
const dropdown = require("./getDropdown").getDropdown(ids)
var componentRows = [
new discord.ActionRowBuilder()
.setComponents(dropdown)
]
}
//----------------------------------- //-----------------------------------
-16
View File
@@ -1,16 +0,0 @@
const bot = require("../../index")
const config = bot.config
const l = bot.language
exports.getTicketMessage = (input) => {
var returned = config.messages.find(a => a.id == input)
if (returned){
return returned
}
var result = config.messages[0]
if (!result){
throw new Error("'messages' object in config.json is empty")
return
}
return result
}
+14
View File
@@ -49,4 +49,18 @@ exports.writeHiddenData = (type,data) => {
const result = "[ ](OTDATA|"+type+"//"+datastring+")" const result = "[ ](OTDATA|"+type+"//"+datastring+")"
return result return result
}
/**
*
* @param {String} description
* @returns {{description:String,hiddenData:hiddenData}}
*/
exports.removeHiddenData = (description) => {
const hiddenData = this.readHiddenData(description)
const splitted = description.split("[ ](OTDATA")
const original = splitted[0]
return {description:original,hiddenData:hiddenData}
} }
+15
View File
@@ -0,0 +1,15 @@
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
}
module.exports = async () => {
const chalk = await loadChalk()
//LIVESTATUS SOON
}
-19
View File
@@ -1,19 +0,0 @@
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"))
}
}
+60 -28
View File
@@ -9,8 +9,7 @@
// | \____/ | | | | | | | \ | // | \____/ | | | | | | | \ |
// \__________/ |__| \__________| |__| \___| // \__________/ |__| \__________| |__| \___|
const discord = require("discord.js")
const discord = require('discord.js')
const fs = require('fs') const fs = require('fs')
const {GatewayIntentBits,Partials} = discord const {GatewayIntentBits,Partials} = discord
const client = new discord.Client({ const client = new discord.Client({
@@ -25,35 +24,58 @@ const client = new discord.Client({
partials:[Partials.Channel,Partials.Message] partials:[Partials.Channel,Partials.Message]
}) })
exports.client = client exports.client = client
client.setMaxListeners(50) client.setMaxListeners(50)
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","created client")
if (process.argv[2]){ var tempconfig = require("./config.json")
if (process.argv[2].endsWith("d")){ /**@type {Boolean} */
var isDev = true var isDevConfig = false
console.log("starting in dev mode...")
}else{var isDev = false}
}else{var isDev = false}
exports.developerMode = isDev if (process.argv.some((v) => v == "--devconfig")){
async function logFLAGS(){
const chalk = await (await import("chalk")).default
console.log(chalk.blue("[FLAGS] => used dev config instead of normal config"))
}; logFLAGS()
isDevConfig = true
try{
tempconfig = require("./devConfig.json")
}catch{tempconfig = require("./config.json")}
}else{
tempconfig = require("./config.json")
}
if (process.argv.some((v) => v == "--nochecker")){
async function logFLAGS(){
const chalk = await (await import("chalk")).default
console.log(chalk.blue("[FLAGS] => disabled checker.js"))
}; logFLAGS()
}
if (process.argv.some((v) => v == "--debug")){
async function logFLAGS(){
const chalk = await (await import("chalk")).default
console.log(chalk.blue("[FLAGS] => enabled DEBUG mode"))
}; logFLAGS()
}
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded flags")
exports.developerConfig = isDevConfig
const language = require("./core/languageManager").language const language = require("./core/languageManager").language
exports.language = language exports.language = language
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded language")
if (isDev){ const config = tempconfig
try {
var config = require('./devConfig.json')
}catch{
console.log("devConfig.json not found! Trying the normal config...")
var config = require("./config.json")
}
}else{var config = require('./config.json')}
exports.config = config exports.config = config
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded config")
exports.storage = require('./core/dynamicdatabase/storage') exports.storage = require('./core/dynamicdatabase/storage')
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded storage")
exports.errorLog = require("./core/errorLogSystem") exports.errorLog = require("./core/errorLogSystem")
const log = this.errorLog.log const log = this.errorLog.log
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","LOADED LOGGING SYSTEM")
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","switching to new logs")
this.errorLog.log("debug","loaded new logs")
exports.hiddenData = require("./core/utils/hiddendata") exports.hiddenData = require("./core/utils/hiddendata")
this.errorLog.log("debug","loaded hiddendataTM")
exports.embeds = { exports.embeds = {
commands:require("./core/interactionHandlers/embeds/commands") commands:require("./core/interactionHandlers/embeds/commands")
@@ -63,8 +85,10 @@ exports.buttons = {
firstmsg:require("./core/interactionHandlers/buttons/firstmsg"), firstmsg:require("./core/interactionHandlers/buttons/firstmsg"),
verifybars:require("./core/interactionHandlers/buttons/verifyBars") verifybars:require("./core/interactionHandlers/buttons/verifyBars")
} }
this.errorLog.log("debug","loaded buttons & embeds")
client.on('ready',async () => { client.on('ready',async () => {
this.errorLog.log("debug","client logged in")
var statusSet = false var statusSet = false
const setStatus = (type,text) => { const setStatus = (type,text) => {
if (statusSet == true) return if (statusSet == true) return
@@ -78,13 +102,15 @@ client.on('ready',async () => {
statusSet = true statusSet = true
log("system","loaded status",[{key:"type",value:type},{key:"text",value:text}]) log("system","loaded status",[{key:"type",value:type},{key:"text",value:text}])
} }
this.errorLog.log("debug","bot status loaded")
const chalk = await (await import("chalk")).default const chalk = await (await import("chalk")).default
if (!process.argv[2]){ if (!process.argv[2]){
console.log(chalk.red("WELCOME TO OPEN TICKET!")) console.log(chalk.red("WELCOME TO OPEN TICKET!"))
this.errorLog.log("debug","loaded console interface")
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")() require("./core/utils/liveStatus")()
console.log(chalk.blue("\n\nlogs:")+"\n============") console.log(chalk.blue("\n\nlogs:")+"\n============")
if (config.status.enabled){ if (config.status.enabled){
@@ -105,8 +131,9 @@ 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!"))
this.errorLog.log("debug","loaded console interface")
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")() require("./core/utils/liveStatus")()
console.log(chalk.blue("\n\nlogs:")+"\n============") console.log(chalk.blue("\n\nlogs:")+"\n============")
if (config.status.enabled){ if (config.status.enabled){
@@ -118,6 +145,7 @@ client.on('ready',async () => {
await client.guilds.cache.find((g) => g.id == config.server_id).members.fetch() await client.guilds.cache.find((g) => g.id == config.server_id).members.fetch()
}else{ }else{
console.log(chalk.red("STARTING IN ")+chalk.blue("SLASH MODE")+chalk.red("...")) console.log(chalk.red("STARTING IN ")+chalk.blue("SLASH MODE")+chalk.red("..."))
this.errorLog.log("debug","slashmode activated")
console.log("logs:\n================") console.log("logs:\n================")
console.log("client logged in...") console.log("client logged in...")
console.log("loading files...") console.log("loading files...")
@@ -135,16 +163,17 @@ client.on('ready',async () => {
//load plugins //load plugins
require("./core/api/pluginlauncher")() require("./core/api/pluginlauncher")()
this.errorLog.log("debug","loading plugins")
}) })
if (!isDev){
require("./core/checker").checker() require("./core/checker").checker()
} this.errorLog.log("debug","loading checker.js")
this.errorLog.log("debug","checking config...")
if (process.argv[2] && process.argv[2].startsWith("slash")){ if (process.argv[2] && process.argv[2].startsWith("slash")){
//do nothing //do nothing
}else{ }else{
this.errorLog.log("debug","LOADING COMMANDS")
//commands //commands
require('./commands/ticket')() require('./commands/ticket')()
require("./commands/help")() require("./commands/help")()
@@ -155,18 +184,19 @@ if (process.argv[2] && process.argv[2].startsWith("slash")){
require("./commands/remove")() require("./commands/remove")()
require("./commands/reopen")() require("./commands/reopen")()
this.errorLog.log("debug","LOADING CORE")
//core //core
require('./core/ticketOpener')() require('./core/ticketActions/ticketOpener')()
require("./core/ticketCloser").runThis()
//require("./core/closebuttons")() // => everything is now in ./core/interactionHandlers/
require("./core/reactionRoles")() require("./core/reactionRoles")()
require("./core/ticketReopener").runThis()
this.errorLog.log("debug","LOADING INTERACTION HANDLERS")
//InteractionHandlers //InteractionHandlers
require("./core/interactionHandlers/handlers/handlers")() require("./core/interactionHandlers/handlers/handlers")()
//require("./test")()
} }
this.errorLog.log("debug","loading api")
const APIEvents = require("./core/api/modules/events") const APIEvents = require("./core/api/modules/events")
const debugLog = (debugString) => { const debugLog = (debugString) => {
@@ -177,6 +207,7 @@ const errorLog = (errorString,stack) => {
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+"\nERROR: "+errorString+" STACK: "+stack) fs.writeFileSync("./openticketdebug.txt",content+"\nERROR: "+errorString+" STACK: "+stack)
} }
this.errorLog.log("debug","OT error system loaded successfully")
client.on("debug", async (message) => { client.on("debug", async (message) => {
if (message.startsWith("Provided token:")){ if (message.startsWith("Provided token:")){
@@ -194,4 +225,5 @@ process.on("uncaughtException",async (error,origin) => {
APIEvents.onError(error.name+": "+error.message,new Date()) APIEvents.onError(error.name+": "+error.message,new Date())
}) })
client.login(config.auth_token) client.login(config.auth_token)
this.errorLog.log("debug","login with token")
+68 -68
View File
@@ -1,75 +1,75 @@
{ {
"errors":{ "errors": {
"missingArgsTitle":"حجج باطلة", "missingArgsTitle": "قيمة غير صالحة!",
"missingArgsDescription":"حجة مفقودة", "missingArgsDescription": "قيمة مفقودة",
"noPermsTitle":"ليس لديك إذن", "noPermsTitle": "ليس لديك برمشنات !",
"noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!", "noPermsDescription": "أنت بحاجة الى برمشن `ADMINISTRATOR` او أن تكون في قائمة المسموح بهم!",
"noPermsDelete":"Only admins can delete a ticket!", "noPermsDelete": "فقط الإداريين يمكنهم حذف التكت!",
"chooseFromListTitle":"بطاقة التعريف غير صالحة", "chooseFromListTitle": "Invalid ID",
"chooseFromListDescription":"اختر أحد المعرفات أدناه:", "chooseFromListDescription": "قم بأختيار أحد من الأيديات من الأسفل:",
"boterror":"مشكلة في الروبوت", "boterror": "خلل في البوت !",
"notInTicketTitle":"أنت لست في تذكرة!", "notInTicketTitle": "انت لست في تكت!",
"notInTicketDescription":"هذا الأمر لا يعمل خارج التذاكر!", "notInTicketDescription": "هذا الأمر لا يعمل خارج التكت!",
"ticketDoesntExist":"هذه التذكرة لم تعد موجودة!", "ticketDoesntExist": "هذا التكت لم يعد فعال!",
"roleDoesntExist":"هذا الدور لم يعد موجودًا!", "roleDoesntExist": "خطاً ,لم تعد الرتبة موجوده!",
"anotherOption":"هذا الخيار ليس تذكرة بل نوع آخر!", "anotherOption": "هذا الخيار ليس التكت و لكنه شيء أخر!",
"maxAmountTitle":"بلغ الحد الأقصى!", "maxAmountTitle": "خطأ , تم الوصول الى الحد الأقصى!",
"maxAmountDescription":"لقد وصلت إلى الحد الأقصى لعدد التذاكر المسموح بها!\nلذلك لا يمكنك إنشاء واحدة جديدة!", "maxAmountDescription": "لقد وصلت الى الحد الأقصى لعدد التكتات المسموحة بها!\nSo لا يمكنك فتح واحدة أخرى!",
"somethingWentWrong":"**هناك خطأ ما!**\nالرجاء المحاولة مرة أخرى!", "somethingWentWrong": "**هناك خطاً!**\nأعد المحاولة لاحقاً!",
"somethingWentWrongTranscript":"**حدث خطأ ما أثناء كتابة النص!**\nالرجاء المحاولة مرة أخرى!" "somethingWentWrongTranscript": "هناك خطاً في محاولة طبع التكت!**\nأعد المحاولة لاحقاً!"
}, },
"commands":{ "commands": {
"userAddedTitle":"Added {0} to this ticket!", "userAddedTitle": "تم أضافة {0} من المستخدمين في التكت!",
"userRemovedTitle":"Removed {0} from this ticket!", "userRemovedTitle": "تم أزالة {0} من المستخدمين من التكت!",
"renameTitle":"Changed the name to {0}!", "renameTitle": "تم تغيير أسم التكت الى {0}!",
"closeTitle":"Closed this ticket!", "closeTitle": "تم أغلاق التكت!",
"deleteTitle":"Deleting this ticket...", "deleteTitle": " جاري حذف التكت...",
"reopenTitle":"Re-Opened this ticket!", "reopenTitle": "إعادة فتح التكت!",
"ticketWarning":"The embed is in the message below!", "ticketWarning": "هذا الأمبد موجود بالفعل في الرسالة بالأسفل!",
"maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_" "maxTicketWarning": "**تحذير:** _يمكنك فقط فتح {0} تكت في الوقت!_"
}, },
"helpMenu":{ "helpMenu": {
"title":"Available Commands:", "title": "الأوامر المتاحة:",
"header1":"**اذهب إلى {0} لإنشاء تذكرة!**\n\n", "header1": "**أذهب الى {0} لإنشاء تذكرة!**\n\n",
"header2":"**قم بتشغيل الأمر `/new` أو `/ticket` لإنشاء تذكرة!**\n\n", "header2": "**قم بكتابة أمر `/new` او `/ticket` لفتح تكت!**\n\n",
"msgCmd":"تفرخ تضمين مع الأزرار. (المسؤولون فقط)", "msgCmd": "أنشاء أيمبد مع الأزرار. (الأداريين فقط)",
"renameCmd":"إعادة تسمية تذكرة. (بدون مسافات)", "renameCmd": "إعادة تسمية التكت. (بدون مسافات)",
"closeCmd":"أغلق التذكرة.", "closeCmd": "أغلاق التكت.",
"deleteCmd":"حذف التذكرة.", "deleteCmd": "حذف التكت.",
"addCmd":"أضف مستخدمًا إلى التذكرة.", "addCmd": "إضافة مستخدم الى التكت.",
"removeCmd":"إزالة مستخدم من التذكرة.", "removeCmd": "إزالة مستخدم من التكت.",
"reopenCmd":"أعد فتح التذكرة بعد إغلاقه." "reopenCmd": "إعادة فتح تكت بعد إغلاقة."
}, },
"buttons":{ "buttons": {
"close":"إغلاق التذكرة", "close": "إغلاق التكت",
"delete":"حذف التذكرة", "delete": "حذف التكت",
"reopen":"إعادة فتح التذكرة", "reopen": "إعادة فتح التكت",
"sendTranscript":"إرسال ملف النص" "sendTranscript": "طبع التكت"
}, },
"messages":{ "messages": {
"reopenTitle":"أعيد فتح هذه التذكرة!", "reopenTitle": "تم إعادة فتح التكت بنجاح!",
"reopenDescription":"لا تتردد في التحدث مرة أخرى!", "reopenDescription": "لا تتردد في فتح التكت مرة أخرى , حظاً موفقاً!",
"closedTitle":"أغلقت هذه التذكرة!", "closedTitle": "تم إغلاق التكت!",
"closedDescription":"يمكن للمسؤولين فقط التحدث في هذه التذكرة الآن!\n\n*انقر فوق الزر أدناه لحذف هذه التذكرة أو إعادة فتحها!*", "closedDescription": "فقط الأداريين يمكنهم التحدث في هذا التكت الأن!\n\n*أضغط على الزر بالأسفل لحذف التكت او إعادة فتحة مجدداً!*",
"createdTitle":"تم إنشاء التذكرة!", "createdTitle": "تم إنشاء تكت!",
"createdDescription":"تم إنشاء تذكرتك ، يمكنك اكتشافها عن طريق ping", "createdDescription": "تم أنشاء تكت , قم بأنتظار الدعم في الطريق!",
"newTicketDmTitle":"تذكرة جديدة!", "newTicketDmTitle": "تكت جديد!",
"closedTicketDmTitle":"تم إغلاق التذكرة!", "closedTicketDmTitle": "تم إغلاق التكت!",
"deletedTicketDmTitle":"تم حذف التذكرة!", "deletedTicketDmTitle": "تم حذف التكت!",
"closedTicketDmDescription":"تم إغلاق تذكرتك!", "closedTicketDmDescription": "تم أغلاق تذكرتك من قبل إداري",
"deletedTicketDmDescription":"تم حذف تذكرتك!", "deletedTicketDmDescription": "تم حذف تذكرتك من قبل إداري!",
"reopenTicketDmTitle":"أعيد فتح التذكرة!", "reopenTicketDmTitle": "تم إعادة فتح تذكرتك!",
"reopenTicketDmDescription":"تم إعادة فتح تذكرتك!", "reopenTicketDmDescription": "تم إعادة فتح التكت!",
"newTranscriptTitle":"نسخة جديدة هنا!", "newTranscriptTitle": "توجد نسخة تكت جديدة هنا!",
"hereIsTheTranscript":"هذا هو النص:", "hereIsTheTranscript": "هذا هي النسخة:",
"chooseCategory":"اختر فئة:", "chooseCategory": "أختر الكتقاجوري:",
"gettingdeleted":"...يتم حذف التذكرة", "gettingdeleted": "يتم حذف التكت...",
"none":"none", "none": "لا يوجد",
"reason":"reason" "reason": "سبب"
} }
} }
+1 -1
View File
@@ -27,7 +27,7 @@
"reopenTitle":"Reabriu este ticket!", "reopenTitle":"Reabriu este ticket!",
"ticketWarning":"A incorporação está na mensagem abaixo!", "ticketWarning":"A incorporação está na mensagem abaixo!",
"maxTicketWarning":"**Cuidado:** _Você só pode criar {0} tickets) de cada vez!!_" "maxTicketWarning":"**Cuidado:** _Você só pode criar {0} ticket(s) de cada vez!!_"
}, },
"helpMenu":{ "helpMenu":{
"title":"Comandos Disponíveis:", "title":"Comandos Disponíveis:",