如何找到相互服务器并将其显示在 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 会更好 [=74=] 而不是这个。
一个简单的方法是:
<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] });
我在查找有关如何查找 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 会更好 [=74=] 而不是这个。
一个简单的方法是:
<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] });