some tickets stuff

This commit is contained in:
Jonny_Bro (Nikita) 2023-07-07 17:34:23 +05:00
parent c3dca64be4
commit aaa0d01c54
83 changed files with 931 additions and 113 deletions

View file

@ -42,6 +42,10 @@ module.exports = mongoose.model("Guild", new Schema({
memberUpdate: null,
messageUpdate: null,
},
tickets: {
ticketLogs: null,
transcriptionLogs: null,
},
suggestions: null,
reports: null,
birthdays: null,

82
commands/!DISABLED/ban.js Normal file
View file

@ -0,0 +1,82 @@
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Ban extends BaseCommand {
/**
*
* @param {import("../../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("ban")
.setDescription(client.translate("moderation/ban:DESCRIPTION"))
.setDescriptionLocalizations({
uk: client.translate("moderation/ban:DESCRIPTION", null, "uk-UA"),
ru: client.translate("moderation/ban:DESCRIPTION", null, "ru-RU"),
})
.setDMPermission(false)
.setDefaultMemberPermissions(PermissionsBitField.Flags.BanMembers)
.addUserOption(option =>
option
.setName("user")
.setDescription(client.translate("common:USER"))
.setDescriptionLocalizations({
uk: client.translate("common:USER", null, "uk-UA"),
ru: client.translate("common:USER", null, "ru-RU"),
})
.setRequired(true),
)
.addStringOption(option =>
option
.setName("reason")
.setDescription(client.translate("common:REASON"))
.setDescriptionLocalizations({
uk: client.translate("common:REASON", null, "uk-UA"),
ru: client.translate("common:REASON", null, "ru-RU"),
})
.setRequired(true),
),
aliases: [],
dirname: __dirname,
ownerOnly: false,
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply();
const member = interaction.options.getMember("user"),
reason = interaction.options.getString("reason"),
memberPosition = member.roles.highest.position,
moderationPosition = interaction.member.roles.highest.position;
if (member.user.bot) return interaction.error("misc:BOT_USER", null, { ephemeral: true, edit: true });
if (member.id === interaction.member.id) return interaction.error("moderation/ban:YOURSELF", null, { ephemeral: true, edit: true });
if (interaction.guild.ownerId !== interaction.member.id && !(moderationPosition > memberPosition) && member.bannable) return interaction.error("moderation/ban:SUPERIOR", null, { ephemeral: true, edit: true });
await member.ban({
reason,
});
interaction.success("moderation/ban:SUCCESS", {
user: member.user.toString(),
reason,
}, { edit: true });
}
}
module.exports = Ban;

View file

@ -0,0 +1,82 @@
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Kick extends BaseCommand {
/**
*
* @param {import("../../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("kick")
.setDescription(client.translate("moderation/kick:DESCRIPTION"))
.setDescriptionLocalizations({
uk: client.translate("moderation/kick:DESCRIPTION", null, "uk-UA"),
ru: client.translate("moderation/kick:DESCRIPTION", null, "ru-RU"),
})
.setDMPermission(false)
.setDefaultMemberPermissions(PermissionsBitField.Flags.KickMembers)
.addUserOption(option =>
option
.setName("user")
.setDescription(client.translate("common:USER"))
.setDescriptionLocalizations({
uk: client.translate("common:USER", null, "uk-UA"),
ru: client.translate("common:USER", null, "ru-RU"),
})
.setRequired(true),
)
.addStringOption(option =>
option
.setName("reason")
.setDescription(client.translate("common:REASON"))
.setDescriptionLocalizations({
uk: client.translate("common:REASON", null, "uk-UA"),
ru: client.translate("common:REASON", null, "ru-RU"),
})
.setRequired(true),
),
aliases: [],
dirname: __dirname,
ownerOnly: false,
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply();
const member = interaction.options.getMember("user"),
reason = interaction.options.getString("reason"),
memberPosition = member.roles.highest.position,
moderationPosition = interaction.member.roles.highest.position;
if (member.user.bot) return interaction.error("misc:BOT_USER", null, { ephemeral: true, edit: true });
if (member.id === interaction.member.id) return interaction.error("moderation/kick:YOURSELF", null, { ephemeral: true, edit: true });
if (interaction.guild.ownerId !== interaction.member.id && !(moderationPosition > memberPosition) && member.kickable) return interaction.error("moderation/kick:SUPERIOR", null, { ephemeral: true, edit: true });
await member.kick({
reason,
});
interaction.success("moderation/kick:SUCCESS", {
user: member.user.toString(),
reason,
}, { edit: true });
}
}
module.exports = Kick;

View file

@ -60,6 +60,7 @@ class Checkjar extends BaseCommand {
.setFooter({
text: client.config.embed.footer,
})
.setTimestamp()
.setDescription(`Текущий баланс: **${jar.balance / Math.pow(10, 2)}** грн\nТребуется на след. месяц: **379,18** грн (по курсу евро на 02.07.2023).\nЗдесь указаны последние 10 транзакций.`);
jarTransactions.length = 10;

View file

@ -0,0 +1,67 @@
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Ban extends BaseCommand {
/**
*
* @param {import("../../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("untimeout")
.setDescription(client.translate("moderation/untimeout:DESCRIPTION"))
.setDescriptionLocalizations({
uk: client.translate("moderation/untimeout:DESCRIPTION", null, "uk-UA"),
ru: client.translate("moderation/untimeout:DESCRIPTION", null, "ru-RU"),
})
.setDMPermission(false)
.setDefaultMemberPermissions(PermissionsBitField.Flags.ModerateMembers)
.addUserOption(option =>
option
.setName("user")
.setDescription(client.translate("common:USER"))
.setDescriptionLocalizations({
uk: client.translate("common:USER", null, "uk-UA"),
ru: client.translate("common:USER", null, "ru-RU"),
})
.setRequired(true),
),
aliases: [],
dirname: __dirname,
ownerOnly: false,
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply();
const member = interaction.options.getMember("user"),
timedout = member.isCommunicationDisabled();
if (member.user.bot) return interaction.error("misc:BOT_USER", null, { ephemeral: true, edit: true });
if (member.id === interaction.member.id) return interaction.error("moderation/untimeout:YOURSELF", null, { ephemeral: true, edit: true });
if (!timedout) return interaction.error("moderation/untimeout:NOT_TIMEDOUT", null, { ephemeral: true, edit: true });
await member.timeout(null);
interaction.success("moderation/untimeout:SUCCESS", {
user: member.user.toString(),
}, { edit: true });
}
}
module.exports = Ban;

View file

@ -34,7 +34,7 @@ class Warn extends BaseCommand {
if (member.user.bot) return interaction.error("misc:BOT_USER", null, { ephemeral: true });
if (member.id === interaction.member.id) return interaction.error("moderation/warn:YOURSELF", null, { ephemeral: true });
if (interaction.guild.ownerId !== interaction.member.id && !(moderationPosition > memberPosition)) return interaction.error("moderation/ban:SUPERIOR", null, { ephemeral: true });
if (interaction.guild.ownerId !== interaction.member.id && !(moderationPosition > memberPosition)) return interaction.error("moderation/warn:SUPERIOR", null, { ephemeral: true });
const memberData = await client.findOrCreateMember({
id: member.id,

View file

@ -0,0 +1,65 @@
const { SlashCommandBuilder, PermissionsBitField } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Adduser extends BaseCommand {
/**
*
* @param {import("../../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("adduser")
.setDescription(client.translate("tickets/adduser:DESCRIPTION"))
.setDescriptionLocalizations({
uk: client.translate("tickets/adduser:DESCRIPTION", null, "uk-UA"),
ru: client.translate("tickets/adduser:DESCRIPTION", null, "ru-RU"),
})
.setDMPermission(false)
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages)
.addUserOption(option =>
option
.setName("user")
.setDescription(client.translate("common:USER"))
.setDescriptionLocalizations({
uk: client.translate("common:USER", null, "uk-UA"),
ru: client.translate("common:USER", null, "ru-RU"),
})
.setRequired(true),
),
aliases: [],
dirname: __dirname,
ownerOnly: false,
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply();
const member = interaction.options.getMember("user");
if (member.user.bot) return interaction.error("misc:BOT_USER", null, { ephemeral: true, edit: true });
if (!interaction.channel.name.includes("support") && !interaction.channel.name.includes("application")) return interaction.error("tickets/adduser:NOT_TICKET", null, { ephemeral: true, edit: true });
await interaction.channel.permissionOverwrites.edit(member, { ViewChannel: true, SendMessages: true });
interaction.success("tickets/adduser:SUCCESS", {
user: member.user.toString(),
}, { edit: true });
}
}
module.exports = Adduser;

View file

@ -0,0 +1,122 @@
const { SlashCommandBuilder, PermissionsBitField, EmbedBuilder, ButtonBuilder, ButtonStyle, ActionRowBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class CloseTicket extends BaseCommand {
/**
*
* @param {import("../../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("closeticket")
.setDescription(client.translate("tickets/closeticket:DESCRIPTION"))
.setDescriptionLocalizations({
uk: client.translate("tickets/closeticket:DESCRIPTION", null, "uk-UA"),
ru: client.translate("tickets/closeticket:DESCRIPTION", null, "ru-RU"),
})
.setDMPermission(false)
.setDefaultMemberPermissions(PermissionsBitField.Flags.ManageMessages),
aliases: [],
dirname: __dirname,
ownerOnly: false,
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
await interaction.deferReply();
if (!interaction.channel.name.includes("support") && !interaction.channel.name.includes("application")) return interaction.error("tickets/adduser:NOT_TICKET", null, { ephemeral: true, edit: true });
const embed = new EmbedBuilder()
.setTitle(interaction.translate("tickets/closeticket:CLOSING_TITLE"))
.setDescription(interaction.translate("tickets/closeticket:CLOSING_DESC"))
.addFields(
{
name: interaction.translate("common:TICKET"),
value: interaction.channel.name,
},
{
name: interaction.translate("tickets/closeticket:CLOSING_BY"),
value: interaction.user.getUsetname(),
},
)
.setColor(client.config.embed.color)
.setFooter(client.config.embed.footer)
.setTimestamp();
const button = new ButtonBuilder().setCustomId("cancel").setLabel(interaction.translate("common:CANCEL")).setStyle(ButtonStyle.Danger);
const row = new ActionRowBuilder().addComponents(button);
await interaction.reply({
embeds: [embed],
components: [row],
});
const filter = i => i.customId === "cancel";
const collector = interaction.channel.createMessageComponentCollector({ filter, time: 5000 });
collector.on("collect", async i => {
await i.update({ content: interaction.translate("tickets/closeticket:CLOSING_CANCELED"), components: [] });
collector.stop("canceled");
});
collector.on("end", async (_, reason) => {
if (reason === "canceled") {
const transcriptionLogs = data.guildData.plugins.tickets.transcriptionLogs;
if (transcriptionLogs) interaction.guild.channels.cache.get(transcriptionLogs).send({ content: interaction.translate("tickets/closeticket:TRANSCRIPT", { channel: `<#${transcriptionLogs}>` }), files: [{ attachment: Buffer.from(transcript), name: `${interaction.channel.name}.txt` }] });
const reversedMessages = await interaction.channel.messages.fetch();
const messages = Array.from(reversedMessages.values()).reverse();
let transcript = "";
messages.forEach(message => {
transcript += `${message.author.username}: ${message.content}\n`;
});
try {
await interaction.user.send({ content: `Here is the transcript for your ticket: ${interaction.channel.name}`, files: [{ attachment: Buffer.from(transcript), name: `${interaction.channel.name}.txt` }] });
} catch (error) {
console.error(error);
await interaction.reply("An error occurred while trying to send the transcript to the user.");
}
await interaction.channel.delete();
}
});
const ticketLogs = data.guildData.plugins.tickets.ticketLogs;
const logEmbed = new EmbedBuilder()
.setTitle(interaction.translate("tickets/closeticket:CLOSED_TITLE"))
.addFields(
{
name: interaction.translate("common:TICKET"),
value: interaction.channel.name,
},
{
name: interaction.translate("tickets/closeticket:CLOSING_BY"),
value: interaction.user.getUsetname(),
},
)
.setColor(client.config.embed.color)
.setFooter(client.config.embed.footer)
.setTimestamp();
if (ticketLogs) interaction.guild.channels.cache.get(ticketLogs).send({ embeds: [logEmbed] });
}
}
module.exports = CloseTicket;

10
commands/Tickets/empty.js Normal file
View file

@ -0,0 +1,10 @@
const { SlashCommandBuilder } = require('discord.js');
module.exports = {
data: new SlashCommandBuilder()
.setName('test')
.setDescription('Replies with test'),
async execute(interaction) {
await interaction.reply('test');
},
};

View file

@ -0,0 +1,32 @@
const { SlashCommandBuilder, EmbedBuilder, ButtonBuilder, ButtonStyle, ActionRowBuilder, PermissionFlagsBits } = require('discord.js');
module.exports = {
data: new SlashCommandBuilder()
.setName('openticketchannel')
.setDescription('Creates an embed with buttons to open a ticket')
.setDefaultMemberPermissions(PermissionFlagsBits.ManageGuild),
async execute(interaction) {
// create embed for ticket
const embed = new EmbedBuilder()
.setTitle('Tickets')
.setDescription('Open a ticket by choosing a category below');
// add button for support and application
const supportButton = new ButtonBuilder()
.setCustomId('support')
.setLabel('Support')
.setStyle(ButtonStyle.Primary);
const applicationButton = new ButtonBuilder()
.setCustomId('application')
.setLabel('Application')
.setStyle(ButtonStyle.Primary);
const row = new ActionRowBuilder()
.addComponents(supportButton, applicationButton);
// send message with buttons
await interaction.channel.send({ embeds: [embed], components: [row] });
await interaction.reply('Done');
},
};

View file

@ -0,0 +1,35 @@
const { SlashCommandBuilder, PermissionFlagsBits } = require('discord.js');
module.exports = {
data: new SlashCommandBuilder()
.setName('removeuser')
.setDescription('Remove a user from a ticket')
.addMentionableOption(option =>
option.setName('user')
.setDescription('The user to remove')
.setRequired(true))
.setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages),
async execute(interaction) {
try {
const user = interaction.options.getMentionable('user');
const currentChannel = interaction.channel;
if (currentChannel) {
if (!interaction.channel.name.includes('support') && !interaction.channel.name.includes('application')) {
interaction.reply('This command can only be used in a ticket channel.');
return;
}
const member = await interaction.guild.members.fetch(user.id);
await interaction.channel.permissionOverwrites.edit(member, { ViewChannel: false });
interaction.reply(`Removed ${user} to the ticket.`);
}
else {
interaction.reply('This channel is not a ticket.');
}
}
catch (error) {
console.log(error);
interaction.reply('Error adding user to ticket.');
}
},
};

View file

@ -0,0 +1,27 @@
const { SlashCommandBuilder, PermissionFlagsBits } = require('discord.js');
module.exports = {
data: new SlashCommandBuilder()
.setName('rename')
.setDescription('Renames the ticket channel. Usage: /rename <new name>')
.addStringOption(option =>
option.setName('newname')
.setDescription('The new name for the ticket channel')
.setRequired(true))
.setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages),
async execute(interaction) {
try {
const newName = interaction.options.getString('newname');
if (!interaction.channel.name.includes('support') && !interaction.channel.name.includes('application')) {
interaction.reply('This command can only be used in a ticket channel.');
return;
}
await interaction.channel.setName(newName + '-' + interaction.channel.name.split('-')[1]);
interaction.reply(`Renamed the ticket channel to ${newName}`);
}
catch (error) {
console.error(error);
interaction.reply('An error occurred while trying to rename the ticket channel.');
}
},
};

241
interactions.js Normal file
View file

@ -0,0 +1,241 @@
if (interaction.isModalSubmit()) {
const age = interaction.fields.getTextInputValue('age');
const location = interaction.fields.getTextInputValue('location');
const experience = interaction.fields.getTextInputValue('experience');
const why = interaction.fields.getTextInputValue('why');
const embed = new EmbedBuilder()
.setTitle('Application')
.setDescription('Thank you for applying to the server!')
.addFields(
{ name: 'Age', value: age },
{ name: 'Location', value: location },
{ name: 'Experience', value: experience },
{ name: 'Why', value: why },
)
.setColor('#00ff00')
.setTimestamp();
// create ticket channel in application category
const channel = await interaction.guild.channels.create({
name: `${interaction.user.username}-application`,
type: ChannelType.GuildText,
parent: applicationTicketCategory,
permissionOverwrites: [
{
id: interaction.user.id,
allow: [PermissionsBitField.Flags.ViewChannel],
},
{
id: interaction.guild.roles.everyone,
deny: [PermissionsBitField.Flags.ViewChannel],
},
],
});
// for each role in config access_to_ticket array add permission to view channel
for (const role of access_to_ticket) {
await channel.permissionOverwrites.edit(role, { ViewChannel: true });
}
const pingMessage = access_to_ticket.map(role => `||<@&${role}>||`).join(' ') + ` ||${interaction.user}||`;
await channel.send(pingMessage);
// send message to ticket log channel
const logChannel = interaction.guild.channels.cache.get(ticketLogChannel);
await logChannel.send(`Ticket created by ${interaction.user} in ${channel}`);
await interaction.reply({ content: `Your application has been submitted. Please wait for a response from a staff member. ${channel}`, ephemeral: true });
const closeButton = new ButtonBuilder()
.setCustomId('close')
.setLabel('Close')
.setStyle(ButtonStyle.Danger);
const row = new ActionRowBuilder()
.addComponents(closeButton);
await channel.send({ embeds: [embed], components: [row] });
}
else if (interaction.isButton()) {
// handle openTicketChannel button interactions here
// application button ----------------------------------------------------------------------------------------
const button = interaction.component;
if (button.customId === 'application') {
// TODO: Create application embed builder by taking user input
const modal = new ModalBuilder()
.setCustomId('application')
.setTitle('Application');
const ageInput = new TextInputBuilder()
.setCustomId('age')
.setLabel('Enter your age')
.setStyle(TextInputStyle.Short);
const locationInput = new TextInputBuilder()
.setCustomId('location')
.setLabel('Enter your time zone and country')
.setStyle(TextInputStyle.Short);
const experienceInput = new TextInputBuilder()
.setCustomId('experience')
.setLabel('Enter your experience with Minecraft')
.setStyle(TextInputStyle.Paragraph);
const whyInput = new TextInputBuilder()
.setCustomId('why')
.setLabel('Why do you want to join this server?')
.setStyle(TextInputStyle.Paragraph);
const modalRow1 = new ActionRowBuilder()
.addComponents(ageInput);
const modalRow2 = new ActionRowBuilder()
.addComponents(locationInput);
const modalRow3 = new ActionRowBuilder()
.addComponents(experienceInput);
const modalRow4 = new ActionRowBuilder()
.addComponents(whyInput);
modal.addComponents(modalRow1, modalRow2, modalRow3, modalRow4);
await interaction.showModal(modal);
}
// support button ----------------------------------------------------------------------------------------
if (button.customId === 'support') {
const channel = await interaction.guild.channels.create({
name: `${interaction.user.username}-support`,
type: ChannelType.GuildText,
parent: supportTicketCategory,
permissionOverwrites: [
{
id: interaction.user.id,
allow: [PermissionsBitField.Flags.ViewChannel],
},
{
id: interaction.guild.roles.everyone,
deny: [PermissionsBitField.Flags.ViewChannel],
},
],
});
const logChannel = interaction.guild.channels.cache.get(ticketLogChannel);
const logEmbed = new EmbedBuilder()
.setTitle('Ticket Created')
.setDescription(`Ticket created by ${interaction.user} in ${channel}`)
.setTimestamp()
.setFooter({ text: 'Bot created by dylancanada' });
await logChannel.send({ embeds: [logEmbed] });
await interaction.reply({ content: `Ticket created at ${channel}`, ephemeral: true });
for (const role of access_to_ticket) {
await channel.permissionOverwrites.edit(role, { ViewChannel: true });
}
const pingMessage = access_to_ticket.map(role => `||<@&${role}>||`).join(' ');
await channel.send(pingMessage);
const embed = new EmbedBuilder()
.setTitle('Support Ticket')
.setDescription('Ticket created, click the button below to close the ticket')
.setAuthor({ name: interaction.user.username, iconURL: interaction.user.displayAvatarURL() })
.addFields({ name: 'Ticket', value: `Please explain your issue ${interaction.user} and someone will be with you shortly`, inline: false })
.setTimestamp()
.setFooter({ text: 'Bot created by dylancanada' });
const closeButton = new ButtonBuilder()
.setCustomId('close')
.setLabel('Close')
.setStyle(ButtonStyle.Danger);
const row = new ActionRowBuilder()
.addComponents(closeButton);
await channel.send({ embeds: [embed], components: [row] });
}
if (button.customId === 'close') {
const closeEmbed = new EmbedBuilder()
.setTitle('Closing Ticket')
.setDescription('This ticket will be closed in 5 seconds.')
.addFields(
{ name: 'Ticket', value: interaction.channel.name },
{ name: 'Closed By', value: interaction.user.username },
)
.setColor('#ff0000');
const closeButton = new ButtonBuilder()
.setCustomId('cancel')
.setLabel('Cancel')
.setStyle(ButtonStyle.Danger);
const row = new ActionRowBuilder()
.addComponents(closeButton);
await interaction.reply({ embeds: [closeEmbed], components: [row] });
const filter = i => i.customId === 'cancel';
const collector = interaction.channel.createMessageComponentCollector({ filter, time: 5000 });
// eslint-disable-next-line no-unused-vars
collector.on('collect', async i => {
await i.update({ content: 'Ticket close cancelled.', components: [] });
collector.stop();
});
collector.on('end', async collected => {
if (collected.size === 0) {
const transcriptChannel = interaction.guild.channels.cache.get(ticketTranscriptChannel);
const reversedMessages = await interaction.channel.messages.fetch({ limit: 100 });
const messages = Array.from(reversedMessages.values()).reverse();
let transcript = '';
messages.forEach(message => {
transcript += `${message.author.getUsername()}: ${message.content}\n`;
});
transcriptChannel.send({ content: `Transcript for ${interaction.channel.name}`, files: [{ attachment: Buffer.from(transcript), name: `${interaction.channel.name}.txt` }] });
try {
await interaction.user.send({ content: `Here is the transcript for your ticket: ${interaction.channel.name}`, files: [{ attachment: Buffer.from(transcript), name: `${interaction.channel.name}.txt` }] });
}
catch (error) {
console.error(error);
await interaction.reply('An error occurred while trying to send the transcript to the user.');
}
await interaction.channel.delete();
}
});
}
if (button.customId === 'transcript') {
const transcriptChannel = interaction.guild.channels.cache.get(ticketTranscriptChannel);
const reversedMessages = await interaction.channel.messages.fetch({ limit: 100 });
const messages = Array.from(reversedMessages.values()).reverse();
let transcript = '';
messages.forEach(message => {
transcript += `${message.author.username}: ${message.content}\n`;
});
transcriptChannel.send({ content: `Transcript for ${interaction.channel.name}`, files: [{ attachment: Buffer.from(transcript), name: `${interaction.channel.name}.txt` }] });
try {
await interaction.user.send({ content: `Here is the transcript for your ticket: ${interaction.channel.name}`, files: [{ attachment: Buffer.from(transcript), name: `${interaction.channel.name}.txt` }] });
}
catch (error) {
console.error(error);
await interaction.reply('An error occurred while trying to send the transcript to the user.');
}
}
}

View file

@ -1,6 +1,6 @@
{
"DESCRIPTION": "Modify a user's experience, level, credits, or bank",
"USAGE": "[type] [@user] [int]",
"EXAMPLES": "set type:Level user:@Jonny_Bro#4226 int:10",
"EXAMPLES": "set type:Level user:@jonny_bro int:10",
"INVALID_NUMBER": "The value must be greater than zero"
}

View file

@ -60,6 +60,7 @@
"STATUS_IDLE": "Idle",
"STATUS_OFFLINE": "Offline",
"STATUS_ONLINE": "Online",
"TICKET": "Ticket",
"UNKNOWN": "Unknown",
"USER": "User",
"USERNAME": "Username",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Shows a user's list of achievements",
"USAGE": "(@user)",
"EXAMPLES": "achievements\nachievements user:@Jonny_Bro#4226",
"EXAMPLES": "achievements\nachievements user:@jonny_bro",
"SEND_CMD": "Use your first command",
"CLAIM_SALARY": "Claim your salary 10 times",
"MARRY": "Find a partner",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Marry the one you love",
"USAGE": "[@user]",
"EXAMPLES": "marry user:@Jonny_Bro#4226",
"EXAMPLES": "marry user:@jonny_bro",
"BOT_USER": "Bots are forever alone ;(",
"ALREADY_MARRIED": "You are already married! You can divorce using the `divorce` command",
"ALREADY_MARRIED_USER": "You're too late! {{user}} is already married",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Shows the amount of credits for a user",
"USAGE": "(@user)",
"EXAMPLES": "money\nmoney user:@Jonny_Bro#4226",
"EXAMPLES": "money\nmoney user:@jonny_bro",
"BOT_USER": "He has too much money, I can't output that number",
"TITLE": "{{user}}'s Credits"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Sends credits to a user",
"USAGE": "[@user] [amount]",
"EXAMPLES": "pay user:@Jonny_Bro#4226 amount:1000",
"EXAMPLES": "pay user:@jonny_bro amount:1000",
"BOT_USER": "Bots don't need money B)",
"YOURSELF": "You cannot transfer credits to yourself",
"INVALID_AMOUNT": "Please specify an amount",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Shows user profile",
"USAGE": "(@user)",
"EXAMPLES": "profile\nprofile user:@Jonny_Bro#4226",
"EXAMPLES": "profile\nprofile user:@jonny_bro",
"BOT_USER": "Bots don't have a profile",
"TITLE": "{{user}}'s Profile",
"LINK": "Profile",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Gives reputation to a user",
"USAGE": "[@user]",
"EXAMPLES": "rep user:@Jonny_Bro#4226",
"EXAMPLES": "rep user:@jonny_bro",
"COOLDOWN": "You must wait **{{time}}** before using it again",
"BOT_USER": "Bots are already cool B)",
"YOURSELF": "You cannot give reputation to yourself",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Attempts to rob a user",
"USAGE": "[@user] [amount]",
"EXAMPLES": "rob user:@Jonny_Bro#4226 amount:100",
"EXAMPLES": "rob user:@jonny_bro amount:100",
"BOT_USER": "You cannot rob a bot",
"YOURSELF": "You cannot rob yourself",
"NOT_ENOUGH_AUTHOR": "You must have at least {{moneyMin}} to rob this user (you currently have {{moneyCurrent}})",

View file

@ -1,6 +1,6 @@
{
"DESCRIPTION": "Love Calculator",
"USAGE": "[@first_member] (@second_member)",
"EXAMPLES": "lovecalc first_member:@Jonny_Bro#4226\nlovecalc first_member:@Jonny_Bro#4226 second_member:@JaBa#9042",
"EXAMPLES": "lovecalc first_member:@jonny_bro\nlovecalc first_member:@jonny_bro second_member:@JaBa#9042",
"CONTENT": "{{firstMember}} loves {{secondMember}} at **{{percent}}%**"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Play Tic Tac Toe",
"USAGE": "[@user]",
"EXAMPLES": "tictactoe user:@Jonny_Bro#4226",
"EXAMPLES": "tictactoe user:@jonny_bro",
"BOT_USER": "You cannot play against a bot!",
"YOURSELF": "You cannot play against yourself!",
"INVITE_USER": "<@{{opponent}}>, you have been invited to play Tic Tac Toe!",

View file

@ -1,6 +1,6 @@
{
"DESCRIPTION": "Gets user's avatar",
"USAGE": "(@user)",
"EXAMPLES": "avatar\navatar user:@Jonny_Bro#4226",
"EXAMPLES": "avatar\navatar user:@jonny_bro",
"SERVER": "Server avatar?"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Sends a report to a designated channel",
"USAGE": "[@user] (message)",
"EXAMPLES": "report user:@Jonny_Bro#4226 message:Violation of rules",
"EXAMPLES": "report user:@jonny_bro message:Violation of rules",
"MISSING_CHANNEL": "The report channel is not set up",
"INVALID_USER": "You cannot report yourself",
"SUCCESS": "Your report has been sent to {{channel}}",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Shows user information",
"USAGE": "(@user)",
"EXAMPLES": "userinfo\nuserinfo user:@Jonny_Bro#4226",
"EXAMPLES": "userinfo\nuserinfo user:@jonny_bro",
"CUSTOM": "Custom Status",
"NO_ACTIVITY": "Not playing",
"NO_ROLE": "No role",

View file

@ -1,5 +1,6 @@
{
"BOT_USER": "You cannot do this with the bot.",
"CANT_DM": "I cannot DM you. Please check your privacy settings.",
"FORCE_STOP": "The game has been forcibly ended, {{user}}, nobody won (the number was {{number}}).",
"LEVEL_UP": "You have reached the next level! Your new level is: **{{level}}**",
"GUILD_ONLY": "This command can only be used on a server.",

View file

@ -0,0 +1,8 @@
{
"DESCRIPTION": "Bans a user",
"USAGE": "[@user] [reason]",
"EXAMPLES": "ban user:@jonny_bro reason:Violation of server rules",
"YOURSELF": "You cannot ban yourself",
"SUPERIOR": "You cannot ban this user (or I am unable to do so)",
"SUCCESS": "{{user}} has been banned for **{{reason}}**"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Clears messages in a channel",
"USAGE": "[option] (@user)",
"EXAMPLES": "clear option:10\nclear option:10 user:@Jonny_Bro#4226\nclear option:all",
"EXAMPLES": "clear option:10\nclear option:10 user:@jonny_bro\nclear option:all",
"OPTION": "Integer / all",
"REQUIRE_ID_USER": "Specify a user or ID",
"ALL_CONFIRM": "**All messages in the channel will be deleted! Are you sure?**",

View file

@ -1,6 +1,6 @@
{
"DESCRIPTION": "Removes all warnings from a user",
"USAGE": "[@user]",
"EXAMPLES": "clearwarns user:@Jonny_Bro#4226",
"EXAMPLES": "clearwarns user:@jonny_bro",
"SUCCESS": "Warnings of user {{user}} have been cleared"
}

View file

@ -0,0 +1,8 @@
{
"DESCRIPTION": "Kicks a user",
"USAGE": "[@user] [reason]",
"EXAMPLES": "kick user:@jonny_bro reason:Come back tomorrow when I stop getting offended",
"YOURSELF": "You cannot kick yourself",
"SUPERIOR": "You cannot kick this user (or I am unable to do so)",
"SUCCESS": "{{user}} has been kicked for **{{reason}}**"
}

View file

@ -0,0 +1,8 @@
{
"DESCRIPTION": "Removes timeout from a user",
"USAGE": "[@user]",
"EXAMPLES": "untimeout user:@jonny_bro",
"YOURSELF": "You cannot remove timeout from yourself",
"NOT_TIMEDOUT": "This user is not currently timed out",
"SUCCESS": "Timeout for {{user}} has been removed"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Shows a list of user's violations",
"USAGE": "[@user]",
"EXAMPLES": "warns user:@Jonny_Bro#4226",
"EXAMPLES": "warns user:@jonny_bro",
"SANCTIONS_OF": "Violations of {{member}}",
"NO_SANCTIONS": "**{{member}}** has no violations"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Allows you to modify user's data",
"USAGE": "[set/add] [type] [@user] [int]",
"EXAMPLES": "debug set type:Level user:@Jonny_Bro#4226 int:100",
"EXAMPLES": "debug set type:Level user:@jonny_bro int:100",
"TYPE": "Type of data",
"SET": "Set the value",
"ADD": "Add to the value",

View file

@ -1,6 +1,6 @@
{
"DESCRIPTION": "Изменить пользователю опыт, уровень, кредиты или банк",
"USAGE": "[type] [@user] [int]",
"EXAMPLES": "set type:Уровень user:@Jonny_Bro#4226 int:10",
"EXAMPLES": "set type:Уровень user:@jonny_bro int:10",
"INVALID_NUMBER": "Значение должно быть больше нуля"
}

View file

@ -60,6 +60,7 @@
"STATUS_IDLE": "Неактивен",
"STATUS_OFFLINE": "Не в сети",
"STATUS_ONLINE": "В сети",
"TICKET": "Тикет",
"UNKNOWN": "Неизвестно",
"USER": "Пользователь",
"USERNAME": "Имя пользователя",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Показать список достижений пользователя",
"USAGE": "(@user)",
"EXAMPLES": "achievements\nachievements user:@Jonny_Bro#4226",
"EXAMPLES": "achievements\nachievements user:@jonny_bro",
"SEND_CMD": "Используйте свою первую команду",
"CLAIM_SALARY": "Получите зарплату 10 раз",
"MARRY": "Найдите вторую половинку",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Женитесь на том, кого любите",
"USAGE": "[@user]",
"EXAMPLES": "marry user:@Jonny_Bro#4226",
"EXAMPLES": "marry user:@jonny_bro",
"BOT_USER": "Боты вечно одиноки ;(",
"ALREADY_MARRIED": "Вы уже состоите в браке! Вы можете развестить с помощью команды `divorce`",
"ALREADY_MARRIED_USER": "Вы опоздали! {{user}} уже состоит в браке",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Показать количество кредитов у пользователя",
"USAGE": "(@user)",
"EXAMPLES": "money\nmoney user:@Jonny_Bro#4226",
"EXAMPLES": "money\nmoney user:@jonny_bro",
"BOT_USER": "У него слишком много денег, я не могу вывести это число",
"TITLE": "Кредиты {{user}}"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Отправить кредиты пользователю",
"USAGE": "[@user] [amount]",
"EXAMPLES": "pay user:@Jonny_Bro#4226 amount:1000",
"EXAMPLES": "pay user:@jonny_bro amount:1000",
"BOT_USER": "Ботам не нужны деньги B)",
"YOURSELF": "Вы не можете перевести кредиты самому себе",
"INVALID_AMOUNT": "Укажите сумму",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Показать профиль пользователя",
"USAGE": "(@user)",
"EXAMPLES": "profile\nprofile user:@Jonny_Bro#4226",
"EXAMPLES": "profile\nprofile user:@jonny_bro",
"BOT_USER": "У ботов нет профиля",
"TITLE": "Профиль {{user}}",
"LINK": "Профиль",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Дать репутацию пользователю",
"USAGE": "[@user]",
"EXAMPLES": "rep user:@Jonny_Bro#4226",
"EXAMPLES": "rep user:@jonny_bro",
"COOLDOWN": "Вы должны подождать **{{time}}** до следующего использования",
"BOT_USER": "Боты и так крутые B)",
"YOURSELF": "Вы не можете дать очко репутации самому себе",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Попытаться ограбить пользователя",
"USAGE": "[@user] [amount]",
"EXAMPLES": "rob user:@Jonny_Bro#4226 amount:100",
"EXAMPLES": "rob user:@jonny_bro amount:100",
"BOT_USER": "Вы не можете ограбить бота",
"YOURSELF": "Вы не можете ограбить себя",
"NOT_ENOUGH_AUTHOR": "У вас должно быть хотя бы {{moneyMin}}, чтобы грабить данного пользователя (сейчас у вас {{moneyCurrent}})",

View file

@ -1,6 +1,6 @@
{
"DESCRIPTION": "Калькулятор любви",
"USAGE": "[@first_member] (@second_member)",
"EXAMPLES": "lovecalc first_member:@Jonny_Bro#4226\nlovecalc first_member:@Jonny_Bro#4226 second_member:@JaBa#9042",
"EXAMPLES": "lovecalc first_member:@jonny_bro\nlovecalc first_member:@jonny_bro second_member:@JaBa#9042",
"CONTENT": "{{firstMember}} любит {{secondMember}} на **{{percent}}%**"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Крестики-нолики",
"USAGE": "[@user]",
"EXAMPLES": "tictactoe user:@Jonny_Bro#4226",
"EXAMPLES": "tictactoe user:@jonny_bro",
"BOT_USER": "Вы не можете играть против бота!",
"YOURSELF": "Вы не можете играть с самим собой!",
"INVITE_USER": "<@{{opponent}}>, вам предложили сыграть в крестики-нолики!",

View file

@ -1,6 +1,6 @@
{
"DESCRIPTION": "Возвращает аватар пользователя",
"USAGE": "(@user)",
"EXAMPLES": "avatar\navatar user:@Jonny_Bro#4226",
"EXAMPLES": "avatar\navatar user:@jonny_bro",
"SERVER": "Аватар сервера?"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Отправить жалобу в специальный канал",
"USAGE": "[@user] (message)",
"EXAMPLES": "report user:@Jonny_Bro#4226 message:Нарушение правил",
"EXAMPLES": "report user:@jonny_bro message:Нарушение правил",
"MISSING_CHANNEL": "Канал для жалоб не настроен",
"INVALID_USER": "Вы не можете пожаловаться на себя",
"SUCCESS": "Ваша жалоба отправлена в {{channel}}",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Показать информацию о пользователе",
"USAGE": "(@user)",
"EXAMPLES": "userinfo\nuserinfo user:@Jonny_Bro#4226",
"EXAMPLES": "userinfo\nuserinfo user:@jonny_bro",
"CUSTOM": "Пользовательский статус",
"NO_ACTIVITY": "Не играет",
"NO_ROLE": "Нет роли",

View file

@ -1,5 +1,6 @@
{
"BOT_USER": "Вы не можете сделать это с ботом",
"CANT_DM": "Я не могу отправить Вам личное сообщение, проверьте настройки конфиденциальности",
"FORCE_STOP": "Игра принудительно окончена {{user}}, никто не победил (загаданное число - {{number}})",
"LEVEL_UP": "Вы достигли следующего уровня! Ваш новый уровень: **{{level}}**",
"GUILD_ONLY": "Данную команду можно использовать только на сервере",

View file

@ -0,0 +1,8 @@
{
"DESCRIPTION": "Забанить пользователя",
"USAGE": "[@user] [reason]",
"EXAMPLES": "ban user:@jonny_bro reason:Нарушение правил сервера",
"YOURSELF": "Вы не можете забанить себя",
"SUPERIOR": "Вы не можете забанить данного пользователя (или я не могу сделать этого)",
"SUCCESS": "{{user}} был забанен по причине **{{reason}}**"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Очистка сообщений в канале",
"USAGE": "[option] (@user)",
"EXAMPLES": "clear option:10\nclear option:10 user:@Jonny_Bro#4226\nclear option:all",
"EXAMPLES": "clear option:10\nclear option:10 user:@jonny_bro\nclear option:all",
"OPTION": "Целое число / all",
"REQUIRE_ID_USER": "Укажите пользователя или ID",
"ALL_CONFIRM": "**Все сообщения в канале будут удалены! Вы уверены?**",

View file

@ -1,6 +1,6 @@
{
"DESCRIPTION": "Снять все предупреждения с пользователя",
"USAGE": "[@user]",
"EXAMPLES": "clearwarns user:@Jonny_Bro#4226",
"EXAMPLES": "clearwarns user:@jonny_bro",
"SUCCESS": "Предупреждения пользователя {{user}} удалены"
}

View file

@ -0,0 +1,8 @@
{
"DESCRIPTION": "Кикнуть пользователя",
"USAGE": "[@user] [reason]",
"EXAMPLES": "kick user:@jonny_bro reason:Зайдёшь завтра когда я перестану обижаться",
"YOURSELF": "Вы не можете кикнуть себя",
"SUPERIOR": "Вы не можете кикнуть данного пользователя (или я не могу сделать этого)",
"SUCCESS": "{{user}} был кикнут по причине **{{reason}}**"
}

View file

@ -0,0 +1,8 @@
{
"DESCRIPTION": "Снять таймаут с пользователя",
"USAGE": "[@user]",
"EXAMPLES": "untimeout user:@jonny_bro",
"YOURSELF": "Вы не можете снять с себя таймаут",
"NOT_TIMEDOUT": "Данный пользователь не находится в таймауте",
"SUCCESS": "Таймаут с {{user}} снят"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Показать список нарушений пользователя",
"USAGE": "[@user]",
"EXAMPLES": "warns user:@Jonny_Bro#4226",
"EXAMPLES": "warns user:@jonny_bro",
"SANCTIONS_OF": "Нарушения {{member}}",
"NO_SANCTIONS": "У **{{member}}** нет нарушений"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Позволяет изменять данные пользователя",
"USAGE": "[set/add] [type] [@user] [int]",
"EXAMPLES": "debug set type:Уровень user:@Jonny_Bro#4226 int:100",
"EXAMPLES": "debug set type:Уровень user:@jonny_bro int:100",
"TYPE": "Тип данных",
"SET": "Установить значение",
"ADD": "Добавить к значению",

View file

@ -0,0 +1,7 @@
{
"DESCRIPTION": "Добавить пользователя в тикет",
"USAGE": "[@user]",
"EXAMPLES": "adduser user:@jonny_bro",
"NOT_TICKET": "Данный канал не является тикетом",
"SUCCESS": "{{user}} добавлен в тикет"
}

View file

@ -0,0 +1,11 @@
{
"DESCRIPTION": "Закрыть тикет",
"USAGE": "",
"EXAMPLES": "closeticket",
"CLOSING_TITLE": "Закрытие тикета",
"CLOSING_DESC": "Тикет закроется через 5 секунд",
"CLOSING_BY": "Тикет закрыл",
"CLOSING_CANCELED": "Закрытие тикета отменено",
"CLOSED_TITLE": "Тикет закрыт",
"TRANSCRIPT": "Копия сообщений из {{channel}}"
}

View file

@ -1,6 +1,6 @@
{
"DESCRIPTION": "Змінити користувачу досвід, рівень, кредити або банк",
"USAGE": "[type] [@user] [int]",
"EXAMPLES": "set type:Рівень user:@Jonny_Bro#4226 int:10",
"EXAMPLES": "set type:Рівень user:@jonny_bro int:10",
"INVALID_NUMBER": "Значення має бути більшим за нуль"
}

View file

@ -59,6 +59,7 @@
"STATUS_IDLE": "Неактивний",
"STATUS_OFFLINE": "Не в мережі",
"STATUS_ONLINE": "У мережі",
"TICKET": "Тікет",
"UNKNOWN": "Невідомо",
"USER": "Користувач",
"USERNAME": "Ім'я користувача",

View file

@ -70,12 +70,12 @@
},
"sweetalert": {
"errors": {
"settingsSave": "Произошла ошибка при сохранении настроек."
"settingsSave": "Сталася помилка при збереженні налаштувань."
},
"success": {
"settingsSave": "Настройки успешно сохранены.",
"login": "Вход успешно выполнен.",
"logout": "Выход успешно выполнен."
"settingsSave": "Налаштування успішно збережені.",
"login": "Успішний вхід.",
"logout": "Успішний вихід."
}
},
"preloader": {

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Показати список досягнень користувача",
"USAGE": "(@user)",
"EXAMPLES": "achievements\nachievements user:@Jonny_Bro#4226",
"EXAMPLES": "achievements\nachievements user:@jonny_bro",
"SEND_CMD": "Використовуйте свою першу команду",
"CLAIM_SALARY": "Отримайте зарплату 10 разів",
"MARRY": "Знайдіть другу половинку",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Одружуйтеся з тим, кого любите",
"USAGE": "[@user]",
"EXAMPLES": "marry user:@Jonny_Bro#4226",
"EXAMPLES": "marry user:@jonny_bro",
"BOT_USER": "Боти завжди самотні ;(",
"ALREADY_MARRIED": "Ви вже одружені! Ви можете розвести за допомогою команди `divorce`",
"ALREADY_MARRIED_USER": "Ви запізнилися! {{user}} вже одружений",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Показати кількість кредитів у користувача",
"USAGE": "(@user)",
"EXAMPLES": "money\nmoney user:@Jonny_Bro#4226",
"EXAMPLES": "money\nmoney user:@jonny_bro",
"BOT_USER": "У нього занадто багато грошей, я не можу написати це число",
"TITLE": "{{user}} Кредити"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Надіслати кредити користувачу",
"USAGE": "[@user] [amount]",
"EXAMPLES": "pay user:@Jonny_Bro#4226 amount:1000",
"EXAMPLES": "pay user:@jonny_bro amount:1000",
"BOT_USER": "Ботам не потрібні гроші B)",
"YOURSELF": "Ви не можете переказати кредити самому собі",
"INVALID_AMOUNT": "Вкажіть суму",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Показати профіль користувача",
"USAGE": "(@user)",
"EXAMPLES": "profile\nprofile user:@Jonny_Bro#4226",
"EXAMPLES": "profile\nprofile user:@jonny_bro",
"BOT_USER": "Боти не мають профілю",
"TITLE": "Профіль {{user}}",
"LINK": "Профіль",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Дати репутацію користувачеві",
"USAGE": "[@user]",
"EXAMPLES": "rep user:@Jonny_Bro#4226",
"EXAMPLES": "rep user:@jonny_bro",
"COOLDOWN": "Ви повинні почекати **{{time}}** до наступного використання",
"BOT_USER": "Боти і так круті B)",
"YOURSELF": "Ви не можете дати поінт репутації самому собі",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Спробувати пограбувати користувача",
"USAGE": "[@user] [amount]",
"EXAMPLES": "rob user:@Jonny_Bro#4226 amount:100",
"EXAMPLES": "rob user:@jonny_bro amount:100",
"BOT_USER": "Ви не можете пограбувати бота",
"YOURSELF": "Ви не можете пограбувати себе",
"NOT_ENOUGH_AUTHOR": "У вас має бути хоча б {{moneyMin}}, щоб грабувати цього користувача (зараз у вас {{moneyCurrent}})",

View file

@ -1,6 +1,6 @@
{
"DESCRIPTION": "Калькулятор кохання",
"USAGE": "[@first_member] (@second_member)",
"EXAMPLES": "lovecalc first_member:@Jonny_Bro#4226\nlovecalc first_member:@Jonny_Bro#4226 second_member:@JaBa#9042",
"EXAMPLES": "lovecalc first_member:@jonny_bro\nlovecalc first_member:@jonny_bro second_member:@JaBa#9042",
"CONTENT": "{{firstMember}} кохає {{secondMember}} на **{{percent}}%**"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Хрестики-нуліки",
"USAGE": "[@user]",
"EXAMPLES": "tictactoe user:@Jonny_Bro#4226",
"EXAMPLES": "tictactoe user:@jonny_bro",
"BOT_USER": "Ви не можете грати проти бота",
"YOURSELF": "Ви не можете грати із самим собою",
"INVITE_USER": "<@{{opponent}}>, вам запропонували зіграти в хрестики-нуліки",

View file

@ -1,6 +1,6 @@
{
"DESCRIPTION": "Повертає аватар користувача",
"USAGE": "(@user)",
"EXAMPLES": "avatar\navatar user:@Jonny_Bro#4226",
"EXAMPLES": "avatar\navatar user:@jonny_bro",
"SERVER": "Аватар сервера?"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Надіслати скаргу до спеціального каналу",
"USAGE": "[@user] (message)",
"EXAMPLES": "report user:@Jonny_Bro#4226 message:Порушення правил",
"EXAMPLES": "report user:@jonny_bro message:Порушення правил",
"MISSING_CHANNEL": "Канал для скарг не налаштований",
"INVALID_USER": "Ви не можете поскаржитися на себе",
"SUCCESS": "Ваша скарга надіслана в {{channel}}",

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Показати інформацію про користувача",
"USAGE": "(@user)",
"EXAMPLES": "userinfo\nuserinfo user:@Jonny_Bro#4226",
"EXAMPLES": "userinfo\nuserinfo user:@jonny_bro",
"CUSTOM": "Стан користувача",
"NO_ACTIVITY": "Не грає",
"NO_ROLE": "Немає ролі",

View file

@ -1,5 +1,6 @@
{
"BOT_USER": "Ви не можете зробити це з ботом",
"CANT_DM": "Я не можу надіслати Вам особисте повідомлення, перевірте налаштування конфіденційності.",
"FORCE_STOP": "Гра примусово закінчена, {{user}}, ніхто не переміг (загадане число - {{number}}).",
"LEVEL_UP": "Ви досягли наступного рівня! Ваш новий рівень: **{{level}}**",
"GUILD_ONLY": "Цю команду можна використовувати лише на сервері",

View file

@ -0,0 +1,8 @@
{
"DESCRIPTION": "Забанити користувача",
"USAGE": "[@user] [reason]",
"EXAMPLES": "ban user:@jonny_bro reason:Порушення правил сервера",
"YOURSELF": "Ви не можете забанити себе",
"SUPERIOR": "Ви не можете забанити даного користувача (або я не можу цього зробити)",
"SUCCESS": "{{user}} був забанений з причини **{{reason}}**"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Очищення повідомлень у каналі",
"USAGE": "[option] (@user)",
"EXAMPLES": "clear option:10\nclear option:10 user:@Jonny_Bro#4226\nclear option:all",
"EXAMPLES": "clear option:10\nclear option:10 user:@jonny_bro\nclear option:all",
"OPTION": "Ціле число / all",
"REQUIRE_ID_USER": "Вкажіть користувача або ID",
"ALL_CONFIRM": "**Всі повідомлення в каналі будуть видалені! Ви впевнені?**",

View file

@ -1,6 +1,6 @@
{
"DESCRIPTION": "Зняти усі попередження з користувача",
"USAGE": "[@user]",
"EXAMPLES": "clearwarns user:@Jonny_Bro#4226",
"EXAMPLES": "clearwarns user:@jonny_bro",
"SUCCESS": "Попередження користувача {{user}} видалено"
}

View file

@ -0,0 +1,8 @@
{
"DESCRIPTION": "Вигнати користувача",
"USAGE": "[@user] [reason]",
"EXAMPLES": "kick user:@jonny_bro reason:Зайдеш завтра коли я перестану ображатись",
"YOURSELF": "Ви не можете вигнати себе",
"SUPERIOR": "Ви не можете вигнати даного користувача (або я не можу цього зробити)",
"SUCCESS": "{{user}} був вигнаний з причини **{{reason}}**"
}

View file

@ -0,0 +1,8 @@
{
"DESCRIPTION": "Зняти таймаут з користувача",
"USAGE": "[@user]",
"EXAMPLES": "untimeout user:@jonny_bro",
"YOURSELF": "Ви не можете зняти таймаут з себе",
"NOT_TIMEDOUT": "Даний користувач не перебуває у таймауті",
"SUCCESS": "Таймаут з {{user}} знятий"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Показати список порушень користувача",
"USAGE": "[@user]",
"EXAMPLES": "warns user:@Jonny_Bro#4226",
"EXAMPLES": "warns user:@jonny_bro",
"SANCTIONS_OF": "Порушення {{member}}",
"NO_SANCTIONS": "**{{member}}** не має порушень"
}

View file

@ -1,7 +1,7 @@
{
"DESCRIPTION": "Дозволяє змінювати дані користувача",
"USAGE": "[set/add] [type] [@user] [int]",
"EXAMPLES": "debug set type:Рівень user:@Jonny_Bro#4226 int:100",
"EXAMPLES": "debug set type:Рівень user:@jonny_bro int:100",
"TYPE": "Тип даних",
"SET": "Встановити значення",
"ADD": "Додати до значення",

View file

@ -51,71 +51,25 @@
"ecmaVersion": 2020
},
"rules": {
"arrow-spacing": [
"warn",
{
"before": true,
"after": true
}
],
"comma-dangle": [
"error",
"always-multiline"
],
"arrow-spacing": ["warn", { "before": true, "after": true }],
"comma-dangle": ["error", "always-multiline"],
"comma-spacing": "error",
"comma-style": "error",
"dot-location": [
"error",
"property"
],
"dot-location": ["error", "property"],
"handle-callback-err": "off",
"indent": [
"error",
"tab",
{
"SwitchCase": 1
}
],
"indent": ["error", "tab", { "SwitchCase": 1 }],
"keyword-spacing": "error",
"max-nested-callbacks": [
"error",
{
"max": 4
}
],
"max-statements-per-line": [
"error",
{
"max": 2
}
],
"max-nested-callbacks": ["error", { "max": 4 }],
"max-statements-per-line": ["error", { "max": 2 }],
"no-console": "off",
"no-multi-spaces": "error",
"no-multiple-empty-lines": [
"error",
{
"max": 2,
"maxEOF": 1,
"maxBOF": 0
}
],
"no-trailing-spaces": [
"error"
],
"no-multiple-empty-lines": ["error", { "max": 2, "maxEOF": 1, "maxBOF": 0 }],
"no-trailing-spaces": ["error"],
"no-var": "error",
"object-curly-spacing": [
"error",
"always"
],
"object-curly-spacing": ["error", "always"],
"prefer-const": "error",
"quotes": [
"error",
"double"
],
"semi": [
"error",
"always"
],
"quotes": ["error", "double"],
"semi": ["error", "always"],
"space-in-parens": "error",
"space-infix-ops": "error",
"space-unary-ops": "error",