Reset for new version

This commit is contained in:
Isaac
2022-03-11 21:09:17 +00:00
parent aa50daa3a7
commit 83e7ff6019
85 changed files with 0 additions and 18792 deletions

View File

@@ -1,30 +0,0 @@
/* eslint-disable no-console */
const link = require('terminal-link');
const leeks = require('leeks.js');
const {
version, homepage
} = require('../package.json');
module.exports = () => {
console.log(leeks.colours.cyan(`
######## #### ###### ###### ####### ######## ########
## ## ## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ##
## ## ## ###### ## ## ## ######## ## ##
## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ## ## ## ##
######## #### ###### ###### ####### ## ## ########
######## #### ###### ## ## ######## ######## ######
## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ##
## ## ## ##### ###### ## ######
## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ##
## #### ###### ## ## ######## ## ######
`));
console.log(leeks.colours.cyanBright(`Discord Tickets bot v${version} by eartharoid`));
console.log(leeks.colours.cyanBright(homepage + '\n'));
console.log(leeks.colours.cyanBright(link('Sponsor this project', 'https://discordtickets.app/sponsor') + '\n'));
};

View File

@@ -1,118 +0,0 @@
const Command = require('../modules/commands/command');
const {
Interaction, // eslint-disable-line no-unused-vars
MessageEmbed
} = require('discord.js');
module.exports = class AddCommand extends Command {
constructor(client) {
const i18n = client.i18n.getLocale(client.config.locale);
super(client, {
description: i18n('commands.add.description'),
internal: true,
name: i18n('commands.add.name'),
options: [
{
description: i18n('commands.add.options.member.description'),
name: i18n('commands.add.options.member.name'),
required: true,
type: Command.option_types.USER
},
{
description: i18n('commands.add.options.ticket.description'),
name: i18n('commands.add.options.ticket.name'),
required: false,
type: Command.option_types.CHANNEL
}
]
});
}
/**
* @param {Interaction} interaction
* @returns {Promise<void|any>}
*/
async execute(interaction) {
const settings = await this.client.utils.getSettings(interaction.guild.id);
const default_i18n = this.client.i18n.getLocale(this.client.config.defaults.locale); // command properties could be in a different locale
const i18n = this.client.i18n.getLocale(settings.locale);
const channel = interaction.options.getChannel(default_i18n('commands.add.options.ticket.name')) ?? interaction.channel;
const t_row = await this.client.tickets.resolve(channel.id, interaction.guild.id);
if (!t_row) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.add.response.not_a_ticket.title'))
.setDescription(i18n('commands.add.response.not_a_ticket.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
const member = interaction.options.getMember(default_i18n('commands.add.options.member.name'));
if (!member) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.add.response.no_member.title'))
.setDescription(i18n('commands.add.response.no_member.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
if (t_row.creator !== interaction.member.id && !await this.client.utils.isStaff(interaction.member)) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.add.response.no_permission.title'))
.setDescription(i18n('commands.add.response.no_permission.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setAuthor(member.user.username, member.user.displayAvatarURL())
.setTitle(i18n('commands.add.response.added.title'))
.setDescription(i18n('commands.add.response.added.description', member.toString(), channel.toString()))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
await channel.send({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setAuthor(member.user.username, member.user.displayAvatarURL())
.setTitle(i18n('ticket.member_added.title'))
.setDescription(i18n('ticket.member_added.description', member.toString(), interaction.user.toString()))
.setFooter(settings.footer, interaction.guild.iconURL())
]
});
await channel.permissionOverwrites.edit(member, {
ATTACH_FILES: true,
READ_MESSAGE_HISTORY: true,
SEND_MESSAGES: true,
VIEW_CHANNEL: true
}, `${interaction.user.tag} added ${member.user.tag} to the ticket`);
await this.client.tickets.archives.updateMember(channel.id, member);
this.client.log.info(`${interaction.user.tag} added ${member.user.tag} to ${channel.id}`);
}
};

View File

@@ -1,156 +0,0 @@
const Command = require('../modules/commands/command');
const {
Interaction, // eslint-disable-line no-unused-vars
MessageEmbed,
Role
} = require('discord.js');
module.exports = class BlacklistCommand extends Command {
constructor(client) {
const i18n = client.i18n.getLocale(client.config.locale);
super(client, {
description: i18n('commands.blacklist.description'),
internal: true,
name: i18n('commands.blacklist.name'),
options: [
{
description: i18n('commands.blacklist.options.add.description'),
name: i18n('commands.blacklist.options.add.name'),
options: [
{
description: i18n('commands.blacklist.options.add.options.member_or_role.description'),
name: i18n('commands.blacklist.options.add.options.member_or_role.name'),
required: true,
type: Command.option_types.MENTIONABLE
}
],
type: Command.option_types.SUB_COMMAND
},
{
description: i18n('commands.blacklist.options.remove.description'),
name: i18n('commands.blacklist.options.remove.name'),
options: [
{
description: i18n('commands.blacklist.options.remove.options.member_or_role.description'),
name: i18n('commands.blacklist.options.remove.options.member_or_role.name'),
required: true,
type: Command.option_types.MENTIONABLE
}
],
type: Command.option_types.SUB_COMMAND
},
{
description: i18n('commands.blacklist.options.show.description'),
name: i18n('commands.blacklist.options.show.name'),
type: Command.option_types.SUB_COMMAND
}
],
staff_only: true
});
}
/**
* @param {Interaction} interaction
* @returns {Promise<void|any>}
*/
async execute(interaction) {
const settings = await this.client.utils.getSettings(interaction.guild.id);
const default_i18n = this.client.i18n.getLocale(this.client.config.defaults.locale); // command properties could be in a different locale
const i18n = this.client.i18n.getLocale(settings.locale);
const blacklist = JSON.parse(JSON.stringify(settings.blacklist)); // not the same as `const blacklist = { ...settings.blacklist };` ..?
switch (interaction.options.getSubcommand()) {
case default_i18n('commands.blacklist.options.add.name'): {
const member_or_role = interaction.options.getMentionable(default_i18n('commands.blacklist.options.add.options.member_or_role.name'));
const type = member_or_role instanceof Role ? 'role' : 'member';
if (type === 'member' && await this.client.utils.isStaff(member_or_role)) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.blacklist.response.illegal_action.title'))
.setDescription(i18n('commands.blacklist.response.illegal_action.description', member_or_role.toString()))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
blacklist[type + 's'].push(member_or_role.id);
await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setTitle(i18n(`commands.blacklist.response.${type}_added.title`))
.setDescription(i18n(`commands.blacklist.response.${type}_added.description`, member_or_role.id))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
await settings.update({ blacklist });
break;
}
case default_i18n('commands.blacklist.options.remove.name'): {
const member_or_role = interaction.options.getMentionable(default_i18n('commands.blacklist.options.remove.options.member_or_role.name'));
const type = member_or_role instanceof Role ? 'role' : 'member';
const index = blacklist[type + 's'].findIndex(element => element === member_or_role.id);
if (index === -1) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.blacklist.response.invalid.title'))
.setDescription(i18n('commands.blacklist.response.invalid.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
blacklist[type + 's'].splice(index, 1);
await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setTitle(i18n(`commands.blacklist.response.${type}_removed.title`))
.setDescription(i18n(`commands.blacklist.response.${type}_removed.description`, member_or_role.id))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
await settings.update({ blacklist });
break;
}
case default_i18n('commands.blacklist.options.show.name'): {
if (blacklist.members.length === 0 && blacklist.roles.length === 0) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setTitle(i18n('commands.blacklist.response.empty_list.title'))
.setDescription(i18n('commands.blacklist.response.empty_list.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
} else {
const members = blacklist.members.map(id => `**·** <@${id}>`);
const roles = blacklist.roles.map(id => `**·** <@&${id}>`);
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setTitle(i18n('commands.blacklist.response.list.title'))
.addField(i18n('commands.blacklist.response.list.fields.members'), members.join('\n') || 'none')
.addField(i18n('commands.blacklist.response.list.fields.roles'), roles.join('\n') || 'none')
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
}
}
}
};

View File

@@ -1,322 +0,0 @@
const Command = require('../modules/commands/command');
const {
Interaction, // eslint-disable-line no-unused-vars
MessageActionRow,
MessageButton,
MessageEmbed
} = require('discord.js');
const { Op } = require('sequelize');
const ms = require('ms');
module.exports = class CloseCommand extends Command {
constructor(client) {
const i18n = client.i18n.getLocale(client.config.locale);
super(client, {
description: i18n('commands.close.description'),
internal: true,
name: i18n('commands.close.name'),
options: [
{
description: i18n('commands.close.options.reason.description'),
name: i18n('commands.close.options.reason.name'),
required: false,
type: Command.option_types.STRING
},
{
description: i18n('commands.close.options.ticket.description'),
name: i18n('commands.close.options.ticket.name'),
required: false,
type: Command.option_types.INTEGER
},
{
description: i18n('commands.close.options.time.description'),
name: i18n('commands.close.options.time.name'),
required: false,
type: Command.option_types.STRING
}
]
});
}
/**
* @param {Interaction} interaction
* @returns {Promise<void|any>}
*/
async execute(interaction) {
const settings = await this.client.utils.getSettings(interaction.guild.id);
const default_i18n = this.client.i18n.getLocale(this.client.config.defaults.locale); // command properties could be in a different locale
const i18n = this.client.i18n.getLocale(settings.locale);
const reason = interaction.options.getString(default_i18n('commands.close.options.reason.name'));
const ticket = interaction.options.getInteger(default_i18n('commands.close.options.ticket.name'));
const time = interaction.options.getString(default_i18n('commands.close.options.time.name'));
if (time) {
if (!await this.client.utils.isStaff(interaction.member)) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.close.response.no_permission.title'))
.setDescription(i18n('commands.close.response.no_permission.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
let period;
try {
period = ms(time);
} catch {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.close.response.invalid_time.title'))
.setDescription(i18n('commands.close.response.invalid_time.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
const tickets = await this.client.db.models.Ticket.findAndCountAll({
where: {
guild: interaction.guild.id,
last_message: { [Op.lte]: new Date(Date.now() - period) },
open: true
}
});
if (tickets.count === 0) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.close.response.no_tickets.title'))
.setDescription(i18n('commands.close.response.no_tickets.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
} else {
await interaction.reply({
components: [
new MessageActionRow()
.addComponents(
new MessageButton()
.setCustomId(`confirm_close_multiple:${interaction.id}`)
.setLabel(i18n('commands.close.response.confirm_multiple.buttons.confirm', tickets.count, tickets.count))
.setEmoji('✅')
.setStyle('SUCCESS')
)
.addComponents(
new MessageButton()
.setCustomId(`cancel_close_multiple:${interaction.id}`)
.setLabel(i18n('commands.close.response.confirm_multiple.buttons.cancel'))
.setEmoji('❌')
.setStyle('SECONDARY')
)
],
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setTitle(i18n('commands.close.response.confirm_multiple.title'))
.setDescription(i18n('commands.close.response.confirm_multiple.description', tickets.count, tickets.count))
.setFooter(this.client.utils.footer(settings.footer, i18n('collector_expires_in', 30)), interaction.guild.iconURL())
],
ephemeral: true
});
const filter = i => i.user.id === interaction.user.id && i.customId.includes(interaction.id);
const collector = interaction.channel.createMessageComponentCollector({
filter,
time: 30000
});
collector.on('collect', async i => {
await i.deferUpdate();
if (i.customId === `confirm_close_multiple:${interaction.id}`) {
for (const ticket of tickets.rows) {
await this.client.tickets.close(ticket.id, interaction.user.id, interaction.guild.id, reason);
}
await i.editReply({
components: [],
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setTitle(i18n('commands.close.response.closed_multiple.title', tickets.count, tickets.count))
.setDescription(i18n('commands.close.response.closed_multiple.description', tickets.count, tickets.count))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
} else {
await i.editReply({
components: [],
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.close.response.canceled.title'))
.setDescription(i18n('commands.close.response.canceled.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
collector.stop();
});
collector.on('end', async collected => {
if (collected.size === 0) {
await interaction.editReply({
components: [],
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('commands.close.response.confirmation_timeout.title'))
.setDescription(i18n('commands.close.response.confirmation_timeout.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
});
}
} else {
let t_row;
if (ticket) {
t_row = await this.client.tickets.resolve(ticket, interaction.guild.id);
if (!t_row) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.close.response.unresolvable.title'))
.setDescription(i18n('commands.close.response.unresolvable.description', ticket))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
} else {
t_row = await this.client.db.models.Ticket.findOne({ where: { id: interaction.channel.id } });
if (!t_row) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.close.response.not_a_ticket.title'))
.setDescription(i18n('commands.close.response.not_a_ticket.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
}
if (t_row.creator !== interaction.member.id && !await this.client.utils.isStaff(interaction.member)) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.close.response.no_permission.title'))
.setDescription(i18n('commands.close.response.no_permission.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
await interaction.reply({
components: [
new MessageActionRow()
.addComponents(
new MessageButton()
.setCustomId(`confirm_close:${interaction.id}`)
.setLabel(i18n('commands.close.response.confirm.buttons.confirm'))
.setEmoji('✅')
.setStyle('SUCCESS')
)
.addComponents(
new MessageButton()
.setCustomId(`cancel_close:${interaction.id}`)
.setLabel(i18n('commands.close.response.confirm.buttons.cancel'))
.setEmoji('❌')
.setStyle('SECONDARY')
)
],
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setTitle(i18n('commands.close.response.confirm.title'))
.setDescription(settings.log_messages ? i18n('commands.close.response.confirm.description_with_archive') : i18n('commands.close.response.confirm.description'))
.setFooter(this.client.utils.footer(settings.footer, i18n('collector_expires_in', 30)), interaction.guild.iconURL())
],
ephemeral: true
});
const filter = i => i.user.id === interaction.user.id && i.customId.includes(interaction.id);
const collector = interaction.channel.createMessageComponentCollector({
filter,
time: 30000
});
collector.on('collect', async i => {
await i.deferUpdate();
if (i.customId === `confirm_close:${interaction.id}`) {
await this.client.tickets.close(t_row.id, interaction.user.id, interaction.guild.id, reason);
await i.editReply({
components: [],
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setTitle(i18n('commands.close.response.closed.title', t_row.number))
.setDescription(i18n('commands.close.response.closed.description', t_row.number))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
} else {
await i.editReply({
components: [],
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.close.response.canceled.title'))
.setDescription(i18n('commands.close.response.canceled.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
collector.stop();
});
collector.on('end', async collected => {
if (collected.size === 0) {
await interaction.editReply({
components: [],
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('commands.close.response.confirmation_timeout.title'))
.setDescription(i18n('commands.close.response.confirmation_timeout.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
});
}
}
};

View File

@@ -1,67 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>{{survey}} Survey Responses | Discord Tickets</title>
<meta charset='UTF-8'>
<meta name='viewport' content='width=device-width, initial-scale=1, user-scalable=no'>
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/bulma@0.9.1/css/bulma.min.css'>
<link rel='stylesheet' href='https://jenil.github.io/bulmaswatch/darkly/bulmaswatch.min.css'>
</head>
<body>
<section class='section'>
<container class='container box has-text-centered'>
<div class='content'>
<h1>{{survey}} survey responses</h1>
</div>
<div class='level'>
<div class='level-item has-text-centered'>
<div class='box'>
<p class='title'>{{count.responses}}</p>
<p class='heading'>Responses</p>
</div>
</div>
<div class='level-item has-text-centered'>
<div class='box'>
<p class='title'>{{count.users}}</p>
<p class='heading'>Users</p>
</div>
</div>
</div>
<div class='table-container'>
<table class='table is-bordered is-striped is-hoverable is-fullwidth'>
<thead>
<tr>
{{#columns}}
<th>{{.}}</th>
{{/columns}}
</tr>
</thead>
<tbody>
{{#responses}}
<tr>
{{#.}}
<td>{{.}}</td>
{{/.}}
</tr>
{{/responses}}
</tbody>
<tfoot>
<tr>
{{#columns}}
<th>{{.}}</th>
{{/columns}}
</tr>
</tfoot>
</table>
</div>
</container>
</section>
</body>
</html>

View File

@@ -1,49 +0,0 @@
const Command = require('../modules/commands/command');
const {
Interaction, // eslint-disable-line no-unused-vars
MessageEmbed
} = require('discord.js');
module.exports = class HelpCommand extends Command {
constructor(client) {
const i18n = client.i18n.getLocale(client.config.locale);
super(client, {
description: i18n('commands.help.description'),
internal: true,
name: i18n('commands.help.name')
});
}
/**
* @param {Interaction} interaction
* @returns {Promise<void|any>}
*/
async execute(interaction) {
const settings = await this.client.utils.getSettings(interaction.guild.id);
const i18n = this.client.i18n.getLocale(settings.locale);
const is_staff = await this.client.utils.isStaff(interaction.member);
const commands = this.manager.commands.filter(command => {
if (command.permissions.length >= 1) return interaction.member.permissions.has(command.permissions);
else if (command.staff_only) return is_staff;
else return true;
});
const list = commands.map(command => {
const description = command.description.length > 50
? command.description.substring(0, 50) + '...'
: command.description;
return `**\`/${command.name}\` ·** ${description}`;
});
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setTitle(i18n('commands.help.response.list.title'))
.setDescription(i18n('commands.help.response.list.description'))
.addField(i18n('commands.help.response.list.fields.commands'), list.join('\n'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
};

View File

@@ -1,190 +0,0 @@
const Command = require('../modules/commands/command');
const {
Interaction, // eslint-disable-line no-unused-vars,
MessageActionRow,
MessageEmbed,
MessageSelectMenu
} = require('discord.js');
module.exports = class NewCommand extends Command {
constructor(client) {
const i18n = client.i18n.getLocale(client.config.locale);
super(client, {
description: i18n('commands.new.description'),
internal: true,
name: i18n('commands.new.name'),
options: [
{
description: i18n('commands.new.options.topic.description'),
name: i18n('commands.new.options.topic.name'),
required: false,
type: Command.option_types.STRING
}
]
});
}
/**
* @param {Interaction} interaction
* @returns {Promise<void|any>}
*/
async execute(interaction) {
const settings = await this.client.utils.getSettings(interaction.guild.id);
const default_i18n = this.client.i18n.getLocale(this.client.config.defaults.locale); // command properties could be in a different locale
const i18n = this.client.i18n.getLocale(settings.locale);
const topic = interaction.options.getString(default_i18n('commands.new.options.topic.name'));
const create = async (cat_row, i) => {
const tickets = await this.client.db.models.Ticket.findAndCountAll({
where: {
category: cat_row.id,
creator: interaction.user.id,
open: true
}
});
if (tickets.count >= cat_row.max_per_member) {
if (cat_row.max_per_member === 1) {
const response = {
components: [],
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('commands.new.response.has_a_ticket.title'))
.setDescription(i18n('commands.new.response.has_a_ticket.description', tickets.rows[0].id))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
};
await i ? i.editReply(response) : interaction.reply(response);
} else {
const list = tickets.rows.map(row => {
if (row.topic) {
const description = row.topic.substring(0, 30);
const ellipses = row.topic.length > 30 ? '...' : '';
return `<#${row.id}>: \`${description}${ellipses}\``;
} else {
return `<#${row.id}>`;
}
});
const response = {
components: [],
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('commands.new.response.max_tickets.title', tickets.count))
.setDescription(i18n('commands.new.response.max_tickets.description', list.join('\n')))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
};
await i ? i.editReply(response) : interaction.reply(response);
}
} else {
try {
const t_row = await this.client.tickets.create(interaction.guild.id, interaction.user.id, cat_row.id, topic);
const response = {
components: [],
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('commands.new.response.created.title'))
.setDescription(i18n('commands.new.response.created.description', `<#${t_row.id}>`))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
};
await i ? i.editReply(response) : interaction.reply(response);
} catch (error) {
const response = {
components: [],
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('commands.new.response.error.title'))
.setDescription(error.message)
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
};
await i ? i.editReply(response) : interaction.reply(response);
}
}
};
const categories = await this.client.db.models.Category.findAndCountAll({ where: { guild: interaction.guild.id } });
if (categories.count === 0) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('commands.new.response.no_categories.title'))
.setDescription(i18n('commands.new.response.no_categories.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
]
});
} else if (categories.count === 1) {
create(categories.rows[0]); // skip the category selection
} else {
await interaction.reply({
components: [
new MessageActionRow()
.addComponents(
new MessageSelectMenu()
.setCustomId(`select_category:${interaction.id}`)
.setPlaceholder('Select a category')
.addOptions(categories.rows.map(row => ({
label: row.name,
value: row.id
})))
)
],
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('commands.new.response.select_category.title'))
.setDescription(i18n('commands.new.response.select_category.description'))
.setFooter(this.client.utils.footer(settings.footer, i18n('collector_expires_in', 30)), interaction.guild.iconURL())
],
ephemeral: true
});
const filter = i => i.user.id === interaction.user.id && i.customId.includes(interaction.id);
const collector = interaction.channel.createMessageComponentCollector({
filter,
time: 30000
});
collector.on('collect', async i => {
await i.deferUpdate();
create(categories.rows.find(row => row.id === i.values[0]), i);
collector.stop();
});
collector.on('end', async collected => {
if (collected.size === 0) {
await interaction.editReply({
components: [],
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('commands.new.response.select_category_timeout.title'))
.setDescription(i18n('commands.new.response.select_category_timeout.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
});
}
}
};

View File

@@ -1,210 +0,0 @@
const Command = require('../modules/commands/command');
const {
Interaction, // eslint-disable-line no-unused-vars
MessageActionRow,
MessageButton,
MessageEmbed,
MessageSelectMenu
} = require('discord.js');
const { some } = require('../utils');
module.exports = class PanelCommand extends Command {
constructor(client) {
const i18n = client.i18n.getLocale(client.config.locale);
super(client, {
description: i18n('commands.panel.description'),
internal: true,
name: i18n('commands.panel.name'),
options: [
{
description: i18n('commands.panel.options.categories.description'),
multiple: true,
name: i18n('commands.panel.options.categories.name'),
required: true,
type: Command.option_types.STRING
},
{
description: i18n('commands.panel.options.description.description'),
name: i18n('commands.panel.options.description.name'),
required: false,
type: Command.option_types.STRING
},
{
description: i18n('commands.panel.options.image.description'),
name: i18n('commands.panel.options.image.name'),
required: false,
type: Command.option_types.STRING
},
{
description: i18n('commands.panel.options.just_type.description') + ' (false)',
name: i18n('commands.panel.options.just_type.name'),
required: false,
type: Command.option_types.BOOLEAN
},
{
description: i18n('commands.panel.options.title.description'),
name: i18n('commands.panel.options.title.name'),
required: false,
type: Command.option_types.STRING
},
{
description: i18n('commands.panel.options.thumbnail.description'),
name: i18n('commands.panel.options.thumbnail.name'),
required: false,
type: Command.option_types.STRING
}
],
staff_only: true
});
}
/**
* @param {Interaction} interaction
* @returns {Promise<void|any>}
*/
async execute(interaction) {
const settings = await this.client.utils.getSettings(interaction.guild.id);
const default_i18n = this.client.i18n.getLocale(this.client.config.defaults.locale); // command properties could be in a different locale
const i18n = this.client.i18n.getLocale(settings.locale);
const categories = interaction.options.getString(default_i18n('commands.panel.options.categories.name')).match(/\d{17,19}/g) ?? [];
const description = interaction.options.getString(default_i18n('commands.panel.options.description.name'))?.replace(/\\n/g, '\n');
const image = interaction.options.getString(default_i18n('commands.panel.options.image.name'));
const just_type = interaction.options.getBoolean(default_i18n('commands.panel.options.just_type.name'));
const title = interaction.options.getString(default_i18n('commands.panel.options.title.name'));
const thumbnail = interaction.options.getString(default_i18n('commands.panel.options.thumbnail.name'));
if (just_type && categories.length > 1) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.panel.response.too_many_categories.title'))
.setDescription(i18n('commands.panel.response.too_many_categories.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
const invalid_category = await some(categories, async id => {
const cat_row = await this.client.db.models.Category.findOne({
where: {
guild: interaction.guild.id,
id
}
});
return !cat_row;
});
if (invalid_category) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.panel.response.invalid_category.title'))
.setDescription(i18n('commands.panel.response.invalid_category.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
let panel_channel;
const embed = new MessageEmbed()
.setColor(settings.colour)
.setFooter(settings.footer, interaction.guild.iconURL());
if (description) embed.setDescription(description);
if (image) embed.setImage(image);
if (title) embed.setTitle(title);
if (thumbnail) embed.setThumbnail(thumbnail);
if (just_type) {
panel_channel = await interaction.guild.channels.create('create-a-ticket', {
permissionOverwrites: [
{
allow: ['VIEW_CHANNEL', 'SEND_MESSAGES', 'READ_MESSAGE_HISTORY'],
deny: ['ATTACH_FILES', 'EMBED_LINKS', 'ADD_REACTIONS'],
id: interaction.guild.roles.everyone
},
{
allow: ['SEND_MESSAGES', 'EMBED_LINKS', 'ADD_REACTIONS'],
id: this.client.user.id
}
],
position: 1,
rateLimitPerUser: 30,
reason: `${interaction.user.tag} created a new message panel`,
type: 'GUILD_TEXT'
});
await panel_channel.send({ embeds: [embed] });
this.client.log.info(`${interaction.user.tag} has created a new message panel`);
} else {
panel_channel = await interaction.guild.channels.create('create-a-ticket', {
permissionOverwrites: [
{
allow: ['VIEW_CHANNEL', 'READ_MESSAGE_HISTORY'],
deny: ['SEND_MESSAGES', 'ADD_REACTIONS'],
id: interaction.guild.roles.everyone
},
{
allow: ['SEND_MESSAGES', 'EMBED_LINKS', 'ADD_REACTIONS'],
id: this.client.user.id
}
],
position: 1,
reason: `${interaction.user.tag} created a new panel`,
type: 'GUILD_TEXT'
});
if (categories.length === 1) {
// single category
await panel_channel.send({
components: [
new MessageActionRow()
.addComponents(
new MessageButton()
.setCustomId(`panel.single:${categories[0]}`)
.setLabel(i18n('panel.create_ticket'))
.setStyle('PRIMARY')
)
],
embeds: [embed]
});
this.client.log.info(`${interaction.user.tag} has created a new button panel`);
} else {
// multi category
const rows = await this.client.db.models.Category.findAll({ where: { guild: interaction.guild.id } });
await panel_channel.send({
components: [
new MessageActionRow()
.addComponents(
new MessageSelectMenu()
.setCustomId(`panel.multiple:${panel_channel.id}`)
.setPlaceholder('Select a category')
.addOptions(rows.map(row => ({
label: row.name,
value: row.id
})))
)
],
embeds: [embed]
});
this.client.log.info(`${interaction.user.tag} has created a new select panel`);
}
}
interaction.reply({
content: `${panel_channel}`,
ephemeral: true
});
await this.client.db.models.Panel.create({
category: categories.length === 1 ? categories[0] : null,
channel: panel_channel.id,
guild: interaction.guild.id
});
}
};

View File

@@ -1,111 +0,0 @@
const Command = require('../modules/commands/command');
const {
Interaction, // eslint-disable-line no-unused-vars
MessageEmbed
} = require('discord.js');
module.exports = class RemoveCommand extends Command {
constructor(client) {
const i18n = client.i18n.getLocale(client.config.locale);
super(client, {
description: i18n('commands.remove.description'),
internal: true,
name: i18n('commands.remove.name'),
options: [
{
description: i18n('commands.remove.options.member.description'),
name: i18n('commands.remove.options.member.name'),
required: true,
type: Command.option_types.USER
},
{
description: i18n('commands.remove.options.ticket.description'),
name: i18n('commands.remove.options.ticket.name'),
required: false,
type: Command.option_types.CHANNEL
}
]
});
}
/**
* @param {Interaction} interaction
* @returns {Promise<void|any>}
*/
async execute(interaction) {
const settings = await this.client.utils.getSettings(interaction.guild.id);
const default_i18n = this.client.i18n.getLocale(this.client.config.defaults.locale); // command properties could be in a different locale
const i18n = this.client.i18n.getLocale(settings.locale);
const channel = interaction.options.getChannel(default_i18n('commands.remove.options.channel.name')) ?? interaction.channel;
const t_row = await this.client.tickets.resolve(channel.id, interaction.guild.id);
if (!t_row) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.remove.response.not_a_channel.title'))
.setDescription(i18n('commands.remove.response.not_a_channel.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
const member = interaction.options.getMember(default_i18n('commands.remove.options.member.name'));
if (!member) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.remove.response.no_member.title'))
.setDescription(i18n('commands.remove.response.no_member.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
if (t_row.creator !== interaction.user.id && !await this.client.utils.isStaff(interaction.member)) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.remove.response.no_permission.title'))
.setDescription(i18n('commands.remove.response.no_permission.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setAuthor(member.user.username, member.user.displayAvatarURL())
.setTitle(i18n('commands.remove.response.removed.title'))
.setDescription(i18n('commands.remove.response.removed.description', member.toString(), channel.toString()))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
await channel.send({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setAuthor(member.user.username, member.user.displayAvatarURL())
.setTitle(i18n('ticket.member_removed.title'))
.setDescription(i18n('ticket.member_removed.description', member.toString(), interaction.user.toString()))
.setFooter(settings.footer, interaction.guild.iconURL())
]
});
await channel.permissionOverwrites.delete(member.user.id, `${interaction.user.tag} removed ${member.user.tag} from the ticket`);
this.client.log.info(`${interaction.user.tag} removed ${member.user.tag} from ${channel.id}`);
}
};

View File

@@ -1,358 +0,0 @@
/* eslint-disable max-lines */
const Command = require('../modules/commands/command');
const {
Interaction, // eslint-disable-line no-unused-vars
MessageEmbed
} = require('discord.js');
module.exports = class SettingsCommand extends Command {
constructor(client) {
const i18n = client.i18n.getLocale(client.config.locale);
super(client, {
description: i18n('commands.settings.description'),
internal: true,
name: i18n('commands.settings.name'),
options: [
{
description: i18n('commands.settings.options.categories.description'),
name: i18n('commands.settings.options.categories.name'),
options: [
{
description: i18n('commands.settings.options.categories.options.create.description'),
name: i18n('commands.settings.options.categories.options.create.name'),
options: [
{
description: i18n('commands.settings.options.categories.options.create.options.name.description'),
name: i18n('commands.settings.options.categories.options.create.options.name.name'),
required: true,
type: Command.option_types.STRING
},
{
description: i18n('commands.settings.options.categories.options.create.options.roles.description'),
name: i18n('commands.settings.options.categories.options.create.options.roles.name'),
required: true,
type: Command.option_types.STRING
}
],
type: Command.option_types.SUB_COMMAND
},
{
description: i18n('commands.settings.options.categories.options.delete.description'),
name: i18n('commands.settings.options.categories.options.delete.name'),
options: [
{
description: i18n('commands.settings.options.categories.options.delete.options.id.description'),
name: i18n('commands.settings.options.categories.options.delete.options.id.name'),
required: true,
type: Command.option_types.STRING
}
],
type: Command.option_types.SUB_COMMAND
},
{
description: i18n('commands.settings.options.categories.options.edit.description'),
name: i18n('commands.settings.options.categories.options.edit.name'),
options: [
{
description: i18n('commands.settings.options.categories.options.edit.options.id.description'),
name: i18n('commands.settings.options.categories.options.edit.options.id.name'),
required: true,
type: Command.option_types.STRING
},
{
description: i18n('commands.settings.options.categories.options.edit.options.claiming.description'),
name: i18n('commands.settings.options.categories.options.edit.options.claiming.name'),
required: false,
type: Command.option_types.BOOLEAN
},
{
description: i18n('commands.settings.options.categories.options.edit.options.image.description'),
name: i18n('commands.settings.options.categories.options.edit.options.image.name'),
required: false,
type: Command.option_types.STRING
},
{
description: i18n('commands.settings.options.categories.options.edit.options.max_per_member.description'),
name: i18n('commands.settings.options.categories.options.edit.options.max_per_member.name'),
required: false,
type: Command.option_types.INTEGER
},
{
description: i18n('commands.settings.options.categories.options.edit.options.name.description'),
name: i18n('commands.settings.options.categories.options.edit.options.name.name'),
required: false,
type: Command.option_types.STRING
},
{
description: i18n('commands.settings.options.categories.options.edit.options.name_format.description'),
name: i18n('commands.settings.options.categories.options.edit.options.name_format.name'),
required: false,
type: Command.option_types.STRING
},
{
description: i18n('commands.settings.options.categories.options.edit.options.opening_message.description'),
name: i18n('commands.settings.options.categories.options.edit.options.opening_message.name'),
required: false,
type: Command.option_types.STRING
},
{
description: i18n('commands.settings.options.categories.options.edit.options.opening_questions.description'),
name: i18n('commands.settings.options.categories.options.edit.options.opening_questions.name'),
required: false,
type: Command.option_types.STRING
},
{
description: i18n('commands.settings.options.categories.options.edit.options.ping.description'),
name: i18n('commands.settings.options.categories.options.edit.options.ping.name'),
required: false,
type: Command.option_types.STRING
},
{
description: i18n('commands.settings.options.categories.options.edit.options.require_topic.description'),
name: i18n('commands.settings.options.categories.options.edit.options.require_topic.name'),
required: false,
type: Command.option_types.BOOLEAN
},
{
description: i18n('commands.settings.options.categories.options.edit.options.roles.description'),
name: i18n('commands.settings.options.categories.options.edit.options.roles.name'),
required: false,
type: Command.option_types.STRING
},
{
description: i18n('commands.settings.options.categories.options.edit.options.survey.description'),
name: i18n('commands.settings.options.categories.options.edit.options.survey.name'),
required: false,
type: Command.option_types.STRING
}
],
type: Command.option_types.SUB_COMMAND
},
{
description: i18n('commands.settings.options.categories.options.list.description'),
name: i18n('commands.settings.options.categories.options.list.name'),
type: Command.option_types.SUB_COMMAND
}
],
type: Command.option_types.SUB_COMMAND_GROUP
},
{
description: i18n('commands.settings.options.set.description'),
name: i18n('commands.settings.options.set.name'),
options: [
{
description: i18n('commands.settings.options.set.options.close_button.description'),
name: i18n('commands.settings.options.set.options.close_button.name'),
required: false,
type: Command.option_types.BOOLEAN
},
{
description: i18n('commands.settings.options.set.options.colour.description'),
name: i18n('commands.settings.options.set.options.colour.name'),
required: false,
type: Command.option_types.STRING
},
{
description: i18n('commands.settings.options.set.options.error_colour.description'),
name: i18n('commands.settings.options.set.options.error_colour.name'),
required: false,
type: Command.option_types.STRING
},
{
description: i18n('commands.settings.options.set.options.footer.description'),
name: i18n('commands.settings.options.set.options.footer.name'),
required: false,
type: Command.option_types.STRING
},
{
description: i18n('commands.settings.options.set.options.locale.description'),
name: i18n('commands.settings.options.set.options.locale.name'),
required: false,
type: Command.option_types.STRING
},
{
description: i18n('commands.settings.options.set.options.log_messages.description'),
name: i18n('commands.settings.options.set.options.log_messages.name'),
required: false,
type: Command.option_types.BOOLEAN
},
{
description: i18n('commands.settings.options.set.options.success_colour.description'),
name: i18n('commands.settings.options.set.options.success_colour.name'),
required: false,
type: Command.option_types.STRING
}
],
type: Command.option_types.SUB_COMMAND
}
],
permissions: ['MANAGE_GUILD']
});
}
/**
* @param {Interaction} interaction
* @returns {Promise<void|any>}
*/
async execute(interaction) {
const settings = await this.client.utils.getSettings(interaction.guild.id);
const default_i18n = this.client.i18n.getLocale(this.client.config.defaults.locale); // command properties could be in a different locale
const i18n = this.client.i18n.getLocale(settings.locale);
switch (interaction.options.getSubcommand()) {
case default_i18n('commands.settings.options.categories.options.create.name'): {
const name = interaction.options.getString(default_i18n('commands.settings.options.categories.options.create.options.name.name'));
const roles = interaction.options.getString(default_i18n('commands.settings.options.categories.options.create.options.roles.name'))?.match(/\d{17,19}/g) ?? [];
const allowed_permissions = ['VIEW_CHANNEL', 'READ_MESSAGE_HISTORY', 'SEND_MESSAGES', 'EMBED_LINKS', 'ATTACH_FILES'];
const cat_channel = await interaction.guild.channels.create(name, {
permissionOverwrites: [
...[
{
deny: ['VIEW_CHANNEL'],
id: interaction.guild.roles.everyone
},
{
allow: allowed_permissions,
id: this.client.user.id
}
],
...roles.map(r => ({
allow: allowed_permissions,
id: r
}))
],
position: 1,
reason: `Tickets category created by ${interaction.user.tag}`,
type: 'GUILD_CATEGORY'
});
await this.client.db.models.Category.create({
guild: interaction.guild.id,
id: cat_channel.id,
name,
roles
});
await this.client.commands.updatePermissions(interaction.guild);
interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setTitle(i18n('commands.settings.response.category_created', name))
],
ephemeral: true
});
break;
}
case default_i18n('commands.settings.options.categories.options.delete.name'): {
const category = await this.client.db.models.Category.findOne({ where: { id: interaction.options.getString(default_i18n('commands.settings.options.categories.options.delete.options.id.name')) } });
if (category) {
const channel = this.client.channels.cache.get(interaction.options.getString(default_i18n('commands.settings.options.categories.options.delete.options.id.name')));
if (channel) channel.delete();
await category.destroy();
interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setTitle(i18n('commands.settings.response.category_deleted', category.name))
],
ephemeral: true
});
} else {
interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.settings.response.category_does_not_exist'))
],
ephemeral: true
});
}
break;
}
case default_i18n('commands.settings.options.categories.options.edit.name'): {
const category = await this.client.db.models.Category.findOne({ where: { id: interaction.options.getString(default_i18n('commands.settings.options.categories.options.delete.options.id.name')) } });
if (!category) {
return interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.settings.response.category_does_not_exist'))
],
ephemeral: true
});
}
const claiming = interaction.options.getBoolean(default_i18n('commands.settings.options.categories.options.edit.options.claiming.name'));
const image = interaction.options.getString(default_i18n('commands.settings.options.categories.options.edit.options.image.name'));
const max_per_member = interaction.options.getInteger(default_i18n('commands.settings.options.categories.options.edit.options.max_per_member.name'));
const name = interaction.options.getString(default_i18n('commands.settings.options.categories.options.edit.options.name.name'));
const name_format = interaction.options.getString(default_i18n('commands.settings.options.categories.options.edit.options.name_format.name'));
const opening_message = interaction.options.getString(default_i18n('commands.settings.options.categories.options.edit.options.opening_message.name'));
const opening_questions = interaction.options.getString(default_i18n('commands.settings.options.categories.options.edit.options.opening_questions.name'));
const ping = interaction.options.getString(default_i18n('commands.settings.options.categories.options.edit.options.ping.name'));
const require_topic = interaction.options.getBoolean(default_i18n('commands.settings.options.categories.options.edit.options.require_topic.name'));
const roles = interaction.options.getString(default_i18n('commands.settings.options.categories.options.edit.options.roles.name'));
const survey = interaction.options.getString(default_i18n('commands.settings.options.categories.options.edit.options.survey.name'));
if (claiming !== null) category.set('claiming', claiming);
if (max_per_member !== null) category.set('max_per_member', max_per_member);
if (image !== null) category.set('image', image);
if (name !== null) category.set('name', name);
if (name_format !== null) category.set('name_format', name_format);
if (opening_message !== null) category.set('opening_message', opening_message.replace(/\\n/g, '\n'));
if (opening_questions !== null) category.set('opening_questions', JSON.parse(opening_questions));
if (ping !== null) category.set('ping', ping.match(/\d{17,19}/g) ?? []);
if (require_topic !== null) category.set('require_topic', require_topic);
if (roles !== null) category.set('roles', roles.match(/\d{17,19}/g) ?? []);
if (survey !== null) category.set('survey', survey);
await category.save();
interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setTitle(i18n('commands.settings.response.category_updated', category.name))
],
ephemeral: true
});
break;
}
case default_i18n('commands.settings.options.categories.options.list.name'): {
const categories = await this.client.db.models.Category.findAll({ where: { guild: interaction.guild.id } });
await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setTitle(i18n('commands.settings.response.category_list'))
.setDescription(categories.map(c => `- ${c.name} (\`${c.id}\`)`).join('\n'))
],
ephemeral: true
});
break;
}
case default_i18n('commands.settings.options.set.name'): {
const close_button = interaction.options.getBoolean(default_i18n('commands.settings.options.set.options.close_button.name'));
const colour = interaction.options.getString(default_i18n('commands.settings.options.set.options.colour.name'));
const error_colour = interaction.options.getString(default_i18n('commands.settings.options.set.options.error_colour.name'));
const footer = interaction.options.getString(default_i18n('commands.settings.options.set.options.footer.name'));
const locale = interaction.options.getString(default_i18n('commands.settings.options.set.options.locale.name'));
const log_messages = interaction.options.getBoolean(default_i18n('commands.settings.options.set.options.log_messages.name'));
const success_colour = interaction.options.getString(default_i18n('commands.settings.options.set.options.success_colour.name'));
if (close_button !== null) settings.set('close_button', close_button);
if (colour !== null) settings.set('colour', colour.toUpperCase());
if (error_colour !== null) settings.set('error_colour', error_colour.toUpperCase());
if (footer !== null) settings.set('footer', footer);
if (locale !== null) settings.set('locale', locale);
if (log_messages !== null) settings.set('log_messages', log_messages);
if (success_colour !== null) settings.set('success_colour', success_colour.toUpperCase());
await settings.save();
interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setTitle(i18n('commands.settings.response.settings_updated'))
],
ephemeral: true
});
break;
}
}
}
};

View File

@@ -1,95 +0,0 @@
const Command = require('../modules/commands/command');
const Keyv = require('keyv');
const {
Interaction, // eslint-disable-line no-unused-vars
MessageEmbed
} = require('discord.js');
module.exports = class StatsCommand extends Command {
constructor(client) {
const i18n = client.i18n.getLocale(client.config.locale);
super(client, {
description: i18n('commands.stats.description'),
internal: true,
name: i18n('commands.stats.name'),
staff_only: true
});
this.cache = new Keyv({ namespace: 'cache.commands.stats' });
}
/**
* @param {Interaction} interaction
* @returns {Promise<void|any>}
*/
async execute(interaction) {
const settings = await this.client.utils.getSettings(interaction.guild.id);
const i18n = this.client.i18n.getLocale(settings.locale);
const messages = await this.client.db.models.Message.findAndCountAll();
let stats = await this.cache.get(interaction.guild.id);
if (!stats) {
const tickets = await this.client.db.models.Ticket.findAndCountAll({ where: { guild: interaction.guild.id } });
stats = { // maths
messages: settings.log_messages
? await messages.rows
.reduce(async (acc, row) => (await this.client.db.models.Ticket.findOne({ where: { id: row.ticket } }))
.guild === interaction.guild.id
? await acc + 1
: await acc, 0)
: null,
response_time: Math.floor(tickets.rows.reduce((acc, row) => row.first_response
? acc + ((Math.abs(new Date(row.createdAt) - new Date(row.first_response)) / 1000) / 60)
: acc, 0) / tickets.count),
tickets: tickets.count
};
await this.cache.set(interaction.guild.id, stats, 60 * 60 * 1000); // cache for an hour
}
const guild_embed = new MessageEmbed()
.setColor(settings.colour)
.setTitle(i18n('commands.stats.response.guild.title'))
.setDescription(i18n('commands.stats.response.guild.description'))
.addField(i18n('commands.stats.fields.tickets'), String(stats.tickets), true)
.addField(i18n('commands.stats.fields.response_time.title'), i18n('commands.stats.fields.response_time.minutes', stats.response_time), true)
.setFooter(settings.footer, interaction.guild.iconURL());
if (stats.messages) guild_embed.addField(i18n('commands.stats.fields.messages'), String(stats.messages), true);
const embeds = [guild_embed];
if (this.client.guilds.cache.size > 1) {
let global = await this.cache.get('global');
if (!global) {
const tickets = await this.client.db.models.Ticket.findAndCountAll();
global = { // maths
messages: settings.log_messages
? await messages.count
: null,
response_time: Math.floor(tickets.rows.reduce((acc, row) => row.first_response
? acc + ((Math.abs(new Date(row.createdAt) - new Date(row.first_response)) / 1000) / 60)
: acc, 0) / tickets.count),
tickets: tickets.count
};
await this.cache.set('global', global, 60 * 60 * 1000); // cache for an hour
}
const global_embed = new MessageEmbed()
.setColor(settings.colour)
.setTitle(i18n('commands.stats.response.global.title'))
.setDescription(i18n('commands.stats.response.global.description'))
.addField(i18n('commands.stats.fields.tickets'), String(global.tickets), true)
.addField(i18n('commands.stats.fields.response_time.title'), i18n('commands.stats.fields.response_time.minutes', global.response_time), true)
.setFooter(settings.footer, interaction.guild.iconURL());
if (stats.messages) global_embed.addField(i18n('commands.stats.fields.messages'), String(global.messages), true);
embeds.push(global_embed);
}
await interaction.reply({ embeds });
}
};

View File

@@ -1,113 +0,0 @@
const Command = require('../modules/commands/command');
// eslint-disable-next-line no-unused-vars
const {
Message, // eslint-disable-line no-unused-vars
MessageAttachment,
MessageEmbed
} = require('discord.js');
const fsp = require('fs').promises;
const { path } = require('../utils/fs');
const mustache = require('mustache');
module.exports = class SurveyCommand extends Command {
constructor(client) {
const i18n = client.i18n.getLocale(client.config.locale);
super(client, {
description: i18n('commands.survey.description'),
internal: true,
name: i18n('commands.survey.name'),
options: async guild => {
const surveys = await this.client.db.models.Survey.findAll({ where: { guild: guild.id } });
return [
{
choices: surveys.map(survey => ({
name: survey.name,
value: survey.name
})),
description: i18n('commands.survey.options.survey.description'),
name: i18n('commands.survey.options.survey.name'),
required: true,
type: Command.option_types.STRING
}
];
},
staff_only: true
});
}
/**
* @param {Interaction} interaction
* @returns {Promise<void|any>}
*/
async execute(interaction) {
const settings = await this.client.utils.getSettings(interaction.guild.id);
const default_i18n = this.client.i18n.getLocale(this.client.config.defaults.locale); // command properties could be in a different locale
const i18n = this.client.i18n.getLocale(settings.locale);
const name = interaction.options.getString(default_i18n('commands.survey.options.survey.name'));
const survey = await this.client.db.models.Survey.findOne({
where: {
guild: interaction.guild.id,
name
}
});
if (survey) {
const {
rows: responses, count
} = await this.client.db.models.SurveyResponse.findAndCountAll({ where: { survey: survey.id } });
const users = new Set();
for (const i in responses) {
const ticket = await this.client.db.models.Ticket.findOne({ where: { id: responses[i].ticket } });
users.add(ticket.creator);
const answers = responses[i].answers.map(a => this.client.cryptr.decrypt(a));
answers.unshift(ticket.number);
responses[i] = answers;
}
let template = await fsp.readFile(path('./src/commands/extra/survey.template.html'), { encoding: 'utf8' });
template = template.replace(/[\r\n\t]/g, '');
survey.questions.unshift('Ticket #');
const html = mustache.render(template, {
columns: survey.questions,
count: {
responses: count,
users: users.size
},
responses,
survey: survey.name.charAt(0).toUpperCase() + survey.name.slice(1)
});
const attachment = new MessageAttachment(
Buffer.from(html),
`${survey.name}.html`
);
return await interaction.reply({
ephemeral: true,
files: [attachment]
});
} else {
const surveys = await this.client.db.models.Survey.findAll({ where: { guild: interaction.guild.id } });
const list = surveys.map(s => ` **\`${s.name}\`**`);
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setTitle(i18n('commands.survey.response.list.title'))
.setDescription(list.join('\n'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
}
};

View File

@@ -1,71 +0,0 @@
const Command = require('../modules/commands/command');
const {
Interaction, // eslint-disable-line no-unused-vars
MessageEmbed
} = require('discord.js');
module.exports = class TagCommand extends Command {
constructor(client) {
const i18n = client.i18n.getLocale(client.config.locale);
super(client, {
description: i18n('commands.tag.description'),
internal: true,
name: i18n('commands.tag.name'),
options: async guild => {
const settings = await client.utils.getSettings(guild.id);
return Object.keys(settings.tags).map(tag => ({
description: settings.tags[tag].substring(0, 100),
name: tag,
options: [...settings.tags[tag].matchAll(/(?<!\\){{1,2}\s?([A-Za-z0-9._:]+)\s?(?<!\\)}{1,2}/gi)]
.map(match => ({
description: match[1],
name: match[1],
required: true,
type: Command.option_types.STRING
})),
type: Command.option_types.SUB_COMMAND
}));
},
staff_only: true
});
}
/**
* @param {Interaction} interaction
* @returns {Promise<void|any>}
*/
async execute(interaction) {
const settings = await this.client.utils.getSettings(interaction.guild.id);
const i18n = this.client.i18n.getLocale(settings.locale);
try {
const tag_name = interaction.options.getSubcommand();
const tag = settings.tags[tag_name];
const args = interaction.options.data[0]?.options;
const text = tag.replace(/(?<!\\){{1,2}\s?([A-Za-z0-9._:]+)\s?(?<!\\)}{1,2}/gi, ($, $1) => {
const arg = args.find(arg => arg.name === $1);
return arg ? arg.value : $;
});
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setDescription(text)
],
ephemeral: false
});
} catch {
const list = Object.keys(settings.tags).map(t => ` **\`${t}\`**`);
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setTitle(i18n('commands.tag.response.list.title'))
.setDescription(list.join('\n'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
}
};

View File

@@ -1,87 +0,0 @@
const Command = require('../modules/commands/command');
const {
Interaction, // eslint-disable-line no-unused-vars
MessageEmbed
} = require('discord.js');
module.exports = class TopicCommand extends Command {
constructor(client) {
const i18n = client.i18n.getLocale(client.config.locale);
super(client, {
description: i18n('commands.topic.description'),
internal: true,
name: i18n('commands.topic.name'),
options: [
{
description: i18n('commands.topic.options.new_topic.description'),
name: i18n('commands.topic.options.new_topic.name'),
required: true,
type: Command.option_types.STRING
}
]
});
}
/**
* @param {Interaction} interaction
* @returns {Promise<void|any>}
*/
async execute(interaction) {
const settings = await this.client.utils.getSettings(interaction.guild.id);
const default_i18n = this.client.i18n.getLocale(this.client.config.defaults.locale); // command properties could be in a different locale
const i18n = this.client.i18n.getLocale(settings.locale);
const topic = interaction.options.getString(default_i18n('commands.topic.options.new_topic.name'));
const t_row = await this.client.db.models.Ticket.findOne({ where: { id: interaction.channel.id } });
if (!t_row) {
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.topic.response.not_a_ticket.title'))
.setDescription(i18n('commands.topic.response.not_a_ticket.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
await t_row.update({ topic: this.client.cryptr.encrypt(topic) });
const member = await interaction.guild.members.fetch(t_row.creator);
interaction.channel.setTopic(`${member} | ${topic}`, { reason: 'User updated ticket topic' });
const cat_row = await this.client.db.models.Category.findOne({ where: { id: t_row.category } });
const description = cat_row.opening_message
.replace(/{+\s?(user)?name\s?}+/gi, member.displayName)
.replace(/{+\s?(tag|ping|mention)?\s?}+/gi, member.user.toString());
const opening_message = await interaction.channel.messages.fetch(t_row.opening_message);
await opening_message.edit({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setAuthor(member.user.username, member.user.displayAvatarURL())
.setDescription(description)
.addField(i18n('ticket.opening_message.fields.topic'), topic)
.setFooter(settings.footer, interaction.guild.iconURL())
]
});
await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('commands.topic.response.changed.title'))
.setDescription(i18n('commands.topic.response.changed.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: false
});
this.client.log.info(`${interaction.user.tag} changed the topic of #${interaction.channel.name}`);
}
};

View File

@@ -1,42 +0,0 @@
module.exports = {
maria: {
dialect: 'mariadb',
name: 'MariaDB',
packages: ['mariadb']
},
mariadb: {
dialect: 'mariadb',
name: 'MariaDB',
packages: ['mariadb']
},
microsoft: {
dialect: 'mssql',
name: 'Microsoft SQL',
packages: ['tedious']
},
mysql: {
dialect: 'mysql',
name: 'MySQL',
packages: ['mysql2']
},
postgre: { // this is wrong
dialect: 'postgres',
name: 'PostgreSQL',
packages: ['pg', 'pg-hstore']
},
postgres: {
dialect: 'postgres',
name: 'PostgreSQL',
packages: ['pg', 'pg-hstore']
},
postgresql: {
dialect: 'postgres',
name: 'PostgreSQL',
packages: ['pg', 'pg-hstore']
},
sqlite: {
dialect: 'sqlite',
name: 'SQLite',
packages: ['sqlite3']
}
};

View File

@@ -1,73 +0,0 @@
const { Sequelize } = require('sequelize');
const fs = require('fs');
const { path } = require('../utils/fs');
const types = require('./dialects');
module.exports = async client => {
const {
DB_TYPE,
DB_HOST,
DB_PORT,
DB_USER,
DB_PASS,
DB_NAME
} = process.env;
const type = (DB_TYPE || 'sqlite').toLowerCase();
const supported = Object.keys(types);
if (!supported.includes(type)) {
client.log.error(new Error(`DB_TYPE (${type}) is not a valid type`));
return process.exit();
}
try {
types[type].packages.forEach(pkg => require(pkg));
} catch {
const required = types[type].packages.map(i => `"${i}"`).join(' and ');
client.log.error(new Error(`Please install the package(s) for your selected database type: ${required}`));
return process.exit();
}
let sequelize;
if (type === 'sqlite') {
client.log.info('Using SQLite storage');
sequelize = new Sequelize({
dialect: types[type].dialect,
logging: text => client.log.debug(text),
storage: path('./user/database.sqlite')
});
client.config.defaults.log_messages = false;
client.log.warn('Message logging is disabled due to insufficient database');
} else {
client.log.info(`Connecting to ${types[type].name} database...`);
sequelize = new Sequelize(DB_NAME, DB_USER, DB_PASS, {
dialect: types[type].dialect,
host: DB_HOST,
logging: text => client.log.debug(text),
port: DB_PORT
});
}
try {
await sequelize.authenticate();
client.log.success('Connected to database successfully');
} catch (error) {
client.log.warn('Failed to connect to database');
client.log.error(error);
return process.exit();
}
const models = fs.readdirSync(path('./src/database/models'))
.filter(filename => filename.endsWith('.model.js'));
for (const model of models) {
require(`./models/${model}`)(client, sequelize);
}
await sequelize.sync({ alter: false });
return sequelize;
};

View File

@@ -1,93 +0,0 @@
const { DataTypes } = require('sequelize');
module.exports = ({ config }, sequelize) => {
const { DB_TABLE_PREFIX } = process.env;
sequelize.define('Category', {
claiming: {
defaultValue: false,
type: DataTypes.BOOLEAN
},
guild: {
allowNull: false,
references: {
key: 'id',
model: DB_TABLE_PREFIX + 'guilds'
},
type: DataTypes.CHAR(19),
unique: 'name-guild'
},
id: {
allowNull: false,
primaryKey: true,
type: DataTypes.CHAR(19)
},
image: {
allowNull: true,
type: DataTypes.STRING
},
max_per_member: {
defaultValue: 1,
type: DataTypes.INTEGER
},
name: {
allowNull: false,
type: DataTypes.STRING,
unique: 'name-guild'
},
name_format: {
allowNull: false,
defaultValue: config.defaults.name_format,
type: DataTypes.STRING
},
opening_message: {
defaultValue: config.defaults.opening_message,
type: DataTypes.TEXT
},
opening_questions: {
allowNull: true,
get() {
const raw_value = this.getDataValue('opening_questions');
return raw_value
? typeof raw_value === 'string'
? JSON.parse(raw_value)
: raw_value
: null;
},
type: DataTypes.JSON
},
ping: {
defaultValue: [],
get() {
const raw_value = this.getDataValue('ping');
return raw_value
? typeof raw_value === 'string'
? JSON.parse(raw_value)
: raw_value
: null;
},
type: DataTypes.JSON
},
require_topic: {
defaultValue: false,
type: DataTypes.BOOLEAN
},
roles: {
allowNull: false,
get() {
const raw_value = this.getDataValue('roles');
return raw_value
? typeof raw_value === 'string'
? JSON.parse(raw_value)
: raw_value
: null;
},
type: DataTypes.JSON
},
survey: {
allowNull: true,
type: DataTypes.STRING
}
}, {
paranoid: true,
tableName: DB_TABLE_PREFIX + 'categories'
});
};

View File

@@ -1,21 +0,0 @@
const { DataTypes } = require('sequelize');
module.exports = (_client, sequelize) => {
const { DB_TABLE_PREFIX } = process.env;
sequelize.define('ChannelEntity', {
channel: {
allowNull: false,
type: DataTypes.CHAR(19),
unique: 'channel-ticket'
},
name: DataTypes.TEXT,
ticket: {
allowNull: false,
references: {
key: 'id',
model: DB_TABLE_PREFIX + 'tickets'
},
type: DataTypes.CHAR(19),
unique: 'channel-ticket'
}
}, { tableName: DB_TABLE_PREFIX + 'channel_entities' });
};

View File

@@ -1,66 +0,0 @@
const { DataTypes } = require('sequelize');
module.exports = ({ config }, sequelize) => {
const { DB_TABLE_PREFIX } = process.env;
sequelize.define('Guild', {
blacklist: {
defaultValue: {
members: [],
roles: []
},
get() {
const raw_value = this.getDataValue('blacklist');
return raw_value
? typeof raw_value === 'string'
? JSON.parse(raw_value)
: raw_value
: null;
},
type: DataTypes.JSON
},
close_button: {
defaultValue: false,
type: DataTypes.BOOLEAN
},
colour: {
defaultValue: config.defaults.colour,
type: DataTypes.STRING
},
error_colour: {
defaultValue: 'RED',
type: DataTypes.STRING
},
footer: {
defaultValue: 'Discord Tickets by eartharoid',
type: DataTypes.STRING
},
id: {
allowNull: false,
primaryKey: true,
type: DataTypes.CHAR(19)
},
locale: {
defaultValue: config.locale,
type: DataTypes.STRING
},
log_messages: {
defaultValue: config.defaults.log_messages,
type: DataTypes.BOOLEAN
},
success_colour: {
defaultValue: 'GREEN',
type: DataTypes.STRING
},
tags: {
defaultValue: {},
get() {
const raw_value = this.getDataValue('tags');
return raw_value
? typeof raw_value === 'string'
? JSON.parse(raw_value)
: raw_value
: null;
},
type: DataTypes.JSON
}
}, { tableName: DB_TABLE_PREFIX + 'guilds' });
};

View File

@@ -1,35 +0,0 @@
const { DataTypes } = require('sequelize');
module.exports = (_client, sequelize) => {
const { DB_TABLE_PREFIX } = process.env;
sequelize.define('Message', {
author: {
allowNull: false,
type: DataTypes.CHAR(19)
},
data: {
allowNull: false,
type: DataTypes.TEXT
},
deleted: {
defaultValue: false,
type: DataTypes.BOOLEAN
},
edited: {
defaultValue: false,
type: DataTypes.BOOLEAN
},
id: {
allowNull: false,
primaryKey: true,
type: DataTypes.CHAR(19)
},
ticket: {
allowNull: false,
references: {
key: 'id',
model: DB_TABLE_PREFIX + 'tickets'
},
type: DataTypes.CHAR(19)
}
}, { tableName: DB_TABLE_PREFIX + 'messages' });
};

View File

@@ -1,22 +0,0 @@
const { DataTypes } = require('sequelize');
module.exports = (client, sequelize) => {
const { DB_TABLE_PREFIX } = process.env;
sequelize.define('Panel', {
category: {
allowNull: true,
type: DataTypes.CHAR(19)
},
channel: {
allowNull: false,
type: DataTypes.CHAR(19)
},
guild: {
allowNull: false,
references: {
key: 'id',
model: DB_TABLE_PREFIX + 'guilds'
},
type: DataTypes.CHAR(19)
}
}, { tableName: DB_TABLE_PREFIX + 'panels' });
};

View File

@@ -1,25 +0,0 @@
const { DataTypes } = require('sequelize');
module.exports = (client, sequelize) => {
const { DB_TABLE_PREFIX } = process.env;
sequelize.define('RoleEntity', {
colour: {
defaultValue: '7289DA',
type: DataTypes.CHAR(6)
},
name: DataTypes.TEXT,
role: {
allowNull: false,
type: DataTypes.CHAR(19),
unique: 'role-ticket'
},
ticket: {
allowNull: false,
references: {
key: 'id',
model: DB_TABLE_PREFIX + 'tickets'
},
type: DataTypes.CHAR(19),
unique: 'role-ticket'
}
}, { tableName: DB_TABLE_PREFIX + 'role_entities' });
};

View File

@@ -1,32 +0,0 @@
const { DataTypes } = require('sequelize');
module.exports = (client, sequelize) => {
const { DB_TABLE_PREFIX } = process.env;
sequelize.define('Survey', {
guild: {
allowNull: false,
references: {
key: 'id',
model: DB_TABLE_PREFIX + 'guilds'
},
type: DataTypes.CHAR(19),
unique: 'name-guild'
},
name: {
allowNull: false,
type: DataTypes.STRING,
unique: 'name-guild'
},
questions: {
allowNull: true,
get() {
const raw_value = this.getDataValue('questions');
return raw_value
? typeof raw_value === 'string'
? JSON.parse(raw_value)
: raw_value
: null;
},
type: DataTypes.JSON
}
}, { tableName: DB_TABLE_PREFIX + 'surveys' });
};

View File

@@ -1,36 +0,0 @@
const { DataTypes } = require('sequelize');
module.exports = (client, sequelize) => {
const { DB_TABLE_PREFIX } = process.env;
sequelize.define('SurveyResponse', {
answers: {
allowNull: true,
get() {
const raw_value = this.getDataValue('answers');
return raw_value
? typeof raw_value === 'string'
? JSON.parse(raw_value)
: raw_value
: null;
},
type: DataTypes.JSON
},
survey: {
allowNull: false,
references: {
key: 'id',
model: DB_TABLE_PREFIX + 'surveys'
},
type: DataTypes.INTEGER,
unique: 'survey-ticket'
},
ticket: {
allowNull: false,
references: {
key: 'id',
model: DB_TABLE_PREFIX + 'tickets'
},
type: DataTypes.CHAR(19),
unique: 'survey-ticket'
}
}, { tableName: DB_TABLE_PREFIX + 'survey_responses' });
};

View File

@@ -1,81 +0,0 @@
const { DataTypes } = require('sequelize');
module.exports = (_client, sequelize) => {
const { DB_TABLE_PREFIX } = process.env;
sequelize.define('Ticket', {
category: {
allowNull: false,
references: {
key: 'id',
model: DB_TABLE_PREFIX + 'categories'
},
type: DataTypes.CHAR(19)
},
claimed_by: {
allowNull: true,
type: DataTypes.CHAR(19)
},
closed_by: {
allowNull: true,
type: DataTypes.CHAR(19)
},
closed_reason: {
allowNull: true,
type: DataTypes.STRING
},
creator: {
allowNull: false,
type: DataTypes.CHAR(19)
},
first_response: {
allowNull: true,
type: DataTypes.DATE
},
guild: {
allowNull: false,
references: {
key: 'id',
model: DB_TABLE_PREFIX + 'guilds'
},
type: DataTypes.CHAR(19),
unique: 'number-guild'
},
id: {
allowNull: false,
primaryKey: true,
type: DataTypes.CHAR(19)
},
last_message: {
allowNull: true,
type: DataTypes.DATE
},
number: {
allowNull: false,
type: DataTypes.INTEGER,
unique: 'number-guild'
},
open: {
defaultValue: true,
type: DataTypes.BOOLEAN
},
opening_message: {
allowNull: true,
type: DataTypes.CHAR(19)
},
pinned_messages: {
defaultValue: [],
get() {
const raw_value = this.getDataValue('pinned_messages');
return raw_value
? typeof raw_value === 'string'
? JSON.parse(raw_value)
: raw_value
: null;
},
type: DataTypes.JSON
},
topic: {
allowNull: true,
type: DataTypes.TEXT
}
}, { tableName: DB_TABLE_PREFIX + 'tickets' });
};

View File

@@ -1,34 +0,0 @@
const { DataTypes } = require('sequelize');
module.exports = (client, sequelize) => {
const { DB_TABLE_PREFIX } = process.env;
sequelize.define('UserEntity', {
avatar: DataTypes.STRING,
bot: DataTypes.BOOLEAN,
discriminator: DataTypes.STRING,
display_name: DataTypes.TEXT,
role: {
allowNull: false,
references: {
key: 'role',
model: DB_TABLE_PREFIX + 'role_entities'
},
type: DataTypes.CHAR(19)
},
ticket: {
allowNull: false,
references: {
key: 'id',
model: DB_TABLE_PREFIX + 'tickets'
},
type: DataTypes.CHAR(19),
unique: 'user-ticket'
},
user: {
allowNull: false,
type: DataTypes.CHAR(19),
unique: 'user-ticket'
},
username: DataTypes.TEXT
}, { tableName: DB_TABLE_PREFIX + 'user_entities' });
};

View File

@@ -1,217 +0,0 @@
/**
* Discord Tickets
* Copyright (C) 2021 Isaac Saunders
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* @name @discord-tickets/bot
* @description An open-source Discord bot for ticket management
* @copyright 2021 Isaac Saunders
* @license GNU-GPLv3
*/
/* eslint-disable no-console */
process.title = 'Discord Tickets';
const min_node_version = '16.6.0';
const semver = require('semver');
if (semver.lt(process.versions.node, min_node_version)) return console.log(`\x07Error: Discord Tickets does not work on Node v${process.versions.node}; please upgrade to v${min_node_version} or above.`);
const leeks = require('leeks.js');
const fs = require('fs');
const { path } = require('./utils/fs');
const checkFile = (file, example) => {
if (fs.existsSync(path(file))) return true;
if (!fs.existsSync(path(example))) {
console.log(`\x07Error: "${file}" not found, and unable to create it due to "${example}" being missing.`);
return process.exit();
}
console.log(`Copying "${example}" to "${file}"...`);
fs.copyFileSync(path(example), path(file));
return false;
};
checkFile('./user/config.js', './user/example.config.js');
if (!checkFile('./.env', './example.env')) {
console.log('Generating database encryption key...');
const file = path('./.env');
const crypto = require('crypto');
const key = 'DB_ENCRYPTION_KEY=';
const value = crypto
.randomBytes(24)
.toString('hex');
let data = fs.readFileSync(file, { encoding: 'utf-8' });
data = data.replace(key, key + value);
fs.writeFileSync(file, data);
console.log('Saved.');
console.log(leeks.colours.yellow('Warning: do not lose your ENV file or encryption key; you will lose access to data in the database.'));
console.log('\x07Please set your bot\'s "DISCORD_TOKEN" in "./.env".');
process.exit();
}
require('dotenv').config({ path: path('./.env') });
require('./banner')();
const log = require('./logger');
const { version } = require('../package.json');
process.on('unhandledRejection', error => {
log.notice('PLEASE INCLUDE THIS INFORMATION IF YOU ASK FOR HELP ABOUT THE FOLLOWING ERROR:');
log.notice(`Discord Tickets v${version}, Node v${process.versions.node} on ${process.platform}`);
log.warn('An error was not caught');
if (error instanceof Error) log.warn(`Uncaught ${error.name}`);
log.error(error);
});
const DiscordUtils = require('./utils/discord');
const Cryptr = require('cryptr');
const I18n = require('@eartharoid/i18n');
const ListenerLoader = require('./modules/listeners/loader');
const CommandManager = require('./modules/commands/manager');
const PluginManager = require('./modules/plugins/manager');
const TicketManager = require('./modules/tickets/manager');
const fetch = require('node-fetch');
const {
Client,
Intents
} = require('discord.js');
// eslint-disable-next-line no-unused-vars
const Logger = require('leekslazylogger');
/**
* The Discord client
* @typedef {Bot} Bot
* @extends {Client}
*/
class Bot extends Client {
constructor() {
super({
intents: [
Intents.FLAGS.GUILDS,
Intents.FLAGS.GUILD_MEMBERS,
Intents.FLAGS.GUILD_MESSAGES,
Intents.FLAGS.GUILD_MESSAGE_REACTIONS
],
partials: [
'CHANNEL',
'MESSAGE',
'REACTION'
],
presence: DiscordUtils.selectPresence()
});
(async () => {
this.version = version;
/** The global bot configuration */
this.config = require('../user/config');
/**
* A [leekslazylogger](https://logger.eartharoid.me) instance
* @type {Logger}
*/
this.log = log;
/**
* A [Cryptr](https://www.npmjs.com/package/cryptr) instance
* @type {Cryptr}
*/
this.cryptr = new Cryptr(process.env.DB_ENCRYPTION_KEY);
const locales = {};
fs.readdirSync(path('./src/locales'))
.filter(file => file.endsWith('.json'))
.forEach(file => {
const data = fs.readFileSync(path(`./src/locales/${file}`), { encoding: 'utf8' });
const name = file.slice(0, file.length - 5);
locales[name] = JSON.parse(data);
});
/**
* An [@eartharoid/i18n](https://github.com/eartharoid/i18n) instance
* @type {I18n}
*/
this.i18n = new I18n('en-GB', locales);
/** A sequelize instance */
this.db = await require('./database')(this), // this.db.models.Ticket...
this.setMaxListeners(this.config.max_listeners); // set the max listeners for each event
require('./update/notifier')(this); // check for updates
const listeners = new ListenerLoader(this);
listeners.load(); // load listeners
/** The ticket manager */
this.tickets = new TicketManager(this);
/** The command manager, used by internal and plugin commands */
this.commands = new CommandManager(this);
/** The plugin manager */
this.plugins = new PluginManager(this);
this.plugins.load(); // load plugins
/** Some utility methods */
this.utils = new DiscordUtils(this);
this.log.info('Connecting to Discord API...');
this.login();
})();
}
async postStats() {
/**
* OH NO, TELEMETRY!?
* Relax, it just counts how many people are using Discord Tickets.
* You can see the source here: https://github.com/discord-tickets/stats
*/
if (this.config.super_secret_setting) { // you can disable it if you really want
const data = {
client: this.user.id,
guilds: this.guilds.cache.size,
members: await this.guilds.cache.reduce(async (acc, guild) => await acc + (await guild.fetch()).approximateMemberCount, 0),
tickets: await this.db.models.Ticket.count(),
version: this.version
};
this.log.debug('Sending statistics', data);
await fetch('https://stats.discordtickets.app/v2', {
body: JSON.stringify(data),
headers: { 'Content-Type': 'application/json' },
method: 'POST'
})
.catch(error => {
this.log.warn('Failed to send statistics');
this.log.debug(error);
});
}
}
}
new Bot();

View File

@@ -1,13 +0,0 @@
const EventListener = require('../modules/listeners/listener');
module.exports = class DebugEventListener extends EventListener {
constructor(client) {
super(client, { event: 'debug' });
}
async execute(data) {
if (this.client.config.developer.debug) {
this.client.log.debug(data);
}
}
};

View File

@@ -1,12 +0,0 @@
const EventListener = require('../modules/listeners/listener');
module.exports = class ErrorEventListener extends EventListener {
constructor(client) {
super(client, { event: 'error' });
}
async execute(error) {
this.client.log.warn('The client encountered an error');
this.client.log.error(error);
}
};

View File

@@ -1,12 +0,0 @@
const EventListener = require('../modules/listeners/listener');
module.exports = class GuildCreateEventListener extends EventListener {
constructor(client) {
super(client, { event: 'guildCreate' });
}
async execute(guild) {
this.client.log.info(`Added to "${guild.name}"`);
this.client.commands.publish(guild);
}
};

View File

@@ -1,11 +0,0 @@
const EventListener = require('../modules/listeners/listener');
module.exports = class GuildDeleteEventListener extends EventListener {
constructor(client) {
super(client, { event: 'guildDelete' });
}
async execute(guild) {
this.client.log.info(`Removed from "${guild.name}"`);
}
};

View File

@@ -1,22 +0,0 @@
const EventListener = require('../modules/listeners/listener');
module.exports = class GuildMemberRemoveEventListener extends EventListener {
constructor(client) {
super(client, { event: 'guildMemberRemove' });
}
async execute(member) {
const tickets = await this.client.db.models.Ticket.findAndCountAll({
where: {
creator: member.id,
guild: member.guild.id
}
});
for (const ticket of tickets.rows) {
await this.client.tickets.close(ticket.id, null, member.guild.id, 'Member left the guild');
}
this.client.log.info(`Closed ${tickets.count} ticket(s) belonging to ${member.user.tag} who left "${member.guild.name}"`);
}
};

View File

@@ -1,323 +0,0 @@
const EventListener = require('../modules/listeners/listener');
const {
Interaction, // eslint-disable-line no-unused-vars
MessageActionRow,
MessageButton,
MessageEmbed
} = require('discord.js');
module.exports = class InteractionCreateEventListener extends EventListener {
constructor(client) {
super(client, { event: 'interactionCreate' });
}
/**
* @param {Interaction} interaction
*/
async execute(interaction) {
this.client.log.debug(interaction);
const settings = await this.client.utils.getSettings(interaction.guild.id);
const i18n = this.client.i18n.getLocale(settings.locale);
const blacklisted = settings.blacklist.members.includes[interaction.user.id] ||
interaction.member?.roles.cache?.some(role => settings.blacklist.roles.includes(role));
if (blacklisted) {
return interaction.reply({
content: i18n('blacklisted'),
ephemeral: true
});
}
const handlePanel = async id => {
const cat_row = await this.client.db.models.Category.findOne({ where: { id } });
if (!cat_row) {
this.client.log.warn('Could not find a category with the ID given by a panel interaction');
return interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('command_execution_error.title'))
.setDescription(i18n('command_execution_error.description'))
],
ephemeral: true
});
}
const tickets = await this.client.db.models.Ticket.findAndCountAll({
where: {
category: cat_row.id,
creator: interaction.user.id,
open: true
}
});
if (tickets.count >= cat_row.max_per_member) {
if (cat_row.max_per_member === 1) {
return interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('commands.new.response.has_a_ticket.title'))
.setDescription(i18n('commands.new.response.has_a_ticket.description', tickets.rows[0].id))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
} else {
const list = tickets.rows.map(row => {
if (row.topic) {
const description = row.topic.substring(0, 30);
const ellipses = row.topic.length > 30 ? '...' : '';
return `<#${row.id}>: \`${description}${ellipses}\``;
} else {
return `<#${row.id}>`;
}
});
return interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('commands.new.response.max_tickets.title', tickets.count))
.setDescription(i18n('commands.new.response.max_tickets.description', list.join('\n')))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
} else {
try {
const t_row = await this.client.tickets.create(interaction.guild.id, interaction.user.id, id);
return interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('commands.new.response.created.title'))
.setDescription(i18n('commands.new.response.created.description', `<#${t_row.id}>`))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
} catch (error) {
this.client.log.error(error);
return interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('commands.new.response.error.title'))
.setDescription(error.message)
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
}
};
if (interaction.isCommand()) {
// handle slash commands
this.client.commands.handle(interaction);
} else if (interaction.isButton()) {
if (interaction.customId.startsWith('panel.single')) {
// handle single-category panels
handlePanel(interaction.customId.split(':')[1]);
} else if (interaction.customId.startsWith('ticket.claim')) {
// handle ticket claiming
if (!(await this.client.utils.isStaff(interaction.member))) return;
const t_row = await this.client.db.models.Ticket.findOne({ where: { id: interaction.channel.id } });
await t_row.update({ claimed_by: interaction.user.id });
await interaction.channel.permissionOverwrites.edit(interaction.user.id, { VIEW_CHANNEL: true }, `Ticket claimed by ${interaction.user.tag}`);
const cat_row = await this.client.db.models.Category.findOne({ where: { id: t_row.category } });
for (const role of cat_row.roles) {
await interaction.channel.permissionOverwrites.edit(role, { VIEW_CHANNEL: false }, `Ticket claimed by ${interaction.user.tag}`);
}
this.client.log.info(`${interaction.user.tag} has claimed "${interaction.channel.name}" in "${interaction.guild.name}"`);
await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('ticket.claimed.title'))
.setDescription(i18n('ticket.claimed.description', interaction.member.toString()))
.setFooter(settings.footer, interaction.guild.iconURL())
]
});
const components = new MessageActionRow();
if (cat_row.claiming) {
components.addComponents(
new MessageButton()
.setCustomId('ticket.unclaim')
.setLabel(i18n('ticket.unclaim'))
.setEmoji('♻️')
.setStyle('SECONDARY')
);
}
if (settings.close_button) {
components.addComponents(
new MessageButton()
.setCustomId('ticket.close')
.setLabel(i18n('ticket.close'))
.setEmoji('✖️')
.setStyle('DANGER')
);
}
await interaction.message.edit({ components: [components] });
} else if (interaction.customId.startsWith('ticket.unclaim')) {
// handle ticket unclaiming
if (!(await this.client.utils.isStaff(interaction.member))) return;
const t_row = await this.client.db.models.Ticket.findOne({ where: { id: interaction.channel.id } });
await t_row.update({ claimed_by: null });
await interaction.channel.permissionOverwrites.delete(interaction.user.id, `Ticket released by ${interaction.user.tag}`);
const cat_row = await this.client.db.models.Category.findOne({ where: { id: t_row.category } });
for (const role of cat_row.roles) {
await interaction.channel.permissionOverwrites.edit(role, { VIEW_CHANNEL: true }, `Ticket released by ${interaction.user.tag}`);
}
this.client.log.info(`${interaction.user.tag} has released "${interaction.channel.name}" in "${interaction.guild.name}"`);
await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('ticket.released.title'))
.setDescription(i18n('ticket.released.description', interaction.member.toString()))
.setFooter(settings.footer, interaction.guild.iconURL())
]
});
const components = new MessageActionRow();
if (cat_row.claiming) {
components.addComponents(
new MessageButton()
.setCustomId('ticket.claim')
.setLabel(i18n('ticket.claim'))
.setEmoji('🙌')
.setStyle('SECONDARY')
);
}
if (settings.close_button) {
components.addComponents(
new MessageButton()
.setCustomId('ticket.close')
.setLabel(i18n('ticket.close'))
.setEmoji('✖️')
.setStyle('DANGER')
);
}
await interaction.message.edit({ components: [components] });
} else if (interaction.customId.startsWith('ticket.close')) {
// handle ticket close button
const t_row = await this.client.db.models.Ticket.findOne({ where: { id: interaction.channel.id } });
await interaction.reply({
components: [
new MessageActionRow()
.addComponents(
new MessageButton()
.setCustomId(`confirm_close:${interaction.id}`)
.setLabel(i18n('commands.close.response.confirm.buttons.confirm'))
.setEmoji('✅')
.setStyle('SUCCESS')
)
.addComponents(
new MessageButton()
.setCustomId(`cancel_close:${interaction.id}`)
.setLabel(i18n('commands.close.response.confirm.buttons.cancel'))
.setEmoji('❌')
.setStyle('SECONDARY')
)
],
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setTitle(i18n('commands.close.response.confirm.title'))
.setDescription(settings.log_messages ? i18n('commands.close.response.confirm.description_with_archive') : i18n('commands.close.response.confirm.description'))
.setFooter(this.client.utils.footer(settings.footer, i18n('collector_expires_in', 30)), interaction.guild.iconURL())
],
ephemeral: true
});
const filter = i => i.user.id === interaction.user.id && i.customId.includes(interaction.id);
const collector = interaction.channel.createMessageComponentCollector({
filter,
time: 30000
});
collector.on('collect', async i => {
await i.deferUpdate();
if (i.customId === `confirm_close:${interaction.id}`) {
await this.client.tickets.close(t_row.id, interaction.user.id, interaction.guild.id);
await i.editReply({
components: [],
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setTitle(i18n('commands.close.response.closed.title', t_row.number))
.setDescription(i18n('commands.close.response.closed.description', t_row.number))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
} else {
await i.editReply({
components: [],
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('commands.close.response.canceled.title'))
.setDescription(i18n('commands.close.response.canceled.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
collector.stop();
});
collector.on('end', async collected => {
if (collected.size === 0) {
await interaction.editReply({
components: [],
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setAuthor(interaction.user.username, interaction.user.displayAvatarURL())
.setTitle(i18n('commands.close.response.confirmation_timeout.title'))
.setDescription(i18n('commands.close.response.confirmation_timeout.description'))
.setFooter(settings.footer, interaction.guild.iconURL())
],
ephemeral: true
});
}
});
}
} else if (interaction.isSelectMenu()) {
if (interaction.customId.startsWith('panel.multiple')) {
// handle multi-category panels and new command
handlePanel(interaction.values[0]);
}
}
}
};

View File

@@ -1,190 +0,0 @@
const EventListener = require('../modules/listeners/listener');
const fetch = require('node-fetch');
const {
MessageAttachment,
MessageEmbed
} = require('discord.js');
module.exports = class MessageCreateEventListener extends EventListener {
constructor(client) {
super(client, { event: 'messageCreate' });
}
async execute(message) {
if (!message.guild) return;
const settings = await this.client.utils.getSettings(message.guild.id);
const i18n = this.client.i18n.getLocale(settings.locale);
const t_row = await this.client.db.models.Ticket.findOne({ where: { id: message.channel.id } });
if (t_row) {
const should_log_message = process.env.DB_TYPE.toLowerCase() !== 'sqlite' && settings.log_messages && !message.system;
if (should_log_message) this.client.tickets.archives.addMessage(message); // add the message to the archives (if it is in a ticket channel)
const ignore = [this.client.user.id, t_row.creator];
if (!t_row.first_response && !ignore.includes(message.author.id)) t_row.first_response = new Date();
t_row.last_message = new Date();
await t_row.save();
} else if (message.content.startsWith('tickets/')) {
if (!message.member.permissions.has('MANAGE_GUILD')) return;
const match = message.content.toLowerCase().match(/tickets\/(\w+)/i);
if (!match) return;
switch (match[1]) {
case 'surveys': {
const attachments = [...message.attachments.values()];
if (attachments.length >= 1) {
this.client.log.info(`Downloading surveys for "${message.guild.name}"`);
const data = await (await fetch(attachments[0].url)).json();
for (const survey in data) {
const survey_data = {
guild: message.guild.id,
name: survey
};
const [s_row] = await this.client.db.models.Survey.findOrCreate({
defaults: survey_data,
where: survey_data
});
s_row.questions = data[survey];
await s_row.save();
}
this.client.log.success(`Updated surveys for "${message.guild.name}"`);
message.channel.send({ content: i18n('commands.settings.response.settings_updated') });
} else {
const surveys = await this.client.db.models.Survey.findAll({ where: { guild: message.guild.id } });
const data = {};
for (const survey in surveys) {
const {
name, questions
} = surveys[survey];
data[name] = questions;
}
const attachment = new MessageAttachment(
Buffer.from(JSON.stringify(data, null, 2)),
'surveys.json'
);
message.channel.send({ files: [attachment] });
}
break;
}
case 'tags': {
const attachments = [...message.attachments.values()];
if (attachments.length >= 1) {
this.client.log.info(`Downloading tags for "${message.guild.name}"`);
const data = await (await fetch(attachments[0].url)).json();
settings.tags = data;
await settings.save();
this.client.log.success(`Updated tags for "${message.guild.name}"`);
this.client.commands.publish(message.guild);
message.channel.send({ content: i18n('commands.settings.response.settings_updated') });
} else {
const list = Object.keys(settings.tags).map(t => ` **\`${t}\`**`);
const attachment = new MessageAttachment(
Buffer.from(JSON.stringify(settings.tags, null, 2)),
'tags.json'
);
return await message.channel.send({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setTitle(i18n('commands.tag.response.list.title'))
.setDescription(list.join('\n'))
.setFooter(settings.footer, message.guild.iconURL())
],
files: [attachment]
});
}
break;
}
}
} else {
if (message.author.bot) return;
const p_row = await this.client.db.models.Panel.findOne({ where: { channel: message.channel.id } });
if (p_row) {
// handle message panels
await message.delete();
const cat_row = await this.client.db.models.Category.findOne({ where: { id: p_row.category } });
const tickets = await this.client.db.models.Ticket.findAndCountAll({
where: {
category: cat_row.id,
creator: message.author.id,
open: true
}
});
let response;
if (tickets.count >= cat_row.max_per_member) {
if (cat_row.max_per_member === 1) {
const embed = new MessageEmbed()
.setColor(settings.error_colour)
.setAuthor(message.author.username, message.author.displayAvatarURL())
.setTitle(i18n('commands.new.response.has_a_ticket.title'))
.setDescription(i18n('commands.new.response.has_a_ticket.description', tickets.rows[0].id))
.setFooter(this.client.utils.footer(settings.footer, i18n('message_will_be_deleted_in', 15)), message.guild.iconURL());
try {
response = await message.author.send({ embeds: [embed] });
} catch {
response = await message.channel.send({ embeds: [embed] });
}
} else {
const list = tickets.rows.map(row => {
if (row.topic) {
const description = row.topic.substring(0, 30);
const ellipses = row.topic.length > 30 ? '...' : '';
return `<#${row.id}>: \`${description}${ellipses}\``;
} else {
return `<#${row.id}>`;
}
});
const embed = new MessageEmbed()
.setColor(settings.error_colour)
.setAuthor(message.author.username, message.author.displayAvatarURL())
.setTitle(i18n('commands.new.response.max_tickets.title', tickets.count))
.setDescription(i18n('commands.new.response.max_tickets.description', list.join('\n')))
.setFooter(this.client.utils.footer(settings.footer, i18n('message_will_be_deleted_in', 15)), message.author.iconURL());
try {
response = await message.author.send({ embeds: [embed] });
} catch {
response = await message.channel.send({ embeds: [embed] });
}
}
} else {
try {
await this.client.tickets.create(message.guild.id, message.author.id, cat_row.id, message.cleanContent);
} catch (error) {
const embed = new MessageEmbed()
.setColor(settings.error_colour)
.setAuthor(message.author.username, message.author.displayAvatarURL())
.setTitle(i18n('commands.new.response.error.title'))
.setDescription(error.message)
.setFooter(this.client.utils.footer(settings.footer, i18n('message_will_be_deleted_in', 15)), message.guild.iconURL());
try {
response = await message.author.send({ embeds: [embed] });
} catch {
response = await message.channel.send({ embeds: [embed] });
}
}
}
if (response) {
setTimeout(async () => {
await response.delete();
}, 15000);
}
}
}
}
};

View File

@@ -1,15 +0,0 @@
const EventListener = require('../modules/listeners/listener');
module.exports = class MessageDeleteEventListener extends EventListener {
constructor(client) {
super(client, { event: 'messageDelete' });
}
async execute(message) {
if (!message.guild) return;
const settings = await this.client.utils.getSettings(message.guild.id);
if (settings.log_messages && !message.system) this.client.tickets.archives.deleteMessage(message); // mark the message as deleted in the database (if it exists)
}
};

View File

@@ -1,23 +0,0 @@
const EventListener = require('../modules/listeners/listener');
module.exports = class MessageUpdateEventListener extends EventListener {
constructor(client) {
super(client, { event: 'messageUpdate' });
}
async execute(oldm, newm) {
if (newm.partial) {
try {
await newm.fetch();
} catch (error) {
return this.client.log.error(error);
}
}
if (!newm.guild) return;
const settings = await this.client.utils.getSettings(newm.guild.id);
if (settings.log_messages && !newm.system) this.client.tickets.archives.updateMessage(newm); // update the message in the database
}
};

View File

@@ -1,11 +0,0 @@
const EventListener = require('../modules/listeners/listener');
module.exports = class RateLimitEventListener extends EventListener {
constructor(client) {
super(client, { event: 'rateLimit' });
}
async execute(limit) {
this.client.log.warn('Rate-limited!', limit);
}
};

View File

@@ -1,35 +0,0 @@
const EventListener = require('../modules/listeners/listener');
module.exports = class ReadyEventListener extends EventListener {
constructor(client) {
super(client, {
event: 'ready',
once: true
});
}
async execute() {
this.client.log.success(`Connected to Discord as "${this.client.user.tag}"`);
this.client.log.info('Loading commands');
this.client.commands.load(); // load internal commands
this.client.plugins.plugins.forEach(p => p.load()); // call load function for each plugin
this.client.commands.publish(); // send commands to discord
if (this.client.config.presence.presences.length > 1) {
const { selectPresence } = require('../utils/discord');
setInterval(() => {
const presence = selectPresence();
this.client.user.setPresence(presence);
this.client.log.debug(`Updated presence: ${presence.activities[0].type} ${presence.activities[0].name}`);
}, this.client.config.presence.duration * 1000);
}
if (this.client.config.super_secret_setting) {
setInterval(async () => {
await this.client.postStats();
}, 3600000);
await this.client.postStats();
}
}
};

View File

@@ -1,11 +0,0 @@
const EventListener = require('../modules/listeners/listener');
module.exports = class WarnEventListener extends EventListener {
constructor(client) {
super(client, { event: 'warn' });
}
async execute(warning) {
this.client.log.warn(warning);
}
};

View File

@@ -1,7 +0,0 @@
{
"bot": {
"missing_permissions": {
"description": "احتاج الى الاذونات التالية : \n%s"
}
}
}

View File

@@ -1,340 +0,0 @@
{
"blacklisted": "❌ Jsi na černé listině",
"bot": {
"missing_permissions": {
"description": "Discord Tickets potřebuje následující oprávnění\n%s",
"title": "⚠️"
},
"version": "[Discord Tickets](%s) v%s od [eartharoid](%s)"
},
"collector_expires_in": "Vyprší za %d sekund",
"command_execution_error": {
"description": "Během provádění příkazu došlo k neočekávané chybě.\nPožádej správce serveru, aby zkontroloval výstup konzole / protokoly pro více detailů.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Přidat člena do tiketu",
"name": "pridat",
"options": {
"member": {
"description": "Člen k přidání do tiketu",
"name": "člen"
},
"ticket": {
"description": "Tiket, do kterého chcete přidat člena",
"name": "ticket"
}
},
"response": {
"added": {
"description": "%s byl přidán do %s.",
"title": "✅ Člen přidán"
},
"no_member": {
"description": "Označte prosím člena, kterého chcete přidat.",
"title": "❌ Neznámý člen"
},
"no_permission": {
"description": "Nejste tvůrcem tohoto tiketu a nejste ani člen týmu, nemůžete do tohoto tiketu přidávat členy.",
"title": "❌ Nedostatečná oprávnění"
},
"not_a_ticket": {
"description": "Použijte tento příkaz c kanálu tiketu nebo označte kanál.",
"title": "❌ Toto není kanál tiketu"
}
}
},
"blacklist": {
"description": "Zablokovat/povolit uživateli interakci s botem",
"name": "blacklist",
"response": {
"empty_list": {
"description": "Na černé listině nejsou žádní uživatelé nebo role. Použij `%sblacklist <členNeboRole>` pro přidání uživatele nebo role na černou listinu.",
"title": "📃 Zablokovaní uživatelé a role"
},
"illegal_action": {
"description": "%s je člen týmu a nemůže být na černé listině.",
"title": "❌ Tohoto člena nemůžeš přidat na černou listinu"
},
"list": {
"title": "📃 Zablokovaní uživatelé a role"
},
"member_added": {
"description": "Uživatel <@%s> byl přidán na černou listinu. Už nebude moci využívat bota.",
"title": "✅ Uživatel přidán na černou listinu"
},
"member_removed": {
"description": "Uživatel <@%s> byl odebrán z černé listiny. Nyní bude moci využívat bota.",
"title": "✅ Uživatel odebrán z z černé listiny"
},
"role_added": {
"description": "Role <@&%s> byla přidána na černou listinu. Uživatelé s touto rolí nyní nebudou moci využívat bota.",
"title": "✅ Role přidána na černou listinu"
},
"role_removed": {
"description": "Role <@&%s> byla odebrána z černé listiny. Nyní bude moci využívat bota.",
"title": "✅ Role odebrána z černé listiny"
}
}
},
"close": {
"description": "Uzavře kanál s ticketem",
"name": "zavrit",
"response": {
"closed": {
"description": "Tiket #%s byl uzavřen.",
"title": "✅ Ticket uzavřen"
},
"closed_multiple": {
"description": [
"%d tiket byl uzavřen.",
"%d tiketů bylo uzavřeno."
],
"title": [
"✅ Ticket uzavřen",
"✅ Tikety uzavřeny"
]
},
"confirm": {
"buttons": {
"confirm": "zavrit"
},
"description": "Zareagujte pomocí ✅ k uzavření tohoto tiketu.",
"description_with_archive": "Později si budete moci zobrazit archivovanou verzi.",
"title": "❔ Jste si jistí?"
},
"confirm_multiple": {
"description": [
"Zareagujte pomocí ✅ pro uzavření %d tiketu.",
"Zareagujte pomocí ✅ pro uzavření %d tiketů."
],
"title": "❔ Jste si jistí?"
},
"confirmation_timeout": {
"description": "Potvrzení vám trvalo příliš dlouho.",
"title": "❌ Doba pro reakci vypršela"
},
"invalid_time": {
"description": "Zadaný čas nebyl rozpoznán.",
"title": "❌ Neplatný vstup"
},
"no_tickets": {
"description": "Nejsou zde žádné tikety, které byly aktivní po zadané časově rozmezí.",
"title": "❌ Žádné tikety k uzavření"
},
"not_a_ticket": {
"description": "Tento příkaz prosím použijte v kanálu tiketu nebo použijte vlajku tiketu.\nZadejte `%shelp close` pro více informací.",
"title": "❌ Toto není kanál tiketu"
},
"unresolvable": {
"description": "`%s` nebyl rozpoznán jako tiket. Zadejte prosím ID nebo číslo tiketu nebo jej označte.",
"title": "❌ Chyba"
}
}
},
"help": {
"description": "Seznam příkazů, ke kterým máš přístup, nebo k nalezení dalších informací o příkazu",
"name": "napoveda",
"response": {
"list": {
"description": "Příkazy, ke kterým máš přístup, jsou vypsány níže. Pro více informací o příkazu zadej `{prefix}napoveda [příkaz]`. Pro vytvoření ticketu zadej `{prefix}novy [téma]`.",
"fields": {
"commands": "Příkazy"
},
"title": "❔ Nápověda"
}
}
},
"new": {
"description": "Vytvořit ticket",
"name": "novy",
"request_topic": {
"description": "Popiš prosím stručně několika slovy, o čem je tento ticket.",
"title": "Téma ticketu"
},
"response": {
"created": {
"description": "Tvůj ticket byl vytvořen: %s.",
"title": "✅ Ticket vytvořen"
},
"error": {
"title": "❌ Chyba"
},
"has_a_ticket": {
"description": "Prosím použij již existující ticket (<#%s>) nebo jej uzavři pro vytvoření nového.",
"title": "❌ Již máš otevřený ticket"
},
"max_tickets": {
"description": "Prosím použij `%szavrit` pro uzavření nepotřebných ticketů.\n\n%s",
"title": "❌ Již máš %d otevřených ticketů"
},
"no_categories": {
"description": "Než budeš moci vytvořit nový ticket, musí správce serveru vytvořit alespoň jednu kategorii pro tickety.",
"title": "❌ Nelze vytvořit ticket"
},
"select_category": {
"description": "Vyber kategorii, která je nejrelevantnější pro téma ticketu.",
"title": "🔤 Prosím vyber kategorii ticketu"
},
"select_category_timeout": {
"description": "Výběr kategorie ticketu trval příliš dlouho.",
"title": "❌ Doba pro reakci vypršela"
}
}
},
"panel": {
"description": "Vytvořit nový ticket panel",
"name": "panel",
"response": {
"invalid_category": {
"description": "Jedno nebo více ID kategorií je vadných.",
"title": "❌ Neplatná kategorie"
}
}
},
"remove": {
"description": "Odebrat člena z ticketu",
"name": "odebrat",
"response": {
"no_member": {
"description": "Označ prosím člena, kterého chceš přidat.",
"title": "❌ Neznámý člen"
},
"no_permission": {
"description": "Nejsi tvůrcem tohoto ticketu a nejsi ani členem týmu, nemůžeš z tohoto ticketu odebírat členy.",
"title": "❌ Nedostatečná oprávnění"
},
"not_a_ticket": {
"description": "Použijte tento příkaz c kanálu tiketu nebo označte kanál.",
"title": "❌ Toto není kanál tiketu"
},
"removed": {
"description": "%s byl/a odebrán/a z %s.",
"title": "✅ Člen odebrán"
}
}
},
"settings": {
"description": "Konfigurace Discord Tickets",
"name": "nastaveni"
},
"stats": {
"description": "Zobrazit statistiky ticketu",
"fields": {
"messages": "Zprávy",
"response_time": {
"minutes": "%s minut",
"title": "Průměrná doba odpovědi"
},
"tickets": "Tickety"
},
"name": "statistiky",
"response": {
"global": {
"description": "Statistiky všech ticketů napříč všemi servery, kde je použita tato instance bota Discord Tickets.",
"title": "📊 Globální statistiky"
},
"guild": {
"description": "Statistiky o ticketech v tomto serveru. Tato data jsou v mezipaměti jednu hodinu.",
"title": "📊 Statistiky tohoto serveru"
}
}
},
"survey": {
"description": "Zobrazit odpovědi dotazníku",
"name": "dotazník",
"response": {
"list": {
"title": "📃 Dotazníky"
}
}
},
"tag": {
"description": "Použít odpověď na značku",
"name": "značka",
"response": {
"error": "❌ Chyba",
"list": {
"title": "📃 Seznam značek"
},
"missing": "Tato značka vyžaduje následující argumenty:\n%s",
"not_a_ticket": {
"description": "Tato značka může být použita pouze v kanálu ticketu, protože používá reference na tickety.",
"title": "❌ Toto není kanál tiketu"
}
}
},
"topic": {
"description": "Změnit téma ticketu",
"name": "tema",
"response": {
"changed": {
"description": "Téma tohoto ticketu bylo změněno.",
"title": "✅ Téma změněno"
},
"not_a_ticket": {
"description": "Tento příkaz prosím použij kanálu ticketu, jehož téma chceš změnit.",
"title": "❌ Toto není kanál tiketu"
}
}
}
},
"message_will_be_deleted_in": "Tato zpráva bude smazána za %d sekund",
"missing_permissions": {
"description": "K provedení tohoto příkazu nemáš dostatečná oprávnění:\n%s",
"title": "❌"
},
"ticket": {
"claimed": {
"description": "%s si vzal tento ticket.",
"title": "✅ Ticket vzat"
},
"close": "Uzavřít",
"closed": {
"description": "Tento ticket byl uzavřen.\nKanál bude smazán za 5 sekund.",
"title": "✅ Ticket uzavřen"
},
"closed_by_member": {
"description": "Tento ticket byl uzavřen uživatelem %s.\nKanál bude smazán za 5 sekund.",
"title": "✅ Ticket uzavřen"
},
"closed_by_member_with_reason": {
"description": "Tento ticket byl uzavřen uživatelem %s: `%s`\nKanál bude smazán za 5 sekund.",
"title": "✅ Ticket uzavřen"
},
"closed_with_reason": {
"description": "Tento ticket byl uzavřen: `%s`\nKanál bude smazán za 5 sekund.",
"title": "✅ Ticket uzavřen"
},
"member_added": {
"description": "%s byl/a přidán/a uživatelem %s",
"title": "Člen přidán"
},
"member_removed": {
"description": "%s byl/a odebrán/a uživatelem %s",
"title": "Člen odebrán"
},
"opening_message": {
"content": "%s\n%s vytvořil nový ticket",
"fields": {
"topic": "Téma"
}
},
"questions": "Prosím odpověz na následující otázky:\n\n%s",
"released": {
"description": "%s uvolnil ticket.",
"title": "✅ Ticket uvolněn"
},
"survey": {
"complete": {
"description": "Děkujeme za zpětnou vazbu.",
"title": "✅ Děkujeme"
},
"start": {
"description": "Zdravíme, %s. Než bude tento kanál odstraněn, nevadilo by ti vyplnit rychlý %d-otázkový dotazník?",
"title": "❔ Zpětná vazba"
}
}
}
}

View File

@@ -1,610 +0,0 @@
{
"blacklisted": "❌ Du er blacklisted",
"bot": {
"missing_permissions": {
"description": "Discord Tickets kræver følgende tilladelser:\n%s",
"title": "⚠️"
},
"version": "[Discord Tickets](%s) v%s af [eartharoid](%s)"
},
"collector_expires_in": "Udløber om %d sekunder",
"command_execution_error": {
"description": "Der opstod en uventet fejl under udførelse af kommandoer.\nBed en administrator om at kontrollere konsoloutputtet/-logfilerne for at få flere oplysninger.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Tilføj et medlem til en ticket",
"name": "add",
"options": {
"member": {
"description": "Det medlem der skal tilføjes til ticketen",
"name": "member"
},
"ticket": {
"description": "Den ticket du vil tilføje medlemmet til",
"name": "ticket"
}
},
"response": {
"added": {
"description": "%s er føjet til %s.",
"title": "✅ Medlem tilføjet"
},
"no_member": {
"description": "Nævn det medlem, du vil tilføje.",
"title": "❌ Ukendt medlem"
},
"no_permission": {
"description": "Du er ikke skaberen af denne ticket, og du er ikke et staff medlem; Du kan ikke føje medlemmer til denne ticket.",
"title": "❌ Utilstrækkelig tilladelser"
},
"not_a_ticket": {
"description": "Brug denne kommando i ticket kanalen, eller nævn kanalen.",
"title": "❌ Dette er ikke en ticket kanal"
}
}
},
"blacklist": {
"description": "Se eller rediger blacklisten",
"name": "blacklist",
"options": {
"add": {
"description": "Tilføj et medlem eller rolle til blacklisten",
"name": "add",
"options": {
"member_or_role": {
"description": "Det medlem eller rolle du vil tilføje til blacklisten",
"name": "member_or_role"
}
}
},
"remove": {
"description": "Fjern et medlem eller rolle fra blacklisten",
"name": "remove",
"options": {
"member_or_role": {
"description": "Det medlem eller rolle du vil fjerne fra blacklisten",
"name": "member_or_role"
}
}
},
"show": {
"description": "Vis medlemmer eller roller i blacklisten",
"name": "show"
}
},
"response": {
"empty_list": {
"description": "Der er ingen medlemmer eller roller, der er blacklistet. Skriv `/blacklist add` for at tilføje et medlem eller en rolle til blacklisten.",
"title": "📃 Blacklistede medlemmer og roller"
},
"illegal_action": {
"description": "%s er staff medlem og kan ikke blacklistes.",
"title": "❌ Du kan ikke blackliste dette medlem"
},
"invalid": {
"description": "Denne bruger eller rolle kan ikke blive fjernet fra blacklisten eftersom de ikke er blacklisted.",
"title": "❌ Fejl"
},
"list": {
"fields": {
"members": "Members",
"roles": "Roles"
},
"title": "📃 Blacklistede medlemmer og roller"
},
"member_added": {
"description": "<@%s> er blevet føjet til blacklisten. De vil ikke længere være i stand til at interagere med botten.",
"title": "✅ Føjet medlem til blacklisten"
},
"member_removed": {
"description": "<@%s> er blevet fjernet fra den blacklisten. De kan nu bruge botten igen.",
"title": "✅ fjernet medlem fra blacklisten"
},
"role_added": {
"description": "<@&%s> er blevet føjet til blacklisten. Medlemmer med denne rolle vil ikke længere være i stand til at interagere med botten.",
"title": "✅ Føjet rolle til blacklisten"
},
"role_removed": {
"description": "<@&%s> er blevet fjernet fra blacklisten. Medlemmer med denne rolle kan nu bruge botten igen.",
"title": "✅ Fjernede rollen fra blacklisten"
}
}
},
"close": {
"description": "Luk en ticketkanal",
"name": "close",
"options": {
"reason": {
"description": "Begrundelse for at lukke ticketen(e)",
"name": "reason"
},
"ticket": {
"description": "Ticketen der skal lukkes, enten ticket nummeret eller kanal ID",
"name": "ticket"
},
"time": {
"description": "Luk alle tickets der har været inaktive i den specificeret tid",
"name": "time"
}
},
"response": {
"canceled": {
"description": "Du har annulleret handlingen.",
"title": "🚫 Annulleret"
},
"closed": {
"description": "Ticket #%s er blevet lukket.",
"title": "✅ Ticket lukket"
},
"closed_multiple": {
"description": [
"%d Ticket er blevet lukket.",
"%d Tickets er blevet lukket."
],
"title": [
"✅ Ticket lukket",
"✅ Tickets lukket"
]
},
"confirm": {
"buttons": {
"cancel": "Annullér",
"confirm": "Bekræft"
},
"description": "Venligst bekræft din beslutning.",
"description_with_archive": "Ticketen vil blive arkiveret for fremtidig reference.",
"title": "❔ Er du sikker?"
},
"confirm_multiple": {
"buttons": {
"cancel": "Annullér",
"confirm": [
"Luk %d ticket",
"Luk %d tickets"
]
},
"description": [
"Du er ved at lukke %d ticket.",
"Du er ved at lukke %d tickets."
],
"title": "❔ Er du sikker?"
},
"confirmation_timeout": {
"description": "Du tog for lang tid på at bekræfte.",
"title": "❌ Interaktionstid er udløbet"
},
"invalid_time": {
"description": "Den angivne tidsperiode kunne ikke parses.",
"title": "❌ Ugyldigt input"
},
"no_permission": {
"description": "Du er ikke et staff medlem eller skaberen af denne ticket.",
"title": "❌ Der er ikke tilstrækkelig tilladelse"
},
"no_tickets": {
"description": "Der er ingen tickets, der har været inaktive i denne periode.",
"title": "❌ Ingen tickets til at lukke"
},
"not_a_ticket": {
"description": "Brug denne kommando i en ticketkanal, eller brug ticketflaget.\nSkriv '/help close' for at få yderligere oplysninger.",
"title": "❌ Dette er ikke en ticketkanal"
},
"unresolvable": {
"description": "`%s` kunne ikke løses til en ticket. Angiv ticket ID/nævn eller nummer.",
"title": "❌ Fejl"
}
}
},
"help": {
"description": "Vis de kommandoer du har adgang til",
"name": "help",
"response": {
"list": {
"description": "De kommandoer, du har adgang til, er angivet nedenfor. Hvis du vil oprette en ticket, skal du skrive **'/new'**.",
"fields": {
"commands": "commands"
},
"title": "❔ Hjælp"
}
}
},
"new": {
"description": "Opret en ny ticket",
"name": "new",
"options": {
"topic": {
"description": "Emnet på ticketen",
"name": "topic"
}
},
"request_topic": {
"description": "Angiv kort, hvad denne ticket handler om, med et par ord.",
"title": "⚠️ Ticket emne"
},
"response": {
"created": {
"description": "Din ticket er blevet oprettet: %s.",
"title": "✅ Ticket oprettet"
},
"error": {
"title": "❌ Fejl"
},
"has_a_ticket": {
"description": "Brug venligst din eksisterende ticket <# (%s>) eller luk den, før du opretter en anden.",
"title": "❌ Du har allerede en åben ticket"
},
"max_tickets": {
"description": "Brug venligst '/close' for at lukke unødvendige tickets.\n\n%s",
"title": "❌ Du har allerede %d åbne tickets"
},
"no_categories": {
"description": "En serveradministrator skal oprette mindst én ticketkategori, før en ny ticket kan åbnes.",
"title": "❌ Kan ikke oprette ticket"
},
"select_category": {
"description": "Vælg den kategori, der er mest relevant for din tickets emne.",
"title": "🔤 Vælg ticket kategorien"
},
"select_category_timeout": {
"description": "Du tog for lang tid om at vælge ticket kategorien.",
"title": "❌ Interaktionstid er udløbet"
}
}
},
"panel": {
"description": "Opret et nyt ticket panel",
"name": "panel",
"options": {
"categories": {
"description": "En komma separeret liste af kategori ID'er",
"name": "categories"
},
"description": {
"description": "Beskrivelsen for panel beskeden",
"name": "description"
},
"image": {
"description": "Et billed URL for panel beskeden",
"name": "image"
},
"just_type": {
"description": "Lav et \"bare skriv\" panel?",
"name": "just_type"
},
"thumbnail": {
"description": "Et miniaturebilled -URL til panel beskeden",
"name": "thumbnail"
},
"title": {
"description": "Titlen for panel beskeden",
"name": "title"
}
},
"response": {
"invalid_category": {
"description": "Et eller flere af de angivne kategori-id'er er ugyldige.",
"title": "❌ Ugyldig kategori"
},
"too_many_categories": {
"description": "\"just type\" panelet kan kun blive brugt med en enkelt kategori.",
"title": "❌ For mange kategorier"
}
}
},
"remove": {
"description": "Fjerne et medlem fra en ticket",
"name": "remove",
"options": {
"member": {
"description": "medlemmet der skal fjernes fra ticketen",
"name": "member"
},
"ticket": {
"description": "Den ticket du vil fjerne medlemmet fra",
"name": "ticket"
}
},
"response": {
"no_member": {
"description": "Nævn det medlem, du vil fjerne.",
"title": "❌ Ukendt medlem"
},
"no_permission": {
"description": "Du er ikke skaberen af denne ticket, og du er ikke et staff medlem; Du kan ikke fjerne medlemmer fra denne ticket.",
"title": "❌ Der er ikke tilstrækkelig tilladelse"
},
"not_a_ticket": {
"description": "Brug denne kommando i ticket kanalen, eller nævn kanalen.",
"title": "❌ Dette er ikke en ticket kanal"
},
"removed": {
"description": "%s er blevet fjernet fra %s.",
"title": "✅ Medlem fjernet"
}
}
},
"settings": {
"description": "Konfigurer Discord Tickets",
"name": "settings",
"options": {
"categories": {
"description": "Administrer dine ticket kategorier",
"name": "categories",
"options": {
"create": {
"description": "Opret en ny kategori",
"name": "create",
"options": {
"name": {
"description": "Navnet på kategorien",
"name": "name"
},
"roles": {
"description": "En komma separeret liste over staff rolle ID'er for denne kategori",
"name": "roles"
}
}
},
"delete": {
"description": "Slet en kategori",
"name": "delete",
"options": {
"id": {
"description": "ID for den kategori der skal slettes",
"name": "id"
}
}
},
"edit": {
"description": "Foretag ændringer i en kategoris konfiguration",
"name": "edit",
"options": {
"claiming": {
"description": "Vil du aktivere ticket claim?",
"name": "claiming"
},
"id": {
"description": "ID for den kategori der skal redigeres",
"name": "id"
},
"image": {
"description": "Et billed URL",
"name": "image"
},
"max_per_member": {
"description": "Det maksimum antal tickets et medlem kan have i denne kategori",
"name": "max_per_member"
},
"name": {
"description": "Kategori navnet",
"name": "name"
},
"name_format": {
"description": "Ticket navne format",
"name": "name_format"
},
"opening_message": {
"description": "Tekst der skal sendes når en ticket åbnes",
"name": "opening_message"
},
"opening_questions": {
"description": "Spørgsmål at stille når en ticket er åbnet.",
"name": "opening_questions"
},
"ping": {
"description": "En komma separeret liste over rolle-id'er, der skal pinges",
"name": "ping"
},
"require_topic": {
"description": "Kræv at brugeren angiver emne for ticketen?",
"name": "require_topic"
},
"roles": {
"description": "En komma separeret liste over staff rolle ID'er",
"name": "roles"
},
"survey": {
"description": "Undersøgelse der skal bruges",
"name": "survey"
}
}
},
"list": {
"description": "List kategorier",
"name": "list"
}
}
},
"set": {
"description": "Indstil muligheder",
"name": "set",
"options": {
"close_button": {
"description": "Vil du aktivere lukning med en knap?",
"name": "close_button"
},
"colour": {
"description": "Standardfarven",
"name": "colour"
},
"error_colour": {
"description": "Fejl farven",
"name": "error_colour"
},
"footer": {
"description": "Embed footer tekst",
"name": "footer"
},
"locale": {
"description": "Locale (sprog)",
"name": "locale"
},
"log_messages": {
"description": "Gem meddelelser fra tickets?",
"name": "log_messages"
},
"success_colour": {
"description": "Succesfarven",
"name": "success_colour"
}
}
}
},
"response": {
"category_created": "✅ `%s` ticket kategori er blevet oprettet",
"category_deleted": "✅ `%s` ticket kategori er blevet slettet",
"category_does_not_exist": "❌ Ingen kategori eksisterer med det angivet ID",
"category_list": "Ticket kategorier",
"category_updated": "✅ `%s` ticket kategori er blevet opdateret",
"settings_updated": "✅ Indstillinger er blevet opdateret"
}
},
"stats": {
"description": "Vis ticket statistik",
"fields": {
"messages": "Meddelelser",
"response_time": {
"minutes": "%s minutter",
"title": "Gennemsnitlig svartid"
},
"tickets": "Tickets"
},
"name": "stats",
"response": {
"global": {
"description": "Statistik om tickets på tværs af alle guilds, hvor denne Discord Tickets instans bruges.",
"title": "📊 Global statistik"
},
"guild": {
"description": "Statistik om tickets i dennee guild. Disse data cachelagres i en time.",
"title": "📊 Denne servers statistik"
}
}
},
"survey": {
"description": "Vis undersøgelsessvar",
"name": "survey",
"options": {
"survey": {
"description": "Navnet på den undersøgelse du vil se svar på",
"name": "survey"
}
},
"response": {
"list": {
"title": "📃 Undersøgelser"
}
}
},
"tag": {
"description": "Brug et tagsvar",
"name": "tag",
"options": {
"tag": {
"description": "Navnet på det tag du vil bruge",
"name": "tag"
}
},
"response": {
"error": "❌ Fejl",
"list": {
"title": "📃 Tag liste"
},
"missing": "Dette tag kræver følgende argumenter:\n%s",
"not_a_ticket": {
"description": "Dette tag kan kun bruges inden for en ticket kanal, da det bruger ticket referencer.",
"title": "❌ Dette er ikke en ticket kanal"
}
}
},
"topic": {
"description": "Skift emnet på ticketen",
"name": "topic",
"options": {
"new_topic": {
"description": "Det nye emne på ticketen",
"name": "new_topic"
}
},
"response": {
"changed": {
"description": "Emnet for denne ticket er blevet ændret.",
"title": "✅ Emnet er ændret"
},
"not_a_ticket": {
"description": "Brug venligst denne kommando i ticket kanalen, du ønsker at ændre emnet på.",
"title": "❌ Dette er ikke en ticket kanal"
}
}
}
},
"message_will_be_deleted_in": "Denne meddelelse slettes om %d sekunder",
"missing_permissions": {
"description": "Du har ikke de nødvendige tilladelser til at bruge denne kommando:\n%s",
"title": "❌ Fejl"
},
"panel": {
"create_ticket": "Opret en ticket"
},
"ticket": {
"claim": "Claim",
"claimed": {
"description": "%s har gjort krav på denne ticket.",
"title": "✅ Ticket gjort krav på"
},
"close": "Luk",
"closed": {
"description": "Denne ticket er blevet lukket.\nKanalen slettes om 5 sekunder.",
"title": "✅ Ticket lukket"
},
"closed_by_member": {
"description": "Denne ticket er blevet lukket af %s.\nKanalen slettes om 5 sekunder.",
"title": "✅ Ticket lukket"
},
"closed_by_member_with_reason": {
"description": "Denne ticket er blevet lukket af %s: '%s'\nKanalen slettes om 5 sekunder.",
"title": "✅ Ticket lukket"
},
"closed_with_reason": {
"description": "Denne ticket er blevet lukket: '%s'\nKanalen slettes om 5 sekunder.",
"title": "✅ Ticket lukket"
},
"member_added": {
"description": "%s er blevet tilføjet af %s",
"title": "Medlem tilføjet"
},
"member_removed": {
"description": "%s er blevet fjernet af %s",
"title": "Medlem fjernet"
},
"opening_message": {
"content": "%s\n%s har oprettet en ny ticket",
"fields": {
"topic": "Emne"
}
},
"questions": "Besvar venligst følgende spørgsmål:\n\n%s",
"released": {
"description": "%s har frigivet denne ticket.",
"title": "✅ Ticket frigivet"
},
"survey": {
"complete": {
"description": "Tak for din feedback.",
"title": "✅ Tak skal du have"
},
"start": {
"buttons": {
"ignore": "Nej",
"start": "Start undersøgelse"
},
"description": "Hej, %s. Før denne kanal slettes, har du noget imod at gennemføre en hurtig %d-spørgsmålsundersøgelse?",
"title": "❔ Feedback"
}
},
"unclaim": "unclaim"
},
"updated_permissions": "✅ Slash kommando tilladelser opdateret"
}

View File

@@ -1,610 +0,0 @@
{
"blacklisted": "❌ Du stehst auf der Blacklist",
"bot": {
"missing_permissions": {
"description": "Discord Tickets erfordert die folgenden Berechtigungen: \n%s ",
"title": "⚠️"
},
"version": "[Discord Tickets] (%s) v%s von [eartharoid](%s)"
},
"collector_expires_in": "Läuft in %d Sekunden ab",
"command_execution_error": {
"description": "Ein unerwarteter Fehler ist aufgetreten.\nFrage bitte den Andministrator um Hilfe.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Füge einen Benutzer zum Ticket hinzu",
"name": "hinzufügen",
"options": {
"member": {
"description": "Das Mitglied, das dem Ticket hinzugefügt werden soll",
"name": "Mitglied"
},
"ticket": {
"description": "Das Ticket, zu dem das Mitglied hinzugefügt werden soll",
"name": "ticket"
}
},
"response": {
"added": {
"description": "%s wurde zu %s hinzugefügt.",
"title": "✅ Benutzer hinzugefügt"
},
"no_member": {
"description": "Bitte erwähne den Benutzer, den Du hinzufügen möchtest.",
"title": "❌ Unbekanntes Mitglied"
},
"no_permission": {
"description": "Du bist weder der Ersteller dieses Tickets, noch ein Support-Mitglied; Du kannst keine neuen Benutzer zu diesem Ticket hinzufügen.",
"title": "❌ Unzureichende Berechtigung"
},
"not_a_ticket": {
"description": "Bitte führe den Befehl im Ticket-Kanal aus, oder erwähne diesen.",
"title": "❌ Dies ist kein Ticket-Kanal"
}
}
},
"blacklist": {
"description": "Sieh dir die Blacklist an oder bearbeite sie",
"name": "blacklist",
"options": {
"add": {
"description": "Füge ein Mitglied oder eine Rolle der Blacklist hinzu",
"name": "hinzufügen",
"options": {
"member_or_role": {
"description": "Mitglied oder Rolle der Blacklist hinzufügen",
"name": "mitglied_oder_rolle"
}
}
},
"remove": {
"description": "Entferne einen Nutzer oder eine Rolle von der Blacklist",
"name": "entfernen",
"options": {
"member_or_role": {
"description": "Der Nutzer oder die Rolle zum Entfernen von der Blacklist",
"name": "mitglied_oder_rolle"
}
}
},
"show": {
"description": "Zeige die Nutzer und Rollen in der Blacklist",
"name": "zeigen"
}
},
"response": {
"empty_list": {
"description": "Es sind keine Mitglieder oder Rollen auf der Blacklist. Gebe `/blacklist add` ein, um ein Mitglied oder eine Rolle zur Blacklist hinzuzufügen.",
"title": "📃 Blockierte Benutzer und Rollen"
},
"illegal_action": {
"description": "%s ist ein Support-Mitglied und kann nicht blockiert werden.",
"title": "❌ Sie können kein Support-Mitglied blockieren"
},
"invalid": {
"description": "Dieses Mitglied oder diese Rolle können nicht von der Blacklist entfernt werden, weil sie nicht geblacklisted sind.",
"title": "❌ Fehler"
},
"list": {
"fields": {
"members": "Mitglieder",
"roles": "Rollen"
},
"title": "📃 Blockierte Benutzer und Rollen"
},
"member_added": {
"description": "<@%s> wurde blockiert. Er/Sie kann nicht mehr mit dem Bot interagieren.",
"title": "✅ Benutzer zur Blacklist hinzugefügt"
},
"member_removed": {
"description": "<@%s> wurde von der Blacklist entfernt. Er/Sie kann den Bot wieder verwenden.",
"title": "✅ Mitglieder von der Blacklist entfernt"
},
"role_added": {
"description": "<@&%s> wurde zur Blacklist hinzugefügt. Mitglieder mit dieser Rolle können nicht mehr mit dem Bot interagieren.",
"title": "✅ Rolle zur Blacklist hinzugefügt"
},
"role_removed": {
"description": "<@&%s> wurde von der Blacklist entfernt. Mitglieder mit dieser Rolle können den Bot wieder benutzen.",
"title": "✅ Rolle von der Blacklist entfernt"
}
}
},
"close": {
"description": "Schließe einen Ticket-Kanal",
"name": "schließen",
"options": {
"reason": {
"description": "Der Grund für die Schließung des Tickets",
"name": "grund"
},
"ticket": {
"description": "Das zu schließende Ticket, entweder die Nummer oder die Kanal-ID",
"name": "ticket"
},
"time": {
"description": "Schließe alle Tickets, die seit der angegebenen Zeit inaktiv sind",
"name": "zeit"
}
},
"response": {
"canceled": {
"description": "Du hast den Vorgang abgebrochen.",
"title": "🚫 Abgebrochen"
},
"closed": {
"description": "Das Ticket #%s wurde geschlossen.",
"title": "✅ Ticket geschlossen"
},
"closed_multiple": {
"description": [
"Das Ticket %d wurde geschlossen.",
"Die Tickets %d wurden geschlossen."
],
"title": [
"✅ Ticket geschlossen",
"✅ Tickets geschlossen"
]
},
"confirm": {
"buttons": {
"cancel": "Abbrechen",
"confirm": "Schließen"
},
"description": "Bitte bestätige Deine Entscheidung.",
"description_with_archive": "Das Ticket wird zum späteren Nachschlagen archiviert.",
"title": "❔ Sind Sie sicher?"
},
"confirm_multiple": {
"buttons": {
"cancel": "Abbruch",
"confirm": [
"%d Ticket schließen",
"%d Tickets schließen"
]
},
"description": [
"Du bist dabei, %d Ticket zu schließen.",
"Du bist dabei, %d Tickets zu schließen."
],
"title": "❔ Sind Sie sicher?"
},
"confirmation_timeout": {
"description": "Sie haben zu lange zum Bestätigen gebraucht.",
"title": "❌ Zu lange gewartet"
},
"invalid_time": {
"description": "Die eingegebene Zeit konnte nicht verarbeitet werden.",
"title": "❌ Ungültige Eingabe"
},
"no_permission": {
"description": "Du bist kein Teammitglied oder der Ticketersteller",
"title": "Unzureichende Rechte"
},
"no_tickets": {
"description": "Es gibt keine inaktiven Tickets für den ausgewählten Zeitraum.",
"title": "❌ Keine Tickets zum schließen"
},
"not_a_ticket": {
"description": "Bitte verwende diesen Befehl in einem Ticketkanal oder verwende das Ticket-Flag.\nGebe `/help close` ein, um weitere Informationen zu erhalten.",
"title": "❌ Das ist kein Ticket-Kanal"
},
"unresolvable": {
"description": "`%s` konnte keinem Ticket zugeordnet werden. Bitte verwende die Kanal ID / Erwähnung des Kanals, oder die Nummer.",
"title": "❌ Fehler"
}
}
},
"help": {
"description": "Liste die Befehle, auf die Du Zugriff hast",
"name": "Hilfe",
"response": {
"list": {
"description": "Die Befehle, auf die Du Zugriff hast, sind unten aufgeführt. Um ein Ticket zu erstellen, gebe **`/new`** ein.",
"fields": {
"commands": "Befehle"
},
"title": "❔ Hilfe"
}
}
},
"new": {
"description": "Erstelle ein neues Ticket",
"name": "neu",
"options": {
"topic": {
"description": "Das Thema des Tickets",
"name": "thema"
}
},
"request_topic": {
"description": "Bitte gebe in wenigen Worten kurz an, worum es bei diesem Ticket geht.",
"title": "⚠️ Ticketthema"
},
"response": {
"created": {
"description": "Dein Ticket wurde erstellt: %s.",
"title": "✅ Ticket erstellt"
},
"error": {
"title": "❌ Fehler"
},
"has_a_ticket": {
"description": "Bitte verwende Dein schon vorhandenes Ticket (<#%s>) oder schließe es, bevor Du ein neues erstellst.",
"title": "❌ Du hast bereits ein offenes Ticket"
},
"max_tickets": {
"description": "Bitte verwende `/close`, um nicht benötigte Tickets zu schließen.\n\n%s",
"title": "❌ Du hast bereits %d offene Tickets"
},
"no_categories": {
"description": "Ein Server Administrator muss zuerst eine Kategorie erstellen, bevor Du ein Ticket erstellen kannst.",
"title": "❌ Kann kein neues Ticket erstellen"
},
"select_category": {
"description": "Wähle die Kategorie aus, die für das Thema Deines Tickets am relevantesten ist.",
"title": "🔤 Bitte wähle eine Kategorie"
},
"select_category_timeout": {
"description": "Du hast zu lange gebraucht um eine Ticket Kategorie zu wählen.",
"title": "❌ Interaktionszeit abgelaufen"
}
}
},
"panel": {
"description": "Erstelle ein neues Ticket-Panel",
"name": "panel",
"options": {
"categories": {
"description": "Eine durch Kommas getrennte Liste von Kategorie-IDs",
"name": "kategorien"
},
"description": {
"description": "Die Beschreibung für die Panel-Nachricht",
"name": "beschreibung"
},
"image": {
"description": "Eine Bild-URL für die Panel-Nachricht",
"name": "bild"
},
"just_type": {
"description": "Ein \"just type\"-Panel erstellen?",
"name": "just_type"
},
"thumbnail": {
"description": "Eine Miniaturbild-URL für die Panel-Nachricht",
"name": "thumbnail"
},
"title": {
"description": "Der Titel für die Panel-Nachricht",
"name": "titel"
}
},
"response": {
"invalid_category": {
"description": "Eine oder mehrere der angegebenen Kategorie IDs sind nicht gültig.",
"title": "❌ Ungültige Kategorie"
},
"too_many_categories": {
"description": "Das Feld \"just type\" kann nur mit einer einzigen Kategorie verwendet werden.",
"title": "❌ Zu viele Kategorien"
}
}
},
"remove": {
"description": "Entferne einen Benutzer von einem Ticket",
"name": "entfernen",
"options": {
"member": {
"description": "Das Mitglied, das aus dem Ticket entfernt werden soll",
"name": "mitglied"
},
"ticket": {
"description": "Das Ticket, aus dem das Mitglied entfernt werden soll",
"name": "ticket"
}
},
"response": {
"no_member": {
"description": "Bitte nenne den Benutzer den Du entfernen möchtest.",
"title": "❌ Unbekannter Benutzer"
},
"no_permission": {
"description": "Du bist weder Ersteller dieses Tickets, noch Support-Mitglied; Du kannst keine Benutzer von diesem Ticket entfernen.",
"title": "❌ Unzureichende Berechtigung"
},
"not_a_ticket": {
"description": "Bitte führe en Befehl im Ticket-Kanal aus, oder erwähne diesen.",
"title": "❌ Das ist kein Ticket-Kanal"
},
"removed": {
"description": "%s wurde von %s entfernt.",
"title": "✅ Benutzer entfernt"
}
}
},
"settings": {
"description": "Konfiguriere Discord Tickets",
"name": "settings",
"options": {
"categories": {
"description": "Verwalte Deine Ticketkategorien",
"name": "kategorien",
"options": {
"create": {
"description": "Erstelle eine neue Kategorie",
"name": "erstellen",
"options": {
"name": {
"description": "Der Name der Kategorie",
"name": "name"
},
"roles": {
"description": "Eine durch Kommas getrennte Liste von Mitarbeiterrollen-IDs für diese Kategorie",
"name": "roles"
}
}
},
"delete": {
"description": "Lösche eine Kategorie",
"name": "delete",
"options": {
"id": {
"description": "Die ID der zu löschenden Kategorie",
"name": "id"
}
}
},
"edit": {
"description": "Nehme Änderungen an der Konfiguration einer Kategorie vor",
"name": "edit",
"options": {
"claiming": {
"description": "Ticketanspruch aktivieren?",
"name": "beanspruchen"
},
"id": {
"description": "Die ID der zu bearbeitenden Kategorie",
"name": "id"
},
"image": {
"description": "Eine Bild-URL",
"name": "bild"
},
"max_per_member": {
"description": "Die maximale Anzahl an Tickets, die ein Mitglied in dieser Kategorie haben kann",
"name": "max_per_member"
},
"name": {
"description": "Der Kategoriename",
"name": "name"
},
"name_format": {
"description": "Das Format des Ticketnamens",
"name": "name_format"
},
"opening_message": {
"description": "Der zu sendende Text, wenn ein Ticket geöffnet wird",
"name": "opening_message"
},
"opening_questions": {
"description": "Fragen, die gestellt werden müssen, wenn ein Ticket eröffnet wird.",
"name": "opening_questions"
},
"ping": {
"description": "Eine durch Kommas getrennte Liste von Rollen-IDs, die gepingt werden sollen",
"name": "ping"
},
"require_topic": {
"description": "Den Benutzer auffordern, das Thema des Tickets anzugeben?",
"name": "require_topic"
},
"roles": {
"description": "Eine durch Kommas getrennte Liste von Mitarbeiterrollen-IDs",
"name": "roles"
},
"survey": {
"description": "Die zu verwendende Umfrage",
"name": "survey"
}
}
},
"list": {
"description": "Kategorien auflisten",
"name": "list"
}
}
},
"set": {
"description": "Optionen festlegen",
"name": "set",
"options": {
"close_button": {
"description": "Schließen per Knopfdruck aktivieren?",
"name": "close_button"
},
"colour": {
"description": "Die Standardfarbe",
"name": "colour"
},
"error_colour": {
"description": "Die Fehlerfarbe",
"name": "error_colour"
},
"footer": {
"description": "Der eingebettete Fußzeilentext",
"name": "footer"
},
"locale": {
"description": "Das Gebietsschema (Sprache)",
"name": "gebietsschema"
},
"log_messages": {
"description": "Nachrichten von Tickets speichern?",
"name": "log_messages"
},
"success_colour": {
"description": "Die Erfolgsfarbe",
"name": "success_colour"
}
}
}
},
"response": {
"category_created": "✅ Die Ticketkategorie `%s` wurde erstellt",
"category_deleted": "✅ Die Ticketkategorie `%s` wurde gelöscht",
"category_does_not_exist": "❌ Es existiert keine Kategorie mit der angegebenen ID",
"category_list": "Ticketkategorien",
"category_updated": "✅ Die Ticketkategorie `%s` wurde aktualisiert",
"settings_updated": "✅ Die Einstellungen wurden aktualisiert"
}
},
"stats": {
"description": "Ticket Statistiken ansehen",
"fields": {
"messages": "Nachrichten",
"response_time": {
"minutes": "%s Minuten",
"title": "Durchschnittliche Reaktionszeit"
},
"tickets": "Tickets"
},
"name": "stats",
"response": {
"global": {
"description": "Statistiken über Tickets in allen Gilden, in denen diese Discord-Tickets-Instanz verwendet wird.",
"title": "📊 Globale Statistiken"
},
"guild": {
"description": "Statistiken von diesem Server. Die Daten sind für eine Stunde im Zwischenspeicher.",
"title": "📊 Statistiken von diesem Server"
}
}
},
"survey": {
"description": "Umfragen-Ergebnisse ansehen",
"name": "Umfrage",
"options": {
"survey": {
"description": "Der Name der Umfrage, deren Antworten angezeigt werden sollen",
"name": "Umfrage"
}
},
"response": {
"list": {
"title": "📃 Umfragen"
}
}
},
"tag": {
"description": "Verwende einen 'Tag' als Antwort",
"name": "tag",
"options": {
"tag": {
"description": "Der Name des zu verwendenden Tags",
"name": "tag"
}
},
"response": {
"error": "❌ Fehler",
"list": {
"title": "📃 Tag-Liste"
},
"missing": "Dieser Tag benötigt die folgenden Vorraussetzungen:\n%s",
"not_a_ticket": {
"description": "Dieses Tag kann nur innerhalb eines Ticketkanals verwendet werden, da es Ticketreferenzen verwendet.",
"title": "❌ Das ist kein Ticket-Kanal"
}
}
},
"topic": {
"description": "Änder das Anliegen Deines Tickets",
"name": "Thema",
"options": {
"new_topic": {
"description": "Das neue Thema des Tickets",
"name": "new_topic"
}
},
"response": {
"changed": {
"description": "Das Anliegen dieses Tickets wurde erfolgreich geändert.",
"title": "✅ Anliegen geändert"
},
"not_a_ticket": {
"description": "Bitte verwende diesen Befehl nur in einem Ticket-Kanal in dem Du das Anliegen ändern willst.",
"title": "❌ Das ist kein Ticket-Kanal"
}
}
}
},
"message_will_be_deleted_in": "Diese Nachricht wird in %d Sekunden gelöscht.",
"missing_permissions": {
"description": "Du hast nicht die benötigten Berechtigungen um diesen Befehl zu verwenden:\n%s",
"title": "❌ Fehler"
},
"panel": {
"create_ticket": "Ticket erstellen"
},
"ticket": {
"claim": "Beanspruchen",
"claimed": {
"description": "Dieses Ticket gehört jetzt %s.",
"title": "✅ Ticket beansprucht"
},
"close": "Schließen",
"closed": {
"description": "Dieses Ticket wurde geschlossen.\nDieser Kanal wird in 5 Sekunden gelöscht.",
"title": "✅ Ticket geschlossen"
},
"closed_by_member": {
"description": "Dieses Ticket wurde von %s geschlossen.\nDieser Kanal wird in 5 Sekunden gelöscht.",
"title": "✅ Ticket geschlossen"
},
"closed_by_member_with_reason": {
"description": "Dieses Ticket wurde von %s geschlossen: `%s`\nDieser Kanal wird in 5 Sekunden gelöscht.",
"title": "✅ Ticket geschlossen"
},
"closed_with_reason": {
"description": "Dieses Ticket wurde geschlossen: `%s`\nDieser Kanal wird in 5 Sekunden gelöscht.",
"title": "✅ Ticket geschlossen"
},
"member_added": {
"description": "%s wurde von %s hinzugefügt.",
"title": "Mitglied hinzugefügt"
},
"member_removed": {
"description": "%s wurde von %s entfernt.",
"title": "Benutzer entfernt"
},
"opening_message": {
"content": "%s\n%s hat ein neues Ticket erstellt",
"fields": {
"topic": "Anliegen"
}
},
"questions": "Bitte beantworte die folgenden Fragen:\n\n%s",
"released": {
"description": "%s hat ein neues Ticket veröffentlicht.",
"title": "✅ Ticket veröffentlicht"
},
"survey": {
"complete": {
"description": "Vielen Dank für Dein Feedback!",
"title": "✅ Danke"
},
"start": {
"buttons": {
"ignore": "Nein",
"start": "Umfrage starten"
},
"description": "Hey, %s. Würde es Dir etwas ausmachen, eine kurze %d-Fragenumfrage auszufüllen, bevor dieser Kanal gelöscht wird?",
"title": "❔ Feedback"
}
},
"unclaim": "Freigeben"
},
"updated_permissions": "✅ Slash-Befehlsberechtigungen aktualisiert"
}

View File

@@ -1,610 +0,0 @@
{
"blacklisted": "❌ You are blacklisted",
"bot": {
"missing_permissions": {
"description": "Discord Tickets requires the following permissions:\n%s ",
"title": "⚠️"
},
"version": "[Discord Tickets](%s) v%s by [eartharoid](%s)"
},
"collector_expires_in": "Expires in %d seconds",
"command_execution_error": {
"description": "An unexpected error occurred during command execution.\nPlease ask an administrator to check the console output / logs for details.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Add a member to a ticket",
"name": "add",
"options": {
"member": {
"description": "The member to add to the ticket",
"name": "member"
},
"ticket": {
"description": "The ticket to add the member to",
"name": "ticket"
}
},
"response": {
"added": {
"description": "%s has been added to %s.",
"title": "✅ Member added"
},
"no_member": {
"description": "Please mention the member you want to add.",
"title": "❌ Unknown member"
},
"no_permission": {
"description": "You are not the creator of this ticket and you are not a staff member; you can't add members to this ticket.",
"title": "❌ Insufficient permission"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel, or mention the channel.",
"title": "❌ This isn't a ticket channel"
}
}
},
"blacklist": {
"description": "View or modify the blacklist",
"name": "blacklist",
"options": {
"add": {
"description": "Add a member or role to the blacklist",
"name": "add",
"options": {
"member_or_role": {
"description": "The member or role to add to the blacklist",
"name": "member_or_role"
}
}
},
"remove": {
"description": "Remove a member or role from the blacklist",
"name": "remove",
"options": {
"member_or_role": {
"description": "The member or role to remove from the blacklist",
"name": "member_or_role"
}
}
},
"show": {
"description": "Show the members and roles in the blacklist",
"name": "show"
}
},
"response": {
"empty_list": {
"description": "There are no members or roles blacklisted. Type `/blacklist add` to add a member or role to the blacklist.",
"title": "📃 Blacklisted members and roles"
},
"illegal_action": {
"description": "%s is a staff member and cannot be blacklisted.",
"title": "❌ You can't blacklist this member"
},
"invalid": {
"description": "This member or role can not be removed from the blacklist as they are not blacklisted.",
"title": "❌ Error"
},
"list": {
"fields": {
"members": "Members",
"roles": "Roles"
},
"title": "📃 Blacklisted members and roles"
},
"member_added": {
"description": "<@%s> has been added to the blacklist. They will no longer be able to interact with the bot.",
"title": "✅ Added member to blacklist"
},
"member_removed": {
"description": "<@%s> has been removed from the blacklist. They can now use the bot again.",
"title": "✅ Removed member from blacklist"
},
"role_added": {
"description": "<@&%s> has been added to the blacklist. Members with this role will no longer be able to interact with the bot.",
"title": "✅ Added role to blacklist"
},
"role_removed": {
"description": "<@&%s> has been removed from the blacklist. Members with this role can now use the bot again.",
"title": "✅ Removed role from blacklist"
}
}
},
"close": {
"description": "Close a ticket channel",
"name": "close",
"options": {
"reason": {
"description": "The reason for closing the ticket(s)",
"name": "reason"
},
"ticket": {
"description": "The ticket to close, either the number or the channel ID",
"name": "ticket"
},
"time": {
"description": "Close all tickets that have been inactive for the specified time",
"name": "time"
}
},
"response": {
"canceled": {
"description": "You canceled the operation.",
"title": "🚫 Canceled"
},
"closed": {
"description": "Ticket #%s has been closed.",
"title": "✅ Ticket closed"
},
"closed_multiple": {
"description": [
"%d ticket has been closed.",
"%d tickets have been closed."
],
"title": [
"✅ Ticket closed",
"✅ Tickets closed"
]
},
"confirm": {
"buttons": {
"cancel": "Cancel",
"confirm": "Close"
},
"description": "Please confirm your decision.",
"description_with_archive": "The ticket will be archived for future reference.",
"title": "❔ Are you sure?"
},
"confirm_multiple": {
"buttons": {
"cancel": "Cancel",
"confirm": [
"Close %d ticket",
"Close %d tickets"
]
},
"description": [
"You are about to close %d ticket.",
"You are about to close %d tickets."
],
"title": "❔ Are you sure?"
},
"confirmation_timeout": {
"description": "You took too long to confirm.",
"title": "❌ Interaction time expired"
},
"invalid_time": {
"description": "The time period provided could not be parsed.",
"title": "❌ Invalid input"
},
"no_permission": {
"description": "You are not a staff member or the ticket creator.",
"title": "❌ Insufficient permission"
},
"no_tickets": {
"description": "There are no tickets which have been inactive for this time period.",
"title": "❌ No tickets to close"
},
"not_a_ticket": {
"description": "Please use this command in a ticket channel or use the ticket flag.\nType `/help close` for more information.",
"title": "❌ This isn't a ticket channel"
},
"unresolvable": {
"description": "`%s` could not be resolved to a ticket. Please provide the ticket ID/mention or number.",
"title": "❌ Error"
}
}
},
"help": {
"description": "List the commands you have access to",
"name": "help",
"response": {
"list": {
"description": "The commands you have access to are listed below. To create a ticket, type **`/new`**.",
"fields": {
"commands": "Commands"
},
"title": "❔ Help"
}
}
},
"new": {
"description": "Create a new ticket",
"name": "new",
"options": {
"topic": {
"description": "The topic of the ticket",
"name": "topic"
}
},
"request_topic": {
"description": "Please briefly state what this ticket is about in a few words.",
"title": "⚠️ Ticket topic"
},
"response": {
"created": {
"description": "Your ticket has been created: %s.",
"title": "✅ Ticket created"
},
"error": {
"title": "❌ Error"
},
"has_a_ticket": {
"description": "Please use your existing ticket (<#%s>) or close it before creating another.",
"title": "❌ You already have an open ticket"
},
"max_tickets": {
"description": "Please use `/close` to close any unneeded tickets.\n\n%s",
"title": "❌ You already have %d open tickets"
},
"no_categories": {
"description": "A server administrator must create at least one ticket category before a new ticket can be opened.",
"title": "❌ Can't create ticket"
},
"select_category": {
"description": "Select the category most relevant to your ticket's topic.",
"title": "🔤 Please select the ticket category"
},
"select_category_timeout": {
"description": "You took too long to select the ticket category.",
"title": "❌ Interaction time expired"
}
}
},
"panel": {
"description": "Create a new ticket panel",
"name": "panel",
"options": {
"categories": {
"description": "A comma-separated list of category IDs",
"name": "categories"
},
"description": {
"description": "The description for the panel message",
"name": "description"
},
"image": {
"description": "An image URL for the panel message",
"name": "image"
},
"just_type": {
"description": "Create a \"just type\" panel?",
"name": "just_type"
},
"thumbnail": {
"description": "A thumbnail image URL for the panel message",
"name": "thumbnail"
},
"title": {
"description": "The title for the panel message",
"name": "title"
}
},
"response": {
"invalid_category": {
"description": "One or more of the specified category IDs is invalid.",
"title": "❌ Invalid category"
},
"too_many_categories": {
"description": "The \"just type\" panel can only be used with a single category.",
"title": "❌ Too many categories"
}
}
},
"remove": {
"description": "Remove a member from a ticket",
"name": "remove",
"options": {
"member": {
"description": "The member to remove from the ticket",
"name": "member"
},
"ticket": {
"description": "The ticket to remove the member from",
"name": "ticket"
}
},
"response": {
"no_member": {
"description": "Please mention the member you want to remove.",
"title": "❌ Unknown member"
},
"no_permission": {
"description": "You are not the creator of this ticket and you are not a staff member; you can't remove members from this ticket.",
"title": "❌ Insufficient permission"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel, or mention the channel.",
"title": "❌ This isn't a ticket channel"
},
"removed": {
"description": "%s has been removed from %s.",
"title": "✅ Member removed"
}
}
},
"settings": {
"description": "Configure Discord Tickets",
"name": "settings",
"options": {
"categories": {
"description": "Manage your ticket categories",
"name": "categories",
"options": {
"create": {
"description": "Create a new category",
"name": "create",
"options": {
"name": {
"description": "The name of the category",
"name": "name"
},
"roles": {
"description": "A comma-separated list of staff role IDs for this category",
"name": "roles"
}
}
},
"delete": {
"description": "Delete a category",
"name": "delete",
"options": {
"id": {
"description": "The ID of the category to delete",
"name": "id"
}
}
},
"edit": {
"description": "Make changes to a category's configuration",
"name": "edit",
"options": {
"claiming": {
"description": "Enable ticket claiming?",
"name": "claiming"
},
"id": {
"description": "The ID of the category to edit",
"name": "id"
},
"image": {
"description": "An image URL",
"name": "image"
},
"max_per_member": {
"description": "The maximum number of tickets a member can have in this category",
"name": "max_per_member"
},
"name": {
"description": "The category name",
"name": "name"
},
"name_format": {
"description": "The ticket name format",
"name": "name_format"
},
"opening_message": {
"description": "The text to send when a ticket is opened",
"name": "opening_message"
},
"opening_questions": {
"description": "Questions to ask when a ticket is opened.",
"name": "opening_questions"
},
"ping": {
"description": "A comma-separated list of role IDs to ping",
"name": "ping"
},
"require_topic": {
"description": "Require the user to give the topic of the ticket?",
"name": "require_topic"
},
"roles": {
"description": "A comma-separated list of staff role IDs",
"name": "roles"
},
"survey": {
"description": "The survey to use",
"name": "survey"
}
}
},
"list": {
"description": "List categories",
"name": "list"
}
}
},
"set": {
"description": "Set options",
"name": "set",
"options": {
"close_button": {
"description": "Enable closing with a button?",
"name": "close_button"
},
"colour": {
"description": "The standard colour",
"name": "colour"
},
"error_colour": {
"description": "The error colour",
"name": "error_colour"
},
"footer": {
"description": "The embed footer text",
"name": "footer"
},
"locale": {
"description": "The locale (language)",
"name": "locale"
},
"log_messages": {
"description": "Store messages from tickets?",
"name": "log_messages"
},
"success_colour": {
"description": "The success colour",
"name": "success_colour"
}
}
}
},
"response": {
"category_created": "✅ The `%s` ticket category has been created",
"category_deleted": "✅ The `%s` ticket category has been deleted",
"category_does_not_exist": "❌ No category exists with the provided ID",
"category_list": "Ticket categories",
"category_updated": "✅ The `%s` ticket category has been updated",
"settings_updated": "✅ Settings have been updated"
}
},
"stats": {
"description": "Display ticket statistics",
"fields": {
"messages": "Messages",
"response_time": {
"minutes": "%s minutes",
"title": "Avg. response time"
},
"tickets": "Tickets"
},
"name": "stats",
"response": {
"global": {
"description": "Statistics about tickets across all guilds where this Discord Tickets instance is used.",
"title": "📊 Global stats"
},
"guild": {
"description": "Statistics about tickets within this guild. This data is cached for an hour.",
"title": "📊 This server's stats"
}
}
},
"survey": {
"description": "View survey responses",
"name": "survey",
"options": {
"survey": {
"description": "The name of the survey to view responses of",
"name": "survey"
}
},
"response": {
"list": {
"title": "📃 Surveys"
}
}
},
"tag": {
"description": "Use a tag response",
"name": "tag",
"options": {
"tag": {
"description": "The name of the tag to use",
"name": "tag"
}
},
"response": {
"error": "❌ Error",
"list": {
"title": "📃 Tag list"
},
"missing": "This tag requires the following arguments:\n%s",
"not_a_ticket": {
"description": "This tag can only be used within a ticket channel as it uses ticket references.",
"title": "❌ This isn't a ticket channel"
}
}
},
"topic": {
"description": "Change the topic of the ticket",
"name": "topic",
"options": {
"new_topic": {
"description": "The new topic of the ticket",
"name": "new_topic"
}
},
"response": {
"changed": {
"description": "This ticket's topic has been changed.",
"title": "✅ Topic changed"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel you want to change the topic of.",
"title": "❌ This isn't a ticket channel"
}
}
}
},
"message_will_be_deleted_in": "This message will be deleted in %d seconds",
"missing_permissions": {
"description": "You do not have the permissions required to use this command:\n%s",
"title": "❌ Error"
},
"panel": {
"create_ticket": "Create a ticket"
},
"ticket": {
"claim": "Claim",
"claimed": {
"description": "%s has claimed this ticket.",
"title": "✅ Ticket claimed"
},
"close": "Close",
"closed": {
"description": "This ticket has been closed.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_by_member": {
"description": "This ticket has been closed by %s.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_by_member_with_reason": {
"description": "This ticket has been closed by %s: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_with_reason": {
"description": "This ticket has been closed: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"member_added": {
"description": "%s has been added by %s",
"title": "Member added"
},
"member_removed": {
"description": "%s has been removed by %s",
"title": "Member removed"
},
"opening_message": {
"content": "%s\n%s has created a new ticket",
"fields": {
"topic": "Topic"
}
},
"questions": "Please answer the following questions:\n\n%s",
"released": {
"description": "%s has released this ticket.",
"title": "✅ Ticket released"
},
"survey": {
"complete": {
"description": "Thank you for your feedback.",
"title": "✅ Thank you"
},
"start": {
"buttons": {
"ignore": "No",
"start": "Start survey"
},
"description": "Hey, %s. Before this channel is deleted, would you mind completing a quick %d-question survey?",
"title": "❔ Feedback"
}
},
"unclaim": "Release"
},
"updated_permissions": "✅ Slash command permissions updated"
}

View File

@@ -1,324 +0,0 @@
{
"bot": {
"missing_permissions": {
"description": "Discord Tickets requires the following permissions:\n%s",
"title": "⚠️"
},
"version": "[Discord Tickets](%s) v%s by [eartharoid](%s)"
},
"collector_expires_in": "Expires in %d seconds",
"command_execution_error": {
"description": "An unexpected error occurred during command execution.\nPlease ask an administrator to check the console output / logs for details.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Add a member to a ticket",
"name": "add",
"response": {
"added": {
"description": "%s has been added to %s.",
"title": "✅ Member added"
},
"no_member": {
"description": "Please mention the member you want to add.",
"title": "❌ Unknown member"
},
"no_permission": {
"description": "You are not the creator of this ticket and you are not a staff member; you can't add members to this ticket.",
"title": "❌ Insufficient permission"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel, or mention the channel.",
"title": "❌ This isn't a ticket channel"
}
}
},
"blacklist": {
"description": "Blacklist/unblacklist a member from interacting with the bot",
"name": "blacklist",
"response": {
"empty_list": {
"description": "There are no members or roles blacklisted. Type `%sblacklist <memberOrRole>` to add a member or role to the blacklist.",
"title": "📃 Blacklisted members and roles"
},
"illegal_action": {
"description": "%s is a staff member and cannot be blacklisted.",
"title": "❌ You can't blacklist this member"
},
"list": {
"title": "📃 Blacklisted members and roles"
},
"member_added": {
"description": "<@%s> has been added to the blacklist. They will no longer be able to interact with the bot.",
"title": "✅ Added member to blacklist"
},
"member_removed": {
"description": "<@%s> has been removed from the blacklist. They can now use the bot again.",
"title": "✅ Removed member from blacklist"
},
"role_added": {
"description": "<@&%s> has been added to the blacklist. Members with this role will no longer be able to interact with the bot.",
"title": "✅ Added role to blacklist"
},
"role_removed": {
"description": "<@&%s> has been removed from the blacklist. Members with this role can now use the bot again.",
"title": "✅ Removed role from blacklist"
}
}
},
"close": {
"description": "Close a ticket channel",
"name": "close",
"response": {
"closed": {
"description": "Ticket #%s has been closed.",
"title": "✅ Ticket closed"
},
"closed_multiple": {
"description": [
"%d ticket has been closed.",
"%d tickets have been closed."
],
"title": [
"✅ Ticket closed",
"✅ Tickets closed"
]
},
"confirm": {
"description": "React with ✅ to close this ticket.",
"description_with_archive": "You will be able to view an archived version of it after.\nReact with ✅ to close this ticket.",
"title": "❔ Are you sure?"
},
"confirm_multiple": {
"description": [
"React with ✅ to close %d ticket.",
"React with ✅ to close %d tickets."
],
"title": "❔ Are you sure?"
},
"confirmation_timeout": {
"description": "You took too long to confirm.",
"title": "❌ Reaction time expired"
},
"invalid_time": {
"description": "The time period provided could not be parsed.",
"title": "❌ Invalid input"
},
"no_tickets": {
"description": "There are no tickets which have been inactive for this time period.",
"title": "❌ No tickets to close"
},
"not_a_ticket": {
"description": "Please use this command in a ticket channel or use the ticket flag.\nType `%shelp close` for more information.",
"title": "❌ This isn't a ticket channel"
},
"unresolvable": {
"description": "`%s` could not be resolved to a ticket. Please provide the ticket ID/mention or number.",
"title": "❌ Error"
}
}
},
"help": {
"description": "List commands you have access to, or find out more about a command",
"name": "help",
"response": {
"list": {
"description": "The commands you have access to are listed below. For more information about a command, type `{prefix}help [command]`. To create a ticket, type `{prefix}new [topic]`.",
"fields": {
"commands": "Commands"
},
"title": "❔ Help"
}
}
},
"new": {
"description": "Create a new ticket",
"name": "new",
"request_topic": {
"description": "Please briefly state what this ticket is about in a few words.",
"title": "Ticket topic"
},
"response": {
"created": {
"description": "Your ticket has been created: %s.",
"title": "✅ Ticket created"
},
"error": {
"title": "❌ Error"
},
"has_a_ticket": {
"description": "Please use your existing ticket (<#%s>) or close it before creating another.",
"title": "❌ You already have an open ticket"
},
"max_tickets": {
"description": "Please use `%sclose` to close any unneeded tickets.\n\n%s",
"title": "❌ You already have %d open tickets"
},
"no_categories": {
"description": "A server administrator must create at least one ticket category before a new ticket can be opened.",
"title": "❌ Can't create ticket"
},
"select_category": {
"description": "Select the category most relevant to your ticket's topic:\n\n%s",
"title": "🔤 Please select the ticket category"
},
"select_category_timeout": {
"description": "You took too long to select the ticket category.",
"title": "❌ Reaction time expired"
}
}
},
"panel": {
"description": "Create a new ticket panel",
"name": "panel",
"response": {
"invalid_category": {
"description": "One or more of the specified category IDs is invalid.",
"title": "❌ Invalid category"
}
}
},
"remove": {
"description": "Remove a member from a ticket",
"name": "remove",
"response": {
"no_member": {
"description": "Please mention the member you want to remove.",
"title": "❌ Unknown member"
},
"no_permission": {
"description": "You are not the creator of this ticket and you are not a staff member; you can't remove members from this ticket.",
"title": "❌ Insufficient permission"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel, or mention the channel.",
"title": "❌ This isn't a ticket channel"
},
"removed": {
"description": "%s has been removed from %s.",
"title": "✅ Member removed"
}
}
},
"settings": {
"description": "Configure Discord Tickets",
"name": "settings"
},
"stats": {
"description": "Display ticket statistics",
"fields": {
"messages": "Messages",
"response_time": {
"minutes": "%s minutes",
"title": "Avg. response time"
},
"tickets": "Tickets"
},
"name": "stats",
"response": {
"global": {
"description": "Statistics about tickets across all guilds where this Discord Tickets instance is used.",
"title": "📊 Global stats"
},
"guild": {
"description": "Statistics about tickets within this guild. This data is cached for an hour.",
"title": "📊 This server's stats"
}
}
},
"survey": {
"description": "View survey responses",
"name": "survey",
"response": {
"list": {
"title": "📃 Surveys"
}
}
},
"tag": {
"description": "Use a tag response",
"name": "tag",
"response": {
"error": "❌ Error",
"list": {
"title": "📃 Tag list"
},
"missing": "This tag requires the following arguments:\n%s",
"not_a_ticket": {
"description": "This tag can only be used within a ticket channel as it uses ticket references.",
"title": "❌ This isn't a ticket channel"
}
}
},
"topic": {
"description": "Change the topic of the ticket",
"name": "topic",
"response": {
"changed": {
"description": "This ticket's topic has been changed.",
"title": "✅ Topic changed"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel you want to change the topic of.",
"title": "❌ This isn't a ticket channel"
}
}
}
},
"message_will_be_deleted_in": "This message will be deleted in %d seconds",
"missing_permissions": {
"description": "You do not have the permissions required to use this command:\n%s",
"title": "❌"
},
"ticket": {
"claimed": {
"description": "%s has claimed this ticket.",
"title": "✅ Ticket claimed"
},
"closed": {
"description": "This ticket has been closed.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_by_member": {
"description": "This ticket has been closed by %s.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_by_member_with_reason": {
"description": "This ticket has been closed by %s: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_with_reason": {
"description": "This ticket has been closed: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"member_added": {
"description": "%s has been added by %s",
"title": "Member added"
},
"member_removed": {
"description": "%s has been removed by %s",
"title": "Member removed"
},
"opening_message": {
"fields": {
"topic": "Topic"
}
},
"questions": "Please answer the following questions:\n\n%s",
"released": {
"description": "%s has released this ticket.",
"title": "✅ Ticket released"
},
"survey": {
"complete": {
"description": "Thank you for your feedback.",
"title": "✅ Thank you"
},
"start": {
"description": "Hey, %s. Before this channel is deleted, would you mind completing a quick %d-question survey? React with ✅ to start, or ignore this message.",
"title": "❔ Feedback"
}
}
}
}

View File

@@ -1,612 +0,0 @@
{
"blacklisted": "❌ Estás vetado del sistema",
"bot": {
"missing_permissions": {
"description": "Discord Tickets requiere los siguientes permisos:\n%s",
"title": "⚠️"
},
"version": "[Discord Tickets](%s) v%s creado por [eartharoid](%s)"
},
"collector_expires_in": "Expira en %d segundos",
"command_execution_error": {
"description": "Un error inesperado ha ocurrido durante la ejecución del comando.\nPor favor, pregúntale a un administrador para revisar la consola o los registros y obtener más información.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Añadir a un usuario al ticket",
"name": "add",
"options": {
"member": {
"description": "El usuario que deseas agregar al ticket",
"name": "member"
},
"ticket": {
"description": "El ticket al cual deseas agregar el usuario",
"name": "ticket"
}
},
"response": {
"added": {
"description": "%s ha sido añadido a %s.",
"title": "✅ Miembro añadido"
},
"no_member": {
"description": "Por favor, menciona al usuario que deseas añadir.",
"title": "❌ Usuario desconocido"
},
"no_permission": {
"description": "No eres el creador de este ticket y no eres parte del staff, no puedes añadir usuarios a este ticket.",
"title": "❌ Permisos insuficientes"
},
"not_a_ticket": {
"description": "Por favor utiliza este comando en el canal de tickets, o menciona el canal.",
"title": "❌ Este no es un canal de tickets"
}
}
},
"blacklist": {
"description": "Ver o modificar la lista negra",
"name": "blacklist",
"options": {
"add": {
"description": "Añadir un miembro o rol a la lista negra",
"name": "add",
"options": {
"member_or_role": {
"description": "El miembro o rol a añadir a la lista negra",
"name": "member_or_role"
}
}
},
"remove": {
"description": "Quitar un miembro o rol de la lista negra",
"name": "remove",
"options": {
"member_or_role": {
"description": "El miembro o rol a quitar de la lista negra",
"name": "member_or_role"
}
}
},
"show": {
"description": "Muestra los miembros y roles que están en la lista negra",
"name": "show"
}
},
"response": {
"empty_list": {
"description": "No hay miembros ni roles en la lista negra. Escribe `/blacklist <memberOrRole> add` para añadir a un usuario o rol a la misma.",
"title": "📃 Usuarios y roles en la lista negra"
},
"illegal_action": {
"description": "%s es un miembro del personal, por lo tanto no puede ser añadido a la lista negra.",
"title": "❌ No puedes añadir a la lista negra a este usuario"
},
"invalid": {
"description": "Este miembro o rol no puede ser quitado de la lista negra porque no está dentro de ella.",
"title": "❌ Error"
},
"list": {
"fields": {
"members": "Miembros",
"roles": "Roles"
},
"title": "📃 Usuarios y roles en la lista negra"
},
"member_added": {
"description": "<@%s> fue añadido a la lista negra. Ya no podrá interactuar con el bot, a menos de que sea removido de la lista.",
"title": "✅ Usuario añadido a la lista negra"
},
"member_removed": {
"description": "<@%s> fue eliminado de la lista negra. Ahora puede usar el bot.",
"title": "✅ Usuario eliminado de la lista negra"
},
"role_added": {
"description": "<@&%s> fue añadido a la lista negra. Los usuarios que tengan este rol no podrán interactuar con el bot hasta ser removidos de la lista.",
"title": "✅ Rol añadido a la lista negra"
},
"role_removed": {
"description": "<@&%s> fue eliminado de la lista negra. Los usuarios que tengan este rol podrán volver a hacer uso del bot.",
"title": "✅ Rol eliminado de la lista negra"
}
}
},
"close": {
"description": "Cerrar un canal de ayuda",
"name": "close",
"options": {
"reason": {
"description": "El motivo por cerrar el/los ticket(s)",
"name": "reason"
},
"ticket": {
"description": "El ticket a cerrar, sea el numero o la ID del canal",
"name": "ticket"
},
"time": {
"description": "Cerrar todos los tickets que han estado inactivos durante un tiempo determinado",
"name": "time"
}
},
"response": {
"canceled": {
"description": "Has cancelado la operación.",
"title": "🚫 Cancelado"
},
"closed": {
"description": "El ticket #%s fue cerrado.",
"title": "✅ Ticket resuelto"
},
"closed_multiple": {
"description": [
"El ticket %d fue resuelto.",
"Se han cerrado %d tickets."
],
"title": [
"✅ Ticket resuelto",
"✅ Tickets cerrados"
]
},
"confirm": {
"buttons": {
"cancel": "Cancelar",
"confirm": "Cerrar"
},
"description": "Por favor, confirm tu selección.",
"description_with_archive": "El ticket será archivado para referencia en el futuro.",
"title": "❔ ¿Estás seguro?"
},
"confirm_multiple": {
"buttons": {
"cancel": "Cancelar",
"confirm": [
"Cerrar %d ticket",
"Cerrar %d tickets"
]
},
"description": [
"Reacciona con ✅ para cerrar el ticket %d.",
"Estás a punto de cerrar %d tickets."
],
"title": "❔ ¿Estás seguro?"
},
"confirmation_timeout": {
"description": "Has tardado demasiado en confirmar.",
"title": "❌ El tiempo de reacción ha expirado"
},
"invalid_time": {
"description": "El período de tiempo ingresado no pudo ser analizado.",
"title": "❌ Entrada inválida"
},
"no_permission": {
"description": "No eres un miembro del staff ni el creador del ticket..",
"title": "❌ Permisos insuficientes"
},
"no_tickets": {
"description": "No hay tickets que hayan estado inactivos durante este período de tiempo.",
"title": "❌ No hay tickets para cerrar"
},
"not_a_ticket": {
"description": "Por favor, utiliza este comando en un canal de tickets, o usa la bandera de tickets.\nEjecuta `%shelp close` para más información.",
"title": "❌ Este no es un canal de tickets"
},
"unresolvable": {
"description": "`%s` no pudo ser resuelto como un ticket. Por favor, especifica el ID o número del ticket.",
"title": "❌ Error"
}
}
},
"help": {
"description": "Listar comandos a los que tienes acceso",
"name": "help",
"options": {},
"response": {
"list": {
"description": "Los comandos a los que tienes acceso están listados debajo. Para más información sobre un comando, ejecuta `{prefix}help [command]`. para crear un ticket, ejecuta `{prefix}new [topic]`.",
"fields": {
"commands": "Comandos"
},
"title": "❔ Ayuda"
}
}
},
"new": {
"description": "Crear un nuevo ticket",
"name": "new",
"options": {
"topic": {
"description": "Categoria del ticket",
"name": "topic"
}
},
"request_topic": {
"description": "Por favor, indica de qué se trata este ticket en pocas palabras.",
"title": "Tema del ticket"
},
"response": {
"created": {
"description": "Tu ticket fue creado: %s.",
"title": "✅ Ticket creado"
},
"error": {
"title": "❌ Error"
},
"has_a_ticket": {
"description": "Por favor, utiliza tu ticket existente (<#%s>) o ciérralo antes de crear otro.",
"title": "❌ Ya tienes un ticket abierto"
},
"max_tickets": {
"description": "Por favor, utiliza el comando `%sclose` ´para cerrar tickets inatendidos.\n\n%s",
"title": "❌ Ya tienes %d tickets abiertos"
},
"no_categories": {
"description": "Un administrador del servidor debe crear al menos una categoría de tickets antes de que un nuevo ticket pueda ser abierto.",
"title": "❌ No se puede crear el ticket"
},
"select_category": {
"description": "Selecciona la categoría más relevante para el tema de tu ticket:\n\n%s",
"title": "🔤 Por favor, selecciona la categoría de tu ticket"
},
"select_category_timeout": {
"description": "Has tardado demasiado tiempo en seleccionar la categoría de tickets.",
"title": "❌ El tiempo de la reacción ha expirado"
}
}
},
"panel": {
"description": "Crear un nuevo panel de tickets",
"name": "panel",
"options": {
"categories": {
"description": "Una lista separada por comas de IDs de las categorías",
"name": "categories"
},
"description": {
"description": "La descripción para el mensaje del panel",
"name": "description"
},
"image": {
"description": "Una URL de imagen para el mensaje del panel",
"name": "image"
},
"just_type": {
"description": "Crear un \"tipo\" de panel?",
"name": "just_type"
},
"title": {
"description": "Titulo del mensaje del panel",
"name": "title"
},
"thumbnail": {
"description": "Url de una imagen en miniatura para el mensaje del panel",
"name": "thumbnail"
}
},
"response": {
"invalid_category": {
"description": "Una o más de las ID de categoría ingresadas no son válidas.",
"title": "❌ Categoría inválida"
},
"too_many_categories": {
"description": "El \"tipo\" solo se puede utilizar para un tipo de categoria.",
"title": "❌ Demasiadas Categorias"
}
}
},
"remove": {
"description": "Eliminar a un miembro de un ticket",
"name": "remove",
"options": {
"member": {
"description": "Miembro a eliminar del ticket",
"name": "member"
},
"ticket": {
"description": "Miembro a eliminar del ticket",
"name": "ticket"
}
},
"response": {
"no_member": {
"description": "Por favor, menciona al miembro que deseas eliminar.",
"title": "❌ Miembro desconocido"
},
"no_permission": {
"description": "Tú no eres el creador de este ticket ni un miembro del personal, por lo que no puedes eliminar miembros de este ticket.",
"title": "❌ Permisos insuficientes"
},
"not_a_ticket": {
"description": "Por favor utiliza este comando en el canal de tickets, o menciona el canal.",
"title": "❌ Este no es un canal de tickets"
},
"removed": {
"description": "%s fue eliminado de %s.",
"title": "✅ Miembro eliminado"
}
}
},
"settings": {
"description": "Configurar Discord Tickets",
"name": "settings",
"options": {
"categories": {
"description": "Gestiona tus categoría",
"name": "categories",
"options": {
"create": {
"description": "Crear una nueva categoria",
"name": "create",
"options": {
"name": {
"description": "Nombre de la categoria",
"name": "name"
},
"roles": {
"description": "Una lista separada por comas de los ID de funciones del staff para esta categoría",
"name": "roles"
}
}
},
"delete": {
"description": "Borrar Categoria",
"name": "delete",
"options": {
"id": {
"description": "ID de la categoria a borrar",
"name": "id"
}
}
},
"edit": {
"description": "Realizar cambios en la configuración de una categoría",
"name": "edit",
"options": {
"claiming": {
"description": "Habilitar reclamar un ticket?",
"name": "claiming"
},
"id": {
"description": "ID de categoria a editar",
"name": "id"
},
"image": {
"description": "URL de una imagen",
"name": "image"
},
"max_per_member": {
"description": "El número máximo de tickets que un miembro puede tener en esta categoría",
"name": "max_per_member"
},
"name": {
"description": "Nombre de la categoria",
"name": "name"
},
"name_format": {
"description": "Formato del ticket",
"name": "name_format"
},
"opening_message": {
"description": "Texto a enviar tras abrir el ticket",
"name": "opening_message"
},
"opening_questions": {
"description": "Preguntas que realizar tras abrir un ticket.",
"name": "opening_questions"
},
"ping": {
"description": "Una lista separada por comas de ID de roles para hacer ping",
"name": "ping"
},
"require_topic": {
"description": "¿Requerir al usuario dar el tema del ticket?",
"name": "require_topic"
},
"roles": {
"description": "Una lista separada por comas de ID de funciones del personal",
"name": "roles"
},
"survey": {
"description": "La encuesta a utilizar",
"name": "survey"
}
}
},
"list": {
"description": "Lista de categorias",
"name": "list"
}
}
},
"set": {
"description": "Setear Opciones",
"name": "set",
"options": {
"close_button": {
"description": "Habilitar el cierre del ticket con un botón?",
"name": "close_button"
},
"colour": {
"description": "Color estandar",
"name": "colour"
},
"error_colour": {
"description": "Color de error",
"name": "error_colour"
},
"footer": {
"description": "El texto del pie de página incrustado",
"name": "footer"
},
"locale": {
"description": "Idioma",
"name": "locale"
},
"log_messages": {
"description": "¿Almacenar mensajes de tickets?",
"name": "log_messages"
},
"success_colour": {
"description": "El color de acierto",
"name": "success_colour"
}
}
}
},
"response": {
"category_created": "✅ La `%s` categoria del sistema de ticket fue creada",
"category_deleted": "✅ La `%s` categoria del sistema de ticket fue borrada",
"category_does_not_exist": "❌ No existe la categoria con esa id",
"category_updated": "✅ La `%s` categoria del sistema de ticket fue actualizada",
"category_list": "Categoria de tickets",
"settings_updated": "✅ Los cambios fueron guardados"
}
},
"stats": {
"description": "Mostrar estadísticas del ticket",
"fields": {
"messages": "Mensajes",
"response_time": {
"minutes": "%s minutos",
"title": "Tiempo de respuesta promedio"
},
"tickets": "Tickets"
},
"name": "stats",
"options": {},
"response": {
"global": {
"description": "Estadísticas sobre los tickets en todos los servidores donde se utiliza esta instancia de Discord Tickets.",
"title": "📊 Estadísticas globales"
},
"guild": {
"description": "Estadísticas sobre los tickets de este servidor. Estos datos son almacenados en la caché durante una hora.",
"title": "📊 Estadísticas de este servidor"
}
}
},
"survey": {
"description": "Ver respuestas de la encuesta",
"name": "survey",
"options": {
"survey": {
"description": "El nombre de la encuesta para ver las respuestas de",
"name": "survey"
}
},
"response": {
"list": {
"title": "📃 Encuestas"
}
}
},
"tag": {
"description": "Usar una respuesta de etiqueta",
"name": "tag",
"options": {
"tag": {
"description": "El nombre de la etiqueta a usar",
"name": "tag"
}
},
"response": {
"error": "❌ Error",
"list": {
"title": "📃 Lista de etiquetas"
},
"missing": "Esta etiqueta requiere los siguientes argumentos:\n%s",
"not_a_ticket": {
"description": "Esta etiqueta solo puede utilizarse dentro de un canal de tickets, ya que utiliza referencias de éste.",
"title": "❌ Este no es un canal de tickets"
}
}
},
"topic": {
"description": "Cambiar el tema del ticket",
"name": "topic",
"options": {
"new_topic": {
"description": "Nuevo tema de los tickets",
"name": "new_topic"
}
},
"response": {
"changed": {
"description": "El tema de este ticket ha sido cambiado.",
"title": "✅ Tema cambiado"
},
"not_a_ticket": {
"description": "Por favor, utiliza este comando en el canal de ticket en el que deseas cambiar el tema.",
"title": "❌ Este no es un canal de tickets"
}
}
}
},
"message_will_be_deleted_in": "Este mensaje será eliminado en %d segundos",
"missing_permissions": {
"description": "No tienes los permisos requeridos para ejecutar este comando:\n%s",
"title": "❌"
},
"panel": {
"create_ticket": "Crear un ticket"
},
"ticket": {
"claim": "Reclamar",
"claimed": {
"description": "%s ha reclamado el ticket.",
"title": "✅ Ticket reclamado"
},
"close": "Cerrar",
"closed": {
"description": "Este ticket fue cerrado.\nEl canal será eliminado en 5 segundos.",
"title": "✅ Ticket cerrado"
},
"closed_by_member": {
"description": "Este ticket ha sido cerrado por %s.\nEl canal será eliminado en 5 segundos.",
"title": "✅ Ticket cerrado"
},
"closed_by_member_with_reason": {
"description": "Este ticket ha sido cerrado por %s: `%s`\nEl canal será eliminado en 5 segundos.",
"title": "✅ Ticket cerrado"
},
"closed_with_reason": {
"description": "Este ticket ha sido cerrado: `%s`\nEl canal será eliminado en 5 segundos.",
"title": "✅ Ticket cerrado"
},
"member_added": {
"description": "%s fue añadido por %s",
"title": "Miembro añadido"
},
"member_removed": {
"description": "%s fue eliminado por %s",
"title": "Miembro removido"
},
"opening_message": {
"content": "%s\n%s ha creado un nuevo ticket",
"fields": {
"topic": "Tema"
}
},
"questions": "Por favor, responde las siguientes preguntas:\n\n%s",
"released": {
"description": "%s ha lanzado este ticket.",
"title": "✅ Ticket lanzado"
},
"survey": {
"complete": {
"description": "Gracias por tus comentarios.",
"title": "✅ Gracias"
},
"start": {
"buttons": {
"start": "Empezar encuesta",
"ignore": "No"
},
"description": "Hey, %s. Antes de que se elimine este canal, ¿te importaría completar una encuesta rápida de %d preguntas?",
"title": "❔ Feedback"
}
},
"unclaim": "Release"
},
"updated_permissions": "✅ Se han actualizado los permisos"
}

View File

@@ -1,566 +0,0 @@
{
"blacklisted": "❌ Vous êtes sur liste noire",
"bot": {
"missing_permissions": {
"description": "Discord Tickets nécessite les autorisations suivantes :\n%s",
"title": "⚠️"
},
"version": "[Discord Tickets](%s) v%s par [eartharoid](%s)"
},
"collector_expires_in": "Expire dans %d secondes",
"command_execution_error": {
"description": "Une erreur inattendue sest produite lors de lexécution de commande.\nVeuillez demander à un administrateur de vérifier la console / les journaux pour plus de détails.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Ajouter un membre à un billet",
"name": "ajouter",
"options": {
"member": {
"description": "Le membre à ajouter au billet",
"name": "membre"
},
"ticket": {
"description": "Le billet auquel ajouter le membre",
"name": "billet"
}
},
"response": {
"added": {
"description": "%s a été ajouté à %s.",
"title": "✅ Membre ajouté"
},
"no_member": {
"description": "Veuillez mentionner le membre que vous souhaitez ajouter.",
"title": "❌ Membre inconnu"
},
"no_permission": {
"description": "Vous nêtes pas le créateur de ce billet et vous nêtes pas un membre du personnel; vous ne pouvez pas ajouter de membre à ce billet .",
"title": "❌ Permissions insuffisantes"
},
"not_a_ticket": {
"description": "Veuillez utiliser cette commande dans le canal des billets, ou mentionner le salon.",
"title": "❌ Ce nest pas un salon de billet"
}
}
},
"blacklist": {
"description": "Voir ou modifier la liste noire",
"name": "liste noire",
"options": {
"add": {
"description": "Ajouter un membre ou un rôle à la liste noire",
"name": "ajouter",
"options": {
"member_or_role": {
"description": "Le membre ou rôle à ajouter à la liste noire",
"name": "membre_ou_rôle"
}
}
},
"remove": {
"description": "Retirer un membre ou un rôle de la liste noire",
"name": "retirer",
"options": {
"member_or_role": {
"description": "Le membre ou le rôle à retirer de la liste noire",
"name": "membre_ou_rôle"
}
}
},
"show": {
"description": "Voir les membres et rôles dans la liste noire",
"name": "voir"
}
},
"response": {
"empty_list": {
"description": "Il n'y a aucun membre ou rôle dans la liste noir. Tapez `/blacklist add` pour ajouter un membre ou un rôle à la liste noire.",
"title": "📃 Membres et rôles sur la liste noire"
},
"illegal_action": {
"description": "%s est un membre du personnel et ne peut pas être mis sur la liste noire.",
"title": "❌ Vous ne pouvez pas ajouter ce membre à la liste noire"
},
"invalid": {
"description": "Ce membre ou rôle ne peut pas être retiré de la liste noire car il n'y est pas présent.",
"title": "❌ Erreur"
},
"list": {
"fields": {
"members": "Membres",
"roles": "Rôles"
},
"title": "📃 Membres et rôles sur la liste noire"
},
"member_added": {
"description": "<@%s> a été ajouté à la liste noire. Ils ne seront plus en mesure dinteragir avec le bot.",
"title": "✅ Membre ajouté à la liste noire"
},
"member_removed": {
"description": "<@%s> a été retiré de la liste noire. Ils peuvent désormais utiliser à nouveau le bot.",
"title": "✅ Membre retiré de la liste noire"
},
"role_added": {
"description": "<@&%s> a été ajouté à la liste noire. Les membres avec ce rôle ne seront plus en mesure dinteragir avec le bot.",
"title": "✅ Rôle ajouté à la liste noire"
},
"role_removed": {
"description": "<@&%s> a été retiré de la liste noire. Les membres avec ce rôle peuvent maintenant utiliser le bot à nouveau.",
"title": "✅ membre ajouté à la liste noire"
}
}
},
"close": {
"description": "Fermer un canal de billets",
"name": "fermer",
"options": {
"reason": {
"description": "La raison de fermer les tickets",
"name": "raison"
},
"ticket": {
"description": "Le ticket à fermer, soit le numéro ou l'ID du salon",
"name": "ticket"
},
"time": {
"description": "Fermer tous les tickets qui ont été inactifs dans un temps impartis",
"name": "temps"
}
},
"response": {
"canceled": {
"description": "Vous avez annulé l'opération.",
"title": "🚫 Annulé"
},
"closed": {
"description": "Le billet #%s a été fermé.",
"title": "✅ billet fermé"
},
"closed_multiple": {
"description": [
"le billet #%s a été fermé.",
"le billet #%s a été fermé."
],
"title": [
"✅ billet fermé",
"✅ billet fermé"
]
},
"confirm": {
"buttons": {
"cancel": "Annuler",
"confirm": "Fermer"
},
"description": "Veuillez confirmer votre décision.",
"description_with_archive": "Le billet sera archivé pour référence future.",
"title": "❔ En êtes-vous sûr ?"
},
"confirm_multiple": {
"buttons": {
"cancel": "Annuler",
"confirm": [
"Fermer %d ticket",
"Fermer %d tickets"
]
},
"description": [
"Vous êtes sur le point de fermer le billet %d.",
"Vous allez supprimer %d tickets, réagissez avec ✅ pour confirmer."
],
"title": "❔ En êtes-vous sûr ?"
},
"confirmation_timeout": {
"description": "Tu as mis trop de temps à confirmer.",
"title": "❌ Le temps de réaction a expiré"
},
"invalid_time": {
"description": "La période prévue na pas pu être analysée.",
"title": "❌ entrée invalide"
},
"no_permission": {
"description": "Vous n'êtes pas un membre du staff ou le créateur du ticket.",
"title": "❌ Permissions insuffisantes"
},
"no_tickets": {
"description": "Il ny a pas de billets inactifs pour cette période.",
"title": "❌ pas de billets à fermer"
},
"not_a_ticket": {
"description": "Veuillez utiliser cette commande dans un salon de ticket ou utilisez le drapeau ticket.\nTapez «/help close» pour plus dinformations.",
"title": "❌ Ce nest pas une chaîne de billets"
},
"unresolvable": {
"description": "'%s' ne pouvait pas être résolu à un billet. Veuillez fournir liD/mention ou le numéro du billet.",
"title": "❌ erreur"
}
}
},
"help": {
"description": "Listez les commandes dont vous avez accès",
"name": "aide",
"response": {
"list": {
"description": "Les commandes dont vous avez accès sont listées ci-dessous. Pour créer un ticket, tapez **`/new`**",
"fields": {
"commands": "Commandes"
},
"title": "❔ Aide"
}
}
},
"new": {
"description": "Créer un nouveau billet",
"name": "nouveau",
"options": {
"topic": {
"description": "La sujet du ticket",
"name": "sujet"
}
},
"request_topic": {
"description": "Veuillez indiquer brièvement l'objet de ce billet en quelques mots.",
"title": "⚠️ Sujet du ticket"
},
"response": {
"created": {
"description": "Votre billet a été créé : %s.",
"title": "✅ Billet créé"
},
"error": {
"title": "❌ erreur"
},
"has_a_ticket": {
"description": "Sil vous plaît utiliser votre billet <# existant (%s>) ou le fermer avant de créer un autre.",
"title": "❌ Vous avez déjà un billet ouvert"
},
"max_tickets": {
"description": "Utilisez **`/close`** pour fermer tous les tickets inutiles.\n\n%s",
"title": "❌ Vous avez déjà un billet ouvert"
},
"no_categories": {
"description": "Un administrateur serveur doit créer au moins une catégorie de billets avant quun nouveau billet puisse être ouvert.",
"title": "❌ Impossible de créer un ticket"
},
"select_category": {
"description": "Sélectionnez la catégorie la plus pertinente pour le sujet de votre billet.",
"title": "🔤 Veuillez sélectionner la catégorie de billets"
},
"select_category_timeout": {
"description": "Vous avez mis trop de temps à sélectionner la catégorie de billets.",
"title": "❌Le temps de réaction a expiré"
}
}
},
"panel": {
"description": "Créer un nouveau panneau de billet",
"name": "panneau",
"options": {
"categories": {
"description": "La liste d'ID de catégorie séparé par des virgules",
"name": "catégories"
},
"description": {
"description": "La description du message du panneau d'affichage",
"name": "description"
},
"image": {
"description": "L'URL d'une image pour le panneau d'affichage",
"name": "image"
},
"just_type": {
"description": "Créer un panneau d'affichage \"juste écrire\"?",
"name": "juste_ecrire"
},
"thumbnail": {
"description": "Une URL d'image de bannière pour le panneau d'affichage",
"name": "bannière"
},
"title": {
"description": "Le titre du panneau d'affichage",
"name": "titre"
}
},
"response": {
"invalid_category": {
"description": "Un ou plusieurs des ID de catégorie spécifiés sont invalides.",
"title": "❌ Catégorie invalide"
},
"too_many_categories": {
"description": "Le panneau d'affichage \"juste écrire\" ne peut être utilisé que dans une seule catégorie.",
"title": "❌ Trop de catégories"
}
}
},
"remove": {
"description": "Retirer un membre dun billet",
"name": "supprimer",
"options": {
"member": {
"description": "Le membre à retirer du ticket",
"name": "membre"
},
"ticket": {
"description": "Le ticket où retirer le membre",
"name": "ticket"
}
},
"response": {
"no_member": {
"description": "Veuillez mentionner le membre que vous souhaitez ajouter.",
"title": "❌ membre inconnu"
},
"no_permission": {
"description": "Vous nêtes pas le créateur de ce billet et vous nêtes pas un membre du personnel; vous ne pouvez pas ajouter de membres à ce billet.",
"title": "❌ autorisation insuffisante"
},
"not_a_ticket": {
"description": "Sil vous plaît utiliser cette commande dans le canal de billet, ou mentionner le canal.",
"title": "❌ Ce nest pas une chaîne de billets"
},
"removed": {
"description": "%s a été ajouté à %s.",
"title": "✅ Membre retiré"
}
}
},
"settings": {
"description": "Configurer Discord Tickets",
"name": "paramètres",
"options": {
"categories": {
"description": "Gérer les catégories des tickets",
"name": "catégories",
"options": {
"create": {
"description": "Créez une nouvelle catégorie",
"name": "créer",
"options": {
"name": {
"description": "Le nom de la catégorie",
"name": "nom"
},
"roles": {
"name": "rôles"
}
}
},
"delete": {
"description": "Supprimez une catégorie",
"name": "supprimer",
"options": {
"id": {
"description": "L'ID de la catégorie a supprimer",
"name": "id"
}
}
},
"edit": {
"description": "Faire des changement sur la configuration d'une catégorie",
"name": "éditer",
"options": {
"claiming": {
"description": "Activer la réception d'un ticket ?",
"name": "réception"
},
"id": {
"description": "L'ID de la catégorie à éditer",
"name": "id"
},
"image": {
"description": "L'URL d'une image",
"name": "image"
},
"max_per_member": {
"description": "Le maximum de tickets qu'un membre peut avoir dans cette catégorie",
"name": "max_par_membre"
},
"name": {
"description": "Le nom de la catégorie",
"name": "nom"
},
"name_format": {
"description": "Le format du nom des tickets",
"name": "format_nom"
},
"opening_message": {
"description": "Le texte à envoyer quand un ticket est ouvert",
"name": "ouverture_message"
},
"opening_questions": {
"description": "Questions à demander quand un ticket est ouvert.",
"name": "questions_ouverture"
},
"ping": {
"name": "ping"
},
"require_topic": {
"description": "Obliger le membre à donner le sujet du ticket ?",
"name": "requiert_sujet"
},
"roles": {
"name": "rôles"
}
}
},
"list": {
"description": "Lister les catégories",
"name": "lister"
}
}
},
"set": {
"description": "Définir les options",
"name": "définir",
"options": {
"close_button": {
"description": "Activer la fermeture avec un bouton ?",
"name": "fermer_bouton"
},
"colour": {
"description": "La couleur de base",
"name": "couleur"
},
"error_colour": {
"description": "La couleur des eurreurs",
"name": "couleur_erreur"
},
"footer": {
"description": "Le texte de fin de l'embed",
"name": "texte de fin"
},
"log_messages": {
"description": "Stocker les messages des tickets ?",
"name": "stocker_messages"
},
"success_colour": {
"description": "La couleur pour la réussite",
"name": "couleur_réussite"
}
}
}
},
"response": {
"category_created": "✅ La catégorie de tickets `%s` à été créée",
"category_deleted": "✅ La catégorie de tickets `%s` à bien été supprimée",
"category_does_not_exist": "❌ La catégorie avec cet ID n'existe pas"
}
},
"stats": {
"description": "Afficher les statistiques des billets",
"fields": {
"messages": "Messages",
"response_time": {
"minutes": "%s minutes",
"title": "Temps de réponse moyen"
},
"tickets": "Billet"
},
"name": "statistiques",
"response": {
"global": {
"description": "Statistiques sur les billets dans toutes les guildes où cette instance Discord Tickets est utilisée.",
"title": "📊 statistiques mondiales"
},
"guild": {
"description": "Statistiques sur les billets au sein de cette guilde. Ces données sont mises en cache pendant une heure.",
"title": "📊 statistiques de ce serveur"
}
}
},
"survey": {
"description": "Voir les réponses au sondage",
"name": "enquêtes",
"response": {
"list": {
"title": "📃 enquêtes"
}
}
},
"tag": {
"description": "Utiliser une réponse détiquette",
"name": "étiquettes",
"response": {
"error": "❌ erreur",
"list": {
"title": "📃 Liste d'étiquettes"
},
"missing": "Cette balise nécessite les arguments suivants :\n%s",
"not_a_ticket": {
"description": "Cette balise ne peut être utilisée que dans un canal de billets car elle utilise des références de billets.",
"title": "❌ Ce nest pas un canal de billet"
}
}
},
"topic": {
"description": "Le sujet du billet",
"name": "sujet",
"response": {
"changed": {
"description": "Le sujet de ce billet a été changé.",
"title": "✅ sujet changé"
},
"not_a_ticket": {
"description": "Sil vous plaît utiliser cette commande dans le canal de billet, ou mentionner le canal.",
"title": "❌ Ce nest pas un canal de billet"
}
}
}
},
"message_will_be_deleted_in": "Ce message sera supprimé dans %d secondes",
"missing_permissions": {
"description": "Vous navez pas les autorisations requises pour utiliser cette commande :\n%s",
"title": "❌"
},
"ticket": {
"claimed": {
"description": "%s a réclamé ce billet.",
"title": "✅ billet fermé"
},
"closed": {
"description": "Ce billet a été fermé.\nLe canal sera supprimé en 5 secondes.",
"title": "✅ billet fermé"
},
"closed_by_member": {
"description": "Ce billet a été fermé.\nLe canal sera supprimé en 5 secondes.",
"title": "✅ billet fermé"
},
"closed_by_member_with_reason": {
"description": "Ce billet a été fermé.\nLe canal sera supprimé en 5 secondes.",
"title": "✅ billet fermé"
},
"closed_with_reason": {
"description": "Ce billet a été fermé.\nLe canal sera supprimé en 5 secondes.",
"title": "✅ billet fermé"
},
"member_added": {
"description": "%s a été ajouté à %s",
"title": "Membre ajouté"
},
"member_removed": {
"description": "%s a été ajouté à %s",
"title": "Membre retiré"
},
"opening_message": {
"fields": {
"topic": "Sujet"
}
},
"questions": "Sil vous plaît répondre aux questions suivantes:\n\n%s",
"released": {
"description": "%s a abandonné ce billet.",
"title": "✅ billet abandonné"
},
"survey": {
"complete": {
"description": "Merci pour vos commentaires.",
"title": "✅ Merci"
},
"start": {
"description": "Hé, %s. Avant que ce canal soit supprimé, pourriez-vous répondre à %d question(s)?",
"title": "❔ commentaires"
}
}
}
}

View File

@@ -1,141 +0,0 @@
{
"blacklisted": "❌ אתה חסום",
"bot": {
"missing_permissions": {
"description": "דיסקורד-טיקטס דורש ממך להיות בעל ההרשאות הבאות:\n%s ",
"title": "⚠️"
},
"version": "[Discord Tickets](%s) v%s ע\"י [eartharoid](%s)"
},
"collector_expires_in": "פג תוקף בעוד %d שניות",
"command_execution_error": {
"description": "שגיאה לא צפויה התחוללה!\nאנא צרו קשר עם האדמין על מנת שיבדוק את הקונסול לעוד פרטים.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "הוסף משתמש לטיקט",
"name": "הוסף",
"options": {
"member": {
"description": "המשתמש הוסף לטיקט",
"name": "משתמש"
},
"ticket": {
"description": "הטיקט שתרצו לצרף אליו משתמש",
"name": "טיקט"
}
},
"response": {
"added": {
"description": "%s צורף ל %s.",
"title": "✅ משתמש צורף"
},
"no_member": {
"description": "אנא תייג את המשתמש שתרצה להוסיף.",
"title": "❌ משתמש לא ידוע"
},
"no_permission": {
"description": "אינך יוצר הטיקט ולא בעל הרשאות אדמין, לכן אינך מורשה להוסיף משתמשים נוספים לטיקט.",
"title": "❌הרשאות לא מספיקות"
},
"not_a_ticket": {
"description": "אנא השתמש בפקודה זו בערוץ הטיקטים, או ציין את הערוץ.",
"title": "❌ זה איננו ערוץ טיקטים"
}
}
},
"blacklist": {
"description": "צפה או ערוץ את רשימת החסומים",
"name": "רשימת החסומים",
"options": {
"add": {
"description": "הוסף משתמש או רול לרשימת החסומים",
"name": "הוסף",
"options": {
"member_or_role": {
"description": "המשתמש או הרול להוסיף לרשימת החסומים",
"name": "משתמש_אוול"
}
}
},
"remove": {
"description": "הסר משתמש או רול מרשימת החסומים",
"name": "הסר",
"options": {
"member_or_role": {
"description": "המשתמש או הרול להסיר מרשימת החסומים",
"name": "משתמש_אוול"
}
}
},
"show": {
"description": "הצג את המשתמשים והרולים ברשימת החסומים",
"name": "הצג"
}
},
"response": {
"empty_list": {
"description": "אין משתמשים או רולים ברשימת החסומים, כתוב `/blacklist add` על מנת להוסיף משתמשים או רולים לרשימה.",
"title": "📃רשימת חסומים של משתמשים ורולים"
},
"illegal_action": {
"description": "%s הינו חבר צוות ואינו יכול להיחסם.",
"title": "❌לא ניתן לחסום משתמש זה"
},
"invalid": {
"description": "לא ניתן להסיר את המשתמש או הרול הללו מן הרשימה מאחר ואינם חסומים.",
"title": "❌שגיאה"
},
"list": {
"fields": {
"members": "משתמשים",
"roles": "רולים"
},
"title": "📃משתמשים ורולים ברשימת החסומים"
},
"member_added": {
"description": "<@%s> נחסם ולא יוכל לתקשר עם הבוט.",
"title": "✅משתמש הוסף לרשימת החסומים"
}
}
},
"settings": {
"options": {
"categories": {
"options": {
"edit": {
"name": "ערוך",
"options": {
"id": {
"name": "איידי"
},
"image": {
"name": "תמונה"
},
"max_per_member": {
"name": "מקס_עבור_משתמש"
},
"name": {
"name": "שם"
},
"name_format": {
"name": ורמט_שם"
},
"opening_message": {
"name": ודעת_פתיחה"
},
"opening_questions": {
"name": "שאלות_פתיחה"
},
"ping": {
"name": "פינג"
}
}
}
}
}
}
}
}
}

View File

@@ -1,324 +0,0 @@
{
"bot": {
"missing_permissions": {
"description": "कलह टिकट निम्नलिखित अनुमतियों की आवश्यकता है:\n%s",
"title": "⚠️"
},
"version": "[Discord टिकट] (%s) v%s [eartharoid](%s) द्वारा"
},
"collector_expires_in": "%d सेकंड में समाप्त हो रहा है",
"command_execution_error": {
"description": "An unexpected error occurred during command execution.\nPlease ask an administrator to check the console output / logs for details.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Add a member to a ticket",
"name": "add",
"response": {
"added": {
"description": "%s has been added to %s.",
"title": "✅ Member added"
},
"no_member": {
"description": "Please mention the member you want to add.",
"title": "❌ Unknown member"
},
"no_permission": {
"description": "You are not the creator of this ticket and you are not a staff member; you can't add members to this ticket.",
"title": "❌ Insufficient permission"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel, or mention the channel.",
"title": "❌ This isn't a ticket channel"
}
}
},
"blacklist": {
"description": "Blacklist/unblacklist a member from interacting with the bot",
"name": "blacklist",
"response": {
"empty_list": {
"description": "There are no members or roles blacklisted. Type `%sblacklist <memberOrRole>` to add a member or role to the blacklist.",
"title": "📃 Blacklisted members and roles"
},
"illegal_action": {
"description": "%s is a staff member and cannot be blacklisted.",
"title": "❌ You can't blacklist this member"
},
"list": {
"title": "📃 Blacklisted members and roles"
},
"member_added": {
"description": "<@%s> has been added to the blacklist. They will no longer be able to interact with the bot.",
"title": "✅ Added member to blacklist"
},
"member_removed": {
"description": "<@%s> has been removed from the blacklist. They can now use the bot again.",
"title": "✅ Removed member from blacklist"
},
"role_added": {
"description": "<@&%s> has been added to the blacklist. Members with this role will no longer be able to interact with the bot.",
"title": "✅ Added role to blacklist"
},
"role_removed": {
"description": "<@&%s> has been removed from the blacklist. Members with this role can now use the bot again.",
"title": "✅ Removed role from blacklist"
}
}
},
"close": {
"description": "Close a ticket channel",
"name": "close",
"response": {
"closed": {
"description": "Ticket #%s has been closed.",
"title": "✅ Ticket closed"
},
"closed_multiple": {
"description": [
"%d ticket has been closed.",
"%d tickets have been closed."
],
"title": [
"✅ Ticket closed",
"✅ Tickets closed"
]
},
"confirm": {
"description": "React with ✅ to close this ticket.",
"description_with_archive": "You will be able to view an archived version of it after.\nReact with ✅ to close this ticket.",
"title": "❔ Are you sure?"
},
"confirm_multiple": {
"description": [
"React with ✅ to close %d ticket.",
"React with ✅ to close %d tickets."
],
"title": "❔ Are you sure?"
},
"confirmation_timeout": {
"description": "You took too long to confirm.",
"title": "❌ Reaction time expired"
},
"invalid_time": {
"description": "The time period provided could not be parsed.",
"title": "❌ Invalid input"
},
"no_tickets": {
"description": "There are no tickets which have been inactive for this time period.",
"title": "❌ No tickets to close"
},
"not_a_ticket": {
"description": "Please use this command in a ticket channel or use the ticket flag.\nType `%shelp close` for more information.",
"title": "❌ This isn't a ticket channel"
},
"unresolvable": {
"description": "`%s` could not be resolved to a ticket. Please provide the ticket ID/mention or number.",
"title": "❌ Error"
}
}
},
"help": {
"description": "List commands you have access to, or find out more about a command",
"name": "help",
"response": {
"list": {
"description": "The commands you have access to are listed below. For more information about a command, type `{prefix}help [command]`. To create a ticket, type `{prefix}new [topic]`.",
"fields": {
"commands": "Commands"
},
"title": "❔ Help"
}
}
},
"new": {
"description": "Create a new ticket",
"name": "new",
"request_topic": {
"description": "Please briefly state what this ticket is about in a few words.",
"title": "Ticket topic"
},
"response": {
"created": {
"description": "Your ticket has been created: %s.",
"title": "✅ Ticket created"
},
"error": {
"title": "❌ Error"
},
"has_a_ticket": {
"description": "Please use your existing ticket (<#%s>) or close it before creating another.",
"title": "❌ You already have an open ticket"
},
"max_tickets": {
"description": "Please use `%sclose` to close any unneeded tickets.\n\n%s",
"title": "❌ You already have %d open tickets"
},
"no_categories": {
"description": "A server administrator must create at least one ticket category before a new ticket can be opened.",
"title": "❌ Can't create ticket"
},
"select_category": {
"description": "Select the category most relevant to your ticket's topic:\n\n%s",
"title": "🔤 Please select the ticket category"
},
"select_category_timeout": {
"description": "You took too long to select the ticket category.",
"title": "❌ Reaction time expired"
}
}
},
"panel": {
"description": "Create a new ticket panel",
"name": "panel",
"response": {
"invalid_category": {
"description": "One or more of the specified category IDs is invalid.",
"title": "❌ Invalid category"
}
}
},
"remove": {
"description": "Remove a member from a ticket",
"name": "remove",
"response": {
"no_member": {
"description": "Please mention the member you want to remove.",
"title": "❌ Unknown member"
},
"no_permission": {
"description": "You are not the creator of this ticket and you are not a staff member; you can't remove members from this ticket.",
"title": "❌ Insufficient permission"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel, or mention the channel.",
"title": "❌ This isn't a ticket channel"
},
"removed": {
"description": "%s has been removed from %s.",
"title": "✅ Member removed"
}
}
},
"settings": {
"description": "Configure Discord Tickets",
"name": "settings"
},
"stats": {
"description": "Display ticket statistics",
"fields": {
"messages": "Messages",
"response_time": {
"minutes": "%s minutes",
"title": "Avg. response time"
},
"tickets": "Tickets"
},
"name": "stats",
"response": {
"global": {
"description": "Statistics about tickets across all guilds where this Discord Tickets instance is used.",
"title": "📊 Global stats"
},
"guild": {
"description": "Statistics about tickets within this guild. This data is cached for an hour.",
"title": "📊 This server's stats"
}
}
},
"survey": {
"description": "View survey responses",
"name": "survey",
"response": {
"list": {
"title": "📃 Surveys"
}
}
},
"tag": {
"description": "Use a tag response",
"name": "tag",
"response": {
"error": "❌ Error",
"list": {
"title": "📃 Tag list"
},
"missing": "This tag requires the following arguments:\n%s",
"not_a_ticket": {
"description": "This tag can only be used within a ticket channel as it uses ticket references.",
"title": "❌ This isn't a ticket channel"
}
}
},
"topic": {
"description": "Change the topic of the ticket",
"name": "topic",
"response": {
"changed": {
"description": "This ticket's topic has been changed.",
"title": "✅ Topic changed"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel you want to change the topic of.",
"title": "❌ This isn't a ticket channel"
}
}
}
},
"message_will_be_deleted_in": "This message will be deleted in %d seconds",
"missing_permissions": {
"description": "You do not have the permissions required to use this command:\n%s",
"title": "❌"
},
"ticket": {
"claimed": {
"description": "%s has claimed this ticket.",
"title": "✅ Ticket claimed"
},
"closed": {
"description": "This ticket has been closed.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_by_member": {
"description": "This ticket has been closed by %s.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_by_member_with_reason": {
"description": "This ticket has been closed by %s: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_with_reason": {
"description": "This ticket has been closed: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"member_added": {
"description": "%s has been added by %s",
"title": "Member added"
},
"member_removed": {
"description": "%s has been removed by %s",
"title": "Member removed"
},
"opening_message": {
"fields": {
"topic": "Topic"
}
},
"questions": "Please answer the following questions:\n\n%s",
"released": {
"description": "%s has released this ticket.",
"title": "✅ Ticket released"
},
"survey": {
"complete": {
"description": "Thank you for your feedback.",
"title": "✅ Thank you"
},
"start": {
"description": "Hey, %s. Before this channel is deleted, would you mind completing a quick %d-question survey? React with ✅ to start, or ignore this message.",
"title": "❔ Feedback"
}
}
}
}

View File

@@ -1,610 +0,0 @@
{
"blacklisted": "❌Feketelistázva vagy",
"bot": {
"missing_permissions": {
"description": "Discord Ticketek az alábbi engedélyeket igényli:\n%s",
"title": "⚠️"
},
"version": "[Discord Ticketek](%s) v%s által [eartharoid](%s)"
},
"collector_expires_in": "%d másodperc múlva lejár",
"command_execution_error": {
"description": "Egy váratlan hiba lépett fel a parancs futtatása közben\nKérj meg egy adminisztrátort hogy nézze meg a parancssort / hibanaplókat további információkért.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Felhasználó hozzáadása a Hibajegyhez",
"name": "hozzáad",
"options": {
"member": {
"description": "A felhasználó akit hozzá szeretnél adni a Tickethez",
"name": "tag"
},
"ticket": {
"description": "A Ticket amihez hozzá szeretnéd adni a felhasználót",
"name": "ticket"
}
},
"response": {
"added": {
"description": "%s felhasználó hozzáadva %s.",
"title": "✅ Felhasználó hozzáadva"
},
"no_member": {
"description": "Kérlek, említsd meg a hozzáadni kívánt felhasználót.",
"title": "❌ Ismeretlen felhasználó"
},
"no_permission": {
"description": "Nem ennek a Ticket alkotója, és nem munkatársa, így nem adhatsz hozzá felhasználókat ehhez a Hibajegyhez.",
"title": "❌ Nincs engedélyed ehhez"
},
"not_a_ticket": {
"description": "Kérlek, használd ezt a parancsot a Hibajegy csatornában, vagy említsd meg a csatornát.",
"title": "❌ Ez nem Ticket csatorna"
}
}
},
"blacklist": {
"description": "A feketelista megtekintése vagy módosítása",
"name": "feketelista",
"options": {
"add": {
"description": "Rang vagy felhasználó hozzáadása a feketelistához",
"name": "hozzáadás",
"options": {
"member_or_role": {
"description": "A feketelistára felveendő felhasználó vagy rang",
"name": "felhazsnálo_vagy_rang"
}
}
},
"remove": {
"description": "Rang vagy felhasználó eltávolítása a feketelistáról",
"name": "eltávolítás",
"options": {
"member_or_role": {
"description": "A feketelistáról eltávolítandó felhasználó vagy rang",
"name": "felhasználó_vagy_rang"
}
}
},
"show": {
"description": "Megmutatja a feketelistán szereplő felhasználóka és rangokat",
"name": "megmutatás"
}
},
"response": {
"empty_list": {
"description": "Nincsenek felhasználok vagy rangok feketelistán. Írd be a(z) \"/blacklist add\" parancsot, ha felhasználót vagy rangot szeretnél hozzáadni a feketelistához.",
"title": "📃 Feketelistára került felhasználók és rangok"
},
"illegal_action": {
"description": "%s csapattag, és nem lehet feketelistára tenni.",
"title": "❌ Ezt a felhasználót nem lehet feketelistára tenni"
},
"invalid": {
"description": "Ez a felhasználó vagy rang nem távolítható el a feketelistáról, mivel nincsenek feketelistán.",
"title": "❌ Hiba"
},
"list": {
"fields": {
"members": "Felhasználók",
"roles": "Rangok"
},
"title": "📃 Feketelistára került felhasználók és rangok"
},
"member_added": {
"description": "<@%s> felkerült a feketelistára. Többé nem léphet kapcsolatba a bottal.",
"title": "✅ Felhasználó hozzáadva a feketelistára"
},
"member_removed": {
"description": "<@%s> eltávolítva a feketelistáról. Most újra használhatja a botot.",
"title": "✅ Felhasználó eltávolítva a fektelistáról"
},
"role_added": {
"description": "<@&%s> felkerült a feketelistára. Az ezzel a rangal rendelkező felhasználók többé nem léphetnek kapcsolatba a bottal.",
"title": "✅ Rang hozzáadva a feketelistára"
},
"role_removed": {
"description": "<@&%s> eltávolítva a feketelistáról. Az ezzel a rangal rendelkező felhasználók most újra használhatják a botot.",
"title": "✅ Rang eltávolítva a feketelistáról"
}
}
},
"close": {
"description": "Zárd be a Ticket csatornát",
"name": "bezárás",
"options": {
"reason": {
"description": "A ticket lezárásának indoka",
"name": "indok"
},
"ticket": {
"description": "A záró ticket, akár a szám, akár a csatorna ID",
"name": "ticket"
},
"time": {
"description": "Zárj be minden ticketet, amely a megadott ideig inaktív volt",
"name": "idő"
}
},
"response": {
"canceled": {
"description": "Töröltél a műveletet.",
"title": "🚫 Törölve"
},
"closed": {
"description": "Ticket #%s lezárva.",
"title": "✅ Ticketek lezárva"
},
"closed_multiple": {
"description": [
"%d Ticketek lezárták.",
"%d ticketet lezárták."
],
"title": [
"✅ Ticket lezárva",
"✅ Ticketek lezárva"
]
},
"confirm": {
"buttons": {
"cancel": "Mégse",
"confirm": "Bezárás"
},
"description": "Kérlek, erősítsd meg döntésed.",
"description_with_archive": "A ticketet archiváljuk a későbbi hivatkozás érdekében.",
"title": "❔ Biztos vagy ebben?"
},
"confirm_multiple": {
"buttons": {
"cancel": "Mégse",
"confirm": [
"%d ticket bezárása",
"%d ticketek bezárása"
]
},
"description": [
"Arra készülsz, hogy lezárod %d ticketét.",
"Arra készülsz, hogy lezárod %d ticketjüket."
],
"title": "❔ Biztos vagy benne?"
},
"confirmation_timeout": {
"description": "Túl sokáig tartott a megerősítés.",
"title": "❌ Az interakciós idő lejárt"
},
"invalid_time": {
"description": "A megadott időszakot nem lehetett elemezni.",
"title": "❌ Érvénytelen bemenet"
},
"no_permission": {
"description": "Nem vagy személyzeti felhasználó vagy ticket gyártója.",
"title": "❌ Nincs elegendő engedélyed"
},
"no_tickets": {
"description": "Nincs olyan ticket, amely inaktív lenne ebben az időszakban.",
"title": "❌Ticketeknek nincs zárható ticketjük"
},
"not_a_ticket": {
"description": "Kérlek, használd ezt a parancsot egy ticket csatornában, vagy használd a ticket zászlót.\nTovábbi információért írd be a(z) \"/help close\" parancsot.",
"title": "❌ Ez nem ticket csatorna"
},
"unresolvable": {
"description": "`%s` nem lehet feloldani ticketjét. Kérlek, add meg a ticket ID-ját/említését vagy számát.",
"title": "❌ Hiba"
}
}
},
"help": {
"description": "Felsorolja azokat a parancsokat, amelyekhez hozzáférsz",
"name": "segítség",
"response": {
"list": {
"description": "Az alábbiakban felsoroljuk a hozzáférhető parancsokat. Ticket létrehozásához írd be a **`/new`** parancsot.",
"fields": {
"commands": "Parancsok"
},
"title": "❔ Segítség"
}
}
},
"new": {
"description": "Új Ticket létrehozása",
"name": "új",
"options": {
"topic": {
"description": "A ticket témája",
"name": "téma"
}
},
"request_topic": {
"description": "Kérlek, néhány szóban röviden írd le, miről szól ez a ticket.",
"title": "⚠️ Ticket témája"
},
"response": {
"created": {
"description": "Tickete létrehozva: %s.",
"title": "✅ Ticket létrehozva"
},
"error": {
"title": "❌ Hiba"
},
"has_a_ticket": {
"description": "Kérlek, használd meglévő ticketed (<#%s>), vagy zárd be, mielőtt újat hozol létre.",
"title": "❌ Már van nyitott ticketed"
},
"max_tickets": {
"description": "A \"/close\" parancsal zárd be a szükségtelen ticketeket.\n\n%s",
"title": "❌ Már van %d nyitott ticketed"
},
"no_categories": {
"description": "A szerver adminisztrátorának legalább egy ticket kategóriát kell létrehoznia, mielőtt új ticketet nyithatnál.",
"title": "❌ Nem lehet ticketet létrehozni"
},
"select_category": {
"description": "Válaszd ki a ticket témájának leginkább megfelelő kategóriáját.",
"title": "🔤 Kérlek, válaszd ki a ticket kategóriáját"
},
"select_category_timeout": {
"description": "Túl sokáig tartott a ticket kategória kiválasztása.",
"title": "❌ Az interakciós idő lejárt"
}
}
},
"panel": {
"description": "Hozz létre új ticket panelt",
"name": "panel",
"options": {
"categories": {
"description": "A ID-kat vesszővel elválasztott listája",
"name": "kategóriák"
},
"description": {
"description": "A panelüzenet leírása",
"name": "leírás"
},
"image": {
"description": "A panelüzenet kép URL -je",
"name": "kép"
},
"just_type": {
"description": "Létrehozol egy \"csak típus\" panelt?",
"name": "csak_gépelj"
},
"thumbnail": {
"description": "A panelüzenet miniatűr képének URL -je",
"name": "miniatűr kép"
},
"title": {
"description": "A panelüzenet címe",
"name": "cím"
}
},
"response": {
"invalid_category": {
"description": "A megadott ID közül egy vagy több érvénytelen.",
"title": "❌ Érvénytelen kategória"
},
"too_many_categories": {
"description": "A \"csak típus\" panel csak egyetlen kategóriával használható.",
"title": "❌ Túl sok kategória"
}
}
},
"remove": {
"description": "Felhasználó eltávolítása a ticketből",
"name": "eltávolítás",
"options": {
"member": {
"description": "A felhasználó, hogy távolítsd el a ticketet",
"name": "felhasználó"
},
"ticket": {
"description": "Felhasználó eltávolítása a ticketből",
"name": "ticket"
}
},
"response": {
"no_member": {
"description": "Kérlek, említsd meg az eltávolítani kívánt felhasználót.",
"title": "❌ Ismeretlen felhasználó"
},
"no_permission": {
"description": "Nem vagy ennek a ticketnek az alkotója, és nem munkatársa; nem távolíthatsz el a felhasználókat ebből a ticketől.",
"title": "❌ Nincs elegendő engedélyed"
},
"not_a_ticket": {
"description": "Kérlek, használd ezt a parancsot a ticket csatornában, vagy említsd meg a csatornát.",
"title": "❌ Ez nem ticket csatorna"
},
"removed": {
"description": "%s eltávolítva innen: %s.",
"title": "✅ Felhasználó eltávolítva"
}
}
},
"settings": {
"description": "Állítsd be a Discord Ticketeket",
"name": "beállítások",
"options": {
"categories": {
"description": "Kezeld ticket kategóriákat",
"name": "kategóriák",
"options": {
"create": {
"description": "Új kategória létrehozása",
"name": "létrehozás",
"options": {
"name": {
"description": "A kategória neve",
"name": "név"
},
"roles": {
"description": "A kategória személyi szerepkör-ID-nak vesszővel elválasztott listája",
"name": "rangok"
}
}
},
"delete": {
"description": "Kategória törlése",
"name": "törlés",
"options": {
"id": {
"description": "A törölni kívánt kategória ID-ja",
"name": "id"
}
}
},
"edit": {
"description": "Módosítsd a kategória konfigurációját",
"name": "szerkesztés",
"options": {
"claiming": {
"description": "Engedélyezed a ticket igénylését?",
"name": "igénylés"
},
"id": {
"description": "A szerkeszteni kívánt kategória ID-ja",
"name": "id"
},
"image": {
"description": "Kép URL",
"name": "kép"
},
"max_per_member": {
"description": "Ebben a kategóriában a ticketek maximális száma, amelyet egy felhasználó kaphat",
"name": "felhasználónként_maximális"
},
"name": {
"description": "A kategória neve",
"name": "név"
},
"name_format": {
"description": "A ticket nevének a formátuma",
"name": "név_formátum"
},
"opening_message": {
"description": "A szöveg, amelyet el kell küldeni a ticket kinyitásakor",
"name": "nyitó_üzenet"
},
"opening_questions": {
"description": "Kérdések, amelyeket fel kell tenni a ticket kinyitásakor.",
"name": "nyitó_kérdések"
},
"ping": {
"description": "A pingelni kívánt rang ID vesszővel elválasztott listája",
"name": "ping"
},
"require_topic": {
"description": "Követeld a felhasználótól, hogy adja meg a ticket témáját?",
"name": "témát_igényel"
},
"roles": {
"description": "A személyzeti rang ID vesszővel elválasztott listája",
"name": "rangok"
},
"survey": {
"description": "A felmérés használható",
"name": "felmérés"
}
}
},
"list": {
"description": "Kategóriák listája",
"name": "lista"
}
}
},
"set": {
"description": "Beállítások beállítása",
"name": "beállítás",
"options": {
"close_button": {
"description": "Engedélyezed a gombbal történő zárást?",
"name": "záró_gomb"
},
"colour": {
"description": "A standard szín",
"name": "szín"
},
"error_colour": {
"description": "A hiba színe",
"name": "hiba_színe"
},
"footer": {
"description": "A lábléc beágyazása",
"name": "lábléc"
},
"locale": {
"description": "A területi beállítás (nyelv)",
"name": "nyelv"
},
"log_messages": {
"description": "Tárold a ticketekből származó üzeneteket?",
"name": "napló_üzenetek"
},
"success_colour": {
"description": "A siker színe",
"name": "siker_színe"
}
}
}
},
"response": {
"category_created": "✅ Létrehozva a(z) `%s` ticket kategória",
"category_deleted": "✅ Törölve a(z) `%s` ticket kategória",
"category_does_not_exist": "❌ A megadott ID-val nem létezik kategória",
"category_list": "Ticket kategóriák",
"category_updated": "✅ A(z) `%s` ticket kategória frissítve",
"settings_updated": "✅ A beállítások sikeresen frissítve"
}
},
"stats": {
"description": "Ticket statisztikák megjelenítése",
"fields": {
"messages": "Üzenetek",
"response_time": {
"minutes": "%s perc",
"title": "Átl. válaszidő"
},
"tickets": "Ticketek"
},
"name": "statisztika",
"response": {
"global": {
"description": "Statisztikák a ticketekről az összes szerveren, ahol ezt a Discord Ticketek példányt használják.",
"title": "📊 Globális statisztika"
},
"guild": {
"description": "Statisztikák a szerveren belüli ticketekről. Ezeket az adatokat egy órán keresztül tárolja a gyorsítótárban.",
"title": "📊 Szerver statisztikája"
}
}
},
"survey": {
"description": "Felmérési válaszok megtekintése",
"name": "felmérés",
"options": {
"survey": {
"description": "A válaszok megtekintéséhez szükséges felmérés neve",
"name": "felmérés"
}
},
"response": {
"list": {
"title": "📃 Felmérések"
}
}
},
"tag": {
"description": "Címke válasz használata",
"name": "címke",
"options": {
"tag": {
"description": "A használni kívánt címke neve",
"name": "címke"
}
},
"response": {
"error": "❌ Hiba",
"list": {
"title": "📃 Címke lista"
},
"missing": "Ez a címke a következő érveket igényli:\n%s",
"not_a_ticket": {
"description": "Ez a címke csak ticket csatornán belül használható, mivel ticket referenciákat használ.",
"title": "❌ Ez nem ticket csatorna"
}
}
},
"topic": {
"description": "Változtasd meg a ticket témáját",
"name": "téma",
"options": {
"new_topic": {
"description": "A ticket új témája",
"name": "új_téma"
}
},
"response": {
"changed": {
"description": "Ennek a ticketnek a témája megváltozott.",
"title": "✅ Téma változtatva"
},
"not_a_ticket": {
"description": "Kérlek, használd ezt a parancsot a ticket csatornában, amelynek témáját módosítani szeretnéd.",
"title": "❌ Ez nem ticket csatorna"
}
}
}
},
"message_will_be_deleted_in": "Ez az üzenet %d másodperc múlva törlődik",
"missing_permissions": {
"description": "Nem rendelkezel a parancs használatához szükséges jogosultságokkal:\n%s",
"title": "❌ Hiba"
},
"panel": {
"create_ticket": "Ticket létrehozása"
},
"ticket": {
"claim": "Igénylés",
"claimed": {
"description": "%s igényelt egy ticketet.",
"title": "✅ Ticket igényelve"
},
"close": "Bezárás",
"closed": {
"description": "Ezt a ticketet lezárták.\nA csatorna 5 másodpercen belül törlődik.",
"title": "✅ Ticket lezárva"
},
"closed_by_member": {
"description": "Ezt a ticketet lezárta %s.\nA csatorna 5 másodpercen belül törlődik.",
"title": "✅ Ticket lezárva"
},
"closed_by_member_with_reason": {
"description": "Ezt a ticketet %s lezárta: ` %s`\nA csatorna 5 másodpercen belül törlődik.",
"title": "✅ Ticket lezárva"
},
"closed_with_reason": {
"description": "Ezt a ticketet lezárta: `%s`\nA csatorna 5 másodpercen belül törlődik.",
"title": "✅ Ticket lezárva"
},
"member_added": {
"description": "%s hozzáadva %s által",
"title": "Felhasználó hozzáadva"
},
"member_removed": {
"description": "%s eltávolítva %s által",
"title": "Felhasználó eltávolítva"
},
"opening_message": {
"content": "%s\n%s létrehozott egy új ticketet",
"fields": {
"topic": "Téma"
}
},
"questions": "Kérlek, válaszolj az alábbi kérdésekre:\n\n%s",
"released": {
"description": "%s kiadta ezt a ticketet.",
"title": "✅ Ticket kiadva"
},
"survey": {
"complete": {
"description": "Köszönjük a visszajelzést.",
"title": "✅ Köszönjük"
},
"start": {
"buttons": {
"ignore": "Nem",
"start": "Indítsd el a felmérést"
},
"description": "Szia, %s. Mielőtt törölnéd ezt a csatornát, szeretnél kitölteni egy gyors %d-question felmérést?",
"title": "❔Visszajelzés"
}
},
"unclaim": "Kiadás"
},
"updated_permissions": "✅ A Slash parancs engedélyei frissítve"
}

View File

@@ -1,324 +0,0 @@
{
"bot": {
"missing_permissions": {
"description": "Discord Tickets requires the following permissions:\n%s",
"title": "⚠️"
},
"version": "[Discord Tickets](%s) versi %s oleh [eartharoid](%s)"
},
"collector_expires_in": "Kadaluwarsa dalam %d detik",
"command_execution_error": {
"description": "Eror tak terduga ketika mengeksekusi command.\nTolong tanya seorang adminstrator untuk memeriksa console atau log konsol untuk detail.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Add a member to a ticket",
"name": "add",
"response": {
"added": {
"description": "%s has been added to %s.",
"title": "✅ Member added"
},
"no_member": {
"description": "Please mention the member you want to add.",
"title": "❌ Unknown member"
},
"no_permission": {
"description": "You are not the creator of this ticket and you are not a staff member; you can't add members to this ticket.",
"title": "❌ Insufficient permission"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel, or mention the channel.",
"title": "❌ This isn't a ticket channel"
}
}
},
"blacklist": {
"description": "Blok/hapus blok seorang anggota dari berinteraksi dengan bot ini",
"name": "blok",
"response": {
"empty_list": {
"description": "Tidak ada anggota atau role yang di blok. Ketik `%sblok <memberOrRole>` untuk menambahkan member atau role ke daftar blokir.",
"title": "📃 Daftar anggota-anggota yang di blok"
},
"illegal_action": {
"description": "%s adalah seorang anggota staf dan tidak bisa di blokir.",
"title": "❌ Anda tidak bisa blokir anggota ini"
},
"list": {
"title": "📃 Daftar anggota-anggota yang di blok"
},
"member_added": {
"description": "<@%s> telah ditambahkan ke daftar blokir. Mereka tidak akan lagi dapat berinteraksi dengan bot ini.",
"title": "✅ Berhasil menambahkan anggota ke daftar blokir"
},
"member_removed": {
"description": "<@%s> telah dihapus dari daftar blokir. Sekarang mereka dapat menggunakan bot ini lagi.",
"title": "✅ Berhasil menghapus anggota dari daftar blokir"
},
"role_added": {
"description": "<@&%s> telah ditambahkan ke daftar blokir. Anggota-anggota dengan role ini tidak akan lagi dapat berinteraksi dengan bot ini.",
"title": "✅ Berhasil menambahkan role ke daftar blokir"
},
"role_removed": {
"description": "<@&%s> telah dihapus dari daftar blokir. Anggota-anggota dengan role ini sekarang dapat menggunakan bot ini lagi.",
"title": "✅ Berhasil menghapus role dari daftar blokir"
}
}
},
"close": {
"description": "Tutup sebuah channel tiket",
"name": "tutup",
"response": {
"closed": {
"description": "Ticket #%s has been closed.",
"title": "✅ Tiket ditutup"
},
"closed_multiple": {
"description": [
"%d ticket has been closed.",
"%d tickets have been closed."
],
"title": [
"✅ Tiket ditutup",
"✅ Tickets closed"
]
},
"confirm": {
"description": "React with ✅ to close this ticket.",
"description_with_archive": "You will be able to view an archived version of it after.\nReact with ✅ to close this ticket.",
"title": "❔ Are you sure?"
},
"confirm_multiple": {
"description": [
"React with ✅ to close %d ticket.",
"React with ✅ to close %d tickets."
],
"title": "❔ Are you sure?"
},
"confirmation_timeout": {
"description": "You took too long to confirm.",
"title": "❌ Waktu reaksi habis"
},
"invalid_time": {
"description": "The time period provided could not be parsed.",
"title": "❌ Invalid input"
},
"no_tickets": {
"description": "There are no tickets which have been inactive for this time period.",
"title": "❌ No tickets to close"
},
"not_a_ticket": {
"description": "Please use this command in a ticket channel or use the ticket flag.\nType `%shelp close` for more information.",
"title": "❌ This isn't a ticket channel"
},
"unresolvable": {
"description": "`%s` could not be resolved to a ticket. Please provide the ticket ID/mention or number.",
"title": "❌ Error"
}
}
},
"help": {
"description": "List commands you have access to, or find out more about a command",
"name": "help",
"response": {
"list": {
"description": "The commands you have access to are listed below. For more information about a command, type `{prefix}help [command]`. To create a ticket, type `{prefix}new [topic]`.",
"fields": {
"commands": "Commands"
},
"title": "❔ Help"
}
}
},
"new": {
"description": "Buat tiket baru",
"name": "baru",
"request_topic": {
"description": "Tolong beri tahu secara singkat untuk apa tiket ini dibuat dalam beberapa kata.",
"title": "Topik tiket"
},
"response": {
"created": {
"description": "Tiket anda telah dibuat: %s.",
"title": "✅ Tiket dibuat"
},
"error": {
"title": "❌ Error"
},
"has_a_ticket": {
"description": "Silahkan gunakan tiket yang ada (<#%s>) atau tutup tiket tersebut sebelum membuat tiket lain.",
"title": "❌ Anda sudah memiliki tiket yang buka"
},
"max_tickets": {
"description": "Tolong gunakan `%stutup` untuk menutup tiket yang tidak perlu.\n\n%s",
"title": "❌ Anda sudah memiliki %d tiket yang buka"
},
"no_categories": {
"description": "Seorang administrator server harus membuat setidaknya satu kategori tikey sebelum tiket baru dapat dibuka.",
"title": "❌ Tidak dapat membuat tiket"
},
"select_category": {
"description": "Pilih kategory yang paling relevan denga topik tiket anda:\n\n%s",
"title": "🔤 Tolong pilih kategori tiket"
},
"select_category_timeout": {
"description": "Anda terlalu lama untuk memilih kategori tiket.",
"title": "❌ Waktu reaksi habis"
}
}
},
"panel": {
"description": "Create a new ticket panel",
"name": "panel",
"response": {
"invalid_category": {
"description": "One or more of the specified category IDs is invalid.",
"title": "❌ Invalid category"
}
}
},
"remove": {
"description": "Remove a member from a ticket",
"name": "remove",
"response": {
"no_member": {
"description": "Please mention the member you want to remove.",
"title": "❌ Unknown member"
},
"no_permission": {
"description": "You are not the creator of this ticket and you are not a staff member; you can't remove members from this ticket.",
"title": "❌ Insufficient permission"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel, or mention the channel.",
"title": "❌ This isn't a ticket channel"
},
"removed": {
"description": "%s has been removed from %s.",
"title": "✅ Member removed"
}
}
},
"settings": {
"description": "Konfigurasi Discord Tickets",
"name": "pengaturan"
},
"stats": {
"description": "Display ticket statistics",
"fields": {
"messages": "Messages",
"response_time": {
"minutes": "%s minutes",
"title": "Avg. response time"
},
"tickets": "Tickets"
},
"name": "stats",
"response": {
"global": {
"description": "Statistics about tickets across all guilds where this Discord Tickets instance is used.",
"title": "📊 Global stats"
},
"guild": {
"description": "Statistics about tickets within this guild. This data is cached for an hour.",
"title": "📊 This server's stats"
}
}
},
"survey": {
"description": "View survey responses",
"name": "survey",
"response": {
"list": {
"title": "📃 Surveys"
}
}
},
"tag": {
"description": "Use a tag response",
"name": "tag",
"response": {
"error": "❌ Error",
"list": {
"title": "📃 Tag list"
},
"missing": "This tag requires the following arguments:\n%s",
"not_a_ticket": {
"description": "This tag can only be used within a ticket channel as it uses ticket references.",
"title": "❌ This isn't a ticket channel"
}
}
},
"topic": {
"description": "Change the topic of the ticket",
"name": "topik",
"response": {
"changed": {
"description": "This ticket's topic has been changed.",
"title": "✅ Topic changed"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel you want to change the topic of.",
"title": "❌ This isn't a ticket channel"
}
}
}
},
"message_will_be_deleted_in": "Pesan ini akan dihapus dalam %d detik",
"missing_permissions": {
"description": "You do not have the permissions required to use this command:\n%s",
"title": "❌"
},
"ticket": {
"claimed": {
"description": "%s has claimed this ticket.",
"title": "✅ Ticket claimed"
},
"closed": {
"description": "This ticket has been closed.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Tiket ditutup"
},
"closed_by_member": {
"description": "This ticket has been closed by %s.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Tiket ditutup"
},
"closed_by_member_with_reason": {
"description": "This ticket has been closed by %s: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Tiket ditutup"
},
"closed_with_reason": {
"description": "This ticket has been closed: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Tiket ditutup"
},
"member_added": {
"description": "%s has been added by %s",
"title": "Member added"
},
"member_removed": {
"description": "%s has been removed by %s",
"title": "Member removed"
},
"opening_message": {
"fields": {
"topic": "Topic"
}
},
"questions": "Please answer the following questions:\n\n%s",
"released": {
"description": "%s has released this ticket.",
"title": "✅ Ticket released"
},
"survey": {
"complete": {
"description": "Thank you for your feedback.",
"title": "✅ Thank you"
},
"start": {
"description": "Hey, %s. Before this channel is deleted, would you mind completing a quick %d-question survey? React with ✅ to start, or ignore this message.",
"title": "❔ Feedback"
}
}
}
}

View File

@@ -1,324 +0,0 @@
{
"bot": {
"missing_permissions": {
"description": "Discord Tickets necessita i seguenti permessi.\n%s",
"title": "⚠️"
},
"version": "[Discord Tickets](%s) v%s di [eartharoid](%s)"
},
"collector_expires_in": "Scade tra %d secondi",
"command_execution_error": {
"description": "Errore imprevisto durante l'esecuzione del comando.\nChiedere a un amministratore di controllare l'output / i registri della console per i dettagli.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Aggiungi un membro ad un ticket",
"name": "aggiungi",
"response": {
"added": {
"description": "%s è stato aggiunto a %s.",
"title": "✅ Membro aggiunto"
},
"no_member": {
"description": "Si prega di menzionare il membro che si desidera aggiungere.",
"title": "❌ Membro sconosciuto"
},
"no_permission": {
"description": "Non sei il creatore di questo ticket e non sei neanche un membro dello staff, di conseguenza non puoi aggiungere membri a questo ticket.",
"title": "❌ Permessi insufficienti"
},
"not_a_ticket": {
"description": "Usa questo comando in un ticket, o menziona il canale.",
"title": "❌ Questo canale non è un ticket"
}
}
},
"blacklist": {
"description": "Blacklista o unblacklista un utente dal bot",
"name": "lista nera",
"response": {
"empty_list": {
"description": "Non ci sono membri o ruoli blacklistati. Digita %sblacklist <memberOrRole>` per aggiungere un membro o un ruolo alla blacklist.",
"title": "📃 Membri e ruoli nella blacklist"
},
"illegal_action": {
"description": "%s è un membro dello staff e non può essere blacklistato.",
"title": "❌ Non puoi blacklistare questo utente"
},
"list": {
"title": "📃 Membri e ruoli nella blacklist"
},
"member_added": {
"description": "<@%s> è stato aggiunto alla blacklist. Non saranno più in grado di interagire con il bot.",
"title": "✅ Aggiunto membro alla blacklist"
},
"member_removed": {
"description": "<@%s> è stato rimosso dalla blacklist. Da ora potrà ritornare ad usare il bot.",
"title": "✅ Membro rimosso dalla blacklist"
},
"role_added": {
"description": "<@&%s> è stato aggiunto alla blacklist. I membri con questo ruolo non saranno più in grado di interagire con il bot.",
"title": "✅ Aggiunto ruolo alla blacklist"
},
"role_removed": {
"description": "<@&%s> è stato rimosso dalla blacklist. I membri con questo ruolo da ora potranno ritornare ad usare il bot.",
"title": "✅ Ruolo rimosso dalla blacklist"
}
}
},
"close": {
"description": "Chiudi un ticket",
"name": "chiudi",
"response": {
"closed": {
"description": "Il ticket #%s è stato chiuso.",
"title": "✅ Ticket chiuso"
},
"closed_multiple": {
"description": [
"%d è stato chiuso.",
"%d ticket sono stati chiusi."
],
"title": [
"✅ Ticket chiuso",
"✅ Ticket chiusi"
]
},
"confirm": {
"description": "Reagisci con ✅ per chiudere questo ticket.",
"description_with_archive": "Sarai in grado di visualizzarla dopo una versione archiviata.\nreagisci con ✅ per chiudere questo ticket.",
"title": "❔ Sei sicuro?"
},
"confirm_multiple": {
"description": [
"Reagisci con ✅ per chiudere %d ticket.",
"Reagisci con ✅ per chiudere %d ticket."
],
"title": "❔ Sei sicuro?"
},
"confirmation_timeout": {
"description": "Hai impiegato troppo tempo per confermare l'azione.",
"title": "❌ Tempo scaduto"
},
"invalid_time": {
"description": "Impossibile analizzare il periodo di tempo fornito.",
"title": "❌ Input invalido"
},
"no_tickets": {
"description": "Non ci sono ticket che sono stati inattivi per questo periodo di tempo.",
"title": "❌ Nessun ticket da chiudere"
},
"not_a_ticket": {
"description": "Si prega di utilizzare questo comando in un ticket o di usare il contrassegno del ticket.\nDigita `%shelp close` per ulteriori informazioni.",
"title": "❌ Questo canale non è un ticket"
},
"unresolvable": {
"description": "`%s` non poteva essere risolto in un ticket. Si prega di fornire un ID/menzione del ticket o il numero.",
"title": "❌ Errore"
}
}
},
"help": {
"description": "Lista dei comandi a cui hai accesso o per saperne di più su un comando",
"name": "aiuto",
"response": {
"list": {
"description": "I comandi a cui hai accesso sono elencati di seguito. Per ulteriori informazioni su un comando, digita '{prefix}help [command]'. Per creare un ticket, digita '{prefix}new [topic]'.",
"fields": {
"commands": "Comandi"
},
"title": "❔ Aiuto"
}
}
},
"new": {
"description": "Crea un nuovo ticket",
"name": "nuovo",
"request_topic": {
"description": "Descrivi brevemente di cosa hai bisogno.",
"title": "Argomento del ticket"
},
"response": {
"created": {
"description": "Il tuo ticket è stato creato: %s.",
"title": "✅ Ticket creato"
},
"error": {
"title": "❌ Errore"
},
"has_a_ticket": {
"description": "Ti preghiamo di utilizzare il tuo ticket già creato (<#%s>) o di chiuderlo prima di crearne un altro.",
"title": "❌ Hai già un ticket aperto"
},
"max_tickets": {
"description": "Per favore utilizza `%sclose` per chiudere i ticket non necessari.\n\n%s",
"title": "❌ Hai già %d ticket aperti"
},
"no_categories": {
"description": "Un amministratore del server deve creare almeno una categoria per i ticket prima di aprire un nuovo ticket.",
"title": "❌ Impossibile creare un ticket"
},
"select_category": {
"description": "Seleziona la categoria che si attiene di più all'argomento del tuo ticket:\n\n%s",
"title": "🔤 Seleziona la categoria dei ticket"
},
"select_category_timeout": {
"description": "Hai impiegato troppo tempo per selezionare la categoria del ticket.",
"title": "❌ Tempo scaduto"
}
}
},
"panel": {
"description": "Crea un nuovo pannello dei ticket",
"name": "pannello",
"response": {
"invalid_category": {
"description": "Uno o più ID di categoria specificati non sono validi.",
"title": "❌ Categoria invalida"
}
}
},
"remove": {
"description": "Rimuovi un membro dal ticket",
"name": "rimuovi",
"response": {
"no_member": {
"description": "Si prega di menzionare il membro che si desidera rimuovere.",
"title": "❌ Membro sconosciuto"
},
"no_permission": {
"description": "Non sei il creatore di questo ticket e non sei neanche un membro dello staff, di conseguenza non puoi rimuovere membri da questo ticket.",
"title": "❌ Permessi insufficienti"
},
"not_a_ticket": {
"description": "Usa questo comando in un ticket, o menziona il canale.",
"title": "❌ Questo canale non è un ticket"
},
"removed": {
"description": "%s è stato rimosso da %s.",
"title": "✅ Membro rimosso"
}
}
},
"settings": {
"description": "Configura il bot discord dei ticket",
"name": "impostazioni"
},
"stats": {
"description": "Mostra le statistiche dei ticket",
"fields": {
"messages": "Messaggi",
"response_time": {
"minutes": "%s minuti",
"title": "Tempo di risposta media"
},
"tickets": "Ticket"
},
"name": "statistiche",
"response": {
"global": {
"description": "Statistiche sui ticket in tutti i server in cui viene utilizzata questa istanza di Discord Tickets.",
"title": "📊 Statistiche globali"
},
"guild": {
"description": "Statistiche sui ticket all'interno di questo server. Questi dati vengono salvati nella cache per un'ora.",
"title": "📊 Statistiche di questo server"
}
}
},
"survey": {
"description": "Guarda le risposte dei sondaggi",
"name": "sondaggio",
"response": {
"list": {
"title": "📃 Sondaggi"
}
}
},
"tag": {
"description": "Usa un tag per rispondere",
"name": "tag",
"response": {
"error": "❌ Errore",
"list": {
"title": "📃 Lista dei tag"
},
"missing": "Questo tag richiede i seguenti argomenti:\n%s",
"not_a_ticket": {
"description": "Questo tag può essere utilizzato solo all'interno di un ticket in quanto utilizza i riferimenti ai ticket.",
"title": "❌ Questo canale non è un ticket"
}
}
},
"topic": {
"description": "Cambia l'argomento di un ticket",
"name": "argomento",
"response": {
"changed": {
"description": "L'argomento di questo biglietto è stato modificato.",
"title": "✅ Argomento cambiato"
},
"not_a_ticket": {
"description": "Si prega di utilizzare questo comando in un ticket di cui si desidera modificare l'argomento.",
"title": "❌ Questo canale non è un ticket"
}
}
}
},
"message_will_be_deleted_in": "Questo messaggio verrà eliminato in %d secondi",
"missing_permissions": {
"description": "Non hai i permessi richiesti per utilizzare questo comando:\n%s",
"title": "❌"
},
"ticket": {
"claimed": {
"description": "Il ticket è in revisione da parte di %s.",
"title": "✅ Ticket assegnato"
},
"closed": {
"description": "Questo ticket è stato chiuso.\nIl canale verrà eliminato tra 5 secondi.",
"title": "✅ Ticket chiuso"
},
"closed_by_member": {
"description": "Questo ticket è stato chiuso da %s.\nIl canale verrà eliminato tra 5 secondi.",
"title": "✅ Ticket chiuso"
},
"closed_by_member_with_reason": {
"description": "Il ticket è stato chiuso da %s: `%s`\nIl canale verrà rimosso tra 5 secondi.",
"title": "✅ Ticket chiuso"
},
"closed_with_reason": {
"description": "Il ticket è stato chiuso da: `%s`\nIl canale verrà eliminato tra 5 secondi.",
"title": "✅ Ticket chiuso"
},
"member_added": {
"description": "%s è stato aggiunto da %s",
"title": "Membro aggiunto"
},
"member_removed": {
"description": "%s è stato rimosso da %s",
"title": "Membro rimosso"
},
"opening_message": {
"fields": {
"topic": "Argomento"
}
},
"questions": "Si prega di rispondere alle seguenti domande:\n\n%s",
"released": {
"description": "%s ha rilasciato il ticket.",
"title": "✅ Ticket rilasciato"
},
"survey": {
"complete": {
"description": "Grazie per il tuo feedback.",
"title": "✅ Grazie"
},
"start": {
"description": "Ehi, %s. Prima che questo canale sia eliminato, ti dispiacerebbe completare un sondaggio %ddomande rapide? Reagisci con ✅ per avviare il sondaggio, altrimenti ignora questo messaggio.",
"title": "❔ Feedback"
}
}
}
}

View File

@@ -1,344 +0,0 @@
{
"bot": {
"missing_permissions": {
"description": "디스코드 티켓은 해당 권한이 필요합니다:\n%s",
"title": "⚠️"
},
"version": "[디스코드 티켓](%s) v%s by [eartharoid](%s)"
},
"collector_expires_in": "%d 초 안에 만료됨",
"command_execution_error": {
"description": "명령을 실행하는 동안 예기치 않은 오류가 발생했습니다.\n자세한 내용은 관리자에게 콘솔 출력/로그를 확인 하도록 요청하십시오.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "티켓에 멤버 추가하기",
"name": "추가",
"options": {
"member": {
"description": "티켓에 추가할 멤버",
"name": "맴버"
},
"ticket": {
"description": "멤버를 추가할 티켓",
"name": "티켓"
}
},
"response": {
"added": {
"description": "%s 님에게 %s 를 추가 했습니다.",
"title": "✅ 맴버가 추가됨"
},
"no_member": {
"description": "추가하고 싶은 멤버를 멘션해 주세요.",
"title": "❌ 알수없는 맴버"
},
"no_permission": {
"description": "이 티켓의 제작자 및 직원이 아니므로, 회원을 추가할 수 없습니다.",
"title": "❌ Insufficient permission"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel, or mention the channel.",
"title": "❌ 여긴 티켓 채널이 아닙니다."
}
}
},
"blacklist": {
"description": "블랙리스트 보기 또는 수정",
"name": "블랙리스트",
"options": {
"remove": {
"name": "제거함",
"options": {
"member_or_role": {
"name": "맴버 또는 역할"
}
}
}
},
"response": {
"empty_list": {
"description": "There are no members or roles blacklisted. Type `%sblacklist <memberOrRole>` to add a member or role to the blacklist.",
"title": "📃 Blacklisted members and roles"
},
"illegal_action": {
"description": "%s is a staff member and cannot be blacklisted.",
"title": "❌ 당신은 맴버를 블랙리스트 화 시킬수 없습니다"
},
"list": {
"title": "📃 Blacklisted members and roles"
},
"member_added": {
"description": "<@%s> has been added to the blacklist. They will no longer be able to interact with the bot.",
"title": "✅ Added member to blacklist"
},
"member_removed": {
"description": "<@%s> has been removed from the blacklist. They can now use the bot again.",
"title": "✅ Removed member from blacklist"
},
"role_added": {
"description": "<@&%s> has been added to the blacklist. Members with this role will no longer be able to interact with the bot.",
"title": "✅ Added role to blacklist"
},
"role_removed": {
"description": "<@&%s> has been removed from the blacklist. Members with this role can now use the bot again.",
"title": "✅ Removed role from blacklist"
}
}
},
"close": {
"description": "Close a ticket channel",
"name": "close",
"response": {
"closed": {
"description": "Ticket #%s has been closed.",
"title": "✅ Ticket closed"
},
"closed_multiple": {
"description": [
"%d ticket has been closed.",
"%d tickets have been closed."
],
"title": [
"✅ Ticket closed",
"✅ Tickets closed"
]
},
"confirm": {
"description": "React with ✅ to close this ticket.",
"description_with_archive": "You will be able to view an archived version of it after.\nReact with ✅ to close this ticket.",
"title": "❔ Are you sure?"
},
"confirm_multiple": {
"description": [
"React with ✅ to close %d ticket.",
"React with ✅ to close %d tickets."
],
"title": "❔ Are you sure?"
},
"confirmation_timeout": {
"description": "You took too long to confirm.",
"title": "❌ Reaction time expired"
},
"invalid_time": {
"description": "The time period provided could not be parsed.",
"title": "❌ Invalid input"
},
"no_tickets": {
"description": "There are no tickets which have been inactive for this time period.",
"title": "❌ No tickets to close"
},
"not_a_ticket": {
"description": "Please use this command in a ticket channel or use the ticket flag.\nType `%shelp close` for more information.",
"title": "❌ This isn't a ticket channel"
},
"unresolvable": {
"description": "`%s` could not be resolved to a ticket. Please provide the ticket ID/mention or number.",
"title": "❌ Error"
}
}
},
"help": {
"description": "List commands you have access to, or find out more about a command",
"name": "help",
"response": {
"list": {
"description": "The commands you have access to are listed below. For more information about a command, type `{prefix}help [command]`. To create a ticket, type `{prefix}new [topic]`.",
"fields": {
"commands": "Commands"
},
"title": "❔ Help"
}
}
},
"new": {
"description": "Create a new ticket",
"name": "new",
"request_topic": {
"description": "Please briefly state what this ticket is about in a few words.",
"title": "Ticket topic"
},
"response": {
"created": {
"description": "Your ticket has been created: %s.",
"title": "✅ Ticket created"
},
"error": {
"title": "❌ Error"
},
"has_a_ticket": {
"description": "Please use your existing ticket (<#%s>) or close it before creating another.",
"title": "❌ You already have an open ticket"
},
"max_tickets": {
"description": "Please use `%sclose` to close any unneeded tickets.\n\n%s",
"title": "❌ You already have %d open tickets"
},
"no_categories": {
"description": "A server administrator must create at least one ticket category before a new ticket can be opened.",
"title": "❌ Can't create ticket"
},
"select_category": {
"description": "Select the category most relevant to your ticket's topic:\n\n%s",
"title": "🔤 Please select the ticket category"
},
"select_category_timeout": {
"description": "You took too long to select the ticket category.",
"title": "❌ Reaction time expired"
}
}
},
"panel": {
"description": "Create a new ticket panel",
"name": "panel",
"response": {
"invalid_category": {
"description": "One or more of the specified category IDs is invalid.",
"title": "❌ Invalid category"
}
}
},
"remove": {
"description": "Remove a member from a ticket",
"name": "remove",
"response": {
"no_member": {
"description": "Please mention the member you want to remove.",
"title": "❌ Unknown member"
},
"no_permission": {
"description": "You are not the creator of this ticket and you are not a staff member; you can't remove members from this ticket.",
"title": "❌ Insufficient permission"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel, or mention the channel.",
"title": "❌ This isn't a ticket channel"
},
"removed": {
"description": "%s has been removed from %s.",
"title": "✅ Member removed"
}
}
},
"settings": {
"description": "Configure Discord Tickets",
"name": "settings"
},
"stats": {
"description": "Display ticket statistics",
"fields": {
"messages": "Messages",
"response_time": {
"minutes": "%s minutes",
"title": "Avg. response time"
},
"tickets": "Tickets"
},
"name": "stats",
"response": {
"global": {
"description": "Statistics about tickets across all guilds where this Discord Tickets instance is used.",
"title": "📊 Global stats"
},
"guild": {
"description": "Statistics about tickets within this guild. This data is cached for an hour.",
"title": "📊 This server's stats"
}
}
},
"survey": {
"description": "View survey responses",
"name": "survey",
"response": {
"list": {
"title": "📃 Surveys"
}
}
},
"tag": {
"description": "Use a tag response",
"name": "tag",
"response": {
"error": "❌ Error",
"list": {
"title": "📃 Tag list"
},
"missing": "This tag requires the following arguments:\n%s",
"not_a_ticket": {
"description": "This tag can only be used within a ticket channel as it uses ticket references.",
"title": "❌ This isn't a ticket channel"
}
}
},
"topic": {
"description": "Change the topic of the ticket",
"name": "topic",
"response": {
"changed": {
"description": "This ticket's topic has been changed.",
"title": "✅ Topic changed"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel you want to change the topic of.",
"title": "❌ This isn't a ticket channel"
}
}
}
},
"message_will_be_deleted_in": "This message will be deleted in %d seconds",
"missing_permissions": {
"description": "You do not have the permissions required to use this command:\n%s",
"title": "❌"
},
"ticket": {
"claimed": {
"description": "%s has claimed this ticket.",
"title": "✅ Ticket claimed"
},
"closed": {
"description": "This ticket has been closed.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_by_member": {
"description": "This ticket has been closed by %s.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_by_member_with_reason": {
"description": "This ticket has been closed by %s: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_with_reason": {
"description": "This ticket has been closed: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"member_added": {
"description": "%s has been added by %s",
"title": "Member added"
},
"member_removed": {
"description": "%s has been removed by %s",
"title": "Member removed"
},
"opening_message": {
"fields": {
"topic": "Topic"
}
},
"questions": "Please answer the following questions:\n\n%s",
"released": {
"description": "%s has released this ticket.",
"title": "✅ Ticket released"
},
"survey": {
"complete": {
"description": "Thank you for your feedback.",
"title": "✅ Thank you"
},
"start": {
"description": "Hey, %s. Before this channel is deleted, would you mind completing a quick %d-question survey? React with ✅ to start, or ignore this message.",
"title": "❔ Feedback"
}
}
}
}

View File

@@ -1,402 +0,0 @@
{
"blacklisted": "❌ Je staat op de zwarte lijst",
"bot": {
"missing_permissions": {
"description": "Discord Tickets vereist de volgende machtigingen:\n%s",
"title": "⚠️"
},
"version": "[Discord Tickets] (%s) v%s door [eartharoid](%s)"
},
"collector_expires_in": "Verloopt over %d seconden",
"command_execution_error": {
"description": "Er is een onverwachte fout opgetreden tijdens de uitvoering van de opdracht.\nVraag een beheerder om de console-uitvoer / logboeken te controleren voor meer informatie.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Een lid toevoegen aan een ticket",
"name": "toevoegen",
"options": {
"member": {
"description": "Het lid is toegevoegd aan het ticket",
"name": "lid"
},
"ticket": {
"description": "Het ticket om het lid aan toe te voegen",
"name": "ticket"
}
},
"response": {
"added": {
"description": "%s is toegevoegd aan %s.",
"title": "✅ lid toegevoegd"
},
"no_member": {
"description": "Vermeld het lid dat u wilt toevoegen.",
"title": "❌ Onbekend lid"
},
"no_permission": {
"description": "U bent niet de maker van deze ticket en u bent geen werknemer, je kunt geen leden toevoegen aan deze ticket.",
"title": "❌ Onvoldoende rechten"
},
"not_a_ticket": {
"description": "Gebruik deze commando in het ticketkanaal of vermeld het kanaal.",
"title": "❌ Dit is geen ticketkanaal"
}
}
},
"blacklist": {
"description": "Bekijk of pas de zwarte lijst aan",
"name": "Blacklist",
"options": {
"add": {
"description": "Een member of rol aan de zwarte lijst",
"name": "toevoegen",
"options": {
"member_or_role": {
"description": "Een lid of rol toevoegen aan de zwarte lijst",
"name": "member_of_rol"
}
}
},
"remove": {
"description": "Verwijder een lid of rol van de zwarte lijst",
"name": "verwijder",
"options": {
"member_or_role": {
"description": "Een lid of rol verwijderen van de zwarte lijst",
"name": "lid_of_rol"
}
}
},
"show": {
"description": "Laat de leden en rollen zien die lid zijn van de zwarte lijst",
"name": "zien"
}
},
"response": {
"empty_list": {
"description": "Er zijn geen leden of rollen op de zwarte lijst. Type '%sblacklist <memberOrRole>' om een lid of rol aan de zwarte lijst toe te voegen.",
"title": "📃 leden en rollen op de blacklist"
},
"illegal_action": {
"description": "%s is een personeelslid en kan niet op de blacklist worden geplaatst.",
"title": "❌ Je kunt dit lid niet op de blacklist zetten"
},
"invalid": {
"description": "Dit lid of rol kan niet van de zwarte lijst worden gehaald omdat ze er niet op staan.",
"title": "❌ Fout"
},
"list": {
"fields": {
"members": "Leden",
"roles": "Rollen"
},
"title": "📃 leden en rollen op de blacklist"
},
"member_added": {
"description": "<@%s> is toegevoegd aan de blacklist. Ze kunnen niet langer communiceren met de bot.",
"title": "✅ Lid toegevoegd aan blacklist"
},
"member_removed": {
"description": "<@%s> is van de blacklist verwijderd. Ze kunnen de bot nu weer gebruiken.",
"title": "✅ Lid van blacklist verwijderd"
},
"role_added": {
"description": "<@&%s> is toegevoegd aan de blacklist. Leden met deze rol kunnen niet langer communiceren met de bot.",
"title": "✅ Rol toegevoegd aan blacklist"
},
"role_removed": {
"description": "<@&%s> is van de zwartelijst verwijderd. Leden met deze rol kunnen de bot nu opnieuw gebruiken.",
"title": "✅ Rol van blacklist verwijderd"
}
}
},
"close": {
"description": "Een ticketkanaal sluiten",
"name": "sluiten",
"options": {
"reason": {
"description": "De reden waarom je dit/deze ticket(s) sluit",
"name": "reden"
},
"ticket": {
"description": "Het ticket op te sluiten, of het nummer of het channel ID",
"name": "ticket"
},
"time": {
"description": "Sluit alle tickets inactieve tickets voor een gespecificieerde tijd",
"name": "tijd"
}
},
"response": {
"canceled": {
"description": "Je hebt de opdracht geannuleerd",
"title": "🚫 Geannuleerd"
},
"closed": {
"description": "Ticket #%s is gesloten.",
"title": "✅ Ticket gesloten"
},
"closed_multiple": {
"description": [
"%d ticket is gesloten.",
"%d tickets zijn gesloten."
],
"title": [
"✅ Ticket gesloten",
"✅ Tickets gesloten"
]
},
"confirm": {
"buttons": {
"cancel": "Annuleren",
"confirm": "Sluiten"
},
"description": "Reageer met ✅ om dit ticket af te sluiten.",
"description_with_archive": "U kunt er daarna een gearchiveerde versie van bekijken. Reageer met ✅ om dit ticket af te sluiten.",
"title": "❔ Weet je het zeker?"
},
"confirm_multiple": {
"buttons": {
"cancel": "Annuleren",
"confirm": [
"Sluit %d ticket",
"Sluit %d tickets"
]
},
"description": [
"Reageer met ✅ om %d ticket af te sluiten.",
"Reageer met ✅ om %d tickets af te sluiten."
],
"title": "❔ Weet je het zeker?"
},
"confirmation_timeout": {
"description": "Je deed er te lang over om het te bevestigen.",
"title": "❌ Interactietijd verstreken"
},
"invalid_time": {
"description": "De opgegeven periode kan niet worden geparseerd.",
"title": "❌ ongeldige invoer"
},
"no_permission": {
"description": "Je bent geen stafflid of eigenaar van dit ticket.",
"title": "❌ Onvoldoende rechten"
},
"no_tickets": {
"description": "Er zijn geen tickets die inactief zijn geweest voor deze periode.",
"title": "❌ Geen tickets om te sluiten"
},
"not_a_ticket": {
"description": "Gebruik deze commando in een ticketkanaal of gebruik de ticket emoji.\nType '%shelp sluiten' voor meer informatie.",
"title": "❌ Dit is geen ticketkanaal"
},
"unresolvable": {
"description": "'%s' kon niet worden omgezet in een ticket. Geef het ticket-ID/vermelding of nummer op.",
"title": "❌ fout"
}
}
},
"help": {
"description": "Opdrachten weergeven waar u toegang toe heeft, of meer informatie over een opdracht",
"name": "help",
"response": {
"list": {
"description": "De commandos waar u toegang toe hebt, worden hieronder vermeld. Typ '{prefix}help [command]' voor meer informatie over een commando. Als u een ticket wilt maken, typt u '{prefix}new [topic]'.",
"fields": {
"commands": "Commandos"
},
"title": "❔ Help"
}
}
},
"new": {
"description": "Een nieuw ticket maken",
"name": "new",
"request_topic": {
"description": "Geef in een paar woorden kort aan waar deze ticket over gaat.",
"title": "Ticket onderwerp"
},
"response": {
"created": {
"description": "Uw ticket is aangemaakt: %s.",
"title": "✅ ticket gemaakt"
},
"error": {
"title": "❌ fout"
},
"has_a_ticket": {
"description": "Gebruik uw bestaande ticket (<#%s>) of sluit uw oude ticket voordat u een ander ticket maakt.",
"title": "❌ Je hebt al een ticket open staan"
},
"max_tickets": {
"description": "Gebruik '%ssluiten' om onnodige tickets te sluiten.\n\n%s",
"title": "❌ Je hebt al %d geopende tickets"
},
"no_categories": {
"description": "Een serverbeheerder moet ten minste één ticketcategorie maken voordat er een nieuw ticket kan worden geopend.",
"title": "❌ Kan geen ticket maken"
},
"select_category": {
"description": "Selecteer de categorie die het meest relevant is voor het onderwerp van uw ticket:\n\n%s",
"title": "🔤 Selecteer de ticketcategorie"
},
"select_category_timeout": {
"description": "Het duurde te lang om de ticketcategorie te selecteren.",
"title": "❌ Reactietijd verstreken"
}
}
},
"panel": {
"description": "Een nieuw ticketpaneel maken",
"name": "paneel",
"response": {
"invalid_category": {
"description": "Een of meer van de opgegeven categorie-ID's zijn ongeldig.",
"title": "❌ ongeldige categorie"
}
}
},
"remove": {
"description": "Een lid uit een ticket verwijderen",
"name": "verwijderen",
"response": {
"no_member": {
"description": "Vermeld het lid dat u wilt verwijderen.",
"title": "❌ Onbekend lid"
},
"no_permission": {
"description": "U bent niet de maker van dit ticket en u bent geen werknemer, je kunt geen leden van deze ticket verwijderen.",
"title": "❌ Onvoldoende rechten"
},
"not_a_ticket": {
"description": "Gebruik deze commando in het ticketkanaal of vermeld het kanaal.",
"title": "❌ Dit is geen ticketkanaal"
},
"removed": {
"description": "%s is verwijderd uit %s.",
"title": "✅ lid verwijderd"
}
}
},
"settings": {
"description": "Discord-tickets configureren",
"name": "instellingen"
},
"stats": {
"description": "Ticketstatistieken weergeven",
"fields": {
"messages": "Berichten",
"response_time": {
"minutes": "%s minuten",
"title": "Gemiddelde reactietijd"
},
"tickets": "Tickets"
},
"name": "statistieken",
"response": {
"global": {
"description": "Statistieken over tickets in alle gilden waar dit Discord Tickets-exemplaar wordt gebruikt.",
"title": "📊 Wereldwijde statistieken"
},
"guild": {
"description": "Statistieken over tickets binnen deze gilde. Deze gegevens worden een uur in de cache opgeslagen.",
"title": "📊 De statistieken van deze server"
}
}
},
"survey": {
"description": "Enquêtereacties weergeven",
"name": "enquête",
"response": {
"list": {
"title": "📃 enquêtes"
}
}
},
"tag": {
"description": "Een tagrespons gebruiken",
"name": "label",
"response": {
"error": "❌ fout",
"list": {
"title": "📃 Tag lijst"
},
"missing": "Deze tag vereist de volgende argumenten:\n%s",
"not_a_ticket": {
"description": "Deze tag kan alleen worden gebruikt binnen een ticketkanaal omdat deze ticketreferenties gebruikt.",
"title": "❌ Dit is geen ticketkanaal"
}
}
},
"topic": {
"description": "Het onderwerp van het ticket wijzigen",
"name": "onderwerp",
"response": {
"changed": {
"description": "Het onderwerp van dit ticket is gewijzigd.",
"title": "✅ Onderwerp gewijzigd"
},
"not_a_ticket": {
"description": "Gebruik deze opdracht in het ticketkanaal waarvan u het onderwerp wilt wijzigen.",
"title": "❌ Dit is geen ticketkanaal"
}
}
}
},
"message_will_be_deleted_in": "Dit bericht wordt binnen %d seconden verwijderd",
"missing_permissions": {
"description": "U beschikt niet over de machtigingen die nodig zijn om deze opdracht te gebruiken:\n%s",
"title": "❌"
},
"ticket": {
"claimed": {
"description": "%s heeft dit ticket opgeëist.",
"title": "✅ Ticket geclaimd"
},
"closed": {
"description": "Deze ticket is gesloten.\nHet kanaal wordt binnen 5 seconden verwijderd.",
"title": "✅ Ticket gesloten"
},
"closed_by_member": {
"description": "Deze ticket is gesloten door %s.\nHet kanaal wordt binnen 5 seconden verwijderd.",
"title": "✅ Ticket gesloten"
},
"closed_by_member_with_reason": {
"description": "Deze ticket is gesloten door %s: '%s'\nHet kanaal wordt binnen 5 seconden verwijderd.",
"title": "✅ Ticket gesloten"
},
"closed_with_reason": {
"description": "Deze ticket is gesloten: '%s'\nHet kanaal wordt binnen 5 seconden verwijderd.",
"title": "✅ Ticket gesloten"
},
"member_added": {
"description": "%s is toegevoegd door %s",
"title": "Lid toegevoegd"
},
"member_removed": {
"description": "%s is verwijderd door %s",
"title": "Lid verwijderd"
},
"opening_message": {
"fields": {
"topic": "Onderwerp"
}
},
"questions": "Beantwoord de volgende vragen:\n\n%s",
"released": {
"description": "%s heeft deze ticket vrijgegeven.",
"title": "✅ Ticket vrijgegeven"
},
"survey": {
"complete": {
"description": "Bedankt voor uw feedback.",
"title": "✅ Dank u"
},
"start": {
"description": "Hey %s. Voordat dit kanaal wordt verwijderd, wilt u een snelle %d-vragen enquête invullen? Reageer met ✅ om dit bericht te starten of negeer dit bericht.",
"title": "❔ Feedback"
}
}
}
}

View File

@@ -1,324 +0,0 @@
{
"bot": {
"missing_permissions": {
"description": "Discord-billetter krever følgende tilganger:\n%s",
"title": "⚠️"
},
"version": "[Discord Tickets](%s) v%s av [eartharoid](%s)"
},
"collector_expires_in": "Utløper om %d sekunder",
"command_execution_error": {
"description": "Det oppstod en uventet feil under kommandoutførelsen.\nBe en administrator kontrollere konsollutdataene/-loggene for mer informasjon.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Add a member to a ticket",
"name": "legg til",
"response": {
"added": {
"description": "%s har blitt lagt til i %s.",
"title": "✅ Medlem lagt til"
},
"no_member": {
"description": "Nevn medlemmet du ønsker å legge til.",
"title": "❌ Ukjent medlem"
},
"no_permission": {
"description": "You are not the creator of this ticket and you are not a staff member; you can't add members to this ticket.",
"title": "❌ Utilstrekkelige tilganger"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel, or mention the channel.",
"title": "❌ This isn't a ticket channel"
}
}
},
"blacklist": {
"description": "Svarteliste/fjerne fra svarteliste et medlem fra og bruke denne botten",
"name": "svarteliste",
"response": {
"empty_list": {
"description": "Det er ingen medlemmer eller roller svartelistet. Skriv `%sblacklist <memberOrRole>` for og legge til et medlem eller rolle til svartelisten.",
"title": "📃 Svartelistet medlemmer og roller"
},
"illegal_action": {
"description": "%s er en moderator og kan ikke bli svartelistet.",
"title": "❌ Du kan ikke svarteliste dette medlemmet"
},
"list": {
"title": "📃 Svartelistet medlemmer og roller"
},
"member_added": {
"description": "<@%s> har blitt lagt til i svartelisten. De kan ikke lengre bruke botten.",
"title": "✅ La til medlemmet i svartelisten"
},
"member_removed": {
"description": "<@%s> har blitt fjernet fra svartelisten. De kan nå bruke botten igjen.",
"title": "✅ Fjernet medlemmet fra svartelisten"
},
"role_added": {
"description": "<@&%s> er lagt til i svartelisten. Medlemmer med denne rollen vil ikke lenger kunne bruke botten.",
"title": "✅ La til rollen i svartelisten"
},
"role_removed": {
"description": "<@&%s> er fjernet fra svartelisten. Medlemmer med denne rollen kan nå bruke botten igjen.",
"title": "✅ Fjernet rollen fra svartelisten"
}
}
},
"close": {
"description": "Lukke en billettkanal",
"name": "lukk",
"response": {
"closed": {
"description": "Billett #%s har blitt stengt.",
"title": "✅ Billetten er stengt"
},
"closed_multiple": {
"description": [
"%d billett har blitt stengt.",
"%d billetter har blitt stengt."
],
"title": [
"✅ Billetten er stengt",
"✅ Billetter lukket"
]
},
"confirm": {
"description": "Reager med ✅ for å stenge denne billetten.",
"description_with_archive": "You will be able to view an archived version of it after.\nReact with ✅ to close this ticket.",
"title": "❔ Er du sikker?"
},
"confirm_multiple": {
"description": [
"Reager med ✅ for å stenge %d billett.",
"Reager med ✅ for å stenge %d billetter."
],
"title": "❔ Er du sikker?"
},
"confirmation_timeout": {
"description": "Du brukte for lang tid på å bekrefte.",
"title": "❌ Reaksjonstiden har utløpt"
},
"invalid_time": {
"description": "The time period provided could not be parsed.",
"title": "❌ Ugyldig inndata"
},
"no_tickets": {
"description": "There are no tickets which have been inactive for this time period.",
"title": "❌ Ingen billetter å lukke"
},
"not_a_ticket": {
"description": "Please use this command in a ticket channel or use the ticket flag.\nType `%shelp close` for more information.",
"title": "❌ Dette er ikke en billett-kanal"
},
"unresolvable": {
"description": "`%s` could not be resolved to a ticket. Please provide the ticket ID/mention or number.",
"title": "❌ Feil"
}
}
},
"help": {
"description": "List commands you have access to, or find out more about a command",
"name": "hjelp",
"response": {
"list": {
"description": "The commands you have access to are listed below. For more information about a command, type `{prefix}help [command]`. To create a ticket, type `{prefix}new [topic]`.",
"fields": {
"commands": "Kommandoer"
},
"title": "❔ Hjelp"
}
}
},
"new": {
"description": "Opprett en ny billett",
"name": "ny",
"request_topic": {
"description": "Vennligst oppgi kort hva denne billetten handler om med noen få ord.",
"title": "Billettemne"
},
"response": {
"created": {
"description": "Billetten er opprettet: %s.",
"title": "✅ Billetten er opprettet"
},
"error": {
"title": "❌ Feil"
},
"has_a_ticket": {
"description": "Bruk din eksisterende billett ( <#%s>) eller lukk den før du oppretter en ny.",
"title": "❌ Du har allerede en åpen billett"
},
"max_tickets": {
"description": "Bruk «%sclose» for å lukke unødvendige billetter.\n\n%s",
"title": "❌ Du har allerede %d åpne billetter"
},
"no_categories": {
"description": "En tjeneradministrator må opprette minst én billettkategori før en ny billett kan åpnes.",
"title": "❌ Kan ikke opprette billett"
},
"select_category": {
"description": "Velg kategorien som er mest relevant for billettens emne:\n\n%s",
"title": "🔤 Velg billettkategori"
},
"select_category_timeout": {
"description": "Det tok for lang tid å velge billettkategorien.",
"title": "❌ Reaksjonstiden har utløpt"
}
}
},
"panel": {
"description": "Create a new ticket panel",
"name": "panel",
"response": {
"invalid_category": {
"description": "One or more of the specified category IDs is invalid.",
"title": "❌ Ugyldig kategori"
}
}
},
"remove": {
"description": "Fjern et medlem fra en billett",
"name": "fjern",
"response": {
"no_member": {
"description": "Nevn medlemmet du ønsker å fjerne.",
"title": "❌ Ukjent medlem"
},
"no_permission": {
"description": "You are not the creator of this ticket and you are not a staff member; you can't remove members from this ticket.",
"title": "❌ Utilstrekkelige tilganger"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel, or mention the channel.",
"title": "❌ Dette er ikke en billettkanal"
},
"removed": {
"description": "%s har blitt fjernet fra %s.",
"title": "✅ Medlem fjernet"
}
}
},
"settings": {
"description": "Sett opp Discord-billetter",
"name": "innstillinger"
},
"stats": {
"description": "Vis billett-statistikk",
"fields": {
"messages": "Meldinger",
"response_time": {
"minutes": "%s minutter",
"title": "Avg. response time"
},
"tickets": "Billetter"
},
"name": "statistikk",
"response": {
"global": {
"description": "Statistics about tickets across all guilds where this Discord Tickets instance is used.",
"title": "📊 Global stats"
},
"guild": {
"description": "Statistics about tickets within this guild. This data is cached for an hour.",
"title": "📊 This server's stats"
}
}
},
"survey": {
"description": "View survey responses",
"name": "survey",
"response": {
"list": {
"title": "📃 Surveys"
}
}
},
"tag": {
"description": "Use a tag response",
"name": "tag",
"response": {
"error": "❌ Error",
"list": {
"title": "📃 Tag list"
},
"missing": "This tag requires the following arguments:\n%s",
"not_a_ticket": {
"description": "This tag can only be used within a ticket channel as it uses ticket references.",
"title": "❌ Dette er ikke en billettkanal"
}
}
},
"topic": {
"description": "Change the topic of the ticket",
"name": "emne",
"response": {
"changed": {
"description": "This ticket's topic has been changed.",
"title": "✅ Emne endret"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel you want to change the topic of.",
"title": "❌ Dette er ikke en billettkanal"
}
}
}
},
"message_will_be_deleted_in": "Denne meldingen vil bli slettet om %d sekunder",
"missing_permissions": {
"description": "You do not have the permissions required to use this command:\n%s",
"title": "❌"
},
"ticket": {
"claimed": {
"description": "%s has claimed this ticket.",
"title": "✅ Ticket claimed"
},
"closed": {
"description": "This ticket has been closed.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Billetten er stengt"
},
"closed_by_member": {
"description": "This ticket has been closed by %s.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Billetten er stengt"
},
"closed_by_member_with_reason": {
"description": "This ticket has been closed by %s: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Billetten er stengt"
},
"closed_with_reason": {
"description": "This ticket has been closed: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Billetten er stengt"
},
"member_added": {
"description": "%s has been added by %s",
"title": "Member added"
},
"member_removed": {
"description": "%s has been removed by %s",
"title": "Member removed"
},
"opening_message": {
"fields": {
"topic": "Emne"
}
},
"questions": "Please answer the following questions:\n\n%s",
"released": {
"description": "%s has released this ticket.",
"title": "✅ Ticket released"
},
"survey": {
"complete": {
"description": "Takk for din tilbakemelding.",
"title": "✅ Takk"
},
"start": {
"description": "Hey, %s. Before this channel is deleted, would you mind completing a quick %d-question survey? React with ✅ to start, or ignore this message.",
"title": "❔ Tilbakemelding"
}
}
}
}

View File

@@ -1,348 +0,0 @@
{
"blacklisted": "❌Jesteś na czarnej liście",
"bot": {
"missing_permissions": {
"description": "DiscordTickets potrzebuje tych uprawnień:\n%s",
"title": "⚠️"
},
"version": "[Discord Tickets](%s) v%s by [eartharoid](%s)"
},
"collector_expires_in": "Wygasa w ciągu %d sekund",
"command_execution_error": {
"description": "Wystąpił nieoczekiwany błąd podczas wykonywania polecenia.\nPoproś administratora o sprawdzenie konsoli / logów w celu uzyskania szczegółów.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Dodaj użytkownika do ticketu",
"name": "dodaj",
"response": {
"added": {
"description": "%s został dodany do %s.",
"title": "✅ Użytkownik dodany"
},
"no_member": {
"description": "Wspomnij o osobie, którą chcesz dodać.",
"title": "❌ Nieznany użytkownik"
},
"no_permission": {
"description": "Nie jesteś twórca tego ticketum, ani nie jesteś administratorem. Nie możesz dodać osób do tego ticketu.",
"title": "❌ Niewystarczające uprawnienia"
},
"not_a_ticket": {
"description": "Użyj tej komendy na kanale ticketu lub wspomnij o kanale.",
"title": "❌ To nie jest kanał ticketu"
}
}
},
"blacklist": {
"description": "Wyświetl lub zmodyfikuj czarną listę",
"name": "blacklist",
"options": {
"show": {
"description": "Pokaż użytkowników i role na czarnej liście",
"name": "pokaż"
}
},
"response": {
"empty_list": {
"description": "Nie ma żadnych osób i roli, które są zblacklistowane. Wpisz `%sblacklist <memberOrRole>`, aby dodać osobę lub role do blacklisty.",
"title": "📃 osoby i role, które są zblacklistowane"
},
"illegal_action": {
"description": "%s jest administratorem i nie może zostać zblacklistowany.",
"title": "❌ Nie możesz zblacklistować tej osoby"
},
"invalid": {
"title": "❌ Błąd"
},
"list": {
"title": "📃 osoby i role, które są zblacklistowane"
},
"member_added": {
"description": "<@%s> została dodana do czarnej listy. Nie będą już mogli wchodzić w interakcje z botem.",
"title": "✅ Dodano osobę do czarnej listy"
},
"member_removed": {
"description": "<@%s> został usunięty z czarnej listy. Teraz mogą ponownie użyć bota.",
"title": "✅ Osoba została usunięta z blacklisty"
},
"role_added": {
"description": "<@&%s> została dodana do blacklisty. Osoby z tej roli nie będą już mogli wchodzić w interakcje z botem.",
"title": "✅ Dodano rolę do blacklisty"
},
"role_removed": {
"description": "<@&%s> został usunięty z blacklisty. Osoby z tej roli mogą teraz użyć bota ponownie.",
"title": "✅ Usunięto rolę z blacklisty"
}
}
},
"close": {
"description": "Close a ticket channel",
"name": "zamknij",
"options": {
"reason": {
"name": "powód"
}
},
"response": {
"canceled": {
"title": "🚫 Anulowane"
},
"closed": {
"description": "Ticket #%s has been closed.",
"title": "✅ Ticket closed"
},
"closed_multiple": {
"description": [
"%d ticket has been closed.",
"%d tickets have been closed."
],
"title": [
"✅ Ticket zamknięty",
"✅ Tickets closed"
]
},
"confirm": {
"buttons": {
"cancel": "Anuluj"
},
"description": "Proszę potwierdź swoją decyzję.",
"description_with_archive": "You will be able to view an archived version of it after.\nReact with ✅ to close this ticket.",
"title": "❔ Jesteś pewien?"
},
"confirm_multiple": {
"description": [
"React with ✅ to close %d ticket.",
"React with ✅ to close %d tickets."
],
"title": "❔ Jesteś pewien?"
},
"confirmation_timeout": {
"description": "You took too long to confirm.",
"title": "❌ Reaction time expired"
},
"invalid_time": {
"description": "The time period provided could not be parsed.",
"title": "❌ Invalid input"
},
"no_permission": {
"title": "❌ Niewystarczające pozwolenie"
},
"no_tickets": {
"description": "There are no tickets which have been inactive for this time period.",
"title": "❌ No tickets to close"
},
"not_a_ticket": {
"description": "Please use this command in a ticket channel or use the ticket flag.\nType `%shelp close` for more information.",
"title": "❌ To nie jest kanał ticketu"
},
"unresolvable": {
"description": "`%s` could not be resolved to a ticket. Please provide the ticket ID/mention or number.",
"title": "❌ Error"
}
}
},
"help": {
"description": "List commands you have access to, or find out more about a command",
"name": "help",
"response": {
"list": {
"description": "The commands you have access to are listed below. For more information about a command, type `{prefix}help [command]`. To create a ticket, type `{prefix}new [topic]`.",
"fields": {
"commands": "Komendy"
},
"title": "❔ Help"
}
}
},
"new": {
"description": "Create a new ticket",
"name": "new",
"request_topic": {
"description": "Proszę krótko opisać ten ticket.",
"title": "Temat ticketu"
},
"response": {
"created": {
"description": "Your ticket has been created: %s.",
"title": "✅ Ticket utworzony"
},
"error": {
"title": "❌ Błąd"
},
"has_a_ticket": {
"description": "Użyj istniejącego ticketu <#(%s>) lub zamknij go przed utworzeniem innego.",
"title": "❌ Masz już otwarty ticket"
},
"max_tickets": {
"description": "Użyj `%sclose`, aby zamknąć niepotrzebne tickety.\n\n%s",
"title": "❌ Masz już %d otwartych ticketów"
},
"no_categories": {
"description": "Administrator serwera musi utworzyć co najmniej jedną kategorię ticketu przed otwarciem nowego.",
"title": "❌ Nie można stworzyć ticketu"
},
"select_category": {
"description": "Wybierz kategorię najbardziej odpowiednią dla tematu ticketu:\n\n%s",
"title": "🔤 Proszę wybrać kategorię ticketu"
},
"select_category_timeout": {
"description": "Wybór kategorii ticketu trwał zbyt długo.",
"title": "❌ Reaction time expired"
}
}
},
"panel": {
"description": "Tworzenie nowego panelu ticketów",
"name": "panel",
"response": {
"invalid_category": {
"description": "Co najmniej jeden z określonych ID kategorii jest nieprawidłowy.",
"title": "❌ Nieprawidłowa kategoria"
}
}
},
"remove": {
"description": "Usuń osobę z ticketu",
"name": "usuń",
"response": {
"no_member": {
"description": "Proszę wspomnieć o osobie, którą chcesz usunąć.",
"title": "❌ Nieznany użytkownik"
},
"no_permission": {
"description": "Nie jesteś twórcą tego biletu i nie jesteś administratorem; nie można usunąć osób z tego ticketu.",
"title": "❌ Niewystarczające uprawnienia"
},
"not_a_ticket": {
"description": "Użyj tej komendy na kanale ticketu lub wspomnij o kanale.",
"title": "❌ To nie jest kanał ticketu"
},
"removed": {
"description": "%s został usunięty z %s.",
"title": "✅ osoba usunięta"
}
}
},
"settings": {
"description": "Configure Discord Tickets",
"name": "settings"
},
"stats": {
"description": "Display ticket statistics",
"fields": {
"messages": "Messages",
"response_time": {
"minutes": "%s minutes",
"title": "Avg. response time"
},
"tickets": "Tickets"
},
"name": "stats",
"response": {
"global": {
"description": "Statistics about tickets across all guilds where this Discord Tickets instance is used.",
"title": "📊 Global stats"
},
"guild": {
"description": "Statistics about tickets within this guild. This data is cached for an hour.",
"title": "📊 This server's stats"
}
}
},
"survey": {
"description": "View survey responses",
"name": "survey",
"response": {
"list": {
"title": "📃 Surveys"
}
}
},
"tag": {
"description": "Use a tag response",
"name": "tag",
"response": {
"error": "❌ Error",
"list": {
"title": "📃 Tag list"
},
"missing": "This tag requires the following arguments:\n%s",
"not_a_ticket": {
"description": "This tag can only be used within a ticket channel as it uses ticket references.",
"title": "❌ To nie jest kanał ticketu"
}
}
},
"topic": {
"description": "Change the topic of the ticket",
"name": "topic",
"response": {
"changed": {
"description": "This ticket's topic has been changed.",
"title": "✅ Topic changed"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel you want to change the topic of.",
"title": "❌ To nie jest kanał ticketu"
}
}
}
},
"message_will_be_deleted_in": "This message will be deleted in %d seconds",
"missing_permissions": {
"description": "You do not have the permissions required to use this command:\n%s",
"title": "❌"
},
"ticket": {
"claimed": {
"description": "%s has claimed this ticket.",
"title": "✅ Ticket claimed"
},
"closed": {
"description": "This ticket has been closed.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_by_member": {
"description": "This ticket has been closed by %s.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_by_member_with_reason": {
"description": "This ticket has been closed by %s: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_with_reason": {
"description": "This ticket has been closed: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"member_added": {
"description": "%s has been added by %s",
"title": "Member added"
},
"member_removed": {
"description": "%s has been removed by %s",
"title": "Member removed"
},
"opening_message": {
"fields": {
"topic": "Topic"
}
},
"questions": "Please answer the following questions:\n\n%s",
"released": {
"description": "%s has released this ticket.",
"title": "✅ Ticket released"
},
"survey": {
"complete": {
"description": "Thank you for your feedback.",
"title": "✅ Thank you"
},
"start": {
"description": "Hey, %s. Before this channel is deleted, would you mind completing a quick %d-question survey? React with ✅ to start, or ignore this message.",
"title": "❔ Feedback"
}
}
}
}

View File

@@ -1,324 +0,0 @@
{
"bot": {
"missing_permissions": {
"description": "O Bot necessita das seguintes permissões:\n%s",
"title": "⚠️"
},
"version": "[Discord Tickets](%s) v%s feito por [eartharoid](%s)"
},
"collector_expires_in": "Expira em %d segundos",
"command_execution_error": {
"description": "Ocorreu um erro inesperado durante a execução do comando. \nPor favor, peça a um administrador para verificar os logs do console para obter detalhes.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Adicionar um usuário ao ticket",
"name": "adicionar",
"response": {
"added": {
"description": "%s foi adicionado ao ticket %s.",
"title": "✅ Membro adicionado"
},
"no_member": {
"description": "Por favor, mencione o membro que quer adicionar.",
"title": "❌ Membro não encontrado"
},
"no_permission": {
"description": "Você não é o criador deste ticket e não é um membro da staff; você não pode adicionar membros a este ticket.",
"title": "❌ Você não tem permissão"
},
"not_a_ticket": {
"description": "Use este comando no canal do ticket ou mencione o canal.",
"title": "❌ Este não é um canal de ticket"
}
}
},
"blacklist": {
"description": "Blacklist/unblacklist um membro de interagir com o bot",
"name": "blacklist",
"response": {
"empty_list": {
"description": "Não há membros ou cargos na blacklist. Digite '%sblacklist <memberOrRole>' para adicionar um membro ou cargo à blacklist.",
"title": "📃 Utilizadores e cargos na blacklist"
},
"illegal_action": {
"description": "%s é um membro da staff e não pode ser colocado na blacklist.",
"title": "❌ Você não pode colocar este membro na blacklist"
},
"list": {
"title": "📃 Usuários da blacklist"
},
"member_added": {
"description": "<@%s> foi adicionado à blacklist. Eles não serão mais capazes de interagir com o bot.",
"title": "✅ Membro adicionado à blacklist"
},
"member_removed": {
"description": "<@%s> foi removido da blacklist. Agora eles podem usar o bot novamente.",
"title": "✅ Membro removido da lista negra"
},
"role_added": {
"description": "<@&%s> foi adicionado à blacklist. Eles não serão mais capazes de interagir com o bot.",
"title": "✅ Cargo adicionado à blacklist"
},
"role_removed": {
"description": "<@&%s> foi removido da blacklist. Membros com esta função agora podem usar o bot novamente.",
"title": "✅ Cargo removido da lista negra"
}
}
},
"close": {
"description": "Feche um canal de ticket",
"name": "fechar",
"response": {
"closed": {
"description": "Ticket #%s foi fechado.",
"title": "✅ Ticket fechado"
},
"closed_multiple": {
"description": [
"%d ticket foi fechado",
"%d tickets foram fechados"
],
"title": [
"✅ Ticket fechado",
"✅ Tickets fechados"
]
},
"confirm": {
"description": "Reaja com ✅ para confirmar",
"description_with_archive": "Você poderá ver uma versão arquivada dele depois.\nReaja com ✅ para fechar o ticket",
"title": "❔ Deseja realmente fechar o ticket?"
},
"confirm_multiple": {
"description": [
"Reaja com ✅ para fechar %d ticket.",
"Reaja com ✅ para fechar %d tickets."
],
"title": "❔ Deseja realmente fechar o ticket?"
},
"confirmation_timeout": {
"description": "Você demorou muito para confirmar.",
"title": "❌ Tempo de reação expirado"
},
"invalid_time": {
"description": "O período de tempo não pode ser análisado",
"title": "❌ Entrada inválida"
},
"no_tickets": {
"description": "Não há tickets inativos neste período.",
"title": "❌ Nenhum ticket para fechar"
},
"not_a_ticket": {
"description": "Use este comando em um canal de ticket ou use o sinalizador de ticket.\nUse `%shelp close` para mais informações",
"title": "❌ Este não é um canal de ticket"
},
"unresolvable": {
"description": "`%s` não pôde ser resolvido para um ticket. Forneça a ID / menção ou número do ticket.",
"title": "❌ Erro"
}
}
},
"help": {
"description": "Lista de comandos que tens acesso, ou encontra mais informações sobre um comando",
"name": "ajuda",
"response": {
"list": {
"description": "Os comandos que tens acesso estão os que estão abaixo. Para mais informações acerca de um comando, escreve `{prefix}ajuda [comando]`. Para criar um ticket, escreve `{prefix}novo [motivo]`.",
"fields": {
"commands": "Comandos"
},
"title": "❔ Ajuda"
}
}
},
"new": {
"description": "Criar um novo Ticket",
"name": "novo",
"request_topic": {
"description": "Por favor, descreva resumidamente do que se trata este ticket em poucas palavras.",
"title": "Assunto do Ticket"
},
"response": {
"created": {
"description": "Seu ticket foi criado: %s.",
"title": "✅ Ticket criado"
},
"error": {
"title": "❌ Erro"
},
"has_a_ticket": {
"description": "Por favor, use o seu ticket existente (<#%s>) ou feche-o antes de criar outro.",
"title": "❌ Você já tem um ticket aberto"
},
"max_tickets": {
"description": "Use `%sclose` para fechar todos os tickets desnecessários.\n\n%s",
"title": "❌ Você já tem %d tickets abertos"
},
"no_categories": {
"description": "Um administrador do servidor deve criar pelo menos uma categoria de ticket antes que um novo ticket possa ser aberto.",
"title": "❌ Não é possível criar ticket"
},
"select_category": {
"description": "Selecione a categoria mais relevante para o tópico do seu ticket:\n\n%s",
"title": "🔤 Selecione a categoria do ticket"
},
"select_category_timeout": {
"description": "Você demorou muito para selecionar a categoria do ticket.",
"title": "❌ Tempo de reação expirado"
}
}
},
"panel": {
"description": "Cria um novo painel de tickets",
"name": "painel",
"response": {
"invalid_category": {
"description": "Um ou mais IDs de categorias são inválidos.",
"title": "❌ Categoria Inválida"
}
}
},
"remove": {
"description": "Remove um mebro de um ticket",
"name": "remover",
"response": {
"no_member": {
"description": "Por favor menciona o membro que queres remover.",
"title": "❌ Membro não encontrado"
},
"no_permission": {
"description": "Não és o criador do ticket nem um mebro da staff; não consegues remover membros deste ticket.",
"title": "❌ Você não tem permissões"
},
"not_a_ticket": {
"description": "Use este comando no canal do ticket ou mencione o canal.",
"title": "❌ Este não é um canal de tickets"
},
"removed": {
"description": "%s foi removido de %s.",
"title": "✅ Membro removido"
}
}
},
"settings": {
"description": "Configurar o BOT",
"name": "settings"
},
"stats": {
"description": "Mostra as estatísticas dos tickets",
"fields": {
"messages": "Mensagens",
"response_time": {
"minutes": "%s minutos",
"title": "Tempo médio de resposta"
},
"tickets": "Tickets"
},
"name": "Estatísticas",
"response": {
"global": {
"description": "Estatísticas sobre tickets em todos os servidores onde esta instância do bot de tickets é usada.",
"title": "📊 Estatísticas globais"
},
"guild": {
"description": "Estatísticas acerca dos tickets neste servidor. Esta informação é guardada na cache por 1 hora.",
"title": "📊 Estatísticas deste servidor"
}
}
},
"survey": {
"description": "Vê respostas dos questionários",
"name": "questionario",
"response": {
"list": {
"title": "📃 Questionários"
}
}
},
"tag": {
"description": "Usa uma resposta de tag",
"name": "tag",
"response": {
"error": "❌ Erro",
"list": {
"title": "📃 Lista de Tags"
},
"missing": "Esta tag necessita dos seguintes argumentos:\n%s",
"not_a_ticket": {
"description": "Esta tag só pode ser usada num ticket pois usa referências do mesmo.",
"title": "❌ Este não é um canal de ticket"
}
}
},
"topic": {
"description": "Altera o motivo do ticket",
"name": "motivo",
"response": {
"changed": {
"description": "O motivo do ticket foi alterado",
"title": "✅ Motivo alterado"
},
"not_a_ticket": {
"description": "Por favor usa este comando no ticket ao qual queres mudar o motivo.",
"title": "❌ Este não é um canal de ticket"
}
}
}
},
"message_will_be_deleted_in": "Essa mensagem será apagada em %d segundos",
"missing_permissions": {
"description": "Você não tem as permissões necessárias para usar este comando:\n%s",
"title": "❌"
},
"ticket": {
"claimed": {
"description": "%s has claimed this ticket.",
"title": "✅ Ticket reivindicado"
},
"closed": {
"description": "Ticket fechado.\nO canal será apagado daqui a 5 segundos",
"title": "✅ Ticket fechado"
},
"closed_by_member": {
"description": "Ticket fechado por %s.\nO ticket será apagado daqui a 5 segundos",
"title": "✅ Ticket fechado"
},
"closed_by_member_with_reason": {
"description": "Ticket fechado por %s, motivo: `%s`\nO canal será apagado daqui a 5 segundos",
"title": "✅ Ticket fechado"
},
"closed_with_reason": {
"description": "Ticket foi fechado, motivo: `%s`\nO canal será apagado daqui a 5 segundos",
"title": "✅ Ticket fechado"
},
"member_added": {
"description": "%s foi adicionado ao ticket %s",
"title": "Utilizador adicionado"
},
"member_removed": {
"description": "%s foi removido do ticket por %s",
"title": "Utilizador removido"
},
"opening_message": {
"fields": {
"topic": "Motivo"
}
},
"questions": "Por favor responda as seguintes questões:\n\n%s",
"released": {
"description": "%s libertou o ticket.",
"title": "✅ Ticket libertado"
},
"survey": {
"complete": {
"description": "Obrigado pelo seu feedback.",
"title": "✅ Obrigado"
},
"start": {
"description": "Olha, %s. Antes deste canal ser apagado, você se importaria de responder a um questionário rápido com %d perguntas? Reaja com ✅ para iniciar ou ignore esta mensagem.",
"title": "❔ Feedback"
}
}
}
}

View File

@@ -1,598 +0,0 @@
{
"blacklisted": "❌ Estás na blacklist",
"bot": {
"missing_permissions": {
"description": "Discord Ticket precisa das seguintes permissões:\n%s",
"title": "⚠️"
},
"version": "[Discord Tickets](%s) v%s por [eartharoid](%s)"
},
"collector_expires_in": "Expira daqui a %d segundos",
"command_execution_error": {
"description": "Um erro desconhecido ocorreu durante a execução do comano.\nPor favor pergunta a um administrador para verificar os outputs/logs da consola para mais detalhes.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Adicionar um membro a um ticket",
"name": "adicionar",
"options": {
"member": {
"description": "O membro para adicionar ao ticket",
"name": "membro"
},
"ticket": {
"description": "O ticket para adicionar o membro",
"name": "ticket"
}
},
"response": {
"added": {
"description": "%s foi adicionado ao %s.",
"title": "✅ Membro adicionado"
},
"no_member": {
"description": "Por favor menciona o membro que queres adicionar.",
"title": "❌ Membro desconhecido"
},
"no_permission": {
"description": "Não és o criador deste ticket nem um membro da staff; não podes adicionar membros a este ticket.",
"title": "❌ Permissões insuficientes"
},
"not_a_ticket": {
"description": "Por favor usa este comando num ticket, ou menciona o canal.",
"title": "❌ Este canal não é um ticket"
}
}
},
"blacklist": {
"description": "Permite, ou não, um membro de interagir com o bot",
"name": "blacklist",
"options": {
"add": {
"description": "Adiciona um membro ou cargo á blacklist",
"name": "adicionar",
"options": {
"member_or_role": {
"description": "O membro ou cargo para adicionar á blacklist",
"name": "membro_ou_cargo"
}
}
},
"remove": {
"description": "Remove um membro ou cargo da blacklist",
"name": "remover",
"options": {
"member_or_role": {
"description": "O membro ou cargo para remover da blacklist",
"name": "membro_ou_cargo"
}
}
},
"show": {
"description": "Mostra os membros e cargos que estão na blacklist",
"name": "mostrar"
}
},
"response": {
"empty_list": {
"description": "Não existem mebros ou cargos na blacklist. Escreve `%sblacklist <membroOuCargo>` para adicionao um membro ou cargo á blacklist.",
"title": "📃 Membros e cargos na blacklist"
},
"illegal_action": {
"description": "%s é um membro da staff e não pode estar na blacklist.",
"title": "❌ Não podes adicionar este membro á blacklist"
},
"invalid": {
"description": "Este membro ou cargo não pode ser removido da blacklist visto que não estão na mesma.",
"title": "❌ Erro"
},
"list": {
"fields": {
"members": "Membros",
"roles": "Cargos"
},
"title": "📃 Membros e cargos na blacklist"
},
"member_added": {
"description": "<@%s> foi adicionado á blacklist. Ele não vai conseguir interagir com o bot.",
"title": "✅ Membro adicionado á blacklist"
},
"member_removed": {
"description": "<@%s> foi removido da blacklist. Ele pode usar agora o bot.",
"title": "✅ Membro removido da blacklist"
},
"role_added": {
"description": "<@&%s> foi adicionada á blacklist. Membros com este cargo já não podem interagir com o bot.",
"title": "✅ Cargo adicionado á blacklist"
},
"role_removed": {
"description": "<@&%s> foi removida da blacklist. Membros com este cargo já podes interagir com o bot.",
"title": "✅ Cargo removido da blacklist"
}
}
},
"close": {
"description": "Fecha um ticket",
"name": "fechar",
"options": {
"reason": {
"description": "O motivo para fechar o(s) ticket(s)",
"name": "motivo"
},
"ticket": {
"description": "O ticket para fechar, ou o número ou o ID do canal",
"name": "ticket"
},
"time": {
"description": "Fecha todos os tickets que estão inativos pelo tempo fornecido",
"name": "tempo"
}
},
"response": {
"canceled": {
"description": "Cancelas-te a operação.",
"title": "🚫 Cancelado"
},
"closed": {
"description": "O ticket #%s foi fechado.",
"title": "✅ Ticket fechado"
},
"closed_multiple": {
"description": [
"&d ticket foi fechado.",
"%d tickets foram fechados."
],
"title": [
"✅ Ticket fechado",
"✅ Tickets fechados"
]
},
"confirm": {
"buttons": {
"cancel": "Cencelar",
"confirm": "Fechar"
},
"description": "Por favor confirma a tua decisão.",
"description_with_archive": "O ticket vai ser arquivado para referências futuras.",
"title": "❔ Tens a certeza?"
},
"confirm_multiple": {
"buttons": {
"cancel": "Cancelar",
"confirm": [
"Fechar %d ticket",
"Fechar %d tickets"
]
},
"description": [
"Estás prestes a fechar %d ticket.",
"Estás prestes a fechar %d tickets."
],
"title": "❔ Tens a certeza?"
},
"confirmation_timeout": {
"description": "Demoras-te muito tempo para confirmar.",
"title": "❌ Tempo de interação expirado"
},
"invalid_time": {
"description": "O período de tempo fornecido não pôde ser analisado.",
"title": "❌ Entrada inválida"
},
"no_tickets": {
"description": "Não existem ticket que estiveram inativos por este período de tempo.",
"title": "❌ Sem tickets para fechar"
},
"not_a_ticket": {
"description": "Usa este comando num ticket ou use um ticket flag.\nEscreve `/help close` para mais informações.",
"title": "❌ Este canal não é um ticket"
},
"unresolvable": {
"description": "`%s` não pôde ser comparado com um ticket. Por favor fornece um ID/menção do ticket ou o número.",
"title": "❌ Erro"
}
}
},
"help": {
"description": "Lista dos comandos que tens acesso",
"name": "ajuda",
"response": {
"list": {
"description": "Os comandos que tens acesso estão listados em baixo. Para criar um ticket, escreve **`/novo`**.",
"fields": {
"commands": "Comandos"
},
"title": "❔ Ajuda"
}
}
},
"new": {
"description": "Cria um novo ticket",
"name": "novo",
"options": {
"topic": {
"description": "O motivo do ticket",
"name": "motivo"
}
},
"request_topic": {
"description": "Por favor escreve em poucas palavras o porquê da abertura deste ticket.",
"title": "⚠️ Motivo do Ticket"
},
"response": {
"created": {
"description": "O teu ticket foi criado: %s.",
"title": "✅ Ticket criado"
},
"error": {
"title": "❌ Erro"
},
"has_a_ticket": {
"description": "Por favor usa o teu ticket já existente (<#%s>) ou fecha-o antes de criares outro.",
"title": "❌ Já tens um ticket aberto"
},
"max_tickets": {
"description": "Por favor usa `/fechar` para fechares tickets desnecessários.\n\n%s",
"title": "❌ Já tens %d tickets abertos"
},
"no_categories": {
"description": "Um administrador do servidor tem que criar pelo menos uma categoria de tickets antes que qualquer ticket possa ser aberto.",
"title": "❌ Não podes criar tickets"
},
"select_category": {
"description": "Seleciona a categoria em que o teu motivo mais se enquadra.",
"title": "🔤 Por favor seleciona a categoria do ticket"
},
"select_category_timeout": {
"description": "Demoras-te muito tempo a selecionar uma categoria.",
"title": "❌ Tempo de interação expirado"
}
}
},
"panel": {
"description": "Cria um novo painel de ticket",
"name": "painel",
"options": {
"categories": {
"description": "A vírgula separa a lista dos IDs das categorias",
"name": "categorias"
},
"description": {
"description": "A descrição para a mensagem do painel",
"name": "descrição"
},
"image": {
"description": "Um link de imagem para a mensagem do painel",
"name": "imagem"
},
"just_type": {
"description": "Criar um painel \"só escrever\"?",
"name": "so_escrever"
},
"thumbnail": {
"description": "Um link para a thumbnail da mensagem do painel",
"name": "thumbnail"
},
"title": {
"description": "O título da mensagem do painel",
"name": "título"
}
},
"response": {
"invalid_category": {
"description": "Um ou mais IDs das categorias fornecidas são inválidas.",
"title": "❌ Categoria inválida"
},
"too_many_categories": {
"description": "O painel \"só escrever\" só pode ser usado para uma categoria.",
"title": "❌ Demasiadas Categorias"
}
}
},
"remove": {
"description": "Remove um membro de um ticket",
"name": "remover",
"options": {
"member": {
"description": "O membro para remover do ticket",
"name": "membro"
},
"ticket": {
"description": "O ticket para remover o membro",
"name": "ticket"
}
},
"response": {
"no_member": {
"description": "Por favor menciona o membro que queres remover.",
"title": "❌ Membro desconhecido"
},
"no_permission": {
"description": "Não és o criador deste ticket nem um membro da staff; não podes remover membros deste ticket.",
"title": "❌ Permissões insuficientes"
},
"not_a_ticket": {
"description": "Por favor usa este comando num ticket, ou menciona o canal.",
"title": "❌ Este canal não é um ticket"
},
"removed": {
"description": "%s foi removido de %s.",
"title": "✅ Membro removido"
}
}
},
"settings": {
"description": "Configura o Discord Tickets",
"name": "definicoes",
"options": {
"categories": {
"description": "Gere a categoria dos tickets",
"name": "categorias",
"options": {
"create": {
"description": "Cria uma nova categoria",
"name": "criar",
"options": {
"name": {
"description": "O nome da categoria",
"name": "nome"
},
"roles": {
"description": "Uma vírgula separa a lista dos IDs dos cargos de staff para a categoria",
"name": "cargos"
}
}
},
"delete": {
"description": "Apaga a categoria",
"name": "apagar",
"options": {
"id": {
"description": "O ID da categoria para apagar",
"name": "id"
}
}
},
"edit": {
"description": "Faz alterações na configuração de uma categoria",
"name": "editar",
"options": {
"claiming": {
"description": "Ativar a reivindicação de tickets?",
"name": "reivindicação"
},
"id": {
"description": "O ID da categoria para editar",
"name": "id"
},
"image": {
"description": "Um link de imagem",
"name": "imagem"
},
"max_per_member": {
"description": "O número máximo de tickets que um membro pode ter abertos nesta categoria",
"name": "max_por_membro"
},
"name": {
"description": "O nome da categoria",
"name": "nome"
},
"name_format": {
"description": "O formato do nome do ticket",
"name": "formato_do_nome"
},
"opening_message": {
"description": "O texto para enviar quando um ticket é aberto",
"name": "mensagem_de_abertura"
},
"ping": {
"description": "Uma vírgula separa a lista dos IDs dos cargos para mencionar",
"name": "mencionar"
},
"require_topic": {
"description": "É necessário o membro dar um motivo do ticket?",
"name": "motivo_necessario"
},
"roles": {
"description": "Uma vírgula separa a lista dos IDs do cargo de staff",
"name": "cargos"
},
"survey": {
"description": "O questionário para usar",
"name": "questionário"
}
}
},
"list": {
"description": "Lista de Categorias",
"name": "lista"
}
}
},
"set": {
"description": "Definir Opções",
"name": "definir",
"options": {
"close_button": {
"description": "Ativar o botão de fechar o ticket?",
"name": "botao_fechar"
},
"colour": {
"description": "A cor padrão",
"name": "cor"
},
"error_colour": {
"description": "A cor de erro",
"name": "cor_erro"
},
"footer": {
"description": "Texto para a legenda do embed",
"name": "legenda"
},
"locale": {
"description": "O locale (idioma/linguagem)",
"name": "linguagem"
},
"log_messages": {
"description": "Guardar mensagens dos tickets?",
"name": "guardar_msg"
},
"success_colour": {
"description": "A cor de sucesso",
"name": "cor_sucesso"
}
}
}
},
"response": {
"category_created": "✅ A categoria de ticket `%s` foi criada",
"category_deleted": "✅ A categoria de ticket `%s` foi apagada",
"category_does_not_exist": "❌ Nenhuma categoria existente tem este ID",
"category_list": "Categorias de Tickets",
"category_updated": "✅ A categoria do ticket `%s` foi atualizada",
"settings_updated": "✅ Definições foram atualizadas"
}
},
"stats": {
"description": "Mostra as estatísticas dos tickets",
"fields": {
"messages": "Mensagens",
"response_time": {
"minutes": "%s minutos",
"title": "Tempo médio de resposta"
},
"tickets": "Tickets"
},
"name": "estatisticas",
"response": {
"global": {
"description": "Estatisticas dis tickets de todos os servidores onde esta versão do Discord Tickets é usada.",
"title": "📊 Estatisticas gerais"
},
"guild": {
"description": "Estatisticas acerca dos tickets neste servidor. Esta informação é mantida na cache por 1 hora.",
"title": "📊 Estatisticas deste servidor"
}
}
},
"survey": {
"description": "Vê as respostas do questionário",
"name": "questionario",
"options": {
"survey": {
"description": "O nome do questionário para ver as respostas",
"name": "questionário"
}
},
"response": {
"list": {
"title": "📃 Questionários"
}
}
},
"tag": {
"description": "Usa uma resposta em tag",
"name": "tag",
"options": {
"tag": {
"description": "O nome da tag para usar",
"name": "tag"
}
},
"response": {
"error": "❌ Erro",
"list": {
"title": "📃 Lista de tags"
},
"missing": "Esta tag necessita dos seguintes argumentos:\n%s",
"not_a_ticket": {
"description": "Esta tag só pode ser usada num ticket visto que usa referências do ticket.",
"title": "❌ Não é um ticket"
}
}
},
"topic": {
"description": "Altera o motivo do ticket",
"name": "motivo",
"options": {
"new_topic": {
"description": "O novo motivo do ticket",
"name": "novo_motivo"
}
},
"response": {
"changed": {
"description": "O motivo do ticket foi alterado.",
"title": "✅ Motivo alterado"
},
"not_a_ticket": {
"description": "Por favor usa este comando no ticket que queres trocar o motivo.",
"title": "❌ Não é um ticket"
}
}
}
},
"message_will_be_deleted_in": "Esta mensagem vai ser apagada daqui a %d segundos",
"missing_permissions": {
"description": "Não tens permissões suficientes para usar este comando.\n%s",
"title": "❌ Erro"
},
"panel": {
"create_ticket": "Cria um ticket"
},
"ticket": {
"claim": "Reivindicar",
"claimed": {
"description": "%s reivindicou o ticket.",
"title": "✅ Ticket reivindicado"
},
"close": "Fechar",
"closed": {
"description": "Este ticket foi fechado.\nO canal vai ser apagado dentro de 5 segundos.",
"title": "✅ Ticket fechado"
},
"closed_by_member": {
"description": "Este ticket foi fechado por %s.\nEste canal vai ser apagado dentro de 5 segundos.",
"title": "✅ Ticket fechado"
},
"closed_by_member_with_reason": {
"description": "Este ticket foi fechado por %s: `%s`\nEste canal vai ser apagado dentro de 5 segundos.",
"title": "✅ Ticket fechado"
},
"closed_with_reason": {
"description": "Este ticket foi fechado: `%s`\nEste canal vai ser apagado dentro de 5 segundos.",
"title": "✅ Ticket fechado"
},
"member_added": {
"description": "%s foi adicionado por %s",
"title": "Membro adicionado"
},
"member_removed": {
"description": "%s foi removido por %s",
"title": "Membro removido"
},
"opening_message": {
"content": "%s\n%s criou um novo ticket",
"fields": {
"topic": "Motivo"
}
},
"questions": "Por favor responde ás seguintes questões:\n\n%s",
"released": {
"description": "%s libertou este ticket.",
"title": "✅ Ticket libertado"
},
"survey": {
"complete": {
"description": "Obrigado pelo teu feedback.",
"title": "✅ Obrigado"
},
"start": {
"description": "Olha, %s. Antes deste canal ser apagado, importas-te de completar um questionário super rápido de %d-question questões? Reage com ✅ para começar, ou ignora esta mensagem.",
"title": "❔ Feedback"
}
},
"unclaim": "Libertar"
},
"updated_permissions": "✅ Atualizado permissões dos Slash commands"
}

View File

@@ -1,324 +0,0 @@
{
"bot": {
"missing_permissions": {
"description": "Discord Tickets требует следующих разрешений:\n%s",
"title": "⚠️"
},
"version": "[Discord Tickets](%s) v%s от [eartharoid](%s)"
},
"collector_expires_in": "Истекает через %d секунд",
"command_execution_error": {
"description": "An unexpected error occurred during command execution.\nPlease ask an administrator to check the console output / logs for details.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Add a member to a ticket",
"name": "add",
"response": {
"added": {
"description": "%s has been added to %s.",
"title": "✅ Member added"
},
"no_member": {
"description": "Please mention the member you want to add.",
"title": "❌ Unknown member"
},
"no_permission": {
"description": "You are not the creator of this ticket and you are not a staff member; you can't add members to this ticket.",
"title": "❌ Insufficient permission"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel, or mention the channel.",
"title": "❌ Это не канал тикета"
}
}
},
"blacklist": {
"description": "Запретить/разрешить участнику использовать бота",
"name": "blacklist",
"response": {
"empty_list": {
"description": "В черный список не внесли ни участников, ни ролей. Напишите `%sblacklist <memberOrRole>`, чтобы добавить пользователя или роль в черный список.",
"title": "📃 Черный список пользователей и ролей"
},
"illegal_action": {
"description": "%s есть персоналом и не может быть внесен в черный список.",
"title": "❌ Вы не можете добавить в черный список этого участника"
},
"list": {
"title": "📃 Черный список пользователей и ролей"
},
"member_added": {
"description": "<@%s> добавлен в черный список. Они больше не смогут взаимодействовать с ботом.",
"title": "✅ Пользователь добавлен в черный список"
},
"member_removed": {
"description": "<@%s> был убран из черного списка. Теперь он может использовать бота снова.",
"title": "✅ Пользователь убран из черного списка"
},
"role_added": {
"description": "<@&%s> добавлена в черный список. Участники с этой ролью больше не смогут взаимодействовать с ботом.",
"title": "✅ Добавлена роль в черный список"
},
"role_removed": {
"description": "<@&%s> была убран из черного списка. Теперь он может использовать бота снова.",
"title": "✅ Роль убрана из черного списка"
}
}
},
"close": {
"description": "Закрыть тикет-канал",
"name": "закрыть",
"response": {
"closed": {
"description": "Тикет #%s был закрыт.",
"title": "✅ Тикет закрыт"
},
"closed_multiple": {
"description": [
"Тикет %d был закрыт.",
"%d тикетов было закрыто."
],
"title": [
"✅ Тикет закрыт",
"✅ Тикеты закрыты"
]
},
"confirm": {
"description": "Поставьте реакцию ✅, чтобы закрыть этот тикет.",
"description_with_archive": "Вы сможете просмотреть архивную версию этого тикета.\nПоставьте реакцию ✅, чтобы закрыть этот тикет.",
"title": "❔ Вы уверены?"
},
"confirm_multiple": {
"description": [
"Поставьте реакцию ✅, чтобы закрыть тикет %d.",
"Поставьте реакцию ✅, чтобы закрыть тикеты %d."
],
"title": "❔ Вы уверены?"
},
"confirmation_timeout": {
"description": "Подтверждение заняло слишком много времени.",
"title": "❌ Время реакции истекло"
},
"invalid_time": {
"description": "Предоставленный период времени не может быть разобран.",
"title": "❌ Недействительный ввод"
},
"no_tickets": {
"description": "Нет тикетов, которые были неактивны в течение этого периода времени.",
"title": "❌ Нет тикетов для закрытия"
},
"not_a_ticket": {
"description": "Please use this command in a ticket channel or use the ticket flag.\nType `%shelp close` for more information.",
"title": "❌ Это не канал тикета"
},
"unresolvable": {
"description": "`%s` could not be resolved to a ticket. Please provide the ticket ID/mention or number.",
"title": "❌ Ошибка"
}
}
},
"help": {
"description": "List commands you have access to, or find out more about a command",
"name": "help",
"response": {
"list": {
"description": "The commands you have access to are listed below. For more information about a command, type `{prefix}help [command]`. To create a ticket, type `{prefix}new [topic]`.",
"fields": {
"commands": "Commands"
},
"title": "❔ Help"
}
}
},
"new": {
"description": "Создание нового тикета",
"name": "новый",
"request_topic": {
"description": "Please briefly state what this ticket is about in a few words.",
"title": "Тема тикета"
},
"response": {
"created": {
"description": "Ваш тикет был создан: %s.",
"title": "✅ Тикет создан"
},
"error": {
"title": "❌ Ошибка"
},
"has_a_ticket": {
"description": "Пожалуйста, используйте существующий тикет (<#%s>) или закройте его перед созданием нового.",
"title": "❌ У вас уже есть открытый тикет"
},
"max_tickets": {
"description": "Please use `%sclose` to close any unneeded tickets.\n\n%s",
"title": "❌ У вас уже есть %d открытых тикетов"
},
"no_categories": {
"description": "A server administrator must create at least one ticket category before a new ticket can be opened.",
"title": "❌ Не могу создать тикет"
},
"select_category": {
"description": "Select the category most relevant to your ticket's topic:\n\n%s",
"title": "🔤 Пожалуйста, выберите категорию тикетов"
},
"select_category_timeout": {
"description": "Вы слишком долго выбирали категорию тикетов.",
"title": "❌ Время реакции истекло"
}
}
},
"panel": {
"description": "Create a new ticket panel",
"name": "panel",
"response": {
"invalid_category": {
"description": "One or more of the specified category IDs is invalid.",
"title": "❌ Недействительная категория"
}
}
},
"remove": {
"description": "Remove a member from a ticket",
"name": "remove",
"response": {
"no_member": {
"description": "Please mention the member you want to remove.",
"title": "❌ Unknown member"
},
"no_permission": {
"description": "You are not the creator of this ticket and you are not a staff member; you can't remove members from this ticket.",
"title": "❌ Insufficient permission"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel, or mention the channel.",
"title": "❌ Это не канал тикета"
},
"removed": {
"description": "%s has been removed from %s.",
"title": "✅ Member removed"
}
}
},
"settings": {
"description": "Configure Discord Tickets",
"name": "settings"
},
"stats": {
"description": "Display ticket statistics",
"fields": {
"messages": "Messages",
"response_time": {
"minutes": "%s minutes",
"title": "Avg. response time"
},
"tickets": "Tickets"
},
"name": "stats",
"response": {
"global": {
"description": "Statistics about tickets across all guilds where this Discord Tickets instance is used.",
"title": "📊 Global stats"
},
"guild": {
"description": "Statistics about tickets within this guild. This data is cached for an hour.",
"title": "📊 This server's stats"
}
}
},
"survey": {
"description": "View survey responses",
"name": "survey",
"response": {
"list": {
"title": "📃 Surveys"
}
}
},
"tag": {
"description": "Use a tag response",
"name": "tag",
"response": {
"error": "❌ Ошибка",
"list": {
"title": "📃 Tag list"
},
"missing": "This tag requires the following arguments:\n%s",
"not_a_ticket": {
"description": "This tag can only be used within a ticket channel as it uses ticket references.",
"title": "❌ Это не канал тикета"
}
}
},
"topic": {
"description": "Change the topic of the ticket",
"name": "топик",
"response": {
"changed": {
"description": "This ticket's topic has been changed.",
"title": "✅ Topic changed"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel you want to change the topic of.",
"title": "❌ Это не канал тикета"
}
}
}
},
"message_will_be_deleted_in": "Это сообщение будет удалено в течение %d секунд",
"missing_permissions": {
"description": "You do not have the permissions required to use this command:\n%s",
"title": "❌"
},
"ticket": {
"claimed": {
"description": "%s принял этот тикет.",
"title": "✅ Тикет принят"
},
"closed": {
"description": "This ticket has been closed.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Тикет закрыт"
},
"closed_by_member": {
"description": "This ticket has been closed by %s.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Тикет закрыт"
},
"closed_by_member_with_reason": {
"description": "This ticket has been closed by %s: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Тикет закрыт"
},
"closed_with_reason": {
"description": "This ticket has been closed: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Тикет закрыт"
},
"member_added": {
"description": "%s has been added by %s",
"title": "Member added"
},
"member_removed": {
"description": "%s has been removed by %s",
"title": "Member removed"
},
"opening_message": {
"fields": {
"topic": "Topic"
}
},
"questions": "Please answer the following questions:\n\n%s",
"released": {
"description": "%s выпустил этот тикет.",
"title": "✅ Тикет выпущен"
},
"survey": {
"complete": {
"description": "Thank you for your feedback.",
"title": "✅ Thank you"
},
"start": {
"description": "Hey, %s. Before this channel is deleted, would you mind completing a quick %d-question survey? React with ✅ to start, or ignore this message.",
"title": "❔ Feedback"
}
}
}
}

View File

@@ -1,373 +0,0 @@
{
"bot": {
"missing_permissions": {
"description": "Discord Tickets ต้องการการสิทธิ์อนุญาตดังต่อไปนี้: %s",
"title": "⚠️"
},
"version": "[Discord Tickets](%s) v%s สร้างโดย [eartharoid](%s)"
},
"collector_expires_in": "หมดอายุในอีก %d วินาที",
"command_execution_error": {
"description": "An unexpected error occurred during command execution.\nPlease ask an administrator to check the console output / logs for details.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Add a member to a ticket",
"name": "add",
"options": {
"member": {
"name": "สมาชิก"
}
},
"response": {
"added": {
"description": "%s has been added to %s.",
"title": "✅ Member added"
},
"no_member": {
"description": "Please mention the member you want to add.",
"title": "❌ Unknown member"
},
"no_permission": {
"description": "You are not the creator of this ticket and you are not a staff member; you can't add members to this ticket.",
"title": "❌ Insufficient permission"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel, or mention the channel.",
"title": "❌ This isn't a ticket channel"
}
}
},
"blacklist": {
"description": "Blacklist/unblacklist a member from interacting with the bot",
"name": "blacklist",
"options": {
"add": {
"name": "เพิ่ม",
"options": {
"member_or_role": {
"name": "สมาชิกหรือยศ"
}
}
},
"remove": {
"name": "ลบ",
"options": {
"member_or_role": {
"name": "สมาชิกหรือยศ"
}
}
},
"show": {
"name": "แสดง"
}
},
"response": {
"empty_list": {
"description": "There are no members or roles blacklisted. Type `%sblacklist <memberOrRole>` to add a member or role to the blacklist.",
"title": "📃 Blacklisted members and roles"
},
"illegal_action": {
"description": "%s is a staff member and cannot be blacklisted.",
"title": "❌ You can't blacklist this member"
},
"invalid": {
"title": "❌ ผิดพลาด"
},
"list": {
"fields": {
"members": "สมาชิก",
"roles": "ยศ"
},
"title": "📃 Blacklisted members and roles"
},
"member_added": {
"description": "<@%s> has been added to the blacklist. They will no longer be able to interact with the bot.",
"title": "✅ Added member to blacklist"
},
"member_removed": {
"description": "<@%s> has been removed from the blacklist. They can now use the bot again.",
"title": "✅ Removed member from blacklist"
},
"role_added": {
"description": "<@&%s> has been added to the blacklist. Members with this role will no longer be able to interact with the bot.",
"title": "✅ Added role to blacklist"
},
"role_removed": {
"description": "<@&%s> has been removed from the blacklist. Members with this role can now use the bot again.",
"title": "✅ Removed role from blacklist"
}
}
},
"close": {
"description": "Close a ticket channel",
"name": "close",
"options": {
"reason": {
"name": "สาเหตุ"
},
"time": {
"name": "เวลา"
}
},
"response": {
"canceled": {
"description": "คุณยกเลิกการดำเนินการ",
"title": "🚫 ยกเลิก"
},
"closed": {
"description": "Ticket #%s has been closed.",
"title": "✅ Ticket closed"
},
"closed_multiple": {
"description": [
"%d ticket has been closed.",
"%d tickets have been closed."
],
"title": [
"✅ Ticket closed",
"✅ Tickets closed"
]
},
"confirm": {
"buttons": {
"cancel": "ยกเลิก",
"confirm": "ปิด"
},
"description": "React with ✅ to close this ticket.",
"description_with_archive": "You will be able to view an archived version of it after.\nReact with ✅ to close this ticket.",
"title": "❔ Are you sure?"
},
"confirm_multiple": {
"description": [
"React with ✅ to close %d ticket.",
"React with ✅ to close %d tickets."
],
"title": "❔ Are you sure?"
},
"confirmation_timeout": {
"description": "You took too long to confirm.",
"title": "❌ Reaction time expired"
},
"invalid_time": {
"description": "The time period provided could not be parsed.",
"title": "❌ Invalid input"
},
"no_tickets": {
"description": "There are no tickets which have been inactive for this time period.",
"title": "❌ No tickets to close"
},
"not_a_ticket": {
"description": "Please use this command in a ticket channel or use the ticket flag.\nType `%shelp close` for more information.",
"title": "❌ This isn't a ticket channel"
},
"unresolvable": {
"description": "`%s` could not be resolved to a ticket. Please provide the ticket ID/mention or number.",
"title": "❌ Error"
}
}
},
"help": {
"description": "List commands you have access to, or find out more about a command",
"name": "help",
"response": {
"list": {
"description": "The commands you have access to are listed below. For more information about a command, type `{prefix}help [command]`. To create a ticket, type `{prefix}new [topic]`.",
"fields": {
"commands": "Commands"
},
"title": "❔ Help"
}
}
},
"new": {
"description": "Create a new ticket",
"name": "new",
"request_topic": {
"description": "Please briefly state what this ticket is about in a few words.",
"title": "Ticket topic"
},
"response": {
"created": {
"description": "Your ticket has been created: %s.",
"title": "✅ Ticket created"
},
"error": {
"title": "❌ Error"
},
"has_a_ticket": {
"description": "Please use your existing ticket (<#%s>) or close it before creating another.",
"title": "❌ You already have an open ticket"
},
"max_tickets": {
"description": "Please use `%sclose` to close any unneeded tickets.\n\n%s",
"title": "❌ You already have %d open tickets"
},
"no_categories": {
"description": "A server administrator must create at least one ticket category before a new ticket can be opened.",
"title": "❌ Can't create ticket"
},
"select_category": {
"description": "Select the category most relevant to your ticket's topic:\n\n%s",
"title": "🔤 Please select the ticket category"
},
"select_category_timeout": {
"description": "You took too long to select the ticket category.",
"title": "❌ Reaction time expired"
}
}
},
"panel": {
"description": "สร้างแผงตั๋วสนับสนุนใหม่",
"name": "แผง",
"response": {
"invalid_category": {
"description": "รหัสหมวดหมู่ที่ระบุอย่างน้อยหนึ่งรายการไม่ถูกต้อง",
"title": "❌หมวดหมู่ไม่ถูกต้อง"
}
}
},
"remove": {
"description": "ลบสมาชิกออกจากตั๋วสนับสนุน",
"name": "ลบ",
"response": {
"no_member": {
"description": "โปรดแท็กสมาชิกที่คุณต้องการลบ",
"title": "❌ Unknown member"
},
"no_permission": {
"description": "คุณไม่ใช่ผู้สร้างตั๋วสนับสนุนใบนี้และคุณก็ไม่ได้เป็นหนุ่งในทีมงานของเซิร์ฟเวอร์ คุณจึงไม่สามารถลบสมาชิกออกจากตั๋วนี้ได้",
"title": "❌ Insufficient permission"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel, or mention the channel.",
"title": "❌ This isn't a ticket channel"
},
"removed": {
"description": "%s ถูกลบออกจาก %s แล้ว",
"title": "✅สมาชิกถูกลบออกแล้ว"
}
}
},
"settings": {
"description": "ตั้งค่าบอท Discord Tickets",
"name": "การตั้งค่า"
},
"stats": {
"description": "Display ticket statistics",
"fields": {
"messages": "Messages",
"response_time": {
"minutes": "%s minutes",
"title": "Avg. response time"
},
"tickets": "Tickets"
},
"name": "stats",
"response": {
"global": {
"description": "Statistics about tickets across all guilds where this Discord Tickets instance is used.",
"title": "📊 Global stats"
},
"guild": {
"description": "Statistics about tickets within this guild. This data is cached for an hour.",
"title": "📊 This server's stats"
}
}
},
"survey": {
"description": "View survey responses",
"name": "survey",
"response": {
"list": {
"title": "📃 Surveys"
}
}
},
"tag": {
"description": "Use a tag response",
"name": "tag",
"response": {
"error": "❌ Error",
"list": {
"title": "📃 Tag list"
},
"missing": "This tag requires the following arguments:\n%s",
"not_a_ticket": {
"description": "This tag can only be used within a ticket channel as it uses ticket references.",
"title": "❌ This isn't a ticket channel"
}
}
},
"topic": {
"description": "Change the topic of the ticket",
"name": "topic",
"response": {
"changed": {
"description": "This ticket's topic has been changed.",
"title": "✅ Topic changed"
},
"not_a_ticket": {
"description": "Please use this command in the ticket channel you want to change the topic of.",
"title": "❌ This isn't a ticket channel"
}
}
}
},
"message_will_be_deleted_in": "This message will be deleted in %d seconds",
"missing_permissions": {
"description": "You do not have the permissions required to use this command:\n%s",
"title": "❌"
},
"ticket": {
"claimed": {
"description": "%s has claimed this ticket.",
"title": "✅ Ticket claimed"
},
"closed": {
"description": "This ticket has been closed.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_by_member": {
"description": "This ticket has been closed by %s.\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_by_member_with_reason": {
"description": "This ticket has been closed by %s: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"closed_with_reason": {
"description": "This ticket has been closed: `%s`\nThe channel will be deleted in 5 seconds.",
"title": "✅ Ticket closed"
},
"member_added": {
"description": "%s has been added by %s",
"title": "Member added"
},
"member_removed": {
"description": "%s has been removed by %s",
"title": "Member removed"
},
"opening_message": {
"fields": {
"topic": "Topic"
}
},
"questions": "Please answer the following questions:\n\n%s",
"released": {
"description": "%s has released this ticket.",
"title": "✅ Ticket released"
},
"survey": {
"complete": {
"description": "Thank you for your feedback.",
"title": "✅ Thank you"
},
"start": {
"description": "Hey, %s. Before this channel is deleted, would you mind completing a quick %d-question survey? React with ✅ to start, or ignore this message.",
"title": "❔ Feedback"
}
}
}
}

View File

@@ -1,287 +0,0 @@
{
"blacklisted": "❌ Bạn đã bị cấm",
"bot": {
"missing_permissions": {
"description": "Discord Tickets yêu cầu các quyền sau:\n%s ",
"title": "⚠️"
},
"version": "[Discord Tickets](%s) v%s bởi [eartharoid](%s)"
},
"collector_expires_in": "Hết hạn trong %d giây",
"command_execution_error": {
"description": "Một lỗi không mong muốn đã xảy ra trong quá trình thực hiện lệnh.\nVui lòng hỏi một quản trị viên để kiểm tra output từ console / logs để biết thêm chi tiết.",
"title": "⚠️"
},
"commands": {
"add": {
"description": "Thêm một thành viên vào ticket",
"name": "add",
"options": {
"member": {
"description": "Thành viên để thêm vào ticket",
"name": "thành viên"
},
"ticket": {
"description": "Ticket để thêm thành viên vào",
"name": "ticket"
}
},
"response": {
"added": {
"description": "%s đã được thêm vào %s.",
"title": "✅ Đã thêm thành viên"
},
"no_member": {
"description": "Vui lòng mention thành viên bạn muốn thêm.",
"title": "❌ Thành viên không xác định"
},
"no_permission": {
"description": "Bạn không phải người tạo ra ticket và bạn cũng không phải là staff; bạn không thể thêm thành viên vào ticket này.",
"title": "❌ Không đủ quyền"
},
"not_a_ticket": {
"description": "Vui lòng sử dụng lệnh này trong một kênh ticket, hoặc mention tên kênh.",
"title": "❌ Đây không phải là một kênh ticket"
}
}
},
"blacklist": {
"description": "Xem hoặc sửa đổi danh sách cấm",
"name": "danh sách cấm",
"options": {
"add": {
"description": "Thêm một thành viên hoặc role vào danh sách cấm",
"name": "thêm",
"options": {
"member_or_role": {
"description": "Thành viên hoặc role để thêm vào danh sách cấm",
"name": "member_or_role"
}
}
},
"remove": {
"description": "Xóa thành viên hoặc role khỏi danh sách cấm",
"name": "xóa",
"options": {
"member_or_role": {
"description": "Thành viên hoặc role để xóa khỏi danh sách cấm",
"name": "member_or_role"
}
}
},
"show": {
"description": "Hiển thị các thành viên và role trong danh sách cấm",
"name": "hiển thị"
}
},
"response": {
"empty_list": {
"description": "Không tìm thấy thành viên hoặc role bị cấm. Sử dụng `/blacklist add` để thêm một thành viên hoặc role vào danh sách cấm.",
"title": "📃 Các thành viên và roles trong danh sách cấm"
},
"illegal_action": {
"description": "%s là một staff và không thể bị cấm.",
"title": "❌ Bạn không thể cấm thành viên này"
},
"invalid": {
"description": "Thành viên hoặc role này không thể bị xóa khỏi danh sách cấm bởi họ chưa bị cấm.",
"title": "❌ Lỗi"
},
"list": {
"fields": {
"members": "Các thành viên",
"roles": "Roles"
},
"title": "📃 Các thành viên và roles trong danh sách cấm"
},
"member_added": {
"description": "<@%s> đã được thêm vào danh sách cấm. Họ sẽ không thể tương tác với bot nữa.",
"title": "✅ Đã thêm thành viên vào danh sách cấm"
},
"member_removed": {
"description": "<@%s> đã được xóa khỏi danh sách cấm. Họ có thể sử lại bot.",
"title": "✅ Đã xóa thành viên khỏi danh sách cấm"
},
"role_added": {
"description": "<@&%s> đã được thêm vào danh sách cấm. Các thành viên với role này sẽ không thể tương tác với bot.",
"title": "✅ Đã thêm role vào danh sách cấm"
},
"role_removed": {
"description": "<@&%s> đã được xóa khỏi danh sách cấm. Các thành viên với role này có thể sử dụng lại bot.",
"title": "✅ Đã xóa role khỏi danh sách cấm"
}
}
},
"close": {
"description": "Đóng một ticket",
"name": "đóng",
"options": {
"reason": {
"description": "Lý do để đóng ticket(s)",
"name": "lý do"
},
"ticket": {
"description": "Ticket để đóng, có thể là số hoặc ID của kênh",
"name": "ticket"
},
"time": {
"description": "Đóng tất cả tickets không hoạt động trong thời gian nhất định",
"name": "thời gian"
}
},
"response": {
"canceled": {
"description": "Bạn đã hủy hành động.",
"title": "🚫 Đã hủy"
},
"closed": {
"description": "Ticket #%s đã được đóng.",
"title": "✅ Ticket đã được đóng"
},
"closed_multiple": {
"description": [
"%d ticket đã được đóng",
"%d tickets đã được đóng."
],
"title": [
"✅ Ticket đã được đóng",
"✅ Tickets đã được đóng"
]
},
"confirm": {
"buttons": {
"cancel": "Hủy",
"confirm": "Đóng"
},
"description": "Vui lòng xác nhận quyết định của bạn.",
"description_with_archive": "Ticket sẽ được lưu trữ cho tương lai.",
"title": "❔ Bạn có chắc chứ?"
},
"confirm_multiple": {
"buttons": {
"cancel": "Hủy",
"confirm": [
"Đóng %d ticket",
"Đóng %d tickets"
]
},
"description": [
"Bạn sắp đóng %d ticket.",
"Bạn sắp đóng %d tickets."
],
"title": "❔ Bạn có chắc chứ?"
},
"confirmation_timeout": {
"description": "Bạn đã mất quá nhiều thời gian để xác nhận.",
"title": "❌ Thời gian tương tác đã kết thúc"
},
"invalid_time": {
"description": "Không thể phân tích khoảng thời gian đã cung cấp.",
"title": "❌ Input không hợp lệ"
},
"no_permission": {
"description": "Bạn không phải là staff hoặc người tạo ticket.",
"title": "❌ Không đủ quyền"
},
"no_tickets": {
"description": "Không có tickets nào không hoạt động trong khoảng thời gian này.",
"title": "❌ Không có tickets nào để đóng"
},
"not_a_ticket": {
"description": "Vui lòng sử dụng lệnh này trong một kênh ticket hoặc sử dụng flag ticket.\nNhập `/help close` để biết thêm thông tin.",
"title": "❌ Đây không phải là một kênh ticket"
},
"unresolvable": {
"description": "`%s` không thể giải quyết tới ticket. Vui lòng cung cấp ticket ID/mention hoặc số.",
"title": "❌ Lỗi"
}
}
},
"help": {
"description": "Danh sách các lệnh mà bạn có thể truy cập",
"name": "help",
"response": {
"list": {
"description": "Các lệnh mà bạn có thể truy cập được liệt kê ở dưới. Để tạo một ticket, nhập **`/new`**.",
"fields": {
"commands": "Các lệnh"
},
"title": "❔ Help"
}
}
},
"new": {
"description": "Tạo một ticket mới",
"name": "mới",
"options": {
"topic": {
"description": "Chủ đề của ticket",
"name": "chủ đề"
}
},
"request_topic": {
"description": "Vui lòng nói ngắn gọn ticket này có nội dung gì trong một vài từ.",
"title": "⚠️ Chủ đề ticket"
},
"response": {
"created": {
"description": "Ticket của bạn đã được tạo: %s.",
"title": "✅ Ticket đã được tạo"
},
"error": {
"title": "❌ Lỗi"
},
"has_a_ticket": {
"description": "Vui lòng sử dụng ticket hiện tại của bạn (<#%s>) hoặc đóng nó trước khi tạo một cái khác.",
"title": "❌ Bạn đang có một ticket khác"
},
"max_tickets": {
"description": "Vui lòng sử dụng `/close` để đóng những tickets không cần thiết.\n\n%s",
"title": "❌ Bạn đã có %d tickets đang mở"
},
"no_categories": {
"description": "Quản trị viên của server phải tạo ít nhất một ticket category trước khi một ticket có thể được mở.",
"title": "❌ Không thể tạo ticket"
},
"select_category": {
"description": "Hãy chọn category phù hợp nhất cho chủ đề ticket của bạn.",
"title": "🔤 Vui lòng chọn ticket category"
},
"select_category_timeout": {
"description": "Bạn đã mất quá nhiều thời gian để ticket category.",
"title": "❌ Thời gian tương tác đã kết thúc"
}
}
},
"panel": {
"description": "Tạo một panel ticket mới",
"name": "panel",
"options": {
"categories": {
"description": "Danh sách IDs của category cần sử dụng dấu phẩy để ngăn cách",
"name": "categories"
},
"description": {
"description": "Điền mô tả cho tin nhắn của panel",
"name": "mô tả"
},
"image": {
"description": "URL của một hình ảnh cho tin nhắn của panel",
"name": "hình ảnh"
},
"just_type": {
"description": "Tạo một panel \"chỉ để viết\"?",
"name": "chỉ_để_viết"
},
"thumbnail": {
"description": "URL hình thumbnail nhỏ cho tin nhắn của panel",
"name": "hình thumbnail"
},
"title": {
"description": "Tiêu đề cho tin nhắn của panel",
"name": "tiêu đề"
}
}
}
}
}

View File

@@ -1,610 +0,0 @@
{
"blacklisted": "❌ 你被列入黑名单,无法开启客务单",
"bot": {
"missing_permissions": {
"description": "客服单需要以下权限:\n%s",
"title": "⚠️"
},
"version": "[客服单](%s) v%s 由 [无风团队工作室](%s)"
},
"collector_expires_in": "%d 秒后过期",
"command_execution_error": {
"description": "执行指令时发生错误,\n请让管理员查看控制台日志以获取详细信息",
"title": "⚠️"
},
"commands": {
"add": {
"description": "将用户加入到客服单",
"name": "add",
"options": {
"member": {
"description": "要加入到客服单的用户",
"name": "member"
},
"ticket": {
"description": "将用户加入到的客服单",
"name": "ticket"
}
},
"response": {
"added": {
"description": "%s 已加入到 %s",
"title": "✅ 已加入用户"
},
"no_member": {
"description": "请标注您要加入的用户",
"title": "❌ 未知用户"
},
"no_permission": {
"description": "您不是管理人员,无法向此客务单加入用户",
"title": "❌ 权限不足"
},
"not_a_ticket": {
"description": "请在客服单频道中使用此指令,或标注该频道",
"title": "❌ 这不是客服单频道"
}
}
},
"blacklist": {
"description": "查看或修改黑名单",
"name": "blacklist",
"options": {
"add": {
"description": "将用户或身分组列入到黑名单",
"name": "add",
"options": {
"member_or_role": {
"description": "要列入到黑名单的用户或身分组",
"name": "member_or_role"
}
}
},
"remove": {
"description": "从黑名单中移除用户或身分组",
"name": "remove",
"options": {
"member_or_role": {
"description": "要从黑名单中移除的用户或身分组",
"name": "member_or_role"
}
}
},
"show": {
"description": "显示黑名单中的用户和身分组",
"name": "show"
}
},
"response": {
"empty_list": {
"description": "没有用户或身分组被列入黑名单,请输入 `/blacklist add` 将用户或身分组加入到黑名单",
"title": "📃 黑名单用户和身分组"
},
"illegal_action": {
"description": "%s 是一位管理人员,不能被列入黑名单",
"title": "❌ 您不能将此用户列入黑名单"
},
"invalid": {
"description": "此用户或身分组未列入黑名单,因此无法从黑名单中移除",
"title": "❌ 错误"
},
"list": {
"fields": {
"members": "用户",
"roles": "身分组"
},
"title": "📃 黑名单用户和身分组"
},
"member_added": {
"description": "<@%s> 已加入到黑名单,他将不能再开启客服单",
"title": "✅ 已将用户列入到黑名单"
},
"member_removed": {
"description": "<@%s> 已从黑名单中移除,他可以开启客服单了",
"title": "✅ 已将用户从黑名单中移除"
},
"role_added": {
"description": "<@&%s> 已列入黑名单,有此身分组的用户将无法再开启客服单",
"title": "✅ 已将身分组列入到黑名单"
},
"role_removed": {
"description": "<@&%s> 已从黑名单中移除。 有此身分组的用户现在可以开启客服单了",
"title": "✅ 已将身分组从黑名单中移除"
}
}
},
"close": {
"description": "关闭客服单频道",
"name": "close",
"options": {
"reason": {
"description": "关闭客服单的原因",
"name": "reason"
},
"ticket": {
"description": "要关闭客服单的频道 ID",
"name": "ticket"
},
"time": {
"description": "关闭所有在指定时间内处于非活动状态的客服单",
"name": "time"
}
},
"response": {
"canceled": {
"description": "您取消了这个操作",
"title": "🚫 取消"
},
"closed": {
"description": "客服单 #%s 已关闭",
"title": "✅ 关闭客服单"
},
"closed_multiple": {
"description": [
"%d 个客服单已关闭",
"%d 个客服单已关闭"
],
"title": [
"✅ 关闭客服单",
"✅ 关闭客服单"
]
},
"confirm": {
"buttons": {
"cancel": "取消",
"confirm": "关闭"
},
"description": "请确认您的操作!",
"description_with_archive": "此客服单将被保存备份",
"title": "❔ 你确定?"
},
"confirm_multiple": {
"buttons": {
"cancel": "取消",
"confirm": [
"关闭 %d 客服单",
"关闭 %d 客服单"
]
},
"description": [
"您即将关闭 %d 个客服单",
"您即将关闭 %d 个客服单"
],
"title": "❔ 你确定?"
},
"confirmation_timeout": {
"description": "你确认的时间太长了",
"title": "❌ 确认时间已过"
},
"invalid_time": {
"description": "无法解析提供的时间段",
"title": "❌ 输入无效"
},
"no_permission": {
"description": "您不是管理人员",
"title": "❌ 权限不足"
},
"no_tickets": {
"description": "没有在此时间段内处于非活动状态的客服单",
"title": "❌ 没有客服单可以关闭"
},
"not_a_ticket": {
"description": "请在客服频道中使用此指令,\n输入`/help close`来获取更多资讯",
"title": "❌ 这不是客服单频道"
},
"unresolvable": {
"description": "`%s` 无法解析为客服单,请提供客服单 ID或标注",
"title": "❌ 错误"
}
}
},
"help": {
"description": "列出您有权使用的指令",
"name": "help",
"response": {
"list": {
"description": "下面列出了您可以使用的指令,要创建客服单,请键入 **`/new`**",
"fields": {
"commands": "指令"
},
"title": "❔ 帮助"
}
}
},
"new": {
"description": "创建客服单",
"name": "new",
"options": {
"topic": {
"description": "想要询问的问题或需要的帮助",
"name": "topic"
}
},
"request_topic": {
"description": "有什么问题需要我们的帮助呢还是想询问服务呢",
"title": "⚠️ 客服询问"
},
"response": {
"created": {
"description": "您的客服单已创建,它在这里 ➤ %s",
"title": "✅ 客服单已创建!"
},
"error": {
"title": "❌ 错误"
},
"has_a_ticket": {
"description": "请使用您现有的客服单 (<#%s>) 或在创建另一个客服单之前将其关闭",
"title": "❌ 您已经有一张客服单"
},
"max_tickets": {
"description": "请通知管理人员来关闭您的客服单",
"title": "❌ 您已经有 %d 张尚未结束的客服单"
},
"no_categories": {
"description": "管理人员必须先创建一个客服单分类才能打开新的客服单",
"title": "❌ 无法创建客服单"
},
"select_category": {
"description": "选择与您的客服单问题最相关的分类",
"title": "🔤 请选择客服单分类"
},
"select_category_timeout": {
"description": "您选择客服单分类的时间过长",
"title": "❌ 选择时间已过"
}
}
},
"panel": {
"description": "创建新的客服单开启介面",
"name": "panel",
"options": {
"categories": {
"description": "使用逗号来增加分类 ID",
"name": "categories"
},
"description": {
"description": "开启介面资讯",
"name": "description"
},
"image": {
"description": "开启介面的图片网址",
"name": "image"
},
"just_type": {
"description": "创建一个\"只需输入\"面板?",
"name": "just_type"
},
"thumbnail": {
"description": "开启介面资讯的缩图网址",
"name": "thumbnail"
},
"title": {
"description": "开启介面的标题",
"name": "title"
}
},
"response": {
"invalid_category": {
"description": "一个或多个指定的分类 ID 无效",
"title": "❌ 分类无效"
},
"too_many_categories": {
"description": "\"只需键入\"介面只能用于单个分类",
"title": "❌ 分类太多"
}
}
},
"remove": {
"description": "从客服单中移除用户",
"name": "remove",
"options": {
"member": {
"description": "要从客服单中移除的用户",
"name": "member"
},
"ticket": {
"description": "删除用户的客服单",
"name": "ticket"
}
},
"response": {
"no_member": {
"description": "请标注您要移除的用户",
"title": "❌ 未知用户"
},
"no_permission": {
"description": "您不是管理人员,您不能从此客服单中移除用户",
"title": "❌ 权限不足"
},
"not_a_ticket": {
"description": "请在客服单频道中使用此指令,或标注该频道",
"title": "❌ 这不是客服单频道"
},
"removed": {
"description": "%s 已从 %s 中移除",
"title": "✅ 已移除用户"
}
}
},
"settings": {
"description": "设定客服单系统",
"name": "settings",
"options": {
"categories": {
"description": "管理您的客服单分类",
"name": "categories",
"options": {
"create": {
"description": "创建一个新分类",
"name": "create",
"options": {
"name": {
"description": "分类名称",
"name": "name"
},
"roles": {
"description": "此分类的管理人员身分组 ID ,使用逗号做分隔",
"name": "roles"
}
}
},
"delete": {
"description": "删除分类",
"name": "delete",
"options": {
"id": {
"description": "要删除分类的 ID",
"name": "id"
}
}
},
"edit": {
"description": "更改分类的设定",
"name": "edit",
"options": {
"claiming": {
"description": "开启客服单?",
"name": "claiming"
},
"id": {
"description": "要编辑的分类的 ID",
"name": "id"
},
"image": {
"description": "图片网址",
"name": "image"
},
"max_per_member": {
"description": "用户在此分类中可以开启的最大客服单数量",
"name": "max_per_member"
},
"name": {
"description": "分类名称",
"name": "name"
},
"name_format": {
"description": "客服单格式",
"name": "name_format"
},
"opening_message": {
"description": "打开客服单时要发送的讯息",
"name": "opening_message"
},
"opening_questions": {
"description": "开启客服单时要问的问题",
"name": "opening_questions"
},
"ping": {
"description": "要标注的身分组 ID ,使用逗号做分隔",
"name": "ping"
},
"require_topic": {
"description": "要求用户在开启客服单时询问问题?",
"name": "require_topic"
},
"roles": {
"description": "以逗号做分隔,管理人员身分组 ID 列表",
"name": "roles"
},
"survey": {
"description": "开启意见调查",
"name": "survey"
}
}
},
"list": {
"description": "列出分类",
"name": "list"
}
}
},
"set": {
"description": "设定选项",
"name": "set",
"options": {
"close_button": {
"description": "使用按钮开启和关闭?",
"name": "close_button"
},
"colour": {
"description": "标准颜色",
"name": "colour"
},
"error_colour": {
"description": "错误颜色",
"name": "error_colour"
},
"footer": {
"description": "嵌入页脚文字",
"name": "footer"
},
"locale": {
"description": "系统语言",
"name": "locale"
},
"log_messages": {
"description": "储存客服单的讯息?",
"name": "log_messages"
},
"success_colour": {
"description": "成功的颜色",
"name": "success_colour"
}
}
}
},
"response": {
"category_created": "✅ `%s` 客服单分类已创建",
"category_deleted": "✅ `%s` 客服单分类已被删除",
"category_does_not_exist": "❌ 提供的 ID 不存在分类",
"category_list": "客服单分类",
"category_updated": "✅ `%s` 客服单分类已更新",
"settings_updated": "✅ 设定已更新"
}
},
"stats": {
"description": "显示客服单统计资讯",
"fields": {
"messages": "讯息",
"response_time": {
"minutes": "%s 分钟",
"title": "平均回应时间"
},
"tickets": "客服单"
},
"name": "stats",
"response": {
"global": {
"description": "使用此客服单系统的所有群组的客服单统计资讯",
"title": "📊 所有群组客服单统计资讯"
},
"guild": {
"description": "该群组内的客服单统计此资料将储存1小时",
"title": "📊 此群组的统计资讯"
}
}
},
"survey": {
"description": "查看意见调查回复",
"name": "survey",
"options": {
"survey": {
"description": "用于查看回复的意见调查的名称",
"name": "survey"
}
},
"response": {
"list": {
"title": "📃 意见调查"
}
}
},
"tag": {
"description": "使用标注来回应",
"name": "tag",
"options": {
"tag": {
"description": "要使用的标注名称",
"name": "tag"
}
},
"response": {
"error": "❌ 错误",
"list": {
"title": "📃 标注列表"
},
"missing": "此标注需要以下参数:\n%s",
"not_a_ticket": {
"description": "此标注只能在客服单频道中使用,因为它使用客服单参考",
"title": "❌ 这不是客服单频道"
}
}
},
"topic": {
"description": "更改客服单问题",
"name": "topic",
"options": {
"new_topic": {
"description": "客服单新问题",
"name": "new_topic"
}
},
"response": {
"changed": {
"description": "此客服单的问题已更改",
"title": "✅ 问题已更改"
},
"not_a_ticket": {
"description": "请在您要更改问题的客服单频道中使用此指令",
"title": "❌ 这不是客服单频道"
}
}
}
},
"message_will_be_deleted_in": "此讯息将在 %d 秒后删除",
"missing_permissions": {
"description": "您没有使用此指令所需的权限:\n%s",
"title": "❌ 错误"
},
"panel": {
"create_ticket": "创建客服单"
},
"ticket": {
"claim": "要求",
"claimed": {
"description": "%s 已领取这张客服单",
"title": "✅ 已领取客服单"
},
"close": "关闭",
"closed": {
"description": "此客服单已关闭,\n此频道将在 5 秒后删除",
"title": "✅ 客服单已关闭"
},
"closed_by_member": {
"description": "此客服单已被 %s 关闭,\n此频道将在 5 秒后删除",
"title": "✅ 客服单已关闭"
},
"closed_by_member_with_reason": {
"description": "此客服单已被 %s 关闭:`%s`\n此频道将在 5 秒后被删除",
"title": "✅ 客服单已关闭"
},
"closed_with_reason": {
"description": "此客服单已关闭,`%s`\n此频道将在 5 秒后删除",
"title": "✅ 客服单已关闭"
},
"member_added": {
"description": "%s 已被 %s 加入",
"title": "已加入用户"
},
"member_removed": {
"description": "%s 已被 %s 移除",
"title": "已移除用户"
},
"opening_message": {
"content": "%s\n%s 已创建新客服单",
"fields": {
"topic": "问题"
}
},
"questions": "请回答以下问题:\n\n%s",
"released": {
"description": "%s 已完成此客服单",
"title": "✅ 客服单完成"
},
"survey": {
"complete": {
"description": "感谢您的意见调查",
"title": "✅ 感谢您"
},
"start": {
"buttons": {
"ignore": "不要",
"start": "开始意见调查"
},
"description": "您好,%s\n在删除此客服单之前您介意完成一个快速的 %d 意见调查吗?",
"title": "❔ 意见调查"
}
},
"unclaim": "传送"
},
"updated_permissions": "✅ /指令权限已更新"
}

View File

@@ -1,610 +0,0 @@
{
"blacklisted": "❌ 你被列入黑名單,無法開啟客務單",
"bot": {
"missing_permissions": {
"description": "Discord 票證需要以下權限:\n%s ",
"title": "⚠️"
},
"version": "[客服單](%s) v%s 由 [無風團隊工作室](%s)"
},
"collector_expires_in": "%d 秒後過期",
"command_execution_error": {
"description": "執行指令時發生錯誤,\n請讓管理員查看控制台日誌以獲取詳細信息",
"title": "⚠️"
},
"commands": {
"add": {
"description": "將用戶加入到客服單",
"name": "add",
"options": {
"member": {
"description": "要加入到客服單的用戶",
"name": "member"
},
"ticket": {
"description": "將用戶加入到的客服單",
"name": "ticket"
}
},
"response": {
"added": {
"description": "%s 已加入到 %s",
"title": "✅ 已加入用戶"
},
"no_member": {
"description": "請標註您要加入的用戶",
"title": "❌ 未知用戶"
},
"no_permission": {
"description": "您不是管理人員,無法向此客務單加入用戶",
"title": "❌ 權限不足"
},
"not_a_ticket": {
"description": "請在客服單頻道中使用此指令,或標註該頻道",
"title": "❌ 這不是客服單頻道"
}
}
},
"blacklist": {
"description": "查看或修改黑名單",
"name": "blacklist",
"options": {
"add": {
"description": "將用戶或身分組列入到黑名單",
"name": "add",
"options": {
"member_or_role": {
"description": "要列入到黑名單的用戶或身分組",
"name": "member_or_role"
}
}
},
"remove": {
"description": "從黑名單中移除用戶或身分組",
"name": "remove",
"options": {
"member_or_role": {
"description": "要從黑名單中移除的用戶或身分組",
"name": "member_or_role"
}
}
},
"show": {
"description": "顯示黑名單中的用戶和身分組",
"name": "show"
}
},
"response": {
"empty_list": {
"description": "沒有用戶或身分組被列入黑名單,請輸入 `/blacklist add` 將用戶或身分組加入到黑名單",
"title": "📃 黑名單用戶和身分組"
},
"illegal_action": {
"description": "%s 是一位管理人員,不能被列入黑名單",
"title": "❌ 您不能將此用戶列入黑名單"
},
"invalid": {
"description": "此用戶或身分組未列入黑名單,因此無法從黑名單中移除",
"title": "❌ 錯誤"
},
"list": {
"fields": {
"members": "用戶",
"roles": "身分組"
},
"title": "📃 黑名單用戶和身分組"
},
"member_added": {
"description": "<@%s> 已加入到黑名單,他將不能再開啟客服單",
"title": "✅ 已將用戶列入到黑名單"
},
"member_removed": {
"description": "<@%s> 已從黑名單中移除,他可以開啟客服單了",
"title": "✅ 已將用戶從黑名單中移除"
},
"role_added": {
"description": "<@&%s> 已列入黑名單,有此身分組的用戶將無法再開啟客服單",
"title": "✅ 已將身分組列入到黑名單"
},
"role_removed": {
"description": "<@&%s> 已從黑名單中移除。 有此身分組的用戶現在可以開啟客服單了",
"title": "✅ 已將身分組從黑名單中移除"
}
}
},
"close": {
"description": "關閉客服單頻道",
"name": "close",
"options": {
"reason": {
"description": "關閉客服單的原因",
"name": "reason"
},
"ticket": {
"description": "要關閉客服單的頻道 ID",
"name": "ticket"
},
"time": {
"description": "關閉所有在指定時間內處於非活動狀態的客服單",
"name": "time"
}
},
"response": {
"canceled": {
"description": "您取消了這個操作",
"title": "🚫 取消"
},
"closed": {
"description": "客服單 #%s 已關閉",
"title": "✅ 關閉客服單"
},
"closed_multiple": {
"description": [
"%d 個客服單已關閉",
"%d 個客服單已關閉"
],
"title": [
"✅ 關閉客服單",
"✅ 關閉客服單"
]
},
"confirm": {
"buttons": {
"cancel": "取消",
"confirm": "關閉"
},
"description": "請確認您的操作!",
"description_with_archive": "此客服單將被保存備份",
"title": "❔ 你確定?"
},
"confirm_multiple": {
"buttons": {
"cancel": "取消",
"confirm": [
"關閉 %d 客服單",
"關閉 %d 客服單"
]
},
"description": [
"您即將關閉 %d 個客服單",
"您即將關閉 %d 個客服單"
],
"title": "❔ 你確定?"
},
"confirmation_timeout": {
"description": "你確認的時間太長了",
"title": "❌ 確認時間已過"
},
"invalid_time": {
"description": "無法解析提供的時間段",
"title": "❌ 輸入無效"
},
"no_permission": {
"description": "您不是管理人員",
"title": "❌ 權限不足"
},
"no_tickets": {
"description": "沒有在此時間段內處於非活動狀態的客服單",
"title": "❌ 沒有客服單可以關閉"
},
"not_a_ticket": {
"description": "請在客服頻道中使用此指令,\n輸入`/help close`來獲取更多資訊",
"title": "❌ 這不是客服單頻道"
},
"unresolvable": {
"description": "`%s` 無法解析為客服單,請提供客服單 ID或標註",
"title": "❌ 錯誤"
}
}
},
"help": {
"description": "列出您有權使用的指令",
"name": "help",
"response": {
"list": {
"description": "下面列出了您可以使用的指令,要創建客服單,請鍵入 **`/new`**",
"fields": {
"commands": "指令"
},
"title": "❔ 幫助"
}
}
},
"new": {
"description": "創建客服單",
"name": "new",
"options": {
"topic": {
"description": "想要詢問的問題或需要的幫助",
"name": "topic"
}
},
"request_topic": {
"description": "有甚麼問題需要我們的幫助呢還是想詢問服務呢",
"title": "⚠️ 客服詢問"
},
"response": {
"created": {
"description": "您的客服單已創建,它在這裡 ➤ %s",
"title": "✅ 客服單已創建!"
},
"error": {
"title": "❌ 錯誤"
},
"has_a_ticket": {
"description": "請使用您現有的客服單 (<#%s>) 或在創建另一個客服單之前將其關閉",
"title": "❌ 您已經有一張客服單"
},
"max_tickets": {
"description": "請通知管理人員來關閉您的客服單",
"title": "❌ 您已經有 %d 張尚未結束的客服單"
},
"no_categories": {
"description": "管理人員必須先創建一個客服單分類才能打開新的客服單",
"title": "❌ 無法創建客服單"
},
"select_category": {
"description": "選擇與您的客服單問題最相關的分類",
"title": "🔤 請選擇客服單分類"
},
"select_category_timeout": {
"description": "您選擇客服單分類的時間過長",
"title": "❌ 選擇時間已過"
}
}
},
"panel": {
"description": "創建新的客服單開啟介面",
"name": "panel",
"options": {
"categories": {
"description": "使用逗號來增加分類 ID",
"name": "categories"
},
"description": {
"description": "開啟介面資訊",
"name": "description"
},
"image": {
"description": "開啟介面的圖片網址",
"name": "image"
},
"just_type": {
"description": "創建一個\"只需輸入\"面板?",
"name": "just_type"
},
"thumbnail": {
"description": "開啟介面資訊的縮圖網址",
"name": "thumbnail"
},
"title": {
"description": "開啟介面的標題",
"name": "title"
}
},
"response": {
"invalid_category": {
"description": "一個或多個指定的分類 ID 無效",
"title": "❌ 分類無效"
},
"too_many_categories": {
"description": "\"只需鍵入\"介面只能用於單個分類",
"title": "❌ 分類太多"
}
}
},
"remove": {
"description": "從客服單中移除用戶",
"name": "remove",
"options": {
"member": {
"description": "要從客服單中移除的用戶",
"name": "member"
},
"ticket": {
"description": "刪除用戶的客服單",
"name": "ticket"
}
},
"response": {
"no_member": {
"description": "請標註您要移除的用戶",
"title": "❌ 未知用戶"
},
"no_permission": {
"description": "您不是管理人員,您不能從此客服單中移除用戶",
"title": "❌ 權限不足"
},
"not_a_ticket": {
"description": "請在客服單頻道中使用此指令,或標註該頻道",
"title": "❌ 這不是客服單頻道"
},
"removed": {
"description": "%s 已從 %s 中移除",
"title": "✅ 已移除用戶"
}
}
},
"settings": {
"description": "設定客服單系統",
"name": "settings",
"options": {
"categories": {
"description": "管理您的客服單分類",
"name": "categories",
"options": {
"create": {
"description": "創建一個新分類",
"name": "create",
"options": {
"name": {
"description": "分類名稱",
"name": "name"
},
"roles": {
"description": "此分類的管理人員身分組 ID ,使用逗號做分隔",
"name": "roles"
}
}
},
"delete": {
"description": "刪除分類",
"name": "delete",
"options": {
"id": {
"description": "要刪除分類的 ID",
"name": "id"
}
}
},
"edit": {
"description": "更改分類的設定",
"name": "edit",
"options": {
"claiming": {
"description": "開啟客服單?",
"name": "claiming"
},
"id": {
"description": "要編輯的分類的 ID",
"name": "id"
},
"image": {
"description": "圖片網址",
"name": "image"
},
"max_per_member": {
"description": "用戶在此分類中可以開啟的最大客服單數量",
"name": "max_per_member"
},
"name": {
"description": "分類名稱",
"name": "name"
},
"name_format": {
"description": "客服單格式",
"name": "name_format"
},
"opening_message": {
"description": "打開客服單時要發送的訊息",
"name": "opening_message"
},
"opening_questions": {
"description": "開啟客服單時要問的問題",
"name": "opening_questions"
},
"ping": {
"description": "要標註的身分組 ID ,使用逗號做分隔",
"name": "ping"
},
"require_topic": {
"description": "要求用戶在開啟客服單時詢問問題?",
"name": "require_topic"
},
"roles": {
"description": "以逗號做分隔,管理人員身分組 ID 列表",
"name": "roles"
},
"survey": {
"description": "開啟意見調查",
"name": "survey"
}
}
},
"list": {
"description": "列出分類",
"name": "list"
}
}
},
"set": {
"description": "設定選項",
"name": "set",
"options": {
"close_button": {
"description": "使用按鈕開啟和關閉?",
"name": "close_button"
},
"colour": {
"description": "標準顏色",
"name": "colour"
},
"error_colour": {
"description": "錯誤顏色",
"name": "error_colour"
},
"footer": {
"description": "嵌入頁腳文字",
"name": "footer"
},
"locale": {
"description": "系統語言",
"name": "locale"
},
"log_messages": {
"description": "儲存客服單的訊息?",
"name": "log_messages"
},
"success_colour": {
"description": "成功的顏色",
"name": "success_colour"
}
}
}
},
"response": {
"category_created": "✅ `%s` 客服單分類已創建",
"category_deleted": "✅ `%s` 客服單分類已被刪除",
"category_does_not_exist": "❌ 提供的 ID 不存在分類",
"category_list": "客服單分類",
"category_updated": "✅ `%s` 客服單分類已更新",
"settings_updated": "✅ 設定已更新"
}
},
"stats": {
"description": "顯示客服單統計資訊",
"fields": {
"messages": "訊息",
"response_time": {
"minutes": "%s 分鐘",
"title": "平均回應時間"
},
"tickets": "客服單"
},
"name": "stats",
"response": {
"global": {
"description": "使用此客服單系統的所有群組的客服單統計資訊",
"title": "📊 所有群組客服單統計資訊"
},
"guild": {
"description": "該群組內的客服單統計此資料將儲存1小時",
"title": "📊 此群組的統計資訊"
}
}
},
"survey": {
"description": "查看意見調查回復",
"name": "survey",
"options": {
"survey": {
"description": "用於查看回復的意見調查的名稱",
"name": "survey"
}
},
"response": {
"list": {
"title": "📃 意見調查"
}
}
},
"tag": {
"description": "使用標註來回應",
"name": "tag",
"options": {
"tag": {
"description": "要使用的標註名稱",
"name": "tag"
}
},
"response": {
"error": "❌ 錯誤",
"list": {
"title": "📃 標註列表"
},
"missing": "此標註需要以下參數:\n%s",
"not_a_ticket": {
"description": "此標註只能在客服單頻道中使用,因為它使用客服單參考",
"title": "❌ 這不是客服單頻道"
}
}
},
"topic": {
"description": "更改客服單問題",
"name": "topic",
"options": {
"new_topic": {
"description": "客服單新問題",
"name": "new_topic"
}
},
"response": {
"changed": {
"description": "此客服單的問題已更改",
"title": "✅ 問題已更改"
},
"not_a_ticket": {
"description": "請在您要更改問題的客服單頻道中使用此指令",
"title": "❌ 這不是客服單頻道"
}
}
}
},
"message_will_be_deleted_in": "此訊息將在 %d 秒後刪除",
"missing_permissions": {
"description": "您沒有使用此指令所需的權限:\n%s",
"title": "❌ 錯誤"
},
"panel": {
"create_ticket": "創建客服單"
},
"ticket": {
"claim": "要求",
"claimed": {
"description": "%s 已領取這張客服單",
"title": "✅ 已領取客服單"
},
"close": "關閉",
"closed": {
"description": "此客服單已關閉,\n此頻道將在 5 秒後刪除",
"title": "✅ 客服單已關閉"
},
"closed_by_member": {
"description": "此客服單已被 %s 關閉,\n此頻道將在 5 秒後刪除",
"title": "✅ 客服單已關閉"
},
"closed_by_member_with_reason": {
"description": "此客服單已被 %s 關閉:`%s`\n此頻道將在 5 秒後被刪除",
"title": "✅ 客服單已關閉"
},
"closed_with_reason": {
"description": "此客服單已關閉,`%s`\n此頻道將在 5 秒後刪除",
"title": "✅ 客服單已關閉"
},
"member_added": {
"description": "%s 已被 %s 加入",
"title": "已加入用戶"
},
"member_removed": {
"description": "%s 已被 %s 移除",
"title": "已移除用戶"
},
"opening_message": {
"content": "%s\n%s 已創建新客服單",
"fields": {
"topic": "問題"
}
},
"questions": "請回答以下問題:\n\n%s",
"released": {
"description": "%s 已完成此客服單",
"title": "✅ 客服單完成"
},
"survey": {
"complete": {
"description": "感謝您的意見調查",
"title": "✅ 感謝您"
},
"start": {
"buttons": {
"ignore": "不要",
"start": "開始意見調查"
},
"description": "您好,%s\n在刪除此客服單之前您介意完成一個快速的 %d 意見調查嗎?",
"title": "❔ 意見調查"
}
},
"unclaim": "傳送"
},
"updated_permissions": "✅ /指令權限已更新"
}

View File

@@ -1,39 +0,0 @@
const { path } = require('./utils/fs');
const config = require('../user/config');
const Logger = require('leekslazylogger');
module.exports = new Logger({
debug: config.developer.debug,
directory: path('./logs/'),
keepFor: config.logs.keep_for,
levels: {
_logger: { format: '&f&!7{timestamp}&r [LOGGER] {text}' },
basic: { format: '&f&!7{timestamp} {text}' },
commands: {
format: '&f&!7{timestamp}&r &3[INFO] &d(COMMANDS)&r {text}',
type: 'info'
},
console: { format: '&f&!7{timestamp} [INFO] {text}' },
debug: { format: '&f&!7{timestamp}&r &1[DEBUG] &9{text}' },
error: { format: '&f&!7{timestamp}&r &4[ERROR] &c{text}' },
http: {
format: '&f&!7{timestamp}&r &3[INFO] &d(HTTP)&r {text}',
type: 'info'
},
info: { format: '&f&!7{timestamp}&r &3[INFO] &b{text}' },
notice: { format: '&f&!7{timestamp}&r &0&!6[NOTICE] {text}' },
plugins: {
format: '&f&!7{timestamp}&r &3[INFO] &d(PLUGINS)&r {text}',
type: 'info'
},
success: { format: '&f&!7{timestamp}&r &2[SUCCESS] &a{text}' },
warn: { format: '&f&!7{timestamp}&r &6[WARN] &e{text}' },
ws: {
format: '&f&!7{timestamp}&r &3[INFO] &d(WS)&r {text}',
type: 'info'
}
},
logToFile: config.logs.enabled,
name: 'Discord Tickets by eartharoid',
splitFile: config.logs.split,
timestamp: 'YYYY-MM-DD HH:mm:ss'
});

View File

@@ -1,125 +0,0 @@
const {
Message, // eslint-disable-line no-unused-vars
Interaction // eslint-disable-line no-unused-vars
} = require('discord.js');
/**
* A command
*/
module.exports = class Command {
/**
*
* @typedef CommandOption
* @property {string} name - The option's name
* @property {number} type - The option's type (use `Command.option_types`)
* @property {string} description - The option's description
* @property {CommandOption[]} [options] - The option's options
* @property {(string|number)[]} [choices] - The option's choices
* @property {boolean} [required] - Is this arg required? Defaults to `false`
*/
/**
* Create a new Command
* @param {import('../../').Bot} client - The Discord Client
* @param {Object} data - Command data
* @param {string} data.name - The name of the command (3-32)
* @param {string} data.description - The description of the command (1-100)
* @param {boolean} [data.staff_only] - Only allow staff to use this command?
* @param {string[]} [data.permissions] - Array of permissions needed for a user to use this command
* @param {CommandOption[]} [data.options] - The command's options
*/
constructor(client, data) {
/** The Discord Client */
this.client = client;
/** The CommandManager */
this.manager = this.client.commands;
if (typeof data !== 'object') {
throw new TypeError(`Expected type of command "data" to be an object, got "${typeof data}"`);
}
/**
* The name of the command
* @type {string}
*/
this.name = data.name;
/**
* The command description
* @type {string}
*/
this.description = data.description;
/**
* Only allow staff to use this command?
* @type {boolean}
* @default false
*/
this.staff_only = data.staff_only === true;
/**
* Array of permissions needed for a user to use this command
* @type {string[]}
*/
this.permissions = data.permissions ?? [];
/**
* The command options
* @type {CommandOption[]}
*/
this.options = data.options ?? [];
/**
* True if command is internal, false if it is from a plugin
* @type {boolean}
*/
this.internal = data.internal === true;
if (!this.internal) {
/**
* The plugin this command belongs to, if any
* @type {(undefined|Plugin)}
*/
this.plugin = this.client.plugins.plugins.find(p => p.commands?.includes(this.name));
}
try {
this.manager.register(this); // register the command
} catch (error) {
return this.client.log.error(error);
}
}
/**
* The code to be executed when a command is invoked
* @abstract
* @param {Interaction} interaction - The message that invoked this command
*/
async execute(interaction) { } // eslint-disable-line no-unused-vars
async build(guild) {
return {
defaultPermission: !this.staff_only,
description: this.description,
name: this.name,
options: typeof this.options === 'function' ? await this.options(guild) : this.options
};
}
static get option_types() {
return {
SUB_COMMAND: 1,
SUB_COMMAND_GROUP: 2,
STRING: 3, // eslint-disable-line sort-keys
INTEGER: 4, // eslint-disable-line sort-keys
BOOLEAN: 5, // eslint-disable-line sort-keys
USER: 6,
CHANNEL: 7, // eslint-disable-line sort-keys
ROLE: 8,
MENTIONABLE: 9, // eslint-disable-line sort-keys
NUMBER: 10
};
}
};

View File

@@ -1,213 +0,0 @@
const {
Client, // eslint-disable-line no-unused-vars
Collection,
Interaction, // eslint-disable-line no-unused-vars
MessageEmbed
} = require('discord.js');
const fs = require('fs');
const { path } = require('../../utils/fs');
/**
* Manages the loading and execution of commands
*/
module.exports = class CommandManager {
/**
* Create a CommandManager instance
* @param {import('../..').Bot} client
*/
constructor(client) {
/** The Discord Client */
this.client = client;
/**
* A discord.js Collection (Map) of loaded commands
* @type {Collection<string, import('./command')>}
*/
this.commands = new Collection();
}
/** Automatically load all internal commands */
load() {
const files = fs.readdirSync(path('./src/commands'))
.filter(file => file.endsWith('.js'));
for (let file of files) {
try {
file = require(`../../commands/${file}`);
new file(this.client);
} catch (e) {
this.client.log.warn('An error occurred whilst loading an internal command');
this.client.log.error(e);
}
}
}
/** Register a command */
register(command) {
const exists = this.commands.has(command.name);
const is_internal = (exists && command.internal) || (exists && this.commands.get(command.name).internal);
if (is_internal) {
const plugin = this.client.plugins.plugins.find(p => p.commands.includes(command.name));
if (plugin) this.client.log.commands(`The "${plugin.name}" plugin has overridden the internal "${command.name}" command`);
else this.client.log.commands(`An unknown plugin has overridden the internal "${command.name}" command`);
if(command.internal) return;
} else if (exists) {
throw new Error(`A non-internal command with the name "${command.name}" already exists`);
}
this.commands.set(command.name, command);
this.client.log.commands(`Loaded "${command.name}" command`);
}
async publish(guild) {
if (!guild) {
return this.client.guilds.cache.forEach(guild => {
this.publish(guild);
});
}
try {
const commands = await Promise.all(this.client.commands.commands.map(async command => await command.build(guild)));
await this.client.application.commands.set(commands, guild.id);
await this.updatePermissions(guild);
this.client.log.success(`Published ${this.client.commands.commands.size} commands to "${guild.name}"`);
} catch (error) {
this.client.log.warn('An error occurred whilst publishing the commands');
this.client.log.error(error);
}
}
async updatePermissions(guild) {
guild.commands.fetch().then(async commands => {
const permissions = [];
const settings = await this.client.utils.getSettings(guild.id);
const blacklist = [];
settings.blacklist.users?.forEach(userId => {
blacklist.push({
id: userId,
permission: false,
type: 'USER'
});
});
settings.blacklist.roles?.forEach(roleId => {
blacklist.push({
id: roleId,
permission: false,
type: 'ROLE'
});
});
const categories = await this.client.db.models.Category.findAll({ where: { guild: guild.id } });
const staff_roles = new Set(categories.map(category => category.roles).flat());
commands.forEach(async g_cmd => {
const cmd_permissions = [...blacklist];
const command = this.client.commands.commands.get(g_cmd.name);
if (command.staff_only) {
cmd_permissions.push({
id: guild.roles.everyone.id,
permission: false,
type: 'ROLE'
});
staff_roles.forEach(roleId => {
cmd_permissions.push({
id: roleId,
permission: true,
type: 'ROLE'
});
});
}
permissions.push({
id: g_cmd.id,
permissions: cmd_permissions
});
});
this.client.log.debug(`Command permissions for "${guild.name}"`, require('util').inspect(permissions, {
colors: true,
depth: 10
}));
try {
await guild.commands.permissions.set({ fullPermissions: permissions });
} catch (error) {
this.client.log.warn('An error occurred whilst updating command permissions');
this.client.log.error(error);
}
});
}
/**
* Execute a command
* @param {Interaction} interaction - Command message
*/
async handle(interaction) {
if (!interaction.guild) return this.client.log.debug('Ignoring non-guild command interaction');
const settings = await this.client.utils.getSettings(interaction.guild.id);
const i18n = this.client.i18n.getLocale(settings.locale);
const command = this.commands.get(interaction.commandName);
if (!command) return;
const bot_permissions = interaction.guild.me.permissionsIn(interaction.channel);
const required_bot_permissions = [
'ATTACH_FILES',
'EMBED_LINKS',
'MANAGE_CHANNELS',
'MANAGE_MESSAGES'
];
if (!bot_permissions.has(required_bot_permissions)) {
const perms = required_bot_permissions.map(p => `\`${p}\``).join(', ');
if (bot_permissions.has('EMBED_LINKS')) {
await interaction.reply({
embeds: [
new MessageEmbed()
.setColor('ORANGE')
.setTitle(i18n('bot.missing_permissions.title'))
.setDescription(i18n('bot.missing_permissions.description', perms))
]
});
} else {
await interaction.reply({ content: i18n('bot.missing_permissions.description', perms) });
}
return;
}
const missing_permissions = command.permissions instanceof Array && !interaction.member.permissions.has(command.permissions);
if (missing_permissions) {
const perms = command.permissions.map(p => `\`${p}\``).join(', ');
return await interaction.reply({
embeds: [
new MessageEmbed()
.setColor(settings.error_colour)
.setTitle(i18n('missing_permissions.title'))
.setDescription(i18n('missing_permissions.description', perms))
],
ephemeral: true
});
}
try {
this.client.log.commands(`Executing "${command.name}" command (invoked by ${interaction.user.tag})`);
await command.execute(interaction); // execute the command
} catch (e) {
this.client.log.warn(`An error occurred whilst executing the ${command.name} command`);
this.client.log.error(e);
await interaction.reply({
embeds: [
new MessageEmbed()
.setColor('ORANGE')
.setTitle(i18n('command_execution_error.title'))
.setDescription(i18n('command_execution_error.description'))
]
}); // hopefully no user will ever see this message
}
}
};

View File

@@ -1,15 +0,0 @@
module.exports = class EventListener {
/**
*
* @param {import("../..").Bot} client
* @param {*} data
*/
constructor(client, data) {
this.client = client;
this.event = data.event;
this.raw = data.raw || false;
this.once = data.once || false;
}
};

View File

@@ -1,36 +0,0 @@
const fs = require('fs');
const { path } = require('../../utils/fs');
/**
* Manages the loading of event listeners
*/
module.exports = class ListenerLoader {
/**
* Create a ListenerLoader instance
* @param {import('../..').Bot} client
*/
constructor(client) {
/** The Discord Client */
this.client = client;
}
load() {
const files = fs.readdirSync(path('./src/listeners'))
.filter(file => file.endsWith('.js'));
for (let file of files) {
try {
file = require(`../../listeners/${file}`);
const listener = new file(this.client);
const on = listener.once ? 'once' : 'on';
if (listener.raw) this.client.ws[on](listener.event, (...data) => listener.execute(...data));
else this.client[on](listener.event, (...data) => listener.execute(...data));
} catch (e) {
this.client.log.warn('An error occurred whilst loading a listener');
this.client.log.error(e);
}
}
}
};

View File

@@ -1,94 +0,0 @@
// eslint-disable-next-line no-unused-vars
const { Collection } = require('discord.js');
// eslint-disable-next-line no-unused-vars
const Plugin = require('./plugin');
/**
* Manages the loading of plugins
*/
module.exports = class PluginManager {
/**
* Create a PluginManager instance
* @param {import('../..').Bot} client
*/
constructor(client) {
/** The Discord Client */
this.client = client;
/**
* A discord.js Collection (Map) of loaded plugins
* @type {Collection<string, import('./plugin')>}
*/
this.plugins = new Collection();
/** Array of official plugins to be used to check if a plugin is official */
this.official = [
'dsctickets.settings-server',
'dsctickets.portal',
'dsctickets.text-transcripts'
];
}
handleError(id) {
if (!this.official.includes(id)) this.client.log.notice(`"${id}" is NOT an official plugin, please do not ask for help with it in the Discord Tickets support server, seek help from the plugin author instead.`);
}
/**
* Register and load a plugin
* @param {Plugin} plugin - the Plugin class
* @param {Object} pkg - contents of package.json
*/
register(plugin, pkg) {
let {
name: id,
version,
author,
description
} = pkg;
if (this.plugins.has(id)) {
this.client.log.warn(`(PLUGINS) A plugin with the ID "${id}" is already loaded, skipping`);
return;
}
if (typeof author === 'object') {
author = author.name ?? 'unknown';
}
const about = {
author,
description,
id,
version
};
try {
plugin = new (plugin(Plugin))(this.client, about);
this.plugins.set(id, plugin);
this.client.log.plugins(`Loading "${plugin.name}" v${version} by ${author}`);
plugin.preload();
} catch (e) {
this.handleError(id);
this.client.log.warn(`An error occurred whilst loading the "${id}" plugin`);
this.client.log.error(e);
process.exit();
}
}
/** Automatically register and load plugins */
load() {
this.client.config.plugins.forEach(plugin => {
try {
const main = require(plugin);
const pkg = require(`${plugin}/package.json`);
this.register(main, pkg);
} catch (e) {
this.handleError(plugin);
this.client.log.warn(`An error occurred whilst loading ${plugin}; have you installed it?`);
this.client.log.error(e);
process.exit();
}
});
}
};

View File

@@ -1,141 +0,0 @@
/* eslint-disable no-unused-vars */
const { Client } = require('discord.js');
const Command = require('../commands/command');
const fs = require('fs');
const { join } = require('path');
const { path } = require('../../utils/fs');
/**
* A plugin
*/
module.exports = class Plugin {
/**
* Create a new Plugin
* @param {import('../..').Bot} client The Discord Client
* @param {String} id The plugin ID
* @param {Object} options Plugin options
* @param {String} options.name A human-friendly name (can be different to the name in package.json)
* @param {String[]} options.commands An array of command names the plugin registers
*/
constructor(client, about, options = {}) {
/** The Discord Client */
this.client = client;
/** The PluginManager */
this.manager = this.client.plugins;
/** An official plugin? */
this.official = this.manager.official.includes(this.id);
const {
id,
version,
author,
description
} = about;
/**
* The human-friendly name of the plugin
* @type {string}
*/
this.name = options.name ?? id;
/**
* An array of commands from this plugin
* @type {string[]}
*/
this.commands = options.commands;
/**
* The unique ID of the plugin (NPM package name)
* @type {string}
*/
this.id = id;
/**
* The version of the plugin (NPM package version)
* @type {string}
*/
this.version = version;
/**
* The plugin author's name (NPM package author)
* @type {(undefined|string)}
*/
this.author = author;
/**
* The plugin description (NPM package description)
* @type {string}
*/
this.description = description;
const clean = this.id.replace(/@[-_a-zA-Z0-9]+\//, '');
/**
* Information about the plugin directory
* @property {string} name - A cleaned version of the plugin's ID suitable for use in the directory name
* @property {string} path - The absolute path of the plugin directory
*/
this.directory = {
name: clean,
path: path(`./user/plugins/${clean}`)
};
}
/**
* Create the plugin directory if it doesn't already exist
* @returns {Boolean} True if created, false if it already existed
*/
createDirectory() {
if (!fs.existsSync(this.directory.path)) {
this.client.log.plugins(`Creating plugin directory for "${this.name}"`);
fs.mkdirSync(this.directory.path);
return true;
} else {
return false;
}
}
/**
* Create the plugin config file if it doesn't already exist
* @param {Object} template The default config template
* @returns {Boolean} True if created, false if it already existed
*/
createConfig(template) {
this.createDirectory();
const file = join(this.directory.path, 'config.json');
if (!fs.existsSync(file)) {
this.client.log.plugins(`Creating plugin config file for "${this.name}"`);
fs.writeFileSync(file, JSON.stringify(template, null, 2));
return true;
} else {
return false;
}
}
/**
* Reset the plugin config file to the defaults
* @param {Object} template The default config template
*/
resetConfig(template) {
this.createDirectory();
const file = join(this.directory.path, 'config.json');
this.client.log.plugins(`Resetting plugin config file for "${this.name}"`);
fs.writeFileSync(file, JSON.stringify(template, null, 2));
}
/**
* The function where any code that needs to be executed before the client is ready should go.
* **This is executed _BEFORE_ the ready event**
* @abstract
*/
preload() { }
/**
* The main function where your code should go. Create commands and event listeners here.
* **This is executed _after_ the ready event**
* @abstract
*/
load() {}
};

View File

@@ -1,202 +0,0 @@
const { int2hex } = require('../../utils');
/** Manages ticket archiving */
module.exports = class TicketArchives {
/**
* Create a TicketArchives instance
* @param {import('../..').Bot} client
*/
constructor(client) {
/** The Discord Client */
this.client = client;
this.encrypt = this.client.cryptr.encrypt;
this.decrypt = this.client.cryptr.decrypt;
}
async addMessage(message) {
try {
// await this.client.db.transaction(async t => {
const t_row = await this.client.db.models.Ticket.findOne({
where: { id: message.channel.id }
/* transaction: t */
});
if (t_row) {
await this.client.db.models.Message.create({
author: message.author.id,
createdAt: new Date(message.createdTimestamp),
data: this.encrypt(JSON.stringify({
attachments: [...message.attachments.values()],
content: message.content,
embeds: message.embeds.map(embed => ({ embed }))
})),
id: message.id,
ticket: t_row.id
} /* { transaction: t } */);
await this.updateEntities(message);
}
// });
} catch (e) {
this.client.log.warn('Failed to add a message to the ticket archive');
this.client.log.error(e);
}
}
async updateMessage(message) {
try {
// await this.client.db.transaction(async t => {
const m_row = await this.client.db.models.Message.findOne({
where: { id: message.id }
/* transaction: t */
});
if (m_row) {
m_row.data = this.encrypt(JSON.stringify({
attachments: [...message.attachments.values()],
content: message.content,
embeds: message.embeds.map(embed => ({ embed }))
}));
if (message.editedTimestamp) {
m_row.edited = true;
await this.updateEntities(message);
}
await m_row.save(/* { transaction: t } */); // save changes
}
// });
} catch (e) {
this.client.log.warn('Failed to update message in the ticket archive');
this.client.log.error(e);
}
}
async deleteMessage(message) {
try {
// await this.client.db.transaction(async t => {
const msg = await this.client.db.models.Message.findOne({
where: { id: message.id }
/* transaction: t */
});
if (msg) {
msg.deleted = true;
await msg.save(/* { transaction: t } */); // save changes to message row
}
// });
} catch (e) {
this.client.log.warn('Failed to delete message in ticket archive');
this.client.log.error(e);
}
}
async updateEntities(message) {
// message author
await this.updateMember(message.channel.id, message.member);
// mentioned members
message.mentions.members.forEach(async member => {
await this.updateMember(message.channel.id, member);
});
// mentioned channels
message.mentions.channels.forEach(async channel => {
await this.updateChannel(message.channel.id, channel);
});
// mentioned roles
message.mentions.roles.forEach(async role => {
await this.updateRole(message.channel.id, role);
});
}
async updateMember(ticket_id, member) {
await this.updateRole(ticket_id, member.roles.highest);
try {
// await this.client.db.transaction(async t => {
const u_model_data = {
ticket: ticket_id,
user: member.user.id
};
const [u_row] = await this.client.db.models.UserEntity.findOrCreate({
defaults: {
...u_model_data,
role: member.roles.highest.id
},
where: u_model_data
/* transaction: t */
});
await u_row.update({
avatar: member.user.avatar,
bot: member.user.bot,
discriminator: member.user.discriminator,
display_name: this.encrypt(member.displayName),
role: member.roles.highest.id,
username: this.encrypt(member.user.username)
} /* { transaction: t } */);
return u_row;
// });
} catch (e) {
this.client.log.warn('Failed to update message author entity in ticket archive');
this.client.log.error(e);
}
}
async updateChannel(ticket_id, channel) {
try {
// await this.client.db.transaction(async t => {
const c_model_data = {
channel: channel.id,
ticket: ticket_id
};
const [c_row] = await this.client.db.models.ChannelEntity.findOrCreate({
defaults: c_model_data,
where: c_model_data
/* transaction: t */
});
await c_row.update({ name: this.encrypt(channel.name) } /* { transaction: t } */);
return c_row;
// });
} catch (e) {
this.client.log.warn('Failed to update mentioned channels entities in ticket archive');
this.client.log.error(e);
}
}
async updateRole(ticket_id, role) {
try {
// await this.client.db.transaction(async t => {
const r_model_data = {
role: role.id,
ticket: ticket_id
};
const [r_row] = await this.client.db.models.RoleEntity.findOrCreate({
defaults: r_model_data,
where: r_model_data
/* transaction: t */
});
await r_row.update({
colour: role.color === 0 ? '7289DA' : int2hex(role.color), // 7289DA = 7506394
name: this.encrypt(role.name)
} /* { transaction: t } */);
return r_row;
// });
} catch (e) {
this.client.log.warn('Failed to update mentioned roles entities in ticket archive');
this.client.log.error(e);
}
}
};

View File

@@ -1,440 +0,0 @@
/* eslint-disable max-lines */
const EventEmitter = require('events');
const TicketArchives = require('./archives');
const {
MessageActionRow,
MessageButton,
MessageEmbed
} = require('discord.js');
/** Manages tickets */
module.exports = class TicketManager extends EventEmitter {
/**
* Create a TicketManager instance
* @param {import('../..').Bot} client
*/
constructor(client) {
super();
/** The Discord Client */
this.client = client;
this.setMaxListeners(this.client.config.max_listeners);
this.archives = new TicketArchives(this.client);
}
/**
* Create a new ticket
* @param {string} guild_id - ID of the guild to create the ticket in
* @param {string} creator_id - ID of the ticket creator (user)
* @param {string} category_id - ID of the ticket category
* @param {string} [topic] - The ticket topic
*/
async create(guild_id, creator_id, category_id, topic) {
if (!topic) topic = '';
const cat_row = await this.client.db.models.Category.findOne({ where: { id: category_id } });
if (!cat_row) throw new Error('Ticket category does not exist');
const cat_channel = await this.client.channels.fetch(category_id);
if (cat_channel.children.size >= 50) throw new Error('Ticket category has reached child channel limit (50)');
const number = (await this.client.db.models.Ticket.count({ where: { guild: guild_id } })) + 1;
const guild = this.client.guilds.cache.get(guild_id);
const creator = await guild.members.fetch(creator_id);
const name = cat_row.name_format
.replace(/{+\s?(user)?name\s?}+/gi, creator.displayName)
.replace(/{+\s?num(ber)?\s?}+/gi, number);
const t_channel = await guild.channels.create(name, {
parent: category_id,
reason: `${creator.user.tag} requested a new ticket channel`,
topic: `${creator}${topic.length > 0 ? ` | ${topic}` : ''}`,
type: 'GUILD_TEXT'
});
t_channel.permissionOverwrites.edit(creator_id, {
ATTACH_FILES: true,
READ_MESSAGE_HISTORY: true,
SEND_MESSAGES: true,
VIEW_CHANNEL: true
}, `Ticket channel created by ${creator.user.tag}`);
const t_row = await this.client.db.models.Ticket.create({
category: category_id,
creator: creator_id,
guild: guild_id,
id: t_channel.id,
number,
topic: topic.length === 0 ? null : this.client.cryptr.encrypt(topic)
});
(async () => {
const settings = await this.client.utils.getSettings(guild.id);
const i18n = this.client.i18n.getLocale(settings.locale);
topic = t_row.topic
? this.client.cryptr.decrypt(t_row.topic)
: '';
if (cat_row.image) {
await t_channel.send({ content: cat_row.image });
}
const description = cat_row.opening_message
.replace(/{+\s?(user)?name\s?}+/gi, creator.displayName)
.replace(/{+\s?(tag|ping|mention)?\s?}+/gi, creator.user.toString());
const embed = new MessageEmbed()
.setColor(settings.colour)
.setAuthor(creator.user.username, creator.user.displayAvatarURL())
.setDescription(description)
.setFooter(settings.footer, guild.iconURL());
if (topic) embed.addField(i18n('ticket.opening_message.fields.topic'), topic);
const components = new MessageActionRow();
if (cat_row.claiming) {
components.addComponents(
new MessageButton()
.setCustomId('ticket.claim')
.setLabel(i18n('ticket.claim'))
.setEmoji('🙌')
.setStyle('SECONDARY')
);
}
if (settings.close_button) {
components.addComponents(
new MessageButton()
.setCustomId('ticket.close')
.setLabel(i18n('ticket.close'))
.setEmoji('✖️')
.setStyle('DANGER')
);
}
const mentions = cat_row.ping instanceof Array && cat_row.ping.length > 0
? cat_row.ping.map(id => id === 'everyone'
? '@everyone'
: id === 'here'
? '@here'
: `<@&${id}>`)
.join(', ')
: '';
const sent = await t_channel.send({
components: cat_row.claiming || settings.close_button ? [components] : [],
content: i18n('ticket.opening_message.content', mentions, creator.user.toString()),
embeds: [embed]
});
await sent.pin({ reason: 'Ticket opening message' });
await t_row.update({ opening_message: sent.id });
const pinned = t_channel.messages.cache.last();
if (pinned.system) {
pinned
.delete({ reason: 'Cleaning up system message' })
.catch(() => this.client.log.warn('Failed to delete system pin message'));
}
let questions;
if (cat_row.opening_questions) {
questions = cat_row.opening_questions
.map((q, index) => `**${index + 1}.** ${q}`)
.join('\n\n');
}
if (cat_row.require_topic && topic.length === 0) {
const collector_message = await t_channel.send({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setTitle(i18n('commands.new.request_topic.title'))
.setDescription(i18n('commands.new.request_topic.description'))
.setFooter(this.client.utils.footer(settings.footer, i18n('collector_expires_in', 120)), guild.iconURL())
]
});
const filter = message => message.author.id === t_row.creator;
const collector = t_channel.createMessageCollector({
filter,
time: 120000
});
collector.on('collect', async message => {
topic = message.content;
await t_row.update({ topic: this.client.cryptr.encrypt(topic) });
await t_channel.setTopic(`${creator} | ${topic}`, { reason: 'User updated ticket topic' });
await sent.edit(
new MessageEmbed()
.setColor(settings.colour)
.setAuthor(creator.user.username, creator.user.displayAvatarURL())
.setDescription(description)
.addField(i18n('ticket.opening_message.fields.topic'), topic)
.setFooter(settings.footer, guild.iconURL())
);
await message.react('✅');
collector.stop();
});
collector.on('end', async () => {
collector_message
.delete()
.catch(() => this.client.log.warn('Failed to delete topic collector message'));
if (cat_row.opening_questions) {
await t_channel.send({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setDescription(i18n('ticket.questions', questions))
.setFooter(settings.footer, guild.iconURL())
]
});
}
});
} else {
if (cat_row.opening_questions) {
await t_channel.send({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setDescription(i18n('ticket.questions', questions))
.setFooter(settings.footer, guild.iconURL())
]
});
}
}
})();
this.client.log.info(`${creator.user.tag} created a new ticket in "${guild.name}"`);
this.emit('create', t_row.id, creator_id);
return t_row;
}
/**
* Close a ticket
* @param {(string|number)} ticket_id - The channel ID, or the ticket number
* @param {string?} closer_id - ID of the member who is closing the ticket, or null
* @param {string} [guild_id] - The ID of the ticket's guild (used if a ticket number is provided instead of ID)
* @param {string} [reason] - The reason for closing the ticket
*/
async close(ticket_id, closer_id, guild_id, reason) {
const t_row = await this.resolve(ticket_id, guild_id);
if (!t_row) throw new Error(`A ticket with the ID or number "${ticket_id}" could not be resolved`);
ticket_id = t_row.id;
this.emit('beforeClose', ticket_id);
const guild = this.client.guilds.cache.get(t_row.guild);
const settings = await this.client.utils.getSettings(guild.id);
const i18n = this.client.i18n.getLocale(settings.locale);
const channel = await this.client.channels.fetch(t_row.id);
const close = async () => {
const pinned = await channel.messages.fetchPinned();
await t_row.update({
closed_by: closer_id || null,
closed_reason: reason ? this.client.cryptr.encrypt(reason) : null,
open: false,
pinned_messages: [...pinned.keys()]
});
if (closer_id) {
const closer = await guild.members.fetch(closer_id);
await this.archives.updateMember(ticket_id, closer);
const description = reason
? i18n('ticket.closed_by_member_with_reason.description', closer.user.toString(), reason)
: i18n('ticket.closed_by_member.description', closer.user.toString());
await channel.send({
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setAuthor(closer.user.username, closer.user.displayAvatarURL())
.setTitle(i18n('ticket.closed.title'))
.setDescription(description)
.setFooter(settings.footer, guild.iconURL())
]
});
setTimeout(async () => {
await channel.delete(`Ticket channel closed by ${closer.user.tag}${reason ? `: "${reason}"` : ''}`);
}, 5000);
this.client.log.info(`${closer.user.tag} closed a ticket (${ticket_id})${reason ? `: "${reason}"` : ''}`);
} else {
const description = reason
? i18n('ticket.closed_with_reason.description')
: i18n('ticket.closed.description');
await channel.send({
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setTitle(i18n('ticket.closed.title'))
.setDescription(description)
.setFooter(settings.footer, guild.iconURL())
]
});
setTimeout(async () => {
await channel.delete(`Ticket channel closed${reason ? `: "${reason}"` : ''}`);
}, 5000);
this.client.log.info(`A ticket was closed (${ticket_id})${reason ? `: "${reason}"` : ''}`);
}
};
if (channel) {
guild.members.fetch(t_row.creator)
.then(async creator => {
const cat_row = await this.client.db.models.Category.findOne({ where: { id: t_row.category } });
if (creator && cat_row.survey) {
const survey = await this.client.db.models.Survey.findOne({
where: {
guild: t_row.guild,
name: cat_row.survey
}
});
if (survey) {
await channel.send({
components: [
new MessageActionRow()
.addComponents(
new MessageButton()
.setCustomId(`start_survey:${channel.id}`)
.setLabel(i18n('ticket.survey.start.buttons.start'))
.setEmoji('✅')
.setStyle('SUCCESS')
)
.addComponents(
new MessageButton()
.setCustomId(`ignore_survey:${channel.id}`)
.setLabel(i18n('ticket.survey.start.buttons.ignore'))
.setEmoji('❌')
.setStyle('SECONDARY')
)
],
content: creator.toString(),
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setTitle(i18n('ticket.survey.start.title'))
.setDescription(i18n('ticket.survey.start.description', creator.toString(), survey.questions.length))
.setFooter(i18n('collector_expires_in', 60))
]
});
const filter = i => i.user.id === creator.id && i.customId.includes(channel.id);
const collector = channel.createMessageComponentCollector({
filter,
time: 60000
});
collector.on('collect', async i => {
await i.deferUpdate();
if (i.customId === `start_survey:${channel.id}`) {
const filter = message => message.author.id === creator.id;
let answers = [];
let number = 1;
for (const question of survey.questions) {
await channel.send({
embeds: [
new MessageEmbed()
.setColor(settings.colour)
.setTitle(`${number++}/${survey.questions.length}`)
.setDescription(question)
.setFooter(i18n('collector_expires_in', 60))
]
});
try {
const collected = await channel.awaitMessages({
errors: ['time'],
filter,
max: 1,
time: 60000
});
answers.push(collected.first().content);
} catch (collected) {
await close();
}
}
await channel.send({
embeds: [
new MessageEmbed()
.setColor(settings.success_colour)
.setTitle(i18n('ticket.survey.complete.title'))
.setDescription(i18n('ticket.survey.complete.description'))
.setFooter(settings.footer, guild.iconURL())
]
});
answers = answers.map(a => this.client.cryptr.encrypt(a));
await this.client.db.models.SurveyResponse.create({
answers,
survey: survey.id,
ticket: t_row.id
});
await close();
} else {
await close();
}
collector.stop();
});
collector.on('end', async collected => {
if (collected.size === 0) {
await close();
}
});
}
} else {
await close();
}
})
.catch(async error => {
this.client.log.debug(error);
await close();
});
}
this.emit('close', ticket_id);
return t_row;
}
/**
*
* @param {(string|number)} ticket_id - ID or number of the ticket
* @param {string} [guild_id] - The ID of the ticket's guild (used if a ticket number is provided instead of ID)
*/
async resolve(ticket_id, guild_id) {
let t_row;
if (this.client.channels.resolve(ticket_id)) {
t_row = await this.client.db.models.Ticket.findOne({ where: { id: ticket_id } });
} else {
t_row = await this.client.db.models.Ticket.findOne({
where: {
guild: guild_id,
number: ticket_id
}
});
}
return t_row;
}
};

View File

@@ -1,38 +0,0 @@
/* eslint-disable no-console */
const fetch = require('node-fetch');
const boxen = require('boxen');
const link = require('terminal-link');
const semver = require('semver');
const { format } = require('leekslazylogger');
const { version: current } = require('../../package.json');
module.exports = async client => {
if (!client.config.update_notice) return;
const json = await (await fetch('https://api.github.com/repos/discord-tickets/bot/releases')).json();
const update = json[0];
const latest = semver.coerce(update.tag_name);
if (!semver.valid(latest)) return;
if (semver.lt(current, latest)) {
client.log.notice(`There is an update available for Discord Tickets (${current} -> ${update.tag_name})`);
const lines = [
`&k&6You are currently using &c${current}&6, the latest is &a${update.tag_name}&6.&r`,
`&k&6Download "&f${update.name}&6" from&r`,
link('&k&6the GitHub releases page.&r&6', 'https://github.com/discord-tickets/bot/releases/')
];
console.log(
boxen(format(lines.join('\n')), {
align: 'center',
borderColor: 'yellow',
borderStyle: 'round',
margin: 1,
padding: 1
})
);
}
};

View File

@@ -1,96 +0,0 @@
const { GuildMember } = require('discord.js'); // eslint-disable-line no-unused-vars
const { Model } = require('sequelize'); // eslint-disable-line no-unused-vars
const config = require('../../user/config');
let current_presence = -1;
module.exports = class DiscordUtils {
constructor(client) {
this.client = client;
}
/**
* Generate embed footer text
* @param {string} text
* @param {string} [additional]
* @returns {string}
*/
footer(text, additional) {
if (text && additional) return `${text} | ${additional}`;
else return additional || text || '';
}
/**
* Check if a guild member is staff
* @param {GuildMember} member - the guild member
* @returns {boolean}
*/
async isStaff(member) {
const guild_categories = await this.client.db.models.Category.findAll({ where: { guild: member.guild.id } });
return guild_categories.some(cat => cat.roles.some(r => member.roles.cache.has(r)));
}
/**
* Fet a guild's settings
* @param {string} id - The guild's ID
* @returns {Promise<Model>}
*/
async getSettings(id) {
const data = { id };
const [settings] = await this.client.db.models.Guild.findOrCreate({
defaults: data,
where: data
});
return settings;
}
/**
* Delete a guild's settings
* @param {string} id - The guild ID
* @returns {Promise<Number>}
*/
async deleteSettings(id) {
const row = await this.getSettings(id);
return await row.destroy();
}
/**
* Select a presence from the config
* @returns {PresenceData}
*/
static selectPresence() {
const length = config.presence.presences.length;
if (length === 0) return {};
let num;
if (length === 1) {
num = 0;
} else if (config.presence.randomise) {
num = Math.floor(Math.random() * length);
} else {
current_presence = current_presence + 1; // ++ doesn't work on negative numbers
if (current_presence === length) {
current_presence = 0;
}
num = current_presence;
}
const {
activity: name,
status,
type,
url
} = config.presence.presences[num];
return {
activities: [
{
name,
type,
url
}
],
status
};
}
};

View File

@@ -1,43 +0,0 @@
module.exports = {
letters: {
A: '🇦',
B: '🇧',
C: '🇨',
D: '🇩',
E: '🇪',
F: '🇫',
G: '🇬',
H: '🇭',
I: '🇮',
J: '🇯',
K: '🇰',
L: '🇱',
M: '🇲',
N: '🇳',
O: '🇴',
P: '🇵',
Q: '🇶',
R: '🇷',
S: '🇸',
T: '🇹',
U: '🇺',
V: '🇻',
W: '🇼',
X: '🇽',
Y: '🇾',
Z: '🇿'
},
numbers: {
0: '0⃣',
1: '1⃣',
2: '2⃣',
3: '3⃣',
4: '4⃣',
5: '5⃣',
6: '6⃣',
7: '7⃣',
8: '8⃣',
9: '9⃣',
10: '🔟'
}
};

View File

@@ -1,10 +0,0 @@
const { join } = require('path');
module.exports = {
/**
* Make a relative path absolute
* @param {string} path - A path relative to the root of the project (like "./user/config.js")
* @returns {string} absolute path
*/
path: path => join(__dirname, '../../', path)
};

View File

@@ -1,10 +0,0 @@
module.exports = {
int2hex: int => int.toString(16).toUpperCase(),
some: async (array, func) => {
for (const element of array) {
if (await func(element)) return true;
}
return false;
},
wait: time => new Promise(res => setTimeout(res, time))
};