v3.5.0 push 1

This commit is contained in:
DJj123dj
2023-11-29 19:29:27 +01:00
parent 7de9339da3
commit 4b17aa640f
48 changed files with 309 additions and 207 deletions
+4 -3
View File
@@ -10,10 +10,11 @@ Support for Open Ticket is only available for the versions specified below!
| Version | Supported | | Version | Supported |
|-----------|-------------------| |-----------|-------------------|
| 3.5.0 | ✅ |
| 3.4.4 | ✅ | | 3.4.4 | ✅ |
| 3.4.2 | ✅ | | 3.4.3 | ✅ |
| 3.4.1 | 🟧 | | 3.4.2 | 🟧 |
| < 3.4.1 | ❌ | | < 3.4.2 | ❌ |
## Reporting a Vulnerability ## Reporting a Vulnerability
+2 -2
View File
@@ -7,7 +7,7 @@ It is expected to have a public beta release somewhere around 30 September!
<img src="https://www.dj-dj.be/wp-content/uploads/2023/02/open-ticket-cropped.png" alt="Open Ticket" width="600px"> <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.4.4-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.4.4) [![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.5.0-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.5.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)
### Open Ticket ### Open Ticket
Open Ticket is the most customisable discord ticket bot that you will ever find! There are more than 150 options to customise in the config! This includes html transcripts, unlimited amount of tickets, custom embeds & more! Did you know that even the html transcripts are highly customisable? Don't wait and check it out! If you're having trouble setting the bot up, feel free to join our support server and we will help you further! Open Ticket is the most customisable discord ticket bot that you will ever find! There are more than 150 options to customise in the config! This includes html transcripts, unlimited amount of tickets, custom embeds & more! Did you know that even the html transcripts are highly customisable? Don't wait and check it out! If you're having trouble setting the bot up, feel free to join our support server and we will help you further!
@@ -71,7 +71,7 @@ Translators
|Ukrainian |anderskiy | |Ukrainian |anderskiy |
## links ## links
current version: _v3.4.4_ current version: _v3.5.0_
</br>changelog: [click here](https://docs.openticket.dj-dj.be/other/changelog) </br>changelog: [click here](https://docs.openticket.dj-dj.be/other/changelog)
</br>documentation: [click here](https://docs.openticket.dj-dj.be/quick-start) </br>documentation: [click here](https://docs.openticket.dj-dj.be/quick-start)
+13 -11
View File
@@ -18,15 +18,16 @@ module.exports = () => {
if (!user) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<user>`:\n`"+config.prefix+"add <user>`")]}) if (!user) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<user>`:\n`"+config.prefix+"add <user>`")]})
if (!msg.guild) return if (!msg.guild) return
if (!permsChecker.command(msg.author.id,msg.guild.id)){
permsChecker.sendUserNoPerms(msg.author)
return
}
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id) const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value const ticketId = hiddendata.find(d => d.key == "type").value
if (!permsChecker.ticket(msg.author.id,msg.guild.id,ticketId)){
permsChecker.sendUserNoPerms(msg.author)
return
}
msg.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true}) msg.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true})
msg.channel.send({embeds:[bot.embeds.commands.addEmbed(user,msg.author)]}) msg.channel.send({embeds:[bot.embeds.commands.addEmbed(user,msg.author)]})
@@ -37,7 +38,7 @@ module.exports = () => {
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
APIEvents.onTicketAdd(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData}) APIEvents.onTicketAdd(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("add",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) APIEvents.onCommand("add",permsChecker.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
}) })
if (!DISABLE.commands.slash.add) client.on("interactionCreate",async (interaction) => { if (!DISABLE.commands.slash.add) client.on("interactionCreate",async (interaction) => {
@@ -46,17 +47,18 @@ module.exports = () => {
const user = interaction.options.getUser("user") const user = interaction.options.getUser("user")
if (!interaction.guild) return if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
if (!permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
permsChecker.sendUserNoPerms(interaction.user) permsChecker.sendUserNoPerms(interaction.user)
return return
} }
await interaction.deferReply() await interaction.deferReply()
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
interaction.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true}) interaction.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true})
interaction.editReply({embeds:[bot.embeds.commands.addEmbed(user,interaction.user)]}) interaction.editReply({embeds:[bot.embeds.commands.addEmbed(user,interaction.user)]})
@@ -66,7 +68,7 @@ module.exports = () => {
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
APIEvents.onTicketAdd(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData}) APIEvents.onTicketAdd(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("add",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) APIEvents.onCommand("add",permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
} }
+13 -10
View File
@@ -17,15 +17,16 @@ module.exports = () => {
if (!msg.channel.isTextBased()) return if (!msg.channel.isTextBased()) return
if (!msg.guild) return if (!msg.guild) return
if (!permsChecker.command(msg.author.id,msg.guild.id)){
permsChecker.sendUserNoPerms(msg.author)
return
}
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id) const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value const ticketId = hiddendata.find(d => d.key == "type").value
if (!permsChecker.ticket(msg.author.id,msg.guild.id,ticketId)){
permsChecker.sendUserNoPerms(msg.author)
return
}
const list = [] const list = []
config.options.forEach((o) => { config.options.forEach((o) => {
if (o.type == "ticket") list.push(o.id) if (o.type == "ticket") list.push(o.id)
@@ -67,7 +68,7 @@ module.exports = () => {
log("command","someone used the 'change' command",[{key:"user",value:msg.author.username}]) log("command","someone used the 'change' command",[{key:"user",value:msg.author.username}])
log("system","ticket type changed",[{key:"user",value:msg.author.username},{key:"ticket",value:name},{key:"newtype",value:newtype}]) log("system","ticket type changed",[{key:"user",value:msg.author.username},{key:"ticket",value:name},{key:"newtype",value:newtype}])
APIEvents.onCommand("change",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) APIEvents.onCommand("change",permsChecker.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
}) })
if (!DISABLE.commands.slash.change) client.on("interactionCreate",async (interaction) => { if (!DISABLE.commands.slash.change) client.on("interactionCreate",async (interaction) => {
@@ -76,15 +77,17 @@ module.exports = () => {
if (!interaction.channel.isTextBased()) return if (!interaction.channel.isTextBased()) return
if (!interaction.guild) return if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
if (!permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
permsChecker.sendUserNoPerms(interaction.user) permsChecker.sendUserNoPerms(interaction.user)
return return
} }
await interaction.deferReply() await interaction.deferReply()
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
const list = [] const list = []
config.options.forEach((o) => { config.options.forEach((o) => {
@@ -126,6 +129,6 @@ module.exports = () => {
log("command","someone used the 'change' command",[{key:"user",value:interaction.user.username}]) log("command","someone used the 'change' command",[{key:"user",value:interaction.user.username}])
log("system","ticket type changed",[{key:"user",value:interaction.user.username},{key:"ticket",value:name},{key:"newtype",value:newtype}]) log("system","ticket type changed",[{key:"user",value:interaction.user.username},{key:"ticket",value:name},{key:"newtype",value:newtype}])
APIEvents.onCommand("change",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) APIEvents.onCommand("change",permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
} }
+13 -11
View File
@@ -21,15 +21,16 @@ module.exports = () => {
const claimingUser = user ? user : msg.author const claimingUser = user ? user : msg.author
if (!msg.guild) return if (!msg.guild) return
if (!permsChecker.command(msg.author.id,msg.guild.id)){
permsChecker.sendUserNoPerms(msg.author)
return
}
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id) const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value const ticketId = hiddendata.find(d => d.key == "type").value
if (!permsChecker.ticket(msg.author.id,msg.guild.id,ticketId)){
permsChecker.sendUserNoPerms(msg.author)
return
}
hiddendata.push({key:"claimedby",value:claimingUser.id}) hiddendata.push({key:"claimedby",value:claimingUser.id})
bot.hiddenData.writeHiddenData(msg.channel.id,hiddendata) bot.hiddenData.writeHiddenData(msg.channel.id,hiddendata)
storage.set("claimData",msg.channel.id,claimingUser.id) storage.set("claimData",msg.channel.id,claimingUser.id)
@@ -55,7 +56,7 @@ module.exports = () => {
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
APIEvents.onTicketClaim(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData}) APIEvents.onTicketClaim(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("claim",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) APIEvents.onCommand("claim",permsChecker.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
}) })
if (!DISABLE.commands.slash.claim) client.on("interactionCreate",async (interaction) => { if (!DISABLE.commands.slash.claim) client.on("interactionCreate",async (interaction) => {
@@ -64,17 +65,18 @@ module.exports = () => {
const user = interaction.options.getUser("user",false) ? interaction.options.getUser("user",true) : interaction.user const user = interaction.options.getUser("user",false) ? interaction.options.getUser("user",true) : interaction.user
if (!interaction.guild) return if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
if (!permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
permsChecker.sendUserNoPerms(interaction.user) permsChecker.sendUserNoPerms(interaction.user)
return interaction.reply({content:":x: "+l.errors.noPermsTitle,ephemeral:true}) return interaction.reply({content:":x: "+l.errors.noPermsTitle,ephemeral:true})
} }
await interaction.deferReply() await interaction.deferReply()
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
hiddendata.push({key:"claimedby",value:user.id}) hiddendata.push({key:"claimedby",value:user.id})
bot.hiddenData.writeHiddenData(interaction.channel.id,hiddendata) bot.hiddenData.writeHiddenData(interaction.channel.id,hiddendata)
storage.set("claimData",interaction.channel.id,user.id) storage.set("claimData",interaction.channel.id,user.id)
@@ -100,6 +102,6 @@ module.exports = () => {
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
APIEvents.onTicketClaim(interaction.user,user,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData}) APIEvents.onTicketClaim(interaction.user,user,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("claim",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) APIEvents.onCommand("claim",permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
} }
+13 -11
View File
@@ -16,15 +16,16 @@ module.exports = () => {
if (!msg.content.startsWith(config.prefix+"delete")) return if (!msg.content.startsWith(config.prefix+"delete")) return
if (!msg.guild) return if (!msg.guild) return
if (!permsChecker.command(msg.author.id,msg.guild.id)){
permsChecker.sendUserNoPerms(msg.author)
return
}
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id) const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value const ticketId = hiddendata.find(d => d.key == "type").value
if (!permsChecker.ticket(msg.author.id,msg.guild.id,ticketId)){
permsChecker.sendUserNoPerms(msg.author)
return
}
msg.channel.send({embeds:[bot.embeds.commands.deleteEmbed(msg.author)]}) msg.channel.send({embeds:[bot.embeds.commands.deleteEmbed(msg.author)]})
var name = msg.channel.name var name = msg.channel.name
@@ -39,7 +40,7 @@ module.exports = () => {
require("../core/ticketActions/ticketCloser").closeManager(msg.member,msg.channel,prefix,"delete",false,true) require("../core/ticketActions/ticketCloser").closeManager(msg.member,msg.channel,prefix,"delete",false,true)
log("command","someone used the 'delete' command",[{key:"user",value:msg.author.username}]) log("command","someone used the 'delete' command",[{key:"user",value:msg.author.username}])
APIEvents.onCommand("delete",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) APIEvents.onCommand("delete",permsChecker.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
}) })
@@ -48,17 +49,18 @@ module.exports = () => {
if (interaction.commandName != "delete") return if (interaction.commandName != "delete") return
if (!interaction.guild) return if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
if (!permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
permsChecker.sendUserNoPerms(interaction.user) permsChecker.sendUserNoPerms(interaction.user)
return interaction.reply({embeds:[bot.errorLog.noPermsDelete(interaction.user)]}) return interaction.reply({embeds:[bot.errorLog.noPermsDelete(interaction.user)]})
} }
await interaction.deferReply() await interaction.deferReply()
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
interaction.editReply({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) interaction.editReply({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
var name = interaction.channel.name var name = interaction.channel.name
@@ -73,6 +75,6 @@ module.exports = () => {
require("../core/ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"delete",false,true) require("../core/ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"delete",false,true)
log("command","someone used the 'delete' command",[{key:"user",value:interaction.user.username}]) log("command","someone used the 'delete' command",[{key:"user",value:interaction.user.username}])
APIEvents.onCommand("delete",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) APIEvents.onCommand("delete",permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
} }
+13 -11
View File
@@ -18,15 +18,16 @@ module.exports = () => {
if (!user) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<user>`:\n`"+config.prefix+"remove <user>`")]}) if (!user) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<user>`:\n`"+config.prefix+"remove <user>`")]})
if (!msg.guild) return if (!msg.guild) return
if (!permsChecker.command(msg.author.id,msg.guild.id)){
permsChecker.sendUserNoPerms(msg.author)
return
}
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id) const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value const ticketId = hiddendata.find(d => d.key == "type").value
if (!permsChecker.ticket(msg.author.id,msg.guild.id,ticketId)){
permsChecker.sendUserNoPerms(msg.author)
return
}
msg.channel.permissionOverwrites.delete(user.id) msg.channel.permissionOverwrites.delete(user.id)
msg.channel.send({embeds:[bot.embeds.commands.removeEmbed(user,msg.author)]}) msg.channel.send({embeds:[bot.embeds.commands.removeEmbed(user,msg.author)]})
@@ -37,7 +38,7 @@ module.exports = () => {
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
APIEvents.onTicketRemove(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData}) APIEvents.onTicketRemove(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("remove",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) APIEvents.onCommand("remove",permsChecker.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
}) })
if (!DISABLE.commands.slash.remove) client.on("interactionCreate",async (interaction) => { if (!DISABLE.commands.slash.remove) client.on("interactionCreate",async (interaction) => {
@@ -46,17 +47,18 @@ module.exports = () => {
const user = interaction.options.getUser("user") const user = interaction.options.getUser("user")
if (!interaction.guild) return if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
if (!permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
permsChecker.sendUserNoPerms(interaction.user) permsChecker.sendUserNoPerms(interaction.user)
return return
} }
await interaction.deferReply() await interaction.deferReply()
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
interaction.channel.permissionOverwrites.delete(user.id) interaction.channel.permissionOverwrites.delete(user.id)
interaction.editReply({embeds:[bot.embeds.commands.removeEmbed(user,interaction.user)]}) interaction.editReply({embeds:[bot.embeds.commands.removeEmbed(user,interaction.user)]})
@@ -67,6 +69,6 @@ module.exports = () => {
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
APIEvents.onTicketRemove(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData}) APIEvents.onTicketRemove(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("remove",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) APIEvents.onCommand("remove",permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
} }
+13 -11
View File
@@ -16,15 +16,16 @@ module.exports = () => {
if (!msg.content.startsWith(config.prefix+"rename")) return if (!msg.content.startsWith(config.prefix+"rename")) return
if (!msg.guild) return if (!msg.guild) return
if (!permsChecker.command(msg.author.id,msg.guild.id)){
permsChecker.sendUserNoPerms(msg.author)
return
}
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id) const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value const ticketId = hiddendata.find(d => d.key == "type").value
if (!permsChecker.ticket(msg.author.id,msg.guild.id,ticketId)){
permsChecker.sendUserNoPerms(msg.author)
return
}
var newname = msg.content.split(config.prefix+"rename")[1].substring(1) var newname = msg.content.split(config.prefix+"rename")[1].substring(1)
if (!newname) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<name>`:\n`"+config.prefix+"rename <name>`")]}) if (!newname) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<name>`:\n`"+config.prefix+"rename <name>`")]})
@@ -44,7 +45,7 @@ module.exports = () => {
log("command","someone used the 'rename' command",[{key:"user",value:msg.author.username}]) log("command","someone used the 'rename' command",[{key:"user",value:msg.author.username}])
log("system","ticket renamed",[{key:"user",value:msg.author.username},{key:"ticket",value:name},{key:"newname",value:newname}]) log("system","ticket renamed",[{key:"user",value:msg.author.username},{key:"ticket",value:name},{key:"newname",value:newname}])
APIEvents.onCommand("rename",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) APIEvents.onCommand("rename",permsChecker.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
}) })
if (!DISABLE.commands.slash.rename) client.on("interactionCreate",async (interaction) => { if (!DISABLE.commands.slash.rename) client.on("interactionCreate",async (interaction) => {
@@ -52,17 +53,18 @@ module.exports = () => {
if (interaction.commandName != "rename") return if (interaction.commandName != "rename") return
if (!interaction.guild) return if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
if (!permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
permsChecker.sendUserNoPerms(interaction.user) permsChecker.sendUserNoPerms(interaction.user)
return return
} }
await interaction.deferReply() await interaction.deferReply()
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
var newname = interaction.options.getString("name") var newname = interaction.options.getString("name")
var name = interaction.channel.name var name = interaction.channel.name
var prefix = "" var prefix = ""
@@ -81,6 +83,6 @@ module.exports = () => {
log("command","someone used the 'rename' command",[{key:"user",value:interaction.user.username}]) log("command","someone used the 'rename' command",[{key:"user",value:interaction.user.username}])
log("system","ticket renamed",[{key:"user",value:interaction.user.username},{key:"ticket",value:name},{key:"newname",value:newname}]) log("system","ticket renamed",[{key:"user",value:interaction.user.username},{key:"ticket",value:name},{key:"newname",value:newname}])
APIEvents.onCommand("rename",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) APIEvents.onCommand("rename",permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
} }
+4 -4
View File
@@ -23,7 +23,7 @@ module.exports = () => {
if (msg.content.startsWith(config.prefix+"msg"||config.prefix+"message")){ if (msg.content.startsWith(config.prefix+"msg"||config.prefix+"message")){
if (!msg.guild) return if (!msg.guild) return
if (!permsChecker.command(msg.author.id,msg.guild.id)){ if (!permsChecker.global(msg.author.id,msg.guild.id)){
permsChecker.sendUserNoPerms(msg.author) permsChecker.sendUserNoPerms(msg.author)
return return
} }
@@ -39,7 +39,7 @@ module.exports = () => {
msg.channel.send({embeds:[embed],components:componentRows}) msg.channel.send({embeds:[embed],components:componentRows})
log("command","someone used the 'message' command",[{key:"user",value:msg.author.username},{key:"id",value:id}]) log("command","someone used the 'message' command",[{key:"user",value:msg.author.username},{key:"id",value:id}])
APIEvents.onCommand("message",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) APIEvents.onCommand("message",permsChecker.global(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
} }
}) })
@@ -48,7 +48,7 @@ module.exports = () => {
if (interaction.commandName != "message") return if (interaction.commandName != "message") return
if (!interaction.guild) return if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){ if (!permsChecker.global(interaction.user.id,interaction.guild.id)){
permsChecker.sendUserNoPerms(interaction.user) permsChecker.sendUserNoPerms(interaction.user)
return return
} }
@@ -64,7 +64,7 @@ module.exports = () => {
log("command","someone used the 'message' command",[{key:"user",value:interaction.user.username},{key:"id",value:id}]) log("command","someone used the 'message' command",[{key:"user",value:interaction.user.username},{key:"id",value:id}])
APIEvents.onCommand("message",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) APIEvents.onCommand("message",permsChecker.global(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
} }
+14 -12
View File
@@ -18,7 +18,12 @@ module.exports = () => {
if (!msg.content.startsWith(config.prefix+"unclaim")) return if (!msg.content.startsWith(config.prefix+"unclaim")) return
if (!msg.guild) return if (!msg.guild) return
if (!permsChecker.command(msg.author.id,msg.guild.id)){
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
if (!permsChecker.ticket(msg.author.id,msg.guild.id,ticketId)){
permsChecker.sendUserNoPerms(msg.author) permsChecker.sendUserNoPerms(msg.author)
return return
} }
@@ -26,10 +31,6 @@ module.exports = () => {
const unclaimuser = storage.get("claimData",msg.channel.id) const unclaimuser = storage.get("claimData",msg.channel.id)
if (!unclaimuser || unclaimuser == "false") return msg.channel.send({embeds:[bot.errorLog.serverError("This ticket isn't claimed yet!")]}) if (!unclaimuser || unclaimuser == "false") return msg.channel.send({embeds:[bot.errorLog.serverError("This ticket isn't claimed yet!")]})
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
hiddendata.push({key:"claimedby",value:"false"}) hiddendata.push({key:"claimedby",value:"false"})
bot.hiddenData.writeHiddenData(msg.channel.id,hiddendata) bot.hiddenData.writeHiddenData(msg.channel.id,hiddendata)
storage.set("claimData",msg.channel.id,"false") storage.set("claimData",msg.channel.id,"false")
@@ -62,7 +63,7 @@ module.exports = () => {
APIEvents.onTicketUnclaim(msg.author,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData}) APIEvents.onTicketUnclaim(msg.author,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("unclaim",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) APIEvents.onCommand("unclaim",permsChecker.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
}) })
}) })
@@ -71,7 +72,12 @@ module.exports = () => {
if (interaction.commandName != "unclaim") return if (interaction.commandName != "unclaim") return
if (!interaction.guild) return if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
if (!permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
permsChecker.sendUserNoPerms(interaction.user) permsChecker.sendUserNoPerms(interaction.user)
interaction.reply({content:":x: "+l.errors.noPermsTitle,ephemeral:true}) interaction.reply({content:":x: "+l.errors.noPermsTitle,ephemeral:true})
return return
@@ -82,10 +88,6 @@ module.exports = () => {
const unclaimuser = storage.get("claimData",interaction.channel.id) const unclaimuser = storage.get("claimData",interaction.channel.id)
if (!unclaimuser || unclaimuser == "false") return interaction.editReply({embeds:[bot.errorLog.serverError("This ticket isn't claimed yet!")]}) if (!unclaimuser || unclaimuser == "false") return interaction.editReply({embeds:[bot.errorLog.serverError("This ticket isn't claimed yet!")]})
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
hiddendata.push({key:"claimedby",value:"false"}) hiddendata.push({key:"claimedby",value:"false"})
bot.hiddenData.writeHiddenData(interaction.channel.id,hiddendata) bot.hiddenData.writeHiddenData(interaction.channel.id,hiddendata)
storage.set("claimData",interaction.channel.id,"false") storage.set("claimData",interaction.channel.id,"false")
@@ -117,7 +119,7 @@ module.exports = () => {
log("system","user unclaimed from ticket",[{key:"user",value:interaction.user.username},{key:"ticket",value:interaction.channel.name},{key:"unclaimed_user",value:unclaimuser}]) log("system","user unclaimed from ticket",[{key:"user",value:interaction.user.username},{key:"ticket",value:interaction.channel.name},{key:"unclaimed_user",value:unclaimuser}])
APIEvents.onTicketUnclaim(interaction.user,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData}) APIEvents.onTicketUnclaim(interaction.user,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("unclaim",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) APIEvents.onCommand("unclaim",permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
}) })
} }
+1 -1
View File
@@ -111,7 +111,7 @@
"dropdown":false, "dropdown":false,
"enableFooter":false, "enableFooter":false,
"footer":"Open Ticket v3.4.4 - I'm a footer!", "footer":"Open Ticket v3.5.0 - I'm a footer!",
"enableFooterImage":false, "enableFooterImage":false,
"footerImage":"https://www.example.com/catmemes/cat.png", "footerImage":"https://www.example.com/catmemes/cat.png",
+1 -1
View File
@@ -434,7 +434,7 @@ exports.checker = async () => {
//status: //status:
checkType(config.status.enabled,"boolean","status/enabled") checkType(config.status.enabled,"boolean","status/enabled")
if (config.status.enabled){ if (config.status.enabled){
if (config.status.type != "PLAYING" && config.status.type != "LISTENING" && config.status.type != "WATCHING"){ if (config.status.type != "PLAYING" && config.status.type != "LISTENING" && config.status.type != "WATCHING" && config.status.type != "CUSTOM"){
createError("'status/type' | not a valid status type! (LISTENING,WATCHING,PLAYING)") createError("'status/type' | not a valid status type! (LISTENING,WATCHING,PLAYING)")
} }
if (config.status.text.length < 1){ if (config.status.text.length < 1){
+82
View File
@@ -0,0 +1,82 @@
const fs = require("fs")
const location = "./storage/stats.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
* @returns {[{key:String,value:String}]|false}
*/
exports.getCategory = (category) => {
const currentData = getData()
const result = currentData.filter((v) => v.category == category)
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
}
@@ -1,43 +0,0 @@
const localstorage = require("node-localstorage")
const ls = new localstorage.LocalStorage("./storage/dynamicDB")
/**
*
* @param {String} category
* @param {String} id
* @param {String} value
* @returns {Boolean}
*/
exports.set = (category,id,value) => {
ls.setItem(category+"--"+id,value.toString())
return true
}
/**
*
* @param {String} category
* @param {String} id
* @returns {String|false}
*/
exports.get = (category,id) => {
const result = ls.getItem(category+"--"+id)
if (!result) return false
return result
}
/**
*
* @param {String} category
* @param {String} id
* @returns {Boolean}
*/
exports.delete = (category,id) => {
ls.removeItem(category+"--"+id)
return true
}
this.set("category","key","value")
this.get("category","key",)
this.delete("category","key")
+7 -3
View File
@@ -9,11 +9,15 @@ ALL DATABASE FILES NEED TO EXPORT THE FOLLOWING FUNCTIONS:
*/ */
try { try {
var db = require("./dynamicfiles/database") var main = require("./databases/main")
var stats = require("./databases/stats")
}catch(err){ }catch(err){
console.log(err) console.log(err)
console.log("I couldn't find the database file! (location: ./core/dynamicdatabase/storage.js:2)") console.log("Unable to find the database handlers!")
process.exit(1) process.exit(1)
} }
module.exports = db module.exports = {
main,
stats
}
+9 -9
View File
@@ -14,7 +14,7 @@ const c = discord.Colors
exports.noPermsMessage = (user) => { exports.noPermsMessage = (user) => {
return new embed() return new embed()
.setColor(c.Red) .setColor(c.Red)
.setTitle(":x: "+l.errors.noPermsTitle) .setTitle("❌ "+l.errors.noPermsTitle)
.setDescription(l.errors.noPermsDescription) .setDescription(l.errors.noPermsDescription)
.setFooter({iconURL:user.displayAvatarURL(),text:user.username}) .setFooter({iconURL:user.displayAvatarURL(),text:user.username})
} }
@@ -23,7 +23,7 @@ exports.noPermsMessage = (user) => {
exports.noPermsDelete = (user) => { exports.noPermsDelete = (user) => {
return new embed() return new embed()
.setColor(c.Red) .setColor(c.Red)
.setTitle(":x: "+l.errors.noPermsTitle) .setTitle("❌ "+l.errors.noPermsTitle)
.setDescription(l.errors.noPermsDelete) .setDescription(l.errors.noPermsDelete)
.setFooter({iconURL:user.displayAvatarURL(),text:user.username}) .setFooter({iconURL:user.displayAvatarURL(),text:user.username})
} }
@@ -32,7 +32,7 @@ exports.noPermsDelete = (user) => {
exports.invalidArgsMessage = (message) => { exports.invalidArgsMessage = (message) => {
var x = new embed() var x = new embed()
.setColor(c.Red) .setColor(c.Red)
.setTitle(":x: "+l.errors.missingArgsTitle) .setTitle("❌ "+l.errors.missingArgsTitle)
.setDescription(message) .setDescription(message)
return x return x
@@ -42,7 +42,7 @@ exports.invalidArgsMessage = (message) => {
exports.serverError = (message) => { exports.serverError = (message) => {
var x = new embed() var x = new embed()
.setColor(c.Orange) .setColor(c.Orange)
.setTitle(":warning: "+l.errors.boterror) .setTitle("⚠️ "+l.errors.boterror)
.setDescription(message) .setDescription(message)
return x return x
@@ -53,19 +53,19 @@ exports.invalidIdChooseFromList = (list,message) => {
const beforemsg = message ? message+"\n\n" : "" const beforemsg = message ? message+"\n\n" : ""
var x = new embed() var x = new embed()
.setColor(c.Red) .setColor(c.Red)
.setTitle(":x: "+l.errors.chooseFromListTitle) .setTitle("❌ "+l.errors.chooseFromListTitle)
.setDescription(beforemsg+l.errors.chooseFromListDescription+"\n`"+list.join("`\n`")+"`") .setDescription(beforemsg+l.errors.chooseFromListDescription+"\n`"+list.join("`\n`")+"`")
return x return x
} }
exports.failedRenameChannel = new embed() exports.failedRenameChannel = new embed()
.setColor(c.Red) .setColor(c.Red)
.setTitle(":x: Failed to rename channel") .setTitle("❌ Failed to rename channel")
.setDescription("Discord channels can only be renamed twice every 10 minutes! Open Ticket can't do anything about this error!") .setDescription("Discord channels can only be renamed twice every 10 minutes! Open Ticket can't do anything about this error!")
exports.notInATicket = new embed() exports.notInATicket = new embed()
.setColor(c.Red) .setColor(c.Red)
.setTitle(":x: "+l.errors.notInTicketTitle) .setTitle("❌ "+l.errors.notInTicketTitle)
.setDescription(l.errors.notInTicketDescription) .setDescription(l.errors.notInTicketDescription)
@@ -73,7 +73,7 @@ exports.notInATicket = new embed()
exports.success = (title,message) => { exports.success = (title,message) => {
var x = new embed() var x = new embed()
.setColor(config.color) .setColor(config.color)
.setTitle(":white_check_mark: "+title) .setTitle("✅ "+title)
.setDescription(message) .setDescription(message)
return x return x
@@ -83,7 +83,7 @@ exports.success = (title,message) => {
exports.warning = (title,message) => { exports.warning = (title,message) => {
var x = new embed() var x = new embed()
.setColor(c.Orange) .setColor(c.Orange)
.setTitle(":warning: "+title) .setTitle("⚠️ "+title)
.setDescription(message) .setDescription(message)
return x return x
@@ -26,15 +26,16 @@ module.exports = () => {
}catch{} }catch{}
if (!interaction.guild) return if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
permsChecker.sendUserNoPerms(interaction.user)
return
}
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id) const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value const ticketId = hiddendata.find(d => d.key == "type").value
if (!permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
permsChecker.sendUserNoPerms(interaction.user)
return
}
hiddendata.push({key:"claimedby",value:interaction.user.id}) hiddendata.push({key:"claimedby",value:interaction.user.id})
bot.hiddenData.writeHiddenData(interaction.channel.id,hiddendata) bot.hiddenData.writeHiddenData(interaction.channel.id,hiddendata)
storage.set("claimData",interaction.channel.id,interaction.user.id) storage.set("claimData",interaction.channel.id,interaction.user.id)
@@ -31,8 +31,12 @@ module.exports = () => {
const firstcomponents = interaction.message.components const firstcomponents = interaction.message.components
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
if (config.system.closeMode == "adminonly"){ if (config.system.closeMode == "adminonly"){
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){ if (!permissionChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
if (!permissionChecker.sendUserNoPerms(interaction.user)){ if (!permissionChecker.sendUserNoPerms(interaction.user)){
permissionChecker.sendChannelNoPerms(interaction.channel,interaction.user) permissionChecker.sendChannelNoPerms(interaction.channel,interaction.user)
} }
@@ -56,8 +56,12 @@ module.exports = () => {
const firstcomponents = interaction.message.components const firstcomponents = interaction.message.components
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
if (config.system.closeMode == "adminonly"){ if (config.system.closeMode == "adminonly"){
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){ if (!permissionChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
if (!permissionChecker.sendUserNoPerms(interaction.user)){ if (!permissionChecker.sendUserNoPerms(interaction.user)){
permissionChecker.sendChannelNoPerms(interaction.channel,interaction.user) permissionChecker.sendChannelNoPerms(interaction.channel,interaction.user)
} }
@@ -29,7 +29,11 @@ module.exports = () => {
const firstcomponents = bot.buttons.close.openRowNormal const firstcomponents = bot.buttons.close.openRowNormal
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){ const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
if (!permissionChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
if (!permissionChecker.sendUserNoDelete(interaction.user)){ if (!permissionChecker.sendUserNoDelete(interaction.user)){
permissionChecker.sendChannelNoDelete(interaction.channel,interaction.user) permissionChecker.sendChannelNoDelete(interaction.channel,interaction.user)
} }
@@ -69,7 +73,11 @@ module.exports = () => {
const firstcomponents = bot.buttons.close.closeCommandRow const firstcomponents = bot.buttons.close.closeCommandRow
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){ const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
if (!permissionChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
if (!permissionChecker.sendUserNoDelete(interaction.user)){ if (!permissionChecker.sendUserNoDelete(interaction.user)){
permissionChecker.sendChannelNoDelete(interaction.channel,interaction.user) permissionChecker.sendChannelNoDelete(interaction.channel,interaction.user)
} }
+12 -19
View File
@@ -51,9 +51,14 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
if (mode == "delete" || mode == "deletenotranscript"){ if (mode == "delete" || mode == "deletenotranscript"){
//delete //delete
const hiddendata = bot.hiddenData.readHiddenData(channel.id)
if (hiddendata.length < 1) return channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
//check perms //check perms
if (!guild) return if (!guild) return
if (!permsChecker.command(user.id,guild.id)){ if (!permsChecker.ticket(user.id,guild.id,ticketId)){
permsChecker.sendUserNoPerms(user) permsChecker.sendUserNoPerms(user)
return return
} }
@@ -72,13 +77,6 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
storage.delete("autocloseTickets",channel.id) storage.delete("autocloseTickets",channel.id)
if (Number(storage.get("amountOfUserTickets",getuserID)) < 0) storage.set("amountOfUserTickets",getuserID,0) if (Number(storage.get("amountOfUserTickets",getuserID)) < 0) storage.set("amountOfUserTickets",getuserID,0)
//getID & send DM & send api event
const hiddendata = bot.hiddenData.readHiddenData(channel.id)
if (hiddendata.length < 1) return channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.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}) require("../api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData})
hiddendata.push({key:"pendingdelete",value:"true"}) hiddendata.push({key:"pendingdelete",value:"true"})
@@ -86,10 +84,15 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
}else if (mode == "close"){ }else if (mode == "close"){
//close //close
const hiddendata = bot.hiddenData.readHiddenData(channel.id)
if (hiddendata.length < 1) return channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
//check perms //check perms
if (config.system.closeMode == "adminonly"){ if (config.system.closeMode == "adminonly"){
if (!guild) return if (!guild) return
if (!permsChecker.command(user.id,guild.id)){ if (!permsChecker.ticket(user.id,guild.id,ticketId)){
permsChecker.sendUserNoPerms(user) permsChecker.sendUserNoPerms(user)
return return
} }
@@ -129,16 +132,6 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
} }
}) })
//ticketinfo error
const ticketInfoError = bot.errorLog.serverError("Unable to detect ticket information.\n*(First message that this bot sends)*\n\n__**Possible reasons:**__\n- you unpinned the first message\n- the first message is deleted\n- it has been unpinned & repinned after another message has been pinned.\n\n__**Possible solutions:**__\n- unpin all messages in this channel & repin the first message that this bot sent.\nIf this doesn't work, just delete the ticket manually!")
//add ticket adminroles
const hiddendata = bot.hiddenData.readHiddenData(channel.id)
if (hiddendata.length < 1) return channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
if (!ticketData) return if (!ticketData) return
if (ticketData.closedCategory.enable){ if (ticketData.closedCategory.enable){
/**@type {discord.CategoryChannel} */ /**@type {discord.CategoryChannel} */
+1 -1
View File
@@ -189,7 +189,7 @@ exports.liveStatusUploadManager = async (err) => {
//system:config.system //system:config.system
}, },
language:config.languageFile, language:config.languageFile,
version:"3.4.4", version:"3.5.0",
slashcmds:slashMode, slashcmds:slashMode,
transcripts:transcriptMode, transcripts:transcriptMode,
plugins:fs.readdirSync("./plugins"), plugins:fs.readdirSync("./plugins"),
+29 -2
View File
@@ -12,12 +12,12 @@ const storage = bot.storage
* @param {String} guildid * @param {String} guildid
* @returns {Boolean} has permissions? * @returns {Boolean} has permissions?
*/ */
exports.command = (memberid,guildid) => { exports.global = (memberid,guildid) => {
bot.actionRecorder.push({ bot.actionRecorder.push({
category:"ot.managers.permissionChecker", category:"ot.managers.permissionChecker",
file:"./core/permissionChecker.js", file:"./core/permissionChecker.js",
time:new Date().getTime(), time:new Date().getTime(),
type:"command" type:"global"
}) })
const permsmember = client.guilds.cache.find(g => g.id == guildid).members.cache.find(m => m.id == memberid) const permsmember = client.guilds.cache.find(g => g.id == guildid).members.cache.find(m => m.id == memberid)
if (config.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")){
@@ -25,6 +25,33 @@ exports.command = (memberid,guildid) => {
}else {return true} }else {return true}
} }
/**
*
* @param {String} memberid
* @param {String} guildid
* @param {String} optionid
* @returns {Boolean} has permissions?
*/
exports.ticket = (memberid,guildid,optionid) => {
bot.actionRecorder.push({
category:"ot.managers.permissionChecker",
file:"./core/permissionChecker.js",
time:new Date().getTime(),
type:"ticket"
})
const option = config.options.find((opt) => opt.id == optionid)
const ticketadmins = option && option.adminroles ? option.adminroles : []
const permsmember = client.guilds.cache.find(g => g.id == guildid).members.cache.find(m => m.id == memberid)
const isGlobalAdmin = config.adminRoles.some((item)=>{return permsmember.roles.cache.has(item)})
const isTicketAdmin = ticketadmins.some((item)=>{return permsmember.roles.cache.has(item)})
const hasAdministrator = permsmember.permissions.has("Administrator")
const hasManageGuild = permsmember.permissions.has("ManageGuild")
return isGlobalAdmin || isTicketAdmin || hasAdministrator || hasManageGuild
}
/** /**
* *
* @param {discord.User} user * @param {discord.User} user
+16 -10
View File
@@ -28,7 +28,7 @@
INFORMATION: INFORMATION:
============ ============
Open Ticket v3.4.4 - © DJdj Development Open Ticket v3.5.0 - © DJdj Development
discord: https://discord.dj-dj.be discord: https://discord.dj-dj.be
website: https://www.dj-dj.be website: https://www.dj-dj.be
@@ -87,9 +87,12 @@ exports.language = language
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded language") if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded language")
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded config") if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded config")
exports.storage = require('./core/dynamicdatabase/storage') exports.storage = require('./core/dynamicdatabase/storage').main
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded storage") if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded storage")
exports.statsStorage = require('./core/dynamicdatabase/storage').stats
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded stats storage")
exports.errorLog = require("./core/errorLogSystem") exports.errorLog = require("./core/errorLogSystem")
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","LOADED LOGGING SYSTEM") if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","LOADED LOGGING SYSTEM")
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","switching to new logs") if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","switching to new logs")
@@ -118,17 +121,19 @@ client.on('ready',async () => {
time:new Date().getTime(), time:new Date().getTime(),
type:"client.loggedin.success" type:"client.loggedin.success"
}) })
var statusSet = false
const setStatus = (type,text) => { const setStatus = (type,text) => {
if (statusSet == true) return const getTypeEnum = (type) => {
const getTypeEnum = (text) => { if (type.toLowerCase() == "playing") return discord.ActivityType.Playing
if (text.toLowerCase() == "playing") return discord.ActivityType.Playing else if (type.toLowerCase() == "listening") return discord.ActivityType.Listening
else if (text.toLowerCase() == "listening") return discord.ActivityType.Listening else if (type.toLowerCase() == "watching") return discord.ActivityType.Watching
else if (text.toLowerCase() == "watching") return discord.ActivityType.Watching else if (type.toLowerCase() == "custom") return discord.ActivityType.Custom
else return discord.ActivityType.Listening else return discord.ActivityType.Listening
} }
client.user.setActivity(text,{type:getTypeEnum(type)}) client.user.setActivity({
statusSet = true type:getTypeEnum(type),
state:(text.toLowerCase() == "custom") ? text : undefined,
name:text
})
} }
this.errorLog.log("debug","bot status loaded") this.errorLog.log("debug","bot status loaded")
this.actionRecorder.push({ this.actionRecorder.push({
@@ -153,6 +158,7 @@ client.on('ready',async () => {
this.errorLog.log("debug","loaded console interface") this.errorLog.log("debug","loaded console interface")
if (config.status.enabled){ if (config.status.enabled){
console.log("TEST STATUS (delete me)")
setStatus(config.status.type,config.status.text) setStatus(config.status.type,config.status.text)
} }
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"ChilledBroke#9986 & M4#5882", "_CREDITS":"ChilledBroke#9986 & M4#5882",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors": { "errors": {
"missingArgsTitle": "قيمة غير صالحة!", "missingArgsTitle": "قيمة غير صالحة!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"DJdj Development", "_CREDITS":"DJdj Development",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Invalid Arguments!", "missingArgsTitle":"Invalid Arguments!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"spyeye_", "_CREDITS":"spyeye_",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Neplatný Argument!", "missingArgsTitle":"Neplatný Argument!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"the_gamer#5095", "_CREDITS":"the_gamer#5095",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors": { "errors": {
"missingArgsTitle": "Ugyldigt Argument!", "missingArgsTitle": "Ugyldigt Argument!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"DJj123dj#1706", "_CREDITS":"DJj123dj#1706",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Onjuiste parameters!", "missingArgsTitle":"Onjuiste parameters!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"DJdj Development", "_CREDITS":"DJdj Development",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Invalid Arguments!", "missingArgsTitle":"Invalid Arguments!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"Sanke#6086", "_CREDITS":"Sanke#6086",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Arguments invalides!", "missingArgsTitle":"Arguments invalides!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"david.#8276 ", "_CREDITS":"david.#8276 ",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Ungültiges Argument!", "missingArgsTitle":"Ungültiges Argument!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"ꙅoᴎɒᎸɘƚꙅ#3744", "_CREDITS":"ꙅoᴎɒᎸɘƚꙅ#3744",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Invalid Arguments!", "missingArgsTitle":"Invalid Arguments!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"Snowy", "_CREDITS":"Snowy",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Hibás paraméterek!", "missingArgsTitle":"Hibás paraméterek!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"erxg", "_CREDITS":"erxg",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Argumen tidak valid!", "missingArgsTitle":"Argumen tidak valid!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"Maurizio#0268", "_CREDITS":"Maurizio#0268",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Argomenti non validi!", "missingArgsTitle":"Argomenti non validi!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"NoOneNook#0266", "_CREDITS":"NoOneNook#0266",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Ugyldige argumenter!", "missingArgsTitle":"Ugyldige argumenter!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"MKevas#8311", "_CREDITS":"MKevas#8311",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Nieprawidłowe argumenty!", "missingArgsTitle":"Nieprawidłowe argumenty!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"QuirAddon#9778", "_CREDITS":"QuirAddon#9778",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Argumentos inválidos!", "missingArgsTitle":"Argumentos inválidos!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"Sanke#6086", "_CREDITS":"Sanke#6086",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Argumente Invalide", "missingArgsTitle":"Argumente Invalide",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"Apexo#0723", "_CREDITS":"Apexo#0723",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Неверные аргументы!", "missingArgsTitle":"Неверные аргументы!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"n1kkec#5341", "_CREDITS":"n1kkec#5341",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Napačen argument!", "missingArgsTitle":"Napačen argument!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"Redactado#1673 & josuens14#5267", "_CREDITS":"Redactado#1673 & josuens14#5267",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"¡Argumentos inválidos!", "missingArgsTitle":"¡Argumentos inválidos!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"Mods HD#0661", "_CREDITS":"Mods HD#0661",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"อาร์กิวเมนต์ไม่ถูกต้อง!", "missingArgsTitle":"อาร์กิวเมนต์ไม่ถูกต้อง!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"Hydrâelčhâvø#1575", "_CREDITS":"Hydrâelčhâvø#1575",
"_INFO":"This file is a translation for open ticket 3.4.4", "_INFO":"This file is a translation for open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Geçersiz argümanlar!", "missingArgsTitle":"Geçersiz argümanlar!",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_CREDITS":"Anderskiy#4093", "_CREDITS":"Anderskiy#4093",
"_INFO":"Цей файл є перекладом для open ticket 3.4.4", "_INFO":"Цей файл є перекладом для open ticket 3.5.0",
"errors":{ "errors":{
"missingArgsTitle":"Невірні аргументи!", "missingArgsTitle":"Невірні аргументи!",
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "open-ticket", "name": "open-ticket",
"version": "3.4.4", "version": "3.5.0",
"description": "This is an open-source discord ticket bot, you can configure it and it comes with cool features like a transcript.", "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", "main": "index.js",
"scripts": { "scripts": {
@@ -15,7 +15,7 @@
"dependencies": { "dependencies": {
"axios": "^0.27.2", "axios": "^0.27.2",
"chalk": "^5.0.1", "chalk": "^5.0.1",
"discord.js": "^14.11.0" "discord.js": "^14.14.1"
}, },
"repository": { "repository": {
"type": "git", "type": "git",