This commit is contained in:
JonnyBro 2022-08-09 23:48:33 +05:00
parent b258fbf6e6
commit bcd9a04559
174 changed files with 2373 additions and 2153 deletions

View file

@ -1,103 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
class Achievements extends Command {
constructor(client) {
super(client, {
name: "achievements",
dirname: __dirname,
enabled: true,
guildOnly: false,
aliases: ["ac"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args, data) {
let member = message.guild ? message.member : message.author;
if (args[0]) member = await this.client.resolveMember(args[0], message.guild);
if (message.guild && member.user.bot) return message.error("economy/profile:BOT_USER");
const userData = (member.id === message.author.id ? data.userData : await this.client.findOrCreateUser({
id: member.id
}));
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("economy/achievements:TITLE")
})
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
});
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]
});
}
}
module.exports = Achievements;

View file

@ -1,50 +0,0 @@
const Command = require("../../base/Command");
class Birthdate extends Command {
constructor(client) {
super(client, {
name: "birthdate",
dirname: __dirname,
enabled: true,
guildOnly: false,
aliases: ["bd"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args, data) {
const date = args[0];
if (!date) return message.error("economy/birthdate:MISSING_DATE");
const tArgs = date.split("/");
const [day, month, year] = tArgs;
if (!day || !month || !year) return message.error("economy/birthdate:INVALID_DATE");
const match = date.match(/\d+/g);
if (!match) return message.error("economy/birthdate:INVALID_DATE");
const tday = +match[0],
tmonth = +match[1] - 1;
let tyear = +match[2];
if (tyear < 100) tyear += tyear < 50 ? 2000 : 1900;
const d = new Date(tyear, tmonth, tday);
if (!(tday == d.getDate() && tmonth == d.getMonth() && tyear == d.getFullYear())) return message.error("economy/birthdate:INVALID_DATE");
if (d.getTime() > Date.now()) return message.error("economy/birthdate:DATE_TOO_HIGH");
if (d.getTime() < (Date.now() - 2.523e+12)) return message.error("economy/birthdate:DATE_TOO_LOW");
data.userData.birthdate = d;
data.userData.save();
message.success("economy/birthdate:SUCCESS", {
date: this.client.printDate(d)
});
}
}
module.exports = Birthdate;

View file

@ -1,52 +0,0 @@
const Command = require("../../base/Command");
class Deposit extends Command {
constructor(client) {
super(client, {
name: "deposit",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["bank", "dep"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args, data) {
let amount = args[0];
if (!(parseInt(data.memberData.money, 10) > 0)) return message.error("economy/deposit:NO_CREDIT");
if (args[0] === "all") {
amount = parseInt(data.memberData.money, 10);
} else {
if (isNaN(amount) || parseInt(amount, 10) < 1) return message.error("economy/deposit:MISSING_AMOUNT");
amount = parseInt(amount, 10);
}
if (data.memberData.money < amount) return message.error("economy/deposit:NOT_ENOUGH_CREDIT", { money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` });
const info = {
user: message.translate("economy/transactions:BANK"),
amount: amount,
date: Date.now(),
type: "send"
};
data.memberData.transactions.push(info);
data.memberData.money = data.memberData.money - amount;
data.memberData.bankSold = data.memberData.bankSold + amount;
data.memberData.save();
message.success("economy/deposit:SUCCESS", {
money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`
});
}
}
module.exports = Deposit;

View file

@ -1,45 +0,0 @@
const Command = require("../../base/Command");
class Divorce extends Command {
constructor(client) {
super(client, {
name: "divorce",
dirname: __dirname,
enabled: true,
guildOnly: false,
aliases: ["di"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 2000
});
}
async run(message, args, data) {
if (!data.userData.lover) return message.error("economy/divorce:NOT_MARRIED");
const user = this.client.users.cache.get(data.userData.lover) || await this.client.users.fetch(data.userData.lover);
data.userData.lover = null;
data.userData.save();
const oldLover = await this.client.findOrCreateUser({
id: user.id
});
oldLover.lover = null;
oldLover.save();
message.success("economy/divorce:DIVORCED", {
username: user.username
});
user.send({
content: message.translate("economy/divorce:DIVORCED_U", {
username: message.author.username
})
});
}
}
module.exports = Divorce;

View file

@ -1,184 +0,0 @@
const Command = require("../../base/Command");
const games = {};
class Horserace extends Command {
constructor(client) {
super(client, {
name: "horserace",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["hr"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 2000
});
}
async run(message, args, data) {
if (!args[0]) return message.error("economy/horserace:MISSING_STATUS");
const author = message.author;
if (args[0] === "create") {
let thisGame = games[message.channel.id];
if (thisGame) return message.error("economy/horserace:GAME_RUNNING");
else {
games[message.channel.id] = {
horseSpeeds: [],
bets: []
};
thisGame = games[message.channel.id];
const f = [];
for (let i = 0; i < 5; i++) {
const speed = this.client.functions.randomNum(1, 5);
const profit = {
1: 3.5,
2: 3,
3: 2.5,
4: 2,
5: 1.5,
};
// const profit = Math.floor((((8.9 / 9) * (6 - speed)) + 1.1) * 10) / 10;
thisGame.horseSpeeds.push(speed);
f.push({
name: message.translate("economy/horserace:HORSE_NAME", {
number: i + 1
}),
value: message.translate("economy/horserace:HORSE_VALUE", {
speed,
profit: profit[speed]
})
});
}
message.reply({
embeds: [{
color: data.config.embed.color,
title: message.translate("economy/horserace:EMBED_T"),
fields: f
}]
});
}
} else if (args[0] === "bet") {
const thisGame = games[message.channel.id];
const horse = parseInt(args[1]);
const amount = parseInt(args[2]);
if (horse > 5) return message.error("economy/horserace:HORSE_NUM");
if (!thisGame) return message.error("economy/horserace:NO_GAME_RUNNING");
if (!amount || isNaN(amount) || parseInt(amount, 10) <= 0) return message.error("economy/pay:INVALID_AMOUNT");
if (amount > data.memberData.money) return message.error("economy/pay:ENOUGH_MONEY", {
amount: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDITS:1"), message.translate("misc:NOUNS:CREDITS:2"), message.translate("misc:NOUNS:CREDITS:5"))}`
});
thisGame.bets[author.id] = {
amount,
horse
};
message.sendT("economy/horserace:BET", {
user: author,
amount: `**${Math.floor(amount)}** ${message.getNoun(Math.floor(amount), message.translate("misc:NOUNS:CREDITS:1"), message.translate("misc:NOUNS:CREDITS:2"), message.translate("misc:NOUNS:CREDITS:5"))}`,
horse
});
} else if (args[0] === "go") {
const thisGame = games[message.channel.id];
const horsePositions = [0, 0, 0, 0, 0];
if (!thisGame) return message.error("economy/horserace:NO_GAME_RUNNING");
// eslint-disable-next-line no-constant-condition
while (true) {
for (let i = 0; i < 5; i++) {
if (thisGame.horseSpeeds[i] >= Math.floor(Math.random() * 15)) {
horsePositions[i] += 1;
if (horsePositions[i] === 3) {
const winnings = [];
const profit = {
1: 3.5,
2: 3,
3: 2.5,
4: 2,
5: 1.5,
};
// const profit = Math.floor((((8.9 / 9) * (6 - thisGame.horseSpeeds[i])) + 1.1) * 10) / 10;
for (let j = 0; j < Object.keys(thisGame.bets).length; j++) {
if (Object.values(thisGame.bets)[j].horse === i + 1) {
winnings.push([Object.keys(thisGame.bets)[j], Object.values(thisGame.bets)[j].amount * profit[thisGame.horseSpeeds[i]]]);
}
}
if (winnings.length === 0) {
for (let j = 0; j < Object.keys(thisGame.bets).length; j++) {
if (Object.values(thisGame.bets)[j].horse !== i + 1) {
const memberData = await this.client.findOrCreateMember({
id: Object.keys(thisGame.bets)[j],
guildID: message.guild.id
});
const info = {
user: message.translate("economy/transactions:HORSERACE"),
amount: Object.values(thisGame.bets)[j].amount,
date: Date.now(),
type: "send"
};
memberData.transactions.push(info);
memberData.money -= Object.values(thisGame.bets)[j].amount;
}
}
message.sendT("economy/horserace:NO_WINNERS", {
horse: i + 1
});
} else {
let winners = "";
for (let j = 0; j < winnings.length; j++) {
winners += `\n<@${winnings[j][0]}> выиграл **${Math.floor(winnings[j][1])}** ${message.getNoun(Math.floor(winnings[j][1]), message.translate("misc:NOUNS:CREDITS:1"), message.translate("misc:NOUNS:CREDITS:2"), message.translate("misc:NOUNS:CREDITS:5"))}!`;
const memberData = await this.client.findOrCreateMember({
id: winnings[j][0],
guildID: message.guild.id
});
const toAdd = Math.floor(winnings[j][1]) - Object.values(thisGame.bets)[j].amount;
const info = {
user: message.translate("economy/transactions:HORSERACE"),
amount: toAdd,
date: Date.now(),
type: "got"
};
memberData.transactions.push(info);
memberData.money += toAdd;
memberData.save();
}
message.sendT("economy/horserace:WINNERS", {
horse: i + 1,
winners
});
}
delete games[message.channel.id];
return;
}
}
}
}
}
}
}
module.exports = Horserace;

View file

@ -1,29 +0,0 @@
const { getUserXp } = require("mee6-levels-api");
const Command = require("../../base/Command"),
Discord = require("discord.js");
class ImportMee6 extends Command {
constructor(client) {
super(client, {
name: "money",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: [],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args, data) {
await getUserXp(message.guild.id, message.author.id).then(user => {
Levels.setLevel(message.author.id, message.guild.id, user.level);
message.lineReply(`Ваш уровень Mee6 синхронизирован! Новый уровень - ${user.level}`);
});
}
};
module.exports = ImportMee6;

View file

@ -1,168 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
class Leaderboard extends Command {
constructor(client) {
super(client, {
name: "leaderboard",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["lb"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 2000
});
}
async run(message, args, data) {
const isOnMobile = (message.member.presence.clientStatus ? JSON.stringify(Object.keys(message.member.presence.clientStatus)) === JSON.stringify(["mobile"]) : false);
const type = args[0];
if (!type || !["credits", "level", "rep"].includes(type)) return message.error("economy/leaderboard:MISSING_TYPE");
if (type === "credits") {
const members = await this.client.membersData.find({
guildID: message.guild.id
}).lean(),
membersLeaderboard = members.map((m) => {
return {
id: m.id,
money: m.money + m.bankSold
};
}).sort((a, b) => b.money - a.money);
if (membersLeaderboard.length > 20) membersLeaderboard.length = 20;
let userNames = "";
let money = "";
for (let i = 0; i < membersLeaderboard.length; i++) {
const data = membersLeaderboard[i];
const user = (await this.client.users.fetch(data.id)).tag;
userNames += `**${i + 1}**. ${user}\n`;
money += `${data.money}\n`;
}
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("economy/leaderboard:TABLE", {
name: message.guild.name
}),
iconURL: message.guild.iconURL()
})
.setColor(data.config.embed.color)
.addFields({
name: message.translate("economy/leaderboard:TOP"),
value: userNames,
inline: true
}, {
name: message.translate("common:CREDITS"),
value: money,
inline: true
});
message.reply({
embeds: [embed]
});
} else if (type === "level") {
const members = await this.client.membersData.find({
guildID: message.guild.id
}).lean(),
membersLeaderboard = members.map((m) => {
return {
id: m.id,
level: m.level,
xp: m.exp
};
}).sort((a, b) => b.level - a.level);
if (membersLeaderboard.length > 20) membersLeaderboard.length = 20;
let userNames = "";
let level = "";
let xp = "";
for (let i = 0; i < membersLeaderboard.length; i++) {
const data = membersLeaderboard[i];
const user = (await this.client.users.fetch(data.id)).tag;
userNames += `**${i + 1}**. ${user}\n`;
level += `${data.level}\n`;
xp += `${data.xp} / ${5 * (data.level * data.level) + 80 * data.level + 100}\n`;
}
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("economy/leaderboard:TABLE", {
name: message.guild.name
}),
iconURL: message.guild.iconURL()
})
.setColor(data.config.embed.color)
.addFields({
name: message.translate("economy/leaderboard:TOP"),
value: userNames,
inline: true
}, {
name: message.translate("common:LEVEL"),
value: level,
inline: true
}, {
name: message.translate("common:XP"),
value: xp,
inline: true
});
message.reply({
embeds: [embed]
});
} else if (type === "rep") {
const users = await this.client.usersData.find({
rep: { $gt: 0 }
}).lean(),
usersLeaderboard = users.map((u) => {
return {
id: u.id,
rep: u.rep
};
}).sort((a, b) => b.rep - a.rep);
if (usersLeaderboard.length > 20) usersLeaderboard.length = 20;
let userNames = "";
let rep = "";
for (let i = 0; i < usersLeaderboard.length; i++) {
const data = usersLeaderboard[i];
const user = (await this.client.users.fetch(data.id)).tag;
userNames += `**${i + 1}**. ${user}\n`;
rep += `${data.rep}\n`;
}
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("economy/leaderboard:TABLE", {
name: message.guild.name
}),
iconURL: message.guild.iconURL()
})
.setColor(data.config.embed.color)
.addFields({
name: message.translate("economy/leaderboard:TOP"),
value: userNames,
inline: true
}, {
name: message.translate("common:REP"),
value: rep,
inline: true
});
message.reply({
embeds: [embed]
});
}
if (isOnMobile) message.sendT("economy/leaderboard:MOBILE");
}
}
module.exports = Leaderboard;

View file

@ -1,134 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
const pendings = {};
class Marry extends Command {
constructor(client) {
super(client, {
name: "marry",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: [],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 2000
});
}
async run(message, args, data) {
if (data.userData.lover) return message.error("economy/marry:ALREADY_MARRIED", { prefix: data.guildData.prefix });
const member = await this.client.resolveMember(args[0], message.guild);
if (!member) return message.error("economy/marry:INVALID_MEMBER");
const userData = await this.client.findOrCreateUser({
id: member.id
});
if (userData.lover) return message.error("economy/marry:ALREADY_MARRIED_USER", { username: member.user.tag });
if (member.user.bot) return message.error("economy/marry:BOT_USER");
if (member.id === message.author.id) return message.error("economy/marry:YOURSELF");
for (const requester in pendings) {
const receiver = pendings[requester];
// If the member already sent a request to someone
if (requester === message.author.id) {
const user = this.client.users.cache.get(receiver) || await this.client.users.fetch(receiver);
return message.error("economy/marry:REQUEST_AUTHOR_TO_AMEMBER", {
username: user.tag
});
} else if (receiver === message.author.id) { // If there is a pending request for this member
const user = this.client.users.cache.get(requester) || await this.client.users.fetch(requester);
return message.error("economy/marry:REQUEST_AMEMBER_TO_AUTHOR", {
username: user.tag
});
} else if (requester === member.id) { // If the asked member has sent pending request
const user = this.client.users.cache.get(receiver) || await this.client.users.fetch(receiver);
return message.error("economy/marry:REQUEST_AMEMBER_TO_MEMBER", {
firstUsername: member.user.tag,
secondUsername: user.tag
});
} else if (receiver === member.id) { // If there is a pending request for the asked member
const user = this.client.users.cache.get(requester) || await this.client.users.fetch(requester);
return message.error("economy/marry:REQUEST_MEMBER_TO_AMEMBER", {
firstUsername: member.user.tag,
secondUsername: user.tag
});
}
}
// Update pending requests
pendings[message.author.id] = member.id;
message.sendT("economy/marry:REQUEST", {
from: message.author.toString(),
to: member.user.toString()
});
const filter = m => m.author.id === member.id;
const collector = new Discord.MessageCollector(message.channel, {
filter,
time: 120000
});
collector.on("collect", (msg) => {
if (msg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) {
return collector.stop(true);
} else if (msg.content.toLowerCase() === message.translate("common:NO").toLowerCase()) {
return collector.stop(false);
} else {
return message.error("misc:INVALID_YES_NO");
}
});
collector.on("end", async (_collected, reason) => {
// Delete pending request
delete pendings[message.author.id];
if (reason === "time") return message.error("economy/marry:TIMEOUT", { username: member.user.toString() });
if (reason) {
data.userData.lover = member.id;
await data.userData.save();
userData.lover = message.author.id;
await userData.save();
const messageOptions = {
content: `${member.toString()} :heart: ${message.author.toString()}`,
files: [{
name: "achievement_unlocked3.png",
attachment: "./assets/img/achievements/achievement_unlocked3.png"
}]
};
let sent = false;
if (!userData.achievements.married.achieved) {
message.channel.send(messageOptions);
sent = true;
userData.achievements.married.achieved = true;
userData.achievements.married.progress.now = 1;
userData.markModified("achievements.married");
userData.save();
}
if (!data.userData.achievements.married.achieved) {
if (!sent) message.channel.send(messageOptions);
data.userData.achievements.married.achieved = true;
data.userData.achievements.married.progress.now = 1;
data.userData.markModified("achievements.married");
data.userData.save();
}
return message.success("economy/marry:SUCCESS", {
creator: message.author.toString(),
partner: member.user.toString()
});
} else {
return message.success("economy/marry:DENIED", {
creator: message.author.toString(),
partner: member.user.toString()
});
}
});
}
}
module.exports = Marry;

View file

@ -1,88 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
const asyncForEach = async (collection, callback) => {
const allPromises = collection.map(async key => {
await callback(key);
});
return await Promise.all(allPromises);
};
class Money extends Command {
constructor(client) {
super(client, {
name: "money",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["balance", "mon"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
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 user = member.user;
if (user.bot) return message.error("misc:BOT_USER");
const memberData = (message.author === user) ? data.memberData : await this.client.findOrCreateMember({
id: user.id,
guildID: message.guild.id
});
const commonsGuilds = this.client.guilds.cache.filter((g) => g.members.cache.get(user.id));
let globalMoney = 0;
await asyncForEach(commonsGuilds, async (guild) => {
const data = await this.client.findOrCreateMember({
id: user.id,
guildID: guild.id
});
globalMoney += data.money;
globalMoney += data.bankSold;
});
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("economy/money:TITLE", {
username: member.user.username
}),
iconURL: member.user.displayAvatarURL({
extension: "png",
size: 512
})
})
.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
});
message.reply({
embeds: [embed]
});
}
}
module.exports = Money;

View file

@ -1,97 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
const currentGames = {};
class Number extends Command {
constructor(client) {
super(client, {
name: "number",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["num"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 2000
});
}
async run(message, args, data) {
if (currentGames[message.guild.id]) return message.error("economy/number:GAME_RUNNING");
const participants = [],
number = this.client.functions.randomNum(1000, 6000);
await message.sendT("economy/number:GAME_START");
// Store the date wich the game has started
const gameCreatedAt = Date.now();
const filter = m => !m.author.bot;
const collector = new Discord.MessageCollector(message.channel, {
filter,
time: 480000 // 8 minutes
});
currentGames[message.guild.id] = true;
collector.on("collect", async msg => {
if (!participants.includes(msg.author.id)) participants.push(msg.author.id);
if (msg.content === "STOP") return collector.stop("force");
if (isNaN(msg.content)) return;
const parsedNumber = parseInt(msg.content, 10);
if (parsedNumber === number) {
const time = this.client.convertTime(message.guild, Date.now() - gameCreatedAt);
message.sendT("economy/number:GAME_STATS", {
winner: msg.author.toString(),
number,
time,
participantCount: participants.length,
participants: participants.map(p => `<@${p}>`).join(", ")
});
if (participants.length > 1 && data.guildData.disabledCategories && !data.guildData.disabledCategories.includes("Economy")) {
const won = 100 * (participants.length * 0.5);
message.sendT("economy/number:WON", {
winner: msg.author.username,
credits: `**${won}** ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`
});
const memberData = await this.client.findOrCreateMember({
id: msg.author.id,
guildID: message.guild.id
});
const info = {
user: message.translate("economy/transactions:NUMBERS"),
amount: won,
date: Date.now(),
type: "got"
};
data.memberData.transactions.push(info);
memberData.money += won;
memberData.save();
}
collector.stop();
}
if (parseInt(msg.content) < number) message.error("economy/number:BIG", { user: msg.author.toString(), number: parsedNumber });
if (parseInt(msg.content) > number) message.error("economy/number:SMALL", { user: msg.author.toString(), number: parsedNumber });
});
collector.on("end", (_collected, reason) => {
delete currentGames[message.guild.id];
if (reason === "time") return message.error("economy/number:DEFEAT", { number });
else if (reason === "force") return message.error("misc:FORCE_STOP", { user: message.author.toString() });
});
}
}
module.exports = Number;

View file

@ -1,59 +0,0 @@
const Command = require("../../base/Command");
class Pay extends Command {
constructor(client) {
super(client, {
name: "pay",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: [],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 2000
});
}
async run(message, args, data) {
const member = await this.client.resolveMember(args[0], message.guild);
if (!member) return message.error("economy/pay:INVALID_MEMBER");
if (member.user.bot) return message.error("economy/pay:BOT_USER");
if (member.id === message.author.id) return message.error("economy/pay:YOURSELF");
const sentAmount = args[1];
if (!sentAmount || isNaN(sentAmount) || parseInt(sentAmount, 10) <= 0) return message.error("economy/pay:INVALID_AMOUNT");
const amount = Math.ceil(parseInt(sentAmount, 10));
if (amount > data.memberData.money) return message.error("economy/pay:ENOUGH_MONEY", {
amount: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDITS:1"), message.translate("misc:NOUNS:CREDITS:2"), message.translate("misc:NOUNS:CREDITS:5"))}`
});
const memberData = await this.client.findOrCreateMember({
id: member.id,
guildID: message.guild.id
});
const info = {
user: member.user.tag,
amount: parseInt(amount, 10),
date: Date.now(),
type: "send"
};
data.memberData.transactions.push(info);
data.memberData.money = data.memberData.money - parseInt(amount, 10);
data.memberData.save();
memberData.money = memberData.money + parseInt(amount, 10);
memberData.save();
message.success("economy/pay:SUCCESS", {
amount: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`,
username: member.user.tag
});
}
}
module.exports = Pay;

View file

@ -1,144 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
const asyncForEach = async (collection, callback) => {
const allPromises = collection.map(async key => {
await callback(key);
});
return await Promise.all(allPromises);
};
class Profile extends Command {
constructor(client) {
super(client, {
name: "profile",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["prof"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args, data) {
const arg = args[0] || message.author;
let member = await this.client.resolveMember(arg, message.guild);
if (!member) member = message.member;
if (member.user.bot) return message.error("economy/profile:BOT_USER");
const memberData = (member.id === message.author.id ? data.memberData : await this.client.findOrCreateMember({
id: member.id,
guildID: message.guild.id
}));
const userData = (member.id === message.author.id ? data.userData : await this.client.findOrCreateUser({
id: member.id
}));
if (userData.lover && !this.client.users.cache.get(userData.lover)) await this.client.users.fetch(userData.lover, true);
const commonsGuilds = this.client.guilds.cache.filter((g) => g.members.cache.get(member.id));
let globalMoney = 0;
await asyncForEach(commonsGuilds, async (guild) => {
const data = await this.client.findOrCreateMember({
id: member.id,
guildID: guild.id
});
globalMoney += data.money;
globalMoney += data.bankSold;
});
const profileEmbed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("economy/profile:TITLE", {
username: member.user.tag
}),
iconURL: member.user.displayAvatarURL({
extension: "png",
size: 512
})
})
.setImage("attachment://achievements.png")
.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.guildData.prefix
})
}
])
.setColor(data.config.embed.color) // Sets the color of the embed
.setFooter({
text: data.config.embed.footer
}) // Sets the footer of the embed
.setTimestamp();
const buffer = await userData.getAchievements();
message.reply({
embeds: [profileEmbed],
files: [{
name: "achievements.png",
attachment: buffer
}]
});
}
}
module.exports = Profile;

View file

@ -1,71 +0,0 @@
const Command = require("../../base/Command");
class Rep extends Command {
constructor(client) {
super(client, {
name: "rep",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["reputation"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args, data) {
// if the member is already in the cooldown db
const isInCooldown = (data.userData.cooldowns || {
rep: 0
}).rep;
if (isInCooldown) {
/*if the timestamp recorded in the database indicating
when the member will be able to execute the order again
is greater than the current date, display an error message */
if (isInCooldown > Date.now()) return message.error("economy/rep:COOLDOWN", {
time: this.client.convertTime(isInCooldown, "to", true)
});
}
const user = await this.client.resolveUser(args[0]);
if (!user) return message.error("economy/rep:INVALID_USER");
if (user.bot) return message.error("economy/rep:BOT_USER");
if (user.id === message.author.id) return message.error("economy/rep:YOURSELF");
// Records in the database the time when the member will be able to execute the command again (in 12 hours)
const toWait = Date.now() + 21600000;
data.userData.cooldowns = {};
data.userData.cooldowns.rep = toWait;
data.userData.markModified("cooldowns");
data.userData.save();
const userData = await this.client.findOrCreateUser({
id: user.id
});
userData.rep++;
if (!userData.achievements.rep.achieved) {
userData.achievements.rep.progress.now = (userData.rep > userData.achievements.rep.progress.total ? userData.achievements.rep.progress.total : userData.rep);
if (userData.achievements.rep.progress.now >= userData.achievements.rep.progress.total) {
userData.achievements.rep.achieved = true;
message.channel.send({
content: `${user}`,
files: [{
name: "achievement_unlocked6.png",
attachment: "./assets/img/achievements/achievement_unlocked6.png"
}]
});
}
userData.markModified("achievements.rep");
}
await userData.save();
message.success("economy/rep:SUCCESS", {
username: user.username
});
}
}
module.exports = Rep;

View file

@ -1,78 +0,0 @@
const Command = require("../../base/Command");
class Rob extends Command {
constructor(client) {
super(client, {
name: "rob",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["steal"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 2000
});
}
async run(message, args, data) {
const member = await this.client.resolveMember(args[0], message.guild);
if (!member) return message.error("economy/rob:MISSING_MEMBER");
if (member.id === message.author.id) return message.error("economy/rob:YOURSELF");
const memberData = await this.client.findOrCreateMember({
id: member.id,
guildID: message.guild.id
});
const isInCooldown = memberData.cooldowns.rob || 0;
if (isInCooldown) {
if (isInCooldown > Date.now()) return message.error("economy/rob:COOLDOWN", { user: member.user });
}
let amountToRob = args[1];
if (!amountToRob || isNaN(amountToRob) || parseInt(amountToRob, 10) <= 0) return message.error("economy/rob:MISSING_AMOUNT", { user: member.user });
amountToRob = Math.floor(parseInt(amountToRob, 10));
if (amountToRob > memberData.money) return message.error("economy/rob:NOT_ENOUGH_MEMBER", { user: member.user });
const potentiallyLose = Math.floor(amountToRob * 1.5);
if (potentiallyLose > data.memberData.money) return message.error("economy/rob:NOT_ENOUGH_AUTHOR", {
moneyMin: `${potentiallyLose} ${message.getNoun(potentiallyLose, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`,
moneyCurrent: `${data.memberData.money} ${message.getNoun(data.memberData.money, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`
});
const itsAWon = Math.floor(this.client.functions.randomNum(0, 100) < 25);
if (itsAWon) {
const toWait = Date.now() + 6 * (60 * 60000); // 6 hours
memberData.cooldowns.rob = toWait;
memberData.markModified("cooldowns");
await memberData.save();
const randomNum = this.client.functions.randomNum(1, 2);
message.sendT("economy/rob:ROB_WON_" + randomNum, {
money: `${amountToRob} ${message.getNoun(amountToRob, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`,
user: member.user
});
data.memberData.money += amountToRob;
memberData.money -= amountToRob, 10;
memberData.save();
data.memberData.save();
} else {
const won = Math.floor(0.9 * amountToRob);
const randomNum = this.client.functions.randomNum(1, 2);
message.sendT("economy/rob:ROB_LOSE_" + randomNum, {
fine: `${potentiallyLose} ${message.getNoun(potentiallyLose, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`,
offset: `${won} ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`,
user: member.user
});
data.memberData.money -= potentiallyLose;
memberData.money += won;
memberData.save();
data.memberData.save();
}
}
}
module.exports = Rob;

View file

@ -1,30 +0,0 @@
const Command = require("../../base/Command");
class Setbio extends Command {
constructor(client) {
super(client, {
name: "setbio",
dirname: __dirname,
enabled: true,
guildOnly: false,
aliases: ["biography", "setdesc", "sb"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args, data) {
const newBio = args.join(" ");
if (!newBio) return message.error("economy/setbio:MISSING");
if (newBio.length > 100) return message.error("economy/setbio:MAX_CHARACT");
data.userData.bio = newBio;
message.success("economy/setbio:SUCCESS");
await data.userData.save();
}
}
module.exports = Setbio;

View file

@ -1,46 +0,0 @@
const Command = require("../../base/Command"),
tictactoe = require("../../helpers/tictactoe");
class TicTacToe extends Command {
constructor(client) {
super(client, {
name: "tictactoe",
dirname: __dirname,
enabled: true,
guildOnly: false,
aliases: ["ttt"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 2000
});
}
async run(message, args, data) {
tictactoe(message, {
resultBtn: true,
embedColor: data.config.embed.color,
embedFoot: data.config.embed.footer
}).then(async winner => {
const memberData = await this.client.findOrCreateMember({
id: winner.id,
guildID: message.guild.id
});
const info = {
user: message.translate("economy/transactions:TTT"),
amount: 100,
date: Date.now(),
type: "got"
};
memberData.transactions.push(info);
memberData.money += 100;
memberData.save();
});
}
}
module.exports = TicTacToe;

View file

@ -1,67 +0,0 @@
const Command = require("../../base/Command"),
Discord = require("discord.js");
class Transactions extends Command {
constructor(client) {
super(client, {
name: "transactions",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["tr"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 2000
});
}
async run(message, args, data) {
const embed = new Discord.EmbedBuilder()
.setAuthor({
name: message.translate("economy/transactions:EMBED_TRANSACTIONS"),
iconURL: message.author.displayAvatarURL({
extension: "png",
size: 512
})
})
.setColor(data.config.embed.color)
.setFooter({
text: data.config.embed.footer
});
const transactions = data.memberData.transactions,
sortedTransactions = [ [], [] ];
transactions.slice(-20).forEach((t) => {
const array = t.type === "got" ? sortedTransactions[0] : sortedTransactions[1];
array.push(`${message.translate("economy/transactions:T_USER_" + t.type.toUpperCase())}: ${t.user}\n${message.translate("economy/transactions:T_AMOUNT")}: ${t.amount}\n${message.translate("economy/transactions:T_DATE")}: ${this.client.printDate(t.date, "Do MMMM YYYY, HH:mm")}\n`);
});
if (transactions.length < 1) {
embed.setDescription(message.translate("economy/transactions:NO_TRANSACTIONS"));
} else {
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({
embeds: [embed]
});
}
}
module.exports = Transactions;

View file

@ -1,52 +0,0 @@
const Command = require("../../base/Command");
class Withdraw extends Command {
constructor(client) {
super(client, {
name: "withdraw",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["wd"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args, data) {
let amount = args[0];
if (!(parseInt(data.memberData.bankSold, 10) > 0)) return message.error("economy/withdraw:NO_CREDIT");
if (args[0] === "all") {
amount = parseInt(data.memberData.bankSold, 10);
} else {
if (isNaN(amount) || parseInt(amount, 10) < 1) return message.error("economy/withdraw:MISSING_AMOUNT");
amount = parseInt(amount, 10);
}
if (data.memberData.bankSold < amount) return message.error("economy/withdraw:NOT_ENOUGH", { money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` });
const info = {
user: message.translate("economy/transactions:BANK"),
amount: amount,
date: Date.now(),
type: "got"
};
data.memberData.transactions.push(info);
data.memberData.money = data.memberData.money + amount;
data.memberData.bankSold = data.memberData.bankSold - amount;
data.memberData.save();
message.success("economy/withdraw:SUCCESS", {
money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`
});
}
}
module.exports = Withdraw;

View file

@ -1,129 +0,0 @@
const Command = require("../../base/Command"),
{ parseEmoji, EmbedBuilder } = require("discord.js");
class Work extends Command {
constructor(client) {
super(client, {
name: "work",
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["salary", "daily"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 1000
});
}
async run(message, args, data) {
// if the member is already in the cooldown db
const isInCooldown = data.memberData.cooldowns.work;
if (isInCooldown) {
/*if the timestamp recorded in the database indicating
when the member will be able to execute the order again
is greater than the current date, display an error message */
if (isInCooldown > Date.now()) return message.error("economy/work:COOLDOWN", {
time: this.client.convertTime(isInCooldown, "to", true)
});
}
if (Date.now() > data.memberData.cooldowns.work + (24 * 3600000)) data.memberData.workStreak = 0;
// Records in the database the time when the member will be able to execute the command again (in 12 hours)
const toWait = Date.now() + 43200000;
data.memberData.cooldowns.work = toWait;
data.memberData.markModified("cooldowns");
data.memberData.workStreak = (data.memberData.workStreak || 0) + 1;
await data.memberData.save();
const embed = new EmbedBuilder()
.setFooter({
text: message.translate("economy/work:AWARD"),
iconURL: message.author.displayAvatarURL({
extension: "png",
size: 512
})
})
.setColor(data.config.embed.color);
const award = [
this.client.customEmojis.letters.a,
this.client.customEmojis.letters.w,
this.client.customEmojis.letters.a,
this.client.customEmojis.letters.r,
this.client.customEmojis.letters.d
];
let won = 200;
if (data.memberData.workStreak >= 5) {
won += 200;
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 = parseEmoji(award[i]).name.split("_")[1];
award[i] = `:regional_indicator_${letter.toLowerCase()}:`;
}
}
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 = {
user: message.translate("economy/work:SALARY"),
amount: won,
date: Date.now(),
type: "got"
};
data.memberData.transactions.push(info);
data.memberData.money = data.memberData.money + won;
data.memberData.save();
const messageOptions = {
embeds: [embed]
};
if (!data.userData.achievements.work.achieved) {
data.userData.achievements.work.progress.now += 1;
if (data.userData.achievements.work.progress.now === data.userData.achievements.work.progress.total) {
messageOptions.files = [{
name: "unlocked.png",
attachment: "./assets/img/achievements/achievement_unlocked1.png"
}];
data.userData.achievements.work.achieved = true;
}
data.userData.markModified("achievements.work");
data.userData.save();
}
// Send the embed in the current channel
message.reply(messageOptions);
}
}
module.exports = Work;

195
TO REWRITE/leaderboard.js Normal file
View file

@ -0,0 +1,195 @@
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Leaderboard extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("leaderboard")
.setDescription(client.translate("economy/leaderboard:DESCRIPTION"))
.addStringOption(option => option.setName("type")
.setDescription(client.translate("owner/debug:TYPE"))
.setRequired(true)
.addChoices(
{ name: client.translate("economy/leaderboard:LEVEL"), value: "level" },
{ name: client.translate("economy/leaderboard:MONEY"), value: "money" },
{ name: client.translate("economy/leaderboard:REP"), value: "rep" }
)),
aliases: [],
dirname: __dirname,
guildOnly: true,
ownerOnly: false
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply();
const type = interaction.options.getString("type");
const isOnMobile = JSON.stringify(Object.keys(interaction.member.presence.clientStatus)) === JSON.stringify(["mobile"]);
if (isOnMobile) interaction.followUp({
content: interaction.translate("economy/leaderboard:MOBILE"),
ephemeral: true
});
if (type === "money") {
const members = await client.membersData.find({
guildID: interaction.guildId
}).lean(),
membersLeaderboard = members.map(m => {
return {
id: m.id,
money: m.money + m.bankSold
};
}).sort((a, b) => b.money - a.money);
if (membersLeaderboard.length > 20) membersLeaderboard.length = 20;
let userNames = "";
let money = "";
for (let i = 0; i < membersLeaderboard.length; i++) {
const data = membersLeaderboard[i];
const user = await client.users.fetch(data.id);
userNames += `**${i + 1}**. ${user}\n`;
money += `${data.money}\n`;
}
const embed = new EmbedBuilder()
.setAuthor({
name: interaction.translate("economy/leaderboard:TABLE", {
name: interaction.guild.name
}),
iconURL: interaction.guild.iconURL()
})
.setColor(client.config.embed.color)
.addFields({
name: interaction.translate("economy/leaderboard:TOP"),
value: userNames,
inline: true
}, {
name: interaction.translate("common:CREDITS"),
value: money,
inline: true
});
interaction.editReply({
embeds: [embed]
});
} else if (type === "level") {
const membersLeaderboard = [];
client.membersData.find({
guildID: interaction.guildId
}).lean().then(async m => {
await membersLeaderboard.push({
id: m.id,
level: m.level,
xp: m.exp
});
});
membersLeaderboard.sort((a, b) => b.level - a.level);
if (membersLeaderboard.length > 20) membersLeaderboard.length = 20;
const userNames = [];
const level = [];
const xp = [];
for (let i = 0; i < membersLeaderboard.length; i++) {
const data = membersLeaderboard[i];
const user = await client.users.fetch(data.id);
userNames.push(`**${i + 1}**. ${user.tag}`);
level.push(`${data.level}`);
xp.push(`${data.xp} / ${5 * (data.level * data.level) + 80 * data.level + 100}`);
}
const embed = new EmbedBuilder()
.setAuthor({
name: interaction.translate("economy/leaderboard:TABLE", {
name: interaction.guild.name
}),
iconURL: interaction.guild.iconURL()
})
.setColor(client.config.embed.color)
.addFields([
{
name: interaction.translate("economy/leaderboard:TOP"),
value: userNames.join("\n"),
inline: true
},
{
name: interaction.translate("common:LEVEL"),
value: level.join("\n"),
inline: true
},
{
name: interaction.translate("common:XP"),
value: xp.join("\n"),
inline: true
}
]);
interaction.editReply({
embeds: [embed]
});
} else if (type === "rep") {
const users = await client.usersData.find({
rep: { $gt: 0 }
}).lean(),
usersLeaderboard = users.map(u => {
return {
id: u.id,
rep: u.rep
};
}).sort((a, b) => b.rep - a.rep);
if (usersLeaderboard.length > 20) usersLeaderboard.length = 20;
let userNames = "";
let rep = "";
for (let i = 0; i < usersLeaderboard.length; i++) {
const data = usersLeaderboard[i];
const user = await client.users.fetch(data.id);
userNames += `**${i + 1}**. ${user}\n`;
rep += `${data.rep}\n`;
}
const embed = new EmbedBuilder()
.setAuthor({
name: interaction.translate("economy/leaderboard:TABLE", {
name: interaction.guild.name
}),
iconURL: interaction.guild.iconURL()
})
.setColor(client.config.embed.color)
.addFields({
name: interaction.translate("economy/leaderboard:TOP"),
value: userNames,
inline: true
}, {
name: interaction.translate("common:REP"),
value: rep,
inline: true
});
interaction.editReply({
embeds: [embed]
});
}
}
}
module.exports = Leaderboard;

View file

@ -31,7 +31,7 @@ class Seek extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const voice = interaction.member.voice.channel;

View file

@ -34,7 +34,7 @@ class Automod extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction, data) {
const state = interaction.options.getBoolean("state");

View file

@ -33,13 +33,13 @@ class Autorole extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction, data) {
const state = interaction.options.getBoolean("state");
if (state) {
const role = interaction.options.getRole("role", true);
const role = interaction.options.getRole("role");
if (!role) return interaction.error("administration/autorole:MISSING_ROLE");
data.guildData.plugins.autorole = {
@ -50,13 +50,9 @@ class Autorole extends BaseCommand {
await data.guildData.save();
interaction.success("administration/autorole:SUCCESS_ENABLED", {
roleName: role.name
roleName: role.toString()
});
} else {
if (!data.guildData.plugins.autorole.enabled) return interaction.success("administration/autorole:ALREADY_DISABLED", {
prefix: data.guildData.prefix
});
data.guildData.plugins.autorole = {
enabled: false,
role: null
@ -64,9 +60,7 @@ class Autorole extends BaseCommand {
data.guildData.markModified("plugins.autorole");
await data.guildData.save();
interaction.success("administration/autorole:SUCCESS_DISABLED", {
prefix: data.guildData.prefix
});
interaction.success("administration/autorole:SUCCESS_DISABLED");
}
}
}

View file

@ -28,7 +28,7 @@ class Config extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction, data) {
const guildData = data.guildData;
@ -75,7 +75,7 @@ class Config extends BaseCommand {
{
name: interaction.translate("administration/config:AUTOMOD_TITLE"),
value: guildData.plugins.automod.enabled ? interaction.translate("administration/config:AUTOMOD_CONTENT", {
channels: guildData.plugins.automod.ignored.map(ch => `<#${ch}>`)
channels: guildData.plugins.automod.ignored.map(ch => ` ${ch}`)
}) : interaction.translate("common:DISABLED")
},
{

View file

@ -31,7 +31,7 @@ class Deletemod extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction, data) {
const state = interaction.options.getBoolean("state");

View file

@ -43,7 +43,7 @@ class Goodbye extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction, data) {
const command = interaction.options.getSubcommand();

View file

@ -19,8 +19,7 @@ class Set extends BaseCommand {
{ name: client.translate("common:LEVEL"), value: "level" },
{ name: client.translate("common:XP"), value: "xp" },
{ name: client.translate("common:CREDITS"), value: "credits" },
{ name: client.translate("economy/transactions:BANK"), value: "bank" },
{ name: client.translate("common:REP"), value: "rep" },
{ name: client.translate("economy/transactions:BANK"), value: "bank" }
))
.addUserOption(option => option.setName("user")
.setDescription(client.translate("common:USER"))
@ -45,56 +44,50 @@ class Set extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction, data) {
async execute(client, interaction) {
const type = interaction.options.getString("type");
const member = interaction.options.getMember("user");
if (member.user.bot) return interaction.error("misc:BOT_USER", null, { ephemeral: true });
const memberData = await client.findOrCreateMember({
id: member.id
});
const int = interaction.options.getInteger("int");
if (int < 0) return interaction.error("administration/set:INVALID_NUMBER", null, { ephemeral: true });
switch (type) {
case "level": {
data.memberData.level = int;
await data.memberData.save();
return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), {
memberData.level = int;
await memberData.save();
return interaction.success(`owner/debug:SUCCESS_${type.toUpperCase()}`, {
username: member.toString(),
amount: int
}, { ephemeral: true });
}
case "xp": {
data.memberData.exp = int;
await data.memberData.save();
return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), {
memberData.exp = int;
await memberData.save();
return interaction.success(`owner/debug:SUCCESS_${type.toUpperCase()}`, {
username: member.toString(),
amount: int
}, { ephemeral: true });
}
case "credits": {
data.memberData.money = int;
await data.memberData.save();
return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), {
memberData.money = int;
await memberData.save();
return interaction.success(`owner/debug:SUCCESS_${type.toUpperCase()}`, {
username: member.toString(),
amount: int
}, { ephemeral: true });
}
case "bank": {
data.memberData.bankSold = int;
await data.memberData.save();
return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), {
username: member.toString(),
amount: int
}, { ephemeral: true });
}
case "rep": {
data.memberData.rep = int;
await data.memberData.save();
return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), {
memberData.bankSold = int;
await memberData.save();
return interaction.success(`owner/debug:SUCCESS_${type.toUpperCase()}`, {
username: member.toString(),
amount: int
}, { ephemeral: true });

View file

@ -34,7 +34,7 @@ class Setbirthdays extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction, data) {
const state = interaction.options.getBoolean("state");

View file

@ -35,7 +35,7 @@ class Setlang extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction, data) {
const lang = interaction.options.getString("language");

View file

@ -34,7 +34,7 @@ class Setmodlogs extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction, data) {
const state = interaction.options.getBoolean("state");

View file

@ -34,7 +34,7 @@ class Setnews extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction, data) {
const state = interaction.options.getBoolean("state");

View file

@ -34,7 +34,7 @@ class Setreports extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction, data) {
const state = interaction.options.getBoolean("state");

View file

@ -34,7 +34,7 @@ class Setsuggests extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction, data) {
const state = interaction.options.getBoolean("state");

View file

@ -31,7 +31,7 @@ class Stealemoji extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const parsedEmoji = parseEmoji(interaction.options.getString("emoji"));
@ -46,9 +46,9 @@ class Stealemoji extends BaseCommand {
emoji: emoji.name
}, { ephemeral: true }))
.catch(e => {
console.log(e);
interaction.error("administration/stealemoji:ERROR", {
emoji: parsedEmoji.name
emoji: parsedEmoji.name,
e
}, { ephemeral: true });
});
}

View file

@ -43,7 +43,7 @@ class Welcome extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction, data) {
const command = interaction.options.getSubcommand();

View file

@ -0,0 +1,116 @@
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Achievements extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("achievements")
.setDescription(client.translate("economy/achievements:DESCRIPTION"))
.addUserOption(option => option.setName("user")
.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").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
const member = interaction.options.getMember("user") || interaction.member;
if (member.user.bot) return interaction.error("economy/profile:BOT_USER");
const userData = (member.id === interaction.member.id ? data.userData : await client.findOrCreateUser({
id: member.id
}));
const embed = new EmbedBuilder()
.setAuthor({
name: interaction.translate("economy/achievements:TITLE")
})
.setColor(client.config.embed.color)
.setFooter({
text: client.config.embed.footer
});
embed.addFields([
{
name: interaction.translate("economy/achievements:SEND_CMD"),
value: interaction.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: interaction.translate("economy/achievements:CLAIM_SALARY"),
value: interaction.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: interaction.translate("economy/achievements:MARRY"),
value: interaction.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: interaction.translate("economy/achievements:SLOTS"),
value: interaction.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: interaction.translate("economy/achievements:TIP"),
value: interaction.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: interaction.translate("economy/achievements:REP"),
value: interaction.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: interaction.translate("economy/achievements:INVITE"),
value: interaction.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))
})
}
]);
interaction.reply({
embeds: [embed]
});
}
}
module.exports = Achievements;

92
commands/Economy/bank.js Normal file
View file

@ -0,0 +1,92 @@
const { SlashCommandBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Bank extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("bank")
.setDescription(client.translate("economy/bank:DESCRIPTION"))
.addStringOption(option => option.setName("option")
.setDescription(client.translate("economy/bank:OPTION"))
.setRequired(true)
.addChoices(
{ name: client.translate("economy/bank:DEPOSIT"), value: "deposit" },
{ name: client.translate("economy/bank:WITHDRAW"), value: "withdraw" }
))
.addStringOption(option => option.setName("credits")
.setDescription(client.translate("moderation/clear:OPTION"))
.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").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
const choice = interaction.options.getString("option");
if (choice === "deposit") {
const credits = interaction.options.getString("credits") === "all" ? data.memberData.money : interaction.options.getString("credits");
if (isNaN(credits) || credits < 1) return interaction.error("misc:OPTION_NAN_ALL");
if (data.memberData.money < credits) return interaction.error("economy/bank:NOT_ENOUGH_CREDIT", { money: `**${credits}** ${client.getNoun(credits, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}` });
const info = {
user: interaction.translate("economy/transactions:BANK"),
amount: credits,
date: Date.now(),
type: "send"
};
data.memberData.transactions.push(info);
data.memberData.money -= credits;
data.memberData.bankSold += credits;
await data.memberData.save();
interaction.success("economy/bank:SUCCESS_DEP", {
money: `**${credits}** ${client.getNoun(credits, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`
});
} else {
const credits = interaction.options.getString("credits") === "all" ? data.memberData.bankSold : interaction.options.getString("credits");
if (isNaN(credits) || credits < 1) return interaction.error("misc:OPTION_NAN_ALL");
if (data.memberData.bankSold < credits) return interaction.error("economy/bank:NOT_ENOUGH_BANK", { money: `**${credits}** ${client.getNoun(credits, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}` });
const info = {
user: interaction.translate("economy/transactions:BANK"),
amount: credits,
date: Date.now(),
type: "got"
};
data.memberData.transactions.push(info);
data.memberData.money += credits;
data.memberData.bankSold -= credits;
await data.memberData.save();
interaction.success("economy/bank:SUCCESS_WD", {
money: `**${credits}** ${client.getNoun(credits, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`
});
}
}
}
module.exports = Bank;

View file

@ -0,0 +1,57 @@
const { SlashCommandBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Birthdate extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("birthdate")
.setDescription(client.translate("economy/birthdate:DESCRIPTION"))
.addStringOption(option => option.setName("date")
.setDescription(client.translate("economy/birthdate:DATE"))
.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").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
const date = interaction.options.getString("date");
const match = date.match(/\d+/g);
if (!match) return interaction.error("economy/birthdate:INVALID_DATE");
const [day, month, year] = date.split("/");
if (!day || !month || !year) return interaction.error("economy/birthdate:INVALID_DATE");
const d = new Date(year, month - 1, day);
if (!(day == d.getDate() && month - 1 == d.getMonth() && year == d.getFullYear())) return interaction.error("economy/birthdate:INVALID_DATE");
if (d.getTime() > Date.now()) return interaction.error("economy/birthdate:DATE_TOO_HIGH");
if (d.getTime() < (Date.now() - 2.523e+12)) return interaction.error("economy/birthdate:DATE_TOO_LOW");
data.userData.birthdate = d;
await data.userData.save();
interaction.success("economy/birthdate:SUCCESS", {
date: client.printDate(d)
});
}
}
module.exports = Birthdate;

View file

@ -0,0 +1,58 @@
const { SlashCommandBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Divorce extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("divorce")
.setDescription(client.translate("economy/divorce:DESCRIPTION")),
aliases: [],
dirname: __dirname,
guildOnly: true,
ownerOnly: false
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
if (!data.userData.lover) return interaction.error("economy/divorce:NOT_MARRIED");
const user = client.users.cache.get(data.userData.lover) || await client.users.fetch(data.userData.lover);
data.userData.lover = null;
await data.userData.save();
const oldLover = await client.findOrCreateUser({
id: user.id
});
oldLover.lover = null;
await oldLover.save();
interaction.success("economy/divorce:DIVORCED", {
user: user.toString()
});
user.send({
content: interaction.translate("economy/divorce:DIVORCED_U", {
user: interaction.member.toString()
})
});
}
}
module.exports = Divorce;

View file

@ -0,0 +1,47 @@
const { SlashCommandBuilder } = require("discord.js"),
{ getUserXp } = require("mee6-levels-api");
const BaseCommand = require("../../base/BaseCommand");
class ImportMee6 extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("importmee6")
.setDescription(client.translate("economy/importmee6:DESCRIPTION")),
aliases: [],
dirname: __dirname,
guildOnly: true,
ownerOnly: false
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
const level = (await getUserXp(interaction.guildId, interaction.member.id)).level;
data.memberData.level = level;
await data.memberData.save();
interaction.success("owner/debug:SUCCESS_LEVEL", {
username: interaction.member.toString(),
amount: level
});
}
}
module.exports = ImportMee6;

156
commands/Economy/marry.js Normal file
View file

@ -0,0 +1,156 @@
const { SlashCommandBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand"),
pendings = {};
class Marry extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("marry")
.setDescription(client.translate("economy/marry:DESCRIPTION"))
.addUserOption(option => option.setName("user")
.setDescription(client.translate("common:USER"))
.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").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
if (data.userData.lover) return interaction.error("economy/marry:ALREADY_MARRIED");
const member = interaction.options.getMember("user");
if (member.user.bot) return interaction.error("economy/marry:BOT_USER");
if (member.id === interaction.member.id) return interaction.error("economy/marry:YOURSELF");
const userData = await client.findOrCreateUser({
id: member.id
});
if (userData.lover) return interaction.error("economy/marry:ALREADY_MARRIED_USER", { user: member.toString() });
for (const requester in pendings) {
const receiver = pendings[requester];
if (requester === interaction.author.id) {
const user = client.users.cache.get(receiver) || await client.users.fetch(receiver);
return interaction.error("economy/marry:REQUEST_AUTHOR_TO_AMEMBER", {
user: user.toString
});
} else if (receiver === interaction.member.id) {
const user = client.users.cache.get(requester) || await client.users.fetch(requester);
return interaction.error("economy/marry:REQUEST_AMEMBER_TO_AUTHOR", {
user: user.toString()
});
} else if (requester === member.id) {
const user = client.users.cache.get(receiver) || await client.users.fetch(receiver);
return interaction.error("economy/marry:REQUEST_AMEMBER_TO_MEMBER", {
firstUser: member.toString(),
secondUser: user.toString()
});
} else if (receiver === member.id) {
const user = client.users.cache.get(requester) || await client.users.fetch(requester);
return interaction.error("economy/marry:REQUEST_MEMBER_TO_AMEMBER", {
firstUser: member.toString(),
secondUser: user.toString()
});
}
}
pendings[interaction.member.id] = member.id;
const row = new ActionRowBuilder()
.addComponents(
new ButtonBuilder()
.setCustomId("marry_confirm_yes")
.setLabel(interaction.translate("common:ACCEPT"))
.setStyle(ButtonStyle.Danger),
new ButtonBuilder()
.setCustomId("marry_confirm_no")
.setLabel(interaction.translate("common:CANCEL"))
.setStyle(ButtonStyle.Secondary),
);
await interaction.reply({
content: interaction.translate("economy/marry:REQUEST", {
to: member.toString(),
from: interaction.member.toString()
}),
components: [row]
});
const filter = i => i.user.id === member.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, time: 120000 });
collector.on("collect", async i => {
if (i.isButton()) {
if (i.customId === "marry_confirm_yes") return collector.stop(true);
else if (i.customId === "marry_confirm_no") return collector.stop(false);
}
});
collector.on("end", async (_, reason) => {
delete pendings[interaction.member.id];
if (reason === "time") return interaction.error("economy/marry:TIMEOUT");
if (reason) {
data.userData.lover = member.id;
await data.userData.save();
userData.lover = interaction.member.id;
await userData.save();
const messageOptions = {
content: `${member.toString()} :heart: ${interaction.member.toString()}`,
files: [{
name: "achievement_unlocked3.png",
attachment: "./assets/img/achievements/achievement_unlocked3.png"
}]
};
let sent = false;
if (!userData.achievements.married.achieved) {
interaction.followUp(messageOptions);
sent = true;
userData.achievements.married.achieved = true;
userData.achievements.married.progress.now = 1;
userData.markModified("achievements.married");
await userData.save();
}
if (!data.userData.achievements.married.achieved) {
if (!sent) interaction.followUp(messageOptions);
data.userData.achievements.married.achieved = true;
data.userData.achievements.married.progress.now = 1;
data.userData.markModified("achievements.married");
await data.userData.save();
}
return interaction.success("economy/marry:SUCCESS", {
creator: interaction.member.toString(),
partner: member.toString()
});
} else {
return interaction.success("economy/marry:DENIED", {
creator: interaction.member.toString(),
partner: member.toString()
});
}
});
}
}
module.exports = Marry;

96
commands/Economy/money.js Normal file
View file

@ -0,0 +1,96 @@
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
const asyncForEach = async (collection, callback) => {
const allPromises = collection.map(async key => {
await callback(key);
});
return await Promise.all(allPromises);
};
class Money extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("money")
.setDescription(client.translate("economy/money:DESCRIPTION"))
.addUserOption(option => option.setName("user")
.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").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
await interaction.deferReply();
const member = interaction.options.getMember("user") || interaction.member;
if (member.user.bot) return interaction.error("economy/money:BOT_USER");
const memberData = (member.id === interaction.user.id) ? data.memberData : await client.findOrCreateMember({
id: member.id,
guildID: interaction.guildId
});
const guilds = client.guilds.cache.filter(g => g.members.cache.find(m => m.id === member.id));
let globalMoney = 0;
await asyncForEach(guilds, async guild => {
const data = await client.findOrCreateMember({
id: member.id,
guildID: guild.id
});
globalMoney += data.money + data.bankSold;
});
const embed = new EmbedBuilder()
.setAuthor({
name: interaction.translate("economy/money:TITLE", {
username: member.user.tag
}),
iconURL: member.user.displayAvatarURL()
})
.addFields([
{
name: interaction.translate("economy/profile:CASH"),
value: `**${memberData.money}** ${client.getNoun(memberData.money, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`,
inline: true
},
{
name: interaction.translate("economy/profile:BANK"),
value: `**${memberData.bankSold}** ${client.getNoun(memberData.bankSold, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`,
inline: true
},
{
name: interaction.translate("economy/profile:GLOBAL"),
value: `**${globalMoney}** ${client.getNoun(globalMoney, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`,
inline: true
}
])
.setColor(client.config.embed.color)
.setFooter({
text: client.config.embed.footer
});
interaction.editReply({
embeds: [embed]
});
}
}
module.exports = Money;

116
commands/Economy/number.js Normal file
View file

@ -0,0 +1,116 @@
const { SlashCommandBuilder, MessageCollector } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand"),
currentGames = {};
class Number extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("number")
.setDescription(client.translate("economy/number:DESCRIPTION")),
aliases: [],
dirname: __dirname,
guildOnly: true,
ownerOnly: false
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
if (currentGames[interaction.guildId]) return interaction.error("economy/number:GAME_RUNNING");
const participants = [],
number = client.functions.randomNum(1000, 5000);
await interaction.replyT("economy/number:GAME_START");
const gameCreatedAt = Date.now();
const filter = m => !m.author.bot;
const collector = new MessageCollector(interaction.channel, {
filter,
time: (5 * 60 * 1000)
});
currentGames[interaction.guildId] = true;
collector.on("collect", async msg => {
if (!participants.includes(msg.author.id)) participants.push(msg.author.id);
if (msg.content === "STOP") return collector.stop("force");
if (isNaN(msg.content)) return;
const parsedNumber = parseInt(msg.content, 10);
if (parsedNumber === number) {
const time = client.convertTime(gameCreatedAt, false, false, data.guildData.language);
interaction.channel.send({
content: interaction.translate("economy/number:GAME_STATS", {
winner: msg.author.toString(),
number,
time,
participantCount: participants.length,
participants: participants.map(p => `<@${p}>`).join(", ")
})
});
if (participants.length > 1) {
const won = 100 * (participants.length * 0.5);
interaction.channel.send({
content: interaction.translate("economy/number:WON", {
winner: msg.author.username,
credits: `**${won}** ${client.getNoun(won, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`
})
});
const memberData = await client.findOrCreateMember({
id: msg.author.id,
guildID: interaction.guildId
});
const info = {
user: interaction.translate("economy/transactions:NUMBERS"),
amount: won,
date: Date.now(),
type: "got"
};
data.memberData.transactions.push(info);
memberData.money += won;
await memberData.save();
}
collector.stop();
}
if (parseInt(msg.content) < number) msg.reply({
content: interaction.translate("economy/number:TOO_BIG", { user: msg.author.toString(), number: parsedNumber })
});
if (parseInt(msg.content) > number) msg.reply({
content: interaction.translate("economy/number:TOO_SMALL", { user: msg.author.toString(), number: parsedNumber })
});
});
collector.on("end", (_collected, reason) => {
delete currentGames[interaction.guildId];
if (reason === "time") return interaction.editReply({ content: interaction.translate("economy/number:DEFEAT", { number }) });
else if (reason === "force") return interaction.editReply({ content: interaction.translate("misc:FORCE_STOP", { user: interaction.member.toString() }) });
});
}
}
module.exports = Number;

