Working on discord.js v14.9.0, an error TypeError: MessageActionRow is not a constructor keeps apearing

huangapple go评论80阅读模式
英文:

Working on discord.js v14.9.0, an error TypeError: MessageActionRow is not a constructor keeps apearing

问题

I see that you're encountering an error related to the MessageActionRow constructor not being recognized. This might be due to changes or updates in the discord.js library. Here's the translation of your code with potential corrections:

const { SlashCommandBuilder } = require('@discordjs/builders');
const { MessageActionRow, MessageButton, Client } = require('discord.js');

module.exports = {
    data: new SlashCommandBuilder()
        .setName('combate')
        .setDescription('Empieza un combate contra un slime.'),
    async execute(interaction) {
        // Variables del usuario
        let usuario_vida = 100;
        let usuario_ataque = 0;

        // Variables del slime
        let slime_vida = 50;
        let slime_ataque = 0;

        // Función para lanzar el dado
        function rollDice(dado) {
            return Math.floor(Math.random() * dado) + 1;
        }

        // Función para mostrar el resultado del combate
        function mostrarResultado(ataque, defensa, ataque_roll, defensa_roll) {
            let resultado = "";
            resultado += `El ${ataque} ha atacado y ha hecho ${ataque_roll} puntos de daño.\n`;
            resultado += `La ${defensa} ha recibido ${ataque_roll} puntos de daño y ahora tiene ${defensa_roll} puntos de vida.`;
            return resultado;
        }

        function mostrarTablaVidas(vida_usuario, vida_slime) {
            let tabla = "```";
            tabla += `Slime: ${vida_slime} puntos de vida\n`;
            tabla += "- - -\n- - -\n- - -\n- - -\n- - -\n`;
            tabla += `Usuario: ${vida_usuario} puntos de vida\n` + "```";
            return tabla;
        }

        // Función para actualizar la tabla de vidas
        async function actualizarTablaVidas(interaction, vida_usuario, vida_slime) {
            const tabla = mostrarTablaVidas(vida_usuario, vida_slime);
            const row = new MessageActionRow()
                .addComponents(
                    new MessageButton()
                        .setCustomId('ataque')
                        .setLabel('Atacar')
                        .setColor('PRIMARY')
                );
            await interaction.editReply({ content: tabla, components: [row] });
        }

        // Mostrar la tabla de vidas y el botón de ataque
        await actualizarTablaVidas(interaction, usuario_vida, slime_vida);

        // Registrar la función que se llamará cuando se haga clic en el botón de ataque
        const filter = i => i.customId === 'ataque' && i.user.id === interaction.user.id;
        const collector = interaction.channel.createMessageComponentCollector({ filter, time: 15000 });

        // Tiempo máximo de espera para el botón de ataque
        collector.on('end', async () => {
            await interaction.editReply({ content: "El combate ha terminado." });
        });

        collector.on('interactionCreate', async (buttonInteraction) => {
            if (buttonInteraction.isButton() && buttonInteraction.customId === 'ataque') {
                // El usuario ataca al slime
                const ataque_roll = rollDice(6);
                slime_vida -= ataque_roll;
                const resultado_usuario = mostrarResultado("usuario", "slime", ataque_roll, slime_vida);

                // El slime ataca al usuario
                const defensa_roll = rollDice(4);
                usuario_vida -= defensa_roll;
                const resultado_slime = mostrarResultado("slime", "usuario", defensa_roll, usuario_vida);

                // Actualizar la tabla de vidas
                await actualizarTablaVidas(buttonInteraction, usuario_vida, slime_vida);

                // Mostrar el resultado del ataque
                await buttonInteraction.followUp({ content: resultado_usuario + "\n" + resultado_slime });

                // Comprobar si el combate ha terminado
                if (usuario_vida <= 0) {
                    await buttonInteraction.followUp({ content: "Has perdido el combate." });
                    collector.stop();
                } else if (slime_vida <= 0) {
                    await buttonInteraction.followUp({ content: "Has ganado el combate." });
                    collector.stop();
                }
            }
        });
    },
};

I've replaced MessageButtonComponent with MessageButton and MessageActionRow remains the same. This should help resolve the issue you're facing.

英文:

I'm making a discord bot using discord.js v14.9.0. Actually, Im working on a combat command.

This is my code:

