如何删除DiscordJS(v12)中的现有嵌入

时间:2020-11-11 18:04:44

标签: javascript discord.js

我正在开发一个小型的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()语句可能会非常棘手

感谢您能获得的任何帮助!

3 个答案:

答案 0 :(得分:0)

您的代码非常接近实现您想要的目标,只是您尝试删除创建的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())直接与邮件进行交互。

答案 1 :(得分:0)

.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();

答案 2 :(得分:0)

我对discordjs并不熟悉,但是据我了解,您使用bot在变量“ 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告诉我其中一项是否有效。