77
commands/Economy/pay.js Normal file
View file

@ -0,0 +1,77 @@
const { SlashCommandBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Pay extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("pay")
.setDescription(client.translate("economy/pay:DESCRIPTION"))
.addUserOption(option => option.setName("user")
.setDescription(client.translate("common:USER"))
.setRequired(true))
.addIntegerOption(option => option.setName("amount")
.setDescription(client.translate("common:INT"))
.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").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
const member = interaction.options.getMember("user");
if (member.user.bot) return interaction.error("economy/pay:BOT_USER");
if (member.id === interaction.member.id) return interaction.error("economy/pay:YOURSELF");
const amount = interaction.options.getInteger("amount");
if (amount <= 0) return interaction.error("misc:MORE_THAN_ZERO");
if (amount > data.memberData.money) return interaction.error("economy/pay:ENOUGH_MONEY", {
amount: `**${amount}** ${client.getNoun(amount, interaction.translate("misc:NOUNS:CREDITS:1"), interaction.translate("misc:NOUNS:CREDITS:2"), interaction.translate("misc:NOUNS:CREDITS:5"))}`
});
const memberData = await client.findOrCreateMember({
id: member.id,
guildID: interaction.guildId
});
const info = {
user: member.user.tag,
amount: amount,
date: Date.now(),
type: "send"
};
data.memberData.transactions.push(info);
data.memberData.money -= amount;
await data.memberData.save();
memberData.money += amount;
memberData.save();
interaction.success("economy/pay:SUCCESS", {
user: member.toString(),
amount: `**${amount}** ${client.getNoun(amount, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`
});
}
}
module.exports = Pay;

