按钮在执行命令后工作,但是在重新启动bot并按下按钮之后,它会说interaction failed是我的ticket.js
const { MessageButton } = require('discord-buttons');
module.exports = {
name: 'ticket-setup',
aliases: ['close'],
category: 'Miscellaneous',
description: 'Makes a ticket embed',
async execute(message, args, cmd, client, Discord){
if(!message.member.permissions.has("MANAGE_CHANNELS")) return message.reply("Normies can't do this command")
if (cmd == 'close') {
if (!message.channel.name.includes('ticket-')) return message.channel.send('You cannot use that here!');
message.channel.delete();
}
let title;
let desc;
let ticketMsg;
const filter = msg => msg.author.id == message.author.id;
let options = {
max: 1
};
message.channel.send("What will the ticket title be?\nSay cancel to cancel")
let col = await message.channel.awaitMessages(filter, options)
if(col.first().content == 'cancel') return message.channel.send("Cancelled");
title = col.first().content
message.channel.send('What will the description be?\nSay cancel to cancel')
let col2 = await message.channel.awaitMessages(filter, options)
if(col2.first().content == 'cancel') return message.channel.send("Cancelled");
desc = col2.first().content
message.channel.send('What is the message that the user will see when they make a ticket?\nSay cancel to cancel')
let col3 = await message.channel.awaitMessages(filter, options)
if(col3.first().content == 'cancel') return message.channel.send("Cancelled");
ticketMsg = col3.first().content
const setupEmbed = new Discord.MessageEmbed()
.setTitle(title)
.setDescription(desc)
.setFooter(message.guild.name, message.guild.iconURL({ dynamic: true }))
.setColor('00f8ff')
const hiEmbed = new Discord.MessageEmbed()
.addField(ticketMsg, "\n\nDo a.close or press the button to close the ticket")
.setColor("RANDOM")
.setTimestamp()
const createTicketButton = new MessageButton()
.setID("ticketCreate")
.setStyle("blurple")
.setLabel("");
const closeTicketButton = new MessageButton()
.setID("ticketClose")
.setLabel("Close ticket")
.setStyle("red");
if(cmd == 'ticket-setup'){
message.channel.send({embed: setupEmbed, button: createTicketButton })
}
client.on('clickButton', async (button) => {
await button.clicker.fetch();
await button.reply.defer();
const user = button.clicker.user
if (button.id === 'ticketCreate') {
button.guild.channels.create(`ticket-${user.id}`, {
permissionOverwrites: [
{
id: user.id,
allow: ['SEND_MESSAGES', 'VIEW_CHANNEL'],
},
{
id: button.message.guild.roles.everyone,
deny: ['VIEW_CHANNEL'],
},
],
type: 'text',
}).then(async (channel) =>{
channel.send({embed: hiEmbed, button: closeTicketButton })
})
} else if(button.id == 'ticketClose'){
button.message.channel.delete()
}
});
}
}我使用包discord-buttons Docs链接
我试着将clickButton事件放在事件处理程序中,但是它没有工作,因为我得到了很多错误。即使在重新启动之后,我仍然如何使按钮工作?
发布于 2021-07-12 14:19:01
问题
在bot重新启动后,您的按钮无法工作,原因是您的client.on("clickButton")事件处理程序在“票证设置”命令的代码中。这意味着您的事件仅在bot重新启动后使用票证设置命令时才安装,或者换句话说,在bot启动后在此文件上调用execute()。
想想看:在调用client.on("clickButton")命令的execute()函数之前,不会到达您的execute()代码。这会给你带来多个问题。首先,如前所述,在bot启动后至少使用ticket-setup一次之后,才会处理ticket-setup事件。其次,这将在每次使用该命令时创建一个额外的事件处理程序。换句话说,如果要两次或更多地使用ticket-setup命令,则每次单击按钮时,clickButton处理程序中的代码将执行不止一次(在特定场景中,每次单击按钮将创建多张票证)。
解决方案
你所面临的问题有一个很简单的解决办法。只需将整个clickButton事件处理程序从execute()方法中移出即可。可能会将其移动到主server.js或bot.js文件中,并与client.on("ready")和client.on("message")事件处理程序一起使用。这将确保clickButton事件处理程序只设置一次,并且在bot启动时立即设置。
但是,请注意,您确实需要对clickButton事件处理程序进行一些轻微的添加,以确保它正常工作。您需要将hiEmbed和closeTicketButton的代码移动到client.on("clickButton")处理程序中。
在server.js中,根据问题中的代码,下面是这样的内容:
client.on('clickButton', async (button) => {
await button.clicker.fetch();
await button.reply.defer();
const user = button.clicker.user;
const hiEmbed = new Discord.MessageEmbed()
.addField(ticketMsg, "\n\nDo a.close or press the button to close the ticket")
.setColor("RANDOM")
.setTimestamp();
const closeTicketButton = new MessageButton()
.setID("ticketClose")
.setLabel("Close ticket")
.setStyle("red");
if (button.id === 'ticketCreate') {
button.guild.channels.create(`ticket-${user.id}`, {
permissionOverwrites: [
{
id: user.id,
allow: ['SEND_MESSAGES', 'VIEW_CHANNEL'],
},
{
id: button.message.guild.roles.everyone,
deny: ['VIEW_CHANNEL'],
},
],
type: 'text',
}).then(async (channel) =>{
channel.send({embed: hiEmbed, button: closeTicketButton })
})
} else if(button.id == 'ticketClose'){
button.message.channel.delete()
}
});您可能注意到了这方面的另一个问题:ticketMsg变量将不会被定义。你也需要做些改变来解决这个问题。我建议将ticketMsg的值保存到JSON文件或数据库中,并在client.on("clickButton")中访问该信息。如果此代码表示正确的票务系统,则无论是否使用此解决方案,您都需要这样做,否则每当bot重新启动时,您的用户将需要使用ticket-setup再次设置票务系统。
发布于 2021-07-10 14:45:19
我也有这个问题,但没有交互失败,我得到了不完整的按钮信息。
client.ws.on('INTERACTION_CREATE', interaction => {
//complete interaction
})按钮是触发此操作的交互,您可以检查这是斜杠命令还是使用interaction.data.custom_id的按钮(这可能是错误的,我无法测试)。如果它不是一个按钮,它将是未定义的,但是如果它是一个按钮,它将保存该按钮的自定义id。
https://stackoverflow.com/questions/68328062
复制相似问题