【问题标题】:Getting Data from Previous Commands从以前的命令中获取数据
【发布时间】:2020-02-16 23:28:00
【问题描述】:

我一直在尝试为我的 Discord Bot 获取 Bio 以保存用户使用 setBio 命令设置的内容,因为每次我重置机器人时,Bios 也会重置。但是,我想出了一些我不完全确定该怎么做的事情(如果我能做到的话)。

在机器人重置并且有人第一次尝试使用setBio 命令后,机器人会查看消息历史记录并找到该人最后一次使用该命令的时间。然后它使用args.slice(1) 仅读取设置该生物的参数。然后机器人会说:

我找到了之前设置的以前的 Bio。输入yes,如果你想把你的简历设置成这样:

示例简介

之后,如果用户键入yes,则将使用该 Bio。为了让它不那么烦人,它只会在重置后第一次有人更改生物时这样做。

我只有那个,我不知道如何将它放入代码中。 什么可以让这成为可能?

这里有一些与这个问题相关的代码:

     case 'setBio':
        let newArr = args.slice(1)
        bio[message.author.id] = newArr
        message.channel.send('Your bio has been changed!')
            .then(msg => msg.delete(3000)); 
        break;
     case 'profile':
        if(!bio[message.author.id]) {
        return message.channel.send('Sorry, please set a bio with `!setBio` to view your profile!')
        } else {
        const embed = new Discord.RichEmbed()
            .setTitle('__' + message.author.username + '\'s Profile__')
            .addField('Bio:', bio[message.author.id].join(" "))
            .setColor(message.member.colorRole.color)
            .setThumbnail(message.author.avatarURL)
            message.channel.send(embed);
        }
        break;

【问题讨论】:

  • 为什么不将 bios 存储在数据库中,这样机器人是否被重置就无关紧要了?

标签: javascript github heroku discord.js


【解决方案1】:

这是可能的,但还有更实用的方法可以解决您的整体问题。

回答你原来的问题:

  1. 从频道中获取所有消息。

    TextChannel#messages 是一个包含频道中所有消息的属性。

  2. 只过滤掉调用该命令的用户发出的消息。

    Collection#filter(fn, thisArg) 是一种可以根据任何布尔返回函数fn 过滤出集合中的值的方法。

  3. 只过滤掉setBio 命令的使用。

    再次,我们将使用Collection#filter

  4. 从用户发出的消息集合中获取第一个值。

    Collection#last() 是一种获取集合中最后一个值的方法。

  5. 发送提示,询问用户是否要使用最后一个生物集。
  6. 等待用户响应。

    有很多方法可以做到这一点,但其中一种方法可以是创建另一个消息事件,然后等待用户回复“是”或“否”的消息。

所以,你可以使用这段代码:

case "setBio":
    let messages = message.channel.messages;
    let authorMessages = messages.filter(m => m.author.id === message.author.id);
    let setBioCommands = authorMessages.filter(m => m.content.startsWith(/*insert setBio command
                                                                           with prefix here*/);
    let firstBio = setBioCommands.last();
    // say user prompt, then wait for user to say yes.

但是,解决此问题的更好方法是将所有用户数据存储在单独的文件中,就像 @Snel23 所说的那样。

这样,所有用户数据都将保留,即使机器人已关闭。

【讨论】:

  • 谢谢!我只是对试图让 MongoDB 创建一个集群感到困惑(我在 Heroku 上托管她),而且我只是对除了主机名和端口之外要放入什么感到困惑。
  • @Squiddo 一个 MongoDB 实例对于一个宠物项目来说太过分了。如果你不打算把它变成一个非常大的项目,我建议你坚持使用 JSON 或类似的方法来简单。但是,这取决于您;这对 Mongo 来说也是很好的做法 :)
  • 嗯,我确实想做得更好。唯一的问题是,所有在线教程都对创建 MongoDB 集群没有任何帮助。我也很难找到保存 JSON 的教程..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 2010-10-20
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多