151
commands/Economy/profile.js Normal file
View file

@ -0,0 +1,151 @@
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
const asyncForEach = async (collection, callback) => {
const allPromises = collection.map(async key => {
await callback(key);
});
return await Promise.all(allPromises);
};
class Profile extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("profile")
.setDescription(client.translate("economy/profile:DESCRIPTION"))
.addUserOption(option => option.setName("user")
.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").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
await interaction.deferReply();
const member = interaction.options.getMember("user") || interaction.member;
if (member.user.bot) return interaction.error("economy/profile:BOT_USER");
const memberData = (member.id === interaction.user.id ? data.memberData : await client.findOrCreateMember({
id: member.id,
guildID: interaction.guildId
}));
const userData = (member.id === interaction.user.id ? data.userData : await client.findOrCreateUser({
id: member.id
}));
if (userData.lover && !client.users.cache.find(u => u.id === userData.lover)) await client.users.fetch(userData.lover, true);
const guilds = client.guilds.cache.filter(g => g.members.cache.find(m => m.id === member.id));
let globalMoney = 0;
await asyncForEach(guilds, async guild => {
const data = await client.findOrCreateMember({
id: member.id,
guildID: guild.id
});
globalMoney += data.money + data.bankSold;
});
const profileEmbed = new EmbedBuilder()
.setAuthor({
name: interaction.translate("economy/profile:TITLE", {
username: member.user.tag
}),
iconURL: member.displayAvatarURL()
})
.setImage("attachment://achievements.png")
.addFields([
{
name: client.customEmojis.link + " " + interaction.translate("economy/profile:LINK"),
value: `[${interaction.translate("economy/profile:LINK_TEXT")}](${client.config.dashboard.baseURL}/user/${member.user.id}/${interaction.guild.id})`
},
{
name: interaction.translate("economy/profile:BIO"),
value: userData.bio ? userData.bio : interaction.translate("common:UNKNOWN")
},
{
name: interaction.translate("economy/profile:CASH"),
value: `**${memberData.money}** ${client.getNoun(memberData.money, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`,
inline: true
},
{
name: interaction.translate("economy/profile:BANK"),
value: `**${memberData.bankSold}** ${client.getNoun(memberData.bankSold, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`,
inline: true
},
{
name: interaction.translate("economy/profile:GLOBAL"),
value: `**${globalMoney}** ${client.getNoun(globalMoney, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`,
inline: true
},
{
name: interaction.translate("economy/profile:REPUTATION"),
value: `**${userData.rep}** ${client.getNoun(userData.rep, interaction.translate("misc:NOUNS:POINTS:1"), interaction.translate("misc:NOUNS:POINTS:2"), interaction.translate("misc:NOUNS:POINTS:5"))}`,
inline: true
},
{
name: interaction.translate("economy/profile:LEVEL"),
value:`**${memberData.level}**`,
inline: true
},
{
name: interaction.translate("economy/profile:XP"),
value: `**${memberData.exp}/${5 * (memberData.level * memberData.level) + 80 * memberData.level + 100}** xp`,
inline: true
},
{
name: interaction.translate("economy/profile:REGISTERED"),
value: client.printDate(new Date(memberData.registeredAt)),
inline: true
},
{
name: interaction.translate("economy/profile:BIRTHDATE"),
value: (!userData.birthdate ? interaction.translate("common:NOT_DEFINED") : client.printDate(new Date(userData.birthdate))),
inline: true
},
{
name: interaction.translate("economy/profile:LOVER"),
value: (!userData.lover ? interaction.translate("common:NOT_DEFINED") : client.users.cache.get(userData.lover).tag),
inline: true
},
{
name: interaction.translate("economy/profile:ACHIEVEMENTS"),
value: interaction.translate("economy/profile:ACHIEVEMENTS_CONTENT")
}
])
.setColor(client.config.embed.color)
.setFooter({
text: client.config.embed.footer
})
.setTimestamp();
const buffer = await userData.getAchievements();
interaction.editReply({
embeds: [profileEmbed],
files: [{
name: "achievements.png",
attachment: buffer
}]
});
}
}
module.exports = Profile;

