【问题标题】:How to delete an existing embed in DiscordJS (v12)如何删除 DiscordJS (v12) 中的现有嵌入
【发布时间】:2021-02-23 17:47:20
【问题描述】:

我正在开发一个小型私人 Discord 机器人(主要用于学习)
我一直在开发一个功能,其中机器人发送消息,用户发送响应,机器人将删除初始嵌入并跟进另一个嵌入。
(创建嵌入消息链来收集用户输入并从中构建最终结果)

到目前为止,这就是我的代码所包含的内容

const wait = 30000;
    let count;

    const embed = new Discord.MessageEmbed()
        .setColor('#9EFF9A')
        .setTitle('Question?')
        .setDescription('');

    message.channel.send(embed);
    message.channel.awaitMessages(m => m.author.id == message.author.id,
        { max: 1, time: `${wait}` }).then(collected => {
        message.delete(embed);
        count = collected.first().content;
            console.log(count);
    }).catch(() => {
        message.delete(embed);
        return message.reply('No reply after ' + `${wait / 1000}` + ' seconds, operation canceled.').then(m => {
            m.delete({ timeout: 15000 });
        });
    });

我尝试了message.delete(); 的各种迭代,但没有任何有用的结果,机器人通常最终会删除用户发送的命令消息以启动嵌入链。

我从一个朋友那里得到了一个建议,我最后也在网上看到了几次,内容如下:

.then(() => {
message.delete()
})

我想不出任何方法来将它实现到我当前的代码中。 我有什么误解吗?我对 DiscordJS 和 Javascript 很陌生,我的朋友确实提到 .then() 语句可能会变得非常棘手

我很感激能得到任何帮助!

【问题讨论】:

    标签: javascript discord.js


    【解决方案1】:

    您的代码非常接近于实现您想要的,除了您尝试删除您创建的 Embed 对象而不是嵌入的 Message 对象。这是一个可以满足您需要的细微调整:

    const wait = 30000;
    let count;
    
    const embed = new Discord.MessageEmbed()
        .setColor('#9EFF9A')
        .setTitle('Question?')
        .setDescription('');
    
    message.channel.send(embed).then(embedMessage => {
        embedMessage.channel.awaitMessages(m => m.author.id == message.author.id,
        { max: 1, time: wait }).then(collected => {
            embedMessage.delete();
            count = collected.first().content;
            console.log(count);
        }).catch(() => {
            embedMessage.delete();
            return message.reply('No reply after ' + (wait / 1000) + ' seconds, operation canceled.').then(m => {
                m.delete({ timeout: 15000 });
            });
        });
    })
    

    这里的秘密是在发送嵌入的方法上使用.then()。这使您可以获取已发送的嵌入的实际 Message 对象,然后您可以与之交互。现在您已经拥有了用于嵌入的Message 对象,您可以使用其方法直接与消息交互,例如delete()edit()

    【讨论】:

      【解决方案2】:
      .then(() => {
         message.delete()
      })
      

      由于您从未将消息作为参数传递而无法正常工作,因此您的嵌入在 .then() 的上下文中不存在

      您可以尝试使用.then()await 删除发送消息。

      然后方法

      // const embed = ...
      message.channel.send(embed).then(msg => {
         msg.delete();
      });
      

      等待方法

      // Make sure you're in an async function
      //const embed = ...
      const msg = await message.channel.send(msg);
      msg.delete();
      

      【讨论】:

        【解决方案3】:

        我不熟悉 discordjs,但据我了解,您在变量“message”下使用机器人创建了一条消息,该变量具有此处所示的属性: https://discord.js.org/#/docs/main/master/class/Message

        然后您使用该消息将嵌入发送到消息的频道。嵌入询问是一个问题,然后您等待随后的消息。然后,您想要获取第一个响应并将其放入 count 变量中。然后您要删除原始嵌入。如果这一切都是真的,我建议删除包含嵌入本身的原始消息,如下所示:

        message.channel.awaitMessages(m => m.author.id == message.author.id,
            { max: 1, time: `${wait}` }).then(collected => {
            message.delete();
            count = collected.first().content;
                console.log(count);
        })
        

        或者试试这个,但我认为这个方法行不通:

        message.channel.awaitMessages(m => m.author.id == message.author.id,
            { max: 1, time: `${wait}` }).then(collected => {
            embed.delete();
            count = collected.first().content;
                console.log(count);
        })
        

        我会查看这两页文档: https://discord.js.org/#/docs/main/master/class/Message?scrollTo=delete https://discord.js.org/#/docs/main/master/class/MessageEmbed

        欢迎来到 Stack Overflow,告诉我其中一项是否有效。

        【讨论】:

        • message 对象实际上不包含嵌入其中的消息。 message 对象是用户发送的消息,例如命令,而嵌入是机器人为响应该消息而发送的内容。 embed 对象也不是包含嵌入的消息,它本质上只是一个表示嵌入结构本身的 JSON 结构(即类似于 {description: "Desc", fields: [], "title": "Title"} 的东西)。获取包含嵌入的消息的最简单方法是在 message.channel.send(embed) 语句上使用 .then()await
        猜你喜欢
        • 2021-06-27
        • 2021-10-16
        • 2020-12-09
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        • 2020-11-22
        • 2021-11-24
        • 2020-12-27
        相关资源
        最近更新 更多