当前位置: 首页 > 知识库问答 >
问题:

Discord机器人,与RichEmbeddes有问题

商柏
2023-03-14

我对Javascript了解不多,所以请耐心听我说。

所以,我想为我的不和谐机器人发出命令。基本上,我想发生的是,当你发布“!记录”,我想让机器人发送一个RichEmbed与2个选项,你可以选择。

if (message.content.startsWith(config.prefix + 'records')) {
  const embed = new Discord.RichEmbed()
    .setTitle('D E I C I D E Records')
    .setAuthor('D E I C I D E', 'https://cdn.discordapp.com/attachments/430238345826664448/430504575502385154/logo.png')
    .setColor(3447003)
    .setDescription('Please select an option.')
    .setTimestamp()
    .addField('1. Raid Wins', 'Respond with "1" for Raid Wins.')
    .addField('2. Defense Wins', 'Respond with "2" for Defense Wins.')

message.channel.send({embed})

我已经把那部分搞定了。这正是我想要的。它发送带有两个选项的RichEmbed。

接下来我想做的是,当您发送“1”或“2”时,我希望Bot回复正确的记录。这是我不能理解的部分。以下是所有代码:

if (message.content.startsWith(config.prefix + 'records')) {
  const embed = new Discord.RichEmbed()
    .setTitle('D E I C I D E Records')
    .setAuthor('D E I C I D E', 'https://cdn.discordapp.com/attachments/430238345826664448/430504575502385154/logo.png')
    .setColor(3447003)
    .setDescription('Please select an option.')
    .setTimestamp()
    .addField('1. Raid Wins', 'Respond with "1" for Raid Wins.')
    .addField('2. Defense Wins', 'Respond with "2" for Defense Wins.')

    message.channel.send({embed})
    message.channel.awaitMessages(response => response.content === '1', {
      max: 1,
      time: 10000,
      errors: ['Ran out of time!'],
    })
    message.channel.send(drecords.RaidWins)
      message.channel.awaitMessages(response => response.content === '2', {
        max: 1,
        time: 10000,
        errors: ['Ran out of time!']
    })
    message.channel.send(drecords.DefenseWins)
} else

有人能概括一下我做错了什么吗?

此外,我希望能够说出一个简单的命令来更新记录,而不必进入机器人的文件并手动执行。

if (message.content.startsWith(config.prefix + 'updateraids')) {
  let newRecords = message.content.split(" ").slice(1, 2)[0];
  drecords.RaidWins = newRecords;

  fs.writeFile('./drecords.json', JSON.stringify(drecords), (err) => console.error);
} else

if (message.content.startsWith(config.prefix + 'updatedefenses')) {
  let newRecords = message.content.split(" ").slice(1, 2)[1];
  drecords.DefenseWins = newRecords;

  fs.writeFile('./drecords.json', JSON.stringify(drecords), (err) => console.error);
}

目前,当你说这些命令中的任何一个,然后在后面说一些文本,例如,“!更新防御系统DefenseWin2",它替换第一个字符串(DefenseWin1),而不是在机器人的文件中添加另一个。我将如何删除一个条目而不是添加一个条目?抱歉,如果这里有点太多,我想把它们都挤到一个帖子里,因为这都是相关的。

我做了好几个小时的研究,研究了其他的问题,讨论了一些不和谐的问题。js和《傻瓜指南》YouTube教程,但运气不好。

这里的任何帮助都将不胜感激。

共有2个答案

太叔正文
2023-03-14

如果查看文档的等待消息部分中的示例,您需要将发送响应的代码部分放在中。然后

差不多

message.channel.awaitMessages(response => response.content === '1', {
  max: 1,
  time: 10000,
  errors: ['Ran out of time!'],
})
.then(message.channel.send(drecords.RaidWins));

message.channel.awaitMessages(response => response.content === '2', {
    max: 1,
    time: 10000,
    errors: ['Ran out of time!']
})
.then(message.channel.send(drecords.DefenseWins));

关于文件问题,你能详细说明一下文件的格式和命令的外观吗?

白彦
2023-03-14

您没有正确使用waitingmessages。您只需要一个,而不是两个或更多的案件。过滤器将检查消息是1还是2。下面是您的代码应该是什么样子。我还修复了您的“超时”错误处理程序。

client.on("message", message => {
    if (message.content.startsWith("/records")) {
        const embed = new Discord.RichEmbed()
        .setTitle('D E I C I D E Records')
        .setAuthor('D E I C I D E', 'https://cdn.discordapp.com/attachments/430238345826664448/430504575502385154/logo.png')
        .setColor(3447003)
        .setDescription('Please select an option.')
        .setTimestamp()
        .addField('1. Raid Wins', 'Respond with "1" for Raid Wins.')
        .addField('2. Defense Wins', 'Respond with "2" for Defense Wins.');
        message.channel.send({embed})

        message.channel.awaitMessages(response => (response.content === '1' || response.content === "2"), {
            max: 1,
            time: 10000,
            errors: ['time']
        }).then(mg => {
            if (mg.first().content === "1"){ //Have to use .first() because mg is a Collection
                message.channel.send(drecords.RaidWins);
            }else if (mg.first().content === "2"){
                message.channel.send(drecords.DefenseWins);
            }
        }).catch((err) => {
            message.channel.send("Ran out of time!");
        })
    }
})

至于你的第二个问题,当你使用. WriteFile时,你实际上是在覆盖这个文件。你会想要使用appendFile。但是,您正在使用JSON。您可以简单地导入文件(需要它)并更新它。如果这是你想要的,我建议你把json文件改成这样。

{
    "RaidWins": 0,
    "DefenseWins": 0
}

然后导入和更新会像这样

let records = require("./drecords.json");
records.RaidWins += 1; //adding one to the wins

fs.writeFile("./drecords.json", JSON.Stringify(records), err => console.error);
 类似资料:
  • 有没有可能让我的不和谐机器人发送消息,而不必在不和谐中键入命令?相反,我想从我的应用程序内部触发它。 上面的代码给出了一个属性错误:'NoneType'对象没有属性'send'

  • 直到最近,我的Discord机器人一直工作得很好,我没有对代码做任何更改,它与工作时处于相同的状态。但是出于某种原因,现在当我尝试通过控制台启动bot时(在我的情况下): 节点my-discord-bot.js 它什么也不做,没有错误,只是空白,我应该收到一个确认,说‘准备好了!’我的机器人应该上线,但这一切都不会发生。 下面是我用来启动我的bot(直到最近才开始工作)的代码: 我真的不知道问题出

  • 我在创建一个基本的discord机器人(用于播放音乐)时遇到了一些错误。我主要依赖于文档——我想我复制并粘贴了discord中的某些代码行。“断章取义”的js文档示例。但我不知道它们可能是什么,因为我对编程还是很陌生。 我安装并导入了所有必要的依赖项,所以这不是问题所在。我的机器人工作正常(收听和回复MSG)。 这是与音乐功能相关的代码 这是我得到的错误: 难道是: 机器人需要先进入通道?(这意味

  • 我是一个初学者程序员(或者在我看来是这样),我需要帮助在音乐机器人中实现一个队列。 目前,只有当队列中有一首歌时,队列才能正常工作。如果有更多的歌曲,那么递归开始(在=wait serverQueue(语音,消息)之后从def play开始并等待play(queue.pop(0),语音,消息)从队列开始),并且所有歌曲只是跳过。 我试图以不同的方式解决这个问题,例如,引入了第二个变量,但这并没有带

  • 我正在尝试为我们的FiveM服务器创建一个discord社区bot,用于处理discord角色。我希望bot限制ROLECHANNEL,因此只能发布角色命令。我希望删除其他垃圾,以便频道保持干净。 命令正在工作,角色已经分配,但是机器人也会触发为什么?

  • 代码: 当我使用离开命令时,机器人仍然停留在语音通道中。请帮帮我T-T