Получение данных из предыдущих команд - PullRequest
2 голосов
/ 20 октября 2019

Я пытался заставить Bio для моего Discord Bot сохранить то, что пользователь установил с помощью команды setBio, так как каждый раз, когда я сбрасывал бот, Bios тоже сбрасывался. Тем не менее, я придумал кое-что, что я не совсем уверен, как это сделать (если я вообще могу это сделать).

После перезагрузки бота и попытки использовать команду setBio дляВ первый раз бот просматривает историю сообщений и находит последний раз, когда этот человек использовал эту команду. Затем он использует args.slice(1) только для чтения аргументов для установки этого био. Затем бот скажет что-то вроде:

Я нашел предыдущую биографию, которая была установлена ​​ранее. Наберите yes, если вы хотите установить био на это:

Пример био

После этого, если пользователь наберет yes, будет использоваться эта биография. Для того, чтобы сделать его менее раздражающим, он сделал бы только, чтобы ПЕРВЫЙ раз кто-то изменил био после его сброса.

У меня есть только это, и я не знаю, как это будет вставлено в код. Что бы использовать, чтобы сделать это возможным?

Вот код, относящийся к этому вопросу:

     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;

1 Ответ

2 голосов
/ 21 октября 2019

Это возможно, но есть более практичные методы для решения вашей общей проблемы.

Чтобы ответить на исходный вопрос:

  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.

Таким образом, все пользовательские данные будут сохраняться, даже если ботвыключен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...