diff --git a/website/client/js/controllers/rootCtrl.js b/website/client/js/controllers/rootCtrl.js index 01b55b8ea7..1cd06e865d 100644 --- a/website/client/js/controllers/rootCtrl.js +++ b/website/client/js/controllers/rootCtrl.js @@ -289,7 +289,7 @@ habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$ } }); } else if (spell.target == 'tasks') { - var tasks = User.user.habits.concat(User.user.dailys).concat(User.user.rewards); + var tasks = User.user.habits.concat(User.user.dailys).concat(User.user.rewards).concat(User.user.todos); // exclude challenge tasks tasks = tasks.filter(function (t) { if (!t.challenge) return true; diff --git a/website/client/js/controllers/settingsCtrl.js b/website/client/js/controllers/settingsCtrl.js index a93dde0fb3..d778fadc54 100644 --- a/website/client/js/controllers/settingsCtrl.js +++ b/website/client/js/controllers/settingsCtrl.js @@ -176,6 +176,7 @@ habitrpg.controller('SettingsCtrl', $scope.reset = function(){ User.reset({}); + User.sync(); $rootScope.$state.go('tasks'); } diff --git a/website/client/js/services/chatServices.js b/website/client/js/services/chatServices.js index ed812e08ad..a79de22b85 100644 --- a/website/client/js/services/chatServices.js +++ b/website/client/js/services/chatServices.js @@ -81,8 +81,7 @@ angular.module('habitrpg') clearCards: clearCards, } - //@TOOD: Port when User service is updated function clearCards() { - User.user.ops.update && User.set({'flags.cardReceived':false}); + User.user._wrapped && User.set({'flags.cardReceived':false}); } }]); diff --git a/website/client/js/services/guideServices.js b/website/client/js/services/guideServices.js index 08b51732c8..7f3ce9e499 100644 --- a/website/client/js/services/guideServices.js +++ b/website/client/js/services/guideServices.js @@ -264,8 +264,8 @@ function($rootScope, User, $timeout, $state, Analytics) { } //Init and show the welcome tour (only after user is pulled from server & wrapped). - var watcher = $rootScope.$watch('User.user.ops.update', function(updateFn){ - if (!updateFn) return; // only run after user has been wrapped + var watcher = $rootScope.$watch('User.user._wrapped', function(wrapped){ + if (!wrapped) return; // only run after user has been wrapped watcher(); // deregister watcher if (window.env.IS_MOBILE) return; // Don't show tour immediately on mobile devices if (User.user.flags.welcomed == false) { diff --git a/website/client/js/services/userServices.js b/website/client/js/services/userServices.js index 206052c8ad..a25584e5fb 100644 --- a/website/client/js/services/userServices.js +++ b/website/client/js/services/userServices.js @@ -61,21 +61,13 @@ angular.module('habitrpg') // replicated. We need to wrap each op to provide a callback to send that operation $window.habitrpgShared.wrap(user); _.each(user.ops, function(op,k){ - user.ops[k] = function(req,cb){ - if (cb) return op(req,cb); - op(req,function(err,response) { - for(var updatedItem in req.body) { - var itemUpdateResponse = userNotifications[updatedItem]; - if(itemUpdateResponse) Notification.text(itemUpdateResponse); - } - if (err) { - var message = err.code ? err.message : err; - Notification.text(message); - // In the case of 200s, they're friendly alert messages like "Your pet has hatched!" - still send the op - if ((err.code && err.code >= 400) || !err.code) return; - } - userServices.log({op:k, params: req.params, query:req.query, body:req.body}); - }); + user.ops[k] = function(req){ + try { + op(req); + } catch (err) { + Notification.text(err.message); + return; + } } }); } @@ -106,13 +98,27 @@ angular.module('habitrpg') function callOpsFunctionAndRequest (opName, endPoint, method, paramString, opData) { if (!opData) opData = {}; + var clientResponse; + try { - $window.habitrpgShared.ops[opName](user, opData); - } catch(err) { + var args = [user]; + if (opName === 'rebirth' || opName === 'reroll' || opName === 'reset') { + args.push(user.habits.concat(user.dailys).concat(user.rewards).concat(user.todos)); + } + + args.push(opData); + clientResponse = $window.habitrpgShared.ops[opName].apply(null, args); + } catch (err) { Notification.text(err.message); return; } + var clientMessage = clientResponse[1]; + + if (clientMessage) { + Notification.text(clientMessage); + } + var url = '/api/v3/user/' + endPoint; if (paramString) { url += '/' + paramString @@ -130,7 +136,7 @@ angular.module('habitrpg') body: body, }) .then(function (response) { - if (response.data.message) Notification.text(response.data.message); + if (response.data.message && response.data.message !== clientMessage) Notification.text(response.data.message); save(); }) } @@ -182,7 +188,12 @@ angular.module('habitrpg') }, score: function (data) { - $window.habitrpgShared.ops.scoreTask({user: user, task: data.params.task, direction: data.params.direction}, data.params); + try { + $window.habitrpgShared.ops.scoreTask({user: user, task: data.params.task, direction: data.params.direction}, data.params); + } catch (err) { + Notification.text(err.message); + return; + } save(); Tasks.scoreTask(data.params.task._id, data.params.direction).then(function (res) { var tmp = res.data.data._tmp || {}; // used to notify drops, critical hits and other bonuses