Fix race condition in name collector to close #14

by using a buffer and processing actions serially
This commit is contained in:
Lamp 2018-12-14 05:55:06 +00:00
parent 69240f21fa
commit bb3afc2bf6
1 changed files with 12 additions and 4 deletions

View File

@ -1,9 +1,15 @@
var nameCollector = module.exports = {
collection: mdbClient.db('heroku_jrtfvpd9').collection('ppl'),
buffer: [],
operationPending: false,
collect: async function (participant) {
if (config.testmode) return;
if (this.operationPending) { this.buffer.push(participant); return }
this.operationPending = true;
if (participant.name == "Anonymous" || participant.name == "Anonymoose") return;
var newMsg = function(continued){
var str = `__**${participant._id}**__${continued ? ' (continued)' : ''}\n${participant.name}`;
return dClient.channels.get(config.channels.name_collection).send(str);
@ -15,23 +21,25 @@ var nameCollector = module.exports = {
// update person
if (document.names.includes(participant.name)) return;
document.names.push(participant.name);
this.collection.updateOne({_id: participant._id}, {$set:{names: document.names}});
await this.collection.updateOne({_id: participant._id}, {$set:{names: document.names}});
let message = await dClient.channels.get(config.channels.name_collection).messages.fetch(document.discord_msg_id);
try {
await message.edit(message.content + ', ' + participant.name);
} catch(e) {
let message = await newMsg(true);
this.collection.updateOne({_id: participant._id}, {$set:{discord_msg_id: message.id}});
await this.collection.updateOne({_id: participant._id}, {$set:{discord_msg_id: message.id}});
}
} else {
// add new person
let message = await newMsg();
nameCollector.collection.insertOne({
await nameCollector.collection.insertOne({
_id: participant._id,
discord_msg_id: message.id,
names: [participant.name]
});
}
if (this.buffer.length) this.collect(this.buffer.shift());
else this.operationPending = false;
}
}