codecombat/scripts/migrate-from-firebase.js
2014-01-03 10:32:13 -08:00

132 lines
3.3 KiB
JavaScript

// dump me into the console of a codecombat page or the dev server
// and I will migrate various playing data from firebase to mongodb.
var d = {};
d.sessionsToDo = [];
LevelSession = require('models/LevelSession');
d.codeLoading = {};
d.tasks = 0;
function go() {
if(d.sessionsToDo.length) {
doOne();
}
else {
fetchMore();
}
}
function doOne() {
var session = d.sessionsToDo.pop();
var host = 'https://codecombat.firebaseio.com/play/level/';
host += session.levelID + '/' + session._id;
// console.log('DOING:', session.levelID + '/' + session._id);
var fireRef = new Firebase(host);
fireRef.once('value', function(snapshot) {
window.snapshot = snapshot;
d.patch = {};
patchIt(session._id, snapshot);
});
}
function patchIt(sessionID, snapshot) {
var val = snapshot.val();
if(!val) {
console.log('miss');
task = {
ref: snapshot.ref(),
sessionID: sessionID,
patch: { code: { 0:0 }}
}
d.missed = true;
return finishTask(task);
}
window.val = val;
d.patch = {};
if(val.chat) {
d.patch.chat = [];
for(var i in val.chat) { d.patch.chat.push(val.chat[i]); }
delete val.chat;
}
if(val.players) {
d.patch.players = val.players;
delete val.players;
}
if(val.scripts) {
delete val.scripts;
}
for(var thangName in val) {
var thang = val[thangName];
for(var spellName in thang) {
// console.log('Load code from', snapshot.ref().toString(), 'for', thangName, spellName);
var aceEl = $('<div></div>');
$('body').append(aceEl);
var aceEditor = ace.edit(aceEl[0]);
firepad = Firepad.fromACE(snapshot.ref().child(thangName+'/'+spellName), aceEditor);
var task = {
aceEl: aceEl,
aceEditor: aceEditor,
spellName: spellName,
thangName: thangName,
firepad: firepad,
patch: d.patch,
sessionID: sessionID,
ref: snapshot.ref()
};
d.tasks += 1;
firepad.on('ready', (function(task) { return function() { codeLoaded(task); } })(task));
}
}
// console.log('Made', d.tasks, 'tasks');
if (!d.tasks) {
task = {
patch: d.patch,
sessionID: sessionID,
ref: snapshot.ref()
};
finishTask(task);
}
// d.patch.code = val;
}
function codeLoaded(task) {
// console.log('------------------\nLoaded code:\n', task.aceEditor.getValue());
if(!task.patch.code) task.patch.code = {};
if(!task.patch.code[task.thangName]) task.patch.code[task.thangName] = {};
task.patch.code[task.thangName][task.spellName] = task.aceEditor.getValue();
// cleanup this task
task.aceEditor.destroy();
task.firepad.dispose();
task.aceEl.remove();
d.tasks -= 1;
if(d.tasks === 0) {
finishTask(task);
// console.log('We got it all', task.patch);
}
}
function finishTask(task) {
var session = new LevelSession({_id:task.sessionID});
window.session = session;
task.ref.remove();
session.save(task.patch, {patch:true});
// session.once('sync', function() { console.log('saved'); } );
session.once('sync', function() { setTimeout(go, 1); } )
}
function fetchMore() {
console.log('\n\nFETCHING MORE TO DO');
$.ajax({
url:'/admin/sessions_to_do?level=munchkin-masher',
success: function(res) {
d.sessionsToDo = res;
setTimeout(go, 1);
}
});
}
go();