v3.3 push 4 (1 entire afternoon of work)

My TODO list is too big :)
This commit is contained in:
DJj123dj
2023-03-15 20:57:14 +01:00
parent 944032f690
commit f67af805c1
30 changed files with 275 additions and 158 deletions
+2 -2
View File
@@ -15,10 +15,10 @@ module.exports = () => {
const prefix = config.system.showSlashcmdsInHelp ? "/" : config.prefix const prefix = config.system.showSlashcmdsInHelp ? "/" : config.prefix
const helpEmbed = new discord.EmbedBuilder() const helpEmbed = new discord.EmbedBuilder()
.setColor(config.main_color) .setColor(config.color)
.setTitle("❔ "+l.helpMenu.title) .setTitle("❔ "+l.helpMenu.title)
const header = config.system.ticket_channel ? l.helpMenu.header1.replace("{0}","<#"+config.system.ticket_channel+">") : l.helpMenu.header2 const header = l.helpMenu.header2
helpEmbed.setDescription(header+"`"+prefix+msgName+" <id>` ➜ _"+l.helpMenu.msgCmd+"_\n\n`"+prefix+"rename <name>` ➜ _"+l.helpMenu.renameCmd+"_\n`"+prefix+"close` ➜ _"+l.helpMenu.closeCmd+"_\n`"+prefix+"delete` ➜ _"+l.helpMenu.deleteCmd+"_\n`"+prefix+"reopen` ➜ _"+l.helpMenu.reopenCmd+"_\n\n`"+prefix+"add <user>` ➜ _"+l.helpMenu.addCmd+"_\n`"+prefix+"remove <user>` ➜ _"+l.helpMenu.removeCmd+"_\n\n`"+prefix+"change <newtype>` ➜ _Change ticket type._") helpEmbed.setDescription(header+"`"+prefix+msgName+" <id>` ➜ _"+l.helpMenu.msgCmd+"_\n\n`"+prefix+"rename <name>` ➜ _"+l.helpMenu.renameCmd+"_\n`"+prefix+"close` ➜ _"+l.helpMenu.closeCmd+"_\n`"+prefix+"delete` ➜ _"+l.helpMenu.deleteCmd+"_\n`"+prefix+"reopen` ➜ _"+l.helpMenu.reopenCmd+"_\n\n`"+prefix+"add <user>` ➜ _"+l.helpMenu.addCmd+"_\n`"+prefix+"remove <user>` ➜ _"+l.helpMenu.removeCmd+"_\n\n`"+prefix+"change <newtype>` ➜ _Change ticket type._")
var otherprefix = prefix.endsWith(" ") ? prefix.substring(0,prefix.length-1) : prefix var otherprefix = prefix.endsWith(" ") ? prefix.substring(0,prefix.length-1) : prefix
+12 -11
View File
@@ -1,10 +1,13 @@
{ {
"main_color":"#ffffff", "color":"#ffffff",
"server_id":"server id (for slash cmds)", "serverId":"server id (for slash cmds)",
"auth_token":"auth token", "token":{
"main_adminroles":["discord role id"], "value":"insert your bot token here",
"fromENV":false
},
"adminRoles":["discord role id"],
"prefix":"!ticket ", "prefix":"!ticket ",
"languagefile":"english", "languageFile":"english",
"status":{ "status":{
"enabled":true, "enabled":true,
@@ -13,13 +16,11 @@
}, },
"system":{ "system":{
"ticket_channel":"channel id", "maxAmountOfTickets":3,
"max_allowed_tickets":3, "dmMessages":false,
"enable_DM_Messages":false,
"has@everyoneaccess":false, "memberRole":"member role (leave empty if you have no member role)",
"member_role":"member role (this role doesn't have access to tickets)", "closeMode":"adminonly OR normal (select one!)",
"closeMode":"adminonly or normal (select one of the 2)",
"transcripts":"!!!! ALL SETTINGS FOR TRANSCRIPTS ARE LOCATED IN: transcriptconfig.json !!!!", "transcripts":"!!!! ALL SETTINGS FOR TRANSCRIPTS ARE LOCATED IN: transcriptconfig.json !!!!",
-8
View File
@@ -1,8 +0,0 @@
/** FOR DEVELOPERS ONLY!!
* Don't change anything in this file before reading the documentation!
* visit the api documentation at https://docs.openticket.dj-dj.be
*/
exports.embeddedMode = false
exports.clientLocation = require("../../../index").client
+30 -33
View File
@@ -53,9 +53,9 @@ exports.checker = async () => {
/**@param {String} value */ /**@param {String} value */
const checkToken = (value) => { const checkToken = (value) => {
if (value.length < 40){ if (value.length < 40){
createError("'auth_token' | your token is invalid") createError("'token/value' | your token is invalid")
} }
if (value.includes(" ")) createError("'auth_token' | your token includes spaces!") if (value.includes(" ")) createError("'token/value' | your token includes spaces!")
} }
/**@param {String} value @param {String} path */ /**@param {String} value @param {String} path */
@@ -119,24 +119,29 @@ exports.checker = async () => {
if (type == "boolean"){ if (type == "boolean"){
if (typeof value != "boolean"){ if (typeof value != "boolean"){
createError("'"+path+"' | invalid type, this must be a boolean!") createError("'"+path+"' | invalid type, this must be a boolean!")
} return true
}else return false
}else if (type == "number"){ }else if (type == "number"){
if (typeof value != "number"){ if (typeof value != "number"){
createError("'"+path+"' | invalid type, this must be a number!") createError("'"+path+"' | invalid type, this must be a number!")
} return true
}else return false
}else if (type == "string"){ }else if (type == "string"){
if (typeof value != "string"){ if (typeof value != "string"){
createError("'"+path+"' | invalid type, this must be a string!") createError("'"+path+"' | invalid type, this must be a string!")
} return true
}else return false
}else if (type == "array"){ }else if (type == "array"){
if (!Array.isArray(value)){ if (!Array.isArray(value)){
createError("'"+path+"' | invalid type, this must be an array!") createError("'"+path+"' | invalid type, this must be an array!")
} return true
}else return false
}else if (type == "object"){ }else if (type == "object"){
if (typeof value != "object"){ if (typeof value != "object"){
createError("'"+path+"' | invalid type, this must be an object!") createError("'"+path+"' | invalid type, this must be an object!")
} return true
} }else return false
}else return false
} }
const checkButtonColor = (value,path) => { const checkButtonColor = (value,path) => {
@@ -337,6 +342,7 @@ exports.checker = async () => {
} }
//OPTIONS!!! //OPTIONS!!!
if (checkType(input.options,"array",path+"/options")){
var counter = 0 var counter = 0
input.options.forEach((option) => {if (!configParser.optionExists(option)){counter++}}) input.options.forEach((option) => {if (!configParser.optionExists(option)){counter++}})
@@ -349,6 +355,7 @@ exports.checker = async () => {
} }
}) })
} }
}
//other //other
//ticket explaination & max tickets warning //ticket explaination & max tickets warning
@@ -393,24 +400,24 @@ exports.checker = async () => {
//--------------------------| //--------------------------|
//--------------------------| //--------------------------|
var configArray = ["main_color","server_id","auth_token","main_adminroles","prefix","languagefile","status","system","options","messages"] var configArray = ["color","serverId","token","adminRoles","prefix","languageFile","status","system","options","messages"]
configArray.forEach((item) => { configArray.forEach((item) => {
if (config[item] == undefined){ if (config[item] == undefined){
throw new Error("\n\nMAIN ERROR: the item '"+item+"' doesn't exist in config.json") throw new Error("\n\nMAIN ERROR: the item '"+item+"' doesn't exist in config.json")
} }
}) })
checkHexColor(config.main_color,"main_color") checkHexColor(config.color,"main_color")
checkDiscord("serverid",config.server_id,"server_id") checkDiscord("serverid",config.serverId,"server_id")
if (!require("./api/api.json").disable.checkerjs.token) checkToken(config.auth_token) if (!require("./api/api.json").disable.checkerjs.token && !config.token.fromENV) checkToken(config.token.value)
checkType(config.main_adminroles,"array","/main_adminroles") checkType(config.adminRoles,"array","/main_adminroles")
checkDiscordArray("roleid",config.main_adminroles,"main_adminroles") checkDiscordArray("roleid",config.adminRoles,"main_adminroles")
checkString(config.prefix,1,15,"prefix","prefix") checkString(config.prefix,1,15,"prefix","prefix")
//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") && !lf.startsWith("french") && !lf.startsWith("italian") && !lf.startsWith("czech") && !lf.startsWith("danish") && !lf.startsWith("russian") && !lf.startsWith("turkish") && !lf.startsWith("polish")){ 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") && !lf.startsWith("italian") && !lf.startsWith("czech") && !lf.startsWith("danish") && !lf.startsWith("russian") && !lf.startsWith("turkish") && !lf.startsWith("polish")){
createError("'languagefile' | invalid language, more info in the wiki") createError("'languagefile' | invalid language, more info in the wiki")
@@ -430,28 +437,18 @@ exports.checker = async () => {
//system: //system:
//ticket channel
if (config.system.ticket_channel){
if (config.system.ticket_channel.length < 16 || config.system.ticket_channel.length > 20 || !/^\d+$/.test(config.system.ticket_channel)){
createError("'system/ticket_channel' | this channel id is invalid")
}
}else createWarn("'"+path+"' | you have no ticket channel selected!")
//max tickets //max tickets
checkType(config.system.max_allowed_tickets,"number","system/max_allowed_tickets") checkType(config.system.maxAmountOfTickets,"number","system/maxAmountOfTickets")
//enableDMmessages //enableDMmessages
checkType(config.system.enable_DM_Messages,"boolean","system/enable_DM_Messages") checkType(config.system.dmMessages,"boolean","system/dmMessages")
//has@everyoneaccess //memberRole
checkType(config.system["has@everyoneaccess"],"boolean","system/has@everyoneaccess") checkType(config.system.memberRole,"string","system/memberRole")
if (config.system.memberRole && ![" ","0","false","null","undefined"].includes(config.system.memberRole)){
//member_role checkDiscord("roleid",config.system.memberRole,"system/memberRole")
checkType(config.system.member_role,"string","system/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"){
checkDiscord("roleid",config.system.member_role,"system/member_role")
}else{ }else{
createWarn("'system/member_role' | You don't have a member role, but it's recommended!") createWarn("'system/memberRole' | You don't have a member role, but it's recommended!")
} }
//closemode //closemode
+1 -1
View File
@@ -67,7 +67,7 @@ exports.notInATicket = new embed()
/**@param {String} message @param {String} title */ /**@param {String} message @param {String} title */
exports.success = (title,message) => { exports.success = (title,message) => {
var x = new embed() var x = new embed()
.setColor(config.main_color) .setColor(config.color)
.setTitle(":white_check_mark: "+title) .setTitle(":white_check_mark: "+title)
.setDescription(message) .setDescription(message)
+1 -1
View File
@@ -7,7 +7,7 @@ const log = bot.errorLog.log
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
+1 -1
View File
@@ -7,7 +7,7 @@ const log = bot.errorLog.log
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
@@ -8,7 +8,7 @@ const log = bot.errorLog.log
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
+1 -1
View File
@@ -7,7 +7,7 @@ const log = bot.errorLog.log
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
/** /**
* *
@@ -9,7 +9,7 @@ const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
@@ -9,7 +9,7 @@ const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
@@ -9,7 +9,7 @@ const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
@@ -9,7 +9,7 @@ const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
@@ -8,7 +8,7 @@ const log = bot.errorLog.log
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
@@ -8,7 +8,7 @@ const log = bot.errorLog.log
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
+3 -3
View File
@@ -7,8 +7,8 @@ if (index.developerConfig){
var localLanguage = require("../language/english.json") var localLanguage = require("../language/english.json")
const fs = require("fs") const fs = require("fs")
const lfexists = fs.existsSync("./language/"+config.languagefile+".json") const lfexists = fs.existsSync("./language/"+config.languageFile+".json")
if (lfexists) localLanguage = require("../language/"+config.languagefile+".json") if (lfexists) localLanguage = require("../language/"+config.languageFile+".json")
const errorLog = async () => { const errorLog = async () => {
const chalk = await (await import("chalk")).default const chalk = await (await import("chalk")).default
@@ -30,5 +30,5 @@ if (!localLanguage){
runError() runError()
}else{ }else{
exports.language = localLanguage exports.language = localLanguage
successLog(config.languagefile) successLog(config.languageFile)
} }
+1 -1
View File
@@ -8,7 +8,7 @@ const act = discord.ApplicationCommandType
const acot = discord.ApplicationCommandOptionType const acot = discord.ApplicationCommandOptionType
module.exports = async () => { module.exports = async () => {
const sid = config.server_id const sid = config.serverId
const ids = configParser.getTicketValuesArray("id") const ids = configParser.getTicketValuesArray("id")
/**@type {[{name:String,value:String}]} */ /**@type {[{name:String,value:String}]} */
+4 -3
View File
@@ -10,7 +10,7 @@ const acot = discord.ApplicationCommandOptionType
/**@param {Boolean|undefined} invisible*/ /**@param {Boolean|undefined} invisible*/
module.exports = async (invisible) => { module.exports = async (invisible) => {
const chalk = (await import("chalk")).default const chalk = (await import("chalk")).default
const sid = config.server_id const sid = config.serverId
const ids = configParser.getTicketValuesArray("id") const ids = configParser.getTicketValuesArray("id")
/**@type {[{name:String,value:String}]} */ /**@type {[{name:String,value:String}]} */
@@ -36,8 +36,6 @@ module.exports = async (invisible) => {
process.stdout.cursorTo(0) process.stdout.cursorTo(0)
process.stdout.write("[status] there are "+chalk.blue(readystats+" out of 13")+" commands ready! (this can take up to 40 seconds)") process.stdout.write("[status] there are "+chalk.blue(readystats+" out of 13")+" commands ready! (this can take up to 40 seconds)")
if (readystats >= 13){ if (readystats >= 13){
const fs = require("fs")
fs.writeFileSync("./storage/slashcmdEnabled.txt","true")
console.log(chalk.green("\nready!")) console.log(chalk.green("\nready!"))
console.log(chalk.blue("you can now start the bot with "+chalk.bgBlue("'npm start'")+"!")) console.log(chalk.blue("you can now start the bot with "+chalk.bgBlue("'npm start'")+"!"))
process.exit(1) process.exit(1)
@@ -45,6 +43,9 @@ module.exports = async (invisible) => {
},100) },100)
} }
const fs = require("fs")
fs.writeFileSync("./storage/slashcmdEnabled.txt",require("../../package.json").version)
//slashtranslation //slashtranslation
const ST = require("../../language/slashcmds/slash.json").data const ST = require("../../language/slashcmds/slash.json").data
+6 -4
View File
@@ -15,6 +15,7 @@ const showFlags = async (chalk) => {
if (process.argv.some((v) => v == "--tsoffline")) console.log(chalk.blue("[FLAGS] => offline check for html transcripts disabled!")); isFlag = true if (process.argv.some((v) => v == "--tsoffline")) console.log(chalk.blue("[FLAGS] => offline check for html transcripts disabled!")); isFlag = true
if (process.argv.some((v) => v == "--debug")) console.log(chalk.blue("[FLAGS] => enabled DEBUG mode")); isFlag = true if (process.argv.some((v) => v == "--debug")) console.log(chalk.blue("[FLAGS] => enabled DEBUG mode")); isFlag = true
if (process.argv.some((v) => v == "--noslash")) console.log(chalk.blue("[FLAGS] => slash commands disabled")); isFlag = true if (process.argv.some((v) => v == "--noslash")) console.log(chalk.blue("[FLAGS] => slash commands disabled")); isFlag = true
if (process.argv.some((v) => v == "--localstatus")) console.log(chalk.blue("[FLAGS] => using local livestatus.json")); isFlag = true
if (!isFlag) console.log(chalk.blue("no flags!")) if (!isFlag) console.log(chalk.blue("no flags!"))
} }
@@ -23,7 +24,7 @@ exports.run = async () => {
const chalk = await (await import("chalk")).default const chalk = await (await import("chalk")).default
console.log(chalk.hex("f8ba00")(logo)) console.log(chalk.hex("f8ba00")(logo))
const version = require("../package.json").version const version = require("../package.json").version
var headertext = "v"+version+" - Support: https://discord.dj-dj.be - Language: "+config.languagefile var headertext = "v"+version+" - Support: https://discord.dj-dj.be - Language: "+config.languageFile
const spaceamount = (84-headertext.length)/2 const spaceamount = (84-headertext.length)/2
var i = 0 var i = 0
while (i < spaceamount){ while (i < spaceamount){
@@ -63,14 +64,15 @@ exports.headerDataLanguage = async (message,err) => {
languageErr = err languageErr = err
} }
/** /**@param {{total:Number,error:Number,success:Number}} plugins*/
* @param {{total:Number,error:Number,success:Number}} plugins
*/
exports.headerDataPlugins = async (plugins) => { exports.headerDataPlugins = async (plugins) => {
const chalk = await (await import("chalk")).default const chalk = await (await import("chalk")).default
const lmsg = languageErr ? chalk.red(languageMSG) : languageMSG const lmsg = languageErr ? chalk.red(languageMSG) : languageMSG
console.log(chalk.hex("f8ba00")("language: ")+lmsg) console.log(chalk.hex("f8ba00")("language: ")+lmsg)
console.log(chalk.hex("f8ba00")("plugins loaded: ")+chalk.bold(plugins.total+" total ")+"("+plugins.success+"✅ "+plugins.error+"❌)") console.log(chalk.hex("f8ba00")("plugins loaded: ")+chalk.bold(plugins.total+" total ")+"("+plugins.success+"✅ "+plugins.error+"❌)")
console.log("\n"+chalk.bold(chalk.underline("LIVESTATUS:")))
await require("./utils/liveStatus").run(plugins)
console.log("\n"+chalk.bold(chalk.underline("LOGS:"))) console.log("\n"+chalk.bold(chalk.underline("LOGS:")))
} }
+3 -3
View File
@@ -119,7 +119,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
}) })
//add main adminroles //add main adminroles
config.main_adminroles.forEach((role,index) => { config.adminRoles.forEach((role,index) => {
try { try {
const adminrole = guild.roles.cache.find(r => r.id == role) const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return if (!adminrole) return
@@ -170,7 +170,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
*/ */
const ticketadmin = ticketData.adminroles const ticketadmin = ticketData.adminroles
ticketadmin.forEach((role,index) => { ticketadmin.forEach((role,index) => {
if (!config.main_adminroles.includes(role)){ if (!config.adminRoles.includes(role)){
try { try {
const adminrole = guild.roles.cache.find(r => r.id == role) const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return if (!adminrole) return
@@ -211,7 +211,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
) )
const embed = new discord.EmbedBuilder() const embed = new discord.EmbedBuilder()
.setColor(config.main_color) .setColor(config.color)
.setTitle(":lock: "+l.commands.closeTitle+" :lock:") .setTitle(":lock: "+l.commands.closeTitle+" :lock:")
.setDescription(l.messages.closedDescription) .setDescription(l.messages.closedDescription)
channel.send({embeds:[embed],components:[closeButtonRow]}) channel.send({embeds:[embed],components:[closeButtonRow]})
+12 -19
View File
@@ -63,7 +63,7 @@ module.exports = () => {
} catch{} } catch{}
} }
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.maxAmountOfTickets){
//update storage //update storage
storage.set("ticketStorage",interaction.member.id,Number(storage.get("ticketStorage",interaction.member.id))+1) storage.set("ticketStorage",interaction.member.id,Number(storage.get("ticketStorage",interaction.member.id))+1)
@@ -84,19 +84,12 @@ module.exports = () => {
const pfb = discord.PermissionFlagsBits const pfb = discord.PermissionFlagsBits
const guild = client.guilds.cache.find(g => g.id == interaction.guild.id) const guild = client.guilds.cache.find(g => g.id == interaction.guild.id)
//set everyone allowed //set @everyone no ticket access
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({ permissionsArray.push({
id:interaction.guild.roles.everyone, id:interaction.guild.roles.everyone,
type:"role", type:"role",
allow:everyoneAllowPerms, allow:[],
deny:everyoneDenyPerms deny:[pfb.ViewChannel]
}) })
//add the user that created the ticket //add the user that created the ticket
@@ -107,7 +100,7 @@ module.exports = () => {
}) })
//add main adminroles //add main adminroles
config.main_adminroles.forEach((role,index) => { config.adminRoles.forEach((role,index) => {
try { try {
const adminrole = guild.roles.cache.find(r => r.id == role) const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return if (!adminrole) return
@@ -128,7 +121,7 @@ module.exports = () => {
*/ */
const ticketadmin = currentTicketOptions.adminroles const ticketadmin = currentTicketOptions.adminroles
ticketadmin.forEach((role,index) => { ticketadmin.forEach((role,index) => {
if (!config.main_adminroles.includes(role)){ if (!config.adminRoles.includes(role)){
try { try {
const adminrole = guild.roles.cache.find(r => r.id == role) const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return if (!adminrole) return
@@ -145,9 +138,9 @@ module.exports = () => {
}) })
//add member role //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"){ if (config.system.memberRole && ![" ","0","false","null","undefined"].includes(config.system.memberRole)){
try { try {
const userrole = guild.roles.cache.find(r => r.id == config.system.member_role) const userrole = guild.roles.cache.find(r => r.id == config.system.memberRole)
if (userrole){ if (userrole){
permissionsArray.push({ permissionsArray.push({
id:userrole, id:userrole,
@@ -156,7 +149,7 @@ module.exports = () => {
}) })
} }
}catch{ }catch{
log("system","invalid role! At 'config.json => system/member_role") log("system","invalid role! At 'config.json => system/memberRole")
} }
} }
@@ -175,7 +168,7 @@ module.exports = () => {
var ticketEmbed = new discord.EmbedBuilder() var ticketEmbed = new discord.EmbedBuilder()
//.setAuthor({name:interaction.user.id}) //.setAuthor({name:interaction.user.id})
.setColor(config.main_color) .setColor(config.color)
.setTitle(currentTicketOptions.name) .setTitle(currentTicketOptions.name)
//.setFooter({text:"Ticket Type: "+currentTicketOptions.id}) //.setFooter({text:"Ticket Type: "+currentTicketOptions.id})
if (currentTicketOptions.ticketmessage.length > 0){ if (currentTicketOptions.ticketmessage.length > 0){
@@ -210,7 +203,7 @@ module.exports = () => {
]) ])
try{ try{
if (currentTicketOptions.enableDmOnOpen) interaction.member.send({embeds:[bot.errorLog.custom(l.messages.newTicketDmTitle,currentTicketOptions.message,":ticket:",config.main_color)],components:[channelbutton]}) if (currentTicketOptions.enableDmOnOpen) interaction.member.send({embeds:[bot.errorLog.custom(l.messages.newTicketDmTitle,currentTicketOptions.message,":ticket:",config.color)],components:[channelbutton]})
} }
catch{log("system","failed to send DM")} catch{log("system","failed to send DM")}
@@ -219,7 +212,7 @@ module.exports = () => {
}) })
}else{ }else{
try { try {
if (config.system.enable_DM_Messages){ if (config.system.dmMessages){
interaction.member.send({embeds:[bot.errorLog.warning(l.errors.maxAmountTitle,l.errors.maxAmountDescription)]}) interaction.member.send({embeds:[bot.errorLog.warning(l.errors.maxAmountTitle,l.errors.maxAmountDescription)]})
} }
} }
+3 -10
View File
@@ -19,19 +19,12 @@ const reopenTicket = (guild,channel,user) => {
var permissionsArray = [] var permissionsArray = []
//set everyone allowed //set @everyone no ticket access
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({ permissionsArray.push({
id:guild.roles.everyone, id:guild.roles.everyone,
type:"role", type:"role",
allow:everyoneAllowPerms, allow:[],
deny:everyoneDenyPerms deny:[pfb.ViewChannel]
}) })
channel.permissionOverwrites.cache.forEach((p) => { channel.permissionOverwrites.cache.forEach((p) => {
+2 -2
View File
@@ -22,7 +22,7 @@ exports.beingprocessed = (name,id,rawprocesstime,user) => {
const embed = new discord.EmbedBuilder() const embed = new discord.EmbedBuilder()
.setTitle("🧾 "+l.transcripts.title) .setTitle("🧾 "+l.transcripts.title)
.setColor(config.main_color) .setColor(config.color)
.setAuthor({name:user.tag,iconURL:user.displayAvatarURL()}) .setAuthor({name:user.tag,iconURL:user.displayAvatarURL()})
.setFooter({text:name}) .setFooter({text:name})
@@ -42,7 +42,7 @@ exports.beingprocessed = (name,id,rawprocesstime,user) => {
exports.tsready = (name,id,url,user) => { exports.tsready = (name,id,url,user) => {
const embed = new discord.EmbedBuilder() const embed = new discord.EmbedBuilder()
.setTitle("🧾 "+l.transcripts.title) .setTitle("🧾 "+l.transcripts.title)
.setColor(config.main_color) .setColor(config.color)
.setAuthor({name:user.tag,iconURL:user.displayAvatarURL()}) .setAuthor({name:user.tag,iconURL:user.displayAvatarURL()})
.setFooter({text:name}) .setFooter({text:name})
+14 -1
View File
@@ -26,7 +26,20 @@ exports.createTranscript = async (messagecollection,channel,backup) => {
messagecollection.forEach((msg) => { messagecollection.forEach((msg) => {
const timestamp = new Date(msg.createdTimestamp) const timestamp = new Date(msg.createdTimestamp)
if (msg.content){var content = msg.content}else{var content = "*empty message*"} //empty message handling
if (msg.content){
var content = msg.content
}else if (msg.embeds.length > 0 && msg.attachments.length > 0){
var content = "*this message only has embeds & files**"
}else if (msg.embeds.length > 0){
var content = "*this message only has embeds**"
}else if (msg.attachments.length > 0){
var content = "*this message only has files**"
}else{
var content = "*empty message*"
}
const fileurls = [] const fileurls = []
const rawfiles = Array.from(msg.attachments) const rawfiles = Array.from(msg.attachments)
rawfiles.forEach((file) => { rawfiles.forEach((file) => {
+2 -2
View File
@@ -43,7 +43,7 @@ exports.createEmbed = (id) => {
if (data.enableCustomColor){ if (data.enableCustomColor){
embed.setColor(data.color) embed.setColor(data.color)
}else{ }else{
embed.setColor(config.main_color) embed.setColor(config.color)
} }
if (data.other.embedTitleURL.enable) embed.setURL(data.other.embedTitleURL.url) if (data.other.embedTitleURL.enable) embed.setURL(data.other.embedTitleURL.url)
@@ -63,7 +63,7 @@ exports.createEmbed = (id) => {
} }
if (data.other.enableMaxTicketsWarning){ if (data.other.enableMaxTicketsWarning){
description = description+"\n\n"+l.commands.maxTicketWarning.replace("{0}",config.system.max_allowed_tickets) description = description+"\n\n"+l.commands.maxTicketWarning.replace("{0}",config.system.maxAmountOfTickets)
} }
if (description) embed.setDescription(description) if (description) embed.setDescription(description)
+131 -3
View File
@@ -3,13 +3,141 @@ 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 axios = require("axios").default
const loadChalk = async () => { const loadChalk = async () => {
return await (await import("chalk")).default return await (await import("chalk")).default
} }
module.exports = async () => { //OTLiveStatus
const chalk = await loadChalk() /**@typedef {[{style:[{title:String,titleColor:"normal"|"red"|"green"|"blue"|"yellow"|"white"|"gray"|"magenta"|"cyan",description:String,descriptionColor:"normal"|"red"|"green"|"blue"|"yellow"|"white"|"gray"|"magenta"|"cyan"}],active:{versions:String[],languages:String[],usingPlugins:["yes"|"no"|"both"],usingSlashCommands:["yes"|"no"|"both"],transcripts:["html"|"text"|"both"]}}]} OTLiveStatus */
//OTLiveStatusError
/**@typedef {{bot:{id:String,pfp:String,name:String}, openticket:{version:String,language:String, slashcmds:Boolean,transcripts:false|"text"|"html",config:{system:{},options:{},messages:{},transcripts:{}},plugins:String[],pluginload:{success:Number,error:Number,total:Number}}, details:{actions:[{type:String,category:String,file:String,time:Number}],errortime:Number}, error:String}} OTLiveStatusError */
/**
* @param {Boolean} [local=false]
* @returns {Promise<OTLiveStatus|false>}
*/
const getLivestatus = (local) => {
return new Promise((resolve,reject) => {
if (local){
try {
const livestatus = require("../../livestatus.json")
if (!livestatus) return resolve(false)
resolve(livestatus)
}catch{
return resolve(false)
}
}else{
try {
axios.get("https://livestatus.dj-dj.be/openticket.json").then((res) => {
const livestatus = res.data
if (!Array.isArray(livestatus)) return resolve(false)
if (!livestatus) return resolve(false)
resolve(livestatus)
})
}catch{
return resolve(false)
}
}
})
}
var globalPluginData = {total:0,error:0,success:0}
//announcer
/**@param {{total:Number,error:Number,success:Number}} pluginData*/
exports.run = async (pluginData) => {
const chalk = await loadChalk()
globalPluginData = pluginData
const res = await getLivestatus(process.argv.some((v) => v == "--localstatus"))
if (!res) return false
if (res.length == 0) return
/**@type {[{title:String,titleColor:"normal"|"red"|"green"|"blue"|"yellow"|"white"|"gray"|"magenta"|"cyan",description:String,descriptionColor:"normal"|"red"|"green"|"blue"|"yellow"|"white"|"gray"|"magenta"|"cyan"}]} */
const activeStyles = []
res.forEach((announcement) => {
const a = announcement.active
const isLanguage = a.languages.includes(config.languageFile) || a.languages.includes("all")
const isVersion = a.versions.includes(require("../../package.json").version)
var tsenabled = (bot.tsconfig.sendTranscripts.enableChannel || bot.tsconfig.sendTranscripts.enableDM)
var tsmode = bot.tsconfig.sendTranscripts.useHTMLtranscripts ? "html" : "text"
const isTranscript = (a.transcripts.includes("html") && tsmode == "html" && tsenabled) || (a.transcripts.includes("text") && tsmode == "text" && tsenabled) || (a.transcripts.includes("both") && tsenabled)
const isPlugins = (a.usingPlugins.includes("yes") && pluginData.total > 0) || (a.usingPlugins.includes("no") && pluginData.total == 0) || (a.usingPlugins.includes("both"))
if (!isLanguage || !isVersion || !isTranscript || !isPlugins) return
announcement.style.forEach((s) => activeStyles.push(s))
})
const final = []
activeStyles.forEach((style) => {
const dc = style.descriptionColor
const tempd = style.description.split("\n")
const tc = style.titleColor
const t = "["+style.title+"]"
const tempd2 = []
tempd.forEach((tmpd,i) => {
if (i > 0){
var newtext = tmpd
var i2 = 0
while(i2 < t.length+1){
newtext = " "+newtext
i2++
}
tempd2.push(newtext)
}else{
tempd2.push(tmpd)
}
})
const d = tempd2.join("\n")
var fd = d
if (dc == "normal" || dc == "white") fd = chalk.white(d)
if (dc == "red") fd = chalk.red(d)
if (dc == "yellow") fd = chalk.yellow(d)
if (dc == "green") fd = chalk.green(d)
if (dc == "blue") fd = chalk.blue(d)
if (dc == "gray") fd = chalk.gray(d)
if (dc == "magenta") fd = chalk.magenta(d)
if (dc == "cyan") fd = chalk.cyan(d)
var ft = t
if (tc == "normal" || tc == "white") ft = chalk.white(t)
if (tc == "red") ft = chalk.red(t)
if (tc == "yellow") ft = chalk.yellow(t)
if (tc == "green") ft = chalk.green(t)
if (tc == "blue") ft = chalk.blue(t)
if (tc == "gray") ft = chalk.gray(t)
if (tc == "magenta") ft = chalk.magenta(t)
if (tc == "cyan") ft = chalk.cyan(t)
final.push(ft+" "+fd)
})
console.log(final.join("\n\n"))
}
/**@param {OTLiveStatusError} options @returns {Promise<Boolean>} */
const uploadLiveStatus = (options) => {
return new Promise((resolve,reject) => {
try {
var data = encodeURIComponent(JSON.stringify(options))
axios.get("https://livestatus.dj-dj.be/openticket?auth=openticketLIVESTATUS1234&data="+data).then((res) => {
if (res.status == 200) resolve(true)
else resolve(false)
})
}catch{
resolve(false)
}
})
}
/**@param {String} err */
const liveStatusUploadManager = (err) => {
//use globalPluginData for (some) plugin details
//LIVESTATUS SOON
} }
+1 -1
View File
@@ -14,7 +14,7 @@ const storage = bot.storage
*/ */
exports.command = (memberid,guildid) => { exports.command = (memberid,guildid) => {
const permsmember = client.guilds.cache.find(g => g.id == guildid).members.cache.find(m => m.id == memberid) const permsmember = client.guilds.cache.find(g => g.id == guildid).members.cache.find(m => m.id == memberid)
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){ if (config.adminRoles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
return false return false
}else {return true} }else {return true}
} }
+15 -18
View File
@@ -45,11 +45,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 APIBase = require("./core/api/modules/base") const client = new discord.Client({
if (APIBase.embeddedMode){
var tempClient = APIBase.clientLocation
}else{
var tempClient = new discord.Client({
intents:[ intents:[
GatewayIntentBits.DirectMessages, GatewayIntentBits.DirectMessages,
GatewayIntentBits.GuildInvites, GatewayIntentBits.GuildInvites,
@@ -59,10 +55,7 @@ if (APIBase.embeddedMode){
GatewayIntentBits.MessageContent GatewayIntentBits.MessageContent
], ],
partials:[Partials.Channel,Partials.Message] partials:[Partials.Channel,Partials.Message]
}) })
}
/**@type {discord.Client} */
const client = tempClient
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.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","created client")
@@ -140,34 +133,37 @@ client.on('ready',async () => {
//normal start //normal start
this.errorLog.log("debug","loaded console interface") this.errorLog.log("debug","loaded console interface")
require("./core/utils/liveStatus")()
if (config.status.enabled){ if (config.status.enabled){
setStatus(config.status.type,config.status.text) setStatus(config.status.type,config.status.text)
} }
var updatingSlash = false var updatingSlash = false
if (fs.existsSync("./storage/slashcmdEnabled.txt")){ if (fs.existsSync("./storage/slashcmdEnabled.txt")){
/**@type {"true"|"false"} */ /**@type {"true"|"false"|String} */
const data = fs.readFileSync("./storage/slashcmdEnabled.txt").toString() const data = fs.readFileSync("./storage/slashcmdEnabled.txt").toString()
if (data === "true"){require("./core/slashSystem/autoSlashUpdate")(); updatingSlash = true} if (data === require("./package.json").version){
require("./core/slashSystem/autoSlashUpdate")()
updatingSlash = true
}else if ((data != require("./package.json").version) && (data != "false")){
require("./core/slashSystem/slashEnable")(true)
updatingSlash = true
}
}else{ }else{
if (process.argv.some((v) => v == "--noslash")){ if (process.argv.some((v) => v == "--noslash")){
fs.writeFileSync("./storage/slashcmdEnabled.txt","false") fs.writeFileSync("./storage/slashcmdEnabled.txt","false")
}else{ }else{
fs.writeFileSync("./storage/slashcmdEnabled.txt","true") fs.writeFileSync("./storage/slashcmdEnabled.txt",require("./package.json").version)
require("./core/slashSystem/slashEnable")(true) require("./core/slashSystem/slashEnable")(true)
updatingSlash = true updatingSlash = true
console.log("LEEEETSSS GOOO!")
} }
} }
try { try {
await client.guilds.cache.find((g) => g.id == config.server_id).members.fetch() await client.guilds.cache.find((g) => g.id == config.serverId).members.fetch()
}catch{ }catch{
this.errorLog.log("info","tried to cache user information, failed!") this.errorLog.log("info","tried to cache user information, failed!")
} }
console.log("updatingslash",updatingSlash)
require("./core/startscreen").headerDataReady(chalk,config.status,updatingSlash,false) require("./core/startscreen").headerDataReady(chalk,config.status,updatingSlash,false)
}else{ }else{
@@ -260,5 +256,6 @@ process.on("uncaughtException",async (error,origin) => {
APIEvents.onError(error.name+": "+error.message,new Date()) APIEvents.onError(error.name+": "+error.message,new Date())
}) })
if (!APIBase.embeddedMode) client.login(config.auth_token) const token = config.token.fromENV ? process.env.TOKEN : config.token.value
client.login(token)
this.errorLog.log("debug","login with token") this.errorLog.log("debug","login with token")
+1 -1
View File
@@ -5,7 +5,7 @@
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"start": "node index.js", "start": "node index.js",
"test": "node index.js d", "test": "node index.js --devconfig",
"slashEnable": "node index.js slash enable", "slashEnable": "node index.js slash enable",
"slashDisable": "node index.js slash disable", "slashDisable": "node index.js slash disable",
"cleardata": "node ./core/dynamicdatabase/cleardata.js" "cleardata": "node ./core/dynamicdatabase/cleardata.js"
+3 -3
View File
@@ -1,10 +1,10 @@
{ {
"sendTranscripts":{ "sendTranscripts":{
"enableChannel":false, "enableChannel":false,
"channel":"transcript channel id", "enableDM":false,
"useHTMLtranscripts":true,
"enableDM":false "channel":"transcript channel id",
"useHTMLtranscripts":true
}, },
"style":{ "style":{
"titleColor":"#F8BA00", "titleColor":"#F8BA00",