From 7ed2d7bcc7d684b373031b9cde4ac5312b697263 Mon Sep 17 00:00:00 2001 From: DJj123dj <80536295+DJj123dj@users.noreply.github.com> Date: Tue, 17 Jan 2023 17:34:51 +0100 Subject: [PATCH] v3.2 push 1 NOT WORKING YET!!! --- .gitignore | 1 + README.md | 17 +-- TESTJSON.json | 105 ++++++++++++++++ commands/help.js | 2 - config.json | 5 +- core/checker.js | 8 +- core/interactionHandlers/buttons/close.js | 20 ++- .../handlers/accepted/deleting.js | 8 +- core/interactionHandlers/handlers/handlers.js | 1 - .../handlers/sendTranscript.js | 46 ------- core/languageManager.js | 1 + core/ticketActions/ticketCloser.js | 109 ++--------------- .../communication/compileJson.js | 115 ++++++++++++++++++ core/transcriptSystem/communication/index.js | 28 +++++ .../communication/template.json | 67 ++++++++++ core/transcriptSystem/embeds.js | 53 ++++++++ core/transcriptSystem/info.json | 3 + core/transcriptSystem/manager.js | 92 ++++++++++++++ core/transcriptSystem/tsdb.js | 71 +++++++++++ core/utils/getEmbed.js | 5 +- index.js | 5 + language/danish.json | 83 +++++++++++++ language/german.json | 5 +- package.json | 4 +- transcriptconfig.json | 17 +++ 25 files changed, 687 insertions(+), 184 deletions(-) create mode 100644 TESTJSON.json delete mode 100644 core/interactionHandlers/handlers/sendTranscript.js create mode 100644 core/transcriptSystem/communication/compileJson.js create mode 100644 core/transcriptSystem/communication/index.js create mode 100644 core/transcriptSystem/communication/template.json create mode 100644 core/transcriptSystem/embeds.js create mode 100644 core/transcriptSystem/info.json create mode 100644 core/transcriptSystem/manager.js create mode 100644 core/transcriptSystem/tsdb.js create mode 100644 language/danish.json create mode 100644 transcriptconfig.json diff --git a/.gitignore b/.gitignore index f7290d8..d20c8c1 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ developerChangelog.md storage/dynamicDB/ storage/slashcmdEnabled.txt storage/database.json +storage/tsdatabase.json storage/.DS_Store .vscode/ livestatus.json diff --git a/README.md b/README.md index a1a838b..d4ba720 100644 --- a/README.md +++ b/README.md @@ -15,14 +15,15 @@ Start using it now, you can do anything! - Sanke: for translation & new ideas - Everyone that reported a bug #### And our translators! -- ExothDE -- 1x1 -- Redactado -- t0miiis -- josuens14 -- M4 -- David. -- Maurizio +- Sanke#6086 (Romanian & French) +- Redactado#1673 (Spanish) +- t0miiis#3022 (Czech) +- josuens14 (Spanish) +- M4#5882 (Arabic) +- ChilledBroke#9986 (Arabic) +- David.#0187 (German) +- Maurizio#0268 (Italian) +- the_gamer#5095 (Danish) ## features - discord interaction buttons diff --git a/TESTJSON.json b/TESTJSON.json new file mode 100644 index 0000000..a7bea13 --- /dev/null +++ b/TESTJSON.json @@ -0,0 +1,105 @@ +{ + "version": "1.0.0", + "otversion": "3.1.0", + "style": { + "backgroundData": "https://pbs.twimg.com/media/EBjFBlVXsAAhvXl?format=jpg&name=4096x4096", + "backgroundModus": "image", + "enableCustomBackground": true, + "titleColor": "#49c100" + }, + "bot": { + "name": "DJdj Test Bot", + "id": 958290611331539000, + "pfp": "https://cdn.discordapp.com/avatars/958290611331538975/7a989e8ce6cde2b3e3c7fc15001452a0.webp" + }, + "ticket": { + "name": "question-djj123dj", + "id": 1064653735772565500, + "guildname": "DJDJ bot test", + "guildid": 935983011281903600, + "creatorname": "DJj123dj#1706", + "creatorid": 779742674932072400, + "closedbyname": "DJj123dj#1706", + "closedbyid": 779742674932072400, + "closedtime": 1673903703543, + "openedtime": 1673903631015, + "messages": 4, + "files": 0 + }, + "messages": [ + { + "author": { + "name": "DJdj Test Bot#7338", + "id": 958290611331539000, + "color": "#ffffff", + "pfp": "https://cdn.discordapp.com/avatars/958290611331538975/7a989e8ce6cde2b3e3c7fc15001452a0.webp" + }, + "content": "<@779742674932072469> @here", + "timestamp": 1673903631356, + "embeds": [ + { + "title": "Question", + "description": "The staff will help you soon!\n\n*Click on the button below to close the ticket!*", + "authorimg": false, + "authortext": false, + "footerimg": false, + "footertext": false, + "color": "#49c100", + "image": false, + "thumbnail": false, + "url": false + } + ], + "files": [] + }, + { + "author": { + "name": "DJdj Test Bot#7338", + "id": 958290611331539000, + "color": "#ffffff", + "pfp": "https://cdn.discordapp.com/avatars/958290611331538975/7a989e8ce6cde2b3e3c7fc15001452a0.webp" + }, + "content": "", + "timestamp": 1673903631652, + "embeds": [], + "files": [] + }, + { + "author": { + "name": "DJj123dj#1706", + "id": 779742674932072400, + "color": "#ffffff", + "pfp": "https://cdn.discordapp.com/avatars/779742674932072469/4588af0ccb6a18a66d66c77bddbdfc81.webp" + }, + "content": "**test markdown (again)**\n__hi__\n~~hello!~~\n\n_nice_\n\n**___super text!__**", + "timestamp": 1673903693407, + "embeds": [], + "files": [] + }, + { + "author": { + "name": "DJdj Test Bot#7338", + "id": 958290611331539000, + "color": "#ffffff", + "pfp": "https://cdn.discordapp.com/avatars/958290611331538975/7a989e8ce6cde2b3e3c7fc15001452a0.webp" + }, + "content": "", + "timestamp": 1673903697253, + "embeds": [ + { + "title": "❌ Deleting this ticket...", + "description": false, + "authorimg": false, + "authortext": false, + "footerimg": "https://cdn.discordapp.com/avatars/779742674932072469/4588af0ccb6a18a66d66c77bddbdfc81.webp", + "footertext": "DJj123dj#1706", + "color": "#49c100", + "image": false, + "thumbnail": false, + "url": false + } + ], + "files": [] + } + ] +} \ No newline at end of file diff --git a/commands/help.js b/commands/help.js index 9c19abc..03b6215 100644 --- a/commands/help.js +++ b/commands/help.js @@ -21,8 +21,6 @@ module.exports = () => { const header = config.system.ticket_channel ? l.helpMenu.header1.replace("{0}","<#"+config.system.ticket_channel+">") : 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+"_") - if (config.credits) helpEmbed.setFooter({text:"Open-Ticket by DJdj Development | view on github for source code",iconURL:"https://raw.githubusercontent.com/DJj123dj/open-ticket/main/logo.png"}) - var otherprefix = prefix.endsWith(" ") ? prefix.substring(0,prefix.length-1) : prefix if (!DISABLE.commands.text.help) client.on("messageCreate",msg => { diff --git a/config.json b/config.json index cab7717..c4367c2 100644 --- a/config.json +++ b/config.json @@ -6,7 +6,6 @@ "prefix":"!ticket ", "languagefile":"english", - "credits":true, "status":{ "enabled":true, "type":"PLAYING", @@ -22,9 +21,7 @@ "member_role":"member role (doesn't have access to tickets)", "closeMode":"adminonly|normal", - "enable_transcript":false, - "enable_DM_transcript":false, - "transcript_channel":"channel id", + "transcripts":"!!!! ALL SETTINGS FOR TRANSCRIPTS ARE LOCATED IN: transcriptconfig.json !!!!", "showSlashcmdsInHelp":false }, diff --git a/core/checker.js b/core/checker.js index edc73db..32311f5 100644 --- a/core/checker.js +++ b/core/checker.js @@ -368,7 +368,7 @@ exports.checker = async () => { //--------------------------| //--------------------------| - var configArray = ["main_color","server_id","auth_token","main_adminroles","prefix","languagefile","credits","status","system","options","messages"] + var configArray = ["main_color","server_id","auth_token","main_adminroles","prefix","languagefile","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") @@ -390,7 +390,6 @@ exports.checker = async () => { createError("'languagefile' | invalid language, more info in the wiki") } - checkType(config.credits,"boolean","credits") //status: checkType(config.status.enabled,"boolean","status/enabled") if (config.status.enabled){ @@ -423,11 +422,6 @@ exports.checker = async () => { createError("'system/closeMode' | the close mode must be adminonly or normal") } - checkType(config.system.enable_transcript,"boolean","system/enable_transcript") - checkType(config.system.enable_DM_transcript,"boolean","system/enable_DM_transcript") - if (config.system.enable_transcript){ - checkDiscord("channelid",config.system.transcript_channel,"system/transcript_channel") - } checkType(config.system.showSlashcmdsInHelp,"boolean","system/showSlashcmdsInHelp") //options diff --git a/core/interactionHandlers/buttons/close.js b/core/interactionHandlers/buttons/close.js index 46b7224..4f8bdbf 100644 --- a/core/interactionHandlers/buttons/close.js +++ b/core/interactionHandlers/buttons/close.js @@ -25,16 +25,26 @@ exports.closeCommandRow = new arb() ) .addComponents( new button() - .setCustomId("OTsendTranscript") + .setCustomId("OTreopenTicket") .setDisabled(false) - .setStyle(bs.Secondary) - .setLabel(l.buttons.sendTranscript) - .setEmoji("📄") + .setStyle(bs.Success) + .setLabel(l.buttons.reopen) + .setEmoji("✔") + ) + +exports.closeCommandRowDisabled = new arb() + .addComponents( + new button() + .setCustomId("OTdeleteTicket1") + .setDisabled(true) + .setStyle(bs.Danger) + .setLabel(l.buttons.delete) + .setEmoji("✖️") ) .addComponents( new button() .setCustomId("OTreopenTicket") - .setDisabled(false) + .setDisabled(true) .setStyle(bs.Success) .setLabel(l.buttons.reopen) .setEmoji("✔") diff --git a/core/interactionHandlers/handlers/accepted/deleting.js b/core/interactionHandlers/handlers/accepted/deleting.js index 900db9b..091d36c 100644 --- a/core/interactionHandlers/handlers/accepted/deleting.js +++ b/core/interactionHandlers/handlers/accepted/deleting.js @@ -50,8 +50,8 @@ module.exports = () => { } }) - interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) await interaction.message.edit({components:[bot.buttons.close.openRowDisabled]}) + await interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true) deleteTicketButtonChecker = false }) @@ -90,8 +90,10 @@ module.exports = () => { } }) - interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) - await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"deletenotranscript",false,true) + await interaction.message.edit({components:[bot.buttons.close.closeCommandRowDisabled]}) + await interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) + await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true) deleteTicketButtonChecker1 = false + }) } \ No newline at end of file diff --git a/core/interactionHandlers/handlers/handlers.js b/core/interactionHandlers/handlers/handlers.js index 5dea097..c2c015b 100644 --- a/core/interactionHandlers/handlers/handlers.js +++ b/core/interactionHandlers/handlers/handlers.js @@ -1,6 +1,5 @@ module.exports = () => { require("./firstmsg")() - require("./sendTranscript")() require("./verifyBars")() //accepted diff --git a/core/interactionHandlers/handlers/sendTranscript.js b/core/interactionHandlers/handlers/sendTranscript.js deleted file mode 100644 index 6ac442c..0000000 --- a/core/interactionHandlers/handlers/sendTranscript.js +++ /dev/null @@ -1,46 +0,0 @@ -const discord = require('discord.js') -const bot = require('../../../index') -const client = bot.client -const config = bot.config -const l = bot.language -const log = bot.errorLog.log - -const storage = bot.storage -const hiddendata = bot.hiddenData -const embed = discord.EmbedBuilder -const mc = config.main_color - -const button = discord.ButtonBuilder -const arb = discord.ActionRowBuilder -const bs = discord.ButtonStyle - - -module.exports = () => { - client.on("interactionCreate",async (interaction) => { - if (!interaction.isButton()) return - if (interaction.customId != "OTsendTranscript") return - - try { - interaction.deferUpdate() - } catch{} - const tsmsg = await interaction.channel.send({embeds:[bot.embeds.commands.sendTranscriptEmbed(false,interaction.channel,interaction.user)]}) - - const channelmessages = await interaction.channel.messages.fetch() - - channelmessages.sweep((msgSweep) => { - return msgSweep.author.id == client.user.id - }) - - var fileattachment = await require("../../transcript").createTranscript(channelmessages,interaction.channel) - - if (fileattachment == false){ - log("system","internal error: transcript is not created!") - tsmsg.edit({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrongTranscript)]}) - return - } - - try { - tsmsg.edit({embeds:[bot.embeds.commands.sendTranscriptEmbed(true,interaction.channel,interaction.user)],files:[fileattachment]}) - }catch{} - }) -} \ No newline at end of file diff --git a/core/languageManager.js b/core/languageManager.js index 31641de..639d40b 100644 --- a/core/languageManager.js +++ b/core/languageManager.js @@ -16,6 +16,7 @@ else if (config.languagefile.startsWith("arabic")) localLanguage = require("../l else if (config.languagefile.startsWith("spanish")) localLanguage = require("../language/spanish.json") else if (config.languagefile.startsWith("portuguese")) localLanguage = require("../language/portuguese.json") else if (config.languagefile.startsWith("italian")) localLanguage = require("../language/italian.json") +else if (config.languagefile.startsWith("danish")) localLanguage = require("../language/danish.json") const errorLog = async () => { diff --git a/core/ticketActions/ticketCloser.js b/core/ticketActions/ticketCloser.js index ad1ff99..310ae0b 100755 --- a/core/ticketActions/ticketCloser.js +++ b/core/ticketActions/ticketCloser.js @@ -49,7 +49,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => var enableTranscript = true var deleteRequired = false - if (mode == "delete"){ + if (mode == "delete" || mode == "deletenotranscript"){ //delete //check perms if (!guild) return @@ -196,14 +196,6 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => .setLabel(l.buttons.delete) .setEmoji("✖️") ) - .addComponents( - new discord.ButtonBuilder() - .setCustomId("OTsendTranscript") - .setDisabled(false) - .setStyle(discord.ButtonStyle.Secondary) - .setLabel(l.buttons.sendTranscript) - .setEmoji("📄") - ) .addComponents( new discord.ButtonBuilder() .setCustomId("OTreopenTicket") @@ -246,108 +238,23 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => }) - }else if (mode == "deletenotranscript"){ - //delete with no transcript - //check perms - if (!guild) return - if (!permsChecker.command(user.id,guild.id)){ - permsChecker.sendUserNoPerms(user) - return - } - - //start delete proccess - enableTranscript = false - deleteRequired = true - if (!nomessage){ - await channel.send({content:"**"+l.messages.gettingdeleted+"**"}) - } - log("system","deleted a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}]) - - if (!isDatabaseError) storage.set("ticketStorage",getuserID,Number(storage.get("ticketStorage",getuserID)) - 1) - - //getID & send DM & send api event - await channel.messages.fetchPinned().then(msglist => { - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value - const ticketData = require("../utils/configParser").getTicketById(ticketId,true) - - require("../api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData}) - - const id = hiddendata.data.find(d => d.key == "openerid").value - - if (!id) return false - - try{ - if (config.system.enable_DM_Messages){ - member.send({embeds:[bot.errorLog.custom(l.messages.deletedTicketDmTitle,l.messages.deletedTicketDmDescription,":ticket:",config.main_color)]}) - } - } - catch{log("system","can't send DM to member, member doesn't allow dm's")} - }) } const transcriptHandler = async () => { - if (enableTranscript == true && mode != "deletenotranscript"){ - //transcript messages - const transcriptReason = (mode == "close") ? "**"+l.messages.reason+":** "+newReason : "**"+l.messages.reason+":** "+l.messages.none - const closedByPrefix = (mode.startsWith("delete")) ? l.messages.deletedby : l.messages.closedby + if (!bot.tsconfig.sendTranscripts.enableChannel && !bot.tsconfig.sendTranscripts.enableDM) return false - if (config.system.enable_transcript || config.system.enable_DM_transcript){ - const channelmessages = await channel.messages.fetch({cache:true}) - //remove ot bot from transcript - channelmessages.sweep((msgSweep) => {return msgSweep.author.id == client.user.id}) - - var fileattachment = await require("../transcript").createTranscript(channelmessages,channel) - - if (fileattachment == false){log("system","internal error: transcript is not created!");return} - } - - if (config.system.enable_transcript && !require("../api/api.json").disable.transcripts.server){ - const transcriptEmbed = new discord.EmbedBuilder() - .setColor(config.main_color) - .setTitle("📄 "+l.messages.newTranscriptTitle) - .setDescription(transcriptReason) - .setFooter({text:closedByPrefix+": "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()}) - - guild.channels.cache.find(c => c.id == config.system.transcript_channel).send({ - embeds:[transcriptEmbed], - files:[fileattachment] - }) - } - - if (config.system.enable_DM_transcript && !require("../api/api.json").disable.transcripts.dm){ - const transcriptEmbed = new discord.EmbedBuilder() - .setColor(config.main_color) - .setTitle("📄 "+l.messages.newTranscriptTitle) - .setDescription(transcriptReason) - .setFooter({text:closedByPrefix+": "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()}) - - if (!isDatabaseError) ticketOpener.send({ - embeds:[transcriptEmbed], - files:[fileattachment] - }) - } - } + const APIEvents = require("../api/modules/events") + const messages = await channel.messages.fetch({cache:true}) + await require("../transcriptSystem/manager")(messages,guild,channel,user,reason) + APIEvents.onTranscriptCreation(messages,channel,guild,new Date()) } const deleteHandler = async () => { if (deleteRequired){ - //const timer = () => {return new Promise((resolve,reject) => { - // setTimeout(() => {resolve(true)},7000) - //})} - //await timer() - pendingDelete.shift() - await channel.delete() - - //setTimeout(async () => { - // pendingDelete.shift() - // await channel.delete() - //},6000) + await channel.delete() } } - await transcriptHandler() + if (mode == "delete" || mode == "deletenotranscript") await transcriptHandler() deleteHandler() } \ No newline at end of file diff --git a/core/transcriptSystem/communication/compileJson.js b/core/transcriptSystem/communication/compileJson.js new file mode 100644 index 0000000..823a650 --- /dev/null +++ b/core/transcriptSystem/communication/compileJson.js @@ -0,0 +1,115 @@ +const discord = require('discord.js') + +const bot = require("../../../index") +const tsconfig = bot.tsconfig +const tsembeds = require("../embeds") +const tsdb = require("../tsdb") + +const otversion = require("../../../package.json").version +const version = require("../info.json").version + +/**@typedef {{style:{enableCustomBackground:Boolean, backgroundModus:"color"|"image", backgroundData:String, titleColor:String}, bot:{name:String, id:Number, pfp:String}, ticket:{creatorname:String, creatorid:Number, closedtime:Number, openedtime:Number}}} OThtsDataOption */ + + +/** + * + * @param {discord.Guild} guild + * @param {discord.Channel} channel + * @param {discord.User} user + * @param {discord.Message[]} messagesInv + * @param {OThtsDataOption} data + */ +exports.compile = (guild,channel,user,messagesInv,data) => { + const messages = messagesInv.reverse() + + const rawfiles = messages.filter((m) => Array.from(m.attachments).length > 0) + var fileAmount = 0 + rawfiles.forEach((msg) => { + fileAmount = fileAmount + Array.from(msg.attachments).length + }) + + const messagesArray = [] + messages.forEach((msg) => { + const embedArray = [] + const fileArray = [] + + msg.attachments.forEach((file) => { + fileArray.push({ + name:file.name, + type:file.contentType, + size:file.size.toString()+" bytes", + url:file.url + }) + }) + + msg.embeds.forEach((embed) => { + if (embed.description){ + var desc = bot.hiddenData.removeHiddenData(embed.description).description + }else{var desc = false} + + embedArray.push({ + title:embed.title || false, + description:desc, + authorimg:((embed.author && embed.author.iconURL) ? embed.author.iconURL : false), + authortext:(embed.author ? embed.author.name : false), + footerimg:((embed.footer && embed.footer.iconURL) ? embed.footer.iconURL : false), + footertext:(embed.footer ? embed.footer.text : false), + color:embed.hexColor, + image:((embed.image && embed.image.url) ? embed.image.url : false), + thumbnail:((embed.thumbnail && embed.thumbnail.url) ? embed.thumbnail.url : false), + url:(embed.url ? embed.url : false) + }) + }) + + + messagesArray.push({ + author:{ + name:msg.author.tag, + id:Number(msg.author.id), + color:msg.author.hexAccentColor || "#ffffff", + pfp:msg.author.displayAvatarURL() + }, + content:msg.content || "", + timestamp:msg.createdTimestamp, + embeds:embedArray, + files:fileArray + }) + }) + + const result = { + version,otversion, + style:{ + backgroundData:data.style.backgroundData || "", + backgroundModus:data.style.backgroundModus || "", + enableCustomBackground:data.style.enableCustomBackground || false, + titleColor:data.style.titleColor || "#F8BA00" + }, + bot:{ + name:data.bot.name || "Open Ticket", + id:Number(data.bot.id) || 0, + pfp:data.bot.pfp || "dj-dj.be/wp-content/uploads/2022/07/profielfoto-blauw-wit.png?size=128" + }, + ticket:{ + name:channel.name, + id:Number(channel.id), + + guildname:guild.name, + guildid:Number(guild.id), + + creatorname:data.ticket.creatorname, + creatorid:Number(data.ticket.creatorid), + closedbyname:user.tag, + closedbyid:Number(user.id), + + closedtime:data.ticket.closedtime, + openedtime:data.ticket.openedtime, + + messages:Array.from(messages).length, + files:fileAmount + }, + messages:messagesArray + } + + + return result +} \ No newline at end of file diff --git a/core/transcriptSystem/communication/index.js b/core/transcriptSystem/communication/index.js new file mode 100644 index 0000000..8de4682 --- /dev/null +++ b/core/transcriptSystem/communication/index.js @@ -0,0 +1,28 @@ +const axios = require("axios").default +const discord = require('discord.js') + +const bot = require("../../../index") +const tsconfig = bot.tsconfig +const tsembeds = require("../embeds") +const tsdb = require("../tsdb") + +/**@typedef {{status:"success"|"error", id:String, time:Number, estimated:{lastdump: Number, processtime:Number}, transcriptstatus:{value:2, data:{fetchedmsgs:true, uploaded:true, inqueue:true, processed:false, waiting:false, available:false}}}} OTuploadResponse */ + +/** + * @param {Object} json + * @returns {OTuploadResponse} + */ +exports.upload = async (json) => { + + const data = encodeURIComponent(JSON.stringify(json)) + + try { + const res = await axios.get("https://api.transcripts.dj-dj.be/upload?auth=openticketTRANSCRIPT1234&version=1.0.0&data="+data) + if (res.status != 200) return false + + return res.data + }catch{ + console.log("failed transcript upload!") + return false + } +} \ No newline at end of file diff --git a/core/transcriptSystem/communication/template.json b/core/transcriptSystem/communication/template.json new file mode 100644 index 0000000..5da4aaf --- /dev/null +++ b/core/transcriptSystem/communication/template.json @@ -0,0 +1,67 @@ +{ + "version":"1.0.0", + "otversion":"3.2.0", + "style":{ + "enableCustomBackground":false, + "backgroundModus":"color OR image", + "backgroundData":"#ffffff OR https://www.example.com/image.png", + "titleColor":"#ffffff" + }, + "bot":{ + "name":"DJdj Support Bot", + "id":12345678910, + "pfp":"https://www.example.com/image.png" + }, + "ticket":{ + "name":"support-DJj123dj", + "id":12345678910, + + "guildname":"DJdj Development", + "guildid":12345678910, + + "creatorname":"DJj123dj#1706", + "creatorid":12345678910, + "closedbyname":"DJj123dj#1706", + "closedbyid":12345678910, + + "closedtime":12345678910, + "openedtime":12345678910, + + "messages":1, + "files":1 + }, + "messages":[ + { + "author":{ + "name":"DJj123dj#1706", + "id":12345678910, + "color":"#ffffff", + "pfp":"https://www.example.com/image.png" + }, + "content":"string or FALSE", + "timestamp":12345678910, + "embeds":[ + { + "title":"string or FALSE", + "description":"string or FALSE", + "authorimg":"https://www.example.com/image.png or FALSE", + "authortext":"string or FALSE", + "footerimg":"https://www.example.com/image.png or FALSE", + "footertext":"string or FALSE", + "color":"#ffffff", + "image":"https://www.example.com/image.png or FALSE", + "thumbnail":"https://www.example.com/image.png or FALSE", + "url":"https://www.example.com/image.png or FALSE" + } + ], + "files":[ + { + "name":"image.png", + "type":"PNG", + "size":"1MB", + "url":"https://www.example.com/image.png" + } + ] + } + ] +} \ No newline at end of file diff --git a/core/transcriptSystem/embeds.js b/core/transcriptSystem/embeds.js new file mode 100644 index 0000000..e0c12ee --- /dev/null +++ b/core/transcriptSystem/embeds.js @@ -0,0 +1,53 @@ +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 tsconfig = bot.tsconfig + +/** + * + * @param {String} name + * @param {String} id + * @param {Number} rawprocesstime milliseconds + * @param {discord.User} user + */ +exports.beingprocessed = (name,id,rawprocesstime,user) => { + + const newtime = new Date(new Date().getTime() + rawprocesstime) + + const processtime = "" + + const embed = new discord.EmbedBuilder() + .setTitle("🧾 Transcript") + .setColor(config.main_color) + .setAuthor({name:user.tag,iconURL:user.displayAvatarURL()}) + .setFooter({text:name}) + + .setDescription("`This transcript is being processed...`\nPlease wait!\n\nEstimated time: "+processtime) + + return embed +} + + +/** + * + * @param {String} name + * @param {String} id + * @param {String} url + * @param {discord.User} user + */ +exports.tsready = (name,id,url,user) => { + const embed = new discord.EmbedBuilder() + .setTitle("🧾 Transcript") + .setColor(config.main_color) + .setAuthor({name:user.tag,iconURL:user.displayAvatarURL()}) + .setFooter({text:name}) + .setURL(url) + + .setDescription("The transcript is available [here]("+url+")") + + return embed +} \ No newline at end of file diff --git a/core/transcriptSystem/info.json b/core/transcriptSystem/info.json new file mode 100644 index 0000000..ea2feef --- /dev/null +++ b/core/transcriptSystem/info.json @@ -0,0 +1,3 @@ +{ + "version":"1.0.0" +} \ No newline at end of file diff --git a/core/transcriptSystem/manager.js b/core/transcriptSystem/manager.js new file mode 100644 index 0000000..67db7a4 --- /dev/null +++ b/core/transcriptSystem/manager.js @@ -0,0 +1,92 @@ +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 tsconfig = bot.tsconfig +const tsembeds = require("./embeds") +const tsdb = require("./tsdb") + +/** + * + * @param {discord.Message[]} messages + * @param {discord.Guild} guild + * @param {discord.TextChannel} channel + * @param {discord.User} user + * @param {String|false} reason + */ +module.exports = async (messages,guild,channel,user,reason) => { + const msglist = await channel.messages.fetchPinned() + + const chName = channel.id + const chId = channel.name + + if (tsconfig.sendTranscripts.enableChannel){ + /**@type {discord.TextChannel|undefined} */ + const tc = guild.channels.cache.find((c) => c.id == tsconfig.sendTranscripts.channel) + + if (!tc) return + const embed = tsembeds.beingprocessed(chName,chId,60000,user) + var msg = await tc.send({embeds:[embed]}) + }else {var msg = false} + + /**@param {discord.Collection>} msglist*/ + const asyncmanager = async (msglist) => { + var firstmsg = msglist.last() + + if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type") + + const id = hiddendata.data.find(d => d.key == "openerid").value + const opentime = new Date(Number(hiddendata.data.find(d => d.key == "createdms").value)) + + const ticketopener = client.users.cache.find(u => u.id == id) + + + const JSONDATA = require("./communication/compileJson").compile(guild,channel,user,messages,{ + style:{ + titleColor:tsconfig.style.titleColor, + enableCustomBackground:tsconfig.style.background.enableCustomBackground, + backgroundModus:tsconfig.style.background.backgroundModus, + backgroundData:tsconfig.style.background.backgroundData + }, + bot:{ + name:client.user.username, + id:client.user.id, + pfp:client.user.displayAvatarURL() + }, + ticket:{ + creatorid:ticketopener.id, + creatorname:ticketopener.tag, + openedtime:opentime.getTime(), + closedtime:new Date().getTime() + } + }) + + require("fs").writeFileSync("./TESTJSON.json",JSON.stringify(JSONDATA,null,"\t")) + + const TSdata = await require("./communication/index").upload(JSONDATA) + if (!TSdata) return false + if (TSdata.status == "success"){ + const url = "https://transcripts.dj-dj.be/t/"+TSdata.time+"_"+TSdata.id+".html" + + if (msg){ + msg.edit(tsembeds.tsready(chName,chId,url,user)) + console.log("URL:",url) + } + + if (tsconfig.sendTranscripts.enableDM){ + if (!user) return + const embed = tsembeds.tsready(chName,chId,url,user) + try { + user.send({embeds:[embed]}) + }catch{} + } + } + } + asyncmanager(msglist) +} \ No newline at end of file diff --git a/core/transcriptSystem/tsdb.js b/core/transcriptSystem/tsdb.js new file mode 100644 index 0000000..2ad725e --- /dev/null +++ b/core/transcriptSystem/tsdb.js @@ -0,0 +1,71 @@ +const fs = require("fs") +const location = "./storage/tsdatabase.json" + + +/**@returns {[{category:String, key:String, value:String}]}*/ +function getData(){ + if (fs.existsSync(location)){ + return JSON.parse(fs.readFileSync(location).toString()) + }else{ + fs.writeFileSync(location,"[]") + return [] + } +} +/**@param {[{category:String, key:String, value:String}]} data*/ +function setData(data){ + fs.writeFileSync(location,JSON.stringify(data,null,"\t")) +} + +exports.set = (category,key,value) => { + const currentData = getData() + const exists = currentData.find((d) => (d.category == category) && (d.key == key)) ? true : false + var newData = [] + if (exists){ + currentData.forEach((d,i) => { + if (d.category == category && d.key == key){ + newData.push({category,key,value}) + }else{ + newData.push(d) + } + }) + }else{ + currentData.push({category,key,value}) + newData = currentData + } + + setData(newData) + return exists +} +/** + * @param {String} category + * @param {String} key + * @returns {String|false} + */ +exports.get = (category,key) => { + const currentData = getData() + const tempresult = currentData.find((d) => (d.category == category) && (d.key == key)) + const result = tempresult ? tempresult.value : false + return result +} +/** + * @param {String} category + * @param {String} key + * @param {String} value + */ +exports.delete = (category,key) => { + const currentData = getData() + const exists = currentData.find((d) => (d.category == category) && (d.key == key)) ? true : false + var newData = [] + if (exists){ + currentData.forEach((d,i) => { + if (!(d.category == category && d.key == key)){ + newData.push(d) + } + }) + }else{ + newData = currentData + } + + setData(newData) + return exists +} \ No newline at end of file diff --git a/core/utils/getEmbed.js b/core/utils/getEmbed.js index 1abb837..85de281 100644 --- a/core/utils/getEmbed.js +++ b/core/utils/getEmbed.js @@ -35,7 +35,10 @@ exports.createEmbed = (id) => { const embed = new discord.EmbedBuilder() .setTitle(data.name) if (data.enableFooter) embed.setFooter({text:data.footer}) - if (data.enableThumbnail) embed.setThumbnail(data.thumbnail) + + try { + if (data.enableThumbnail) embed.setThumbnail(data.thumbnail) + }catch{bot.errorLog.log("info","THUMBNAIL FAILED TO LOAD, probably invalid url!")} if (data.enableCustomColor){ embed.setColor(data.color) diff --git a/index.js b/index.js index 94ce9d2..503df85 100644 --- a/index.js +++ b/index.js @@ -69,8 +69,13 @@ const language = require("./core/languageManager").language exports.language = language if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded language") + const config = tempconfig exports.config = config + +const tsconfig = require("./transcriptconfig.json") +exports.tsconfig = tsconfig + if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded config") exports.storage = require('./core/dynamicdatabase/storage') if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded storage") diff --git a/language/danish.json b/language/danish.json new file mode 100644 index 0000000..e96b4dd --- /dev/null +++ b/language/danish.json @@ -0,0 +1,83 @@ +{ + "errors":{ + "missingArgsTitle":"Ugyldige argumenter", + "missingArgsDescription":"Manglende argumenter", + "noPermsTitle":"Ingen adgang", + "noPermsDescription":"Du har ikke adgang til denne kommando", + "noPermsDelete":"Kun administrators kan slette tickets", + "chooseFromListTitle":"Ugyldig ID", + "chooseFromListDescription":"Vælg et ID nedenunder", + "boterror":"Bot Fejl!", + "notInTicketTitle":"Du er ikke i en ticket!", + "notInTicketDescription":"Denne kommando fungere kun i tickets!", + "ticketDoesntExist":"Denne ticket eksistere ikke mere!", + "roleDoesntExist":"Denne rolle eksistere ikke mere!", + "anotherOption":"Dette er ikke en ticket, men noget andet!", + "maxAmountTitle":"For mange tickets er blevet oprettet!", + "maxAmountDescription":"Du har for mange tickets åbne!\nSå luk dem hvis du gerne vil oprette nye!", + "somethingWentWrong":"**Noget gik galt**\nKontakt en udvikler!", + "somethingWentWrongTranscript":"Noget gik galt med transcript!**\nKontakt en udvikler!" + }, + "commands":{ + "userAddedTitle":"Tilføjer {0} til denne ticket!", + "userRemovedTitle":"Fjernet {0} fra denne ticket!", + "renameTitle":"Ændret navnet til{0}!", + "closeTitle":"Closed this ticket!", + "deleteTitle":"Fjerner ticketen", + "reopenTitle":"Genåbnede denne ticket", + "claimTitle":"Denne ticket er blevet taget af {0}", + "unclaimTitle":"Denne ticket er nu tilgængelig!", + + "ticketWarning":"Emebeddet er i beskeden nedenunder", + "maxTicketWarning":"**Fejl:** _Du kan kun oprettre {0} ticket adgangen!_" + }, + "helpMenu":{ + "title":"Tilgængelig kommandoer:", + "header1":"**Gå til {0} For at oprette en ticket!**\n\n", + "header2":"**Skriv kommandoen `/new` eller `/ticket` for at oprette en ticket!**\n\n", + + "msgCmd":"Lav en embed med knapper (admins kun)", + "renameCmd":"Ændre navnet (ingen mellemrum)", + "closeCmd":"Luk denne ticket", + "deleteCmd":"Fjern denne ticket", + "addCmd":"Tilføj en person til ticketen", + "removeCmd":"Fjern en person fra ticketen", + "reopenCmd":"Genåben en ticket efter den har været lukket" + }, + "buttons":{ + "close":"Luk ticket", + "delete":"Fjern ticket", + "reopen":"Genåben ticket", + "sendTranscript":"Transcript", + "closeWithReason":"Luk med grundlag" + }, + "messages":{ + "reopenTitle":"Genåbener denne ticket", + "reopenDescription":"Du kan nu skrive igen", + "closedTitle":"Lukker ticketen!", + "closedDescription":"Kun administrators kan skrive lige nu!\n\n*Klik på knappen nedenunder for at slette eller genåbne ticketen!*", + "createdTitle":"Ticket oprettet!", + "createdDescription":"Din ticket er oprettet!", + + "newTicketDmTitle":"Ny Ticket!", + "closedTicketDmTitle":"Ticket Lukket!", + "deletedTicketDmTitle":"Ticket Fjernet!", + "closedTicketDmDescription":"Din ticket er blevet lukket!", + "deletedTicketDmDescription":"Din ticket er blevet fjernet!", + "reopenTicketDmTitle":"Ticket Genåbnet!", + "reopenTicketDmDescription":"Din ticket er blevet genåbent!", + "newTranscriptTitle":" En ny transcript er tilføjet!", + "hereIsTheTranscript":"Følgende transcript:", + + "chooseCategory":"Vælg en kategori:", + "gettingdeleted":"Ticketen slettes..", + + "none":"Ingen", + "reason":"Grundlag", + + "deletedby":"Fjernet af", + "closedby":"Lukket af", + "modalreason":"Hvad er grundlaget for lukkens af denne ticket?", + "chooseATicket": "Vælg en ticket" + } +} \ No newline at end of file diff --git a/language/german.json b/language/german.json index a555b6c..ea786bf 100644 --- a/language/german.json +++ b/language/german.json @@ -69,9 +69,8 @@ "deletedTicketDmTitle":"Ticket löschen!", "closedTicketDmDescription":"Ihr Ticket ist geschlossen!", "deletedTicketDmDescription":"Ihr Ticket ist gelöscht!", - "newTranscriptTitle":"Eine neue Transscript finden Sie hier!", - "newTranscriptDescription":"Die Abschrift finden Sie in der obigen Textdatei!", - "hereIsTheTranscript":"Hier ist das Transscript:", + "newTranscriptTitle":"Eine neue Transcript finden Sie hier!", + "hereIsTheTranscript":"Hier ist das Transcript:", "chooseCategory":"Wähle eine Kategorie:", diff --git a/package.json b/package.json index 9a74f35..09ee502 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,7 @@ "axios": "^0.27.2", "chalk": "^5.0.1", "discord.js": "^14.7.1", - "express": "^4.17.1", - "node": "^16.10.0", - "node-localstorage": "^2.2.1" + "node": "^16.10.0" }, "repository": { "type": "git", diff --git a/transcriptconfig.json b/transcriptconfig.json new file mode 100644 index 0000000..1aefbfa --- /dev/null +++ b/transcriptconfig.json @@ -0,0 +1,17 @@ +{ + "sendTranscripts":{ + "enableChannel":true, + "channel":"968899606912061490", + + "enableDM":true + }, + "style":{ + "titleColor":"#49c100", + "background":{ + "enableCustomBackground":true, + "backgroundModus":"image", + "backgroundData":"https://pbs.twimg.com/media/EBjFBlVXsAAhvXl?format=jpg&name=4096x4096" + + } + } +} \ No newline at end of file