From f67af805c195f568ad51b819ae5f796fdd11b301 Mon Sep 17 00:00:00 2001 From: DJj123dj <80536295+DJj123dj@users.noreply.github.com> Date: Wed, 15 Mar 2023 20:57:14 +0100 Subject: [PATCH] v3.3 push 4 (1 entire afternoon of work) My TODO list is too big :) --- commands/help.js | 4 +- config.json | 23 +-- core/api/modules/base.js | 8 -- core/checker.js | 83 ++++++----- core/errorLogSystem.js | 2 +- core/interactionHandlers/buttons/close.js | 2 +- core/interactionHandlers/buttons/firstmsg.js | 2 +- .../interactionHandlers/buttons/verifyBars.js | 2 +- core/interactionHandlers/embeds/commands.js | 2 +- .../handlers/accepted/closing.js | 2 +- .../handlers/accepted/closingReason.js | 2 +- .../handlers/accepted/deleting.js | 2 +- .../handlers/accepted/reopening.js | 2 +- core/interactionHandlers/handlers/firstmsg.js | 2 +- .../handlers/verifyBars.js | 2 +- core/languageManager.js | 6 +- core/slashSystem/autoSlashUpdate.js | 2 +- core/slashSystem/slashEnable.js | 7 +- core/startscreen.js | 10 +- core/ticketActions/ticketCloser.js | 6 +- core/ticketActions/ticketOpener.js | 31 ++-- core/ticketActions/ticketReopener.js | 13 +- core/transcriptSystem/embeds.js | 4 +- core/transcriptSystem/oldTranscript.js | 15 +- core/utils/getEmbed.js | 4 +- core/utils/liveStatus.js | 134 +++++++++++++++++- core/utils/permisssionChecker.js | 2 +- index.js | 51 ++++--- package.json | 2 +- transcriptconfig.json | 6 +- 30 files changed, 275 insertions(+), 158 deletions(-) delete mode 100644 core/api/modules/base.js diff --git a/commands/help.js b/commands/help.js index ad78252..98ba63b 100644 --- a/commands/help.js +++ b/commands/help.js @@ -15,10 +15,10 @@ module.exports = () => { const prefix = config.system.showSlashcmdsInHelp ? "/" : config.prefix const helpEmbed = new discord.EmbedBuilder() - .setColor(config.main_color) + .setColor(config.color) .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+" ` ➜ _"+l.helpMenu.msgCmd+"_\n\n`"+prefix+"rename ` ➜ _"+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 ` ➜ _"+l.helpMenu.addCmd+"_\n`"+prefix+"remove ` ➜ _"+l.helpMenu.removeCmd+"_\n\n`"+prefix+"change ` ➜ _Change ticket type._") var otherprefix = prefix.endsWith(" ") ? prefix.substring(0,prefix.length-1) : prefix diff --git a/config.json b/config.json index a1c69ac..baeb94f 100644 --- a/config.json +++ b/config.json @@ -1,10 +1,13 @@ { - "main_color":"#ffffff", - "server_id":"server id (for slash cmds)", - "auth_token":"auth token", - "main_adminroles":["discord role id"], + "color":"#ffffff", + "serverId":"server id (for slash cmds)", + "token":{ + "value":"insert your bot token here", + "fromENV":false + }, + "adminRoles":["discord role id"], "prefix":"!ticket ", - "languagefile":"english", + "languageFile":"english", "status":{ "enabled":true, @@ -13,13 +16,11 @@ }, "system":{ - "ticket_channel":"channel id", - "max_allowed_tickets":3, - "enable_DM_Messages":false, + "maxAmountOfTickets":3, + "dmMessages":false, - "has@everyoneaccess":false, - "member_role":"member role (this role doesn't have access to tickets)", - "closeMode":"adminonly or normal (select one of the 2)", + "memberRole":"member role (leave empty if you have no member role)", + "closeMode":"adminonly OR normal (select one!)", "transcripts":"!!!! ALL SETTINGS FOR TRANSCRIPTS ARE LOCATED IN: transcriptconfig.json !!!!", diff --git a/core/api/modules/base.js b/core/api/modules/base.js deleted file mode 100644 index 8d4921e..0000000 --- a/core/api/modules/base.js +++ /dev/null @@ -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 \ No newline at end of file diff --git a/core/checker.js b/core/checker.js index 48e4d55..397a577 100644 --- a/core/checker.js +++ b/core/checker.js @@ -53,9 +53,9 @@ exports.checker = async () => { /**@param {String} value */ const checkToken = (value) => { 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 */ @@ -119,24 +119,29 @@ exports.checker = async () => { if (type == "boolean"){ if (typeof value != "boolean"){ createError("'"+path+"' | invalid type, this must be a boolean!") - } + return true + }else return false }else if (type == "number"){ if (typeof value != "number"){ createError("'"+path+"' | invalid type, this must be a number!") - } + return true + }else return false }else if (type == "string"){ if (typeof value != "string"){ createError("'"+path+"' | invalid type, this must be a string!") - } + return true + }else return false }else if (type == "array"){ if (!Array.isArray(value)){ createError("'"+path+"' | invalid type, this must be an array!") - } + return true + }else return false }else if (type == "object"){ if (typeof value != "object"){ createError("'"+path+"' | invalid type, this must be an object!") - } - } + return true + }else return false + }else return false } const checkButtonColor = (value,path) => { @@ -337,17 +342,19 @@ exports.checker = async () => { } //OPTIONS!!! - var counter = 0 - input.options.forEach((option) => {if (!configParser.optionExists(option)){counter++}}) + if (checkType(input.options,"array",path+"/options")){ + var counter = 0 + input.options.forEach((option) => {if (!configParser.optionExists(option)){counter++}}) - if (counter == input.options.length){ - createWarn("'"+path+"/options' | insert the option ids here!") - }else{ - input.options.forEach((option,index) => { - if (!configParser.optionExists(option)){ - createWarn("'"+path+"/options:"+index+"' | this option doesnt exist!") - } - }) + if (counter == input.options.length){ + createWarn("'"+path+"/options' | insert the option ids here!") + }else{ + input.options.forEach((option,index) => { + if (!configParser.optionExists(option)){ + createWarn("'"+path+"/options:"+index+"' | this option doesnt exist!") + } + }) + } } //other @@ -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) => { if (config[item] == undefined){ throw new Error("\n\nMAIN ERROR: the item '"+item+"' doesn't exist in config.json") } }) - checkHexColor(config.main_color,"main_color") - checkDiscord("serverid",config.server_id,"server_id") + checkHexColor(config.color,"main_color") + 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") - checkDiscordArray("roleid",config.main_adminroles,"main_adminroles") + checkType(config.adminRoles,"array","/main_adminroles") + checkDiscordArray("roleid",config.adminRoles,"main_adminroles") checkString(config.prefix,1,15,"prefix","prefix") //languagefile - checkType(config.languagefile,"string","languagefile") - const lf = config.languagefile + checkType(config.languageFile,"string","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")){ createError("'languagefile' | invalid language, more info in the wiki") @@ -430,28 +437,18 @@ exports.checker = async () => { //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 - checkType(config.system.max_allowed_tickets,"number","system/max_allowed_tickets") + checkType(config.system.maxAmountOfTickets,"number","system/maxAmountOfTickets") //enableDMmessages - checkType(config.system.enable_DM_Messages,"boolean","system/enable_DM_Messages") + checkType(config.system.dmMessages,"boolean","system/dmMessages") - //has@everyoneaccess - checkType(config.system["has@everyoneaccess"],"boolean","system/has@everyoneaccess") - - //member_role - 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") + //memberRole + checkType(config.system.memberRole,"string","system/memberRole") + if (config.system.memberRole && ![" ","0","false","null","undefined"].includes(config.system.memberRole)){ + checkDiscord("roleid",config.system.memberRole,"system/memberRole") }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 diff --git a/core/errorLogSystem.js b/core/errorLogSystem.js index 2e0774e..d224156 100644 --- a/core/errorLogSystem.js +++ b/core/errorLogSystem.js @@ -67,7 +67,7 @@ exports.notInATicket = new embed() /**@param {String} message @param {String} title */ exports.success = (title,message) => { var x = new embed() - .setColor(config.main_color) + .setColor(config.color) .setTitle(":white_check_mark: "+title) .setDescription(message) diff --git a/core/interactionHandlers/buttons/close.js b/core/interactionHandlers/buttons/close.js index 4f8bdbf..a476070 100644 --- a/core/interactionHandlers/buttons/close.js +++ b/core/interactionHandlers/buttons/close.js @@ -7,7 +7,7 @@ const log = bot.errorLog.log const hiddendata = bot.hiddenData const embed = discord.EmbedBuilder -const mc = config.main_color +const mc = config.color const button = discord.ButtonBuilder const arb = discord.ActionRowBuilder diff --git a/core/interactionHandlers/buttons/firstmsg.js b/core/interactionHandlers/buttons/firstmsg.js index fbbc910..c5c979d 100644 --- a/core/interactionHandlers/buttons/firstmsg.js +++ b/core/interactionHandlers/buttons/firstmsg.js @@ -7,7 +7,7 @@ const log = bot.errorLog.log const hiddendata = bot.hiddenData const embed = discord.EmbedBuilder -const mc = config.main_color +const mc = config.color const button = discord.ButtonBuilder const arb = discord.ActionRowBuilder diff --git a/core/interactionHandlers/buttons/verifyBars.js b/core/interactionHandlers/buttons/verifyBars.js index cbd8453..fdd911c 100644 --- a/core/interactionHandlers/buttons/verifyBars.js +++ b/core/interactionHandlers/buttons/verifyBars.js @@ -8,7 +8,7 @@ const log = bot.errorLog.log const hiddendata = bot.hiddenData const embed = discord.EmbedBuilder -const mc = config.main_color +const mc = config.color const button = discord.ButtonBuilder const arb = discord.ActionRowBuilder diff --git a/core/interactionHandlers/embeds/commands.js b/core/interactionHandlers/embeds/commands.js index 6a01609..f785e47 100644 --- a/core/interactionHandlers/embeds/commands.js +++ b/core/interactionHandlers/embeds/commands.js @@ -7,7 +7,7 @@ const log = bot.errorLog.log const hiddendata = bot.hiddenData const embed = discord.EmbedBuilder -const mc = config.main_color +const mc = config.color /** * diff --git a/core/interactionHandlers/handlers/accepted/closing.js b/core/interactionHandlers/handlers/accepted/closing.js index 17776aa..87bce25 100644 --- a/core/interactionHandlers/handlers/accepted/closing.js +++ b/core/interactionHandlers/handlers/accepted/closing.js @@ -9,7 +9,7 @@ const permissionChecker = require("../../../utils/permisssionChecker") const storage = bot.storage const hiddendata = bot.hiddenData const embed = discord.EmbedBuilder -const mc = config.main_color +const mc = config.color const button = discord.ButtonBuilder const arb = discord.ActionRowBuilder diff --git a/core/interactionHandlers/handlers/accepted/closingReason.js b/core/interactionHandlers/handlers/accepted/closingReason.js index bae9523..8cf57bc 100644 --- a/core/interactionHandlers/handlers/accepted/closingReason.js +++ b/core/interactionHandlers/handlers/accepted/closingReason.js @@ -9,7 +9,7 @@ const permissionChecker = require("../../../utils/permisssionChecker") const storage = bot.storage const hiddendata = bot.hiddenData const embed = discord.EmbedBuilder -const mc = config.main_color +const mc = config.color const button = discord.ButtonBuilder const arb = discord.ActionRowBuilder diff --git a/core/interactionHandlers/handlers/accepted/deleting.js b/core/interactionHandlers/handlers/accepted/deleting.js index 091d36c..1ebcf5f 100644 --- a/core/interactionHandlers/handlers/accepted/deleting.js +++ b/core/interactionHandlers/handlers/accepted/deleting.js @@ -9,7 +9,7 @@ const permissionChecker = require("../../../utils/permisssionChecker") const storage = bot.storage const hiddendata = bot.hiddenData const embed = discord.EmbedBuilder -const mc = config.main_color +const mc = config.color const button = discord.ButtonBuilder const arb = discord.ActionRowBuilder diff --git a/core/interactionHandlers/handlers/accepted/reopening.js b/core/interactionHandlers/handlers/accepted/reopening.js index 2cbc080..d810770 100644 --- a/core/interactionHandlers/handlers/accepted/reopening.js +++ b/core/interactionHandlers/handlers/accepted/reopening.js @@ -9,7 +9,7 @@ const permissionChecker = require("../../../utils/permisssionChecker") const storage = bot.storage const hiddendata = bot.hiddenData const embed = discord.EmbedBuilder -const mc = config.main_color +const mc = config.color const button = discord.ButtonBuilder const arb = discord.ActionRowBuilder diff --git a/core/interactionHandlers/handlers/firstmsg.js b/core/interactionHandlers/handlers/firstmsg.js index cd8c748..2235f4a 100644 --- a/core/interactionHandlers/handlers/firstmsg.js +++ b/core/interactionHandlers/handlers/firstmsg.js @@ -8,7 +8,7 @@ const log = bot.errorLog.log const storage = bot.storage const hiddendata = bot.hiddenData const embed = discord.EmbedBuilder -const mc = config.main_color +const mc = config.color const button = discord.ButtonBuilder const arb = discord.ActionRowBuilder diff --git a/core/interactionHandlers/handlers/verifyBars.js b/core/interactionHandlers/handlers/verifyBars.js index bb2ae74..3780b94 100644 --- a/core/interactionHandlers/handlers/verifyBars.js +++ b/core/interactionHandlers/handlers/verifyBars.js @@ -8,7 +8,7 @@ const log = bot.errorLog.log const storage = bot.storage const hiddendata = bot.hiddenData const embed = discord.EmbedBuilder -const mc = config.main_color +const mc = config.color const button = discord.ButtonBuilder const arb = discord.ActionRowBuilder diff --git a/core/languageManager.js b/core/languageManager.js index 198533f..a4ced7c 100644 --- a/core/languageManager.js +++ b/core/languageManager.js @@ -7,8 +7,8 @@ if (index.developerConfig){ var localLanguage = require("../language/english.json") const fs = require("fs") -const lfexists = fs.existsSync("./language/"+config.languagefile+".json") -if (lfexists) localLanguage = require("../language/"+config.languagefile+".json") +const lfexists = fs.existsSync("./language/"+config.languageFile+".json") +if (lfexists) localLanguage = require("../language/"+config.languageFile+".json") const errorLog = async () => { const chalk = await (await import("chalk")).default @@ -30,5 +30,5 @@ if (!localLanguage){ runError() }else{ exports.language = localLanguage - successLog(config.languagefile) + successLog(config.languageFile) } \ No newline at end of file diff --git a/core/slashSystem/autoSlashUpdate.js b/core/slashSystem/autoSlashUpdate.js index ba610aa..27614b7 100644 --- a/core/slashSystem/autoSlashUpdate.js +++ b/core/slashSystem/autoSlashUpdate.js @@ -8,7 +8,7 @@ const act = discord.ApplicationCommandType const acot = discord.ApplicationCommandOptionType module.exports = async () => { - const sid = config.server_id + const sid = config.serverId const ids = configParser.getTicketValuesArray("id") /**@type {[{name:String,value:String}]} */ diff --git a/core/slashSystem/slashEnable.js b/core/slashSystem/slashEnable.js index c291879..85ab3c4 100644 --- a/core/slashSystem/slashEnable.js +++ b/core/slashSystem/slashEnable.js @@ -10,7 +10,7 @@ const acot = discord.ApplicationCommandOptionType /**@param {Boolean|undefined} invisible*/ module.exports = async (invisible) => { const chalk = (await import("chalk")).default - const sid = config.server_id + const sid = config.serverId const ids = configParser.getTicketValuesArray("id") /**@type {[{name:String,value:String}]} */ @@ -36,8 +36,6 @@ module.exports = async (invisible) => { 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)") if (readystats >= 13){ - const fs = require("fs") - fs.writeFileSync("./storage/slashcmdEnabled.txt","true") console.log(chalk.green("\nready!")) console.log(chalk.blue("you can now start the bot with "+chalk.bgBlue("'npm start'")+"!")) process.exit(1) @@ -45,6 +43,9 @@ module.exports = async (invisible) => { },100) } + const fs = require("fs") + fs.writeFileSync("./storage/slashcmdEnabled.txt",require("../../package.json").version) + //slashtranslation const ST = require("../../language/slashcmds/slash.json").data diff --git a/core/startscreen.js b/core/startscreen.js index 5d70557..9a86f0d 100644 --- a/core/startscreen.js +++ b/core/startscreen.js @@ -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 == "--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 == "--localstatus")) console.log(chalk.blue("[FLAGS] => using local livestatus.json")); isFlag = true if (!isFlag) console.log(chalk.blue("no flags!")) } @@ -23,7 +24,7 @@ exports.run = async () => { const chalk = await (await import("chalk")).default console.log(chalk.hex("f8ba00")(logo)) 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 var i = 0 while (i < spaceamount){ @@ -63,14 +64,15 @@ exports.headerDataLanguage = async (message,err) => { languageErr = err } -/** - * @param {{total:Number,error:Number,success:Number}} plugins -*/ +/**@param {{total:Number,error:Number,success:Number}} plugins*/ exports.headerDataPlugins = async (plugins) => { const chalk = await (await import("chalk")).default const lmsg = languageErr ? chalk.red(languageMSG) : languageMSG 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("\n"+chalk.bold(chalk.underline("LIVESTATUS:"))) + await require("./utils/liveStatus").run(plugins) + console.log("\n"+chalk.bold(chalk.underline("LOGS:"))) } \ No newline at end of file diff --git a/core/ticketActions/ticketCloser.js b/core/ticketActions/ticketCloser.js index 6f51cb5..09a7615 100755 --- a/core/ticketActions/ticketCloser.js +++ b/core/ticketActions/ticketCloser.js @@ -119,7 +119,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => }) //add main adminroles - config.main_adminroles.forEach((role,index) => { + config.adminRoles.forEach((role,index) => { try { const adminrole = guild.roles.cache.find(r => r.id == role) if (!adminrole) return @@ -170,7 +170,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => */ const ticketadmin = ticketData.adminroles ticketadmin.forEach((role,index) => { - if (!config.main_adminroles.includes(role)){ + if (!config.adminRoles.includes(role)){ try { const adminrole = guild.roles.cache.find(r => r.id == role) if (!adminrole) return @@ -211,7 +211,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => ) const embed = new discord.EmbedBuilder() - .setColor(config.main_color) + .setColor(config.color) .setTitle(":lock: "+l.commands.closeTitle+" :lock:") .setDescription(l.messages.closedDescription) channel.send({embeds:[embed],components:[closeButtonRow]}) diff --git a/core/ticketActions/ticketOpener.js b/core/ticketActions/ticketOpener.js index 5ac4f90..683b3fb 100755 --- a/core/ticketActions/ticketOpener.js +++ b/core/ticketActions/ticketOpener.js @@ -63,7 +63,7 @@ module.exports = () => { } 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 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 guild = client.guilds.cache.find(g => g.id == interaction.guild.id) - //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] - } + //set @everyone no ticket access permissionsArray.push({ id:interaction.guild.roles.everyone, type:"role", - allow:everyoneAllowPerms, - deny:everyoneDenyPerms + allow:[], + deny:[pfb.ViewChannel] }) //add the user that created the ticket @@ -107,7 +100,7 @@ module.exports = () => { }) //add main adminroles - config.main_adminroles.forEach((role,index) => { + config.adminRoles.forEach((role,index) => { try { const adminrole = guild.roles.cache.find(r => r.id == role) if (!adminrole) return @@ -128,7 +121,7 @@ module.exports = () => { */ const ticketadmin = currentTicketOptions.adminroles ticketadmin.forEach((role,index) => { - if (!config.main_adminroles.includes(role)){ + if (!config.adminRoles.includes(role)){ try { const adminrole = guild.roles.cache.find(r => r.id == role) if (!adminrole) return @@ -145,9 +138,9 @@ module.exports = () => { }) //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 { - 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){ permissionsArray.push({ id:userrole, @@ -156,7 +149,7 @@ module.exports = () => { }) } }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() //.setAuthor({name:interaction.user.id}) - .setColor(config.main_color) + .setColor(config.color) .setTitle(currentTicketOptions.name) //.setFooter({text:"Ticket Type: "+currentTicketOptions.id}) if (currentTicketOptions.ticketmessage.length > 0){ @@ -210,7 +203,7 @@ module.exports = () => { ]) 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")} @@ -219,7 +212,7 @@ module.exports = () => { }) }else{ try { - if (config.system.enable_DM_Messages){ + if (config.system.dmMessages){ interaction.member.send({embeds:[bot.errorLog.warning(l.errors.maxAmountTitle,l.errors.maxAmountDescription)]}) } } diff --git a/core/ticketActions/ticketReopener.js b/core/ticketActions/ticketReopener.js index 10ecdf7..76453f3 100755 --- a/core/ticketActions/ticketReopener.js +++ b/core/ticketActions/ticketReopener.js @@ -19,19 +19,12 @@ const reopenTicket = (guild,channel,user) => { var permissionsArray = [] - //set everyone allowed - if (config.system['has@everyoneaccess']){ - var everyoneAllowPerms = [pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel] - var everyoneDenyPerms = [] - }else{ - var everyoneAllowPerms = [] - var everyoneDenyPerms = [pfb.ViewChannel] - } + //set @everyone no ticket access permissionsArray.push({ id:guild.roles.everyone, type:"role", - allow:everyoneAllowPerms, - deny:everyoneDenyPerms + allow:[], + deny:[pfb.ViewChannel] }) channel.permissionOverwrites.cache.forEach((p) => { diff --git a/core/transcriptSystem/embeds.js b/core/transcriptSystem/embeds.js index 4b08efc..02e15ec 100644 --- a/core/transcriptSystem/embeds.js +++ b/core/transcriptSystem/embeds.js @@ -22,7 +22,7 @@ exports.beingprocessed = (name,id,rawprocesstime,user) => { const embed = new discord.EmbedBuilder() .setTitle("🧾 "+l.transcripts.title) - .setColor(config.main_color) + .setColor(config.color) .setAuthor({name:user.tag,iconURL:user.displayAvatarURL()}) .setFooter({text:name}) @@ -42,7 +42,7 @@ exports.beingprocessed = (name,id,rawprocesstime,user) => { exports.tsready = (name,id,url,user) => { const embed = new discord.EmbedBuilder() .setTitle("🧾 "+l.transcripts.title) - .setColor(config.main_color) + .setColor(config.color) .setAuthor({name:user.tag,iconURL:user.displayAvatarURL()}) .setFooter({text:name}) diff --git a/core/transcriptSystem/oldTranscript.js b/core/transcriptSystem/oldTranscript.js index c33e6d0..eb4fc1f 100755 --- a/core/transcriptSystem/oldTranscript.js +++ b/core/transcriptSystem/oldTranscript.js @@ -26,7 +26,20 @@ exports.createTranscript = async (messagecollection,channel,backup) => { messagecollection.forEach((msg) => { 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 rawfiles = Array.from(msg.attachments) rawfiles.forEach((file) => { diff --git a/core/utils/getEmbed.js b/core/utils/getEmbed.js index 4deb263..49324ab 100644 --- a/core/utils/getEmbed.js +++ b/core/utils/getEmbed.js @@ -43,7 +43,7 @@ exports.createEmbed = (id) => { if (data.enableCustomColor){ embed.setColor(data.color) }else{ - embed.setColor(config.main_color) + embed.setColor(config.color) } if (data.other.embedTitleURL.enable) embed.setURL(data.other.embedTitleURL.url) @@ -63,7 +63,7 @@ exports.createEmbed = (id) => { } 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) diff --git a/core/utils/liveStatus.js b/core/utils/liveStatus.js index e5e57db..9bdd76d 100644 --- a/core/utils/liveStatus.js +++ b/core/utils/liveStatus.js @@ -3,13 +3,141 @@ const bot = require('../../index') const client = bot.client const config = bot.config const log = bot.errorLog.log +const axios = require("axios").default const loadChalk = async () => { return await (await import("chalk")).default } -module.exports = async () => { +//OTLiveStatus +/**@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} +*/ +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() - - //LIVESTATUS SOON + 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} */ +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 + } \ No newline at end of file diff --git a/core/utils/permisssionChecker.js b/core/utils/permisssionChecker.js index 8ca662c..d75e69d 100644 --- a/core/utils/permisssionChecker.js +++ b/core/utils/permisssionChecker.js @@ -14,7 +14,7 @@ const storage = bot.storage */ exports.command = (memberid,guildid) => { const permsmember = client.guilds.cache.find(g => g.id == guildid).members.cache.find(m => m.id == memberid) - if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){ + if (config.adminRoles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){ return false }else {return true} } diff --git a/index.js b/index.js index d77c1d0..119715a 100644 --- a/index.js +++ b/index.js @@ -45,24 +45,17 @@ const discord = require("discord.js") const fs = require('fs') const {GatewayIntentBits,Partials} = discord -const APIBase = require("./core/api/modules/base") -if (APIBase.embeddedMode){ - var tempClient = APIBase.clientLocation -}else{ - var tempClient = new discord.Client({ - intents:[ - GatewayIntentBits.DirectMessages, - GatewayIntentBits.GuildInvites, - GatewayIntentBits.GuildMembers, - GatewayIntentBits.GuildMessages, - GatewayIntentBits.Guilds, - GatewayIntentBits.MessageContent - ], - partials:[Partials.Channel,Partials.Message] - }) -} -/**@type {discord.Client} */ -const client = tempClient +const client = new discord.Client({ + intents:[ + GatewayIntentBits.DirectMessages, + GatewayIntentBits.GuildInvites, + GatewayIntentBits.GuildMembers, + GatewayIntentBits.GuildMessages, + GatewayIntentBits.Guilds, + GatewayIntentBits.MessageContent + ], + partials:[Partials.Channel,Partials.Message] +}) exports.client = client client.setMaxListeners(50) if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","created client") @@ -139,8 +132,6 @@ client.on('ready',async () => { if (!process.argv[2] || (process.argv[2] && !process.argv[2].startsWith("slash"))){ //normal start this.errorLog.log("debug","loaded console interface") - - require("./core/utils/liveStatus")() if (config.status.enabled){ setStatus(config.status.type,config.status.text) @@ -148,26 +139,31 @@ client.on('ready',async () => { var updatingSlash = false if (fs.existsSync("./storage/slashcmdEnabled.txt")){ - /**@type {"true"|"false"} */ + /**@type {"true"|"false"|String} */ 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{ if (process.argv.some((v) => v == "--noslash")){ fs.writeFileSync("./storage/slashcmdEnabled.txt","false") }else{ - fs.writeFileSync("./storage/slashcmdEnabled.txt","true") + fs.writeFileSync("./storage/slashcmdEnabled.txt",require("./package.json").version) require("./core/slashSystem/slashEnable")(true) updatingSlash = true - console.log("LEEEETSSS GOOO!") } } 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{ this.errorLog.log("info","tried to cache user information, failed!") } - console.log("updatingslash",updatingSlash) require("./core/startscreen").headerDataReady(chalk,config.status,updatingSlash,false) }else{ @@ -260,5 +256,6 @@ process.on("uncaughtException",async (error,origin) => { 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") \ No newline at end of file diff --git a/package.json b/package.json index 3e4e88e..1c321a9 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "start": "node index.js", - "test": "node index.js d", + "test": "node index.js --devconfig", "slashEnable": "node index.js slash enable", "slashDisable": "node index.js slash disable", "cleardata": "node ./core/dynamicdatabase/cleardata.js" diff --git a/transcriptconfig.json b/transcriptconfig.json index c7c536b..a5c003c 100644 --- a/transcriptconfig.json +++ b/transcriptconfig.json @@ -1,10 +1,10 @@ { "sendTranscripts":{ "enableChannel":false, + "enableDM":false, + "channel":"transcript channel id", - "useHTMLtranscripts":true, - - "enableDM":false + "useHTMLtranscripts":true }, "style":{ "titleColor":"#F8BA00",