81
commands/Economy/rep.js Normal file
View file

@ -0,0 +1,81 @@
const { SlashCommandBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Rep extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("rep")
.setDescription(client.translate("economy/rep:DESCRIPTION"))
.addUserOption(option => option.setName("user")
.setDescription(client.translate("common:USER"))
.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").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
const isInCooldown = data.userData.cooldowns?.rep;
if (isInCooldown) {
if (isInCooldown > Date.now()) return interaction.error("economy/rep:COOLDOWN", {
time: client.convertTime(isInCooldown, true, true)
});
}
const user = interaction.options.getUser("user");
if (user.bot) return interaction.error("economy/rep:BOT_USER");
if (user.id === interaction.user.id) return interaction.error("economy/rep:YOURSELF");
const toWait = Date.now() + 21600000; // 12 hours
if (!data.userData.cooldowns) data.userData.cooldowns = {};
data.userData.cooldowns.rep = toWait;
data.userData.markModified("cooldowns");
await data.userData.save();
const userData = await client.findOrCreateUser({
id: user.id
});
userData.rep++;
if (!userData.achievements.rep.achieved) {
userData.achievements.rep.progress.now = (userData.rep > userData.achievements.rep.progress.total ? userData.achievements.rep.progress.total : userData.rep);
if (userData.achievements.rep.progress.now >= userData.achievements.rep.progress.total) {
userData.achievements.rep.achieved = true;
interaction.followUp({
content: `${user}`,
files: [{
name: "achievement_unlocked6.png",
attachment: "./assets/img/achievements/achievement_unlocked6.png"
}]
});
}
userData.markModified("achievements.rep");
}
await userData.save();
interaction.success("economy/rep:SUCCESS", {
user: user.toString()
});
}
}
module.exports = Rep;

