Фиксы и таблицы лидеров в эмбедах

This commit is contained in:
JonnyBro 2022-01-13 19:49:12 +05:00
parent b0deb2e447
commit a5456a11d6
9 changed files with 130 additions and 54 deletions

View file

@ -23,7 +23,9 @@ class Configuration extends Command {
const embed = new Discord.MessageEmbed() const embed = new Discord.MessageEmbed()
.setAuthor({ .setAuthor({
name: message.guild.name, name: message.guild.name,
iconURL: message.guild.iconURL() iconURL: message.guild.iconURL({
dynamic: true
})
}) })
.setColor(data.config.embed.color) .setColor(data.config.embed.color)
.setFooter({ .setFooter({

View file

@ -1,5 +1,5 @@
const Command = require("../../base/Command"), const Command = require("../../base/Command"),
AsciiTable = require("ascii-table"); Discord = require("discord.js");
class Leaderboard extends Command { class Leaderboard extends Command {
constructor(client) { constructor(client) {
@ -30,18 +30,43 @@ class Leaderboard extends Command {
membersLeaderboard = members.map((m) => { membersLeaderboard = members.map((m) => {
return { return {
id: m.id, id: m.id,
value: m.money + m.bankSold money: m.money + m.bankSold
}; };
}).sort((a, b) => b.value - a.value); }).sort((a, b) => b.money - a.money);
const table = new AsciiTable("Таблица лидеров");
table.setHeading("#", message.translate("common:USER"), message.translate("common:CREDITS"));
if (membersLeaderboard.length > 20) membersLeaderboard.length = 20; if (membersLeaderboard.length > 20) membersLeaderboard.length = 20;
const newTable = await fetchUsers(membersLeaderboard, table, this.client); 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.MessageEmbed()
.setAuthor({
name: message.translate("economy/leaderboard:TABLE", {
name: message.guild.name
}),
iconURL: message.guild.iconURL({
dynamic: true
})
})
.setColor(this.client.config.embed.color)
.addFields({
name: message.translate("economy/leaderboard:TOP"),
value: userNames,
inline: true
}, {
name: message.translate("economy/leaderboard:LEVEL"),
value: money,
inline: true
});
message.channel.send({ message.channel.send({
content: "```\n" + newTable.toString() + "```" embeds: [embed]
}); });
} else if (type === "level") { } else if (type === "level") {
const members = await this.client.membersData.find({ const members = await this.client.membersData.find({
@ -50,18 +75,50 @@ class Leaderboard extends Command {
membersLeaderboard = members.map((m) => { membersLeaderboard = members.map((m) => {
return { return {
id: m.id, id: m.id,
value: m.level level: m.level,
xp: m.exp
}; };
}).sort((a, b) => b.value - a.value); }).sort((a, b) => b.level - a.level);
const table = new AsciiTable("Таблица лидеров");
table.setHeading("#", message.translate("common:USER"), message.translate("common:LEVEL"));
if (membersLeaderboard.length > 20) membersLeaderboard.length = 20; if (membersLeaderboard.length > 20) membersLeaderboard.length = 20;
const newTable = await fetchUsers(membersLeaderboard, table, this.client); 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.MessageEmbed()
.setAuthor({
name: message.translate("economy/leaderboard:TABLE", {
name: message.guild.name
}),
iconURL: message.guild.iconURL({
dynamic: true
})
})
.setColor(this.client.config.embed.color)
.addFields({
name: message.translate("economy/leaderboard:TOP"),
value: userNames,
inline: true
}, {
name: message.translate("economy/leaderboard:LEVEL"),
value: level,
inline: true
}, {
name: message.translate("economy/leaderboard:XP"),
value: xp,
inline: true
});
message.channel.send({ message.channel.send({
content: "```\n" + newTable.toString() + "```" embeds: [embed]
}); });
} else if (type === "rep") { } else if (type === "rep") {
const users = await this.client.usersData.find({ const users = await this.client.usersData.find({
@ -70,18 +127,43 @@ class Leaderboard extends Command {
usersLeaderboard = users.map((u) => { usersLeaderboard = users.map((u) => {
return { return {
id: u.id, id: u.id,
value: u.rep rep: u.rep
}; };
}).sort((a, b) => b.value - a.value); }).sort((a, b) => b.rep - a.rep);
const table = new AsciiTable("Таблица лидеров");
table.setHeading("#", message.translate("common:USER"), message.translate("common:POINTS"));
if (usersLeaderboard.length > 20) usersLeaderboard.length = 20; if (usersLeaderboard.length > 20) usersLeaderboard.length = 20;
const newTable = await fetchUsers(usersLeaderboard, table, this.client); 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.MessageEmbed()
.setAuthor({
name: message.translate("economy/leaderboard:TABLE", {
name: message.guild.name
}),
iconURL: message.guild.iconURL({
dynamic: true
})
})
.setColor(this.client.config.embed.color)
.addFields({
name: message.translate("economy/leaderboard:TOP"),
value: userNames,
inline: true
}, {
name: message.translate("economy/leaderboard:REP"),
value: rep,
inline: true
});
message.channel.send({ message.channel.send({
content: "```\n" + newTable.toString() + "```" embeds: [embed]
}); });
} }
@ -89,20 +171,4 @@ class Leaderboard extends Command {
} }
} }
module.exports = Leaderboard; module.exports = Leaderboard;
async function fetchUsers(array, table, client) {
return new Promise((resolve) => {
let index = 1;
array.forEach((element) => {
client.users.fetch(element.id).then((user) => {
const regEx = /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g;
let username = user.username.replace(regEx, "");
if (username.length > 20) username = username.substr(0, 20);
table.addRow(index++, username, element.value);
});
});
resolve(table);
});
}

View file

@ -1,10 +1,11 @@
### JaBa v3.2.7 ### JaBa v3.2.8
* Добавлено * Добавлено
* Статистика сервера на сайте ([пример](https://jaba.pp.ua/stats/651412418202959872)). * Статистика сервера на сайте ([пример](https://jaba.pp.ua/stats/651412418202959872)).
* Профиль пользователя определённого сервера на сайте ([пример](https://jaba.pp.ua/user/281361531411890186/651412418202959872)) * Профиль пользователя определённого сервера на сайте ([пример](https://jaba.pp.ua/user/281361531411890186/651412418202959872))
Ссылки на статистику сервера и профиль пользователя можно найти в *serverinfo* и *profile (@пользователь)* соответственно. Ссылки на статистику сервера и профиль пользователя можно найти в *serverinfo* и *profile (@пользователь)* соответственно.
* Изменения * Изменения
* Таблицы лидеров теперь показываются в эмбедах.
* Отключены команда *someone* и тэг *@someone*. * Отключены команда *someone* и тэг *@someone*.
### JaBa v3.2.7 ### JaBa v3.2.7

View file

@ -46,11 +46,9 @@ async function fetchUsers(array, client) {
return new Promise((resolve) => { return new Promise((resolve) => {
const users = []; const users = [];
array.filter((e) => e.id).forEach((element) => { array.filter((e) => e.id).forEach((element) => {
client.users.fetch(element.id).then((user) => { client.users.fetch(element.id).then(user => {
user.username = user.username.replace(/[\W_]+/g, " "); if (user.username.length > 15) user.username = user.username.substr(0, 12) + "...";
if (user.username.length > 13) {
user.username = user.username.substr(0, 10) + "...";
}
users.push({ users.push({
...{ ...{
money: element.money, money: element.money,

View file

@ -114,7 +114,7 @@
/* LEADERBOARD */ /* LEADERBOARD */
let values = ["money", "level"]; let values = ["money", "level"];
values.forEach((value) => { values.forEach((value) => {
let members = JSON.parse(`<%- JSON.stringify(stats) %>`)[value]; let members = JSON.parse(`<%- JSON.stringify(stats) %>`)[value].sort((a, b) => a - b);
let data = { let data = {
labels: members.map(a => a.username), labels: members.map(a => a.username),
datasets: [{ datasets: [{

View file

@ -48,7 +48,9 @@ module.exports = class {
const logsEmbed = new Discord.MessageEmbed() const logsEmbed = new Discord.MessageEmbed()
.setAuthor({ .setAuthor({
name: guild.name, name: guild.name,
iconURL: guild.iconURL() iconURL: guild.iconURL({
dynamic: true
})
}) })
.setColor("#32CD32") .setColor("#32CD32")
.setDescription(text); .setDescription(text);

View file

@ -12,7 +12,9 @@ module.exports = class {
const embed = new Discord.MessageEmbed() const embed = new Discord.MessageEmbed()
.setAuthor({ .setAuthor({
name: guild.name, name: guild.name,
iconURL: guild.iconURL() iconURL: guild.iconURL({
dynamic: true
})
}) })
.setColor("#B22222") .setColor("#B22222")
.setDescription(text); .setDescription(text);

View file

@ -3,5 +3,11 @@
"USAGE": "{{prefix}}leaderboard [rep/level/credits]", "USAGE": "{{prefix}}leaderboard [rep/level/credits]",
"EXAMPLES": "{{prefix}}leaderboard credits\n{{prefix}}leaderboard level", "EXAMPLES": "{{prefix}}leaderboard credits\n{{prefix}}leaderboard level",
"MISSING_TYPE": "Выберите таблицу `credits`, `level` или `rep`", "MISSING_TYPE": "Выберите таблицу `credits`, `level` или `rep`",
"MOBILE": ":confused: Я заметил, что вы онлайн с телефона.... Таблица лидеров может отображаться некорректно на маленьких экранах. Попробуйте переключиться на ландшафтный режим или попробуйте позже с другого устройства!" "MOBILE": ":confused: Я заметил, что вы онлайн с телефона... Таблица лидеров может отображаться некорректно на маленьких экранах. Попробуйте переключиться на ландшафтный режим или попробуйте позже с другого устройства!",
"TABLE": "Таблица лидеров {{name}}",
"TOP": "Топ 20",
"LEVEL": "Уровень",
"XP": "Опыт",
"CREDITS": "Кредиты",
"REP": "Репутация"
} }

View file

@ -21,7 +21,6 @@
"@sentry/node": "6.3.6", "@sentry/node": "6.3.6",
"@sindresorhus/slugify": "^1.1.0", "@sindresorhus/slugify": "^1.1.0",
"amethyste-api": "github:Androz2091/amethyste-api", "amethyste-api": "github:Androz2091/amethyste-api",
"ascii-table": "0.0.9",
"blague.xyz": "^2.0.4", "blague.xyz": "^2.0.4",
"btoa": "^1.2.1", "btoa": "^1.2.1",
"canvacord": "^5.1.0", "canvacord": "^5.1.0",