mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-03-22 02:45:29 -04:00
The HeroVictoryModal now has the server check for and upsert any missing items, levels and heroes earned.
This commit is contained in:
parent
e8ed205038
commit
c4fdcab6fe
2 changed files with 51 additions and 38 deletions
app/views/play/level/modal
server/achievements
|
@ -64,37 +64,24 @@ module.exports = class HeroVictoryModal extends ModalView
|
|||
thangType.project = ['original', 'rasterIcon', 'name', 'soundTriggers']
|
||||
@thangTypes[thangTypeOriginal] = @supermodel.loadModel(thangType, 'thang').model
|
||||
|
||||
if achievementIDs.length
|
||||
url = "/db/earned_achievement?view=get-by-achievement-ids&achievementIDs=#{achievementIDs.join(',')}"
|
||||
earnedAchievements = new CocoCollection([], {
|
||||
url: url
|
||||
model: EarnedAchievement
|
||||
@newEarnedAchievements = []
|
||||
for achievement in @achievements.models
|
||||
continue unless achievement.completed
|
||||
ea = new EarnedAchievement({
|
||||
collection: achievement.get('collection')
|
||||
triggeredBy: @session.id
|
||||
achievement: achievement.id
|
||||
})
|
||||
earnedAchievements.sizeShouldBe = achievementIDs.length
|
||||
res = @supermodel.loadCollection(earnedAchievements, 'earned_achievements')
|
||||
@earnedAchievements = res.model
|
||||
@listenToOnce @earnedAchievements, 'sync', ->
|
||||
@newEarnedAchievements = []
|
||||
recorded = (earned.get('achievement') for earned in @earnedAchievements.length)
|
||||
for achievement in @achievements.models
|
||||
continue unless achievement.completed
|
||||
earnedObjects = []
|
||||
if achievement.id not in recorded
|
||||
ea = new EarnedAchievement({
|
||||
collection: achievement.get('collection')
|
||||
triggeredBy: @session.id
|
||||
achievement: achievement.id
|
||||
})
|
||||
ea.save()
|
||||
@newEarnedAchievements.push ea
|
||||
@listenToOnce ea, 'sync', ->
|
||||
if _.all((ea.id for ea in @newEarnedAchievements))
|
||||
@listenToOnce me, 'sync', ->
|
||||
@readyToContinue = true
|
||||
@updateSavingProgressStatus()
|
||||
me.fetch() unless me.loading
|
||||
else
|
||||
@readyToContinue = true
|
||||
ea.save()
|
||||
@newEarnedAchievements.push ea
|
||||
@listenToOnce ea, 'sync', ->
|
||||
if _.all((ea.id for ea in @newEarnedAchievements))
|
||||
@listenToOnce me, 'sync', ->
|
||||
@readyToContinue = true
|
||||
@updateSavingProgressStatus()
|
||||
me.fetch() unless me.loading
|
||||
|
||||
@readyToContinue = true if not @achievements.models.length
|
||||
|
||||
getRenderData: ->
|
||||
c = super()
|
||||
|
|
|
@ -61,19 +61,45 @@ class EarnedAchievementHandler extends Handler
|
|||
EarnedAchievement.findOne q, (err, earned) -> callback(err, earned)
|
||||
}, (err, { achievement, trigger, earned } ) =>
|
||||
return @sendDatabaseError(res, err) if err
|
||||
if earned
|
||||
return @sendSuccess(res, earned.toObject())
|
||||
if not achievement
|
||||
return @sendNotFoundError(res, 'Could not find achievement.')
|
||||
if not trigger
|
||||
else if not trigger
|
||||
return @sendNotFoundError(res, 'Could not find trigger.')
|
||||
if achievement.get('proportionalTo')
|
||||
else if earned
|
||||
achievementEarned = achievement.get('rewards')
|
||||
actuallyEarned = earned.get('earnedRewards')
|
||||
if not _.isEqual(achievementEarned, actuallyEarned)
|
||||
earned.set('earnedRewards', achievementEarned)
|
||||
earned.save((err) =>
|
||||
return @sendDatabaseError(res, err) if err
|
||||
@upsertNonNumericRewards(req.user, achievement, (err) =>
|
||||
return @sendDatabaseError(res, err) if err
|
||||
return @sendSuccess(res, earned.toObject())
|
||||
)
|
||||
)
|
||||
else
|
||||
@upsertNonNumericRewards(req.user, achievement, (err) =>
|
||||
return @sendDatabaseError(res, err) if err
|
||||
return @sendSuccess(res, earned.toObject())
|
||||
)
|
||||
else if achievement.get('proportionalTo')
|
||||
return @sendBadInputError(res, 'Cannot currently do this to repeatable docs...')
|
||||
EarnedAchievement.createForAchievement(achievement, trigger, null, (earnedAchievementDoc) =>
|
||||
@sendCreated(res, earnedAchievementDoc.toObject())
|
||||
)
|
||||
|
||||
else
|
||||
EarnedAchievement.createForAchievement(achievement, trigger, null, (earnedAchievementDoc) =>
|
||||
@sendCreated(res, earnedAchievementDoc.toObject())
|
||||
)
|
||||
)
|
||||
|
||||
upsertNonNumericRewards: (user, achievement, done) ->
|
||||
update = {}
|
||||
for rewardType, rewards of achievement.get('rewards') ? {}
|
||||
continue if rewardType is 'gems'
|
||||
if rewards.length
|
||||
update.$addToSet ?= {}
|
||||
update.$addToSet["earned.#{rewardType}"] = $each: rewards
|
||||
User.update {_id: user._id}, update, {}, (err, count) ->
|
||||
log.error err if err?
|
||||
done?(err)
|
||||
|
||||
getByAchievementIDs: (req, res) ->
|
||||
query = { user: req.user._id+''}
|
||||
|
|
Loading…
Reference in a new issue