mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-27 17:45:40 -05:00
Add a couple scripts for resetting user progress and migrating course sessions to hero levels
This commit is contained in:
parent
ac0e21aa39
commit
7a317370b5
3 changed files with 88 additions and 6 deletions
|
@ -0,0 +1,46 @@
|
||||||
|
// Migrates course-kithgard-gates-style sessions to normal levels, if the user doesn't already have a session for those
|
||||||
|
// Usage:
|
||||||
|
// mongo <address>:<port>/<database> <script file> -u <username> -p <password>
|
||||||
|
|
||||||
|
var levelsDone = 0;
|
||||||
|
var levelsTotal = 0;
|
||||||
|
|
||||||
|
migrateCourseSessionsToNormalLevels();
|
||||||
|
|
||||||
|
function migrateCourseSessionsToNormalLevels() {
|
||||||
|
print("Grabbing all course-* levels...");
|
||||||
|
var courseLevels = db.levels.find({slug: {$regex: /^course-/}}, {original: 1, version: 1, slug: 1});
|
||||||
|
levelsTotal = courseLevels.count();
|
||||||
|
courseLevels.forEach(migrateSessionsForCourseLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
function migrateSessionsForCourseLevel(courseLevel) {
|
||||||
|
++levelsDone;
|
||||||
|
if (courseLevel.slug == 'course-defend-orge') return; // Haha
|
||||||
|
if (courseLevel.slug == 'course-winding-trail') return; // This one we actually keep the course- version
|
||||||
|
var heroLevel = db.levels.findOne({slug: courseLevel.slug.replace(/^course-/, '')}, {original: 1, version: 1, slug: 1, name: 1});
|
||||||
|
if (heroLevel)
|
||||||
|
print("Got", heroLevel.slug, "for", courseLevel.slug);
|
||||||
|
else {
|
||||||
|
print("No matching hero level for", courseLevel.slug);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var courseSessions = db.level.sessions.find({levelID: courseLevel.slug});
|
||||||
|
var sessionsTotal = courseSessions.count();
|
||||||
|
var sessionsDone = 0;
|
||||||
|
courseSessions.forEach(function(courseSession) {
|
||||||
|
var heroSession = db.level.sessions.findOne({
|
||||||
|
creator: courseSession.creator,
|
||||||
|
level: {original: heroLevel.original + '', majorVersion: heroLevel.version.major}
|
||||||
|
});
|
||||||
|
//print("Found hero session", !!heroSession, "for course level", courseLevel.slug, "for user", courseSession.creatorName, 'looking for hero level', heroLevel.original, heroLevel.version.major);
|
||||||
|
if (heroSession) return; // Already had one
|
||||||
|
courseSession.levelID = heroLevel.slug;
|
||||||
|
courseSession.levelName = heroLevel.name;
|
||||||
|
courseSession.level = {original: heroLevel.original + '', majorVersion: heroLevel.version.major};
|
||||||
|
db.level.sessions.save(courseSession);
|
||||||
|
if (!(++sessionsDone % 100)) {
|
||||||
|
print("Done", sessionsDone, "/", sessionsTotal, "sessions for", courseLevel.slug, "--", levelsDone, "/", levelsTotal, "levels done.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
34
scripts/resetUsersProgress.coffee
Normal file
34
scripts/resetUsersProgress.coffee
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
# Users can do this on their own on the account settings, so this script is for doing big batches of users.
|
||||||
|
|
||||||
|
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()
|
||||||
|
GLOBAL.tv4 = require('tv4').tv4
|
||||||
|
|
||||||
|
database.connect()
|
||||||
|
|
||||||
|
UserHandler = require '../server/users/user_handler'
|
||||||
|
User = require '../server/users/User'
|
||||||
|
|
||||||
|
userIDs = [
|
||||||
|
# Fill in userID strings here
|
||||||
|
]
|
||||||
|
|
||||||
|
User.find _id: {$in: (mongoose.Types.ObjectId(userID) for userID in userIDs)}, (err, users) ->
|
||||||
|
if users.length isnt userIDs.length
|
||||||
|
log.info "Only found #{users.length} users out of #{userIDs.length}. Got this right? Quitting conservatively."
|
||||||
|
process.exit()
|
||||||
|
log.info "Starting user progress reset for #{users.length} users..."
|
||||||
|
|
||||||
|
#async.parallel ((do(user) -> (cb) -> console.log("should reset progress for user: #{user._id}") or cb null) for user in users), (err) ->
|
||||||
|
async.parallel (((cb) -> UserHandler.constructor.resetProgressForUser(user, cb)) for user in users), (err) ->
|
||||||
|
log.error err if err?
|
||||||
|
log.info 'Finished resetting user accounts.' unless err?
|
||||||
|
process.exit()
|
|
@ -705,15 +705,17 @@ UserHandler = class UserHandler extends Handler
|
||||||
return @sendMethodNotAllowed res unless req.method is 'POST'
|
return @sendMethodNotAllowed res unless req.method is 'POST'
|
||||||
return @sendForbiddenError res unless userID and userID is req.user?._id + '' # Only you can reset your own progress
|
return @sendForbiddenError res unless userID and userID is req.user?._id + '' # Only you can reset your own progress
|
||||||
return @sendForbiddenError res if req.user?.isAdmin() # Protect admins from resetting their progress
|
return @sendForbiddenError res if req.user?.isAdmin() # Protect admins from resetting their progress
|
||||||
async.parallel [
|
@resetProgressForUser req.user, (err, results) =>
|
||||||
(cb) -> LevelSession.remove {creator: req.user._id + ''}, cb
|
|
||||||
(cb) -> EarnedAchievement.remove {user: req.user._id + ''}, cb
|
|
||||||
(cb) -> UserPollsRecord.remove {user: req.user._id + ''}, cb
|
|
||||||
(cb) -> req.user.update {points: 0, 'stats.gamesCompleted': 0, 'stats.concepts': {}, 'earned.gems': 0, 'earned.levels': [], 'earned.items': [], 'earned.heroes': [], 'purchased.items': [], 'purchased.heroes': [], spent: 0}, cb
|
|
||||||
], (err, results) =>
|
|
||||||
return @sendDatabaseError res, err if err
|
return @sendDatabaseError res, err if err
|
||||||
@sendSuccess res, result: 'success'
|
@sendSuccess res, result: 'success'
|
||||||
|
|
||||||
|
resetProgressForUser: (user, cb) ->
|
||||||
|
async.parallel [
|
||||||
|
(cb) -> LevelSession.remove {creator: user._id + ''}, cb
|
||||||
|
(cb) -> EarnedAchievement.remove {user: user._id + ''}, cb
|
||||||
|
(cb) -> UserPollsRecord.remove {user: user._id + ''}, cb
|
||||||
|
(cb) -> user.update {points: 0, 'stats.gamesCompleted': 0, 'stats.concepts': {}, 'earned.gems': 0, 'earned.levels': [], 'earned.items': [], 'earned.heroes': [], 'purchased.items': [], 'purchased.heroes': [], spent: 0}, cb
|
||||||
|
], cb
|
||||||
|
|
||||||
countEdits = (model, done) ->
|
countEdits = (model, done) ->
|
||||||
statKey = User.statsMapping.edits[model.modelName]
|
statKey = User.statsMapping.edits[model.modelName]
|
||||||
|
|
Loading…
Reference in a new issue