codecombat/scripts/setupAchievements.coffee

232 lines
6.4 KiB
CoffeeScript

database = require '../server/commons/database'
mongoose = require 'mongoose'
log = require 'winston'
async = require 'async'
### SET UP ###
do (setupLodash = this) ->
GLOBAL._ = require 'lodash'
_.str = require 'underscore.string'
_.mixin _.str.exports()
database.connect()
## Util
## Types
contributor = (obj) ->
_.extend obj, # This way we get the name etc on top
collection: 'users'
userField: '_id'
category: 'contributor'
### UNLOCKABLES ###
# Generally ordered according to user.stats schema
unlockableAchievements =
signup:
name: 'Signed Up'
description: 'Signed up to the most awesome coding game around.'
query: 'anonymous': false
worth: 10
collection: 'users'
userField: '_id'
category: 'miscellaneous'
difficulty: 1
recalculable: true
completedFirstLevel:
name: 'Completed 1 Level'
description: 'Completed your very first level.'
query: 'stats.gamesCompleted': $gte: 1
worth: 20
collection: 'users'
userField: '_id'
category: 'levels'
difficulty: 1
recalculable: true
completedFiveLevels:
name: 'Completed 5 Levels'
description: 'Completed 5 Levels.'
query: 'stats.gamesCompleted': $gte: 5
worth: 50
collection: 'users'
userField: '_id'
category: 'levels'
difficulty: 2
recalculable: true
completedTwentyLevels:
name: 'Completed 20 Levels'
description: 'Completed 20 Levels.'
query: 'stats.gamesCompleted': $gte: 20
worth: 500
collection: 'users'
userField: '_id'
category: 'levels'
difficulty: 3
recalculable: true
editedOneArticle: contributor
name: 'Edited an Article'
description: 'Edited your first Article.'
query: 'stats.articleEdits': $gte: 1
worth: 50
difficulty: 1
editedOneLevel: contributor
name: 'Edited a Level'
description: 'Edited your first Level.'
query: 'stats.levelEdits': $gte: 1
worth: 50
difficulty: 1
recalculable: true
editedOneLevelSystem: contributor
name: 'Edited a Level System'
description: 'Edited your first Level System.'
query: 'stats.levelSystemEdits': $gte: 1
worth: 50
difficulty: 1
recalculable: true
editedOneLevelComponent: contributor
name: 'Edited a Level Component'
description: 'Edited your first Level Component.'
query: 'stats.levelComponentEdits': $gte: 1
worth: 50
difficulty: 1
recalculable: true
editedOneThangType: contributor
name: 'Edited a Thang Type'
description: 'Edited your first Thang Type.'
query: 'stats.thangTypeEdits': $gte: 1
worth: 50
difficulty: 1
recalculable: true
submittedOnePatch: contributor
name: 'Submitted a Patch'
description: 'Submitted your very first patch.'
query: 'stats.patchesSubmitted': $gte: 1
worth: 50
difficulty: 1
recalculable: true
contributedOnePatch: contributor
name: 'Contributed a Patch'
description: 'Got your very first accepted Patch.'
query: 'stats.patchesContributed': $gte: 1
worth: 50
difficulty: 1
recalculable: true
acceptedOnePatch: contributor
name: 'Accepted a Patch'
description: 'Accepted your very first patch.'
query: 'stats.patchesAccepted': $gte: 1
worth: 50
difficulty: 1
recalculable: false
oneTranslationPatch: contributor
name: 'First Translation'
description: 'Did your very first translation.'
query: 'stats.totalTranslationPatches': $gte: 1
worth: 50
difficulty: 1
recalculable: true
oneMiscPatch: contributor
name: 'First Miscellaneous Patch'
description: 'Did your first miscellaneous patch.'
query: 'stats.totalMiscPatches': $gte: 1
worth: 50
difficulty: 1
recalculable: true
oneArticleTranslationPatch: contributor
name: 'First Article Translation'
description: 'Did your very first Article translation.'
query: 'stats.articleTranslationPatches': $gte: 1
worth: 50
difficulty: 1
recalculable: true
oneArticleMiscPatch: contributor
name: 'First Misc Article Patch'
description: 'Did your first miscellaneous Article patch.'
query: 'stats.totalMiscPatches': $gte: 1
worth: 50
difficulty: 1
recalculable: true
oneLevelTranslationPatch: contributor
name: 'First Level Translation'
description: 'Did your very first Level translation.'
query: 'stats.levelTranslationPatches': $gte: 1
worth: 50
difficulty: 1
recalculable: true
oneLevelMiscPatch: contributor
name: 'First Misc Level Patch'
description: 'Did your first misc Level patch.'
query: 'stats.levelMiscPatches': $gte: 1
worth: 50
difficulty: 1
recalculable: true
### REPEATABLES ###
repeatableAchievements =
simulatedBy:
name: 'Simulated ladder game'
description: 'Simulated a ladder game.'
query: 'simulatedBy': $gte: 1
worth: 1
collection: 'users'
userField: '_id'
category: 'miscellaneous'
difficulty: 1
proportionalTo: 'simulatedBy'
function:
kind: 'logarithmic'
parameters: # TODO tweak
a: 5
b: 1
c: 0
Achievement = require '../server/achievements/Achievement'
EarnedAchievement = require '../server/achievements/EarnedAchievement'
Achievement.find {}, (err, achievements) ->
achievementIDs = (achievement.get('_id') + '' for achievement in achievements)
EarnedAchievement.remove {achievement: $in: achievementIDs}, (err, count) ->
return log.error err if err?
log.info "Removed #{count} earned achievements that were related"
Achievement.remove {}, (err) ->
log.error err if err?
log.info 'Removed all achievements.'
log.info "Got #{Object.keys(unlockableAchievements).length} unlockable achievements"
log.info "and #{Object.keys(repeatableAchievements).length} repeatable achievements"
achievements = _.extend unlockableAchievements, repeatableAchievements
async.each Object.keys(achievements), (key, callback) ->
achievement = achievements[key]
log.info "Setting up '#{achievement.name}'..."
achievementM = new Achievement achievement
# What the actual * Mongoose? It automatically converts 'stats.edits' to a nested object
achievementM.set 'query', achievement.query
log.debug JSON.stringify achievementM.get 'query'
achievementM.save (err) ->
log.error err if err?
callback()
, (err) ->
log.error err if err?
log.info 'Finished setting up achievements.'
process.exit()