Got work done on detecting achievements

This commit is contained in:
Ruben Vereecken 2014-05-18 13:21:27 +02:00
parent 699aa506f2
commit 37b47d35de
6 changed files with 60 additions and 26 deletions

View file

@ -7,8 +7,9 @@ module.exports =
name: c.shortString({title: 'Display Name'})
query: { $ref: 'mongoFindQuery' } # TODO make this happen
worth: { type: 'number' }
collection: { type: 'string' }
model: { type: 'string' }
description: { type: 'string' }
userField: { type: 'string' }
proportionalTo:
type: 'string'
description: 'For repeatables only. Denotes the field a repeatable achievement needs for its calculations'

View file

@ -20,6 +20,10 @@ module.exports =
href: '/db/user/{($)}'
}
]
achievementName:
type: 'string'
created:
type: 'date'
achievedAmount:
type: 'number'
notified:

View file

@ -10,4 +10,4 @@ AchievementSchema = new mongoose.Schema({
query: Object
}, {strict: false})
module.exports = Achievement = mongoose.model('achievements', AchievementSchema)
module.exports = Achievement = mongoose.model('achievement', AchievementSchema)

View 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)

View file

@ -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)

View file

@ -1,6 +1,7 @@
mongoose = require('mongoose')
Achievement = require('../achievements/Achievement')
AchievementEarned = require '../achievements/earned/AchievementEarned'
EarnedAchievement = require '../achievements/EarnedAchievement'
LocalMongo = require '../../app/lib/LocalMongo'
achievements = {}
@ -9,13 +10,13 @@ loadAchievements = ->
query = Achievement.find({})
query.exec (err, docs) ->
_.each docs, (achievement) ->
achievements[achievement.get 'collection'] = [] unless achievement.collection in achievements
achievements[achievement.get 'collection'].push achievement
category = achievement.get 'model'
achievements[category] = [] unless category of achievements
achievements[category].push achievement
loadAchievements()
# TODO make a difference between '$userID' and '$userObjectID' ?
module.exports = AchievablePlugin = (schema, options) ->
checkForAchievement = (doc) ->
@ -24,18 +25,41 @@ module.exports = AchievablePlugin = (schema, options) ->
for achievement in achievements[collectionName]
console.log achievement.get 'name'
fetched = {}
before = {}
schema.post 'init', (doc) ->
fetched[doc.id] = doc
collectionName = doc.constructor.modelName
for achievement in achievements[collectionName]
console.log achievement.get 'name'
before[doc.id] = doc
schema.post 'save', (doc) ->
collectionName = doc.constructor.modelName
docBefore = fetched?.doc.id
for achievement in achievements[collectionName]
"placeholder"
# continue if init'd and already achieved
# else if new doc validates, new achievement! make the fucker
isNew = not doc.isInit('_id')
console.log doc
console.log 'is new: ' + isNew
category = doc.constructor.modelName
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