值会被最近请求机器人的人覆盖吗?

Values get overwritten by latest person to request the bot?

我制作了一个抽奖投票 discord 机器人,允许用户通过 DM 向机器人发送他们的姓名和抽奖金额。一旦他们设置了值,他们就可以通过 DMing !enter 开始抽奖活动。一旦发生这种情况,就会调用一个函数,然后启动一个 for 循环,for 循环将根据指定的输入数量 运行。由于获得抽奖券的服务需要一些时间,我还在 for 循环中添加了延迟(由于敏感 API 信息,代码已针对 SO Post 进行了编辑)

一旦完成,它就会将 DM 发送回最初向机器人发送 DM 的用户。我面临的问题是,如果多个用户同时发送 DM,或者当它从第一个 DM 运行ning 时,变量会被最新请求机器人的人覆盖。

我假设通过使用 Discord.js 机器人,每次用户 DM 都会创建脚本或节点进程的新实例?

机器人在 DMed 后调用的函数是否可以在主节点进程中创建一个新进程,这样它就不会被覆盖?

const Discord = require('discord.js');
const botconfig = require('./discordBotConfig.json');
const bot = new Discord.Client({disableEveryone: true});
const c = require('chalk');

// Chalk Theme
const ctx = new c.constructor({level: 2});
const error = c.red;
const waiting = c.magenta;
const success = c.green;
const discordBot = c.yellow;

// Current Raffles (API Link Later)
let activeRaffles = 'Raffle 1';

// User Parmas
let usrName = '';
let entryAmount = 0;

// Ticket
let raffleTicket = [];
let retryDelay = 3000;

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

// Enter
const enterIn = async () => {
    console.log('User name', usrName);
    raffleTicket.push(Math.random(0, 50));
}

// Init Raffle Entry
const raffleInit = async (entryAmount) => {
    for (let i = 0; i < entryAmount; i++) {
        enterIn();
        await sleep(retryDelay);
    }
    dmUser();
}

const dmUser = () => {
    // Discord Message Complete
    let botCompleteMsg = new Discord.RichEmbed()
    .setTitle('Finished!')
    .setColor('#25E37A')
    .addField('Name: ', usrName)
    .addField('Tickets: ', raffleTicket)
    .addField('Last Update: ', bot.user.createdAt);

    bot.fetchUser(userID).then((user) => {
        user.send(botCompleteMsg);
    });

    return; // End the application
}

// Discord Bot Setup
bot.on('ready', async () => {
    console.log(discordBot(`${bot.user.username} is Online!`));
    bot.user.setActivity('Entering Raffle');
});

bot.on('message', async message => {
    if (message.channel.type === 'dm') {

    let prefix = botconfig.prefix;
    let messageArray = message.content.split(' ');

    let cmd = messageArray[0];
        if (cmd === `${prefix}name`) {
            if (messageArray.length === 3) {
                userID = message.author.id;
                usrName = messageArray[1];
                entryAmount = messageArray[2];

                // Raffle summary
                let raffleSummary = new Discord.RichEmbed()
                .setTitle('Entry Summary')
                .setColor('#8D06FF')
                .addField('Name: ', usrName)
                .addField('Entry Amount: ', entryAmount)
                return message.author.send(raffleSummary), message.author.send('Type **!start** to begin entry or type **!set** again to set the entry details again.');
            }
        }

        if (cmd === `${prefix}enter`) {
            // Raffle summary
            let startMessage = new Discord.RichEmbed()
            .setTitle('Entering raffle!')
            .setDescription('Thanks for entering! :)')
            .setColor('#8D06FF')
            return message.author.send(startMessage), raffleInit(entryAmount);
        }

    }
});

bot.login(botconfig.token);

您可以使用 类 将您的用户数据存储在列表中。

var userData = [
{name: "sample#0000", entryNum: 0}
];