【发布时间】:2022-07-17 01:34:33
【问题描述】:
我希望当用户与选择菜单交互时它应该可以工作,然后在用户停止与之交互几秒钟后它应该禁用它。
这只是 Dank Memer 机器人帮助命令的工作原理。
我的命令在做什么: 该命令用作帮助命令,获取命令文件夹的子文件夹中的所有文件并给出命令的用法、名称和描述。当用户在选择菜单中选择一个选项并且该选项是命令文件夹的子文件夹时,它会编辑嵌入。
所以我一直这样做到现在:
const { MessageEmbed, Message, MessageActionRow, MessageSelectMenu, MessageButton } = require("discord.js");
const fs = require("fs");
const prefix = require("../../config.json").PREFIX;
module.exports = {
name: "help",
description: "Get All The Commands!",
usage: "help",
cooldown: 1000 * 5,
category: "Help Commands!",
/**
* @param {Message} message
*
*/
run: async (client, message, args) => {
const sizeOfCat = fs.readdirSync("./Commands - Staff/");
const OldEmbed = new MessageEmbed()
.setAuthor({
name: "Commands! =>",
iconURL: `${message.guild.iconURL({ dynamic: true })}`
})
.setThumbnail(`${message.guild.iconURL({ dynamic: true })}`)
.setTitle("???? Need help? Select The Category You Want To =>")
.setDescription(
`
**\`Hello Dear ${message.member.user.username}, Please Select Your Category According To Your Choice!\`**
**How To Use =>**
\`1) Click The Select Menu Down Below.\`
\`2) You Will See Many Categories, Click Your Category You Want To View.\`
\`3) The Embed Will Be Edited And You Can See Your Commands According To Category.\`
*Note => The Select Menu And The Button Will Be Disabled Automatically After 6 Seconds!*
**Total Categories Are: ${sizeOfCat.length}**
`
)
.setColor("BLURPLE")
.setTimestamp()
.setFooter({
text: `Requested by ${message.author.tag}`,
iconURL: message.author.displayAvatarURL({ dynamic: true })
})
const homeButton = new MessageActionRow()
.addComponents(
new MessageButton()
.setCustomId("Home")
.setLabel("Back To Home!")
.setStyle("PRIMARY")
.setEmoji("????️")
)
const EmojisCat = {
"Other Commands!": "????",
"Help Commands!": "????",
"Moderation Commands!": "⚒️",
"Owner Commands!": "????"
};
const selectMenu = new MessageActionRow()
.addComponents(
new MessageSelectMenu()
.setCustomId("Help-Menu")
.setPlaceholder(`Click To View The Categories Of The Commands!`)
.addOptions([
client.categoriesCommands.map((cat) => {
return {
label: `${cat[0].toUpperCase() + cat.slice(1)}`,
value: cat,
emoji: EmojisCat[cat],
description: `Click To View The Commands Of This Categories!`,
}
})
])
);
await message.reply({
content: "**There You Go, Check The List Of Categories!**",
embeds: [OldEmbed],
components: [selectMenu, homeButton]
})
.then(async (msg) => {
let filter = i => i.member.id === message.member.id;
let colletor = msg.createMessageComponentCollector({ filter: filter });
let timeout = null;
colletor.on("collect", async (i) => {
if (!i.member.id === message.member.id) {
await msg.reply({
content: `**Its Not Your Turn Of Using The Command Menu Or The Command (\`${prefix}help\`) Is Not Runned By You! Dum Dum.**`,
ephemeral: true,
});
} else {
if (i.isButton()) {
await i.deferUpdate();
if (i.customId === "Home") {
msg.edit({ embeds: [OldEmbed] })
}
}
if (i.isSelectMenu()) {
if (i.customId === "Help-Menu") {
await i.deferUpdate();
let [ directory ] = i.values;
let totalCdms = client.categoriesCommands.filter(cmd => cmd.category === directory).map(cmd => cmd.size);
let command = client.categoriesCommands.filter(cmd => cmd.category === directory).map(cmd => cmd.length) + 1;
const embed = new MessageEmbed()
.setAuthor({
name: "AwesomeSMP Commands! =>",
iconURL: `${message.guild.iconURL({ dynamic: true })}`
})
.setThumbnail(`${message.guild.iconURL({ dynamic: true })}`)
.setTitle(`???? Need help? Here Are All Of My ${directory} Commands:`)
.setDescription(
`
**\`Here Are One Of My [${directory} Category] Commands =>\`**
**Total Commands In ${directory} Are: ${totalCdms}**
`
)
.setColor("BLURPLE")
.setTimestamp()
.setFooter({
text: `Requested by ${message.author.tag}`,
iconURL: message.author.displayAvatarURL({ dynamic: true })
})
client.commands.filter((cmd) => cmd.category === directory)
.map((cmd) => {
embed.addField(
`\n**\nCommmand-${command++}** =>\n\`${prefix}${cmd.name}\``,
` **Description:** *${cmd.description.toUpperCase() || "*None*"}*\n **Usage:** *${prefix} ${cmd.usage || "None"}*\n`
,true
);
})
await msg.edit({
embeds: [embed]
});
if (!i.message.member.id === i.isSelectMenu()) {
if (timeout) clearTimeout(timeout);
timeout = setTimeout(async () => {
selectMenu.components[0].setDisabled(true);
homeButton.components[0].setDisabled(true);
await msg.edit({
embeds: [OldEmbed],
components: [selectMenu, homeButton]
});
}, 6000);
}
}
}
}
});
});
}
}
到目前为止没有错误。
【问题讨论】:
-
在不活动后禁用组件的超时在收集器的
collect处理程序中,这意味着不活动超时只会在收集任何输入之后开始。我假设您希望此超时在收集器之外,因此即使没有收集到输入,它也会在超时后自行禁用。 -
我不明白@Cannicide 想说什么。他是否告诉我将我的超时移到收集器之外,我还写过我希望我的帮助命令作为 Dank Memer 帮助命令工作。因此,如果他们不知道 Dank Memer 是什么,我建议他们使用那里的帮助命令并检查当用户停止与下拉菜单交互时,几秒钟后下拉菜单会自行禁用。
-
“互动”到底是什么意思?你的意思是“用户最后选择一个值后x秒,禁用菜单”的意思吗?您说,“如果他们不知道 Dank Memer 是什么,我会建议他们使用那里的帮助命令并检查”,但是如果您只是在问题本身中包含高度相关的信息而不是要求回答者,那么回答者会容易得多我们让 Dank Memer 自己尝试这个命令。我同意@halfer 的观点,大多数读者可能不明白你想做什么。
-
根据您所说的,我认为您正在寻找的只是在您的收集器之前声明一个空变量(例如,名为
timeout),并且每次收集器收集您所做的事情clearTimeout(timeout)如果定义了timeout,然后你将timeout设置为等于你当前的setTimeout()语句。每次选择菜单值时,这基本上都会重置超时计时器。 -
@Cannicide 我还是不明白._.,你能给我一个例子,这样我就能明白你在说什么?我只是知道你告诉我将我的
timeout移出收集器,如果人们不明白我在说什么,至少你明白了,然后 halfer 可以编辑我的消息并解释更多
标签: node.js drop-down-menu discord.js