使用discord js的每个公会斜线命令的不同选择
Different choices for each guild slash command using discord js
我正在构建一个将在多个公会(a.k.a 服务器)上使用的 discord 机器人。该机器人有一个名为 'send' 的命令,该命令在一个选项中有一组 选择 :
const { SlashCommandBuilder } = require('@discordjs/builders');
module.exports = {
data: new SlashCommandBuilder()
.setName('send')
.setDescription('Do stuff')
.addStringOption(option =>
option.setName('choices') // setting the choices
.setDescription('users will chose one of the options bellow')
.setRequired(true)
.addChoice('choice1', 'potato')
.addChoice('choice2', 'tomato')
.setRequired(true))
async execute(interaction) {
//do stuff
}; }};
所有其他应用程序命令都是全局的,但此特定命令必须为每个不同的公会提供自定义选择。所有这些选择都存储在 mongo 数据库中,并带有相应的公会 ID。
数据库查询没问题,但我正在努力寻找 'deploy' 自动执行此命令的解决方案,每个服务器都有不同的选择。这是我提出这个问题的目标,找到一个解决方案来为每个公会部署具有不同选择的命令。
如果需要,我可以提供我的 deploy-commands.js 代码(在 this tutorial 之后)以及更多详细信息。
感谢帮助
如评论中所述,无法使用来自数据库的数据进行选择。解决方法是使用 'autocomplete' 选项。
为此,我们在构建器中添加一个 .setAutocomplete(true)
。现在,我们需要处理自动完成交互,并用我们想要从数据库中获取的值填充它。
'filter' 我们正在处理的交互类型很重要。使用 if 语句,我们需要验证交互是 autocomplete 还是 command。下面是结果代码:
const { SlashCommandBuilder } = require('@discordjs/builders');
const mongo = require('../structures/mongo')
module.exports = {
data: new SlashCommandBuilder()
.setName('send')
.setDescription('items list')
.addStringOption((option) =>
option
.setName('items')
.setDescription('Select your item from the list')
.setRequired(true)
.setAutocomplete(true)),
async execute(interaction) {
const guildID = interaction.member.guild.id;
//query DB for the options
let guild = await mongo.getGuild(guildID)
//loop through guild token and set to autocomplete
for (let i = 0; i < guild.guild_tokens.length; i++) {
choices.push({
name: `${guild.guild_tokens[i].name}`,
value: `${i}`,
})
tokens.push(`${guild.guild_tokens[i].name}`)
}
if (interaction.isAutocomplete()) {
interaction.respond(choices)
.catch(console.error);
}
// Must handle interactions (command ones) inside the if statement
if (interaction.isCommand()) {
// do stuff
}
};
附带一提,一开始我对交互有疑问,因为在我的 'interactionCreate' 文件中,如果交互不是命令,我会 returning。如果交互是 'autocomplete' 类型,将该文件更改为非 return 也很重要:
module.exports = {
名称:“交互创建”,
异步执行(交互){
if (!(interaction.isCommand() || (interaction.type == 'APPLICATION_COMMAND_AUTOCOMPLETE'))) {
console.log('fuck')
return;
}
const command = interaction.client.commands.get(interaction.commandName);
if (!command) return;
try {
await command.execute(interaction)
} catch (err) {
if (err) console.error(err);
}
}
}
我正在构建一个将在多个公会(a.k.a 服务器)上使用的 discord 机器人。该机器人有一个名为 'send' 的命令,该命令在一个选项中有一组 选择 :
const { SlashCommandBuilder } = require('@discordjs/builders');
module.exports = {
data: new SlashCommandBuilder()
.setName('send')
.setDescription('Do stuff')
.addStringOption(option =>
option.setName('choices') // setting the choices
.setDescription('users will chose one of the options bellow')
.setRequired(true)
.addChoice('choice1', 'potato')
.addChoice('choice2', 'tomato')
.setRequired(true))
async execute(interaction) {
//do stuff
}; }};
所有其他应用程序命令都是全局的,但此特定命令必须为每个不同的公会提供自定义选择。所有这些选择都存储在 mongo 数据库中,并带有相应的公会 ID。
数据库查询没问题,但我正在努力寻找 'deploy' 自动执行此命令的解决方案,每个服务器都有不同的选择。这是我提出这个问题的目标,找到一个解决方案来为每个公会部署具有不同选择的命令。
如果需要,我可以提供我的 deploy-commands.js 代码(在 this tutorial 之后)以及更多详细信息。
感谢帮助
如评论中所述,无法使用来自数据库的数据进行选择。解决方法是使用 'autocomplete' 选项。
为此,我们在构建器中添加一个 .setAutocomplete(true)
。现在,我们需要处理自动完成交互,并用我们想要从数据库中获取的值填充它。
'filter' 我们正在处理的交互类型很重要。使用 if 语句,我们需要验证交互是 autocomplete 还是 command。下面是结果代码:
const { SlashCommandBuilder } = require('@discordjs/builders');
const mongo = require('../structures/mongo')
module.exports = {
data: new SlashCommandBuilder()
.setName('send')
.setDescription('items list')
.addStringOption((option) =>
option
.setName('items')
.setDescription('Select your item from the list')
.setRequired(true)
.setAutocomplete(true)),
async execute(interaction) {
const guildID = interaction.member.guild.id;
//query DB for the options
let guild = await mongo.getGuild(guildID)
//loop through guild token and set to autocomplete
for (let i = 0; i < guild.guild_tokens.length; i++) {
choices.push({
name: `${guild.guild_tokens[i].name}`,
value: `${i}`,
})
tokens.push(`${guild.guild_tokens[i].name}`)
}
if (interaction.isAutocomplete()) {
interaction.respond(choices)
.catch(console.error);
}
// Must handle interactions (command ones) inside the if statement
if (interaction.isCommand()) {
// do stuff
}
};
附带一提,一开始我对交互有疑问,因为在我的 'interactionCreate' 文件中,如果交互不是命令,我会 returning。如果交互是 'autocomplete' 类型,将该文件更改为非 return 也很重要:
module.exports = { 名称:“交互创建”, 异步执行(交互){
if (!(interaction.isCommand() || (interaction.type == 'APPLICATION_COMMAND_AUTOCOMPLETE'))) {
console.log('fuck')
return;
}
const command = interaction.client.commands.get(interaction.commandName);
if (!command) return;
try {
await command.execute(interaction)
} catch (err) {
if (err) console.error(err);
}
}
}