如何找到相互服务器并将其显示在 Discord.js Bot 的 Select 菜单中?

How to find mutual servers & present it in Discord.js Bot's Select Menu?

我在查找有关如何查找 interaction.user 和 bot 的共同服务器的相关文档时遇到了很多麻烦。

我也试过this & ,但没有成功。

这是代码

const { SlashCommandBuilder } = require('@discordjs/builders');
const { REST } = require('@discordjs/rest');
const { Routes } = require('discord-api-types/v9');
const { token } = require('../config.json');
const { MessageActionRow, MessageSelectMenu, Client, Intents } = require('discord.js');
const rest = new REST({ version: '9' }).setToken(token);

module.exports = {
    data: new SlashCommandBuilder()
        .setName('transfer-bans')
        .setDescription('Transfers Bans across servers'),

    async execute(interaction) {
        const emb = {
            description:'Guild fetcher',
        };
        const client = new Client({ intents: [Intents.FLAGS.GUILDS], partials: ['CHANNEL', 'REACTION'] });


        const guilds = await client.guilds.cache.map(guild => guild.id);
        console.log(guilds);

        const guilds2 = Promise.all(
            client.guilds.cache.map(async guild => [
                guild.id,
                await guild.members.fetch(interaction.member).catch(() => null),
            ]),
        ).then(guilds2 => guilds2.filter(g => g[1]).map(guild => client.guilds.resolve(guild[0])));
        console.log(guilds2);

        const row = new MessageActionRow()
            .addComponents(
                new MessageSelectMenu()
                    .setCustomId('select')
                    .setPlaceholder('Nothing selected')
                    .addOptions([
                        {
                            label: 'me',
                            description: 'description',
                            value: 'option_first',
                        },
                        {
                            label: 'me too',
                            description: ' description',
                            value: 'option_second',
                        },
                    ]),
            );
        await interaction.reply({ embeds:[emb], components: [row] });

    },
};

我在 console.log 中得到的是 -

[nodemon] starting `node index.js`
Tue Oct 19 2021
Ready! Logged in as Ban Utlis#6717
MRDGH2821#7746 in #general triggered an interaction.
[]
Promise { <pending> }

我的问题是,

Q1.1。如何获取我的机器人所在的所有公会的公会 ID 列表?

Q1.2。如何找到关于 interaction.user 的共同服务器?

Q2。如何在机器人消息的 select menu 中动态显示相互服务器 检查编辑 2

我正在使用 Discord.js v13。我什至查阅了他们关于共同服务器的指南和文档,但什么也没找到。

Bot 源代码存储于 GitHub

编辑 1

在此代码中获取 Bot 的公会 ID 的实现没有语法问题。问题是,没有公会 ID 打印到 console.log

编辑 2

我从中得到了帮助Pull Request

所以这里是更新代码的一部分:

const guilds = [];
        for (const [, guild] of interaction.client.guilds.cache) {
            await guild.members.fetch(interaction.user).then(() => guilds.push(guild)).catch(error => console.log(error));
        }

        const servers = [];
        for (let i = 0; i < Object.keys(guilds).length;i++) {
            servers.push({ label: Object.entries(guilds)[i][1].name, value:Object.entries(guilds)[i][1].id });
        }

        const row = new MessageActionRow()
            .addComponents(
                new MessageSelectMenu()
                    .setCustomId('select')
                    .setPlaceholder('Nothing selected')
                    .addOptions(servers),
            );
        await interaction.editReply({ embeds:[emb], components: [row] });

所以这解决了公会获取问题。

我什至设法将其显示在 Select 菜单中。
现在我的第三个问题(虽然上面给出的代码片段是这个 post 标题的实际答案)

Q3。关于如何从 select 菜单接收交互的任何指南?

接收 select 菜单交互的 discordjs guide 在我的上下文中不起作用。

编辑 3

我觉得单独问 Q3 会更好 [=7​​4=] 而不是这个。

一个简单的方法是:

<client>.guilds.cache.filter((u) => u.members.cache.get(interaction.user.id))

那么你当然需要映射它

<client>.guilds.cache.filter((u) => u.members.cache.get(interaction.user.id)).map((g) => g.id) // will map guilds by ID

<client>.guilds.cache.filter((u) => u.members.cache.get(interaction.user.id)).map((g) => g.name) // will map guilds by name

虽然答案在问题的编辑 2 中,但重新发布肯定会有帮助。

我从中得到了帮助Pull Request

这是完整的工作代码,它从 interaction.user 获取相互服务器并将它们显示在 select 菜单组件中。

const { SlashCommandBuilder } = require('@discordjs/builders');
const { REST } = require('@discordjs/rest');
const { Routes } = require('discord-api-types/v9');
const { token } = require('../config.json');
const { MessageActionRow, MessageSelectMenu } = require('discord.js');
const rest = new REST({ version: '9' }).setToken(token);

module.exports = {
    data: new SlashCommandBuilder()
        .setName('transfer-bans')
        .setDescription('Transfers Bans across servers'),

    async execute(interaction) {
        await interaction.deferReply('Fetching Guilds');
        const emb = {
            description:'Guild fetcher',
        };

//code to fetch mutual servers
        const guilds = [];
        for (const [, guild] of interaction.client.guilds.cache) {
            await guild.members.fetch(interaction.user).then(() => guilds.push(guild)).catch(error => console.log(error));
        }

//code to generate array of server names & IDs for .addOption() in select menu component
        const servers = [];
        for (let i = 0; i < Object.keys(guilds).length;i++) {
            servers.push({ label: Object.entries(guilds)[i][1].name, value:Object.entries(guilds)[i][1].id });
        }

        const row = new MessageActionRow()
            .addComponents(
                new MessageSelectMenu()
                    .setCustomId('select')
                    .setPlaceholder('Choose a Server')
                    .addOptions(servers),
            );
        await interaction.editReply({ embeds:[emb], components: [row] });