Переход на discord.js 14

Фиксы
Подготовка старых команд к d.js 14
This commit is contained in:
JonnyBro 2022-07-31 17:08:00 +05:00
parent 4b857b830b
commit d7b2790200
104 changed files with 1571 additions and 2441 deletions

View file

@ -1,145 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js"),
backup = require("discord-backup");
backup.setStorageFolder(__dirname + "/../../backups");
class Backup extends Command {
constructor(client) {
super(client, {
name: "backup",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["ba"],
memberPermissions: ["MANAGE_GUILD"],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ADMINISTRATOR"],
nsfw: false,
ownerOnly: false,
cooldown: 20000
});
}
async run(message, args, data) {
const status = args[0];
if (!status) return message.error("administration/backup:MISSING_STATUS");
if (status === "create") {
const m = await message.sendT("misc:PLEASE_WAIT", null, {
prefixEmoji: "loading"
});
backup.create(message.guild).then((backup) => {
m.delete();
message.success("administration/backup:SUCCESS_PUBLIC");
message.author.send(message.translate("administration/backup:SUCCESS_PRIVATE", {
backupID: backup.id
})).catch(() => {
backup.remove(backup.id);
message.error("misc:CANNOT_DM");
});
}).catch((err) => {
console.error(err);
return message.error("misc:ERR_OCCURRED");
});
} else if (status === "load") {
const backupID = args[1];
if (!backupID) return message.error("administration/backup:MISSING_BACKUP_ID");
backup.fetch(backupID).then(async () => {
message.sendT("administration/backup:CONFIRMATION");
const filter = m => m.author.id === message.author.id;
const collector = message.channel.createMessageCollector({
filter,
time: 20000
});
collector.on("collect", async msg => {
if (msg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) {
message.author.send(message.translate("administration/backup:START_LOADING"));
backup.load(backupID, message.guild).then(() => {
backup.remove(backupID);
message.author.send(message.translate("administration/backup:LOAD_SUCCESS"));
collector.stop();
}).catch((err) => {
console.error(err);
return message.error("misc:ERR_OCCURRED");
});
}
});
collector.on("end", (_, reason) => {
if (reason === "time") return message.error("misc:TIMES_UP");
});
}).catch((err) => {
console.error(err);
return message.error("administration/backup:NO_BACKUP_FOUND", {
backupID
});
});
} else if (status === "info") {
const backupID = args[1];
if (!backupID) return message.error("administration/backup:MISSING_BACKUP_ID");
backup.fetch(backupID).then(async (backupInfo) => {
const embed = new Discord.MessageEmbed()
.setAuthor({
name: message.translate("administration/backup:TITLE_INFO")
})
.addField(message.translate("administration/backup:TITLE_ID"), backupInfo.id, true)
.addField(message.translate("administration/backup:TITLE_SERVER_ID"), backupInfo.data.guildID.toString(), true)
.addField(message.translate("administration/backup:TITLE_SIZE"), `${backupInfo.size} kb`, true)
.addField(message.translate("administration/backup:TITLE_CREATED_AT"), this.client.printDate(new Date(backupInfo.data.createdTimestamp)), true)
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
});
message.reply({
embeds: [embed]
});
}).catch((err) => {
console.error(err);
return message.error("administration/backup:NO_BACKUP_FOUND", {
backupID
});
});
} else if (status === "remove") {
const backupID = args[1];
if (!backupID) return message.error("administration/backup:MISSING_BACKUP_ID");
backup.fetch(backupID).then(async () => {
message.sendT("administration/backup:REMOVE_CONFIRMATION");
const filter = m => m.author.id === message.author.id;
const collector = message.channel.createMessageCollector({
filter,
time: 20000
});
collector.on("collect", async msg => {
if (msg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) {
backup.remove(backupID).then(async () => {
message.success("administration/backup:SUCCESS_REMOVED");
});
collector.stop();
}
});
collector.on("end", (_, reason) => {
if (reason === "time") return message.error("misc:TIMES_UP");
});
}).catch((err) => {
console.error(err);
return message.error("administration/backup:NO_BACKUP_FOUND", {
backupID
});
});
} else {
return message.error("administration/backup:MISSING_STATUS");
}
}
}
module.exports = Backup;

View file