const { SlashCommandBuilder } = require(&#39;@discordjs/builders&#39;);
const { MessageActionRow, MessageButtonComponent, Discord } = require(&#39;discord.js&#39;);
module.exports = {
data: new SlashCommandBuilder()
.setName(&#39;combate&#39;)
.setDescription(&#39;Empieza un combate contra un slime.&#39;),
async execute(interaction) {
// Variables del usuario
let usuario_vida = 100;
let usuario_ataque = 0;
// Variables del slime
let slime_vida = 50;
let slime_ataque = 0;
// Funci&#243;n para lanzar el dado
function rollDice(dado) {
return Math.floor(Math.random() * dado) + 1;
}
// Funci&#243;n para mostrar el resultado del combate
function mostrarResultado(ataque, defensa, ataque_roll, defensa_roll) {
let resultado = &quot;&quot;;
resultado += `El ${ataque} ha atacado y ha hecho ${ataque_roll} puntos de da&#241;o.\n`;
resultado += `La ${defensa} ha recibido ${ataque_roll} puntos de da&#241;o y ahora tiene ${defensa_roll} puntos de vida.`;
return resultado;
}
function mostrarTablaVidas(vida_usuario, vida_slime) {
let tabla = &quot;```&quot;;
tabla += `Slime: ${vida_slime} puntos de vida\n`;
tabla += &quot;- - -\n- - -\n- - -\n- - -\n- - -\n&quot;;
tabla += `Usuario: ${vida_usuario} puntos de vida\n` + &quot;```&quot;;
return tabla;
}
// Funci&#243;n para actualizar la tabla de vidas
async function actualizarTablaVidas(interaction, vida_usuario, vida_slime) {
const tabla = mostrarTablaVidas(vida_usuario, vida_slime);
const row = new MessageActionRow()
.addComponents(
new MessageButtonComponent()
.setCustomId(&#39;ataque&#39;)
.setLabel(&#39;Atacar&#39;)
.setColor(&#39;PRIMARY&#39;)
);
await interaction.editReply({ content: tabla, components: [row] });
}
// Mostrar la tabla de vidas y el bot&#243;n de ataque
await actualizarTablaVidas(interaction, usuario_vida, slime_vida);
// Registrar la funci&#243;n que se llamar&#225; cuando se haga clic en el bot&#243;n de ataque
const filter = i =&gt; i.customId === &#39;ataque&#39; &amp;&amp; i.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, time: 15000 });
collector.on(&#39;interactionCreate&#39;, async (buttonInteraction) =&gt; {
if (buttonInteraction.isButton() &amp;&amp; buttonInteraction.customId === &#39;ataque&#39;) {
// El usuario ataca al slime
const ataque_roll = rollDice(6);
slime_vida -= ataque_roll;
const resultado_usuario = mostrarResultado(&quot;usuario&quot;, &quot;slime&quot;, ataque_roll, slime_vida);
// El slime ataca al usuario
const defensa_roll = rollDice(4);
usuario_vida -= defensa_roll;
const resultado_slime = mostrarResultado(&quot;slime&quot;, &quot;usuario&quot;, defensa_roll, usuario_vida);
// Actualizar la tabla de vidas
await actualizarTablaVidas(buttonInteraction, usuario_vida, slime_vida);
// Mostrar el resultado del ataque
await buttonInteraction.followUp({ content: resultado_usuario + &quot;\n&quot; + resultado_slime });
// Comprobar si el combate ha terminado
if (usuario_vida &lt;= 0) {
await buttonInteraction.followUp({ content: &quot;Has perdido el combate.&quot; });
collector.stop();
} else if (slime_vida &lt;= 0) {
await buttonInteraction.followUp({ content: &quot;Has ganado el combate.&quot; });
collector.stop();
}
}
});
// Tiempo m&#225;ximo de espera para el bot&#243;n de ataque
collector.on(&#39;end&#39;, async () =&gt; {
await interaction.editReply({ content: &quot;El combate ha terminado.&quot; });
});
},
};

And this is the error that keeps appearing in the console everythime I try to use de command:

TypeError: MessageActionRow is not a constructor
at actualizarTablaVidas (C:\Users\usago\OneDrive\Escritorio\RpgBot\commands\combate.js:43:25)
at Object.execute (C:\Users\usago\OneDrive\Escritorio\RpgBot\commands\combate.js:54:15)
at Client.<anonymous> (C:\Users\usago\OneDrive\Escritorio\RpgBot\index.js:33:17)
at Client.emit (node:events:513:28)
at InteractionCreateAction.handle (C:\Users\usago\OneDrive\Escritorio\RpgBot\node_modules\discord.js\src\client\actions\InteractionCreate.js:97:12)
at module.exports [as INTERACTION_CREATE] (C:\Users\usago\OneDrive\Escritorio\RpgBot\node_modules\discord.js\src\client\websocket\handlers\INTERACTION_CREATE.js:4:36)
at WebSocketManager.handlePacket (C:\Users\usago\OneDrive\Escritorio\RpgBot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:352:31)
at WebSocketShard.onPacket (C:\Users\usago\OneDrive\Escritorio\RpgBot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:494:22)
at WebSocketShard.onMessage (C:\Users\usago\OneDrive\Escritorio\RpgBot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:328:10)
at callListener (C:\Users\usago\OneDrive\Escritorio\RpgBot\node_modules\ws\lib\event-target.js:290:14)

No matter what I change, everytame it ends whit this error apearing in the console.

What is suposed to hapen when I use the command is that the table appears WITH the buttons for the user to atack.

答案1

得分: 1

你不再使用MessageActionRowMessageButtonComponent在Discord.js中。请将它们替换为ActionRowBuilderButtonBuilder

英文:

You no longer use MessageActionRow or MessageButtonComponent in Discord.js. Replace them with ActionRowBuilder and ButtonBuilder.

huangapple
  • 本文由 发表于 2023年4月13日 20:08:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/76005237.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定