Discord.js - Проблема с "перезаписываемыми" обещаниями? - PullRequest
1 голос
/ 20 июня 2019

Хорошо, так что я практически закончил с этим Discord Bot, который я строил в JS.У меня проблема с новыми обещаниями, которые разрешаются до завершения старых, в результате чего неверная информация отправляется на неправильный сервер.

Например, моя команда "! Armory": Для этого требуется: (требуетсяАргумент item из принятых пользователем аргументов: xanax, morphine, blood bag, refill) Создайте request-promise.post -> если запрос успешен -> отправьте сообщение «loading ...» -> затем создайте отдельный request.post -> в случае успеха отредактируйте сообщение «загрузка ...» с результатами пользователей args.

Запрашиваемый HTTP содержит список пользователей из моей фракции Torn.com и элементы, которые они использовали из арсенала нашей фракции.Таким образом, сообщение, которое отправляется в редактировании, содержит всех пользователей и количество элементов, приведенных в аргументе, который они использовали.

Проблема, с которой я сталкиваюсь, состоит в том, когда кто-то выполняет команду дважды,на одном сервере или нет;результаты последнего использования команды выдаются всем.

Пример: пользователь на первом сервере использует команду, чтобы получить использование xanax, например, так: "! armory xanax" ... Пока обещание все еще разрешается, пользователь всервер 2 использует команду для получения использования морфина, например: "! armory morphine" ...

После того, как второе обещание разрешено, результаты морфина из команды, использованной на сервере 2, отправляются на оба сервера при редактированиисообщение.

Я ожидаю, что каждый сервер получит свои соответствующие результаты.

ПРАВКА, чтобы добавить код

let configJson = fs.readFileSync(`./config.json`);
let configObj = JSON.parse(configJson);
const server_api_get = 'https://torn.market:8443/getarmoury';
const server_api_update = 'https://torn.market:8443/updatearmoury';

updateData = {
    method: 'POST',
    url: server_api_update,
    form: {
        API_KEY: configObj.guilds[message.guild.id].key,
        end_date: endDate, // - End Date Dropdown on Faction page(Date furthest from today)
        start_date: startDate, // - Start Date Dropdown on Faction page(Date closest to today)
    },
};
//
getData = {
    method: 'POST',
    url: server_api_get,
    form: {
        API_KEY: configObj.guilds[message.guild.id].key,
        end_date: endDate, // - End Date Dropdown on Faction page(Date furthest from today)
        start_date: startDate, // - Start Date Dropdown on Faction page(Date closest to today)
    },
};

//
rp(updateData)
    .then(function (body) {
        // POST succeeded...
        updateJson = JSON.parse(body)
        console.log(body);
        if (updateJson.message === "Update Successful") {
            let responseTitle = '';
            console.log(` - New request -\nDate/Time: ${Date()}\n` + updateJson.message)
            embed.setColor('BLUE')
                .setTitle('`Loading Faction Armory use for ' + type + '......`')
            message.channel.send(embed).then(msg => {
                rp(getData)
                    .then(function (body) {
                        responseMsg = '';
                        embed.setColor(`GREEN`)
                            .setTitle(responseTitle)
                            .setDescription("```coffeescript\n" + responseMsg + "\n```")
                        msg.edit(embed)
                    })
                    .catch(function (err) {
                        // POST failed...
                        errJSON = JSON.stringify(err)
                        errObj = JSON.parse(errJSON)
                        console.log(`${errObj.name}\n${errObj.message}`);
                    });
            })
        } else {
            console.log(`Code: ${updateJson.error}\nError: ${updateJson.message}\nWrong API_KEY or no Faction API Access.`);
        }
    })

1 Ответ

0 голосов
/ 22 июня 2019

Тьфу, я идиот ...

Мне просто нужно было определить пустую переменную типа так же, как я делал responseTitle и responseMsg ....

let type = '';

'type' сделан из аргументов, заданных пользователем команды, например:

let responseTitle = '';

    if (newArgs.includes("xa")) {
        type = "Xanax";
        responseTitle = "?Xanax used from Armory?\n__*" + endDate + "*__ to __*" + startDate + "*__\n"
    } else if (newArgs.includes("morph")) {
        type = "Morphine";
        responseTitle = "?Morphine used from Armory?\n__*" + endDate + "*__ to __*" + startDate + "*__\n"
    } else if (newArgs.includes("bb") || newArgs.includes("blood bag") || newArgs.includes("blood") || newArgs.includes("bag")) {
        type = "BloodBag";
        responseTitle = "?Blood Bags used from Armory?\n__*" + endDate + "*__ to __*" + startDate + "*__\n"
    } else if (newArgs.includes("re")) {
        type = "Refill";
        responseTitle = "?Blood Bags refilled from Armory?\n__*" + endDate + "*__ to __*" + startDate + "*__\n"
    } else if (newArgs.includes("sf")) {
        type = "SFAK";
        responseTitle = "?Small First Aid Kits used from Armory?\n__*" + endDate + "*__ to __*" + startDate + "*__\n"
    } else if (newArgs == "fak") {
        type = "FAK";
        responseTitle = "?First Aid Kits used from Armory?\n__*" + endDate + "*__ to __*" + startDate + "*__\n"
    }
...