@ -20,74 +20,83 @@ class Configuration extends Command {
async run(message, args, data) {
const guildData = data.guild;
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.guild.name,
iconURL: message.guild.iconURL({
dynamic: true
})
iconURL: message.guild.iconURL()
})
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
});
// Guild prefix
embed.addField(message.translate("administration/configuration:PREFIX_TITLE"), guildData.prefix);
// Ignored channels
embed.addField(message.translate("administration/configuration:IGNORED_CHANNELS_TITLE"), guildData.ignoredChannels.length > 0 ? guildData.ignoredChannels.map((ch) => `<#${ch}>`).join(", ") : message.translate("administration/configuration:NO_IGNORED_CHANNELS"));
// Autorole plugin
embed.addField(message.translate("administration/configuration:AUTOROLE_TITLE"), guildData.plugins.autorole.enabled ? message.translate("administration/configuration:AUTOROLE_CONTENT", {
roleName: `<@&${guildData.plugins.autorole.role}>`
}) : message.translate("administration/configuration:AUTOROLE_DISABLED"));
// Welcome plugin
embed.addField(message.translate("administration/configuration:WELCOME_TITLE"), guildData.plugins.welcome.enabled ? message.translate("administration/configuration:WELCOME_CONTENT", {
channel: `<#${guildData.plugins.welcome.channel}>`,
withImage: guildData.plugins.welcome.withImage ? message.translate("common:YES") : message.translate("common:NO")
}) : message.translate("administration/configuration:WELCOME_DISABLED"));
// Goodbye plugin
embed.addField(message.translate("administration/configuration:GOODBYE_TITLE"), guildData.plugins.goodbye.enabled ? message.translate("administration/configuration:GOODBYE_CONTENT", {
channel: `<#${guildData.plugins.goodbye.channel}>`,
withImage: guildData.plugins.goodbye.withImage ? message.translate("common:YES") : message.translate("common:NO")
}) : message.translate("administration/configuration:GOODBYE_DISABLED"));
// Special channels
embed.addField(message.translate("administration/configuration:SPECIAL_CHANNELS"),
message.translate("administration/configuration:SUGGESTIONS", {
channel: guildData.plugins.suggestions ? `<#${guildData.plugins.suggestions}>` : message.translate("common:NOT_DEFINED")
}) + "\n" +
message.translate("administration/configuration:REPORTS", {
channel: guildData.plugins.reports ? `<#${guildData.plugins.reports}>` : message.translate("common:NOT_DEFINED")
}) + "\n" +
message.translate("administration/configuration:MODLOGS", {
channel: guildData.plugins.modlogs ? `<#${guildData.plugins.modlogs}>` : message.translate("common:NOT_DEFINED")
}) + "\n" +
message.translate("administration/configuration:BIRTHDAYS", {
channel: guildData.plugins.birthdays ? `<#${guildData.plugins.birthdays}>` : message.translate("common:NOT_DEFINED")
})
);
// Auto sanctions
embed.addField(message.translate("administration/configuration:AUTO_SANCTIONS"), (guildData.plugins.warnsSanctions.kick ? message.translate("administration/configuration:KICK_CONTENT", {
count: guildData.plugins.warnsSanctions.kick
}) : message.translate("administration/configuration:KICK_NOT_DEFINED")) + "\n" + (guildData.plugins.warnsSanctions.ban ? message.translate("administration/configuration:BAN_CONTENT", {
count: guildData.plugins.warnsSanctions.ban
}) : message.translate("administration/configuration:BAN_NOT_DEFINED")));
// Automod plugin
embed.addField(message.translate("administration/configuration:AUTOMOD_TITLE"), guildData.plugins.automod.enabled ? message.translate("administration/configuration:AUTOMOD_CONTENT", {
channels: guildData.plugins.automod.ignored.map((ch) => `<#${ch}>`)
}) : message.translate("administration/configuration:AUTOMOD_DISABLED"));
// Auto-delete mod commands
embed.addField(message.translate("administration/configuration:AUTODELETEMOD"), guildData.autoDeleteModCommands ? message.translate("administration/configuration:AUTODELETEMOD_ENABLED") : message.translate("administration/configuration:AUTODELETEMOD_DISABLED"));
// Dashboard link
embed.addField(message.translate("administration/configuration:DASHBOARD_TITLE"), `[${message.translate("administration/configuration:DASHBOARD_CONTENT")}](${data.config.dashboard.baseURL})`);
embed.addFields([
{ // Guild prefix
name: message.translate("administration/configuration:PREFIX_TITLE"),
value: guildData.prefix
},
{ // Ignored channels
name: message.translate("administration/configuration:IGNORED_CHANNELS_TITLE"),
value: guildData.ignoredChannels.length > 0 ? guildData.ignoredChannels.map((ch) => `<#${ch}>`).join(", ") : message.translate("administration/configuration:NO_IGNORED_CHANNELS")
},
{ // Autorole plugin
name: message.translate("administration/configuration:AUTOROLE_TITLE"),
value: guildData.plugins.autorole.enabled ? message.translate("administration/configuration:AUTOROLE_CONTENT", {
roleName: `<@&${guildData.plugins.autorole.role}>`
}) : message.translate("administration/configuration:AUTOROLE_DISABLED")
},
{ // Welcome plugin
name: message.translate("administration/configuration:WELCOME_TITLE"),
value: guildData.plugins.welcome.enabled ? message.translate("administration/configuration:WELCOME_CONTENT", {
channel: `<#${guildData.plugins.welcome.channel}>`,
withImage: guildData.plugins.welcome.withImage ? message.translate("common:YES") : message.translate("common:NO")
}) : message.translate("administration/configuration:WELCOME_DISABLED")
},
{ // Goodbye plugin
name: message.translate("administration/configuration:GOODBYE_TITLE"),
value: guildData.plugins.goodbye.enabled ? message.translate("administration/configuration:GOODBYE_CONTENT", {
channel: `<#${guildData.plugins.goodbye.channel}>`,
withImage: guildData.plugins.goodbye.withImage ? message.translate("common:YES") : message.translate("common:NO")
}) : message.translate("administration/configuration:GOODBYE_DISABLED")
},
{ // Special channels
name: message.translate("administration/configuration:SPECIAL_CHANNELS"),
value: message.translate("administration/configuration:SUGGESTIONS", {
channel: guildData.plugins.suggestions ? `<#${guildData.plugins.suggestions}>` : message.translate("common:NOT_DEFINED")
}) + "\n" +
message.translate("administration/configuration:REPORTS", {
channel: guildData.plugins.reports ? `<#${guildData.plugins.reports}>` : message.translate("common:NOT_DEFINED")
}) + "\n" +
message.translate("administration/configuration:MODLOGS", {
channel: guildData.plugins.modlogs ? `<#${guildData.plugins.modlogs}>` : message.translate("common:NOT_DEFINED")
}) + "\n" +
message.translate("administration/configuration:BIRTHDAYS", {
channel: guildData.plugins.birthdays ? `<#${guildData.plugins.birthdays}>` : message.translate("common:NOT_DEFINED")
})
},
{ // Auto sanctions
name: message.translate("administration/configuration:AUTO_SANCTIONS"),
value: (guildData.plugins.warnsSanctions.kick ? message.translate("administration/configuration:KICK_CONTENT", {
count: guildData.plugins.warnsSanctions.kick
}) : message.translate("administration/configuration:KICK_NOT_DEFINED")) + "\n" + (guildData.plugins.warnsSanctions.ban ? message.translate("administration/configuration:BAN_CONTENT", {
count: guildData.plugins.warnsSanctions.ban
}) : message.translate("administration/configuration:BAN_NOT_DEFINED"))
},
{ // Automod plugin
name: message.translate("administration/configuration:AUTOMOD_TITLE"),
value: guildData.plugins.automod.enabled ? message.translate("administration/configuration:AUTOMOD_CONTENT", {
channels: guildData.plugins.automod.ignored.map((ch) => `<#${ch}>`)
}) : message.translate("administration/configuration:AUTOMOD_DISABLED")
},
{ // Auto-delete mod commands
name: message.translate("administration/configuration:AUTODELETEMOD"),
value: guildData.autoDeleteModCommands ? message.translate("administration/configuration:AUTODELETEMOD_ENABLED") : message.translate("administration/configuration:AUTODELETEMOD_DISABLED")
},
{ // Dashboard link
name: message.translate("administration/configuration:DASHBOARD_TITLE"),
value: `[${message.translate("administration/configuration:DASHBOARD_CONTENT")}](${data.config.dashboard.baseURL})`
}
]);
message.reply({
embeds: [embed]

View file

@ -1,5 +1,5 @@
const Command = require("../../base/Command"),
{ Util } = require("discord.js");
{ parseEmoji } = require("discord.js");
class Stealemoji extends Command {
constructor(client) {
@ -21,7 +21,7 @@ class Stealemoji extends Command {
if (!args.length) return message.error("administration/stealemoji:MISSING_EMOJI");
for (const rawEmoji of args) {
const parsedEmoji = Util.parseEmoji(rawEmoji);
const parsedEmoji = parseEmoji(rawEmoji);
const extension = parsedEmoji.animated ? "gif" : "png";
message.guild.emojis

View file

@ -26,7 +26,7 @@ class Achievements extends Command {
id: member.id
}));
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("economy/achievements:TITLE")
})
@ -35,41 +35,64 @@ class Achievements extends Command {
text: data.config.embed.footer
});
embed.addField(message.translate("economy/achievements:SEND_CMD"), message.translate("economy/achievements:PROGRESS", {
now: userData.achievements.firstCommand.progress.now,
total: userData.achievements.firstCommand.progress.total,
percent: Math.round(100 * (userData.achievements.firstCommand.progress.now / userData.achievements.firstCommand.progress.total))
}));
embed.addField(message.translate("economy/achievements:CLAIM_SALARY"), message.translate("economy/achievements:PROGRESS", {
now: userData.achievements.work.progress.now,
total: userData.achievements.work.progress.total,
percent: Math.round(100 * (userData.achievements.work.progress.now / userData.achievements.work.progress.total))
}));
embed.addField(message.translate("economy/achievements:MARRY"), message.translate("economy/achievements:PROGRESS", {
now: userData.achievements.married.progress.now,
total: userData.achievements.married.progress.total,
percent: Math.round(100 * (userData.achievements.married.progress.now / userData.achievements.married.progress.total))
}));
embed.addField(message.translate("economy/achievements:SLOTS"), message.translate("economy/achievements:PROGRESS", {
now: userData.achievements.slots.progress.now,
total: userData.achievements.slots.progress.total,
percent: Math.round(100 * (userData.achievements.slots.progress.now / userData.achievements.slots.progress.total))
}));
embed.addField(message.translate("economy/achievements:TIP"), message.translate("economy/achievements:PROGRESS", {
now: userData.achievements.tip.progress.now,
total: userData.achievements.tip.progress.total,
percent: Math.round(100 * (userData.achievements.tip.progress.now / userData.achievements.tip.progress.total))
}));
embed.addField(message.translate("economy/achievements:REP"), message.translate("economy/achievements:PROGRESS", {
now: userData.achievements.rep.progress.now,
total: userData.achievements.rep.progress.total,
percent: Math.round(100 * (userData.achievements.rep.progress.now / userData.achievements.rep.progress.total))
}));
embed.addField(message.translate("economy/achievements:INVITE"), message.translate("economy/achievements:PROGRESS", {
now: userData.achievements.invite.progress.now,
total: userData.achievements.invite.progress.total,
percent: Math.round(100 * (userData.achievements.invite.progress.now / userData.achievements.invite.progress.total))
}));
embed.addFields([
{
name: message.translate("economy/achievements:SEND_CMD"),
value: message.translate("economy/achievements:PROGRESS", {
now: userData.achievements.firstCommand.progress.now,
total: userData.achievements.firstCommand.progress.total,
percent: Math.round(100 * (userData.achievements.firstCommand.progress.now / userData.achievements.firstCommand.progress.total))
})
},
{
name: message.translate("economy/achievements:CLAIM_SALARY"),
value: message.translate("economy/achievements:PROGRESS", {
now: userData.achievements.work.progress.now,
total: userData.achievements.work.progress.total,
percent: Math.round(100 * (userData.achievements.work.progress.now / userData.achievements.work.progress.total))
})
},
{
name: message.translate("economy/achievements:MARRY"),
value: message.translate("economy/achievements:PROGRESS", {
now: userData.achievements.married.progress.now,
total: userData.achievements.married.progress.total,
percent: Math.round(100 * (userData.achievements.married.progress.now / userData.achievements.married.progress.total))
})
},
{
name: message.translate("economy/achievements:SLOTS"),
value: message.translate("economy/achievements:PROGRESS", {
now: userData.achievements.slots.progress.now,
total: userData.achievements.slots.progress.total,
percent: Math.round(100 * (userData.achievements.slots.progress.now / userData.achievements.slots.progress.total))
})
},
{
name: message.translate("economy/achievements:TIP"),
value: message.translate("economy/achievements:PROGRESS", {
now: userData.achievements.tip.progress.now,
total: userData.achievements.tip.progress.total,
percent: Math.round(100 * (userData.achievements.tip.progress.now / userData.achievements.tip.progress.total))
})
},
{
name: message.translate("economy/achievements:REP"),
value: message.translate("economy/achievements:PROGRESS", {
now: userData.achievements.rep.progress.now,
total: userData.achievements.rep.progress.total,
percent: Math.round(100 * (userData.achievements.rep.progress.now / userData.achievements.rep.progress.total))
})
},
{
name: message.translate("economy/achievements:INVITE"),
value: message.translate("economy/achievements:PROGRESS", {
now: userData.achievements.invite.progress.now,
total: userData.achievements.invite.progress.total,
percent: Math.round(100 * (userData.achievements.invite.progress.now / userData.achievements.invite.progress.total))
})
}
]);
message.reply({
embeds: [embed]

View file

@ -45,14 +45,12 @@ class Leaderboard extends Command {
money += `${data.money}\n`;
}
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("economy/leaderboard:TABLE", {
name: message.guild.name
}),
iconURL: message.guild.iconURL({
dynamic: true
})
iconURL: message.guild.iconURL()
})
.setColor(data.config.embed.color)
.addFields({
@ -93,14 +91,12 @@ class Leaderboard extends Command {
xp += `${data.xp} / ${5 * (data.level * data.level) + 80 * data.level + 100}\n`;
}
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("economy/leaderboard:TABLE", {
name: message.guild.name
}),
iconURL: message.guild.iconURL({
dynamic: true
})
iconURL: message.guild.iconURL()
})
.setColor(data.config.embed.color)
.addFields({
@ -142,14 +138,12 @@ class Leaderboard extends Command {
rep += `${data.rep}\n`;
}
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("economy/leaderboard:TABLE", {
name: message.guild.name
}),
iconURL: message.guild.iconURL({
dynamic: true
})
iconURL: message.guild.iconURL()
})
.setColor(data.config.embed.color)
.addFields({

View file

@ -48,20 +48,33 @@ class Money extends Command {
globalMoney += data.bankSold;
});
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("economy/money:TITLE", {
username: member.user.username
}),
iconURL: member.user.displayAvatarURL({
size: 512,
dynamic: true,
format: "png"
})
})
.addField(message.translate("economy/profile:CASH"), `**${memberData.money}** ${message.getNoun(memberData.money, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true)
.addField(message.translate("economy/profile:BANK"), `**${memberData.bankSold}** ${message.getNoun(memberData.bankSold, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true)
.addField(message.translate("economy/profile:GLOBAL"), `**${globalMoney}** ${message.getNoun(globalMoney, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true)
.addFields([
{
name: message.translate("economy/profile:CASH"),
value: `**${memberData.money}** ${message.getNoun(memberData.money, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`,
inline: true
},
{
name: message.translate("economy/profile:BANK"),
value: `**${memberData.bankSold}** ${message.getNoun(memberData.bankSold, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`,
inline: true
},
{
name: message.translate("economy/profile:GLOBAL"),
value: `**${globalMoney}** ${message.getNoun(globalMoney, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`,
inline: true
}
])
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer

View file

@ -51,32 +51,78 @@ class Profile extends Command {
globalMoney += data.bankSold;
});
const profileEmbed = new Discord.MessageEmbed()
const profileEmbed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("economy/profile:TITLE", {
username: member.user.tag
}),
iconURL: member.user.displayAvatarURL({
size: 512,
dynamic: true,
format: "png"
})
})
.setImage("attachment://achievements.png")
.addField(this.client.customEmojis.link + " " + message.translate("economy/profile:LINK"), `[${message.translate("economy/profile:LINK_TEXT")}](${this.client.config.dashboard.baseURL}/user/${member.user.id}/${message.guild.id})`)
.addField(message.translate("economy/profile:BIO"), userData.bio ? userData.bio : message.translate("economy/profile:NO_BIO"))
.addField(message.translate("economy/profile:CASH"), `**${memberData.money}** ${message.getNoun(memberData.money, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true)
.addField(message.translate("economy/profile:BANK"), `**${memberData.bankSold}** ${message.getNoun(memberData.bankSold, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true)
.addField(message.translate("economy/profile:GLOBAL"), `**${globalMoney}** ${message.getNoun(globalMoney, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true)
.addField(message.translate("economy/profile:REPUTATION"), `**${userData.rep}** ${message.getNoun(userData.rep, message.translate("misc:NOUNS:POINTS:1"), message.translate("misc:NOUNS:POINTS:2"), message.translate("misc:NOUNS:POINTS:5"))}`, true)
.addField(message.translate("economy/profile:LEVEL"), `**${memberData.level}**`, true)
.addField(message.translate("economy/profile:EXP"), `**${memberData.exp}/${5 * (memberData.level * memberData.level) + 80 * memberData.level + 100}** xp`, true)
.addField(message.translate("economy/profile:REGISTERED"), this.client.printDate(new Date(memberData.registeredAt)), true)
.addField(message.translate("economy/profile:BIRTHDATE"), (!userData.birthdate ? message.translate("economy/profile:NO_BIRTHDATE") : this.client.printDate(new Date(userData.birthdate))), true)
.addField(message.translate("economy/profile:LOVER"), (!userData.lover ? message.translate("economy/profile:NO_LOVER") : this.client.users.cache.get(userData.lover).tag), true)
.addField(message.translate("economy/profile:ACHIEVEMENTS"), message.translate("economy/profile:ACHIEVEMENTS_CONTENT", {
prefix: data.guild.prefix
}))
.addFields([
{
name: this.client.customEmojis.link + " " + message.translate("economy/profile:LINK"),
value: `[${message.translate("economy/profile:LINK_TEXT")}](${this.client.config.dashboard.baseURL}/user/${member.user.id}/${message.guild.id})`
},
{
name: message.translate("economy/profile:BIO"),
value: userData.bio ? userData.bio : message.translate("economy/profile:NO_BIO")
},
{
name: message.translate("economy/profile:CASH"),
value: `**${memberData.money}** ${message.getNoun(memberData.money, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`,
inline: true
},
{
name: message.translate("economy/profile:BANK"),
value: `**${memberData.bankSold}** ${message.getNoun(memberData.bankSold, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`,
inline: true
},
{
name: message.translate("economy/profile:GLOBAL"),
value: `**${globalMoney}** ${message.getNoun(globalMoney, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`,
inline: true
},
{
name: message.translate("economy/profile:REPUTATION"),
value: `**${userData.rep}** ${message.getNoun(userData.rep, message.translate("misc:NOUNS:POINTS:1"), message.translate("misc:NOUNS:POINTS:2"), message.translate("misc:NOUNS:POINTS:5"))}`,
inline: true
},
{
name: message.translate("economy/profile:LEVEL"),
value:`**${memberData.level}**`,
inline: true
},
{
name: message.translate("economy/profile:EXP"),
value: `**${memberData.exp}/${5 * (memberData.level * memberData.level) + 80 * memberData.level + 100}** xp`,
inline: true
},
{
name: message.translate("economy/profile:REGISTERED"),
value: this.client.printDate(new Date(memberData.registeredAt)),
inline: true
},
{
name: message.translate("economy/profile:BIRTHDATE"),
value: (!userData.birthdate ? message.translate("economy/profile:NO_BIRTHDATE") : this.client.printDate(new Date(userData.birthdate))),
inline: true
},
{
name: message.translate("economy/profile:LOVER"),
value: (!userData.lover ? message.translate("economy/profile:NO_LOVER") : this.client.users.cache.get(userData.lover).tag),
inline: true
},
{
name: message.translate("economy/profile:ACHIEVEMENTS"),
value: message.translate("economy/profile:ACHIEVEMENTS_CONTENT", {
prefix: data.guild.prefix
})
}
])
.setColor(data.config.embed.color) // Sets the color of the embed
.setFooter({
text: data.config.embed.footer

View file

@ -18,12 +18,11 @@ class Transactions extends Command {
}
async run(message, args, data) {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("economy/transactions:EMBED_TRANSACTIONS"),
iconURL: message.author.displayAvatarURL({
size: 512,
dynamic: true,
format: "png"
})
})
@ -43,8 +42,20 @@ class Transactions extends Command {
if (transactions.length < 1) {
embed.setDescription(message.translate("economy/transactions:NO_TRANSACTIONS"));
} else {
if (sortedTransactions[0].length > 0) embed.addField(message.translate("economy/transactions:T_GOT"), sortedTransactions[0].join("\n"), true);
if (sortedTransactions[1].length > 0) embed.addField(message.translate("economy/transactions:T_SEND"), sortedTransactions[1].join("\n"), true);
if (sortedTransactions[0].length > 0) embed.addFields([
{
name: message.translate("economy/transactions:T_GOT"),
value: sortedTransactions[0].join("\n"),
inline: true
}
]);
if (sortedTransactions[1].length > 0) embed.addFields([
{
name: message.translate("economy/transactions:T_SEND"),
value: sortedTransactions[1].join("\n"),
inline: true
}
]);
}
message.reply({

View file

@ -1,5 +1,5 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
{ parseEmoji, EmbedBuilder } = require("discord.js");
class Work extends Command {
constructor(client) {
@ -39,12 +39,11 @@ class Work extends Command {
data.memberData.workStreak = (data.memberData.workStreak || 0) + 1;
await data.memberData.save();
const embed = new Discord.MessageEmbed()
const embed = new EmbedBuilder()
.setFooter({
text: message.translate("economy/work:AWARD"),
iconURL: message.author.displayAvatarURL({
size: 512,
dynamic: true,
format: "png"
})
})
@ -61,22 +60,38 @@ class Work extends Command {
if (data.memberData.workStreak >= 5) {
won += 200;
embed.addField(message.translate("economy/work:SALARY"), message.translate("economy/work:SALARY_CONTENT", {
won: `${won} ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`
}))
.addField(message.translate("economy/work:STREAK"), message.translate("economy/work:STREAK_CONTENT"));
embed.addFields([
{
name: message.translate("economy/work:SALARY"),
value: message.translate("economy/work:SALARY_CONTENT", {
won: `${won} ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`
})
},
{
name: message.translate("economy/work:STREAK"),
value: message.translate("economy/work:STREAK_CONTENT")
}
]);
data.memberData.workStreak = 0;
} else {
for (let i = 0; i < award.length; i++) {
if (data.memberData.workStreak > i) {
const letter = Discord.Util.parseEmoji(award[i]).name.split("_")[1];
const letter = parseEmoji(award[i]).name.split("_")[1];
award[i] = `:regional_indicator_${letter.toLowerCase()}:`;
}
}
embed.addField(message.translate("economy/work:SALARY"), message.translate("economy/work:SALARY_CONTENT", {
won: `**${won}** ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`
}))
.addField(message.translate("economy/work:STREAK"), award.join(""));
embed.addFields([
{
name: message.translate("economy/work:SALARY"),
value: message.translate("economy/work:SALARY_CONTENT", {
won: `**${won}** ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`
})
},
{
name: message.translate("economy/work:STREAK"),
value: award.join("")
}
]);
}
const info = {

View file

@ -1,3 +1,4 @@
const { ApplicationCommandType } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Mention extends BaseCommand {
@ -9,11 +10,11 @@ class Mention extends BaseCommand {
super({
command: {
name: "mention",
type: 2 // Type 2 is USER COMMAND.
type: ApplicationCommandType.User
},
aliases: ["m"], // Application command aliases.
aliases: [],
dirname: __dirname,
guildOnly: true // Determines whether your command is only guild.
guildOnly: true
});
}
/**

View file

@ -1,35 +0,0 @@
const { SlashCommandBuilder } = require("@discordjs/builders");
const BaseCommand = require("../../base/BaseCommand");
class Ping extends BaseCommand {
/**
*
* @param {import("../../base/JaBa")} client
*/
constructor() {
super({
command: new SlashCommandBuilder()
.setName("ping")
.setDescription("Ping command."), // This option is included in type 1. You can configure this option directly with the SlashCommandBuilder feature.
aliases: ["p"], // Application command aliases.
dirname: __dirname,
guildOnly: true // Determines whether your command is only guild.
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").CommandInteraction} interaction
*/
async execute(client, interaction) {
return interaction.reply({ content: "Pong!", ephemeral: true });
}
}
module.exports = Ping;

View file

@ -1,3 +1,4 @@
const { ApplicationCommandType } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Repeat extends BaseCommand {
@ -8,12 +9,12 @@ class Repeat extends BaseCommand {
constructor() {
super({
command: {
name: "repeat", // Application command name.
type: 3 // Type 3 is MESSAGE COMMAND.
name: "repeat",
type: ApplicationCommandType.Message
},
aliases: ["r"], // Application command aliases.
aliases: [],
dirname: __dirname,
guildOnly: true // Determines whether your command is only guild.
guildOnly: true
});
}
/**

View file

@ -1,31 +0,0 @@
const Command = require("../../base/Command");
class Eightball extends Command {
constructor(client) {
super(client, {
name: "8ball",
dirname: __dirname,
enabled: true,
guildOnly: false,
aliases: ["8b"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 2000
});
}
async run(message, args) {
if (!args[0] || !message.content.endsWith("?")) return message.error("fun/8ball:ERR_QUESTION");
const answerN = this.client.functions.randomNum(1, 20);
const answer = message.translate(`fun/8ball:RESPONSE_${answerN}`);
message.reply({
content: answer
});
}
}
module.exports = Eightball;

View file

@ -1,34 +0,0 @@
const Command = require("../../base/Command"),
figlet = require("figlet"),
util = require("util"),
figletAsync = util.promisify(figlet);
class Ascii extends Command {
constructor(client) {
super(client, {
name: "ascii",
dirname: __dirname,
enabled: true,
guildOnly: false,
aliases: [],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 2000
});
}
async run(message, args) {
const text = args.join(" ");
if (!text || text.length > 20) return message.error("fun/ascii:TEXT_MISSING");
const rendered = await figletAsync(text);
message.reply({
content: "```" + rendered + "```"
});
}
}
module.exports = Ascii;

View file

@ -1,25 +0,0 @@
const Command = require("../../base/Command");
class Flip extends Command {
constructor(client) {
super(client, {
name: "flip",
dirname: __dirname,
enabled: true,
guildOnly: false,
aliases: ["dice", "coin"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 2000
});
}
async run(message) {
const isHeads = Math.random() > 0.5;
isHeads ? message.sendT("fun/flip:HEADS") : message.sendT("fun/flip:TAILS");
}
}
module.exports = Flip;

View file

@ -1,30 +0,0 @@
const Command = require("../../base/Command");
class Lmg extends Command {
constructor(client) {
super(client, {
name: "lmg",
dirname: __dirname,
enabled: true,
guildOnly: false,
aliases: ["lmgtfy"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args) {
const question = args.join(" ");
if (!question) return message.error("fun/lmg:MISSING");
const encodedQuestion = question.replace(/[' '_]/g, "+");
await message.reply({
content: `<https://letmegooglethat.com/?q=${encodedQuestion}>`
});
message.delete().catch(() => {});
}
}
module.exports = Lmg;

View file

@ -1,59 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js"),
md5 = require("md5");
class Lovecalc extends Command {
constructor(client) {
super(client, {
name: "lovecalc",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["lc"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args, data) {
const firstMember = message.mentions.members.filter(m => m.id !== message.author.id).first();
if (!firstMember) return message.error("fun/lovecalc:MISSING");
const secondMember = message.mentions.members
.filter(m => m.id !== firstMember.id)
.filter(m => m.id !== message.author.id)
.first() || message.member;
if (!secondMember) return message.error("fun/lovecalc:MISSING");
const members = [firstMember, secondMember].sort((a, b) => parseInt(a.id, 10) - parseInt(b.id, 10));
const hash = md5(`${members[0].id}${members[1].user.username}${members[0].user.username}${members[1].id}`);
const string = hash
.split("")
.filter(e => !isNaN(e))
.join("");
const percent = parseInt(string.substr(0, 2), 10);
const embed = new Discord.MessageEmbed()
.setAuthor({
name: `❤️ ${message.translate("fun/lovecalc:DESCRIPTION")}`
})
.setDescription(message.translate("fun/lovecalc:CONTENT", {
percent,
firstUsername: firstMember.user.username,
secondUsername: secondMember.user.username
}))
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
});
message.reply({
embeds: [embed]
});
}
}
module.exports = Lovecalc;

View file

@ -1,78 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js"),
fetch = require("node-fetch");
class Memes extends Command {
constructor(client) {
super(client, {
name: "memes",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["mem"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"],
nsfw: false,
ownerOnly: false,
cooldown: 2000
});
}
async run(message, args, data) {
const tag = args[0];
const subs = ["memes", "dankmemes", "me_irl", "wholesomememes"];
if (tag === "list") {
const embed = new Discord.MessageEmbed()
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
})
.setTitle(message.translate("fun/memes:EMBED_TITLE"))
.setDescription(subs.join("\n"))
.setTimestamp();
message.reply({
embeds: [embed]
});
} else if (!tag) {
const m = await message.sendT("fun/memes:SEARCHING_RANDOM");
const res = await fetch("https://meme-api.herokuapp.com/gimme/").then(response => response.json());
const embed = new Discord.MessageEmbed()
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
})
.setTitle(`${res.title}\n${message.translate("fun/memes:SUBREDDIT")}: ${res.subreddit}\n${message.translate("common:AUTHOR")}: ${res.author}\n${message.translate("fun/memes:UPS")}: ${res.ups}`)
.setImage(res.url)
.setTimestamp();
m.edit({
content: null,
embeds: [embed]
});
} else if (subs.includes(tag)) {
const m = await message.sendT("fun/memes:SEARCHING", {
tag
});
const res = await fetch(`https://meme-api.herokuapp.com/gimme/${tag}`).then(response => response.json());
const embed = new Discord.MessageEmbed()
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
})
.setTitle(`${res.title}\n${message.translate("fun/memes:SUBREDDIT")}: ${res.subreddit}\n${message.translate("common:AUTHOR")}: ${res.author}\n${message.translate("fun/memes:UPS")}: ${res.ups}`)
.setImage(res.url)
.setTimestamp();
m.edit({
content: null,
embeds: [embed]
});
} else return message.error("fun/memes:NOT_FOUND");
}
}
module.exports = Memes;

View file

@ -1,5 +1,5 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
{ PermissionsBitField } = require("discord.js");
class Activity extends Command {
constructor(client) {
@ -22,7 +22,7 @@ class Activity extends Command {
if (!voice) return message.error("music/play:NO_VOICE_CHANNEL");
const perms = voice.permissionsFor(this.client.user);
if (!perms.has(Discord.Permissions.FLAGS.CONNECT) || !perms.has(Discord.Permissions.FLAGS.SPEAK)) return message.error("music/play:VOICE_CHANNEL_CONNECT");
if (!perms.has(PermissionsBitField.Flags.Connect) || !perms.has(PermissionsBitField.Flags.Speak)) return message.error("music/play:VOICE_CHANNEL_CONNECT");
const activities = [
"betrayal",
@ -43,7 +43,7 @@ class Activity extends Command {
switch (activity) {
case "betrayal":
this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "betrayal").then(async invite => {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setTitle("Betrayal.io")
.setColor(data.config.embed.color)
.setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Betrayal.io", channel: voice.name })}](${invite.code})**`)
@ -61,7 +61,7 @@ class Activity extends Command {
if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST");
this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "checkers").then(async invite => {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setTitle("Checkers In The Park")
.setColor(data.config.embed.color)
.setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Checkers In The Park", channel: voice.name })}](${invite.code})**`)
@ -79,7 +79,7 @@ class Activity extends Command {
if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST");
this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "chess").then(async invite => {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setTitle("Chess In The Park")
.setColor(data.config.embed.color)
.setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Chess In The Park", channel: voice.name })}](${invite.code})**`)
@ -95,7 +95,7 @@ class Activity extends Command {
case "sketchheads":
this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "sketchheads").then(async invite => {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setTitle("Sketch Heads")
.setColor(data.config.embed.color)
.setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Sketch Heads", channel: voice.name })}](${invite.code})**`)
@ -113,7 +113,7 @@ class Activity extends Command {
if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST");
this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "ocho").then(async invite => {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setTitle("Ocho")
.setColor(data.config.embed.color)
.setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Ocho", channel: voice.name })}](${invite.code})**`)
@ -129,7 +129,7 @@ class Activity extends Command {
case "fishing":
this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "fishing").then(async invite => {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setTitle("Fishington.io")
.setColor(data.config.embed.color)
.setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Fishington.io", channel: voice.name })}](${invite.code})**`)
@ -145,7 +145,7 @@ class Activity extends Command {
case "lettertile":
this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "lettertile").then(async invite => {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setTitle("Letter Tile")
.setColor(data.config.embed.color)
.setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Letter Tile", channel: voice.name })}](${invite.code})**`)
@ -163,7 +163,7 @@ class Activity extends Command {
if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST");
this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "poker").then(async invite => {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setTitle("Poker Night")
.setColor(data.config.embed.color)
.setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Poker Night", channel: voice.name })}](${invite.code})**`)
@ -181,7 +181,7 @@ class Activity extends Command {
if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST");
this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "spellcast").then(async invite => {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setTitle("Spell Cast")
.setColor(data.config.embed.color)
.setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Spell Cast", channel: voice.name })}](${invite.code})**`)
@ -197,7 +197,7 @@ class Activity extends Command {
case "wordsnack":
this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "wordsnack").then(async invite => {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setTitle("Words Snack")
.setColor(data.config.embed.color)
.setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Words Snack", channel: voice.name })}](${invite.code})**`)
@ -213,7 +213,7 @@ class Activity extends Command {
case "puttparty":
this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "puttparty").then(async invite => {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setTitle("Puttparty")
.setColor(data.config.embed.color)
.setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Puttparty", channel: voice.name })}](${invite.code})**`)
@ -229,7 +229,7 @@ class Activity extends Command {
case "youtube":
this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "youtube").then(async invite => {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setTitle("Youtube Together")
.setColor(data.config.embed.color)
.setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Youtube Together", channel: voice.name })}](${invite.code})**`)
@ -244,7 +244,7 @@ class Activity extends Command {
break;
default: {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setTitle(message.translate("general/activity:TITLE"))
.setDescription(activities.join("\n"))
.setColor(data.config.embed.color)

View file

@ -20,7 +20,6 @@ class Avatar extends Command {
let user = await this.client.resolveUser(args[0]);
if (!user) user = message.author;
const avatarURL = user.displayAvatarURL({
dynamic: true,
size: 512
});

View file

@ -1,5 +1,5 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
{ EmbedBuilder, parseEmoji } = require("discord.js");
class EmojiInfo extends Command {
constructor(client) {
@ -21,9 +21,9 @@ class EmojiInfo extends Command {
const rawEmoji = args[0];
if (!rawEmoji) return message.error("administration/stealemoji:MISSING_EMOJI");
const parsedEmoji = Discord.Util.parseEmoji(rawEmoji);
const parsedEmoji = parseEmoji(rawEmoji);
const embed = new Discord.MessageEmbed()
const embed = new EmbedBuilder()
.setAuthor({
name: message.translate("general/emoji:TITLE", {
emoji: parsedEmoji.name
@ -33,9 +33,20 @@ class EmojiInfo extends Command {
.setFooter({
text: data.config.embed.footer
})
.addField(message.translate("general/emoji:NAME"), parsedEmoji.name)
.addField(message.translate("general/emoji:ANIMATED"), parsedEmoji.animated ? message.translate("common:YES") : message.translate("common:NO"))
.addField(message.translate("general/emoji:ID"), parsedEmoji.id ? parsedEmoji.id.toString() : message.translate("general/emoji:STANDART"));
.addFields([
{
name: message.translate("general/emoji:NAME"),
value: parsedEmoji.name
},
{
name: message.translate("general/emoji:ANIMATED"),
value: parsedEmoji.animated ? message.translate("common:YES") : message.translate("common:NO")
},
{
name: message.translate("general/emoji:ID"),
value: parsedEmoji.id ? parsedEmoji.id.toString() : message.translate("general/emoji:STANDART")
}
]);
message.reply({
embeds: [embed]

View file

@ -1,5 +1,5 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
{ PermissionsBitField, EmbedBuilder } = require("discord.js");
class Help extends Command {
constructor(client) {
@ -40,17 +40,34 @@ class Help extends Command {
prefix: message.guild ? data.guild.prefix : ""
});
const groupEmbed = new Discord.MessageEmbed()
const groupEmbed = new EmbedBuilder()
.setAuthor({
name: message.translate("general/help:CMD_TITLE", {
cmd: cmd.help.name
})
})
.addField(message.translate("general/help:FIELD_DESCRIPTION"), description)
.addField(message.translate("general/help:FIELD_USAGE"), usage)
.addField(message.translate("general/help:FIELD_EXAMPLES"), examples)
.addField(message.translate("general/help:FIELD_ALIASES"), cmd.help.aliases.length > 0 ? cmd.help.aliases.map(a => "`" + a + "`").join("\n") : message.translate("general/help:NO_ALIAS"))
.addField(message.translate("general/help:FIELD_PERMISSIONS"), cmd.conf.memberPermissions.length > 0 ? cmd.conf.memberPermissions.map((p) => `\`${p}\``).join("\n") : message.translate("general/help:NO_REQUIRED_PERMISSION"))
.addFields([
{
name: message.translate("general/help:FIELD_DESCRIPTION"),
value: description
},
{
name: message.translate("general/help:FIELD_USAGE"),
value: usage
},
{
name: message.translate("general/help:FIELD_EXAMPLES"),
value: examples
},
{
name: message.translate("general/help:FIELD_ALIASES"),
value: cmd.help.aliases.length > 0 ? cmd.help.aliases.map(a => "`" + a + "`").join("\n") : message.translate("general/help:NO_ALIAS")
},
{
name: message.translate("general/help:FIELD_PERMISSIONS"),
value: cmd.conf.memberPermissions.length > 0 ? cmd.conf.memberPermissions.map((p) => `\`${p}\``).join("\n") : message.translate("general/help:NO_REQUIRED_PERMISSION")
}
])
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
@ -73,7 +90,7 @@ class Help extends Command {
const emojis = this.client.customEmojis;
const embed = new Discord.MessageEmbed()
const embed = new EmbedBuilder()
.setDescription(message.translate("general/help:INFO", {
prefix: message.guild ? data.guild.prefix : ""
}))
@ -83,27 +100,32 @@ class Help extends Command {
});
categories.sort().forEach((cat) => {
const tCommands = commands.filter((cmd) => cmd.help.category === cat);
embed.addField(`${emojis.categories[cat.toLowerCase()]} ${cat} - (${tCommands.size})`, `${tCommands.map((cmd) => `\`${cmd.help.name}\``).join(", ")}`);
embed.addFields([
{
name: `${emojis.categories[cat.toLowerCase()]} ${cat} - (${tCommands.size})`,
value: `${tCommands.map((cmd) => `\`${cmd.help.name}\``).join(", ")}`
}
]);
});
if (message.guild) {
if (data.guild.customCommands.length > 0) embed.addField(`${emojis.categories.custom} ${message.guild.name} | ${message.translate("general/help:CUSTOM_COMMANDS")} - (${data.guild.customCommands.length})`, data.guild.customCommands.map((cmd) => `\`${cmd.name}\``).join(", "));
}
embed.addField("\u200B", message.translate("misc:STATS_FOOTER", {
dashboardLink: this.client.config.dashboard.baseURL,
docsLink: `${this.client.config.dashboard.baseURL}/docs/`,
inviteLink: this.client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [Discord.Permissions.FLAGS.ADMINISTRATOR] }),
donateLink: "https://qiwi.com/n/JONNYBRO/",
owner: data.config.owner.id
}));
embed.addFields([
{
name: "\u200B",
value: message.translate("misc:STATS_FOOTER", {
dashboardLink: this.client.config.dashboard.baseURL,
docsLink: `${this.client.config.dashboard.baseURL}/docs/`,
inviteLink: this.client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [ PermissionsBitField.Flags.Administrator] }),
donateLink: "https://qiwi.com/n/JONNYBRO/",
owner: data.config.owner.id
})
}
]);
embed.setAuthor({
name: message.translate("general/help:TITLE", {
name: this.client.user.username
}),
iconURL: this.client.user.displayAvatarURL({
size: 512,
dynamic: true,
format: "png"
})
});

View file

@ -1,55 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
class Invite extends Command {
constructor(client) {
super(client, {
name: "invite",
dirname: __dirname,
enabled: true,
guildOnly: false,
aliases: ["i"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args, data) {
const inviteLink = this.client.generateInvite({
scopes: ["bot", "applications.commands"],
permissions: [Discord.Permissions.FLAGS.ADMINISTRATOR]
});
const donateLink = "https://qiwi.com/n/JONNYBRO/";
if (args[0] && args[0] === "copy") return message.reply({
content: inviteLink
});
const embed = new Discord.MessageEmbed()
.setAuthor({
name: message.translate("general/invite:LINKS")
})
.setDescription(message.translate("general/invite:TIP", {
prefix: data.guild.prefix || ""
}))
.addField(message.translate("general/invite:ADD"), message.translate("general/invite:CLICK", {
link: inviteLink
}))
.addField(message.translate("general/invite:SUPPORT"), message.translate("general/invite:CLICK", {
link: donateLink
}) + `\n*для других способов пишите в ЛС <@${data.config.owner.id}> (указывайте ваш Discord тэг чтобы я мог выдать вам ачивку)*`)
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
});
message.reply({
embeds: [embed]
});
}
}
module.exports = Invite;

View file

@ -1,72 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
class Invites extends Command {
constructor(client) {
super(client, {
name: "invites",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["invs"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "MANAGE_GUILD"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args, data) {
let member = await this.client.resolveMember(args[0], message.guild);
if (!member) member = message.member;
const invites = await message.guild.invites.fetch().catch(() => {});
if (!invites) return message.error("misc:ERR_OCCURRED");
const memberInvites = invites.filter((i) => i.inviter && i.inviter.id === member.user.id);
if (memberInvites.size <= 0) {
if (member === message.member) {
return message.error("general/invites:NOBODY_AUTHOR");
} else {
return message.error("general/invites:NOBODY_MEMBER", {
member: member.user.tag
});
}
}
const content = memberInvites.map((i) => {
return message.translate("general/invites:CODE", {
uses: i.uses,
code: i.code,
channel: i.channel.toString()
});
}).join("\n");
let index = 0;
memberInvites.forEach((invite) => index += invite.uses);
const embed = new Discord.MessageEmbed()
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
})
.setAuthor({
name: message.translate("general/invites:TRACKER")
})
.setDescription(message.translate("general/invites:TITLE", {
member: member.user.tag,
guild: message.guild.name
}))
.addField(message.translate("general/invites:FIELD_INVITED"), message.translate("general/invites:FIELD_MEMBERS", {
total: index
}))
.addField(message.translate("general/invites:FIELD_CODES"), content);
message.reply({
embeds: [embed]
});
}
}
module.exports = Invites;

View file

@ -60,15 +60,35 @@ class Minecraft extends Command {
if (!json) return m.error("general/minecraft:FAILED", null, { edit: true });
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: json.name
})
.addField(message.translate("general/minecraft:FIELD_STATUS"), message.translate("general/minecraft:ONLINE"))
.addField(message.translate("general/minecraft:FIELD_CONNECTED"), `**${(json.raw.players ? json.raw.players.online : json.players.length)}** ${message.getNoun((json.raw.players ? json.raw.players.online : json.players.length), message.translate("misc:NOUNS:PLAYERS:1"), message.translate("misc:NOUNS:PLAYERS:2"), message.translate("misc:NOUNS:PLAYERS:5"))} / **${(json.raw.players ? json.raw.players.max : json.maxplayers)}** ${message.getNoun((json.raw.players ? json.raw.players.max : json.maxplayers), message.translate("misc:NOUNS:PLAYERS:1"), message.translate("misc:NOUNS:PLAYERS:2"), message.translate("misc:NOUNS:PLAYERS:5"))}`)
.addField(message.translate("general/minecraft:FIELD_IP"), json.connect, true)
.addField(message.translate("general/minecraft:FIELD_VERSION"), json.raw.vanilla.raw.version.name, true)
.addField(message.translate("general/minecraft:FIELD_PING"), json.raw.vanilla.ping.toString())
.addFields([
{
name: message.translate("general/minecraft:FIELD_STATUS"),
value: message.translate("general/minecraft:ONLINE")
},
{
name: message.translate("general/minecraft:FIELD_CONNECTED"),
value: `**${(json.raw.players ? json.raw.players.online : json.players.length)}** ${message.getNoun((json.raw.players ? json.raw.players.online : json.players.length), message.translate("misc:NOUNS:PLAYERS:1"), message.translate("misc:NOUNS:PLAYERS:2"), message.translate("misc:NOUNS:PLAYERS:5"))} / **${(json.raw.players ? json.raw.players.max : json.maxplayers)}** ${message.getNoun((json.raw.players ? json.raw.players.max : json.maxplayers), message.translate("misc:NOUNS:PLAYERS:1"), message.translate("misc:NOUNS:PLAYERS:2"), message.translate("misc:NOUNS:PLAYERS:5"))}`
},
{
name: message.translate("general/minecraft:FIELD_IP"),
value: json.connect,
inline: true
},
{
name: message.translate("general/minecraft:FIELD_VERSION"),
value: json.raw.vanilla.raw.version.name,
inline: true
},
{
name: message.translate("general/minecraft:FIELD_PING"),
value: json.raw.vanilla.ping.toString()
}
])
.setColor(data.config.embed.color)
.setThumbnail(favicon)
.setFooter({

View file

@ -1,50 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
const permissions = Object.keys(Discord.Permissions.FLAGS);
class Permissions extends Command {
constructor(client) {
super(client, {
name: "permissions",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["perms"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message) {
const member = message.mentions.members.first() || message.member;
const mPermissions = message.channel.permissionsFor(member);
const total = {
denied: 0,
allowed: 0
};
let text = `**${message.translate("general/permissions:TITLE", { user: member.user.username, channel: message.channel.name })}**\n`;
permissions.forEach((perm) => {
if (perm === "REQUEST_TO_SPEAK") return;
if (!mPermissions.has(perm)) {
text += `${message.translate(`misc:PERMISSIONS:${perm}`)}\n`;
total.denied++;
} else {
text += `${message.translate(`misc:PERMISSIONS:${perm}`)}\n`;
total.allowed++;
}
});
text += `\n${total.allowed} ✅ | ${total.denied}`;
message.reply({
content: text
});
}
}
module.exports = Permissions;

View file

@ -1,88 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
class Quote extends Command {
constructor(client) {
super(client, {
name: "quote",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["qu"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args, data) {
function embed(m) {
const embed = new Discord.MessageEmbed()
.setAuthor({
name: m.author.tag,
iconURL: m.author.displayAvatarURL({
size: 512,
dynamic: true,
format: "png"
})
})
.setDescription(m.content)
.setColor(m.member ? m.member.roles.highest ? m.member.roles.highest.color : data.config.embed.color : data.config.embed.color)
.setFooter({
text: m.guild.name + " | #" + m.channel.name
})
.setTimestamp(m.createdTimestamp);
if (m.attachments.size > 0) embed.setImage(m.attachments.first().url);
return embed;
}
const msgID = args[0];
if (isNaN(msgID)) {
message.error("general/quote:MISSING_ID").then(() => {
if (message.deletable) message.delete();
});
return;
}
let channel = args[1];
if (args[1]) {
channel = this.client.channels.cache.get(args[1]);
if (!channel) {
message.error("general/quote:NO_MESSAGE_ID").then(() => {
if (message.deletable) message.delete();
});
return;
}
}
if (!channel) {
message.channel.messages.fetch(msgID).catch(() => {
message.error("general/quote:NO_MESSAGE_ID").then(() => {
if (message.deletable) message.delete();
});
return;
}).then((msg) => {
if (message.deletable) message.delete();
message.reply({
embeds: [embed(msg)]
});
});
} else {
channel.messages.fetch(msgID).then((msg) => {
if (message.deletable) message.delete();
message.reply({
embeds: [embed(msg)]
});
}).catch(() => {
message.error("general/quote:NO_MESSAGE_ID").then(() => {
if (message.deletable) message.delete();
});
return;
});
}
}
}
module.exports = Quote;

View file

@ -1,5 +1,5 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
{ EmbedBuilder, parseEmoji} = require("discord.js");
class Report extends Command {
constructor(client) {
@ -30,28 +30,45 @@ class Report extends Command {
const rep = args.slice(1).join(" ");
if (!rep) return message.error("general/report:MISSING_REASON");
const embed = new Discord.MessageEmbed()
const embed = new EmbedBuilder()
.setAuthor({
name: message.translate("general/report:TITLE", {
user: member.user.tag
}),
iconURL: message.author.displayAvatarURL({
size: 512,
dynamic: true,
format: "png"
})
})
.addField(message.translate("common:AUTHOR"), message.author.tag, true)
.addField(message.translate("common:DATE"), this.client.printDate(new Date(Date.now())), true)
.addField(message.translate("common:REASON"), rep, true)
.addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`, true)
.addFields([
{
name: message.translate("common:AUTHOR"),
value: message.author.tag,
inline: true
},
{
name: message.translate("common:DATE"),
value: this.client.printDate(new Date(Date.now())),
inline: true
},
{
name: message.translate("common:REASON"),
value: rep,
inline: true
},
{
name: message.translate("common:USER"),
value: `\`${member.user.tag}\` (${member.user.toString()})`,
inline: true
}
])
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
});
const success = Discord.Util.parseEmoji(this.client.customEmojis.success).id;
const error = Discord.Util.parseEmoji(this.client.customEmojis.error).id;
const success = parseEmoji(this.client.customEmojis.cool).id;
const error = parseEmoji(this.client.customEmojis.notcool).id;
repChannel.send({
embeds: [embed]

View file

@ -31,32 +31,62 @@ class Serverinfo extends Command {
await guild.members.fetch();
const owner = await guild.fetchOwner();
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: guild.name,
iconURL: guild.iconURL({
dynamic: true
})
iconURL: guild.iconURL()
})
.setThumbnail(guild.iconURL({
dynamic: true
}))
.addField(this.client.customEmojis.link + " " + message.translate("general/serverinfo:LINK"), `[${message.translate("general/serverinfo:LINK_TEXT")}](${this.client.config.dashboard.baseURL}/stats/${guild.id})`)
.addField(this.client.customEmojis.title + message.translate("common:NAME"), guild.name, true)
.addField(this.client.customEmojis.calendar + message.translate("common:CREATION"), this.client.printDate(guild.createdAt), true)
.addField(this.client.customEmojis.users + message.translate("common:MEMBERS"),
`${guild.members.cache.filter(m => !m.user.bot).size} ${message.getNoun(guild.members.cache.filter(m => !m.user.bot).size, message.translate("misc:NOUNS:MEMBERS:1"), message.translate("misc:NOUNS:MEMBERS:2"), message.translate("misc:NOUNS:MEMBERS:5"))}` +
"\n" + `${guild.members.cache.filter(m => m.user.bot).size} ${message.getNoun(guild.members.cache.filter(m => m.user.bot).size, message.translate("misc:NOUNS:BOTS:1"), message.translate("misc:NOUNS:BOTS:2"), message.translate("misc:NOUNS:BOTS:5"))}`, true
)
.addField(this.client.customEmojis.afk + message.translate("general/serverinfo:AFK_CHANNEL"), guild.afkChannel ? guild.afkChannel.toString() : message.translate("general/serverinfo:NO_AFK_CHANNEL"), true)
.addField(this.client.customEmojis.id + message.translate("common:ID"), guild.id, true)
.addField(this.client.customEmojis.crown + message.translate("common:OWNER"), owner.toString(), true)
.addField(this.client.customEmojis.boost + message.translate("general/serverinfo:BOOSTS"), guild.premiumSubscriptionCount.toString() || "0", true)
.addField(this.client.customEmojis.channels + message.translate("common:CHANNELS"),
`${guild.channels.cache.filter(c => c.type === "GUILD_TEXT").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_TEXT").size, message.translate("misc:NOUNS:TEXT:1"), message.translate("misc:NOUNS:TEXT:2"), message.translate("misc:NOUNS:TEXT:5"))}` +
"\n" + `${guild.channels.cache.filter(c => c.type === "GUILD_VOICE").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_VOICE").size, message.translate("misc:NOUNS:VOICE:1"), message.translate("misc:NOUNS:VOICE:2"), message.translate("misc:NOUNS:VOICE:5"))}` +
"\n" + `${guild.channels.cache.filter(c => c.type === "GUILD_CATEGORY").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_CATEGORY").size, message.translate("misc:NOUNS:CATEGORY:1"), message.translate("misc:NOUNS:CATEGORY:2"), message.translate("misc:NOUNS:CATEGORY:5"))}`, true
)
.setThumbnail(guild.iconURL())
.addFields([
{
name: this.client.customEmojis.link + " " + message.translate("general/serverinfo:LINK"),
value: `[${message.translate("general/serverinfo:LINK_TEXT")}](${this.client.config.dashboard.baseURL}/stats/${guild.id})`
},
{
name: this.client.customEmojis.title + message.translate("common:NAME"),
value: guild.name,
inline: true
},
{
name: this.client.customEmojis.calendar + message.translate("common:CREATION"),
value: this.client.printDate(guild.createdAt),
inline: true
},
{
name: this.client.customEmojis.users + message.translate("common:MEMBERS"),
value: `${guild.members.cache.filter(m => !m.user.bot).size} ${message.getNoun(guild.members.cache.filter(m => !m.user.bot).size, message.translate("misc:NOUNS:MEMBERS:1"), message.translate("misc:NOUNS:MEMBERS:2"), message.translate("misc:NOUNS:MEMBERS:5"))}` +
"\n" + `${guild.members.cache.filter(m => m.user.bot).size} ${message.getNoun(guild.members.cache.filter(m => m.user.bot).size, message.translate("misc:NOUNS:BOTS:1"), message.translate("misc:NOUNS:BOTS:2"), message.translate("misc:NOUNS:BOTS:5"))}`,
inline: true
},
{
name: this.client.customEmojis.afk + message.translate("general/serverinfo:AFK_CHANNEL"),
value: guild.afkChannel ? guild.afkChannel.toString() : message.translate("general/serverinfo:NO_AFK_CHANNEL"),
inline: true
},
{
name: this.client.customEmojis.id + message.translate("common:ID"),
value: guild.id,
inline: true
},
{
name: this.client.customEmojis.crown + message.translate("common:OWNER"),
value: owner.toString(),
inline: true
},
{
name: this.client.customEmojis.boost + message.translate("general/serverinfo:BOOSTS"),
value: guild.premiumSubscriptionCount.toString() || "0",
inline: true
},
{
name: this.client.customEmojis.channels + message.translate("common:CHANNELS"),
value: `${guild.channels.cache.filter(c => c.type === "GUILD_TEXT").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_TEXT").size, message.translate("misc:NOUNS:TEXT:1"), message.translate("misc:NOUNS:TEXT:2"), message.translate("misc:NOUNS:TEXT:5"))}` +
"\n" + `${guild.channels.cache.filter(c => c.type === "GUILD_VOICE").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_VOICE").size, message.translate("misc:NOUNS:VOICE:1"), message.translate("misc:NOUNS:VOICE:2"), message.translate("misc:NOUNS:VOICE:5"))}` +
"\n" + `${guild.channels.cache.filter(c => c.type === "GUILD_CATEGORY").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_CATEGORY").size, message.translate("misc:NOUNS:CATEGORY:1"), message.translate("misc:NOUNS:CATEGORY:2"), message.translate("misc:NOUNS:CATEGORY:5"))}`,
inline: true
}
])
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer

View file

@ -27,7 +27,7 @@ class ShortURL extends Command {
if (body === "Error: Please enter a valid URL to shorten") return message.error("general/shorturl:MISSING_URL");
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer

View file

@ -1,5 +1,5 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
{ PermissionsBitField, EmbedBuilder } = require("discord.js");
class Staff extends Command {
constructor(client) {
@ -19,16 +19,24 @@ class Staff extends Command {
async run(message, args, data) {
await message.guild.members.fetch();
const administrators = message.guild.members.cache.filter((m) => m.permissions.has(Discord.Permissions.FLAGS.ADMINISTRATOR) && !m.user.bot);
const moderators = message.guild.members.cache.filter((m) => !administrators.has(m.id) && m.permissions.has(Discord.Permissions.FLAGS.MANAGE_MESSAGES) && !m.user.bot);
const embed = new Discord.MessageEmbed()
const administrators = message.guild.members.cache.filter((m) => m.permissions.has(PermissionsBitField.Flags.Administrator) && !m.user.bot);
const moderators = message.guild.members.cache.filter((m) => !administrators.has(m.id) && m.permissions.has(PermissionsBitField.Flags.ManageMessages) && !m.user.bot);
const embed = new EmbedBuilder()
.setAuthor({
name: message.translate("general/staff:TITLE", {
guild: message.guild.name
})
})
.addField(message.translate("general/staff:ADMINS"), (administrators.size > 0 ? administrators.map((a) => `${a.presence ? this.client.customEmojis.status[a.presence.status] : this.client.customEmojis.status.offline} | <@${a.user.id}>`).join("\n") : message.translate("general/staff:NO_ADMINS")))
.addField(message.translate("general/staff:MODS"), (moderators.size > 0 ? moderators.map((m) => `${m.presence ? this.client.customEmojis.status[m.presence.status] : this.client.customEmojis.status.offline} | <@${m.user.id}>`).join("\n") : message.translate("general/staff:NO_MODS")))
.addFields([
{
name: message.translate("general/staff:ADMINS"),
value: (administrators.size > 0 ? administrators.map((a) => `${a.presence ? this.client.customEmojis.status[a.presence.status] : this.client.customEmojis.status.offline} | <@${a.user.id}>`).join("\n") : message.translate("general/staff:NO_ADMINS"))
},
{
name: message.translate("general/staff:MODS"),
value: (moderators.size > 0 ? moderators.map((m) => `${m.presence ? this.client.customEmojis.status[m.presence.status] : this.client.customEmojis.status.offline} | <@${m.user.id}>`).join("\n") : message.translate("general/staff:NO_MODS"))
}
])
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer

View file

@ -1,5 +1,5 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
{ PermissionsBitField, EmbedBuilder, version } = require("discord.js");
class Stats extends Command {
constructor(client) {
@ -22,7 +22,7 @@ class Stats extends Command {
const users = this.client.users.cache.size - hiddenGuild.memberCount;
const servers = this.client.guilds.cache.size - 1;
const statsEmbed = new Discord.MessageEmbed()
const statsEmbed = new EmbedBuilder()
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
@ -31,29 +31,56 @@ class Stats extends Command {
name: message.translate("common:STATS")
})
.setDescription(message.translate("general/stats:MADE"))
.addField(this.client.customEmojis.stats + " " + message.translate("general/stats:COUNTS_TITLE"), message.translate("general/stats:COUNTS_CONTENT", {
servers: servers,
users: users
}), true)
.addField(this.client.customEmojis.version + " " + message.translate("general/stats:VERSIONS_TITLE"), `\`Discord.js : v${Discord.version}\`\n\`Nodejs : v${process.versions.node}\``, true)
.addField(this.client.customEmojis.ram + " " + message.translate("general/stats:RAM_TITLE"), `\`${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2)}MB\``, true)
.addField(this.client.customEmojis.status.online + " " + message.translate("general/stats:ONLINE_TITLE"), message.translate("general/stats:ONLINE_CONTENT", {
time: this.client.convertTime(Date.now() + this.client.uptime, "from", true)
}))
.addField(this.client.customEmojis.voice + " " + message.translate("general/stats:MUSIC_TITLE"), message.translate("general/stats:MUSIC_CONTENT", {
count: `${this.client.player.voices.collection.size} ${message.getNoun(this.client.player.voices.collection.size, message.translate("misc:NOUNS:SERVERS:1"), message.translate("misc:NOUNS:SERVERS:2"), message.translate("misc:NOUNS:SERVERS:5"))}`
}))
.addField(message.translate("general/stats:CREDITS_TITLE"), message.translate("general/stats:CREDITS_CONTENT", {
donators: ["**`Добрый Спецназ#8801`** - Тестер, генератор идей"].join("\n"),
translators: ["**`Jonny_Bro#4226`** - :flag_ru:", "**`[ДАННЫЕ УДАЛЕНЫ]#4507`** - :flag_ua:"].join("\n")
}))
.addField(this.client.customEmojis.link + " " + message.translate("general/stats:LINKS_TITLE"), message.translate("misc:STATS_FOOTER", {
dashboardLink: this.client.config.dashboard.baseURL,
docsLink: `${this.client.config.dashboard.baseURL}/docs/`,
inviteLink: this.client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [Discord.Permissions.FLAGS.ADMINISTRATOR] }),
donateLink: "https://qiwi.com/n/JONNYBRO/",
owner: data.config.owner.id
}));
.addFields([
{
name: this.client.customEmojis.stats + " " + message.translate("general/stats:COUNTS_TITLE"),
value: message.translate("general/stats:COUNTS_CONTENT", {
servers: servers,
users: users
}),
inline: true
},
{
name: this.client.customEmojis.version + " " + message.translate("general/stats:VERSIONS_TITLE"),
value: `\`Discord.js: v${version}\`\n\`Nodejs: v${process.versions.node}\``,
inline: true
},
{
name: this.client.customEmojis.ram + " " + message.translate("general/stats:RAM_TITLE"),
value: `\`${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2)}MB\``,
inline: true
},
{
name: this.client.customEmojis.status.online + " " + message.translate("general/stats:ONLINE_TITLE"),
value: message.translate("general/stats:ONLINE_CONTENT", {
time: this.client.convertTime(Date.now() + this.client.uptime, true, true)
})
},
{
name: this.client.customEmojis.voice + " " + message.translate("general/stats:MUSIC_TITLE"),
value: message.translate("general/stats:MUSIC_CONTENT", {
count: `${this.client.player.voices.collection.size} ${message.getNoun(this.client.player.voices.collection.size, message.translate("misc:NOUNS:SERVERS:1"), message.translate("misc:NOUNS:SERVERS:2"), message.translate("misc:NOUNS:SERVERS:5"))}`
})
},
{
name: message.translate("general/stats:CREDITS_TITLE"),
value: message.translate("general/stats:CREDITS_CONTENT", {
donators: ["**`Добрый Спецназ#8801`** - Тестер, генератор идей"].join("\n"),
translators: ["**`Jonny_Bro#4226`** - :flag_ru:", "**`[ДАННЫЕ УДАЛЕНЫ]#4507`** - :flag_ua: (НЕ ОБНОВЛЕН!)"].join("\n")
})
},
{
name: this.client.customEmojis.link + " " + message.translate("general/stats:LINKS_TITLE"),
value: message.translate("misc:STATS_FOOTER", {
dashboardLink: this.client.config.dashboard.baseURL,
docsLink: `${this.client.config.dashboard.baseURL}/docs/`,
inviteLink: this.client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [ PermissionsBitField.Flags.Administrator ] }),
donateLink: "https://qiwi.com/n/JONNYBRO/",
owner: data.config.owner.id
})
}
]);
message.reply({
embeds: [statsEmbed]
});

View file

@ -1,5 +1,5 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
{ EmbedBuilder, parseEmoji } = require("discord.js");
class Suggest extends Command {
constructor(client) {
@ -26,27 +26,39 @@ class Suggest extends Command {
const sugg = args.join(" ");
if (!sugg) return message.error("general/suggest:MISSING_CONTENT");
const embed = new Discord.MessageEmbed()
const embed = new EmbedBuilder()
.setAuthor({
name: message.translate("general/suggest:TITLE", {
user: message.author.username
}),
iconURL: message.author.displayAvatarURL({
size: 512,
dynamic: true,
format: "png"
})
})
.addField(message.translate("common:AUTHOR"), `\`${message.author.username}#${message.author.discriminator}\``, true)
.addField(message.translate("common:DATE"), this.client.printDate(new Date(Date.now())), true)
.addField(message.translate("common:CONTENT"), sugg)
.addFields([
{
name: message.translate("common:AUTHOR"),
value: `\`${message.author.username}#${message.author.discriminator}\``,
inline: true
},
{
name: message.translate("common:DATE"),
value: this.client.printDate(new Date(Date.now())),
inline: true
},
{
name: message.translate("common:CONTENT"),
value: sugg
}
])
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
});
const success = Discord.Util.parseEmoji(this.client.customEmojis.cool).id;
const error = Discord.Util.parseEmoji(this.client.customEmojis.notcool).id;
const success = parseEmoji(this.client.customEmojis.cool).id;
const error = parseEmoji(this.client.customEmojis.notcool).id;
suggChannel.send({
embeds: [embed]

View file

@ -1,72 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js"),
translate = require("@k3rn31p4nic/google-translate-api");
const langs = ["afrikaans", "albanian", "amharic", "arabic", "armenian", "azerbaijani", "bangla", "basque", "belarusian", "bengali", "bosnian", "bulgarian", "burmese", "catalan", "cebuano", "chichewa", "corsican", "croatian", "czech", "danish", "dutch", "english", "esperanto", "estonian", "filipino", "finnish", "french", "frisian", "galician", "georgian", "german", "greek", "gujarati", "haitian creole", "hausa", "hawaiian", "hebrew", "hindi", "hmong", "hungarian", "icelandic", "igbo", "indonesian", "irish", "italian", "japanese", "javanese", "kannada", "kazakh", "khmer", "korean", "kurdish (kurmanji)", "kyrgyz", "lao", "latin", "latvian", "lithuanian", "luxembourgish", "macedonian", "malagasy", "malay", "malayalam", "maltese", "maori", "marathi", "mongolian", "myanmar (burmese)", "nepali", "norwegian", "nyanja", "pashto", "persian", "polish", "portugese", "punjabi", "romanian", "russian", "samoan", "scottish gaelic", "serbian", "sesotho", "shona", "sindhi", "sinhala", "slovak", "slovenian", "somali", "spanish", "sundanese", "swahili", "swedish", "tajik", "tamil", "telugu", "thai", "turkish", "ukrainian", "urdu", "uzbek", "vietnamese", "welsh", "xhosa", "yiddish", "yoruba", "zulu"];
class Translate extends Command {
constructor(client) {
super(client, {
name: "translate",
dirname: __dirname,
enabled: true,
guildOnly: false,
aliases: ["tran"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 3000
});
}
async run(message, args, data) {
if (args[0] === "langs-list") {
const langsList = "```css\n" + (langs.map((lang, i) => `${i + 1} - ${lang}`).join("\n")) + "```";
message.author.send(langsList).then(() => {
message.success("general/translate:LIST_SENT");
}).catch(() => {
message.error("misc:CANNOT_DM");
});
return;
}
const pWait = await message.sendT("misc:PLEASE_WAIT", null, {
prefixEmoji: "loading"
});
if (!args[0]) return pWait.error("general/translate:MISSING_LANGUAGE", { prefix: data.guild.prefix }, { edit: true });
if (!args[1]) return pWait.error("general/translate:MISSING_CONTENT", null, { edit: true });
// Gets different args
const language = args[0].toLowerCase();
const toTranslate = args.slice(1).join(" ");
if (!langs.includes(language)) return pWait.error("general/translate:INVALID_LANGUAGE", { prefix: data.guild.prefix, search: language }, { edit: true });
const translated = await translate(toTranslate, { to: language });
const resEmbed = new Discord.MessageEmbed()
.setAuthor({
name: "Переводчик",
iconURL: this.client.user.displayAvatarURL({
size: 512,
dynamic: true,
format: "png"
})
})
.addField(translated.from.language.iso, "```" + toTranslate + "```")
.addField(language, "```" + translated.text + "```")
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
});
return pWait.edit({
content: null,
embeds: [resEmbed]
});
}
}
module.exports = Translate;

View file

@ -39,27 +39,44 @@ class Userinfo extends Command {
let member = null;
if (message.guild) member = await message.guild.members.fetch(user).catch(() => {});
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: `${user.tag} (${user.id})`,
iconURL: user.displayAvatarURL({
size: 512,
dynamic: true,
format: "png"
})
})
.setThumbnail(user.displayAvatarURL({
dynamic: true
}))
.addField(":man: " + message.translate("common:USERNAME"), user.username, true)
.addField(this.client.customEmojis.discriminator + " " + message.translate("common:DISCRIMINATOR"), user.discriminator, true)
.addField(this.client.customEmojis.bot + " " + message.translate("common:ROBOT"), (user.bot ? message.translate("common:YES") : message.translate("common:NO")), true)
.addField(this.client.customEmojis.calendar + " " + message.translate("common:CREATION"), this.client.printDate(user.createdAt), true)
.addField(this.client.customEmojis.avatar + " " + message.translate("common:AVATAR"), user.displayAvatarURL({
size: 512,
dynamic: true,
format: "png"
}))
.setThumbnail(user.displayAvatarURL())
.addFields([
{
name: ":man: " + message.translate("common:USERNAME"),
value: member.nickname || user.username,
inline: true
},
{
name: this.client.customEmojis.discriminator + " " + message.translate("common:DISCRIMINATOR"),
value: user.discriminator,
inline: true
},
{
name: this.client.customEmojis.bot + " " + message.translate("common:ROBOT"),
value: (user.bot ? message.translate("common:YES") : message.translate("common:NO")),
inlinee: true
},
{
name: this.client.customEmojis.calendar + " " + message.translate("common:CREATION"),
value: this.client.printDate(user.createdAt),
inline: true
},
{
name: this.client.customEmojis.avatar + " " + message.translate("common:AVATAR"),
value: member.displayAvatarURL({
size: 512,
format: "png"
})
}
])
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
@ -67,22 +84,58 @@ class Userinfo extends Command {
if (displayPresence) {
if (member.presence.activities[0].name === "Custom Status") {
embed.addField(this.client.customEmojis.games + " " + message.translate("common:GAME"), (member.presence.activities[0] ? `Пользовательский статус\n${member.presence.activities[0].state || message.translate("common:NOT_DEFINED")}` : message.translate("general/userinfo:NO_GAME")), true);
embed.addField(this.client.customEmojis.status[member.presence.status] + " " + message.translate("common:STATUS"), message.translate("common:STATUS_" + (member.presence.status.toUpperCase())), true);
embed.addFields([
{
name: this.client.customEmojis.games + " " + message.translate("common:GAME"),
value: (member.presence.activities[0] ? `Пользовательский статус\n${member.presence.activities[0].state || message.translate("common:NOT_DEFINED")}` : message.translate("general/userinfo:NO_GAME")),
inline: true
},
{
name: this.client.customEmojis.status[member.presence.status] + " " + message.translate("common:STATUS"),
value: message.translate("common:STATUS_" + (member.presence.status.toUpperCase())),
inline: true
}
]);
} else {
embed.addField(this.client.customEmojis.games + " " + message.translate("common:GAME"), (member.presence.activities[0] ? `${member.presence.activities[0].name}\n${member.presence.activities[0].details}\n${member.presence.activities[0].state}` : message.translate("general/userinfo:NO_GAME")), true);
embed.addField(this.client.customEmojis.status[member.presence.status] + " " + message.translate("common:STATUS"), message.translate("common:STATUS_" + (member.presence.status.toUpperCase())), true);
embed.addFields([
{
name: this.client.customEmojis.games + " " + message.translate("common:GAME"),
value: (member.presence.activities[0] ? `${member.presence.activities[0].name}\n${member.presence.activities[0].details}\n${member.presence.activities[0].state}` : message.translate("general/userinfo:NO_GAME")),
inline: true
},
{
name: this.client.customEmojis.status[member.presence.status] + " " + message.translate("common:STATUS"),
value: message.translate("common:STATUS_" + (member.presence.status.toUpperCase())),
inline: true
}
]);
}
}
if (member) {
// embed.addField(this.client.customEmojis.up + " " + message.translate("general/userinfo:ROLE"), (member.roles.highest ? member.roles.highest : message.translate("general/userinfo:NO_ROLE")), true)
embed.addField(this.client.customEmojis.calendar2 + " " + message.translate("common:JOIN"), this.client.printDate(member.joinedAt), true);
embed.addField(this.client.customEmojis.color + " " + message.translate("common:COLOR"), member.displayHexColor, true);
embed.addField(this.client.customEmojis.pencil + " " + message.translate("common:NICKNAME"), (member.nickname ? member.nickname : message.translate("general/userinfo:NO_NICKNAME")), true);
embed.addField(this.client.customEmojis.roles + " " + message.translate("common:ROLES"), (member.roles.size > 10 ? member.roles.cache.map((r) => r).slice(0, 9).join(", ") + " " + message.translate("general/userinfo:MORE_ROLES", {
count: member.roles.cache.size - 10
}) : (member.roles.cache.size < 1) ? message.translate("general/userinfo:NO_ROLE") : member.roles.cache.map((r) => r).join(", ")));
embed.addFields([
{
name: this.client.customEmojis.calendar2 + " " + message.translate("common:JOIN"),
value: this.client.printDate(member.joinedAt),
inline: true
},
{
name: this.client.customEmojis.color + " " + message.translate("common:COLOR"),
value: member.displayHexColor,
inline: true
},
{
name: this.client.customEmojis.pencil + " " + message.translate("common:NICKNAME"),
value: (member.nickname ? member.nickname : message.translate("general/userinfo:NO_NICKNAME")),
inline: true
},
{
name: this.client.customEmojis.roles + " " + message.translate("common:ROLES"),
value: (member.roles.size > 10 ? member.roles.cache.map((r) => r).slice(0, 9).join(", ") + " " + message.translate("general/userinfo:MORE_ROLES", {
count: member.roles.cache.size - 10
}) : (member.roles.cache.size < 1) ? message.translate("general/userinfo:NO_ROLE") : member.roles.cache.map((r) => r).join(", "))
}
]);
}
message.reply({

View file

@ -24,7 +24,7 @@ class Whois extends Command {
const whois = await fetch(`http://ip-api.com/json/${args[0]}?fields=status,message,continent,continentCode,country,countryCode,region,regionName,city,zip,timezone,currency,isp,org,as,mobile,proxy,hosting,query`).then(response => response.json());
if (whois.status === "fail") {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setDescription(whois.message)
.setTitle(message.translate("general/whois:ERROR", {
ip: args[0]
@ -39,7 +39,7 @@ class Whois extends Command {
});
}
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setTitle(message.translate("general/whois:INFO_ABOUT", {
ip: args[0]
}))
@ -49,14 +49,14 @@ class Whois extends Command {
.setColor(data.config.embed.color)
.addFields(
{ name: "IP", value: whois.query, inline: true },
{ name: message.translate("general/whois:COUNTRY"), value: `${whois.country || "Неизвестно"} (${whois.countryCode || "Неизвестно"})`, inline: true },
{ name: message.translate("general/whois:REGION"), value: `${whois.regionName || "Неизвестно"} (${whois.region || "Неизвестно"})`, inline: true },
{ name: message.translate("general/whois:CITY"), value: `${whois.city || "Неизвестно"}`, inline: true },
{ name: message.translate("general/whois:ZIP"), value: `${whois.zip || "Неизвестно"}`, inline: true },
{ name: message.translate("general/whois:TIMEZONE"), value: `${whois.timezone || "Неизвестно"}`, inline: true },
{ name: message.translate("general/whois:CONTINENT"), value: `${whois.continent || "Неизвестно"} (${whois.continentCode || "Неизвестно"})`, inline: true },
{ name: message.translate("general/whois:CURRENCY"), value: `${whois.currency || "Неизвестно"}`, inline: true },
{ name: message.translate("general/whois:ISP"), value: `${whois.isp || "Неизвестно"}`, inline: true }
{ name: message.translate("general/whois:COUNTRY"), value: `${whois.country || message.translate("common:UNKNOWN")} (${whois.countryCode || message.translate("common:UNKNOWN")})`, inline: true },
{ name: message.translate("general/whois:REGION"), value: `${whois.regionName || message.translate("common:UNKNOWN")} (${whois.region || message.translate("common:UNKNOWN")})`, inline: true },
{ name: message.translate("general/whois:CITY"), value: `${whois.city || message.translate("common:UNKNOWN")}`, inline: true },
{ name: message.translate("general/whois:ZIP"), value: `${whois.zip || message.translate("common:UNKNOWN")}`, inline: true },
{ name: message.translate("general/whois:TIMEZONE"), value: `${whois.timezone || message.translate("common:UNKNOWN")}`, inline: true },
{ name: message.translate("general/whois:CONTINENT"), value: `${whois.continent || message.translate("common:UNKNOWN")} (${whois.continentCode || message.translate("common:UNKNOWN")})`, inline: true },
{ name: message.translate("general/whois:CURRENCY"), value: `${whois.currency || message.translate("common:UNKNOWN")}`, inline: true },
{ name: message.translate("general/whois:ISP"), value: `${whois.isp || message.translate("common:UNKNOWN")}`, inline: true }
)
.setTimestamp();

View file

@ -77,7 +77,7 @@ class Announcement extends Command {
collector.on("end", (collected, reason) => {
if (reason === "time") return message.error("misc:TIMES_UP");
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("moderation/announcement:TITLE")
})

View file

@ -1,112 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
class Ban extends Command {
constructor(client) {
super(client, {
name: "ban",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["b"],
memberPermissions: ["BAN_MEMBERS"],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "BAN_MEMBERS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args, data) {
const user = await this.client.resolveUser(args[0]);
if (!user) return message.error("moderation/ban:MISSING_MEMBER");
const memberData = message.guild.members.cache.get(user.id) ? await this.client.findOrCreateMember({
id: user.id,
guildID: message.guild.id
}) : null;
if (user.id === message.author.id) return message.error("moderation/ban:YOURSELF");
// If the user is already banned
const banned = await message.guild.bans.fetch();
if (banned.some((m) => m.user.id === user.id)) return message.error("moderation/ban:ALREADY_BANNED", {
username: user.tag
});
// Gets the ban reason
let reason = args.slice(1).join(" ");
if (!reason) reason = message.translate("misc:NO_REASON_PROVIDED");
const member = await message.guild.members.fetch(user.id).catch(() => {});
if (member) {
const memberPosition = member.roles.highest.position;
const moderationPosition = message.member.roles.highest.position;
if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR");
if (!member.bannable) return message.error("moderation/ban:MISSING_PERM");
}
await user.send(message.translate("moderation/ban:BANNED_DM", {
username: user.tag,
server: message.guild.name,
moderator: message.author.tag,
reason
})).catch(() => {});
// Ban the user
message.guild.members.ban(user, {
reason
}).then(() => {
// Send a success message in the current channel
message.reply({
content: message.translate("moderation/ban:BANNED", {
username: user.tag,
server: message.guild.name,
moderator: message.author.tag,
reason
})
});
const caseInfo = {
channel: message.channel.id,
moderator: message.author.id,
date: Date.now(),
type: "ban",
case: data.guild.casesCount,
reason
};
if (memberData) {
memberData.sanctions.push(caseInfo);
memberData.save();
}
data.guild.casesCount++;
data.guild.save();
if (data.guild.plugins.modlogs) {
const channel = message.guild.channels.cache.get(data.guild.plugins.modlogs);
if (!channel) return;
const embed = new Discord.MessageEmbed()
.setAuthor({
name: message.translate("moderation/ban:CASE", {
count: data.guild.casesCount
})
})
.addField(message.translate("common:USER"), `\`${user.tag}\` (${user.toString()})`, true)
.addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`, true)
.addField(message.translate("common:REASON"), reason, true)
.setColor("#e02316");
channel.send({
embeds: [embed]
});
}
}).catch((err) => {
console.log(err);
return message.error("moderation/ban:MISSING_PERM");
});
}
}
module.exports = Ban;

View file

@ -1,100 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
class Kick extends Command {
constructor(client) {
super(client, {
name: "kick",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["k"],
memberPermissions: ["KICK_MEMBERS"],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "KICK_MEMBERS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args, data) {
const member = await this.client.resolveMember(args[0], message.guild);
if (!member) return message.error("moderation/kick:MISSING_MEMBER");
if (member.id === message.author.id) return message.error("moderation/kick:YOURSELF");
const memberData = await this.client.findOrCreateMember({
id: member.id,
guildID: message.guild.id
});
// Gets the kcik reason
let reason = args.slice(1).join(" ");
if (!reason) reason = message.translate("misc:NO_REASON_PROVIDED");
const memberPosition = member.roles.highest.position;
const moderationPosition = message.member.roles.highest.position;
if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR");
if (!member.kickable) return message.error("moderation/kick:MISSING_PERM");
await member.send({
content: message.translate("moderation/kick:KICKED_DM", {
username: member.user.tag,
server: message.guild.name,
moderator: message.author.tag,
reason
})
});
// Kick the user
member.kick(reason).then(() => {
// Send a success message in the current channel
message.reply({
content: message.translate("moderation/kick:KICKED", {
username: member.user.tag,
server: message.guild.name,
moderator: message.author.tag,
reason
})
});
data.guild.casesCount++;
data.guild.save();
const caseInfo = {
channel: message.channel.id,
moderator: message.author.id,
date: Date.now(),
type: "kick",
case: data.guild.casesCount,
reason,
};
memberData.sanctions.push(caseInfo);
memberData.save();
if (data.guild.plugins.modlogs) {
const channel = message.guild.channels.cache.get(data.guild.plugins.modlogs);
if (!channel) return;
const embed = new Discord.MessageEmbed()
.setAuthor({
name: message.translate("moderation/kick:CASE", {
count: data.guild.casesCount
})
})
.addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`, true)
.addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`, true)
.addField(message.translate("common:REASON"), reason, true)
.setColor("#e88709");
channel.send({
embeds: [embed]
});
}
}).catch(() => {
return message.error("moderation/kick:MISSING_PERM");
});
}
}
module.exports = Kick;

View file

@ -1,113 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js"),
ms = require("ms");
class Mute extends Command {
constructor(client) {
super(client, {
name: "mute",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["m"],
memberPermissions: ["MANAGE_MESSAGES"],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "MANAGE_CHANNELS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args, data) {
const member = await this.client.resolveMember(args[0], message.guild);
if (!member) return message.error("moderation/mute:MISSING_MEMBER");
if (member.id === message.author.id) return message.error("moderation/mute:YOURSELF");
const memberPosition = member.roles.highest.position;
const moderationPosition = message.member.roles.highest.position;
if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR");
const memberData = await this.client.findOrCreateMember({
id: member.id,
guildID: message.guild.id
});
const time = args[1];
if (!time || isNaN(ms(time))) return message.error("misc:INVALID_TIME");
let reason = args.slice(2).join(" ");
if (!reason) reason = message.translate("misc:NO_REASON_PROVIDED");
message.guild.channels.cache.forEach((channel) => {
channel.permissionOverwrites.edit(member.id, {
SEND_MESSAGES: false,
ADD_REACTIONS: false,
CONNECT: false
}).catch(() => {});
});
member.send({
content: message.translate("moderation/mute:MUTED_DM", {
username: member.user.username,
server: message.guild.name,
moderator: message.author.tag,
time,
reason
})
});
message.success("moderation/mute:MUTED", {
username: member.user.tag,
server: message.guild.name,
moderator: message.author.tag,
time,
reason
});
data.guild.casesCount++;
const caseInfo = {
channel: message.channel.id,
moderator: message.author.id,
date: Date.now(),
type: "mute",
case: data.guild.casesCount,
reason,
time
};
memberData.mute.muted = true;
memberData.mute.endDate = Date.now() + ms(time);
memberData.mute.case = data.guild.casesCount;
memberData.sanctions.push(caseInfo);
memberData.markModified("sanctions");
memberData.markModified("mute");
await memberData.save();
await data.guild.save();
this.client.databaseCache.mutedUsers.set(`${member.id}${message.guild.id}`, memberData);
if (data.guild.plugins.modlogs) {
const channel = message.guild.channels.cache.get(data.guild.plugins.modlogs);
if (!channel) return;
const embed = new Discord.MessageEmbed()
.setAuthor({
name: message.translate("moderation/mute:CASE", {
count: data.guild.casesCount
})
})
.addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`, true)
.addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`, true)
.addField(message.translate("common:REASON"), reason, true)
.addField(message.translate("common:DURATION"), time, true)
.addField(message.translate("common:EXPIRY"), this.client.printDate(new Date(Date.now() + ms(time))), true)
.setColor("#f44271");
channel.send({
embeds: [embed]
});
}
}
}
module.exports = Mute;

View file

@ -85,15 +85,20 @@ class Poll extends Command {
this.client.emojis.cache.find(e => e.name === error)
];
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("moderation/poll:TITLE")
})
.setColor(data.config.embed.color)
.addField(question, message.translate("moderation/poll:REACT", {
success: emojis[0].toString(),
error: emojis[1].toString()
}));
.addFields([
{
name: question,
value: message.translate("moderation/poll:REACT", {
success: emojis[0].toString(),
error: emojis[1].toString()
})
}
]);
message.channel.send({
content: mention,

View file

@ -1,47 +0,0 @@
const Command = require("../../base/Command");
class Unmute extends Command {
constructor(client) {
super(client, {
name: "unmute",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["um"],
memberPermissions: ["MANAGE_MESSAGES"],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "MANAGE_CHANNELS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args) {
const member = await this.client.resolveMember(args[0], message.guild);
if (!member) return message.success("moderation/unmute:MISSING_MEMBER");
const memberPosition = member.roles.highest.position;
const moderationPosition = message.member.roles.highest.position;
if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR");
const memberData = await this.client.findOrCreateMember({
id: member.id,
guildID: message.guild.id
});
if (memberData.mute.muted) {
memberData.mute.endDate = Date.now();
memberData.markModified("mute");
memberData.save();
message.success("moderation/unmute:SUCCESS", {
username: member.user.tag
});
} else {
message.error("moderation/unmute:NOT_MUTED", {
username: member.user.tag
});
}
}
}
module.exports = Unmute;

View file

@ -0,0 +1,60 @@
const Command = require("../../base/Command");
class Untimeout extends Command {
constructor(client) {
super(client, {
name: "untimeout",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["untimeout"],
memberPermissions: ["BAN_MEMBERS"],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "BAN_MEMBERS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args) {
let user = null;
if (!args[0]) return message.error("moderation/unban:MISSING_ID");
// Check if the arg is an ID or a username
const isId = !isNaN(args[0]);
if (isId) {
// Try to find a user with that ID
await this.client.users.fetch(args[0]).then((u) => {
// if a user was found
user = u;
}).catch(() => {});
} else if (!isId) {
const arr = args[0].split("#");
if (arr.length < 2) {
return message.error("misc:NO_USER_FOUND_ID", {
id: args[0]
});
}
user = this.client.users.filter((u) => u.username === arr[0]).find((u) => u.discriminator === arr[1]);
}
if (!user) return message.error("misc:NO_USER_FOUND_ID", { id: args[0] });
// check if the user is banned
const banned = await message.guild.bans.fetch();
if (!banned.some((e) => e.user.id === user.id)) return message.success("moderation/unban:NOT_BANNED", { username: user.tag });
// Unban user
message.guild.members.unban(user).catch(() => {});
// Send a success message in the current channel
message.success("moderation/unban:UNBANNED", {
username: user.tag,
server: message.guild.name
});
}
}
module.exports = Untimeout;

View file

@ -53,10 +53,22 @@ class Warn extends Command {
reason
};
const embed = new Discord.MessageEmbed()
.addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`)
.addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`)
.addField(message.translate("common:REASON"), reason, true);
const embed = new Discord.EmbedBuilder()
.addFields([
{
name: message.translate("common:USER"),
value: `\`${member.user.tag}\` (${member.user.toString()})`
},
{
name: message.translate("common:MODERATOR"),
value: `\`${message.author.tag}\` (${message.author.toString()})`
},
{
name: message.translate("common:REASON"),
value: reason,
inline: true
}
]);
if (banCount) {
if (sanctions >= banCount) {

View file

@ -26,12 +26,11 @@ class Warns extends Command {
guildID: message.guild.id
});
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: user.tag,
iconURL: user.displayAvatarURL({
size: 512,
dynamic: true,
format: "png"
})
})
@ -49,7 +48,13 @@ class Warns extends Command {
});
} else {
memberData.sanctions.forEach((s) => {
embed.addField(s.type + " | #" + s.case, `${message.translate("common:MODERATOR")}: <@${s.moderator}>\n${message.translate("common:REASON")}: ${s.reason}`, true);
embed.addFields([
{
name: s.type + " | #" + s.case,
value: `${message.translate("common:MODERATOR")}: <@${s.moderator}>\n${message.translate("common:REASON")}: ${s.reason}`,
inline: true
}
]);
});
}
message.reply({

View file

@ -25,7 +25,7 @@ class Back extends Command {
if (!queue) return message.error("music/play:NOT_PLAYING");
if (!queue.previousSongs[0]) return message.error("music/back:NO_PREV_SONG");
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("music/back:DESCRIPTION")
})

View file

@ -28,7 +28,7 @@ class Clips extends Command {
clips.push(file.substring(0, file.length - 4));
});
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setTitle(message.translate("music/clips:EMBED_TITLE"))
.setDescription(clips.join("\n"))
.setColor(data.config.embed.color)

View file

@ -26,7 +26,7 @@ class Jump extends Command {
if (!queue) return message.error("music/play:NOT_PLAYING");
if (number < 0) return message.error("music/jump:NO_PREV_SONG", { prefix: data.guild.prefix });
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("music/jump:SUCCESS")
})

View file

@ -1,14 +1,14 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
class Np extends Command {
class Nowplaying extends Command {
constructor(client) {
super(client, {
name: "np",
name: "nowplaying",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["nowplaying"],
aliases: [],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
@ -39,15 +39,29 @@ class Np extends Command {
: message.translate("music/np:DISABLED")
}\``;
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("music/queue:TITLE")
})
.setThumbnail(track.thumbnail)
.addField(message.translate("music/np:T_TITLE"), `[${track.name}](${track.url})`)
.addField(message.translate("music/np:T_CHANNEL"), track.uploader.name ? track.uploader.name : "Отсутствует")
.addField(message.translate("music/np:T_DURATION"), `${queue.formattedCurrentTime} / ${track.duration > 1 ? track.formattedDuration : message.translate("music/play:LIVE")}`)
.addField(message.translate("music/np:T_CONF"), status(queue))
.addFields([
{
name: message.translate("music/np:T_TITLE"),
value: `[${track.name}](${track.url})`
},
{
name: message.translate("music/np:T_CHANNEL"),
value: track.uploader.name || message.translate("common:UNKNOWN")
},
{
name: message.translate("music/np:T_DURATION"),
value: `${queue.formattedCurrentTime} / ${track.duration > 1 ? track.formattedDuration : message.translate("music/play:LIVE")}`
},
{
name: message.translate("music/np:T_CONF"),
value: status(queue)
}
])
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
@ -60,4 +74,4 @@ class Np extends Command {
}
}
module.exports = Np;
module.exports = Nowplaying;

View file

@ -1,5 +1,5 @@
const Command = require("../../base/Command"),
{ Permissions } = require("discord.js");
{ PermissionsBitField } = require("discord.js");
class Play extends Command {
constructor(client) {
@ -25,7 +25,7 @@ class Play extends Command {
// Check my permissions
const perms = voice.permissionsFor(this.client.user);
if (!perms.has(Permissions.FLAGS.CONNECT) || !perms.has(Permissions.FLAGS.SPEAK)) return message.error("music/play:VOICE_CHANNEL_CONNECT");
if (!perms.has(PermissionsBitField.Flags.Connect) || !perms.has(PermissionsBitField.Flags.Speak)) return message.error("music/play:VOICE_CHANNEL_CONNECT");
try {
this.client.player.play(message.member.voice.channel, args.join(" "), {

View file

@ -1,6 +1,6 @@
const Command = require("../../base/Command"),
Discord = require("discord.js"),
Pagination = require("discord-paginationembed");
Pagination = require("customizable-discordjs-pagination");
class Queue extends Command {
constructor(client) {
@ -26,14 +26,17 @@ class Queue extends Command {
if (!queue) return message.error("music/play:NOT_PLAYING");
if (queue.songs.length === 1) {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("music/queue:TITLE"),
iconURL: message.guild.iconURL({
dynamic: true
})
iconURL: message.guild.iconURL()
})
.addField(message.translate("music/np:CURRENTLY_PLAYING"), `[${queue.songs[0].name}](${queue.songs[0].url})\n*${message.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n`)
.addFields([
{
name: message.translate("music/np:CURRENTLY_PLAYING"),
value: `[${queue.songs[0].name}](${queue.songs[0].url})\n*${message.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n`
}
])
.setColor(data.config.embed.color);
return message.reply({
embeds: [embed]
@ -46,11 +49,14 @@ class Queue extends Command {
.setColor(data.config.embed.color)
.setAuthor({
name: message.translate("music/queue:TITLE"),
iconURL: message.guild.iconURL({
dynamic: true
})
iconURL: message.guild.iconURL()
})
.addField(message.translate("music/np:CURRENTLY_PLAYING"), `[${queue.songs[0].name}](${queue.songs[0].url})\n*${message.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n`);
.addFields([
{
name: message.translate("music/np:CURRENTLY_PLAYING"),
value: `[${queue.songs[0].name}](${queue.songs[0].url})\n*${message.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n`
}
]);
FieldsEmbed
.setArray(queue.songs[1] ? queue.songs.slice(1, queue.songs.length) : [])
.setAuthorizedUsers([message.author.id])

View file

@ -25,7 +25,7 @@ class Skip extends Command {
if (!queue) return message.error("music/play:NOT_PLAYING");
if (!queue.songs[1]) return message.error("music/skip:NO_NEXT_SONG");
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("music/skip:SUCCESS")
})

View file

@ -24,7 +24,7 @@ class Stop extends Command {
if (!voice) return message.error("music/play:NO_VOICE_CHANNEL");
if (!queue) return message.error("music/play:NOT_PLAYING");
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("music/stop:DESCRIPTION")
})

View file

@ -4,7 +4,7 @@ const path = require("path");
class BaseCommand {
constructor(options, client) {
/**
* @type {import("@discordjs/builders").SlashCommandBuilder | import("discord.js").ApplicationCommandData}
* @type {import("discord.js").SlashCommandBuilder | import("discord.js").ApplicationCommandData}
*/
this.command = options.command;
/**

View file

@ -1,14 +1,13 @@
const { MessageEmbed, Client, Collection } = require("discord.js"),
const { EmbedBuilder, Client, Collection } = require("discord.js"),
{ GiveawaysManager } = require("discord-giveaways"),
{ SoundCloudPlugin } = require("@distube/soundcloud"),
{ SpotifyPlugin } = require("@distube/spotify"),
{ YtDlpPlugin } = require("@distube/yt-dlp"),
{ SlashCommandBuilder } = require("@discordjs/builders"),
{ SlashCommandBuilder } = require("discord.js"),
{ REST } = require("@discordjs/rest"),
{ Routes } = require("discord-api-types/v9");
{ Routes } = require("discord-api-types/v10");
const util = require("util"),
BaseEvent = require("./BaseEvent.js"),
const BaseEvent = require("./BaseEvent.js"),
BaseCommand = require("./BaseCommand.js"),
AmeClient = require("amethyste-api"),
path = require("path"),
@ -33,7 +32,7 @@ class JaBa extends Client {
this.languages = require("../languages/language-meta"); // Load the bot's languages
this.commands = new Collection(); // Creates new commands collection
this.logger = require("../helpers/logger"); // Load the logger file
this.wait = util.promisify(setTimeout); // client.wait(1000) - Wait 1 second
this.wait = require("node:timers/promises").setTimeout; // client.wait(1000) - Wait 1 second
this.functions = require("../helpers/functions"); // Load the functions file
this.guildsData = require("../base/Guild"); // Guild mongoose model
this.usersData = require("../base/User"); // User mongoose model
@ -59,7 +58,7 @@ class JaBa extends Client {
new SoundCloudPlugin(),
new YtDlpPlugin()
],
youtubeDL: false,
directLink: true,
emitNewSongOnly: true,
leaveOnEmpty: true,
leaveOnFinish: true,
@ -88,7 +87,7 @@ class JaBa extends Client {
.on("addList", (queue, playlist) => queue.textChannel.send({ content: this.translate("music/play:ADDED_QUEUE_COUNT", { songCount: `**${playlist.songs.length}** ${this.getNoun(playlist.songs.length, this.translate("misc:NOUNS:TRACKS:1"), this.translate("misc:NOUNS:TRACKS:1"), this.translate("misc:NOUNS:TRACKS:2"), this.translate("misc:NOUNS:TRACKS:5"))}` }, queue.textChannel.guild.data.language) }))
.on("searchResult", (message, result) => {
let i = 0;
const embed = new MessageEmbed()
const embed = new EmbedBuilder()
.setDescription(result.map(song => `**${++i} -** ${song.name}`).join("\n"))
.setFooter({ text: this.translate("music/play:RESULTS_FOOTER", null, message.guild.data.language) })
.setColor(this.config.embed.color);
@ -126,7 +125,7 @@ class JaBa extends Client {
async loadCommands(dir) {
const filePath = path.join(__dirname, dir);
var folders = await fs.readdir(filePath); folders = folders.map(file => path.join(filePath, file)).filter(async (path) => { path = await fs.lstat(path); path.isDirectory(); });
const rest = new REST({ version: "9" }).setToken(this.config.token);
const rest = new REST().setToken(this.config.token);
const commands = [];
for (let index = 0; index < folders.length; index++) {
const folder = folders[index];

53
commands/Fun/8ball.js Normal file
View file

@ -0,0 +1,53 @@
const { SlashCommandBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Eightball extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("8ball")
.setDescription(client.translate("fun/8ball:DESCRIPTION"))
.addStringOption(option =>
option.setName("question")
.setDescription(client.translate("fun/8ball:QUESTION"))
.setRequired(true)),
aliases: [],
dirname: __dirname,
guildOnly: true,
ownerOnly: false
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").CommandInteraction} interaction
* @param {Array} data
*/
async execute(client, interaction) {
await interaction.deferReply();
const question = interaction.options.getString("question");
if (!question.endsWith("?")) return interaction.replyT("fun/8ball:ERR_QUESTION", null, { ephemeral: true });
const answerN = client.functions.randomNum(1, 20);
const answer = interaction.translate(`fun/8ball:RESPONSE_${answerN}`);
await client.wait(2000);
interaction.editReply({
content: answer
});
}
}
module.exports = Eightball;

47
commands/Fun/lmgtfy.js Normal file
View file

@ -0,0 +1,47 @@
const { SlashCommandBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class LMGTFY extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("lmgtfy")
.setDescription(client.translate("fun/lmgtfy:DESCRIPTION"))
.addStringOption(option =>
option.setName("question")
.setDescription(client.translate("fun/8ball:QUESTION"))
.setRequired(true)),
aliases: [],
dirname: __dirname,
guildOnly: true,
ownerOnly: false
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").CommandInteraction} interaction
* @param {Array} data
*/
async execute(client, interaction) {
const question = interaction.options.getString("question").replace(/[' '_]/g, "+");
interaction.reply({
content: `<https://letmegooglethat.com/?q=${question}>`,
ephemeral: true
});
}
}
module.exports = LMGTFY;

74
commands/Fun/lovecalc.js Normal file
View file

@ -0,0 +1,74 @@
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand"),
md5 = require("md5");
class Lovecalc extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("lovecalc")
.setDescription(client.translate("fun/lovecalc:DESCRIPTION"))
.addUserOption(option =>
option.setName("first_member")
.setDescription(client.translate("common:USER"))
.setRequired(true))
.addUserOption(option =>
option.setName("second_member")
.setDescription(client.translate("common:USER"))),
aliases: [],
dirname: __dirname,
guildOnly: true,
ownerOnly: false
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").CommandInteraction} interaction
* @param {Array} data
*/
async execute(client, interaction) {
const firstMember = interaction.options.getMember("first_member");
const secondMember = interaction.options.getMember("second_member") || interaction.user;
const members = [firstMember, secondMember].sort((a, b) => parseInt(a.id, 10) - parseInt(b.id, 10));
const hash = md5(`${members[0].id}${members[1].user.username}${members[0].user.username}${members[1].id}`);
const string = hash
.split("")
.filter(e => !isNaN(e))
.join("");
const percent = parseInt(string.substr(0, 2), 10);
const embed = new EmbedBuilder()
.setAuthor({
name: `❤️ ${interaction.translate("fun/lovecalc:DESCRIPTION")}`
})
.setDescription(interaction.translate("fun/lovecalc:CONTENT", {
percent,
firstMember: firstMember,
secondMember: secondMember
}))
.setColor(client.config.embed.color)
.setFooter({
text: client.config.embed.footer
});
interaction.reply({
embeds: [embed]
});
}
}
module.exports = Lovecalc;

81
commands/Fun/memes.js Normal file
View file

@ -0,0 +1,81 @@
const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand"),
fetch = require("node-fetch");
class Memes extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("memes")
.setDescription(client.translate("fun/memes:DESCRIPTION")),
aliases: [],
dirname: __dirname,
guildOnly: true,
ownerOnly: false
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").CommandInteraction} interaction
* @param {Array} data
*/
async execute(client, interaction) {
const tags = ["memes", "dankmemes", "me_irl", "wholesomememes"].map(tag =>
JSON.parse(JSON.stringify({
label: tag,
value: tag
}))
);
const row = new ActionRowBuilder()
.addComponents(
new SelectMenuBuilder()
.setCustomId("memes_select")
.setPlaceholder(client.translate("common:NOTHING_SELECTED"))
.addOptions(tags)
);
const msg = await interaction.reply({
content: interaction.translate("common:AVAILABLE_CATEGORIES"),
components: [row],
fetchReply: true
});
const collector = new InteractionCollector(client, {
message: msg,
idle: 60 * 1000
});
collector.on("collect", async (msg) => {
const tag = msg?.values[0];
const res = await fetch(`https://meme-api.herokuapp.com/gimme/${tag}`).then(response => response.json());
const embed = new EmbedBuilder()
.setColor(client.config.embed.color)
.setFooter({
text: client.config.embed.footer
})
.setTitle(`${res.title}\n${interaction.translate("fun/memes:SUBREDDIT")}: ${res.subreddit}\n${interaction.translate("common:AUTHOR")}: ${res.author}\n${interaction.translate("fun/memes:UPS")}: ${res.ups}`)
.setImage(res.url)
.setTimestamp();
msg.update({
embeds: [embed]
});
});
}
}
module.exports = Memes;

View file

@ -1,4 +1,4 @@
const { SlashCommandBuilder } = require("@discordjs/builders");
const { SlashCommandBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Ping extends BaseCommand {

View file

@ -1,6 +1,4 @@
const { SlashCommandBuilder } = require("@discordjs/builders"),
{ MessageEmbed, MessageActionRow, MessageSelectMenu, InteractionCollector } = require("discord.js");
const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand"),
fetch = require("node-fetch");
@ -39,35 +37,35 @@ class NSFW extends BaseCommand {
const tags = ["hentai", "ecchi", "lewdanimegirls", "hentaifemdom", "animefeets", "animebooty", "biganimetiddies", "sideoppai", "ahegao"].map(tag =>
JSON.parse(JSON.stringify({
label: tag,
description: "",
value: tag
}))
);
const row = new MessageActionRow()
const row = new ActionRowBuilder()
.addComponents(
new MessageSelectMenu()
new SelectMenuBuilder()
.setCustomId("nsfw_select")
.setPlaceholder(client.translate("nsfw/nsfw:NOTHING_SELECTED"))
.setPlaceholder(client.translate("common:NOTHING_SELECTED"))
.addOptions(tags)
);
const msg = await interaction.reply({
content: interaction.translate("nsfw/nsfw:AVAILABLE_CATEGORIES"),
content: interaction.translate("common:AVAILABLE_CATEGORIES"),
ephemeral: true,
components: [row]
components: [row],
fetchReply: true
});
const collector = new InteractionCollector(client, {
message: msg,
time: 60 * 1000
idle: 60 * 1000
});
collector.on("collect", async (msg) => {
const tag = msg?.values[0];
const res = await fetch(`https://meme-api.herokuapp.com/gimme/${tag}`).then(response => response.json());
const embed = new MessageEmbed()
const embed = new EmbedBuilder()
.setColor(client.config.embed.color)
.setFooter({
text: client.config.embed.footer

View file

@ -1,4 +1,4 @@
const { SlashCommandBuilder } = require("@discordjs/builders");
const { SlashCommandBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Debug extends BaseCommand {

View file

@ -1,5 +1,5 @@
/* eslint-disable no-unused-vars */
const { SlashCommandBuilder } = require("@discordjs/builders");
const { SlashCommandBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Eval extends BaseCommand {
@ -14,7 +14,7 @@ class Eval extends BaseCommand {
.setDescription(client.translate("owner/eval:DESCRIPTION"))
.addStringOption(option =>
option.setName("code")
.setDescription(client.translate("owner/eval:USAGE"))
.setDescription(client.translate("owner/eval:CODE"))
.setRequired(true)),
aliases: [],
dirname: __dirname,

View file

@ -1,5 +1,5 @@
const { SlashCommandBuilder } = require("@discordjs/builders"),
BaseCommand = require("../../base/BaseCommand"),
const { SlashCommandBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand"),
i18next = require("i18next"),
autoUpdateDocs = require("../../helpers/autoUpdateDocs");
@ -15,7 +15,7 @@ class Reload extends BaseCommand {
.setDescription(client.translate("owner/reload:DESCRIPTION"))
.addStringOption(option =>
option.setName("command")
.setDescription(client.translate("owner/reload:USAGE"))
.setDescription(client.translate("owner/reload:COMMAND"))
.setRequired(true)),
aliases: [],
dirname: __dirname,

View file

@ -1,4 +1,4 @@
const { SlashCommandBuilder } = require("@discordjs/builders");
const { SlashCommandBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Say extends BaseCommand {
@ -38,7 +38,7 @@ class Say extends BaseCommand {
* @param {Array} data
*/
async execute(client, interaction) {
interaction.deferReply({ ephemeral: true });
await interaction.deferReply({ ephemeral: true });
const message = interaction.options.getString("message");
const channel = interaction.options.getChannel("channel");

View file

@ -1,5 +1,4 @@
const { SlashCommandBuilder } = require("@discordjs/builders"),
{ MessageEmbed } = require("discord.js");
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Servers extends BaseCommand {
@ -44,12 +43,11 @@ class Servers extends BaseCommand {
.slice(0, 10)
.join("\n");
const embed = new MessageEmbed()
const embed = new EmbedBuilder()
.setAuthor({
name: interaction.user.tag,
iconURL: interaction.user.displayAvatarURL({
size: 512,
dynamic: true,
format: "png"
})
})

View file

@ -80,7 +80,7 @@ router.get("/callback", async (req, res) => {
const userDB = await req.client.findOrCreateUser(req.session.user.id);
const logsChannel = req.client.channels.cache.get(req.client.config.dashboard.logs);
if (!userDB.logged && logsChannel && user) {
const embed = new Discord.MessageEmbed()
const embed = new Discord.EmbedBuilder()
.setAuthor({ name: user.username, iconURL: user.displayAvatarURL() })
.setColor(req.client.config.embed.color)
.setDescription(req.client.translate("dashboard:FIRST_LOGIN", { user: user.tag }));

View file

@ -1,4 +1,4 @@
const { Permissions } = require("discord.js");
const { PermissionsBitField } = require("discord.js");
/**
* Fetch user informations (stats, guilds, etc...)
@ -12,8 +12,8 @@ async function fetchUser(userData, client, query) {
userData.guilds.forEach((guild) => {
if (!client.guilds.cache.get(guild.id)) return;
// eslint-disable-next-line no-undef
const perms = new Permissions(BigInt(guild.permissions));
if (perms.has(Permissions.FLAGS.MANAGE_GUILD)) guild.admin = true;
const perms = new PermissionsBitField(BigInt(guild.permissions));
if (perms.has(PermissionsBitField.Flags.ManageGuild)) guild.admin = true;
guild.settingsUrl = (client.guilds.cache.get(guild.id) ? `/manage/${guild.id}/` : `https://discordapp.com/oauth2/authorize?client_id=${client.user.id}&scope=bot&permissions=8&guild_id=${guild.id}`);
guild.statsUrl = (client.guilds.cache.get(guild.id) ? `/stats/${guild.id}/` : `https://discordapp.com/oauth2/authorize?client_id=${client.user.id}&scope=bot&permissions=8&guild_id=${guild.id}`);

View file

@ -1,4 +1,5 @@
const BaseEvent = require("../base/BaseEvent");
const { InteractionType } = require("discord.js");
class CommandHandler extends BaseEvent {
constructor() {
@ -14,7 +15,7 @@ class CommandHandler extends BaseEvent {
* @param {import("discord.js").Interaction} interaction
*/
async execute(client, interaction) {
if (interaction.type !== "APPLICATION_COMMAND" && !interaction.isCommand()) return;
if (interaction.type !== InteractionType.ApplicationCommand && !interaction.isCommand()) return;
const command = client.commands.get(interaction.commandName);
const data = [];

View file

@ -1,4 +1,4 @@
const { MessageEmbed } = require("discord.js"),
const { EmbedBuilder } = require("discord.js"),
BaseEvent = require("../../base/BaseEvent");
class GuildCreate extends BaseEvent {
@ -31,7 +31,7 @@ class GuildCreate extends BaseEvent {
await userData.save();
}
const thanksEmbed = new MessageEmbed()
const thanksEmbed = new EmbedBuilder()
.setAuthor({
name: "Спасибо что добавили меня на свой сервер!"
})
@ -49,12 +49,10 @@ class GuildCreate extends BaseEvent {
const users = guild.members.cache.filter((m) => !m.user.bot).size;
const bots = guild.members.cache.filter((m) => m.user.bot).size;
const embed = new MessageEmbed()
const embed = new EmbedBuilder()
.setAuthor({
name: guild.name,
iconURL: guild.iconURL({
dynamic: true
})
iconURL: guild.iconURL()
})
.setColor("#32CD32")
.setDescription(`Зашёл на сервер **${guild.name}**. На нём **${users}** ${this.client.getNoun(users, this.client.translate("misc:NOUNS:USERS:1"), this.client.translate("misc:NOUNS:USERS:2"), this.client.translate("misc:NOUNS:USERS:5"))} (из них **${bots}** ${this.client.getNoun(bots, this.client.translate("misc:NOUNS:BOTS:1"), this.client.translate("misc:NOUNS:BOTS:2"), this.client.translate("misc:NOUNS:BOTS:5"))})`);

View file

@ -1,4 +1,4 @@
const { MessageEmbed } = require("discord.js"),
const { EmbedBuilder } = require("discord.js"),
BaseEvent = require("../../base/BaseEvent");
class GuildDelete extends BaseEvent {
@ -13,12 +13,10 @@ class GuildDelete extends BaseEvent {
* @param {import("discord.js").Guild} guild
*/
async execute(guild) {
const embed = new MessageEmbed()
const embed = new EmbedBuilder()
.setAuthor({
name: guild.name,
iconURL: guild.iconURL({
dynamic: true
})
iconURL: guild.iconURL()
})
.setColor("#B22222")
.setDescription(`Вышел с сервера **${guild.name}**.`);

View file

@ -1,6 +1,6 @@
const Canvas = require("canvas"),
BaseEvent = require("../../base/BaseEvent"),
{ MessageAttachment } = require("discord.js"),
{ AttachmentBuilder } = require("discord.js"),
{ resolve } = require("path");
// Register assets fonts
@ -139,7 +139,7 @@ class GuildMemberAdd extends BaseEvent {
}));
ctx.drawImage(avatar, 45, 90, 270, 270);
const attachment = new MessageAttachment(canvas.toBuffer(), "welcome-image.png");
const attachment = new AttachmentBuilder(canvas.toBuffer(), { name: "welcome-image.png" });
channel.send({
content: message,
files: [attachment]

View file

@ -1,6 +1,6 @@
const Canvas = require("canvas"),
BaseEvent = require("../../base/BaseEvent"),
{ MessageAttachment } = require("discord.js"),
{ AttachmentBuilder } = require("discord.js"),
{ resolve } = require("path");
// Register assets fonts
@ -122,7 +122,7 @@ class GuildMemberRemove extends BaseEvent {
}));
ctx.drawImage(avatar, 45, 90, 270, 270);
const attachment = new MessageAttachment(canvas.toBuffer(), "goodbye-image.png");
const attachment = new AttachmentBuilder(canvas.toBuffer(), { name: "goodbye-image.png" });
channel.send({
content: message,
files: [attachment]

View file

@ -1,4 +1,4 @@
const { Permissions } = require("discord.js"),
const { PermissionsBitField } = require("discord.js"),
xpCooldown = {},
BaseEvent = require("../base/BaseEvent");
@ -54,7 +54,7 @@ class MessageCreate extends BaseEvent {
if (data.guild.plugins.automod.enabled && !data.guild.plugins.automod.ignored.includes(message.channel.id)) {
if (/(discord\.(gg|io|me|li)\/.+|discordapp\.com\/invite\/.+)/i.test(message.content)) {
if (!message.channel.permissionsFor(message.member).has(Permissions.FLAGS.MANAGE_MESSAGES)) {
if (!message.channel.permissionsFor(message.member).has(PermissionsBitField.Flags.ManageMessages)) {
message.delete();
message.author.send("```" + message.content + "```");
return message.error("administration/automod:DELETED", {

View file

@ -1,5 +1,5 @@
const BaseEvent = require("../base/BaseEvent"),
{ Permissions } = require("discord.js");
{ PermissionsBitField } = require("discord.js");
class Ready extends BaseEvent {
constructor() {
@ -21,7 +21,7 @@ class Ready extends BaseEvent {
// Logs some informations using logger
client.logger.log(`Loaded a total of ${commands.length} command(s).`, "ready");
client.logger.log(`${client.user.tag}, ready to serve ${tUsers} users in ${tServers} servers.`, "ready");
client.logger.log(`Invite Link: ${client.generateInvite({ scopes: ["bot", "applications.commands"] , permissions: [Permissions.FLAGS.ADMINISTRATOR] })}`, "ready");
client.logger.log(`Invite Link: ${client.generateInvite({ scopes: ["bot", "applications.commands"] , permissions: [ PermissionsBitField.Flags.Administrator ] })}`, "ready");
// Discord Together
const discordtogether = require("../helpers/discordTogether");
@ -56,7 +56,6 @@ class Ready extends BaseEvent {
];
let i = 0;
setTimeout
setInterval(async function () {
hiddenGuild = await client.guilds.fetch("568120814776614924");
tUsers = client.users.cache.size - hiddenGuild.memberCount;

View file

@ -1,5 +1,5 @@
const { CronJob } = require("cron"),
{ MessageEmbed } = require("discord.js");
{ EmbedBuilder } = require("discord.js");
module.exports.init = async function (client) {
new CronJob("0 5 * * *", async function () {
@ -26,12 +26,11 @@ module.exports.init = async function (client) {
const age = currentYear - year;
if (currentMonth === month && currentDay === day) {
const embed = new MessageEmbed()
const embed = new EmbedBuilder()
.setAuthor({
name: client.user.username,
iconURL: client.user.displayAvatarURL({
size: 512,
dynamic: true,
format: "png"
})
})
@ -39,11 +38,16 @@ module.exports.init = async function (client) {
.setFooter({
text: client.config.embed.footer
})
.addField(client.translate("economy/birthdate:HAPPY_BIRTHDAY"), client.translate("economy/birthdate:HAPPY_BIRTHDAY_MESSAGE", {
name: user.username,
user: user.id,
age: `**${age}** ${client.getNoun(age, client.translate("misc:NOUNS:AGE:1"), client.translate("misc:NOUNS:AGE:2"), client.translate("misc:NOUNS:AGE:5"))}`
}));
.addFields([
{
name: client.translate("economy/birthdate:HAPPY_BIRTHDAY"),
value: client.translate("economy/birthdate:HAPPY_BIRTHDAY_MESSAGE", {
name: user.username,
user: user.id,
age: `**${age}** ${client.getNoun(age, client.translate("misc:NOUNS:AGE:1"), client.translate("misc:NOUNS:AGE:2"), client.translate("misc:NOUNS:AGE:5"))}`
})
}
]);
const msg = await channel.send({
embeds: [embed]
});

View file

@ -1,4 +1,4 @@
const { MessageEmbed } = require("discord.js");
const { EmbedBuilder } = require("discord.js");
module.exports.init = function (client) {
client.usersData
@ -18,14 +18,22 @@ module.exports.init = function (client) {
const mustSent = reminds.filter((r) => r.sendAt < dateNow);
if (mustSent.length > 0) {
mustSent.forEach((r) => {
const embed = new MessageEmbed()
const embed = new EmbedBuilder()
.setAuthor({
name: client.translate("general/remindme:TITLE")
})
.addField(client.translate("common:CREATION"), client.translate("general/remindme:CREATED", {
time: client.convertTime(r.createdAt, "from")
}))
.addField(client.translate("common:MESSAGE"), r.message)
.addFields([
{
name: client.translate("common:CREATION"),
value: client.translate("general/remindme:CREATED", {
time: client.convertTime(r.createdAt, "from")
})
},
{
name: client.translate("common:MESSAGE"),
value: r.message
}
])
.setColor(client.config.embed.color)
.setFooter({
text: client.config.embed.footer

View file

@ -1,4 +1,4 @@
const { MessageEmbed } = require("discord.js");
const { EmbedBuilder } = require("discord.js");
module.exports.init = async function (client) {
client.membersData
@ -33,7 +33,7 @@ module.exports.init = async function (client) {
});
}
const user = member ? member.user : await client.users.fetch(memberData.id);
const embed = new MessageEmbed()
const embed = new EmbedBuilder()
.setDescription(guild.translate("moderation/unmute:SUCCESS_CASE", {
user: user.toString(),
usertag: user.tag,

View file

@ -1,4 +1,31 @@
const { Message, Interaction } = require("discord.js");
const { Message, CommandInteraction } = require("discord.js");
CommandInteraction.prototype.translate = function (key, args) {
const language = this.client.translations.get(this.guild ? this.guild.data.language : "ru-RU");
if (!language) throw "Message: Invalid language set in data.";
return language(key, args);
};
CommandInteraction.prototype.replyT = function (key, args, options = {}) {
let string = this.translate(key, args, this.guild ? this.guild.data.language : "ru-RU");
if (options.prefixEmoji) string = `${this.client.customEmojis[options.prefixEmoji]} | ${string}`;
if (options.edit) return this.editReply({ content: string, ephemeral: options.ephemeral || false });
else return this.reply({ content: string, ephemeral: options.ephemeral || false });
};
CommandInteraction.prototype.error = function (key, args, options = {}) {
options.prefixEmoji = "error";
return this.replyT(key, args, options);
};
CommandInteraction.prototype.success = function (key, args, options = {}) {
options.prefixEmoji = "success";
return this.replyT(key, args, options);
};
Message.prototype.translate = function (key, args) {
const language = this.client.translations.get(this.guild ? this.guild.data.language : "ru-RU");
@ -24,32 +51,5 @@ Message.prototype.error = function (key, args, options = {}) {
Message.prototype.success = function (key, args, options = {}) {
options.prefixEmoji = "success";
return this.replyT(key, args, options);
};
Interaction.prototype.translate = function (key, args) {
const language = this.client.translations.get(this.guild ? this.guild.data.language : "ru-RU");
if (!language) throw "Message: Invalid language set in data.";
return language(key, args);
};
Interaction.prototype.replyT = function (key, args, options = {}) {
let string = this.translate(key, args, this.guild ? this.guild.data.language : "ru-RU");
if (options.prefixEmoji) string = `${this.client.customEmojis[options.prefixEmoji]} | ${string}`;
if (options.edit) return this.editReply({ content: string, ephemeral: options.ephemeral || false });
else return this.reply({ content: string, ephemeral: options.ephemeral || false });
};
Interaction.prototype.error = function (key, args, options = {}) {
options.prefixEmoji = "error";
return this.replyT(key, args, options);
};
Interaction.prototype.success = function (key, args, options = {}) {
options.prefixEmoji = "success";
return this.replyT(key, args, options);
};

View file

@ -1,4 +1,4 @@
const { Permissions } = require("discord.js"),
const { PermissionsBitField } = require("discord.js"),
langs = require("../languages/language-meta.json").map((l) => l.moment).filter((l) => l !== "en");
langs.forEach((lang) => {
require(`moment/locale/${lang}.js`);
@ -7,8 +7,8 @@ langs.forEach((lang) => {
module.exports = {
async createInvite(client, guildId) {
const guild = client.guilds.cache.get(guildId);
const member = guild.me;
const channel = guild.channels.cache.find((ch) => ch.permissionsFor(member.id).has(Permissions.FLAGS.CREATE_INSTANT_INVITE) && ch.type === "GUILD_TEXT" || ch.type === "GUILD_VOICE");
const member = guild.members.me;
const channel = guild.channels.cache.find((ch) => ch.permissionsFor(member.id).has(PermissionsBitField.Flags.CreateInstantInvite) && ch.type === "GUILD_TEXT" || ch.type === "GUILD_VOICE");
if (channel) {
const invite = await channel.createInvite();

View file

@ -1,6 +1,6 @@
// Thanks to simply-djs for this =)
const { MessageEmbed, MessageButton, MessageActionRow } = require("discord.js");
const { EmbedBuilder, ButtonBuilder, ActionRowBuilder, ButtonStyle } = require("discord.js");
/**
* @param {require("discord.js").Message} message
@ -66,7 +66,7 @@ async function tictactoe(interaction, options = {}) {
const foot = options.embedFoot ? { text: options.embedFoot } : { text: "Удачи =)" };
const acceptEmbed = new MessageEmbed()
const acceptEmbed = new EmbedBuilder()
.setTitle(interaction.translate("economy/tictactoe:REQUEST_WAIT", {
user: opponent.tag
}))
@ -78,17 +78,17 @@ async function tictactoe(interaction, options = {}) {
.setFooter(foot)
.setTimestamp();
const accept = new MessageButton()
const accept = new ButtonBuilder()
.setLabel(interaction.translate("economy/tictactoe:ACCEPT"))
.setStyle("SUCCESS")
.setCustomId("acceptttt");
const decline = new MessageButton()
const decline = new ButtonBuilder()
.setLabel(interaction.translate("economy/tictactoe:DECLINE"))
.setStyle("DANGER")
.setCustomId("declinettt");
const accep = new MessageActionRow().addComponents([
const accep = new ActionRowBuilder().addComponents([
accept,
decline
]);
@ -145,54 +145,54 @@ async function tictactoe(interaction, options = {}) {
const Args = {
user: 0,
a1: {
style: "SECONDARY",
style: ButtonStyle.Secondary,
emoji: dashmoji,
disabled: false
},
a2: {
style: "SECONDARY",
style: ButtonStyle.Secondary,
emoji: dashmoji,
disabled: false
},
a3: {
style: "SECONDARY",
style: ButtonStyle.Secondary,
emoji: dashmoji,
disabled: false
},
b1: {
style: "SECONDARY",
style: ButtonStyle.Secondary,
emoji: dashmoji,
disabled: false
},
b2: {
style: "SECONDARY",
style: ButtonStyle.Secondary,
emoji: dashmoji,
disabled: false
},
b3: {
style: "SECONDARY",
style: ButtonStyle.Secondary,
emoji: dashmoji,
disabled: false
},
c1: {
style: "SECONDARY",
style: ButtonStyle.Secondary,
emoji: dashmoji,
disabled: false
},
c2: {
style: "SECONDARY",
style: ButtonStyle.Secondary,
emoji: dashmoji,
disabled: false
},
c3: {
style: "SECONDARY",
style: ButtonStyle.Secondary,
emoji: dashmoji,
disabled: false
}
};
const { MessageActionRow, MessageButton } = require("discord.js");
const { ActionRowBuilder, ButtonBuilder } = require("discord.js");
const epm = new MessageEmbed()
const epm = new EmbedBuilder()
.setTitle(interaction.translate("economy/tictactoe:DESCRIPTION"))
.setColor(options.embedColor || "#075FFF")
.setFooter(foot)
@ -233,54 +233,54 @@ async function tictactoe(interaction, options = {}) {
"<:X_:863314044781723668>": false
};
const a1 = new MessageButton()
const a1 = new ButtonBuilder()
.setStyle(Args.a1.style)
.setEmoji(Args.a1.emoji)
.setCustomId("a1")
.setDisabled(Args.a1.disabled);
const a2 = new MessageButton()
const a2 = new ButtonBuilder()
.setStyle(Args.a2.style)
.setEmoji(Args.a2.emoji)
.setCustomId("a2")
.setDisabled(Args.a2.disabled);
const a3 = new MessageButton()
const a3 = new ButtonBuilder()
.setStyle(Args.a3.style)
.setEmoji(Args.a3.emoji)
.setCustomId("a3")
.setDisabled(Args.a3.disabled);
const b1 = new MessageButton()
const b1 = new ButtonBuilder()
.setStyle(Args.b1.style)
.setEmoji(Args.b1.emoji)
.setCustomId("b1")
.setDisabled(Args.b1.disabled);
const b2 = new MessageButton()
const b2 = new ButtonBuilder()
.setStyle(Args.b2.style)
.setEmoji(Args.b2.emoji)
.setCustomId("b2")
.setDisabled(Args.b2.disabled);
const b3 = new MessageButton()
const b3 = new ButtonBuilder()
.setStyle(Args.b3.style)
.setEmoji(Args.b3.emoji)
.setCustomId("b3")
.setDisabled(Args.b3.disabled);
const c1 = new MessageButton()
const c1 = new ButtonBuilder()
.setStyle(Args.c1.style)
.setEmoji(Args.c1.emoji)
.setCustomId("c1")
.setDisabled(Args.c1.disabled);
const c2 = new MessageButton()
const c2 = new ButtonBuilder()
.setStyle(Args.c2.style)
.setEmoji(Args.c2.emoji)
.setCustomId("c2")
.setDisabled(Args.c2.disabled);
const c3 = new MessageButton()
const c3 = new ButtonBuilder()
.setStyle(Args.c3.style)
.setEmoji(Args.c3.emoji)
.setCustomId("c3")
.setDisabled(Args.c3.disabled);
const a = new MessageActionRow().addComponents([a1, a2, a3]);
const b = new MessageActionRow().addComponents([b1, b2, b3]);
const c = new MessageActionRow().addComponents([c1, c2, c3]);
const a = new ActionRowBuilder().addComponents([a1, a2, a3]);
const b = new ActionRowBuilder().addComponents([b1, b2, b3]);
const c = new ActionRowBuilder().addComponents([c1, c2, c3]);
const buttons = [a, b, c];
if (
@ -688,14 +688,14 @@ async function tictactoe(interaction, options = {}) {
if (Args.user == 0) {
Args.user = 1;
Args[b.customId] = {
style: "SUCCESS",
style: ButtonStyle.Success,
emoji: o_emoji,
disabled: true
};
} else {
Args.user = 0;
Args[b.customId] = {
style: "DANGER",
style: ButtonStyle.Danger,
emoji: x_emoji,
disabled: true
};
@ -838,7 +838,7 @@ async function tictactoe(interaction, options = {}) {
collector.on("end", (collected, reason) => {
if (reason == "time") {
const embed = new MessageEmbed()
const embed = new EmbedBuilder()
.setTitle(interaction.translate("economy/tictactoe:NO_ANSWER_TITLE"))
.setAuthor({
name: (interaction.user ? interaction.user : interaction.author).tag,
@ -857,7 +857,7 @@ async function tictactoe(interaction, options = {}) {
});
}
if (reason == "decline") {
const embed = new MessageEmbed()
const embed = new EmbedBuilder()
.setTitle(interaction.translate("economy/tictactoe:CANCELED"))
.setAuthor({
name: (interaction.user ? interaction.user : interaction.author).tag,

View file

@ -1,10 +1,10 @@
require("./helpers/extenders");
const { Intents } = require("discord.js"),
const { GatewayIntentBits } = require("discord.js"),
JaBa = require("./base/JaBa");
const client = new JaBa({
intents: Object.keys(Intents.FLAGS),
intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, GatewayIntentBits.GuildBans, GatewayIntentBits.GuildEmojisAndStickers, GatewayIntentBits.GuildIntegrations, GatewayIntentBits.GuildInvites, GatewayIntentBits.GuildVoiceStates, GatewayIntentBits.GuildPresences, GatewayIntentBits.GuildMessages, GatewayIntentBits.GuildMessageReactions, GatewayIntentBits.GuildMessageTyping, GatewayIntentBits.MessageContent ],
allowedMentions: { parse: ["everyone", "roles", "users"] }
});
@ -17,7 +17,7 @@ const client = new JaBa({
})();
client.on("disconnect", () => client.logger.log("Bot is disconnecting...", "warn"))
.on("reconnecting", () => client.logger.log("Bot reconnecting...", "log"))
.on("reconnecting", () => client.logger.log("Bot reconnecting...", "warn"))
.on("error", (e) => client.logger.log(e, "error"))
.on("warn", (info) => client.logger.log(info, "warn"));
process.on("unhandledRejection", (err) => console.error(err));

View file

@ -1,20 +0,0 @@
{
"DESCRIPTION": "Управление резервными копиями сервера!",
"USAGE": "backup [create/load/info/remove]",
"EXAMPLES": "backup create\nbackup load 123456789098765432\nbackup info 123456789098765432",
"MISSING_STATUS": "Выберите действие: `create`, `load`, `info` или `remove`!",
"MISSING_BACKUP_ID": "Укажите ID резервной копии!",
"NO_BACKUP_FOUND": "Резервных копий с ID `{{backupID}}` не найдено",
"SUCCESS_PUBLIC": "Резервная копия успешно создана! ID резервной копии был отправлен вам в ЛС!",
"SUCCESS_PRIVATE": "Вот ID вашей резервной копии: **`{{backupID}}`**, используйте его для восстановления на другом сервере!",
"CONFIRMATION": ":warning: | **Загрузка резервной копии заменит настройки текущего сервера.**\n\n:arrow_right_hook: *Отправьте `да` для подтверждения!*",
"REMOVE_CONFIRMATION": ":warning: | **Вы уверены что хотите удалить резервную копию? Это действие необратимо**\n\n:arrow_right_hook: *Отправьте `да` для подтверждения!*",
"SUCCESS_REMOVED": "Резервная копия успешно удалена!",
"START_LOADING": "Загрузка резервной копии начата, подождите!",
"LOAD_SUCCESS": "Резервная копия загружена!",
"TITLE_INFO": "Информация о резервной копии",
"TITLE_ID": "ID",
"TITLE_SERVER_ID": "ID сервера",
"TITLE_SIZE": "Размер",
"TITLE_CREATED_AT": "Создана"
}

View file

@ -58,6 +58,8 @@
"MODLOGS": "Логи модерации",
"NO_CHANNEL": "Канал не выбран",
"REPORTS": "Жалобы",
"BIRTHDAYS": "Поздравления с днём рождения",
"DISCONNECT": "Отключить"
"UNKNOWN": "Неизвестно",
"NOTHING_SELECTED": "Ничего не выбрано",
"AVAILABLE_CATEGORIES": "Доступные категории:",
"BIRTHDAYS": "Поздравления с днём рождения"
}

View file

@ -1,8 +1,8 @@
{
"DESCRIPTION": "Я говорю правду!",
"USAGE": "8ball [вопрос?]",
"DESCRIPTION": "Я говорю правду",
"QUESTION": "Вопрос",
"EXAMPLES": "8ball JaBa крутой?",
"ERR_QUESTION": "Введите вопрос!",
"ERR_QUESTION": "Вопрос должен оканчиваться на `?`.",
"RESPONSE_1": "Бесспорно",
"RESPONSE_2": "Предрешено",
"RESPONSE_3": "Никаких сомнений",

View file

@ -1,7 +0,0 @@
{
"DESCRIPTION": "Подкинуть монетку!",
"USAGE": "flip",
"EXAMPLES": "flip",
"HEADS": ":coin: | Орёл!",
"TAILS": ":coin: | Решка!"
}

View file

@ -1,6 +1,6 @@
{
"DESCRIPTION": "Создать LMGTFY (давай я загуглю это для тебя) ссылку",
"USAGE": "lmg [запрос]",
"EXAMPLES": "lmg Как создать Discord бота?",
"USAGE": "lmgtfy [запрос]",
"EXAMPLES": "lmgtfy Как создать Discord бота?",
"MISSING": "Укажите запрос!"
}

View file

@ -2,6 +2,5 @@
"DESCRIPTION": "Калькулятор любви",
"USAGE": "lovecalc [@пользователь1] (@пользователь2)",
"EXAMPLES": "lovecalc @Jonny_Bro#4226\nlovecalc @Jonny_Bro#4226 @JaBa#9042",
"MISSING": "Вы должны упомянуть одного или двух пользователей!",
"CONTENT": "Я думаю, что **{{firstUsername}}** на **{{percent}}%** любит **{{secondUsername}}**!"
"CONTENT": "**{{firstMember}}** любит **{{secondMember}}** на **{{percent}}%**!"
}

View file

@ -1,5 +1,5 @@
{
"DESCRIPTION": "Получить мем с выбранного или случайного сабреддита",
"DESCRIPTION": "Получить мем с выбранного сабреддита",
"USAGE": "memes (тег)",
"EXAMPLES": "memes\nmemes me_irl",
"SEARCHING": "Ищу мем по тегу `{{tag}}`...",

View file

@ -1,10 +0,0 @@
{
"DESCRIPTION": "Получить ссылку на приглашение JaBa!",
"USAGE": "invite (copy)",
"EXAMPLES": "invite\ninvite copy",
"LINKS": "Ссылки JaBa",
"CLICK": "[**Тык**]({{link}})",
"TIP": "Отправьте `invite copy`, чтобы получить ссылку для копирования!",
"ADD": "Пригласить JaBa",
"SUPPORT": "Поддержать разработчика"
}

View file

@ -1,13 +0,0 @@
{
"DESCRIPTION": "Показать кол-во пользователей которых пользователь пригласил на сервер!",
"USAGE": "invites (@пользователь)",
"EXAMPLES": "invites\ninvites @Jonny_Bro#4226",
"NOBODY_AUTHOR": "Вы никого не пригласили на сервер!",
"NOBODY_MEMBER": "{{member}} никого не приглашал(а) на сервер!",
"CODE": "**{{code}}** ({{uses}} использований) | {{channel}}",
"TITLE": "Информация о {{member}} на сервере {{guild}}",
"FIELD_INVITED": "👥 Приглашённых участников",
"FIELD_CODES": "🔑 Коды",
"FIELD_MEMBERS": "{{total}} участников",
"TRACKER": "Отслеживание приглашений"
}

View file

@ -1,9 +0,0 @@
{
"DESCRIPTION": "Перевести текст!",
"USAGE": "translate [язык] [текст]",
"EXAMPLES": "translate english Как дела?",
"LIST_SENT": "Список языков отправлен вам в ЛС!",
"MISSING_LANGUAGE": "Укажите язык! Чтобы получить список языков, введите `translate langs-list`!",
"INVALID_LANGUAGE": "Язык `{{search}}` не найден! Чтобы получить список языков, введите `translate langs-list`!",
"MISSING_CONTENT": "Введите текст!"
}

View file

@ -1,6 +1,5 @@
{
"ERR_OCCURRED": "Что-то пошло не так... Попробуйте позже!",
"PLEASE_WAIT": "Подождите...",
"COMMAND_DISABLED": "Эта команда на данный момент отключена!",
"CLICK_HERE": "Нажмите сюда, чтобы начать {{activity}} в {{channel}}",
"TIMES_UP": "Время вышло! Используйте команду снова!",
@ -26,51 +25,6 @@
"COOLDOWNED": "Подождите **{{seconds}}**, чтобы снова использовать эту команду!",
"CANNOT_DM": "Я не могу отправить вам личное сообщение... Проверьте свои настройки конфиденциальности!",
"PERMISSIONS": {
"CREATE_INSTANT_INVITE": "Создание приглашения",
"KICK_MEMBERS": "Выгонять участников",
"BAN_MEMBERS": "Банить участников",
"ADMINISTRATOR": "Администратор",
"MANAGE_CHANNELS": "Управлять каналами",
"MANAGE_GUILD": "Управлять сервером",
"ADD_REACTIONS": "Добавлять реакции",
"VIEW_AUDIT_LOG": "Просматривать журнал аудита",
"PRIORITY_SPEAKER": "Приоритетный режим",
"STREAM": "Видео",
"VIEW_CHANNEL": "Просматривать каналы",
"SEND_MESSAGES": "Отправлять сообщения",
"SEND_TTS_MESSAGES": "Отправка сообщений text-to-speech",
"MANAGE_MESSAGES": "Управлять сообщениями",
"EMBED_LINKS": "Встраивать ссылки",
"ATTACH_FILES": "Прикреплять файлы",
"READ_MESSAGE_HISTORY": "Читать историю сообщений",
"MENTION_EVERYONE": "Упоминание *@*everyone, *@*here и всех ролей",
"USE_EXTERNAL_EMOJIS": "Использовать внешние эмодзи",
"VIEW_GUILD_INSIGHTS": "Просматривать статистику сервера",
"CONNECT": "Подключаться",
"SPEAK": "Говорить",
"MUTE_MEMBERS": "Отключать участникам микрофон",
"DEAFEN_MEMBERS": "Отключать участникам звук",
"MOVE_MEMBERS": "Перемещать участников",
"USE_VAD": "Использовать режим активации по голосу",
"CHANGE_NICKNAME": "Изменить никнейм",
"MANAGE_NICKNAMES": "Управлять никнеймами",
"MANAGE_ROLES": "Управлять ролями",
"MANAGE_WEBHOOKS": "Управлять вебхуками (webhooks)",
"MANAGE_EMOJIS_AND_STICKERS": "Управлять эмодзи и стикерами",
"USE_APPLICATION_COMMANDS": "Использовать команды приложения",
"MANAGE_EVENTS": "Управление событиями",
"MANAGE_THREADS": "Управление ветками",
"USE_PUBLIC_THREADS": "Использовать публичные ветки",
"CREATE_PUBLIC_THREADS": "Создать публичные ветки",
"USE_PRIVATE_THREADS": "Использование приватных веток",
"CREATE_PRIVATE_THREADS": "Создание приватных веток",
"USE_EXTERNAL_STICKERS": "Использовать внешние стикеры",
"SEND_MESSAGES_IN_THREADS": "Отправлять сообщения в ветках",
"START_EMBEDDED_ACTIVITIES": "Начать активность",
"MODERATE_MEMBERS": "Отправить участников подумать о своём поведении"
},
"NOUNS": {
"CREDIT": {
"1": "кредит",

View file

@ -1,13 +0,0 @@
{
"DESCRIPTION": "Забанить пользователя на сервере!",
"USAGE": "ban [@пользователь] (причина)",
"EXAMPLES": "ban @Jonny_Bro#4226 Спам",
"MISSING_MEMBER": "Вы должны упомянуть пользователя!",
"YOURSELF": "Вы не можете забанить себя!",
"SUPERIOR": "Вы не можете сделать это, т.к. пользователь стоит выше вас по роли!",
"ALREADY_BANNED": "**{{username}}** уже в бане!",
"MISSING_PERM": "Произошла ошибка... Проверьте, есть ли у вас право банить пользователей и попробуйте снова!",
"BANNED_DM": "Привет {{username}},\nвы были забанены на сервере **{{server}}** пользователем **{{moderator}}** по причине **{{reason}}**!",
"BANNED": "**{{username}}** был забанен на сервере **{{server}}** пользователем **{{moderator}}** по причине **{{reason}}**!",
"CASE": "Бан | Номер #{{count}}"
}

View file

@ -1,11 +0,0 @@
{
"DESCRIPTION": "Кикнуть пользователя!",
"USAGE": "kick [@пользователь] (причина)",
"EXAMPLES": "kick @Jonny_Bro#4226 Спам",
"MISSING_MEMBER": "Вы должны упомянуть пользователя!",
"YOURSELF": "Вы не можете кикнуть себя!",
"MISSING_PERM": "Произошла ошибка... Проверьте, есть ли у вас право кикать пользователей и попробуйте снова!",
"KICKED_DM": "Привет {{username}},\nвы были кикнуты с сервера **{{server}}** пользователем **{{moderator}}** по причине **{{reason}}**!",
"KICKED": "**{{username}}** был кикнут с сервера **{{server}}** пользователем **{{moderator}}** по причине **{{reason}}**!",
"CASE": "Кик | Номер #{{count}}"
}

View file

@ -1,10 +0,0 @@
{
"DESCRIPTION": "Запретить пользователю писать сообщения и заходить в голосовые каналы!",
"USAGE": "mute [@пользователь] [время] (причина)",
"EXAMPLES": "mute @Jonny_Bro#4226 24h Спам",
"MISSING_MEMBER": "Вы должны упомянуть пользователя!",
"YOURSELF": "Вы не можете замутить себя!",
"MUTED_DM": "Привет {{username}},\nвы были замучены на сервере **{{server}}** пользователем **{{moderator}}** на **{{time}}** по причине **{{reason}}**!",
"MUTED": "**{{username}}** замучен на **{{time}}** по причине **{{reason}}**!",
"CASE": "Мут | Номер #{{count}}"
}

View file

@ -1,9 +0,0 @@
{
"DESCRIPTION": "Размутить пользователя!",
"USAGE": "unmute [@пользователь]",
"EXAMPLES": "unmute @Jonny_Bro#4226",
"MISSING_MEMBER": "Вы должны упомянуть пользователя!",
"NOT_MUTED": "**{{username}}** не замучен на данном сервере!",
"SUCCESS": "**{{username}}** был размучен на данном сервере!",
"SUCCESS_CASE": "{{user}} (`{{usertag}}`) размучен! (Номер #{{count}})"
}

View file

@ -2,7 +2,5 @@
"DESCRIPTION": "Найти NSFW изображение по тэгу",
"USAGE": "nsfw",
"EXAMPLES": "nsfw",
"AVAILABLE_CATEGORIES": "Доступные категории:",
"NOTHING_SELECTED": "Ничего не выбрано",
"TAG": "Тэг"
}

View file

@ -1,5 +1,5 @@
{
"DESCRIPTION": "Выполнить код",
"USAGE": "[код]",
"CODE": "Выполняемый код",
"EXAMPLES": "eval interaction.channel.send({ content: \"Hello World!\" })"
}

View file

@ -1,6 +1,6 @@
{
"DESCRIPTION": "Перезагрузить команду!",
"USAGE": "reload",
"COMMAND": "Команда",
"EXAMPLES": "reload help",
"NOT_FOUND": "Команды `{{search}}` не существует!",
"SUCCESS": "Команда `{{command}}` успешно перезагружена!"

Some files were not shown because too many files have changed in this diff Show more