94
commands/Economy/rob.js Normal file
View file

@ -0,0 +1,94 @@
const { SlashCommandBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Rob extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("rob")
.setDescription(client.translate("economy/rob:DESCRIPTION"))
.addUserOption(option => option.setName("user")
.setDescription(client.translate("common:USER"))
.setRequired(true))
.addIntegerOption(option => option.setName("amount")
.setDescription(client.translate("common:INT"))
.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").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
const member = interaction.options.getMember("user");
if (member.user.bot) return interaction.error("economy/pay:BOT_USER");
if (member.id === interaction.member.id) return interaction.error("economy/rob:YOURSELF");
const amount = interaction.options.getInteger("amount");
if (amount <= 0) return interaction.error("misc:MORE_THAN_ZERO");
const memberData = await client.findOrCreateMember({
id: member.id,
guildID: interaction.guildId
});
if (amount > memberData.money) return interaction.error("economy/rob:NOT_ENOUGH_MEMBER", { user: member.toString() });
const isInCooldown = memberData.cooldowns.rob || 0;
if (isInCooldown) {
if (isInCooldown > Date.now()) return interaction.error("economy/rob:COOLDOWN", { user: member.toString() });
}
const potentiallyLose = Math.floor(amount * 1.5);
if (potentiallyLose > data.memberData.money) return interaction.error("economy/rob:NOT_ENOUGH_AUTHOR", {
moneyMin: `**${potentiallyLose}** ${client.getNoun(potentiallyLose, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`,
moneyCurrent: `**${data.memberData.money}** ${client.getNoun(data.memberData.money, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`
});
const itsAWon = Math.floor(client.functions.randomNum(0, 100) < 25);
if (itsAWon) {
const toWait = Date.now() + (6 * 60 * 60 * 1000);
memberData.cooldowns.rob = toWait;
memberData.markModified("cooldowns");
await memberData.save();
const randomNum = client.functions.randomNum(1, 2);
interaction.replyT("economy/rob:ROB_WON_" + randomNum, {
money: `**${amount}** ${client.getNoun(amount, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`,
user: member.toString()
});
data.memberData.money += amount;
memberData.money -= amount;
await memberData.save();
await data.memberData.save();
} else {
const won = Math.floor(amount * 0.9);
const randomNum = client.functions.randomNum(1, 2);
interaction.replyT("economy/rob:ROB_LOSE_" + randomNum, {
fine: `**${potentiallyLose}** ${client.getNoun(potentiallyLose, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`,
offset: `**${won}** ${client.getNoun(won, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`,
user: member.toString()
});
data.memberData.money -= potentiallyLose;
memberData.money += won;
await memberData.save();
await data.memberData.save();
}
}
}
module.exports = Rob;

