Как принимать несколько входных данных один за другим в — discord.js

#discord.js

#discord.js

Вопрос:

Как мне принимать входные данные от пользователя несколько раз, сохранять их, а затем отправлять вставку с входными данными?

  1. Пользователь вводит команду ?start
  2. Бот отвечает "Hi type your name here"
  3. Пользователь вводит имя, затем оно сохраняется в переменной
  4. Бот снова спрашивает "Type your favourite game now"
  5. Пользователь вводит игры, они снова сохраняются в переменной
  6. Затем переменные берутся, а затем преобразуются во встроенное
 const embed = new Discord.MessageEmbed()
    .setTitle("Hobbies")
    .setThumbnail(messsage.author.user.displayAvatarURL())
    .addDescription("<name>")
    .addDescription("<game>")
    .setTimestamp();
message.channel.send(embed);
 

Комментарии:

1. Покажите нам, что вы уже пробовали.

Ответ №1:

чтобы решить эту проблему, я создал небольшие «Скрипты», просто предопределенные процедуры для каждого состояния команды

script.js

 class Script {
    constructor (user, options, callback) {
        if (!user.send) {
            throw "Invalid Userhandle";
        }
        this.user = user;
        this.options = options;
        this.state = 0;
        this.callback = callback;
        this.responses = [];
        if (!!this.options.greeting) {
            this.user.send(this.options.greeting)
                .then()
                .catch(() => console.log(JSON.stringify(this.options.greeting)));
        }
    };
    interpretMessage(message) {
        if (!this.options.validator[this.state] || typeof this.options.validator[this.state] !== 'function') {
            if (!!this.callback) {
                this.callback(this.user, this.responses, false);
                return;
            } else {
                throw "Invalid User Gatherer Object";
            }
        }
        const [msg, steps] = this.options.validator[this.state](message, this.responses);
        this.user.send(msg)
            .then()
            .catch(() => console.error(msg));   
        if (steps > 0 || steps < 0) {
            if (!!this.responses amp;amp; !!this.responses[this.state]) {
                this.responses[this.state] = message;
            } else {
                this.responses.push(message);
            }
            this.state  = steps;
        }
        if (this.state >= this.options.validator.length) {
            this.callback(this.user, this.responses, false);
        }
    };
};

module.exports = Script;
 

Я использую этот метод только в личных сообщениях, это причина моего присвоения имени:
msg_script.js

 const Script = require('./classes/script');

let privateInfoGatherer = {};
let privateInfoGathererCallback = {};

function deletePrivateInfoGatherer(usr, out) {
    if (!usr || !usr.id) {
        return;
    }
    privateInfoGathererCallback[usr.id](usr, out);
    delete privateInfoGatherer[usr.id];
    delete privateInfoGathererCallback[usr.id];
};

function PrivateInfoGatherer (usr, opts, callback) {
    if (!usr || !usr.id || !opts || !callback) {
        return;
    }
    privateInfoGatherer[usr.id] = new Script(usr, opts, deletePrivateInfoGatherer);  
    privateInfoGathererCallback[usr.id] = callback;
};

function checkPrivateMessage(msg, args) {
    if (!msg || !msg.author || !privateInfoGatherer[msg.author.id] || msg.guild) {
        return;
    }
    privateInfoGatherer[msg.author.id].interpretMessage(msg.content);
};

module.exports = {
    provide: {
        PrivateInfoGatherer: PrivateInfoGatherer,
    },
    events: {
        message: checkPrivateMessage,
    }
};
 

мое окончательное использование выглядело примерно так:

 const ressource = require('./classes/ressource');

function interpretAuth(msg, args, provider) {
    const usr = msg.author;

    const stage_1 = (msg) => {
        let steps = msg.match("^([A-Za-z0-9_ ]{4,32})$") ? 1 : 0;
        let ret;
        if (msg === 'abort') {
            steps = 100; // will result in ending the script
        } else {
            ret = steps === 1 ? 'And now your Password' : 'Gimme your username';
        }
        return [ret, steps]; 
    };

    const stage_2 = (msg) => {
        let steps = msg.match("^([A-Za-z0-9\!\@\#\%\amp;\_\(\)\*\-\$\^\[\]] )$") ? 1 : 0;
        let ret;
        if (msg === 'abort') {
            steps = 100;
        } else {
            ret = steps === 1 ? 'I will check the Auth' : 'Your Password man...';
        }
        return [ret, steps]; 
    };

    const options = {
        greeting: 'Ok for Authrole i need your login, so first your username pls',
        validator: [
            stage_1,
            stage_2,
        ]
    };

    const callback = (usr, out) => {
        const [username, password] = out;
        // Now we have all, do what ever you want with it.
    };

    provider.PrivateInfoGatherer(usr, options, callback);
};