mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-19 15:48:04 +01:00
360 lines
11 KiB
JavaScript
360 lines
11 KiB
JavaScript
// Generated by CoffeeScript 1.3.3
|
|
var content, derby, get, getHabits, helpers, ready, schema, scoring, view, _ref;
|
|
|
|
derby = require('derby');
|
|
|
|
_ref = derby.createApp(module), get = _ref.get, view = _ref.view, ready = _ref.ready;
|
|
|
|
derby.use(require('derby-ui-boot'));
|
|
|
|
derby.use(require('../../ui'));
|
|
|
|
content = require('./content');
|
|
|
|
scoring = require('./scoring');
|
|
|
|
schema = require('./schema');
|
|
|
|
helpers = require('./helpers');
|
|
|
|
helpers.viewHelpers(view);
|
|
|
|
get('/', function(page, model) {
|
|
var userId;
|
|
userId = model.get('_userId');
|
|
return model.fetch("users." + userId, function(err, user) {
|
|
var guid, newUser, task, _i, _len, _ref1;
|
|
if (user == null) {
|
|
newUser = schema.userSchema;
|
|
_ref1 = content.defaultTasks;
|
|
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
|
task = _ref1[_i];
|
|
guid = task.id = require('derby/node_modules/racer').uuid();
|
|
newUser.tasks[guid] = task;
|
|
switch (task.type) {
|
|
case 'habit':
|
|
newUser.habitIds.push(guid);
|
|
break;
|
|
case 'daily':
|
|
newUser.dailyIds.push(guid);
|
|
break;
|
|
case 'todo':
|
|
newUser.todoIds.push(guid);
|
|
break;
|
|
case 'reward':
|
|
newUser.rewardIds.push(guid);
|
|
}
|
|
}
|
|
model.set("users." + userId, newUser);
|
|
}
|
|
return getHabits(page, model, userId);
|
|
});
|
|
});
|
|
|
|
getHabits = function(page, model, userId) {
|
|
return model.subscribe("users." + userId, function(err, user) {
|
|
model.ref('_user', user);
|
|
model.set('_items', {
|
|
armor: content.items.armor[parseInt(user.get('items.armor')) + 1],
|
|
weapon: content.items.weapon[parseInt(user.get('items.weapon')) + 1],
|
|
potion: content.items.potion,
|
|
reroll: content.items.reroll
|
|
});
|
|
model.fn('_user._tnl', '_user.stats.lvl', function(lvl) {
|
|
return 50 * Math.pow(lvl, 2) - 150 * lvl + 200;
|
|
});
|
|
model.refList("_habitList", "_user.tasks", "_user.habitIds");
|
|
model.refList("_dailyList", "_user.tasks", "_user.dailyIds");
|
|
model.refList("_todoList", "_user.tasks", "_user.todoIds");
|
|
model.refList("_completedList", "_user.tasks", "_user.completedIds");
|
|
model.refList("_rewardList", "_user.tasks", "_user.rewardIds");
|
|
return page.render();
|
|
});
|
|
};
|
|
|
|
ready(function(model) {
|
|
var poormanscron, setupSortable, step, tour, type, _i, _j, _len, _len1, _ref1, _ref2;
|
|
model.set('_purl', window.location.origin + '/' + model.get('_userId'));
|
|
$('[rel=popover]').popover();
|
|
model.on('set', '*', function() {
|
|
return $('[rel=popover]').popover();
|
|
});
|
|
if (!(model.get('_mobileDevice') === true)) {
|
|
setupSortable = function(type) {
|
|
return $("ul." + type + "s").sortable({
|
|
dropOnEmpty: false,
|
|
cursor: "move",
|
|
items: "li",
|
|
opacity: 0.4,
|
|
scroll: true,
|
|
axis: 'y',
|
|
update: function(e, ui) {
|
|
var domId, id, item, to;
|
|
item = ui.item[0];
|
|
domId = item.id;
|
|
id = item.getAttribute('data-id');
|
|
to = $("ul." + type + "s").children().index(item);
|
|
return model.at("_" + type + "List").pass({
|
|
ignore: domId
|
|
}).move({
|
|
id: id
|
|
}, to);
|
|
}
|
|
});
|
|
};
|
|
_ref1 = ['habit', 'daily', 'todo', 'reward'];
|
|
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
|
type = _ref1[_i];
|
|
setupSortable(type);
|
|
}
|
|
}
|
|
tour = new Tour();
|
|
_ref2 = content.tourSteps;
|
|
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
|
|
step = _ref2[_j];
|
|
tour.addStep({
|
|
element: step.element,
|
|
title: step.title,
|
|
content: step.content,
|
|
placement: step.placement
|
|
});
|
|
}
|
|
tour.start();
|
|
model.on('set', '_user.tasks.*.completed', function(i, completed, previous, isLocal, passed) {
|
|
var direction, from, fromIds, task, to, toIds, _ref3, _ref4;
|
|
if (passed.cron != null) {
|
|
return;
|
|
}
|
|
direction = function() {
|
|
if (completed === true && previous === false) {
|
|
return 'up';
|
|
}
|
|
if (completed === false && previous === true) {
|
|
return 'down';
|
|
}
|
|
throw new Error("Direction neither 'up' nor 'down' on checkbox set.");
|
|
};
|
|
task = model.at("_user.tasks." + i);
|
|
scoring.score({
|
|
user: model.at('_user'),
|
|
task: task,
|
|
direction: direction()
|
|
});
|
|
if (task.get('type') === 'todo') {
|
|
_ref3 = direction() === 'up' ? ['todo', 'completed'] : ['completed', 'todo'], from = _ref3[0], to = _ref3[1];
|
|
_ref4 = ["_user." + from + "Ids", "_user." + to + "Ids"], from = _ref4[0], to = _ref4[1];
|
|
fromIds = model.get(from);
|
|
fromIds.splice(fromIds.indexOf(i), 1);
|
|
model.set(from, fromIds);
|
|
toIds = model.get(to);
|
|
toIds.push(i);
|
|
return model.set(to, toIds);
|
|
}
|
|
});
|
|
exports.addTask = function(e, el, next) {
|
|
var list, newModel, text;
|
|
type = $(el).attr('data-task-type');
|
|
list = model.at("_" + type + "List");
|
|
newModel = model.at('_new' + type.charAt(0).toUpperCase() + type.slice(1));
|
|
if (!(text = view.escapeHtml(newModel.get()))) {
|
|
return;
|
|
}
|
|
newModel.set('');
|
|
switch (type) {
|
|
case 'habit':
|
|
return list.push({
|
|
type: type,
|
|
text: text,
|
|
notes: '',
|
|
value: 0,
|
|
up: true,
|
|
down: true
|
|
});
|
|
case 'reward':
|
|
return list.push({
|
|
type: type,
|
|
text: text,
|
|
notes: '',
|
|
value: 20
|
|
});
|
|
case 'daily':
|
|
case 'todo':
|
|
return list.push({
|
|
type: type,
|
|
text: text,
|
|
notes: '',
|
|
value: 0,
|
|
completed: false
|
|
});
|
|
}
|
|
};
|
|
exports.del = function(e, el) {
|
|
var task;
|
|
task = model.at(e.target);
|
|
model.del('_user.tasks.' + task.get('id'));
|
|
return task.remove();
|
|
};
|
|
exports.clearCompleted = function(e, el) {
|
|
return _.each(model.get('_completedList'), function(task) {
|
|
model.del('_user.tasks.' + task.id);
|
|
return model.set('_user.completedIds', []);
|
|
});
|
|
};
|
|
exports.toggleTaskEdit = function(e, el) {
|
|
var hideId, toggleId;
|
|
hideId = $(el).attr('data-hide-id');
|
|
toggleId = $(el).attr('data-toggle-id');
|
|
$(document.getElementById(hideId)).hide();
|
|
return $(document.getElementById(toggleId)).toggle();
|
|
};
|
|
exports.toggleChart = function(e, el) {
|
|
var chart, chartSelector, data, date, hideSelector, historyPath, matrix, obj, options, readableDate, _k, _len2, _ref3;
|
|
hideSelector = $(el).attr('data-hide-id');
|
|
chartSelector = $(el).attr('data-toggle-id');
|
|
historyPath = $(el).attr('data-history-path');
|
|
$(document.getElementById(hideSelector)).hide();
|
|
$(document.getElementById(chartSelector)).toggle();
|
|
matrix = [['Date', 'Score']];
|
|
_ref3 = model.get(historyPath);
|
|
for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) {
|
|
obj = _ref3[_k];
|
|
date = new Date(obj.date);
|
|
readableDate = date.toISOString();
|
|
matrix.push([readableDate, obj.value]);
|
|
}
|
|
data = google.visualization.arrayToDataTable(matrix);
|
|
options = {
|
|
title: 'History',
|
|
backgroundColor: 'whiteSmoke'
|
|
};
|
|
chart = new google.visualization.LineChart(document.getElementById(chartSelector));
|
|
return chart.draw(data, options);
|
|
};
|
|
exports.buyItem = function(e, el, next) {
|
|
var hp, index, money, task, taskId, user, value, _ref3, _results;
|
|
user = model.at('_user');
|
|
money = user.get('stats.money');
|
|
_ref3 = [$(el).attr('data-type'), $(el).attr('data-value'), $(el).attr('data-index')], type = _ref3[0], value = _ref3[1], index = _ref3[2];
|
|
if (money < value) {
|
|
return;
|
|
}
|
|
user.set('stats.money', money - value);
|
|
if (type === 'armor') {
|
|
user.set('items.armor', index);
|
|
return model.set('_items.armor', content.items.armor[parseInt(index) + 1]);
|
|
} else if (type === 'weapon') {
|
|
user.set('items.weapon', index);
|
|
return model.set('_items.weapon', content.items.weapon[parseInt(index) + 1]);
|
|
} else if (type === 'potion') {
|
|
hp = user.get('stats.hp');
|
|
hp += 15;
|
|
if (hp > 50) {
|
|
hp = 50;
|
|
}
|
|
return user.set('stats.hp', hp);
|
|
} else if (type === 'reroll') {
|
|
_results = [];
|
|
for (taskId in user.get('tasks')) {
|
|
task = model.at('_user.tasks.' + taskId);
|
|
if (task.get('type') !== 'reward') {
|
|
_results.push(task.set('value', 0));
|
|
} else {
|
|
_results.push(void 0);
|
|
}
|
|
}
|
|
return _results;
|
|
}
|
|
};
|
|
exports.vote = function(e, el, next) {
|
|
var direction, task, user;
|
|
direction = $(el).attr('data-direction');
|
|
if (direction === 'true/') {
|
|
direction = 'up';
|
|
}
|
|
if (direction === 'false/') {
|
|
direction = 'down';
|
|
}
|
|
user = model.at('_user');
|
|
task = model.at($(el).parents('li')[0]);
|
|
return scoring.score({
|
|
user: user,
|
|
task: task,
|
|
direction: direction
|
|
});
|
|
};
|
|
exports.revive = function(e, el) {
|
|
var stats;
|
|
stats = model.at('_user.stats');
|
|
stats.set('hp', 50);
|
|
stats.set('lvl', 1);
|
|
stats.set('exp', 0);
|
|
stats.set('money', 0);
|
|
model.set('_user.items.armor', 0);
|
|
model.set('_user.items.weapon', 0);
|
|
model.set('_items.armor', content.items.armor[1]);
|
|
return model.set('_items.weapon', content.items.weapon[1]);
|
|
};
|
|
exports.poormanscron = poormanscron = function() {
|
|
var DAY, daysPassed, lastCron, n, today, _k, _results;
|
|
model.setNull('_user.lastCron', new Date());
|
|
lastCron = new Date((new Date(model.get('_user.lastCron'))).toDateString());
|
|
today = new Date((new Date).toDateString());
|
|
DAY = 1000 * 60 * 60 * 24;
|
|
daysPassed = Math.floor((today.getTime() - lastCron.getTime()) / DAY);
|
|
if (daysPassed > 0) {
|
|
model.set('_user.lastCron', today);
|
|
_results = [];
|
|
for (n = _k = 1; 1 <= daysPassed ? _k <= daysPassed : _k >= daysPassed; n = 1 <= daysPassed ? ++_k : --_k) {
|
|
console.log({
|
|
today: today,
|
|
lastCron: lastCron,
|
|
daysPassed: daysPassed,
|
|
n: n
|
|
}, "[debug] Cron (" + today + ", " + n + ")");
|
|
_results.push(scoring.tally(model));
|
|
}
|
|
return _results;
|
|
}
|
|
};
|
|
poormanscron();
|
|
setInterval((function() {
|
|
return poormanscron();
|
|
}), 3600000);
|
|
exports.endOfDayTally = function(e, el) {
|
|
return scoring.tally(model);
|
|
};
|
|
exports.updateSchema = function(e, el) {
|
|
return schema.updateSchema(model);
|
|
};
|
|
exports.shortcuts = function(e) {
|
|
var code, command;
|
|
if (!(e.metaKey || e.ctrlKey)) {
|
|
return;
|
|
}
|
|
code = e.which;
|
|
if (!(command = ((function() {
|
|
switch (code) {
|
|
case 66:
|
|
return 'bold';
|
|
case 73:
|
|
return 'italic';
|
|
case 32:
|
|
return 'removeFormat';
|
|
case 220:
|
|
return 'removeFormat';
|
|
default:
|
|
return null;
|
|
}
|
|
})()))) {
|
|
return;
|
|
}
|
|
document.execCommand(command, false, null);
|
|
if (e.preventDefault) {
|
|
e.preventDefault();
|
|
}
|
|
return false;
|
|
};
|
|
document.execCommand('useCSS', false, true);
|
|
return document.execCommand('styleWithCSS', false, false);
|
|
});
|