View file

@ -0,0 +1,46 @@
const { SlashCommandBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Setbio extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("setbio")
.setDescription(client.translate("economy/setbio:DESCRIPTION"))
.addStringOption(option => option.setName("text")
.setDescription(client.translate("economy/profile:BIO"))
.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").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
const newBio = interaction.options.getString("text");
if (newBio.length > 150) return interaction.error("economy/setbio:MAX_CHARACTERS");
data.userData.bio = newBio;
await data.userData.save();
interaction.success("economy/setbio:SUCCESS");
}
}
module.exports = Setbio;

View file

@ -1,42 +1,55 @@
const Command = require("../../base/Command");
const { SlashCommandBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Slots extends Command {
class Slots extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super(client, {
name: "slots",
super({
command: new SlashCommandBuilder()
.setName("slots")
.setDescription(client.translate("economy/slots:DESCRIPTION"))
.addIntegerOption(option => option.setName("amount")
.setDescription(client.translate("common:INT"))
.setRequired(true)),
aliases: [],
dirname: __dirname,
enabled: true,
guildOnly: true,
aliases: ["casino", "slot"],
memberPermissions: [],
botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"],
nsfw: false,
ownerOnly: false,
cooldown: 2000
ownerOnly: false
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
await interaction.deferReply();
const amount = interaction.options.getInteger("amount");
if (amount > data.memberData.money) return interaction.error("economy/slots:NOT_ENOUGH", { money: `**${amount}** ${client.getNoun(amount, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}` });
async run(message, args, data) {
const fruits = ["🍎", "🍐", "🍌", "🍇", "🍉", "🍒", "🍓"];
let i1 = 0, j1 = 0, k1 = 0,
i2 = 1, j2 = 1, k2 = 1,
i3 = 2, j3 = 2, k3 = 2;
// Gets three random fruits array
const colonnes = [
this.client.functions.shuffle(fruits),
this.client.functions.shuffle(fruits),
this.client.functions.shuffle(fruits)
client.functions.shuffle(fruits),
client.functions.shuffle(fruits),
client.functions.shuffle(fruits)
];
// Gets the amount provided
let amount = args[0];
if (!amount || isNaN(amount) || amount < 1) amount = 50;
if (amount > data.memberData.money) return message.error("economy/slots:NOT_ENOUGH", { money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` });
amount = Math.round(amount);
function getCredits(number, isJackpot) {
if (!isJackpot) number = number * 1.5;
else if (isJackpot) number = number * 5;
@ -44,16 +57,13 @@ class Slots extends Command {
return Math.round(number);
}
const tmsg = await message.sendT("misc:PLEASE_WAIT", null, {
prefixEmoji: "loading"
});
editMsg();
const interval = setInterval(editMsg, 1000);
setTimeout(() => {
clearInterval(interval);
end(tmsg);
end();
}, 4000);
async function end() {
@ -74,34 +84,36 @@ class Slots extends Command {
msg += colonnes[0][i3] + " : " + colonnes[1][j3] + " : " + colonnes[2][k3] + "\n------------------\n";
if ((colonnes[0][i2] == colonnes[1][j2]) && (colonnes[1][j2] == colonnes[2][k2])) {
msg += "| : : : **" + (message.translate("common:VICTORY").toUpperCase()) + "** : : : |";
tmsg.edit(msg);
msg += "| : : : **" + (interaction.translate("common:VICTORY").toUpperCase()) + "** : : : |";
await interaction.editReply({
content: msg
});
const credits = getCredits(amount, true);
message.channel.send({
content: "**!! ДЖЕКПОТ !!**\n" + message.translate("economy/slots:VICTORY", {
money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`,
won: `**${credits}** ${message.getNoun(credits, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`,
username: message.author.username
interaction.followUp({
content: "**!! ДЖЕКПОТ !!**\n" + interaction.translate("economy/slots:VICTORY", {
money: `**${amount}** ${client.getNoun(amount, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`,
won: `**${credits}** ${client.getNoun(credits, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`,
user: interaction.member.toString()
})
});
const toAdd = credits - amount;
const info = {
user: message.translate("economy/slots:DESCRIPTION"),
user: interaction.translate("economy/slots:DESCRIPTION"),
amount: toAdd,
date: Date.now(),
type: "got"
};
data.memberData.transactions.push(info);
data.memberData.money += toAdd;
data.memberData.money = data.memberData.money + toAdd;
if (!data.userData.achievements.slots.achieved) {
data.userData.achievements.slots.progress.now += 1;
if (data.userData.achievements.slots.progress.now === data.userData.achievements.slots.progress.total) {
data.userData.achievements.slots.achieved = true;
message.reply({
interaction.followUp({
files: [{
name: "achievement_unlocked4.png",
attachment: "./assets/img/achievements/achievement_unlocked4.png"
@ -116,33 +128,35 @@ class Slots extends Command {
}
if (colonnes[0][i2] == colonnes[1][j2] || colonnes[1][j2] == colonnes[2][k2] || colonnes[0][i2] == colonnes[2][k2]) {
msg += "| : : : **" + (message.translate("common:VICTORY").toUpperCase()) + "** : : : |";
tmsg.edit(msg);
msg += "| : : : **" + (interaction.translate("common:VICTORY").toUpperCase()) + "** : : : |";
await interaction.editReply({
content: msg
});
const credits = getCredits(amount, false);
message.channel.send({
content: message.translate("economy/slots:VICTORY", {
money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`,
won: `**${credits}** ${message.getNoun(credits, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`,
username: message.author.username
interaction.followUp({
content: interaction.translate("economy/slots:VICTORY", {
money: `**${amount}** ${client.getNoun(amount, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`,
won: `**${credits}** ${client.getNoun(credits, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`,
user: interaction.member.toString()
})
});
const toAdd = credits - amount;
const info = {
user: message.translate("economy/slots:DESCRIPTION"),
user: interaction.translate("economy/slots:DESCRIPTION"),
amount: toAdd,
date: Date.now(),
type: "got"
};
data.memberData.transactions.push(info);
data.memberData.money += toAdd;
data.memberData.money = data.memberData.money + toAdd;
if (!data.userData.achievements.slots.achieved) {
data.userData.achievements.slots.progress.now += 1;
if (data.userData.achievements.slots.progress.now === data.userData.achievements.slots.progress.total) {
data.userData.achievements.slots.achieved = true;
message.reply({
interaction.followUp({
files: [{
name: "achievement_unlocked4.png",
attachment: "./assets/img/achievements/achievement_unlocked4.png"
@ -156,24 +170,23 @@ class Slots extends Command {
return;
}
msg += "| : : : **" + (message.translate("common:DEFEAT").toUpperCase()) + "** : : : |";
message.channel.send({
content: message.translate("economy/slots:DEFEAT", {
money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`,
username: message.author.username
msg += "| : : : **" + (interaction.translate("common:DEFEAT").toUpperCase()) + "** : : : |";
interaction.followUp({
content: interaction.translate("economy/slots:DEFEAT", {
money: `**${amount}** ${client.getNoun(amount, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`,
user: interaction.member.toString()
})
});
const info = {
user: message.translate("economy/slots:DESCRIPTION"),
user: interaction.translate("economy/slots:DESCRIPTION"),
amount: amount,
date: Date.now(),
type: "send"
};
data.memberData.transactions.push(info);
data.memberData.money -= amount;
data.memberData.money = data.memberData.money - amount;
if (!data.userData.achievements.slots.achieved) {
data.userData.achievements.slots.progress.now = 0;
data.userData.markModified("achievements.slots");
@ -183,7 +196,7 @@ class Slots extends Command {
return;
}
function editMsg() {
async function editMsg() {
let msg = "[ :slot_machine: | **СЛОТЫ** ]\n------------------\n";
i1 = (i1 < fruits.length - 1) ? i1 + 1 : 0;
@ -200,7 +213,9 @@ class Slots extends Command {
msg += colonnes[0][i2] + " : " + colonnes[1][j2] + " : " + colonnes[2][k2] + " **<**\n";
msg += colonnes[0][i3] + " : " + colonnes[1][j3] + " : " + colonnes[2][k3] + "\n";
tmsg.edit(msg);
await interaction.editReply({
content: msg
});
}
}
}

View file

@ -0,0 +1,62 @@
const { SlashCommandBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand"),
tictactoe = require("../../helpers/tictactoe");
class TicTacToe extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("tictactoe")
.setDescription(client.translate("economy/tictactoe:DESCRIPTION"))
.addUserOption(option => option.setName("user")
.setDescription(client.translate("common:USER"))
.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").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction) {
tictactoe(interaction, {
resultBtn: true,
embedColor: client.config.embed.color,
embedFoot: client.config.embed.footer
}).then(async winner => {
const memberData = await client.findOrCreateMember({
id: winner.id,
guildID: interaction.guildId
});
const info = {
user: interaction.translate("economy/transactions:TTT"),
amount: 100,
date: Date.now(),
type: "got"
};
memberData.transactions.push(info);
memberData.money += 100;
await memberData.save();
});
}
}
module.exports = TicTacToe;

View file

@ -0,0 +1,77 @@
const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Transactions extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("transactions")
.setDescription(client.translate("economy/transactions:DESCRIPTION")),
aliases: [],
dirname: __dirname,
guildOnly: true,
ownerOnly: false
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
const embed = new EmbedBuilder()
.setAuthor({
name: interaction.translate("economy/transactions:EMBED_TRANSACTIONS"),
iconURL: interaction.member.displayAvatarURL()
})
.setColor(client.config.embed.color)
.setFooter({
text: client.config.embed.footer
});
const transactions = data.memberData.transactions,
sortedTransactions = [ [], [] ];
transactions.slice(-20).forEach(t => {
const array = t.type === "got" ? sortedTransactions[0] : sortedTransactions[1];
array.push(`${interaction.translate("economy/transactions:T_USER_" + t.type.toUpperCase())}: ${t.user}\n${interaction.translate("economy/transactions:T_AMOUNT")}: ${t.amount}\n${interaction.translate("economy/transactions:T_DATE")}: ${client.printDate(t.date, "Do MMMM YYYY, HH:mm", data.guildData.language)}\n`);
});
if (transactions.length < 1) {
embed.setDescription(interaction.translate("economy/transactions:NO_TRANSACTIONS"));
} else {
if (sortedTransactions[0].length > 0) embed.addFields([
{
name: interaction.translate("economy/transactions:T_GOT"),
value: sortedTransactions[0].join("\n"),
inline: true
}
]);
if (sortedTransactions[1].length > 0) embed.addFields([
{
name: interaction.translate("economy/transactions:T_SEND"),
value: sortedTransactions[1].join("\n"),
inline: true
}
]);
}
interaction.reply({
embeds: [embed]
});
}
}
module.exports = Transactions;

132
commands/Economy/work.js Normal file
View file

@ -0,0 +1,132 @@
const { SlashCommandBuilder, EmbedBuilder, parseEmoji } = require("discord.js");
const BaseCommand = require("../../base/BaseCommand");
class Work extends BaseCommand {
/**
*
* @param {import("../base/JaBa")} client
*/
constructor(client) {
super({
command: new SlashCommandBuilder()
.setName("work")
.setDescription(client.translate("economy/work:DESCRIPTION")),
aliases: [],
dirname: __dirname,
guildOnly: true,
ownerOnly: false
});
}
/**
*
* @param {import("../../base/JaBa")} client
*/
async onLoad() {
//...
}
/**
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Object} data
*/
async execute(client, interaction, data) {
const isInCooldown = data.memberData.cooldowns?.work;
if (isInCooldown) {
if (isInCooldown > Date.now()) return interaction.error("economy/work:COOLDOWN", {
time: client.convertTime(isInCooldown, true, true)
});
}
if (Date.now() > data.memberData.cooldowns.work + (24 * 3600000)) data.memberData.workStreak = 0;
const toWait = Date.now() + 43200000; // 24 hours
data.memberData.cooldowns.work = toWait;
data.memberData.markModified("cooldowns");
data.memberData.workStreak = (data.memberData.workStreak || 0) + 1;
await data.memberData.save();
const embed = new EmbedBuilder()
.setFooter({
text: interaction.translate("economy/work:AWARD"),
iconURL: interaction.member.displayAvatarURL()
})
.setColor(client.config.embed.color);
const award = [
client.customEmojis.letters.a,
client.customEmojis.letters.w,
client.customEmojis.letters.a,
client.customEmojis.letters.r,
client.customEmojis.letters.d
];
let won = 200;
if (data.memberData.workStreak >= 5) {
won += 200;
embed.addFields([
{
name: interaction.translate("economy/work:SALARY"),
value: interaction.translate("economy/work:SALARY_CONTENT", {
won: `**${won}** ${client.getNoun(won, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`
})
},
{
name: interaction.translate("economy/work:STREAK"),
value: interaction.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 = parseEmoji(award[i]).name.split("_")[1];
award[i] = `:regional_indicator_${letter.toLowerCase()}:`;
}
}
embed.addFields([
{
name: interaction.translate("economy/work:SALARY"),
value: interaction.translate("economy/work:SALARY_CONTENT", {
won: `**${won}** ${client.getNoun(won, interaction.translate("misc:NOUNS:CREDIT:1"), interaction.translate("misc:NOUNS:CREDIT:2"), interaction.translate("misc:NOUNS:CREDIT:5"))}`
})
},
{
name: interaction.translate("economy/work:STREAK"),
value: award.join("")
}
]);
}
const info = {
user: interaction.translate("economy/work:SALARY"),
amount: won,
date: Date.now(),
type: "got"
};
data.memberData.transactions.push(info);
data.memberData.money += won;
await data.memberData.save();
const messageOptions = {
embeds: [embed]
};
if (!data.userData.achievements.work.achieved) {
data.userData.achievements.work.progress.now += 1;
if (data.userData.achievements.work.progress.now === data.userData.achievements.work.progress.total) {
messageOptions.files = [{
name: "unlocked.png",
attachment: "./assets/img/achievements/achievement_unlocked1.png"
}];
data.userData.achievements.work.achieved = true;
}
data.userData.markModified("achievements.work");
await data.userData.save();
}
interaction.reply(messageOptions);
}
}
module.exports = Work;

View file

@ -32,7 +32,7 @@ class Eightball extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply();

View file

@ -32,7 +32,7 @@ class LMGTFY extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const question = interaction.options.getString("question").replace(/[' '_]/g, "+");

View file

@ -36,7 +36,7 @@ class Lovecalc extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const firstMember = interaction.options.getMember("first_member");

View file

@ -29,7 +29,7 @@ class Memes extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const tags = ["memes", "dankmemes", "me_irl", "wholesomememes"].map(tag =>

View file

@ -29,7 +29,7 @@ class Activity extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const voice = interaction.member.voice.channel;
@ -74,7 +74,7 @@ class Activity extends BaseCommand {
const embed = new EmbedBuilder()
.setTitle(activity)
.setColor(client.config.embed.color)
.setDescription(`**[${interaction.translate("misc:CLICK_HERE", { activity: defaultApplications.find(a => a.id === activity).name, channel: voice.name })}](${invite.code})**`)
.setDescription(`**[${interaction.translate("general/activity:CLICK_HERE", { activity: defaultApplications.find(a => a.id === activity).name, channel: voice.name })}](${invite.code})**`)
.setFooter({
text: client.config.embed.footer
})

View file

@ -31,7 +31,7 @@ class Afk extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction, data) {
const reason = interaction.options.getString("message");

View file

@ -30,7 +30,7 @@ class Avatar extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const user = interaction.options.getUser("user") || interaction.user;

View file

@ -31,7 +31,7 @@ class Emoji extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const rawEmoji = interaction.options.getString("emoji");
@ -49,7 +49,7 @@ class Emoji extends BaseCommand {
})
.addFields([
{
name: interaction.translate("general/emoji:NAME"),
name: interaction.translate("common:NAME"),
value: parsedEmoji.name
},
{

View file

@ -31,7 +31,7 @@ class Help extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const commands = [...new Map(client.commands.map(v => [v.constructor.name, v])).values()];

View file

@ -32,7 +32,7 @@ class Minecraft extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply();

View file

@ -28,7 +28,7 @@ class Ping extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
interaction.replyT("general/ping:CONTENT", {

View file

@ -35,7 +35,7 @@ class Remindme extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction, data) {
const time = interaction.options.getString("time");

View file

@ -34,7 +34,7 @@ class Report extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const repChannel = interaction.guild.channels.cache.get(interaction.guild.data.plugins.reports);

View file

@ -28,7 +28,7 @@ class Serverinfo extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const guild = interaction.guild;

View file

@ -32,7 +32,7 @@ class Shorturl extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const url = interaction.options.getString("url");

View file

@ -28,7 +28,7 @@ class Staff extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.guild.members.fetch();

View file

@ -29,7 +29,7 @@ class Stats extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const hiddenGuild = await client.guilds.fetch("568120814776614924");

View file

@ -31,7 +31,7 @@ class Suggest extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const suggChannel = interaction.guild.channels.cache.get(interaction.guild.data.plugins.suggestions);
@ -43,9 +43,7 @@ class Suggest extends BaseCommand {
name: interaction.translate("general/suggest:TITLE", {
user: interaction.user.tag
}),
iconURL: interaction.member.displayAvatarURL({
size: 512
})
iconURL: interaction.member.displayAvatarURL()
})
.addFields([
{

View file

@ -30,16 +30,14 @@ class Userinfo extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const member = interaction.options.getMember("user") || interaction.member;
const embed = new EmbedBuilder()
.setAuthor({
name: `${member.user.tag} (${member.id})`,
iconURL: member.displayAvatarURL({
size: 512
})
iconURL: member.displayAvatarURL()
})
.setThumbnail(member.displayAvatarURL({
size: 512
@ -71,7 +69,7 @@ class Userinfo extends BaseCommand {
inline: true
},
{
name: client.customEmojis.calendar2 + " " + interaction.translate("common:JOIN"),
name: client.customEmojis.calendar2 + " " + interaction.translate("common:JOINED"),
value: client.printDate(member.joinedAt),
inline: true
},

View file

@ -32,7 +32,7 @@ class Whois extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply();

View file

@ -33,7 +33,7 @@ class Clear extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const option = interaction.options.getString("option");
@ -84,7 +84,7 @@ class Clear extends BaseCommand {
}
});
} else {
if (isNaN(option) || parseInt(option) < 1) return interaction.error("moderation/clear:OPTION_NAN", null, { ephemeral: true });
if (isNaN(option) || parseInt(option) < 1) return interaction.error("misc:OPTION_NAN_ALL", null, { ephemeral: true });
let messages = await interaction.channel.messages.fetch({
limit: option
});
@ -95,12 +95,12 @@ class Clear extends BaseCommand {
if (member) {
interaction.replyT("moderation/clear:CLEARED_MEMBER", {
amount: `${option} ${client.getNoun(option, interaction.translate("misc:NOUNS:MESSAGES:1"), interaction.translate("misc:NOUNS:MESSAGES:2"), interaction.translate("misc:NOUNS:MESSAGES:5"))}`,
amount: `**${option}** ${client.getNoun(option, interaction.translate("misc:NOUNS:MESSAGES:1"), interaction.translate("misc:NOUNS:MESSAGES:2"), interaction.translate("misc:NOUNS:MESSAGES:5"))}`,
username: member.user.tag
}, { ephemeral: true });
} else {
interaction.replyT("moderation/clear:CLEARED", {
amount: `${option} ${client.getNoun(option, interaction.translate("misc:NOUNS:MESSAGES:1"), interaction.translate("misc:NOUNS:MESSAGES:2"), interaction.translate("misc:NOUNS:MESSAGES:5"))}`
amount: `**${option}** ${client.getNoun(option, interaction.translate("misc:NOUNS:MESSAGES:1"), interaction.translate("misc:NOUNS:MESSAGES:2"), interaction.translate("misc:NOUNS:MESSAGES:5"))}`
}, { ephemeral: true });
}
}

View file

@ -31,7 +31,7 @@ class Clearwarns extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const member = interaction.options.getMember("user");

View file

@ -39,7 +39,7 @@ class Giveaway extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const options = ["create", "reroll", "delete", "end"].map(tag =>

View file

@ -31,7 +31,7 @@ class Poll extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const question = interaction.options.getString("question");
@ -40,11 +40,11 @@ class Poll extends BaseCommand {
.addComponents(
new ButtonBuilder()
.setCustomId("poll_everyone")
.setLabel(interaction.translate("moderation/poll:EVERYONE"))
.setLabel("@everyone")
.setStyle(ButtonStyle.Primary),
new ButtonBuilder()
.setCustomId("poll_here")
.setLabel(interaction.translate("moderation/poll:HERE"))
.setLabel("@here")
.setStyle(ButtonStyle.Primary),
new ButtonBuilder()
.setCustomId("poll_nothing")
@ -70,13 +70,13 @@ class Poll extends BaseCommand {
collector.on("collect", async i => {
if (i.isButton()) {
if (i.customId === "poll_everyone") {
mention = "@everyone";
mention = "||@everyone||";
i.update({
content: interaction.translate("moderation/poll:POLL_SENDED"),
components: []
});
} else if (i.customId === "poll_here") {
mention = "@here";
mention = "||@here||";
i.update({
content: interaction.translate("moderation/poll:POLL_SENDED"),
components: []

View file

@ -31,7 +31,7 @@ class Unban extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const id = interaction.options.getString("user_id");

View file

@ -28,7 +28,7 @@ class Warn extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").UserContextMenuCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction, data) {
const member = interaction.targetMember;
@ -164,7 +164,7 @@ class Warn extends BaseCommand {
submitted.reply({
content: interaction.translate("moderation/warn:WARNED", {
username: member.user.tag,
user: member.toString(),
reason
})
});

View file

@ -31,7 +31,7 @@ class Warns extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const member = interaction.options.getMember("user");

View file

@ -28,7 +28,7 @@ class Back extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const voice = interaction.member.voice.channel;

View file

@ -30,7 +30,7 @@ class Clips extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
fs.readdir("./clips", async function (err, files) {

View file

@ -29,7 +29,7 @@ class Loop extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const voice = interaction.member.voice.channel;

View file

@ -29,7 +29,7 @@ class Nowplaying extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply();

View file

@ -32,7 +32,7 @@ class Play extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply();

View file

@ -28,7 +28,7 @@ class Queue extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const queue = client.player.getQueue(interaction.guildId);

View file

@ -28,7 +28,7 @@ class Skip extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const voice = interaction.member.voice.channel;

View file

@ -31,7 +31,7 @@ class Skipto extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const voice = interaction.member.voice.channel;

View file

@ -28,7 +28,7 @@ class Stop extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const voice = interaction.member.voice.channel;

View file

@ -29,7 +29,7 @@ class NSFW extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
if (!interaction.channel.nsfw) return interaction.replyT("misc:NSFW_COMMAND", null, { ephemeral: true });

View file

@ -13,6 +13,9 @@ class Announcement extends BaseCommand {
.setDescription(client.translate("owner/announcement:DESCRIPTION"))
.addStringOption(option => option.setName("message")
.setDescription(client.translate("common:MESSAGE"))
.setRequired(true))
.addBooleanOption(option => option.setName("tag")
.setDescription(client.translate("owner/announcement:TAG"))
.setRequired(true)),
aliases: [],
dirname: __dirname,
@ -31,7 +34,7 @@ class Announcement extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply({ ephemeral: true });
@ -53,7 +56,7 @@ class Announcement extends BaseCommand {
if (guild.id === "568120814776614924") return;
const channel = guild.channels.cache.get(guild?.data.plugins.news);
await channel.send({
content: "||@everyone|| ВАЖНОЕ ОБЪЯВЛЕНИЕ!",
content: `${interaction.options.getBoolean("tag") ? "||@everyone|| " : ""}ВАЖНОЕ ОБЪЯВЛЕНИЕ!`,
embeds: [embed]
});
});

View file

@ -21,7 +21,7 @@ class Debug extends BaseCommand {
{ name: client.translate("common:XP"), value: "xp" },
{ name: client.translate("common:CREDITS"), value: "credits" },
{ name: client.translate("economy/transactions:BANK"), value: "bank" },
{ name: client.translate("common:REP"), value: "rep" },
{ name: client.translate("common:REP"), value: "rep" }
))
.addUserOption(option => option.setName("user")
.setDescription(client.translate("common:USER"))
@ -40,7 +40,7 @@ class Debug extends BaseCommand {
{ name: client.translate("common:XP"), value: "xp" },
{ name: client.translate("common:CREDITS"), value: "credits" },
{ name: client.translate("economy/transactions:BANK"), value: "bank" },
{ name: client.translate("common:REP"), value: "rep" },
{ name: client.translate("common:REP"), value: "rep" }
))
.addUserOption(option => option.setName("user")
.setDescription(client.translate("common:USER"))
@ -68,56 +68,62 @@ class Debug extends BaseCommand {
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
*/
async execute(client, interaction, data) {
async execute(client, interaction,) {
const command = interaction.options.getSubcommand();
if (command === "set") {
const type = interaction.options.getString("type");
const member = interaction.options.getMember("user");
if (member.user.bot) return interaction.error("misc:BOT_USER", null, { ephemeral: true });
const userData = await client.findOrCreateUser({
id: member.id
});
const memberData = await client.findOrCreateMember({
id: member.id
});
const int = interaction.options.getInteger("int");
switch (type) {
case "level": {
data.memberData.level = int;
await data.memberData.save();
return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), {
memberData.level = int;
await memberData.save();
return interaction.success(`owner/debug:SUCCESS_${type.toUpperCase()}`, {
username: member.toString(),
amount: int
}, { ephemeral: true });
}
case "xp": {
data.memberData.exp = int;
await data.memberData.save();
return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), {
memberData.exp = int;
await memberData.save();
return interaction.success(`owner/debug:SUCCESS_${type.toUpperCase()}`, {
username: member.toString(),
amount: int
}, { ephemeral: true });
}
case "credits": {
data.memberData.money = int;
await data.memberData.save();
return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), {
memberData.money = int;
await memberData.save();
return interaction.success(`owner/debug:SUCCESS_${type.toUpperCase()}`, {
username: member.toString(),
amount: int
}, { ephemeral: true });
}
case "bank": {
data.memberData.bankSold = int;
await data.memberData.save();
return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), {
memberData.bankSold = int;
await memberData.save();
return interaction.success(`owner/debug:SUCCESS_${type.toUpperCase()}`, {
username: member.toString(),
amount: int
}, { ephemeral: true });
}
case "rep": {
data.memberData.rep = int;
await data.memberData.save();
return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), {
userData.rep = int;
await userData.save();
return interaction.success(`owner/debug:SUCCESS_${type.toUpperCase()}`, {
username: member.toString(),
amount: int
}, { ephemeral: true });
@ -127,49 +133,55 @@ class Debug extends BaseCommand {
const type = interaction.options.getString("type");
const member = interaction.options.getMember("target");
if (member.user.bot) return interaction.error("misc:BOT_USER", null, { ephemeral: true });
const userData = await client.findOrCreateUser({
id: member.id
});
const memberData = await client.findOrCreateMember({
id: member.id
});
const int = interaction.options.getInteger("int");
switch (type) {
case "level": {
data.memberData.level += int;
await data.memberData.save();
return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), {
memberData.level += int;
await memberData.save();
return interaction.success(`owner/debug:SUCCESS_${type.toUpperCase()}`, {
username: member.toString(),
amount: int
}, { ephemeral: true });
}
case "xp": {
data.memberData.exp += int;
await data.memberData.save();
return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), {
memberData.exp += int;
await memberData.save();
return interaction.success(`owner/debug:SUCCESS_${type.toUpperCase()}`, {
username: member.toString(),
amount: int
}, { ephemeral: true });
}
case "credits": {
data.memberData.money += int;
await data.memberData.save();
return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), {
memberData.money += int;
await memberData.save();
return interaction.success(`owner/debug:SUCCESS_${type.toUpperCase()}`, {
username: member.toString(),
amount: int
}, { ephemeral: true });
}
case "bank": {
data.memberData.bankSold += int;
await data.memberData.save();
return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), {
memberData.bankSold += int;
await memberData.save();
return interaction.success(`owner/debug:SUCCESS_${type.toUpperCase()}`, {
username: member.toString(),
amount: int
}, { ephemeral: true });
}
case "rep": {
data.memberData.rep += int;
await data.memberData.save();
return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), {
userData.rep += int;
await userData.save();
return interaction.success(`owner/debug:SUCCESS_${type.toUpperCase()}`, {
username: member.toString(),
amount: int
}, { ephemeral: true });

View file

@ -31,14 +31,14 @@ class Eval extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
// eslint-disable-next-line no-unused-vars
async execute(client, interaction, data) {
const code = interaction.options.getString("code");
const result = new Promise((resolve) => resolve(eval(code)));
const result = new Promise(resolve => resolve(eval(code)));
return result.then((output) => {
return result.then(output => {
if (typeof output != "string") output = require("util").inspect(output, { depth: 0 });
if (output.includes(client.token)) output = output.replace(client.token, "T0K3N");
@ -46,7 +46,7 @@ class Eval extends BaseCommand {
content: "```js\n" + output + "```",
ephemeral: true
});
}).catch((err) => {
}).catch(err => {
console.error(err);
err = err.toString();

View file

@ -33,12 +33,12 @@ class Reload extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
const command = interaction.options.getString("command");
const cmd = client.commands.get(command);
if (!cmd) return interaction.error("general/help:NOT_FOUND", { search: command }, { ephemeral: true });
if (!cmd) return interaction.error("owner/reload:NOT_FOUND", { search: command }, { ephemeral: true });
await client.unloadCommand(`../commands/${cmd.category}`, cmd.command.name);
await client.loadCommand(`../commands/${cmd.category}`, cmd.command.name);

View file

@ -33,7 +33,7 @@ class Say extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
await interaction.deferReply({ ephemeral: true });

View file

@ -28,7 +28,7 @@ class Servers extends BaseCommand {
*
* @param {import("../../base/JaBa")} client
* @param {import("discord.js").ChatInputCommandInteraction} interaction
* @param {Array} data
* @param {Object} data
*/
async execute(client, interaction) {
let i0 = 0,

View file

@ -1,3 +1,16 @@
### JaBa v4.0
* Добавлено
* Перенесены все категории.
* Команда *setnews* - настроить канал для новостей бота (только самые важные).
* Настройка канала новостей бота в панели управления.
* Изменения
* Команды *deposit* и *withdraw* заменены командой *bank*.
* Исправления
* Поправлены все фразы в стандартной локализации.
* Правка локализации в панели управления.
### JaBa v4.0pre5
* Добавлено
* Перенесена категория *Administration*.

View file

@ -18,7 +18,7 @@
<!-- Content Header (Page header) -->
<section class="content-header">
<h1> <%= translate("common:CONFIGURATION") %> <small> Dashboard v1.1 </small> </h1>
<h1> <%= translate("common:SETTINGS") %> <small> Dashboard v1.1 </small> </h1>
<ol class="breadcrumb">
<li><a href="/"><i class="fa fa-home"></i> <%= translate("dashboard:SELECTOR") %></a></li>
<li class="active"><%= guild.name %></li>
@ -44,7 +44,7 @@
<div class="info-box">
<span class="info-box-icon bg-red"><i class="fa fa-line-chart"></i></span>
<div class="info-box-content">
<span class="info-box-text"><%= translate("economy/profile:EXP").substr(2) %></span>
<span class="info-box-text"><%= translate("economy/profile:XP").substr(2) %></span>
<span class="info-box-number"><%= memberData.exp %> / <%= 5 * (memberData.level * memberData.level) + 80 * memberData.level + 100 %></span>
</div>
<!-- /.info-box-content -->
@ -115,7 +115,7 @@
<!-- /.box-body -->
<div class="box-footer">
<button type="submit"
class="btn btn-primary"><%= translate("common:UPDATE") %></button>
class="btn btn-primary"><%= translate("common:APPLY") %></button>
</div>
</form>
</div>
@ -223,7 +223,7 @@
<!-- /.box-body -->
<div class="box-footer">
<button type="submit"
class="btn btn-primary"><%= translate("common:UPDATE") %></button>
class="btn btn-primary"><%= translate("common:APPLY") %></button>
</div>
</form>
</div>
@ -283,12 +283,12 @@
<div class="box-footer">
<% if (guild.plugins.welcome.enabled) { %>
<button type="submit" name="welcomeDisable"
class="btn btn-danger"><%= translate("dashboard:DISABLE_MESSAGES") %></button>
class="btn btn-danger"><%= translate("common:DISABLE") %></button>
<button type="submit" name="welcomeUpdate"
class="btn btn-primary pull-right"><%= translate("common:UPDATE") %></button>
class="btn btn-primary pull-right"><%= translate("common:APPLY") %></button>
<% } else { %>
<button type="submit" name="welcomeEnable"
class="btn btn-success"><%= translate("dashboard:ENABLE_MESSAGES") %></button>
class="btn btn-success"><%= translate("common:ENABLE") %></button>
<% } %>
</div>
</form>
@ -346,12 +346,12 @@
<div class="box-footer">
<% if (guild.plugins.goodbye.enabled) { %>
<button type="submit" name="goodbyeDisable"
class="btn btn-danger"><%= translate("dashboard:DISABLE_MESSAGES") %></button>
class="btn btn-danger"><%= translate("common:DISABLE") %></button>
<button type="submit" name="goodbyeUpdate"
class="btn btn-primary pull-right"><%= translate("common:UPDATE") %></button>
class="btn btn-primary pull-right"><%= translate("common:APPLY") %></button>
<% } else { %>
<button type="submit" name="goodbyeEnable"
class="btn btn-success"><%= translate("dashboard:ENABLE_MESSAGES") %></button>
class="btn btn-success"><%= translate("common:ENABLE") %></button>
<% } %>
</div>
</form>
@ -388,12 +388,12 @@
<div class="box-footer">
<% if (guild.plugins.autorole.enabled) { %>
<button type="submit" name="autoroleDisable"
class="btn btn-danger"><%= translate("dashboard:DISABLE_AUTOROLE") %></button>
class="btn btn-danger"><%= translate("common:DISABLE") %></button>
<button type="submit" name="autoroleUpdate"
class="btn btn-primary pull-right"><%= translate("common:UPDATE") %></button>
class="btn btn-primary pull-right"><%= translate("common:APPLY") %></button>
<% } else { %>
<button type="submit" name="autoroleEnable"
class="btn btn-success"><%= translate("dashboard:ENABLE_AUTOROLE") %></button>
class="btn btn-success"><%= translate("common:ENABLE") %></button>
<% } %>
</div>
</form>

View file

@ -84,7 +84,7 @@
<!-- general form elements -->
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title"><%= translate("common:CONFIGURATION") %></h3>
<h3 class="box-title"><%= translate("common:SETTINGS") %></h3>
</div>
<!-- /.box-header -->
<!-- form start -->
@ -116,7 +116,7 @@
<!-- /.box-body -->
<div class="box-footer">
<button type="submit"
class="btn btn-primary"><%= translate("common:UPDATE") %></button>
class="btn btn-primary"><%= translate("common:APPLY") %></button>
</div>
</form>
</div>

View file

@ -21,7 +21,7 @@
<!-- Content Header (Page header) -->
<section class="content-header">
<h1> <%= translate("dashboard:STATS") %> <i> <%= bot.guilds.cache.get(guildID).name %> </i> <small> Dashboard v1.1 </small> </h1>
<h1> <%= translate("common:STATS") %> <i> <%= bot.guilds.cache.get(guildID).name %> </i> <small> Dashboard v1.1 </small> </h1>
</section>
<!-- Main content -->

View file

@ -98,7 +98,7 @@
<span class="info-box-icon bg-red"><i class="fa fa-area-chart"></i></span>
<div class="info-box-content">
<span class="info-box-text"><%= translate("economy/profile:EXP").substr(2) %></span>
<span class="info-box-text"><%= translate("economy/profile:XP").substr(2) %></span>
<span class="info-box-number"><%= guild.members.find(u => u.id === userInfos.id).exp %> / <%= 5 * (guild.members.find(u => u.id === userInfos.id).level * guild.members.find(u => u.id === userInfos.id).level) + 80 * guild.members.find(u => u.id === userInfos.id).level + 100 %></span>
</div>
<!-- /.info-box-content -->

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