node.js - 值被最新请求机器人的人覆盖吗?

标签 node.js bots discord discord.js

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

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

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

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

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}
];

关于node.js - 值被最新请求机器人的人覆盖吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54339012/

相关文章:

JavaScript 正则表达式 : successive matches

javascript - 如何为我的整个包启用严格模式但不为依赖启用?

javascript - Grunt - 如何从外部项目运行常见的外部任务

python - FFmpegPCMaudio 在我的服务器上不起作用,但它在我的计算机上工作

c# - Bot 框架发送不必要的错误消息

c# - 无法收到用户的任何 Discord 消息

python - Discord.ext.commands.errors.ExtensionNotFound : Extension 'cogs.help' could not be loaded

javascript - React Stripe Payment 创建客户和订单/送货地址等

python - DIScord 命令认为 bool 为 True

javascript - 如何提取参数的特定部分并将它们放入自己的变量中