mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-19 15:48:04 +01:00
359 lines
11 KiB
JavaScript
359 lines
11 KiB
JavaScript
// Generated by CoffeeScript 1.3.3
|
|
var content, derby, get, 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('/:uidParam?', function(page, model, _arg, next) {
|
|
var uidParam, userId;
|
|
uidParam = _arg.uidParam;
|
|
if (uidParam === 'privacy' || uidParam === 'terms') {
|
|
return next();
|
|
}
|
|
userId = model.get('_userId');
|
|
return model.subscribe("users." + userId, function(err, user) {
|
|
var guid, newUser, task, _i, _len, _ref1;
|
|
if (!user.get('id')) {
|
|
newUser = require('node.extend')(true, {}, 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);
|
|
}
|
|
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 (lvl * 100) / 5;
|
|
});
|
|
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 pathParts, poormanscron, setupSortable, step, tour, type, _i, _j, _len, _len1, _ref1, _ref2;
|
|
pathParts = window.location.toString().split('/');
|
|
$('#purl').val("" + pathParts[0] + "//" + pathParts[2] + "/" + (model.get('_userId')));
|
|
$('[rel=tooltip]').tooltip();
|
|
$('[rel=popover]').popover();
|
|
model.on('set', '*', function() {
|
|
$('[rel=tooltip]').tooltip();
|
|
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 != null) && passed.cron) {
|
|
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':
|
|
return list.push({
|
|
type: type,
|
|
text: text,
|
|
notes: '',
|
|
value: 0,
|
|
repeat: {
|
|
su: true,
|
|
m: true,
|
|
t: true,
|
|
w: true,
|
|
th: true,
|
|
f: true,
|
|
s: true
|
|
},
|
|
completed: false
|
|
});
|
|
case 'todo':
|
|
return list.push({
|
|
type: type,
|
|
text: text,
|
|
notes: '',
|
|
value: 0,
|
|
completed: false
|
|
});
|
|
}
|
|
};
|
|
exports.del = function(e, el) {
|
|
var history, result, task;
|
|
task = model.at(e.target);
|
|
history = task.get('history');
|
|
if (history && history.length > 2) {
|
|
if (task.get('value') < 0) {
|
|
result = confirm("Are you sure? Deleting this task will hurt you (to prevent deleting, then re-creating red tasks).");
|
|
if (result !== true) {
|
|
return;
|
|
} else {
|
|
task.set('type', 'habit');
|
|
scoring.score({
|
|
user: model.at('_user'),
|
|
task: task,
|
|
direction: 'down'
|
|
});
|
|
}
|
|
} else {
|
|
result = confirm("Are you sure you want to delete this task?");
|
|
if (result !== true) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
$('[rel=tooltip]').tooltip('hide');
|
|
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.toggleDay = function(e, el) {
|
|
var task;
|
|
task = model.at(e.target);
|
|
if (/active/.test($(el).attr('class'))) {
|
|
return task.set('repeat.' + $(el).attr('data-day'), false);
|
|
} else {
|
|
return task.set('repeat.' + $(el).attr('data-day'), true);
|
|
}
|
|
};
|
|
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, user, value, _ref3;
|
|
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);
|
|
}
|
|
};
|
|
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 daysPassed, lastCron, today;
|
|
today = new Date();
|
|
model.setNull('_user.lastCron', today);
|
|
lastCron = model.get('_user.lastCron');
|
|
daysPassed = helpers.daysBetween(lastCron, today);
|
|
if (daysPassed > 0) {
|
|
model.set('_user.lastCron', today);
|
|
return _(daysPassed).times(function(n) {
|
|
var tallyFor;
|
|
tallyFor = moment(lastCron).add('d', n);
|
|
return scoring.tally(model.at('_user'), tallyFor);
|
|
});
|
|
}
|
|
};
|
|
setTimeout(function() {
|
|
return poormanscron();
|
|
}, 2000);
|
|
setInterval(function() {
|
|
return poormanscron();
|
|
}, 3600000);
|
|
return exports.endOfDayTally = function(e, el) {
|
|
return scoring.tally(model);
|
|
};
|
|
});
|