v2.4.0 push 1
This commit is contained in:
@@ -7,7 +7,7 @@ make a ticket in our server to start!
|
|||||||
*if you translate, you will come in the credits*
|
*if you translate, you will come in the credits*
|
||||||
|
|
||||||
# open-ticket
|
# open-ticket
|
||||||
[](https://discord.com/invite/26vT9wt3n3) [](https://github.com/DJj123dj/open-ticket/releases/tag/v2.3.3) [](#packages) [](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE)
|
[](https://discord.com/invite/26vT9wt3n3) [](https://github.com/DJj123dj/open-ticket/releases/tag/v2.4.0) [](#packages) [](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE)
|
||||||
|
|
||||||
This is an open-source discord ticket bot, you can configure it and it comes with cool features like transcripts & custom options!
|
This is an open-source discord ticket bot, you can configure it and it comes with cool features like transcripts & custom options!
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ if there are any errors, you can open an **issue on github** or **contact me in
|
|||||||
|
|
||||||
### config
|
### config
|
||||||
Our config documentation is moved to another file:
|
Our config documentation is moved to another file:
|
||||||
[click here to view](https://www.github.com/DJj123dj/open-ticket/wiki/config-v2.3.3)
|
[click here to view](https://www.github.com/DJj123dj/open-ticket/wiki/config-v2.4.0)
|
||||||
|
|
||||||
### intents & permissions
|
### intents & permissions
|
||||||
In the discord developer portal in the "bot" panel you will find 3 switches under the title "Gateaway Intents". The following switches should always be turned on
|
In the discord developer portal in the "bot" panel you will find 3 switches under the title "Gateaway Intents". The following switches should always be turned on
|
||||||
@@ -74,7 +74,7 @@ You can also configure your own permissions
|
|||||||
|
|
||||||
## information
|
## information
|
||||||
|
|
||||||
_v2.3.3 stable_
|
_v2.4.0 stable_
|
||||||
|
|
||||||
changelog: [click here](https://www.github.com/DJj123dj/open-ticket/wiki/Changelog)
|
changelog: [click here](https://www.github.com/DJj123dj/open-ticket/wiki/Changelog)
|
||||||
|
|
||||||
|
|||||||
+9
-10
@@ -4,6 +4,7 @@ const client = bot.client
|
|||||||
const config = bot.config
|
const config = bot.config
|
||||||
const log = bot.errorLog.log
|
const log = bot.errorLog.log
|
||||||
const l = bot.language
|
const l = bot.language
|
||||||
|
const permsChecker = require("../core/utils/permisssionChecker")
|
||||||
|
|
||||||
module.exports = () => {
|
module.exports = () => {
|
||||||
client.on("messageCreate",msg => {
|
client.on("messageCreate",msg => {
|
||||||
@@ -11,12 +12,9 @@ module.exports = () => {
|
|||||||
var user = msg.mentions.users.first()
|
var user = msg.mentions.users.first()
|
||||||
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.member.permissions.has("ManageChannels") && !msg.member.permissions.has("Administrator") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){
|
if (!msg.guild) return
|
||||||
try {
|
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||||
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]})
|
permsChecker.sendUserNoPerms(msg.author)
|
||||||
}catch{
|
|
||||||
return msg.channel.send({embeds:[bot.errorLog.noPermsMessage]})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
msg.channel.messages.fetchPinned().then(msglist => {
|
msg.channel.messages.fetchPinned().then(msglist => {
|
||||||
@@ -39,12 +37,13 @@ module.exports = () => {
|
|||||||
if (interaction.commandName != "add") return
|
if (interaction.commandName != "add") return
|
||||||
const user = interaction.options.getUser("user")
|
const user = interaction.options.getUser("user")
|
||||||
|
|
||||||
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
|
if (!interaction.guild) return
|
||||||
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
|
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||||
interaction.reply({embeds:[bot.errorLog.noPermsMessage],ephemeral:true})
|
permsChecker.sendUserNoPerms(interaction.user)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interaction.deferReply()
|
||||||
|
|
||||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
interaction.channel.messages.fetchPinned().then(msglist => {
|
||||||
var firstmsg = msglist.last()
|
var firstmsg = msglist.last()
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ const client = bot.client
|
|||||||
const config = bot.config
|
const config = bot.config
|
||||||
const log = bot.errorLog.log
|
const log = bot.errorLog.log
|
||||||
const l = bot.language
|
const l = bot.language
|
||||||
|
const permsChecker = require("../core/utils/permisssionChecker")
|
||||||
|
|
||||||
module.exports = () => {
|
module.exports = () => {
|
||||||
client.on("messageCreate",msg => {
|
client.on("messageCreate",msg => {
|
||||||
@@ -37,6 +38,8 @@ module.exports = () => {
|
|||||||
if (!interaction.isChatInputCommand()) return
|
if (!interaction.isChatInputCommand()) return
|
||||||
if (interaction.commandName != "close") return
|
if (interaction.commandName != "close") return
|
||||||
|
|
||||||
|
interaction.deferReply()
|
||||||
|
|
||||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
interaction.channel.messages.fetchPinned().then(msglist => {
|
||||||
var firstmsg = msglist.last()
|
var firstmsg = msglist.last()
|
||||||
|
|
||||||
|
|||||||
+9
-10
@@ -4,17 +4,15 @@ const client = bot.client
|
|||||||
const config = bot.config
|
const config = bot.config
|
||||||
const log = bot.errorLog.log
|
const log = bot.errorLog.log
|
||||||
const l = bot.language
|
const l = bot.language
|
||||||
|
const permsChecker = require("../core/utils/permisssionChecker")
|
||||||
|
|
||||||
module.exports = () => {
|
module.exports = () => {
|
||||||
client.on("messageCreate",msg => {
|
client.on("messageCreate",msg => {
|
||||||
if (!msg.content.startsWith(config.prefix+"delete")) return
|
if (!msg.content.startsWith(config.prefix+"delete")) return
|
||||||
|
|
||||||
if (!msg.member.permissions.has("ManageChannels") && !msg.member.permissions.has("Administrator") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){
|
if (!msg.guild) return
|
||||||
try {
|
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||||
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]})
|
permsChecker.sendUserNoPerms(msg.author)
|
||||||
}catch{
|
|
||||||
return msg.channel.send({embeds:[bot.errorLog.noPermsMessage]})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
msg.channel.messages.fetchPinned().then(msglist => {
|
msg.channel.messages.fetchPinned().then(msglist => {
|
||||||
@@ -44,10 +42,11 @@ module.exports = () => {
|
|||||||
if (!interaction.isChatInputCommand()) return
|
if (!interaction.isChatInputCommand()) return
|
||||||
if (interaction.commandName != "delete") return
|
if (interaction.commandName != "delete") return
|
||||||
|
|
||||||
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
|
interaction.deferReply()
|
||||||
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
|
|
||||||
interaction.reply({embeds:[bot.errorLog.noPermsMessage],ephemeral:true})
|
if (!interaction.guild) return
|
||||||
return
|
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||||
|
permsChecker.sendUserNoPerms(interaction.user)
|
||||||
}
|
}
|
||||||
|
|
||||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
interaction.channel.messages.fetchPinned().then(msglist => {
|
||||||
|
|||||||
+9
-10
@@ -4,6 +4,7 @@ const client = bot.client
|
|||||||
const config = bot.config
|
const config = bot.config
|
||||||
const log = bot.errorLog.log
|
const log = bot.errorLog.log
|
||||||
const l = bot.language
|
const l = bot.language
|
||||||
|
const permsChecker = require("../core/utils/permisssionChecker")
|
||||||
|
|
||||||
module.exports = () => {
|
module.exports = () => {
|
||||||
client.on("messageCreate",msg => {
|
client.on("messageCreate",msg => {
|
||||||
@@ -11,14 +12,13 @@ module.exports = () => {
|
|||||||
var user = msg.mentions.users.first()
|
var user = msg.mentions.users.first()
|
||||||
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.member.permissions.has("ManageChannels") && !msg.member.permissions.has("Administrator") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){
|
if (!msg.guild) return
|
||||||
try {
|
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||||
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]})
|
permsChecker.sendUserNoPerms(msg.author)
|
||||||
}catch{
|
|
||||||
return msg.channel.send({embeds:[bot.errorLog.noPermsMessage]})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interaction.deferReply()
|
||||||
|
|
||||||
msg.channel.messages.fetchPinned().then(msglist => {
|
msg.channel.messages.fetchPinned().then(msglist => {
|
||||||
var firstmsg = msglist.last()
|
var firstmsg = msglist.last()
|
||||||
|
|
||||||
@@ -40,10 +40,9 @@ module.exports = () => {
|
|||||||
if (interaction.commandName != "remove") return
|
if (interaction.commandName != "remove") return
|
||||||
const user = interaction.options.getUser("user")
|
const user = interaction.options.getUser("user")
|
||||||
|
|
||||||
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
|
if (!interaction.guild) return
|
||||||
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
|
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||||
interaction.reply({embeds:[bot.errorLog.noPermsMessage],ephemeral:true})
|
permsChecker.sendUserNoPerms(interaction.user)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+9
-10
@@ -4,6 +4,7 @@ const client = bot.client
|
|||||||
const config = bot.config
|
const config = bot.config
|
||||||
const log = bot.errorLog.log
|
const log = bot.errorLog.log
|
||||||
const l = bot.language
|
const l = bot.language
|
||||||
|
const permsChecker = require("../core/utils/permisssionChecker")
|
||||||
|
|
||||||
module.exports = () => {
|
module.exports = () => {
|
||||||
client.on("messageCreate",msg => {
|
client.on("messageCreate",msg => {
|
||||||
@@ -14,12 +15,9 @@ module.exports = () => {
|
|||||||
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||||
|
|
||||||
if (!msg.member.permissions.has("ManageChannels") && !msg.member.permissions.has("Administrator") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){
|
if (!msg.guild) return
|
||||||
try {
|
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||||
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]})
|
permsChecker.sendUserNoPerms(msg.author)
|
||||||
}catch{
|
|
||||||
return msg.channel.send({embeds:[bot.errorLog.noPermsMessage]})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var newname = msg.content.split(config.prefix+"rename")[1].substring(1)
|
var newname = msg.content.split(config.prefix+"rename")[1].substring(1)
|
||||||
@@ -52,15 +50,16 @@ module.exports = () => {
|
|||||||
if (!interaction.isChatInputCommand()) return
|
if (!interaction.isChatInputCommand()) return
|
||||||
if (interaction.commandName != "rename") return
|
if (interaction.commandName != "rename") return
|
||||||
|
|
||||||
|
interaction.deferReply()
|
||||||
|
|
||||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
interaction.channel.messages.fetchPinned().then(msglist => {
|
||||||
var firstmsg = msglist.last()
|
var firstmsg = msglist.last()
|
||||||
|
|
||||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id)return interaction.reply({embeds:[bot.errorLog.notInATicket]})
|
if (firstmsg == undefined || firstmsg.author.id != client.user.id)return interaction.reply({embeds:[bot.errorLog.notInATicket]})
|
||||||
|
|
||||||
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
|
if (!interaction.guild) return
|
||||||
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
|
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||||
interaction.reply({embeds:[bot.errorLog.noPermsMessage],ephemeral:true})
|
permsChecker.sendUserNoPerms(interaction.user)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var newname = interaction.options.getString("name")
|
var newname = interaction.options.getString("name")
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ const client = bot.client
|
|||||||
const config = bot.config
|
const config = bot.config
|
||||||
const log = bot.errorLog.log
|
const log = bot.errorLog.log
|
||||||
const l = bot.language
|
const l = bot.language
|
||||||
|
const permsChecker = require("../core/utils/permisssionChecker")
|
||||||
|
|
||||||
module.exports = () => {
|
module.exports = () => {
|
||||||
var reopenCommandBar = new discord.ActionRowBuilder()
|
var reopenCommandBar = new discord.ActionRowBuilder()
|
||||||
@@ -35,6 +36,8 @@ module.exports = () => {
|
|||||||
if (!interaction.isChatInputCommand()) return
|
if (!interaction.isChatInputCommand()) return
|
||||||
if (interaction.commandName != "reopen") return
|
if (interaction.commandName != "reopen") return
|
||||||
|
|
||||||
|
interaction.deferReply()
|
||||||
|
|
||||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
interaction.channel.messages.fetchPinned().then(msglist => {
|
||||||
var firstmsg = msglist.last()
|
var firstmsg = msglist.last()
|
||||||
|
|
||||||
|
|||||||
+7
-10
@@ -4,6 +4,7 @@ const client = bot.client
|
|||||||
const config = bot.config
|
const config = bot.config
|
||||||
const log = bot.errorLog.log
|
const log = bot.errorLog.log
|
||||||
const l = bot.language
|
const l = bot.language
|
||||||
|
const permsChecker = require("../core/utils/permisssionChecker")
|
||||||
|
|
||||||
module.exports = () => {
|
module.exports = () => {
|
||||||
/**@type {String[]} */
|
/**@type {String[]} */
|
||||||
@@ -16,12 +17,9 @@ module.exports = () => {
|
|||||||
client.on("messageCreate", msg => {
|
client.on("messageCreate", msg => {
|
||||||
if (msg.content.startsWith(config.prefix+"msg"||config.prefix+"message")){
|
if (msg.content.startsWith(config.prefix+"msg"||config.prefix+"message")){
|
||||||
|
|
||||||
if (!msg.member.permissions.has("ManageChannels") && !msg.member.permissions.has("Administrator") && config.main_adminroles.some((item)=>{return msg.member.roles.cache.has(item)}) == false){
|
if (!msg.guild) return
|
||||||
try {
|
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||||
return msg.member.send({embeds:[bot.errorLog.noPermsMessage]})
|
permsChecker.sendUserNoPerms(msg.author)
|
||||||
}catch{
|
|
||||||
return msg.channel.send({embeds:[bot.errorLog.noPermsMessage]})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const id = msg.content.split(config.prefix+"msg")[1].substring(1) ? msg.content.split(config.prefix+"msg")[1].substring(1) : false
|
const id = msg.content.split(config.prefix+"msg")[1].substring(1) ? msg.content.split(config.prefix+"msg")[1].substring(1) : false
|
||||||
@@ -42,10 +40,9 @@ module.exports = () => {
|
|||||||
if (!interaction.isChatInputCommand()) return
|
if (!interaction.isChatInputCommand()) return
|
||||||
if (interaction.commandName != "message") return
|
if (interaction.commandName != "message") return
|
||||||
|
|
||||||
const permsmember = client.guilds.cache.find(g => g.id == interaction.guild.id).members.cache.find(m => m.id == interaction.member.id)
|
if (!interaction.guild) return
|
||||||
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
|
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||||
interaction.reply({embeds:[bot.errorLog.noPermsMessage],ephemeral:true})
|
permsChecker.sendUserNoPerms(interaction.user)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const id = interaction.options.getString("id")
|
const id = interaction.options.getString("id")
|
||||||
|
|||||||
+1
-1
@@ -79,7 +79,7 @@
|
|||||||
"name":"Choose Your Ticket",
|
"name":"Choose Your Ticket",
|
||||||
"description":"You can click one of the buttons below!",
|
"description":"You can click one of the buttons below!",
|
||||||
"enableFooter":false,
|
"enableFooter":false,
|
||||||
"footer":"Open Ticket v2.3.3 - I'm a footer!",
|
"footer":"Open Ticket v2.4.0 - I'm a footer!",
|
||||||
"enableThumbnail":false,
|
"enableThumbnail":false,
|
||||||
"thumbnail":"https://www.example.com/catmemes/cat.png",
|
"thumbnail":"https://www.example.com/catmemes/cat.png",
|
||||||
"color":"#ffffff",
|
"color":"#ffffff",
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
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
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} memberid
|
||||||
|
* @param {String} guildid
|
||||||
|
* @returns {Boolean} has permissions?
|
||||||
|
*/
|
||||||
|
exports.command = (memberid,guildid) => {
|
||||||
|
const permsmember = client.guilds.cache.find(g => g.id == guildid).members.cache.find(m => m.id == memberid)
|
||||||
|
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
|
||||||
|
return false
|
||||||
|
}else {return true}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @returns {Boolean}
|
||||||
|
*/
|
||||||
|
exports.sendUserNoPerms = (user) => {
|
||||||
|
try {
|
||||||
|
user.send({embeds:[bot.errorLog.noPermsMessage]})
|
||||||
|
return true
|
||||||
|
}catch{
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @returns {Boolean}
|
||||||
|
*/
|
||||||
|
exports.sendUserNoTicket = (user) => {
|
||||||
|
try {
|
||||||
|
user.send({embeds:[bot.errorLog.notInATicket]})
|
||||||
|
return true
|
||||||
|
}catch{
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @returns {Boolean}
|
||||||
|
*/
|
||||||
|
exports.sendChannelNoPerms = (channel) => {
|
||||||
|
try {
|
||||||
|
channel.send({embeds:[bot.errorLog.noPermsMessage]})
|
||||||
|
return true
|
||||||
|
}catch{
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @returns {Boolean}
|
||||||
|
*/
|
||||||
|
exports.sendChannelNoTicket = (channel) => {
|
||||||
|
try {
|
||||||
|
channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||||
|
return true
|
||||||
|
}catch{
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "open-ticket",
|
"name": "open-ticket",
|
||||||
"version": "2.3.3",
|
"version": "2.4.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": {
|
||||||
|
|||||||
Reference in New Issue
Block a user