首页 > 解决方案 > 有没有办法为每 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);
        });
    });
}

标签: javascriptdiscorddiscord.js

解决方案


弄清楚了!

最终代码:

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);
        });
    });
}

推荐阅读