mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-06-17 01:40:28 +02:00
rewards: big feature sprint
This commit is contained in:
@@ -74,7 +74,7 @@ function saveConditions(data, callback) {
|
||||
data.forEach(function(reward) {
|
||||
conditions.push(reward.condition);
|
||||
rewardsPerCondition[reward.condition] = rewardsPerCondition[reward.condition] || [];
|
||||
rewardsPerCondition[reward.condition].push(reward.rid);
|
||||
rewardsPerCondition[reward.condition].push(reward.id);
|
||||
});
|
||||
|
||||
db.setAdd('conditions:active', conditions, callback);
|
||||
|
||||
@@ -1,7 +1,100 @@
|
||||
"use strict";
|
||||
|
||||
var rewards = {};
|
||||
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);
|
||||
});
|
||||
},
|
||||
function(next, ids) {
|
||||
filterIncompleteIDs(uid, ids, function(err, filtered) {
|
||||
if (!filtered || !filtered.length) {
|
||||
return back(err);
|
||||
}
|
||||
|
||||
next(err, filtered);
|
||||
});
|
||||
},
|
||||
function(next, ids) {
|
||||
getRewardDataByIDs(ids, next);
|
||||
},
|
||||
function(next, rewards) {
|
||||
async.filter(rewards, function(reward, next) {
|
||||
checkCondition(reward, method, next);
|
||||
}, function(err, eligible) {
|
||||
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) {
|
||||
db.getObject('condition:' + condition + ':rewards', callback);
|
||||
}
|
||||
|
||||
function filterIncompleteIDs(ids, callback) {
|
||||
// todo
|
||||
callback(false, ids);
|
||||
}
|
||||
|
||||
function getRewardDataByIDs(ids, callback) {
|
||||
ids.map(function(id) {
|
||||
return 'rewards:id:' + id;
|
||||
});
|
||||
|
||||
db.getObjects(ids, callback);
|
||||
}
|
||||
|
||||
function getRewardsByRewardData(rewards, callback) {
|
||||
rewards.map(function(reward) {
|
||||
return 'rewards:id:' + reward.id + ':rewards';
|
||||
});
|
||||
|
||||
db.getObjects(rewards, callback);
|
||||
}
|
||||
|
||||
function checkCondition(reward, method, callback) {
|
||||
method(function(err, value) {
|
||||
plugins.fireHook('filter:rewards.checkConditional:' + reward.conditional, {left: value, right: reward.value}, callback);
|
||||
});
|
||||
}
|
||||
|
||||
function giveRewards(uid, rewards, callback) {
|
||||
getRewardsByRewardData(rewards, function(err, rewardData) {
|
||||
async.each(rewards, function(reward, next) {
|
||||
var index = rewards.indexOf(reward);
|
||||
|
||||
plugins.fireHook('action:rewards.award:' + reward.rid, {uid: uid, reward: rewardData[index]});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
module.exports = rewards;
|
||||
Reference in New Issue
Block a user