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,9 +0,0 @@
FROM node:16
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm i --production
COPY . .
CMD ["npm", "start"]

142
README.md
View File

@ -1,142 +0,0 @@
[![GitHub stars](https://img.shields.io/github/stars/discord-tickets/bot?style=flat-square)](https://github.com/discord-tickets/bot/stargazers)
[![GitHub forks](https://img.shields.io/github/forks/discord-tickets/bot?style=flat-square)](https://github.com/discord-tickets/bot/stargazers)
[![License](https://img.shields.io/github/license/discord-tickets/bot?style=flat-square)](https://github.com/discord-tickets/bot/blob/main/LICENSE)
![](https://img.shields.io/badge/dynamic/json?color=5865F2&label=bots&query=clients&url=https%3A%2F%2Fstats.discordtickets.app&logo=discord&logoColor=white&style=flat-square)
![](https://img.shields.io/badge/dynamic/json?color=5865F2&label=tickets&query=tickets&url=https%3A%2F%2Fstats.discordtickets.app&logo=discord&logoColor=white&style=flat-square)
[![Codacy](https://img.shields.io/codacy/grade/b974eb5f984c40868e07d82c968bd02d?logo=codacy&style=flat-square)](https://www.codacy.com/gh/discord-tickets/bot/dashboard?utm_source=github.com&utm_medium=referral&utm_content=discord-tickets/bot&utm_campaign=Badge_Grade)
[![Discord](https://img.shields.io/discord/451745464480432129?label=discord&color=7289DA&style=flat-square)](https://go.eartharoid.me/discord)
[![Weblate](http://i18n.capestar.net/widgets/discord-tickets/-/bot/svg-badge.svg)](https://i18n.capestar.net/engage/discord-tickets/)
<br>
---
<div align="center">
<a href="https://discordtickets.app/getting-started#pebblehost">
<img src="https://img.eartharoid.me/insecure/rs:auto:180/plain/s3://eartharoid/sharex/21/10/pebblehost.webp"/>
</a>
<br />
<br />
<b><a href="https://discordtickets.app/getting-started#pebblehost">Partnered with PebbleHost</a></b>
<br>
<sub>
for cheap bot hosting
</sub>
</div>
---
<br>
![Discord Tickets](https://img.eartharoid.me/insecure/plain/https://static.eartharoid.me/discord-tickets/logo/wordmark/gradient-by-eartharoid.png@png)
An open-source ticket management bot for Discord - a free alternative to the premium and white-label plans of other popular ticketing bots.
[![ProductHunt](https://api.producthunt.com/widgets/embed-image/v1/review.svg?post_id=321112&theme=light)](https://www.producthunt.com/posts/discord-tickets?utm_source=badge-review&utm_medium=badge&utm_souce=badge-discord-tickets#discussion-body)
## What is this?
Discord Tickets is a Discord bot for creating and managing ticket channels. It is a free and open-source alternative to the paid "premium" and "white-label" plans of popular ticketing bots, such as [Ticket Tool](https://tickettool.xyz/), [TicketsBot](https://ticketsbot.net/), [Tickety](https://tickety.net/), [Helper.gg](https://helper.gg/), [Helper](https://helper.wtf), and others.
Discord Tickets is feature-rich and much more customisable than many of the bots mentioned above. As it is intended for self-hosting, the bot can have your community/company's logo, for free.
Although intended for use in a single Discord server, the bot can also function in multiple servers at once if you run more than one community.
### Features
Discord Tickets is packed full of features, many of which were suggested by its users. If it's missing a feature you want, you can:
- Create a plugin for it, if you can code JavaScript
- Request someone else to make a plugin
- [Submit a feature request](https://github.com/discord-tickets/.github/blob/main//CONTRIBUTING.md#submitting-a-feature-request) if you think many other users would benefit from it
Here's some of the things that makes Discord Tickets awesome:
1. **Highly customisable**
Some messages can be configured for each server and for each ticket category. Every other message is set in the locale files, making it relatively easy to override the default messages.
You can also configure the functionality of the bot to your liking and add commands with plugins.
2. **Localisable**
If the bot hasn't already been translated to your (community's) language, you can [translate](https://github.com/discord-tickets/.github/blob/main//CONTRIBUTING.md#translating) it yourself.
Plugin authors are encouraged to support multiple languages as well.
<details>
<summary>Translation status</summary>
<a href="https://i18n.capestar.net/engage/discord-tickets/">
<img src="https://i18n.capestar.net/widgets/discord-tickets/-/bot/multi-auto.svg" alt="Weblate" />
</a>
</details>
3. **Multiple ticket categories**
Each ticket category has its own settings for messages and the support team roles. There's also multiple methods of creating a ticket.
4. **A beautiful ticket archives portal**
**\[COMING SOON\] :** Add the official [Discord Tickets Portal](https://github.com/discord-tickets/portal) plugin for an instant ticket archives website.
You can use [text transcripts](https://discordtickets.app/plugins/official/text-transcripts/) whilst you wait for the portal.
5. **Open-source and self-hosted**
It's yours, you have full control.
## Getting started
| [**Host it yourself**](https://discordtickets.app/getting-started) | [**Managed bot**](https://discordtickets.app/getting-started#managed-hosting) | [**Public test bot**](https://discord.com/oauth2/authorize?permissions=8&scope=applications.commands%20bot&client_id=475371285531066368) |
|:-:|:-:|:-:|
| Recommended if you have some experience. | Recommended if you want a bot without hosting it. | Try out the bot for a few days. |
| [Go to the docs »](https://discordtickets.app/getting-started) | [Learn more »](https://discordtickets.app/getting-started#managed-hosting) | [Add to Discord »](https://discord.com/oauth2/authorize?permissions=8&scope=applications.commands%20bot&client_id=475371285531066368) |
Discord Tickets is partnered with [PebbleHost](https://discordtickets.app/getting-started#pebblehost). Click on the logo below if you want to self host but you don't have a server.
[![PebbleHost](https://img.eartharoid.me/insecure/rs:auto:180/plain/s3://eartharoid/sharex/21/10/pebblehost.webp)](https://discordtickets.app/getting-started#pebblehost)
## Documentation
You will find most of information you need at [discordtickets.app](https://discordtickets.app).
## Support
If the [documentation](https://discordtickets.app) leaves you with questions, you can ask for help in the [discussions](https://github.com/discord-tickets/bot/discussions/categories/support-q-a) or join the support server on Discord.
[![Join the Discord server](https://img.eartharoid.me/insecure/rs:auto:440:200/plain/s3://eartharoid/images/join-discord.png@png)](https://go.eartharoid.me/discord)
## Contributing
For contributing instructions, or to find out all of the ways you can contribute, read [CONTRIBUTING.md](https://github.com/discord-tickets/.github/blob/main//CONTRIBUTING.md). All contributions are welcome and encouraged, but please [read the information](https://github.com/discord-tickets/.github/blob/main//CONTRIBUTING.md) given before doing so.
## Contributors
Thank you to everyone to has contributed to Discord Tickets, including everyone who has:
- Contributed code
- Translated
- Improved documentation
- Reported bugs
- Requested a feature
- Given help or support to other users
- Created a public plugin
- Created resources such as tutorials
**A full list of contributors can be found in [CONTRIBUTORS.md](https://github.com/discord-tickets/bot/blob/main/CONTRIBUTORS.md).**
## Sponsors
*Does your community or company use Discord Tickets? [Sponsor the project](https://github.com/discord-tickets/bot/?sponsor=1) to get your logo shown here.*
**These awesome people and communities sponsor Discord Tickets:**
- [reSkybounds](https://reskybounds.com/) ([Discord](https://discord.reskybounds.com/))
- [thephilluk#0204](https://discord.com/users/166187860968472577) <!-- @thephilluk -->
### Donate
[![Donate at ko-fi](https://www.ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/eartharoid)
## License
Discord Tickets is licensed under the [GPLv3 license](https://github.com/discord-tickets/bot/blob/main/LICENSE).
This is not an official Discord product. It is not affiliated with nor endorsed by Discord Inc.
© 2021 Isaac Saunders

View File

@ -1,9 +0,0 @@
DISCORD_TOKEN=
DB_ENCRYPTION_KEY=
DB_TYPE=sqlite
DB_HOST=
DB_PORT=
DB_NAME=
DB_USER=
DB_PASS=
DB_TABLE_PREFIX=dsctickets_

View File

@ -1,69 +0,0 @@
{
"name": "@eartharoid/discord-tickets",
"version": "3.1.3",
"private": true,
"description": "An open-source Discord bot for ticket management",
"main": "src/index.js",
"scripts": {
"contributors:add": "all-contributors add",
"contributors:generate": "all-contributors generate",
"lint": "eslint src --fix",
"start": "node src/",
"test": "echo \"Nothing to test! Run with 'npm start'\" && exit 1"
},
"engines": {
"node": ">=16.6"
},
"repository": {
"type": "git",
"url": "git+https://github.com/discord-tickets/bot.git"
},
"keywords": [
"discord",
"tickets",
"bot"
],
"author": "eartharoid",
"license": "GPL-3.0",
"bugs": {
"url": "https://github.com/discord-tickets/bot/issues"
},
"homepage": "https://discordtickets.app",
"funding": "https://github.com/discord-tickets/bot/?sponsor=1",
"dependencies": {
"@eartharoid/i18n": "^1.0.1",
"boxen": "^5.1.2",
"cryptr": "^6.0.2",
"discord.js": "^13.2.0",
"dotenv": "^8.6.0",
"keyv": "^4.0.3",
"leeks.js": "^0.2.4",
"leekslazylogger": "^3.0.2",
"ms": "^2.1.3",
"mustache": "^4.2.0",
"node-fetch": "^2.6.5",
"semver": "^7.3.5",
"sequelize": "^6.6.5",
"terminal-link": "^2.1.1"
},
"devDependencies": {
"all-contributors-cli": "^6.20.0",
"eslint": "^7.32.0",
"mariadb": "^2.5.4",
"mysql2": "^2.3.0",
"nodemon": "^2.0.13",
"pg": "^8.7.1",
"pg-hstore": "^2.3.4",
"tedious": "^11.8.0"
},
"optionalDependencies": {
"sqlite3": "^5.0.2"
},
"peerDependencies": {
"mariadb": "^2.5.4",
"mysql2": "^2.3.0",
"pg": "^8.7.1",
"pg-hstore": "^2.3.4",
"tedious": "^11.4.0"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,50 +0,0 @@
{
"_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO",
"meta": {
"version": "PTDL_v1",
"update_url": null
},
"exported_at": "2021-05-26T22:41:44+02:00",
"name": "Discord Tickets",
"author": "contact@discordtickets.app",
"description": "https:\/\/discordtickets.app",
"features": null,
"images": [
"ghcr.io\/parkervcp\/yolks:nodejs_16"
],
"file_denylist": [],
"startup": "if [[ ! -z ${VERSION} ]]; then\r\n echo -e \\\"Using version ${VERSION}\\\";\r\nelse\r\n echo -e \\\"Please set the VERSION variable \\(e.g. v3.1.1\\)\\\";\r\n exit 0;\r\nfi;\r\n\r\nif [[ -d .git ]]; then\r\n git fetch --all --tags;\r\n git checkout tags\/${VERSION};\r\nfi;\r\n\r\nif [ -f \/home\/container\/package.json ]; then\r\n \/usr\/local\/bin\/npm install --production;\r\nfi;\r\n\r\nif [[ ! -z ${PLUGINS} ]]; then\r\n \/usr\/local\/bin\/npm install ${PLUGINS} --no-save;\r\nfi;\r\n\r\n\/usr\/local\/bin\/npm start",
"config": {
"files": "{}",
"startup": "{\r\n \"done\": \"Connected to Discord as \",\r\n \"userInteraction\": [\r\n \"Please set your bot's \\\"DISCORD_TOKEN\\\" in \\\".\/.env\\\".\"\r\n ]\r\n}",
"logs": "{}",
"stop": "^C^C"
},
"scripts": {
"installation": {
"script": "#!\/bin\/bash\r\n\r\napt update\r\napt install -y git curl jq file unzip make gcc g++ python python-dev libtool\r\n\r\nmkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\nif [[ ! -z ${VERSION} ]]; then\r\n echo -e \\\"Using version ${VERSION}\\\"\r\nelse\r\n echo -e \\\"Please set the VERSION variable \\(e.g. v3.0.0\\)\\\"\r\n exit 1\r\nfi\r\n\r\nif [ \\\"$(ls -A \/mnt\/server)\\\" ] && [[ -d .git ]]; then\r\n echo -e \\\".git directory exists\\\"\r\n if [ -f .git\\\/config ]; then\r\n echo \\\"Upating...\\\"\r\n git fetch --all --tags\r\n git checkout tags\/${VERSION}\r\n else\r\n echo -e \\\"files found with no git config\\\"\r\n echo -e \\\"closing out without touching things to not break anything\\\"\r\n exit 1\r\n fi\r\nelse\r\n echo -e \\\"Cloning...\\\"\r\n git clone https:\/\/github.com\/discord-tickets\/bot.git .\r\n\tgit checkout tags\/${VERSION}\r\nfi\r\n\r\necho \\\"Installing dependencies\\\"\r\n\r\nif [[ ! -z ${PUGINS} ]]; then\r\n \/usr\/local\/bin\/npm install ${PUGINS}\r\nfi\r\n\r\nif [ -f \/mnt\/server\/package.json ]; then\r\n \/usr\/local\/bin\/npm install --production\r\nfi\r\n\r\necho -e \\\"Installed\\\"\r\nexit 0",
"container": "node:14-buster-slim",
"entrypoint": "bash"
}
},
"variables": [
{
"name": "Version",
"description": "The version of the bot to use.",
"env_variable": "VERSION",
"default_value": "v3.1.1",
"user_viewable": true,
"user_editable": true,
"rules": "required|string|max:20"
},
{
"name": "Plugins",
"description": "A list of extra NPM package names to install as plugins, separated by a space: \"example1 exmaple2 example3\"",
"env_variable": "PLUGINS",
"default_value": "",
"user_viewable": true,
"user_editable": true,
"rules": "nullable|string"
}
]
}

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))
};

View File

@ -1,56 +0,0 @@
/**
* ###############################################################################################
* ____ _ _____ _ _
* | _ \ (_) ___ ___ ___ _ __ __| | |_ _| (_) ___ | | __ ___ | |_ ___
* | | | | | | / __| / __| / _ \ | '__| / _` | | | | | / __| | |/ / / _ \ | __| / __|
* | |_| | | | \__ \ | (__ | (_) | | | | (_| | | | | | | (__ | < | __/ | |_ \__ \
* |____/ |_| |___/ \___| \___/ |_| \__,_| |_| |_| \___| |_|\_\ \___| \__| |___/
*
* ---------------------
* Support
* ---------------------
*
* > Documentation: https://discordtickets.app
* > Discord support server: https://go.eartharoid.me/discord
*
* ###############################################################################################
*/
module.exports = {
defaults: {
colour: '#009999',
log_messages: true,
name_format: 'ticket-{number}',
opening_message: 'Hello {name}, thank you for creating a ticket. A member of staff will soon be available to assist you.\n\n__All messages in this channel are stored for future reference.__'
},
developer: { debug: false },
locale: 'en-GB',
logs: {
enabled: true,
keep_for: 30,
split: true
},
max_listeners: 10,
plugins: [],
presence: {
duration: 60,
presences: [
{
activity: '/new',
type: 'PLAYING'
},
{
activity: 'with tickets',
type: 'PLAYING'
},
{
activity: 'tickets',
type: 'WATCHING'
}
],
randomise: true
},
super_secret_setting: true,
update_notice: true
};

View File