javascript - 有没有办法为每 x 量的数据创建一个嵌入页面?
问题描述
我创建了一个排行榜命令来获取得分最高的前 20 名用户。但是,目前它将所有内容显示在一个嵌入中。将来如果我想进入前 50 名,作为 iirc 是不可能的,你只能有 25 个字段。
我想要做的是为每 10 个用户创建一个页面。
其中一些没有意义,因为我只是想获得一些关于如何做到这一点的想法。
const Discord = require('discord.js');
const sqlite = require('sqlite3').verbose();
const db = new sqlite.Database('./mbot.db', (err) => {
if (err) console.log(err.message);
});
module.exports = {
name: 'leaderboard',
description: 'Get up to 20 users with the most points',
async execute(message, args, client) {
const embeds = [];
for (let i = -1; i < 5; i++) {
embeds.push(new Discord.RichEmbed());
}
for (let i = 0; i < 20; i++) {
if (i < 10) {
embeds[0].addField('usersthings');
} else if (i < 20) {
embeds[1].addField('usersandthings');
}
}
message.channel.send(embeds[0]);
const leaders = await leaderboard(message, client);
return message.channel.send(leaders);
},
};
function leaderboard(message, client) {
return new Promise((resolve) => {
db.all('SELECT points points, id id FROM users ORDER BY points DESC', async (err, rows) => {
if (err) return console.log(err);
const embed = new Discord.RichEmbed().setTitle('Points Leaderboard');
if (!rows.length) return message.channel.send('No users found!');
const each = new Promise(async (resolve) => {
const users = [];
rows.forEach((val, i, arr) => {
users.push({
id: arr[i].id,
points: arr[i].points,
});
});
return resolve(users);
});
let multiplier = 1;
await each.then(async users => {
const pages = Math.floor((users.length + 1) / 10) + 1;
console.log(pages);
for (let i = 0; i < (10 * multiplier); i++) {
if (users[i]) {
const user = await client.fetchUser(users[i].id);
embed.addField(`${i + 1}. ${user.username}`, users[i].points, true);
}
}
});
return resolve(embed);
});
});
}
解决方案
弄清楚了!
最终代码:
const Discord = require('discord.js');
const sqlite = require('sqlite3').verbose();
const db = new sqlite.Database('./mbot.db', (err) => {
if (err) console.log(err.message);
});
module.exports = {
name: 'leaderboard',
description: 'Get up to 50 users with the most points',
async execute(message, args, client) {
const leaders = await leaderboard(message, client);
let page = 0;
message.channel.send(leaders[page]).then(async sent => {
await sent.react('◀');
await sent.react('▶');
sent.awaitReactions((reaction, user) => {
if (user.id === client.user.id) return;
reaction.remove(user);
switch (reaction.emoji.name) {
case "◀":
if (page === 0) return;
page--;
break;
case "▶":
if (page === leaders.length - 1) return;
page++;
break;
}
sent.edit(leaders[page]);
}, (2 * 60000));
});
},
};
function leaderboard(message, client) {
return new Promise((resolve) => {
db.all('SELECT points points, id id FROM users ORDER BY points DESC', async (err, rows) => {
if (err) return console.log(err);
const embeds = [];
if (!rows.length) return message.channel.send('No users found!');
const each = new Promise(async (resolve) => {
const users = [];
rows.forEach((val, i, arr) => {
users.push({
id: arr[i].id,
points: arr[i].points,
});
});
return resolve(users);
});
await each.then(async users => {
let method = Math.floor(users.length / 10) - 1;
for (let i = -1; i < method; i++) {
embeds.push(new Discord.RichEmbed());
method = Math.floor(users.length / 10);
}
let multiplier = 1;
for (let i = 0; i < 10 * multiplier; i++) {
if (i === 50) {
break;
}
if (users[i]) {
const user = await client.fetchUser(users[i].id);
embeds[multiplier - 1].addField(`${i + 1}. ${user.username}`, users[i].points, true);
if (i === (10 * multiplier) - 1) {
multiplier++;
}
}
}
});
return resolve(embeds);
});
});
}
推荐阅读
- c# - HTTP 错误 404.0 - 使用 64 位编码时未找到
- python - 使用 url 通过 urllib python 请求时出现编码问题
- python - Discord.py - 如何为每个服务器制作 cogs
- android - 如何在 Java 中的 Query 对象上编写我们想要的文档 ID 的 where 子句?
- python-3.x - 来自不同用户帐户的 Python
- css - React 导入的样式不起作用,但引导样式正在起作用
- ios - 有谁知道iOS是否可以选择添加此功能,在您的视图顶部有这个圆形灰色视图?
- java - 应用程序启动时键盘自动显示?
- ruby-on-rails - 配置 parallel_tests 以在 docker 容器内使用
- json - Dart json.decode 无法解码为 Map