Open Ticket v3.3.1

Open Ticket v3.3.1
This commit is contained in:
Jasper
2023-03-23 12:51:58 +01:00
committed by GitHub
17 changed files with 211 additions and 73 deletions
+3 -2
View File
@@ -1,6 +1,6 @@
<img src="https://www.dj-dj.be/wp-content/uploads/2023/02/open-ticket-cropped.png" alt="Open Ticket" width="600px">
[![discord](https://img.shields.io/badge/discord-join%20our%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-3.3.0-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.3.0) [![discord.js](https://img.shields.io/badge/discord.js-v14-CB3837.svg?style=flat-square&logo=npm)]() [![license](https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [![stars](https://img.shields.io/github/stars/djj123dj/open-ticket?color=yellow&label=stars&logo=github&style=flat-square)](https://docs.openticket.dj-dj.be)
[![discord](https://img.shields.io/badge/discord-join%20our%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-3.3.1-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.3.1) [![discord.js](https://img.shields.io/badge/discord.js-v14-CB3837.svg?style=flat-square&logo=npm)]() [![license](https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [![stars](https://img.shields.io/github/stars/djj123dj/open-ticket?color=yellow&label=stars&logo=github&style=flat-square)](https://docs.openticket.dj-dj.be)
### Open Ticket
Open Ticket is of the most customisable discord ticket bots of all time!
@@ -59,9 +59,10 @@ Translators
|Russian |Apexo#0723 |
|Turkish |Hydrâelčhâvø#1575 |
|Polish |MKevas#8311 |
|Slovenian |n1kkec#5341 |
## links
current version: _v3.3.0_
current version: _v3.3.1_
</br>changelog: [click here](https://docs.openticket.dj-dj.be/other/changelog)
</br>documentation: [click here](https://docs.openticket.dj-dj.be/quick-start)
+7 -8
View File
@@ -41,11 +41,10 @@ module.exports = () => {
.setFooter({text:"claimed by: "+interaction.user.tag,iconURL:interaction.user.displayAvatarURL()})
.setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data))
if (!firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]})
}else if (firstmsg.components[0].components[1].disabled){
if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]})
}else{
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]})
}
msg.channel.send({embeds:[bot.embeds.commands.claimEmbed(claimingUser,msg.author)]})
@@ -67,6 +66,7 @@ module.exports = () => {
if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
permsChecker.sendUserNoPerms(interaction.user)
interaction.reply({content:":x: "+l.errors.noPermsTitle,ephemeral:true})
return
}
@@ -87,11 +87,10 @@ module.exports = () => {
.setFooter({text:"claimed by: "+user.tag,iconURL:user.displayAvatarURL()})
.setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data))
if (!firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]})
}else if (firstmsg.components[0].components[1].disabled){
if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]})
}else{
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]})
}
interaction.editReply({embeds:[bot.embeds.commands.claimEmbed(user,interaction.user)]})
+7 -8
View File
@@ -48,11 +48,10 @@ module.exports = () => {
newEmbed.setFooter(null)
}
if (!firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormal],embeds:[newEmbed]})
}else if (firstmsg.components[0].components[1].disabled){
if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabled],embeds:[newEmbed]})
}else{
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormal],embeds:[newEmbed]})
}
msg.channel.send({embeds:[bot.embeds.commands.unclaimEmbed(msg.author)]})
@@ -73,6 +72,7 @@ module.exports = () => {
if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
permsChecker.sendUserNoPerms(interaction.user)
interaction.reply({content:":x: "+l.errors.noPermsTitle,ephemeral:true})
return
}
@@ -104,11 +104,10 @@ module.exports = () => {
newEmbed.setFooter(null)
}
if (!firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormal],embeds:[newEmbed]})
}else if (firstmsg.components[0].components[1].disabled){
if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabled],embeds:[newEmbed]})
}else{
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormal],embeds:[newEmbed]})
}
interaction.editReply({embeds:[bot.embeds.commands.unclaimEmbed(interaction.user)]})
+1 -1
View File
@@ -101,7 +101,7 @@
"dropdown":false,
"enableFooter":false,
"footer":"Open Ticket v3.3.0 - I'm a footer!",
"footer":"Open Ticket v3.3.1 - I'm a footer!",
"enableThumbnail":false,
"thumbnail":"https://www.example.com/catmemes/cat.png",
+1 -1
View File
@@ -427,7 +427,7 @@ exports.checker = async () => {
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")){
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") && !lf.startsWith("slovenian")){
createError("'languagefile' | invalid language, more info in the wiki")
}
@@ -10,6 +10,7 @@ const storage = bot.storage
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.color
const permsChecker = require("../../../utils/permisssionChecker")
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
@@ -22,9 +23,15 @@ module.exports = () => {
if (interaction.customId != "OTclaimTicket") return
try {
interaction.deferUpdate()
await interaction.deferUpdate()
}catch{}
if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
permsChecker.sendUserNoPerms(interaction.user)
return
}
interaction.channel.messages.fetchPinned().then(msglist => {
/**@type {discord.Message} */
var firstmsg = msglist.last()
@@ -40,11 +47,10 @@ module.exports = () => {
.setFooter({text:"claimed by: "+interaction.user.tag,iconURL:interaction.user.displayAvatarURL()})
.setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data))
if (!firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]})
}else if (firstmsg.components[0].components[1].disabled){
if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]})
}else{
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]})
}
})
})
+38 -30
View File
@@ -8,41 +8,49 @@ const storage = bot.storage
module.exports = () => {
setInterval(async () => {
const tickets = storage.getCategory("autocloseTickets")
if (!tickets) return
tickets.forEach(async (t) => {
if (t.value == "false" || t.value == 0 || typeof t.value != "number") return
const channel = await client.channels.fetch(t.key,{cache:true})
if (!channel || !channel.isTextBased()) return
try{
const tickets = storage.getCategory("autocloseTickets")
if (!tickets) return
tickets.forEach(async (t) => {
if (t.value == "false" || t.value == 0 || typeof t.value != "number") return
try{
const message = (await channel.messages.fetch({limit:10})).first()
if (!message) return
const channel = await client.channels.fetch(t.key,{cache:true})
if (!channel || !channel.isTextBased()) return
const secondsSLM = Math.round((new Date().getTime() - message.createdTimestamp)/1000)
const hoursSLM = secondsSLM/3600
const message = (await channel.messages.fetch({limit:10})).first()
if (!message) return
if (hoursSLM > t.value){
/**@type {discord.Guild|false} */
const guild = client.guilds.cache.find((g) => g.id == channel.guild.id)
if (!guild) return
const clientMember = guild.members.cache.find((m) => m.id == client.user.id)
if (!clientMember) return
const secondsSLM = Math.round((new Date().getTime() - message.createdTimestamp)/1000)
const hoursSLM = secondsSLM/3600
var name = channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
if (hoursSLM > t.value){
/**@type {discord.Guild|false} */
const guild = client.guilds.cache.find((g) => g.id == channel.guild.id)
if (!guild) return
const clientMember = guild.members.cache.find((m) => m.id == client.user.id)
if (!clientMember) return
require("./ticketCloser").closeManager(clientMember,channel,prefix,"close","OTautoclose",true)
storage.delete("autocloseTickets",channel.id)
var name = channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
channel.send({embeds:[bot.embeds.commands.autocloseSignalEmbed(client.user,t.value)],components:[bot.buttons.close.closeCommandRow]})
require("./ticketCloser").closeManager(clientMember,channel,prefix,"close","OTautoclose",true)
storage.delete("autocloseTickets",channel.id)
channel.send({embeds:[bot.embeds.commands.autocloseSignalEmbed(client.user,t.value)],components:[bot.buttons.close.closeCommandRow]})
}
}catch{
log("system","can't find autoclose channel with ID: "+t.key)
storage.delete("autocloseTickets",t.key)
}
})
},2000)
})
}catch{}
},120000)
}
+4 -3
View File
@@ -131,7 +131,8 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
permissionArray.push({
id:adminrole,
type:"role",
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel],
deny:[]
})
}catch{
log("system","invalid role! At 'config.json => main_adminroles:"+index)
@@ -182,8 +183,8 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
permissionArray.push({
id:adminrole,
type:"role",
allow:[pfb.AddReactions,pfb.ViewChannel],
deny:[pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages]
allow:[pfb.AddReactions,pfb.ViewChannel,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages],
deny:[]
})
}catch{
log("system","invalid role! At 'config.json => options/ticket/...:"+index)
+9
View File
@@ -35,6 +35,15 @@ const reopenTicket = (guild,channel,user) => {
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel],
deny:[]
})
}else{
if (p.id != guild.roles.everyone){
permissionsArray.push({
id:p.id,
type:"role",
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel],
deny:[]
})
}
}
})
@@ -64,12 +64,12 @@ exports.compile = (guild,channel,user,messagesInv,data) => {
})
})
const memberColor = msg.member ? msg.member.displayHexColor : "#ffffff"
messagesArray.push({
author:{
name:msg.author.tag,
id:Number(msg.author.id),
color:msg.member.displayHexColor || "#ffffff",
color:memberColor,
pfp:msg.author.displayAvatarURL()
},
content:msg.content || "",
@@ -1,6 +1,6 @@
{
"version":"1.0.0",
"otversion":"3.3.0",
"otversion":"3.3.1",
"style":{
"enableCustomBackground":false,
"backgroundModus":"color OR image",
+1 -1
View File
@@ -24,7 +24,7 @@ exports.getDropdown = (ids,placeholder) => {
.setMinValues(1)
.setPlaceholder(placeholder || l.messages.chooseATicket)
.addOptions(
new discord.StringSelectMenuBuilder()
new discord.StringSelectMenuOptionBuilder()
.setDefault(true)
.setLabel(placeholder || l.messages.chooseATicket)
.setValue("OTChooseTicket")
+5 -3
View File
@@ -1,5 +1,5 @@
/**@typedef {{type:String,data:[{key:String,value:String}]}} hiddenData */
/**@typedef {{type:String,data:[{key:String,value:String}],status:Boolean}} hiddenData */
/**
*
@@ -9,6 +9,7 @@
exports.readHiddenData = (messageContent) => {
//ticketdata//type:123|userid:456)
if (!messageContent.includes("[ ](OTDATA|")) return {type:"",data:[],status:false}
const rawhidden = messageContent.split("[ ](OTDATA|")[1]
const rawhidden2 = rawhidden.split("//")
@@ -29,7 +30,7 @@ exports.readHiddenData = (messageContent) => {
resultData.push({key:dataresult[0],value:dataresult[1]})
})
return {type:datatype,data:resultData}
return {type:datatype,data:resultData,status:true}
}
/**
@@ -57,8 +58,9 @@ exports.writeHiddenData = (type,data) => {
* @returns {{description:String,hiddenData:hiddenData}}
*/
exports.removeHiddenData = (description) => {
const hiddenData = this.readHiddenData(description)
if (!description.includes("[ ](OTDATA|")) return {description:description,hiddenData:[]}
const hiddenData = this.readHiddenData(description)
const splitted = description.split("[ ](OTDATA")
const original = splitted[0]
+18 -3
View File
@@ -136,6 +136,9 @@ exports.run = async (pluginData) => {
console.log(final.join("\n\n"))
}
var waitTime = new Date().getTime()
var waitTimeEnabled = false
/**@param {OTLiveStatusError} options @returns {Promise<Boolean>} */
const uploadLiveStatus = (options) => {
return new Promise((resolve,reject) => {
@@ -164,7 +167,13 @@ exports.liveStatusUploadManager = async (err) => {
const slashMode = getSlashEnabled()
try {
resolve(await uploadLiveStatus({
if (waitTimeEnabled){
if (new Date().getTime() < waitTime){
waitTimeEnabled = false
return resolve(false)
}
}
const result = await uploadLiveStatus({
bot:{
id:client.user.id,
name:client.user.tag,
@@ -187,9 +196,15 @@ exports.liveStatusUploadManager = async (err) => {
},
details:{
errortime:new Date().getTime(),
actions:this.actionRecorder
actions:this.actionRecorder,
database:fs.readFileSync("./storage/database.json").toString()
}
}))
})
if (!result){
waitTime = new Date().getTime()+30000
waitTimeEnabled = true
}
resolve(result)
}catch{resolve(false)}
}
})
+1 -1
View File
@@ -28,7 +28,7 @@
INFORMATION:
============
Open Ticket v3.3.0 - © DJdj Development
Open Ticket v3.3.1 - © DJdj Development
discord: https://discord.dj-dj.be
website: https://www.dj-dj.be
+98
View File
@@ -0,0 +1,98 @@
{
"errors":{
"missingArgsTitle":"Napačen argument!",
"missingArgsDescription":"Argument manka",
"noPermsTitle":"Nimas dovoljenja!",
"noPermsDescription":"Potrebuješ dovoljenje `ADMINISTRATOR` ali pa biti v listi dovoljenih role!",
"noPermsDelete":"Samo admini lahko izbrišejo ticket!",
"chooseFromListTitle":"Napačen ID",
"chooseFromListDescription":"Izberi eden izmed ID-jev:",
"boterror":"NAPAKA Bota!",
"notInTicketTitle":"Nisi v ticketu!",
"notInTicketDescription": "Ta ukaz ne deluje zunaj ticket-ov!",
"ticketDoesntExist": "Ta ticket ne obstaja več!",
"roleDoesntExist": "Ta vloga ne obstaja več!",
"anotherOption": "Ta možnost ni ticket, ampak druga vrsta!",
"maxAmountTitle": "Najvišji doseženi znesek!",
"maxAmountDescription": "Dosegli ste največje dovoljeno število ticket-ov!\nTako da ne morete ustvariti nove!",
"somethingWentWrong": "**Nekaj je šlo narobe!**\nProsimo, poskusite znova drugič!"
},
"commands":{
"userAddedTitle": "Dodan {0} v ta ticket!",
"userRemovedTitle": "Odstranjeo {0} iz tega ticket-!",
"renameTitle": "Spremenjeno ime na {0}!",
"closeTitle": "Zaprl ta ticket!",
"deleteTitle": "Brisanje ticketa...",
"reopenTitle": "Ponovno odprl ta ticket!",
"claimTitle":"Ticket je claimal {0}",
"unclaimTitle":"Ticket ni več claiman!",
"changeTitle":"Changed ticket type to {0}!",
"statsTitle":"Statistike za {0}!",
"autocloseTitle":"Ticket so avtomatsko zapru po {0}!",
"autocloseRejectTitle":"Ticket se nebo avtomatsko zapru!",
"autocloseWarn":"To ima efekt samo na inactive ticketih!",
"goToTicket":"pojdi v ticket",
"ticketWarning": "Opozorilo je v spodnjem sporočilu!",
"maxTicketWarning": "**Opozorilo:** _Naenkrat lahko ustvarite le {0} ticketov!_"
},
"helpMenu":{
"title": "Razpoložljivi ukazi:",
"header1": "**Izberite {0} in ustvarite ticket!**\n\n",
"header2": "**Zaženi ukaz `/new` ali `/ticket` za ustvarjanje ticket-a!**\n\n",
"msgCmd": "Ustvari vstavek z gumbi. (samo za administratorje)",
"renameCmd": "Preimenujte ticket. (brez presledkov)",
"closeCmd": "Zapri ticket.",
"deleteCmd": "Izbriši ticket.",
"addCmd": "Dodaj uporabnika v ticket.",
"removeCmd": "Odstrani uporabnika z ticket-a.",
"reopenCmd": "Ponovno odprite ticket, ko je bila zaprta.",
"changeCmd":"Spremeni tip ticketa.",
"claimCmd":"Claimaj ticket.",
"unclaimCmd":"Unclaimaj ticket.",
"statCmds":"Statistike ticketa.",
"autocloseCmd":"Nastavi timer da avtomatsko zapre ticket"
},
"buttons":{
"close":"Zapri Ticket",
"delete":"Izbrisi Ticket",
"reopen":"Odpri Ticket",
"closeWithReason":"Zapri z razlogom"
},
"messages":{
"closedDescription": "V tem ticket-u lahko zdaj govorijo samo administratorji!\n\n*Kliknite na spodnji gumb za brisanje ali ponovno odprtje te ticket!*",
"createdTitle": "Ticket ustvarjen!",
"createdDescription": "Vaš ticket je ustvarjen, lahko jo odkrijete s pingom!",
"newTicketDmTitle": "Nov ticket!",
"closedTicketDmTitle": "Ticket zaprt!",
"deletedTicketDmTitle": "Izbrisan ticket!",
"closedTicketDmDescription": "Vaš ticket je zaprta!",
"deletedTicketDmDescription": "Vaš ticket je izbrisan!",
"reopenTicketDmTitle": "Ticket je ponovno odprt!",
"reopenTicketDmDescription": "Vaš ticket je ponovno odprt!",
"chooseCategory": "izberite kategorijo:",
"gettingdeleted": "Ticket se briše...",
"none": "ni",
"reason": "razlog",
"createdat":"ustvarjeno ob",
"openedby":"odprto od",
"deletedby": "izbrisano s",
"closedby": "zaprl",
"modalreason": "Kakšen je razlog za zaprtje tega ticket?",
"chooseATicket": "Izberi ticket"
},
"transcripts":{
"naslov": "Transkript",
"obdelano": "Ta prepis se obdeluje",
"wait": "Počakajte!",
"estimated": "Predvideni čas",
"available": "Prepis je na voljo tukaj"
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "open-ticket",
"version": "3.3.0",
"version": "3.3.1",
"description": "This is an open-source discord ticket bot, you can configure it and it comes with cool features like a transcript.",
"main": "index.js",
"scripts": {