mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-28 10:06:08 -05:00
107 lines
3.2 KiB
JavaScript
107 lines
3.2 KiB
JavaScript
|
// Campaign completion counts
|
||
|
|
||
|
// Usage:
|
||
|
// mongo <address>:<port>/<database> <script file> -u <username> -p <password>
|
||
|
|
||
|
var courseCampaigns = ['intro', 'course-2', 'course-3', 'course-4'];
|
||
|
var individualCampaigns = ['dungeon', 'forest', 'desert', 'mountain'];
|
||
|
|
||
|
var scriptStartTime = new Date();
|
||
|
var startDay = '2015-11-08';
|
||
|
var endDay = '2015-11-15'; // Not inclusive
|
||
|
|
||
|
log("Dates: " + startDay + " to " + endDay);
|
||
|
|
||
|
var campaigns = getCampaigns(courseCampaigns);
|
||
|
// var campaigns = getCampaigns(individualCampaigns);
|
||
|
// printjson(campaigns);
|
||
|
|
||
|
for (var i = 0; i < campaigns.length; i++) {
|
||
|
var campaign = campaigns[i];
|
||
|
print(campaign.slug);
|
||
|
print("Total\tCampaign\tCourse\tLevel");
|
||
|
var completionCounts = getCompletionCounts(campaign.levelSlugs);
|
||
|
for (var j = 0; j < campaign.levelSlugs.length; j++) {
|
||
|
var levelSlug = campaign.levelSlugs[j];
|
||
|
if (completionCounts[levelSlug]) {
|
||
|
print(completionCounts[levelSlug].campaign + completionCounts[levelSlug].course,
|
||
|
'\t', completionCounts[levelSlug].campaign,
|
||
|
'\t', completionCounts[levelSlug].course,
|
||
|
'\t', levelSlug);
|
||
|
}
|
||
|
else {
|
||
|
print(0, '\t', 0, '\t', 0, '\t', levelSlug);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
log("Script runtime: " + (new Date() - scriptStartTime));
|
||
|
|
||
|
function log(str) {
|
||
|
print(new Date().toISOString() + " " + str);
|
||
|
}
|
||
|
|
||
|
function objectIdWithTimestamp(timestamp) {
|
||
|
// Convert string date to Date object (otherwise assume timestamp is a date)
|
||
|
if (typeof(timestamp) == 'string') timestamp = new Date(timestamp);
|
||
|
// Convert date object to hex seconds since Unix epoch
|
||
|
var hexSeconds = Math.floor(timestamp/1000).toString(16);
|
||
|
// Create an ObjectId with that hex timestamp
|
||
|
var constructedObjectId = ObjectId(hexSeconds + "0000000000000000");
|
||
|
return constructedObjectId
|
||
|
}
|
||
|
|
||
|
function getCampaigns(campaignSlugs) {
|
||
|
var campaigns = [];
|
||
|
var cursor = db.campaigns.find({slug: {$in: campaignSlugs}}, {slug: 1, levels: 1});
|
||
|
var allFree = 0;
|
||
|
var allpaid = 0;
|
||
|
while (cursor.hasNext()) {
|
||
|
var doc = cursor.next();
|
||
|
if (doc.slug === 'auditions') continue;
|
||
|
var campaign = {slug: doc.slug, levelSlugs: []};
|
||
|
for (var levelID in doc.levels) {
|
||
|
campaign.levelSlugs.push(doc.levels[levelID].slug);
|
||
|
}
|
||
|
campaigns.push(campaign);
|
||
|
}
|
||
|
|
||
|
campaigns.sort(function (a, b) {
|
||
|
if (campaignSlugs.indexOf(a.slug) < campaignSlugs.indexOf(b.slug)){
|
||
|
return -1;
|
||
|
}
|
||
|
return 1;
|
||
|
});
|
||
|
return campaigns;
|
||
|
}
|
||
|
|
||
|
function getCompletionCounts(levelSlugs) {
|
||
|
var startObj = objectIdWithTimestamp(ISODate(startDay + "T00:00:00.000Z"));
|
||
|
var endObj = objectIdWithTimestamp(ISODate(endDay + "T00:00:00.000Z"))
|
||
|
var cursor = db['level.sessions'].find({
|
||
|
$and:
|
||
|
[
|
||
|
{"state.complete": true},
|
||
|
{levelID: {$in: levelSlugs}},
|
||
|
{_id: {$gte: startObj}},
|
||
|
{_id: {$lt: endObj}}
|
||
|
]
|
||
|
}, {heroConfig: 1, levelID: 1});
|
||
|
|
||
|
var completionCounts = {};
|
||
|
while (cursor.hasNext()) {
|
||
|
var myDoc = cursor.next();
|
||
|
var levelID = myDoc.levelID;
|
||
|
|
||
|
if (!completionCounts[levelID]) completionCounts[levelID] = {campaign: 0, course: 0};
|
||
|
if (myDoc.heroConfig) {
|
||
|
completionCounts[levelID].campaign++;
|
||
|
}
|
||
|
else {
|
||
|
completionCounts[levelID].course++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return completionCounts;
|
||
|
}
|