You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
2.3 KiB
JavaScript

"use strict";
var rewards = {},
db = require('../database'),
plugins = require('../plugins'),
async = require('async');
rewards.checkConditionAndRewardUser = function(uid, condition, method, callback) {
async.waterfall([
function(next) {
isConditionActive(condition, function(err, isActive) {
if (!isActive) {
return back(err);
}
next(err);
});
},
function(next) {
getIDsByCondition(condition, function(err, ids) {
next(err, ids);
});
},
10 years ago
function(ids, next) {
filterIncompleteIDs(uid, ids, function(err, filtered) {
if (!filtered || !filtered.length) {
return back(err);
}
next(err, filtered);
});
},
10 years ago
function(ids, next) {
getRewardDataByIDs(ids, next);
},
10 years ago
function(rewards, next) {
async.filter(rewards, function(reward, next) {
10 years ago
if (!reward) {
return next(false);
}
checkCondition(reward, method, next);
}, function(eligible) {
10 years ago
if (!eligible) {
return next(false);
}
giveRewards(uid, eligible, next);
});
}
], back);
function back(err) {
if (typeof callback === 'function') {
callback(err);
}
}
};
function isConditionActive(condition, callback) {
db.isSetMember('conditions:active', condition, callback);
}
function getIDsByCondition(condition, callback) {
10 years ago
db.getSetMembers('condition:' + condition + ':rewards', callback);
}
10 years ago
function filterIncompleteIDs(uid, ids, callback) {
// todo
callback(false, ids);
}
function getRewardDataByIDs(ids, callback) {
db.getObjects(ids.map(function(id) {
return 'rewards:id:' + id;
}), callback);
}
function getRewardsByRewardData(rewards, callback) {
db.getObjects(rewards.map(function(reward) {
return 'rewards:id:' + reward.id + ':rewards';
}), callback);
}
function checkCondition(reward, method, callback) {
method(function(err, value) {
plugins.fireHook('filter:rewards.checkConditional:' + reward.conditional, {left: value, right: reward.value}, function(err, bool) {
callback(bool);
});
});
}
function giveRewards(uid, rewards, callback) {
getRewardsByRewardData(rewards, function(err, rewardData) {
async.each(rewards, function(reward, next) {
plugins.fireHook('action:rewards.award:' + reward.rid, {uid: uid, reward: rewardData[rewards.indexOf(reward)]});
});
});
}
module.exports = rewards;