node.js - 值被最新的人覆盖以请求机器人?
问题描述
我制作了一个抽奖投票不和谐机器人,允许用户向机器人发送他们的姓名和抽奖条目数量。一旦他们设置了值,他们就可以通过 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);
解决方案
您可以将用户数据存储在包含类的列表中。
var userData = [
{name: "sample#0000", entryNum: 0}
];
推荐阅读
- c++ - 将异常从一个函数传递到另一个函数时出现未处理的异常
- nativescript - Nativescript Vue 使用 tns 预览失败
- python - 类型错误:“datetime.datetime”和“float”实例之间不支持“>=”
- spring-boot - Optaplanner 核心转储@ConditionEvaluator504f0cef2aeb46d49c660e07bfa907fd.evaluate
- bash - 通过从 XMP 文件中读取创建日期来修改图像创建日期的 Bash shell 脚本
- javascript - I'm having an issue with adding an "Auto-Moderating" feature on my Discord bot
- swift - 如何在 SwiftUI 中获取实际视图渲染的大小和位置?
- uwp - 如何并行编译/构建和打包 MSIX 项目?
- c# - 如何阻止我的角色在我的脚本中无限跳跃?
- python - 硒的网络抓取问题