mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-04-28 23:13:59 -04:00
Got work done on detecting achievements
This commit is contained in:
parent
699aa506f2
commit
37b47d35de
6 changed files with 60 additions and 26 deletions
app/schemas/models
server
achievements
plugins
|
@ -7,8 +7,9 @@ module.exports =
|
||||||
name: c.shortString({title: 'Display Name'})
|
name: c.shortString({title: 'Display Name'})
|
||||||
query: { $ref: 'mongoFindQuery' } # TODO make this happen
|
query: { $ref: 'mongoFindQuery' } # TODO make this happen
|
||||||
worth: { type: 'number' }
|
worth: { type: 'number' }
|
||||||
collection: { type: 'string' }
|
model: { type: 'string' }
|
||||||
description: { type: 'string' }
|
description: { type: 'string' }
|
||||||
|
userField: { type: 'string' }
|
||||||
proportionalTo:
|
proportionalTo:
|
||||||
type: 'string'
|
type: 'string'
|
||||||
description: 'For repeatables only. Denotes the field a repeatable achievement needs for its calculations'
|
description: 'For repeatables only. Denotes the field a repeatable achievement needs for its calculations'
|
||||||
|
|
|
@ -20,6 +20,10 @@ module.exports =
|
||||||
href: '/db/user/{($)}'
|
href: '/db/user/{($)}'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
achievementName:
|
||||||
|
type: 'string'
|
||||||
|
created:
|
||||||
|
type: 'date'
|
||||||
achievedAmount:
|
achievedAmount:
|
||||||
type: 'number'
|
type: 'number'
|
||||||
notified:
|
notified:
|
|
@ -10,4 +10,4 @@ AchievementSchema = new mongoose.Schema({
|
||||||
query: Object
|
query: Object
|
||||||
}, {strict: false})
|
}, {strict: false})
|
||||||
|
|
||||||
module.exports = Achievement = mongoose.model('achievements', AchievementSchema)
|
module.exports = Achievement = mongoose.model('achievement', AchievementSchema)
|
13
server/achievements/EarnedAchievement.coffee
Normal file
13
server/achievements/EarnedAchievement.coffee
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
mongoose = require 'mongoose'
|
||||||
|
jsonschema = require '../../app/schemas/models/earned_achievement'
|
||||||
|
|
||||||
|
EarnedAchievementSchema = new mongoose.Schema({
|
||||||
|
created:
|
||||||
|
type: Date
|
||||||
|
default: Date.now
|
||||||
|
notified:
|
||||||
|
type: Boolean
|
||||||
|
default: false
|
||||||
|
}, {strict:false})
|
||||||
|
|
||||||
|
module.exports = EarnedAchievement = mongoose.model('earned_achievement', EarnedAchievementSchema)
|
|
@ -1,8 +0,0 @@
|
||||||
mongoose = require 'mongoose'
|
|
||||||
jsonschema = require '../../../app/schemas/models/achievement_earned'
|
|
||||||
|
|
||||||
AchievementEarnedSchema = new mongoose.Schema({
|
|
||||||
user: Object
|
|
||||||
}, {strict:false})
|
|
||||||
|
|
||||||
module.exports = AchievementEarned = mongoose.model('achievements.earned', AchievementEarnedSchema)
|
|
|
@ -1,6 +1,7 @@
|
||||||
mongoose = require('mongoose')
|
mongoose = require('mongoose')
|
||||||
Achievement = require('../achievements/Achievement')
|
Achievement = require('../achievements/Achievement')
|
||||||
AchievementEarned = require '../achievements/earned/AchievementEarned'
|
EarnedAchievement = require '../achievements/EarnedAchievement'
|
||||||
|
LocalMongo = require '../../app/lib/LocalMongo'
|
||||||
|
|
||||||
achievements = {}
|
achievements = {}
|
||||||
|
|
||||||
|
@ -9,13 +10,13 @@ loadAchievements = ->
|
||||||
query = Achievement.find({})
|
query = Achievement.find({})
|
||||||
query.exec (err, docs) ->
|
query.exec (err, docs) ->
|
||||||
_.each docs, (achievement) ->
|
_.each docs, (achievement) ->
|
||||||
achievements[achievement.get 'collection'] = [] unless achievement.collection in achievements
|
category = achievement.get 'model'
|
||||||
achievements[achievement.get 'collection'].push achievement
|
achievements[category] = [] unless category of achievements
|
||||||
|
achievements[category].push achievement
|
||||||
|
|
||||||
loadAchievements()
|
loadAchievements()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# TODO make a difference between '$userID' and '$userObjectID' ?
|
# TODO make a difference between '$userID' and '$userObjectID' ?
|
||||||
module.exports = AchievablePlugin = (schema, options) ->
|
module.exports = AchievablePlugin = (schema, options) ->
|
||||||
checkForAchievement = (doc) ->
|
checkForAchievement = (doc) ->
|
||||||
|
@ -24,18 +25,41 @@ module.exports = AchievablePlugin = (schema, options) ->
|
||||||
for achievement in achievements[collectionName]
|
for achievement in achievements[collectionName]
|
||||||
console.log achievement.get 'name'
|
console.log achievement.get 'name'
|
||||||
|
|
||||||
fetched = {}
|
before = {}
|
||||||
|
|
||||||
schema.post 'init', (doc) ->
|
schema.post 'init', (doc) ->
|
||||||
fetched[doc.id] = doc
|
before[doc.id] = doc
|
||||||
collectionName = doc.constructor.modelName
|
|
||||||
for achievement in achievements[collectionName]
|
|
||||||
console.log achievement.get 'name'
|
|
||||||
|
|
||||||
schema.post 'save', (doc) ->
|
schema.post 'save', (doc) ->
|
||||||
collectionName = doc.constructor.modelName
|
isNew = not doc.isInit('_id')
|
||||||
docBefore = fetched?.doc.id
|
console.log doc
|
||||||
for achievement in achievements[collectionName]
|
console.log 'is new: ' + isNew
|
||||||
"placeholder"
|
|
||||||
# continue if init'd and already achieved
|
category = doc.constructor.modelName
|
||||||
# else if new doc validates, new achievement! make the fucker
|
console.log 'category: ' + category
|
||||||
|
|
||||||
|
if category of achievements
|
||||||
|
docObj = doc.toObject()
|
||||||
|
for achievement in achievements[category]
|
||||||
|
query = achievement.get('query')
|
||||||
|
isRepeatable = achievement.get('proportionalTo')?
|
||||||
|
console.log 'isRepeatable: ' + isRepeatable
|
||||||
|
alreadyAchieved = false
|
||||||
|
unless isNew
|
||||||
|
previousDocObj = before[doc.id].toObject()
|
||||||
|
alreadyAchieved = LocalMongo.matchesQuery previousDocObj, query
|
||||||
|
console.log 'Already achieved: ' + alreadyAchieved
|
||||||
|
console.log 'Matches: ' + LocalMongo.matchesQuery(docObj, query)
|
||||||
|
if LocalMongo.matchesQuery(docObj, query) and (isRepeatable or not alreadyAchieved)
|
||||||
|
userID = doc.get(achievement.get('userField'))
|
||||||
|
console.log 'Creating a new earned achievement for \'' + (achievement.get 'name') + '\' for ' + userID
|
||||||
|
earned = new EarnedAchievement(
|
||||||
|
user: if _.isObject userID then userID else new mongoose.Types.ObjectId(userID) # Standardize! Use ObjectId's
|
||||||
|
achievement: achievement._id
|
||||||
|
achievementName: achievement.get 'name'
|
||||||
|
)
|
||||||
|
console.log earned
|
||||||
|
earned.save (err, doc) ->
|
||||||
|
console.log 'so something went wrong' if err?
|
||||||
|
|
||||||
|
delete before[doc.id] unless isNew # This assumes everything we patch has a _id
|
||||||
|
return
|
Loading…
Add table
Add a link
Reference in a new issue