首页 > 解决方案 > 值被最新的人覆盖以请求机器人?

问题描述

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

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

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

机器人在 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);

标签: node.jsbotsdiscorddiscord.js

解决方案


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

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

推荐阅读