diff --git a/test/spec/services/statServicesSpec.js b/test/spec/services/statServicesSpec.js index 81e13645de..a1d99809c2 100644 --- a/test/spec/services/statServicesSpec.js +++ b/test/spec/services/statServicesSpec.js @@ -76,7 +76,11 @@ describe('Stats Service', function() { "armor" : "armor_warrior_1" }; var user = { - _statsComputed: { str: 50 }, + fns: { + statsComputed: function () { + return { str: 50 }; + }, + }, stats: { lvl: 10, buffs: { str: 10 }, @@ -252,7 +256,8 @@ describe('Stats Service', function() { describe('mpDisplay', function() { it('displays mp as "mp / totalMP"', function() { - user._statsComputed = { maxMP: 100 }; + user.fns = {}; + user.fns.statsComputed = function () { return { maxMP: 100 } }; user.stats.mp = 30; var mpDisplay = statCalc.mpDisplay(user); @@ -260,7 +265,8 @@ describe('Stats Service', function() { }); it('Rounds mp down when given a decimal', function() { - user._statsComputed = { maxMP: 100 }; + user.fns = {}; + user.fns.statsComputed = function () { return { maxMP: 100 } }; user.stats.mp = 30.99; var mpDisplay = statCalc.mpDisplay(user); diff --git a/website/client/js/services/statServices.js b/website/client/js/services/statServices.js index f2db805fb6..b716dbcaf7 100644 --- a/website/client/js/services/statServices.js +++ b/website/client/js/services/statServices.js @@ -22,7 +22,7 @@ } function classBonus(user, stat) { - var computedStats = user._statsComputed; + var computedStats = (user.fns && user.fns.statsComputed) ? user.fns.statsComputed() : null; if(computedStats) { var bonus = computedStats[stat] @@ -95,7 +95,7 @@ function mpDisplay(user) { var remainingMP = Math.floor(user.stats.mp); - var totalMP = user._statsComputed.maxMP; + var totalMP = (user.fns && user.fns.statsComputed) ? user.fns.statsComputed().maxMP : null; var display = _formatOutOfTotalDisplay(remainingMP, totalMP); return display; diff --git a/website/client/js/services/userServices.js b/website/client/js/services/userServices.js index 13ec13120e..64adb50140 100644 --- a/website/client/js/services/userServices.js +++ b/website/client/js/services/userServices.js @@ -153,10 +153,22 @@ angular.module('habitrpg') callOpsFunctionAndRequest('allocate', 'allocate', "POST",'', data); }, + allocateNow: function () { + callOpsFunctionAndRequest('allocateNow', 'allocate-now', "POST"); + }, + changeClass: function (data) { callOpsFunctionAndRequest('changeClass', 'change-class', "POST",'', data); }, + disableClasses: function () { + callOpsFunctionAndRequest('disableClasses', 'disable-classes', "POST"); + }, + + revive: function (data) { + callOpsFunctionAndRequest('revive', 'revive', "POST"); + }, + addTask: function (data) { user.ops.addTask(data); save(); @@ -187,6 +199,12 @@ angular.module('habitrpg') Tasks.deleteTask(data.params.id); }, + clearCompleted: function () { + user.ops.clearCompleted(user.todos); + save(); + Tasks.clearCompletedTodos(); + }, + addTag: function(data) { user.ops.addTag(data); save(); @@ -199,6 +217,12 @@ angular.module('habitrpg') Tags.updateTag(data.params.id, data.body); }, + deleteTag: function(data) { + user.ops.deleteTag(data); + save(); + Tags.deleteTag(data.params.id); + }, + addTenGems: function () { $http({ method: "POST", @@ -228,10 +252,18 @@ angular.module('habitrpg') callOpsFunctionAndRequest('clearPMs', 'messages', "DELETE"); }, + deletePM: function (data) { + callOpsFunctionAndRequest('deletePM', 'messages', "DELETE", data.params.id, data); + }, + buy: function (data) { callOpsFunctionAndRequest('buy', 'buy', "POST", data.params.key, data); }, + buyQuest: function (data) { + callOpsFunctionAndRequest('buyQuest', 'buy-quest', "POST", data.params.key, data); + }, + purchase: function (data) { var type = data.params.type; var key = data.params.key; @@ -251,6 +283,18 @@ angular.module('habitrpg') }) }, + buyMysterySet: function (data) { + callOpsFunctionAndRequest('buyMysterySet', 'buy-mystery-set', "POST", data.params.key, data); + }, + + readCard: function (data) { + callOpsFunctionAndRequest('readCard', 'read-card', "POST", data.params.cardType, data); + }, + + openMysteryItem: function (data) { + callOpsFunctionAndRequest('openMysteryItem', 'open-mystery-item', "POST"); + }, + sell: function (data) { var type = data.params.type; var key = data.params.key; @@ -334,6 +378,10 @@ angular.module('habitrpg') callOpsFunctionAndRequest('sleep', 'sleep', "POST"); }, + blockUser: function (data) { + callOpsFunctionAndRequest('blockUser', 'block', "POST", data.params.uuid, data); + }, + online: function (status) { if (status===true) { settings.online = true; diff --git a/website/views/main/filters.jade b/website/views/main/filters.jade index b72d424364..40e11817a8 100644 --- a/website/views/main/filters.jade +++ b/website/views/main/filters.jade @@ -31,7 +31,7 @@ li.filters-edit(ng-class='{active: user.filters[tag.id]}', ng-repeat='tag in user.tags', bindonce='user.tags') form.hrpg-input-group input(type='text', ng-model='tag.name', ui-keyup="{13: 'saveOrEdit()'}") - button(type='button', ng-click='user.ops.deleteTag({params:{id:tag.id}})') + button(type='button', ng-click='User.deleteTag({params:{id:tag.id}})') span.glyphicon.glyphicon-trash ul(ng-if='!_editing', hrpg-sort-tags) li.filters-tags(ng-class='{active: user.filters[tag.id], challenge: tag.challenge}', ng-repeat='tag in user.tags', bindonce='user.tags') diff --git a/website/views/options/inventory/drops.jade b/website/views/options/inventory/drops.jade index 134e9ade50..425d6fe276 100644 --- a/website/views/options/inventory/drops.jade +++ b/website/views/options/inventory/drops.jade @@ -65,7 +65,7 @@ button.customize-option(class='inventory_present inventory_present_{{moment().format("MM")}}', popover=env.t('subscriberItemText'), popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', - ng-click="user.ops.openMysteryItem({})") + ng-click="User.openMysteryItem({})") .badge.badge-info.stack-count {{user.purchased.plan.mysteryItems.length}} div(ng-if='user.purchased.plan.consecutive.trinkets') @@ -199,7 +199,7 @@ button.customize-option(popover=env.t('subGemPop'), popover-title=env.t('subGemName'), popover-trigger='mouseenter', popover-placement='top', popover-append-to-body='true', - ng-click='user.ops.purchase({params:{type:"gems",key:"gem"}})') + ng-click='User.purchase({params:{type:"gems",key:"gem"}})') span.Pet_Currency_Gem.inline-gems .badge.badge-success.stack-count {{Shared.planGemLimits.convCap + User.user.purchased.plan.consecutive.gemCapExtra - User.user.purchased.plan.gemsBought}} p diff --git a/website/views/options/inventory/time-travelers.jade b/website/views/options/inventory/time-travelers.jade index 66fc530bd0..be0c3ea7dd 100644 --- a/website/views/options/inventory/time-travelers.jade +++ b/website/views/options/inventory/time-travelers.jade @@ -35,4 +35,4 @@ popover='{{::item.notes()}}', popover-title='{{::item.text()}}', popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', - ng-click='user.ops.buyMysterySet({params:{key:set.key}})') + ng-click='User.buyMysterySet({params:{key:set.key}})') diff --git a/website/views/options/profile.jade b/website/views/options/profile.jade index d9af640ae8..036d0cf529 100644 --- a/website/views/options/profile.jade +++ b/website/views/options/profile.jade @@ -219,7 +219,7 @@ mixin profileStats input(type='radio', name='allocationMode', value='taskbased', ng-model='user.preferences.allocationMode', ng-change='set({"preferences.allocationMode": "taskbased"})') span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('taskAllocationPop'))=env.t('taskAllocation') div(ng-show='user.preferences.automaticAllocation && !(user.preferences.allocationMode === "taskbased") && (user.stats.points > 0)') - a.btn.btn-primary.btn-xs(ng-click='user.ops.allocateNow({})', popover-trigger='mouseenter', popover-placement='right', popover=env.t('distributePointsPop')) + a.btn.btn-primary.btn-xs(ng-click='User.allocateNow({})', popover-trigger='mouseenter', popover-placement='right', popover=env.t('distributePointsPop')) span.glyphicon.glyphicon-download |  =env.t('distributePoints') @@ -227,7 +227,7 @@ mixin profileStats div(ng-class='user.flags.classSelected && !user.preferences.disableClasses ? "col-md-4" : "col-md-6"') - button.btn.btn-default(ng-if='user.preferences.disableClasses', ng-click='user.ops.changeClass({})', popover-trigger='mouseenter', popover-placement='right', popover=env.t('enableClassPop'))= env.t('enableClass') + button.btn.btn-default(ng-if='user.preferences.disableClasses', ng-click='User.changeClass({})', popover-trigger='mouseenter', popover-placement='right', popover=env.t('enableClassPop'))= env.t('enableClass') hr(ng-if='user.preferences.disableClasses') include ../shared/profiles/achievements diff --git a/website/views/options/settings.jade b/website/views/options/settings.jade index e5d9896e61..815b91f3e3 100644 --- a/website/views/options/settings.jade +++ b/website/views/options/settings.jade @@ -92,7 +92,7 @@ script(type='text/ng-template', id='partials/options.settings.settings.html') button.btn.btn-default(ng-click='showBailey()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('showBaileyPop'))= env.t('showBailey') button.btn.btn-default(ng-click='openRestoreModal()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('fixValPop'))= env.t('fixVal') - button.btn.btn-default(ng-if='user.preferences.disableClasses==true', ng-click='user.ops.changeClass({})', popover-trigger='mouseenter', popover-placement='right', popover=env.t('enableClassPop'))= env.t('enableClass') + button.btn.btn-default(ng-if='user.preferences.disableClasses==true', ng-click='User.changeClass({})', popover-trigger='mouseenter', popover-placement='right', popover=env.t('enableClassPop'))= env.t('enableClass') hr diff --git a/website/views/options/social/chat-message.jade b/website/views/options/social/chat-message.jade index 3231726e82..07447b483c 100644 --- a/website/views/options/social/chat-message.jade +++ b/website/views/options/social/chat-message.jade @@ -29,7 +29,7 @@ mixin chatMessages(inbox) a(ng-click="quickReply(message.uuid)") span.glyphicon.glyphicon-share-alt(tooltip=env.t('pm-reply')) span(ng-if='#{inbox ? "true" : ":: user.contributor.admin || message.uuid == user.id"}')     - a(ng-click='#{inbox? "user.ops.deletePM({params:{id:message.$key}})" : "deleteChatMessage(group, message)"}') + a(ng-click='#{inbox? "User.deletePM({params:{id:message.$key}})" : "deleteChatMessage(group, message)"}') span.glyphicon.glyphicon-trash(tooltip=env.t('delete')) span(ng-if=':: user.contributor.admin || (!message.sent && user.flags.communityGuidelinesAccepted && message.uuid != user.id && message.uuid != "system")')     a(ng-click="flagChatMessage(group._id, message)") diff --git a/website/views/shared/header/header.jade b/website/views/shared/header/header.jade index 5c0b847849..db91442927 100644 --- a/website/views/shared/header/header.jade +++ b/website/views/shared/header/header.jade @@ -25,10 +25,10 @@ .meter-label(tooltip='Mana', ng-if='user.flags.classSelected && !user.preferences.disableClasses') span.glyphicon.glyphicon-fire .meter.mana(ng-if='user.flags.classSelected && !user.preferences.disableClasses', tooltip='{{Math.round(user.stats.mp * 100) / 100}}') - .bar(ng-style='{"width": (user.stats.mp / user._statsComputed.maxMP * 100) + "%"}') + .bar(ng-style='{"width": (user.stats.mp / user.fns.statsComputed().maxMP * 100) + "%"}') span.meter-text.value span - | {{Math.floor(user.stats.mp)}} / {{user._statsComputed.maxMP}} + | {{Math.floor(user.stats.mp)}} / {{user.fns.statsComputed().maxMP}} // party .party(ng-controller='PartyCtrl') button.party-invite.btn.btn-primary(ng-click="inviteOrStartParty(group)", diff --git a/website/views/shared/modals/buy-gems.jade b/website/views/shared/modals/buy-gems.jade index d071450cab..6fdec903d4 100644 --- a/website/views/shared/modals/buy-gems.jade +++ b/website/views/shared/modals/buy-gems.jade @@ -34,7 +34,7 @@ script(id='modals/buyGems.html', type='text/ng-template') .container-fluid .row .col-md-3 - button.customize-option(ng-click='user.ops.purchase({params:{type:"gems",key:"gem"}})') + button.customize-option(ng-click='User.purchase({params:{type:"gems",key:"gem"}})') span.Pet_Currency_Gem.inline-gems .badge.badge-success.stack-count {{Shared.planGemLimits.convCap + User.user.purchased.plan.consecutive.gemCapExtra - User.user.purchased.plan.gemsBought}} p diff --git a/website/views/shared/modals/classes.jade b/website/views/shared/modals/classes.jade index 6484626318..754d6f31f0 100644 --- a/website/views/shared/modals/classes.jade +++ b/website/views/shared/modals/classes.jade @@ -68,6 +68,6 @@ script(type='text/ng-template', id='modals/chooseClass.html') .modal-footer span(popover-placement='left', popover-trigger='mouseenter', popover=env.t('optOutOfClassesText')) - button.btn.btn-danger(ng-click='user.ops.disableClasses({}); $close()')=env.t('optOutOfClasses') + button.btn.btn-danger(ng-click='User.disableClasses({}); $close()')=env.t('optOutOfClasses') button.btn.btn-primary(ng-disabled='!selectedClass' ng-click='changeClass(selectedClass); $close()')=env.t('select') .pull-left!=env.t('chooseClassLearn') diff --git a/website/views/shared/modals/death.jade b/website/views/shared/modals/death.jade index cfdbced16e..60a92c3802 100644 --- a/website/views/shared/modals/death.jade +++ b/website/views/shared/modals/death.jade @@ -21,5 +21,5 @@ script(type='text/ng-template', id='modals/death.html') h4(style='margin-top:1.5em')=env.t('dontDespair') p(style='margin-top:1.5em')=env.t('deathPenaltyDetails') .modal-footer - a.btn.btn-danger.btn-lg.flex-column(ng-click='user.ops.revive({}); $close()')=env.t('refillHealthTryAgain') + a.btn.btn-danger.btn-lg.flex-column(ng-click='User.revive(); $close()')=env.t('refillHealthTryAgain') h4.text-center!=env.t('dyingOftenTips') diff --git a/website/views/shared/modals/limited.jade b/website/views/shared/modals/limited.jade index 158fd5a647..0f68a2dcad 100644 --- a/website/views/shared/modals/limited.jade +++ b/website/views/shared/modals/limited.jade @@ -9,4 +9,4 @@ script(id='modals/cards.html', type='text/ng-template') markdown(text='::cardMessage') .modal-footer small.pull-left {{::env.t(cardType + 'CardExplanation')}} - button.btn.btn-default(ng-click='user.ops.readCard({params: {cardType: cardType}}); $close()')=env.t('ok') + button.btn.btn-default(ng-click='User.readCard({params: {cardType: cardType}}); $close()')=env.t('ok') diff --git a/website/views/shared/modals/members.jade b/website/views/shared/modals/members.jade index b40a56eea5..8759b8aad6 100644 --- a/website/views/shared/modals/members.jade +++ b/website/views/shared/modals/members.jade @@ -33,9 +33,9 @@ script(type='text/ng-template', id='modals/member.html') include ../profiles/achievements .modal-footer .btn-group.pull-left(ng-if='::user') - button.btn.btn-md.btn-default(ng-if='user.inbox.blocks | contains:profile._id', tooltip=env.t('unblock'), ng-click="user.ops.blockUser({params:{uuid:profile._id}})", tooltip-placement='right') + button.btn.btn-md.btn-default(ng-if='user.inbox.blocks | contains:profile._id', tooltip=env.t('unblock'), ng-click="User.blockUser({params:{uuid:profile._id}})", tooltip-placement='right') span.glyphicon.glyphicon-plus - button.btn.btn-md.btn-default(ng-if='profile._id != user._id && !profile.contributor.admin && !(user.inbox.blocks | contains:profile._id)', tooltip=env.t('block'), ng-click="user.ops.blockUser({params:{uuid:profile._id}})", tooltip-placement='right') + button.btn.btn-md.btn-default(ng-if='profile._id != user._id && !profile.contributor.admin && !(user.inbox.blocks | contains:profile._id)', tooltip=env.t('block'), ng-click="User.blockUser({params:{uuid:profile._id}})", tooltip-placement='right') span.glyphicon.glyphicon-ban-circle button.btn.btn-md.btn-default(tooltip=env.t('sendPM'), ng-click="openModal('private-message',{controller:'MemberModalCtrl'})", tooltip-placement='right') span.glyphicon.glyphicon-envelope diff --git a/website/views/shared/modals/quests.jade b/website/views/shared/modals/quests.jade index a9dbf6a991..10ce712b6a 100644 --- a/website/views/shared/modals/quests.jade +++ b/website/views/shared/modals/quests.jade @@ -57,7 +57,7 @@ script(type='text/ng-template', id='modals/buyQuest.html') .modal-footer button.btn.btn-default(ng-click='closeQuest(); $close()')=env.t('neverMind') button.btn.btn-primary(ng-if='::selectedQuest.category !== "gold"', ng-click='purchase("quests", quest); closeQuest(); $close()')=env.t('buyQuest') + ': {{::selectedQuest.value}} ' + env.t('gems') - button.btn.btn-primary(ng-if='::selectedQuest.category === "gold"', ng-click='user.ops.buyQuest({params:{key:selectedQuest.key}}); closeQuest(); $close()')=env.t('buyQuest') + ': {{::selectedQuest.goldValue}} ' + env.t('gold') + button.btn.btn-primary(ng-if='::selectedQuest.category === "gold"', ng-click='User.buyQuest({params:{key:selectedQuest.key}}); closeQuest(); $close()')=env.t('buyQuest') + ': {{::selectedQuest.goldValue}} ' + env.t('gold') script(type='text/ng-template', id='modals/questInvitation.html') .modal-header diff --git a/website/views/shared/profiles/stats/attributes.jade b/website/views/shared/profiles/stats/attributes.jade index 0d222a42b4..bf5b1dbcba 100644 --- a/website/views/shared/profiles/stats/attributes.jade +++ b/website/views/shared/profiles/stats/attributes.jade @@ -7,7 +7,7 @@ table.table.table-striped span.hint(popover-title=env.t(statInfo.title), popover-placement='right', popover=env.t(statInfo.popover), popover-trigger='mouseenter') strong=env.t(statInfo.title) - strong : {{profile._statsComputed.#{stat}}} + strong : {{profile.fns.statsComputed().#{stat}}} td: ul.list-unstyled +statList('statCalc.levelBonus(profile.stats.lvl)', 'levelBonus', 'level', true) diff --git a/website/views/shared/tasks/task_view/mixins.jade b/website/views/shared/tasks/task_view/mixins.jade index 398813d5ad..7fdbe66f53 100644 --- a/website/views/shared/tasks/task_view/mixins.jade +++ b/website/views/shared/tasks/task_view/mixins.jade @@ -24,7 +24,7 @@ mixin taskColumnTabs(position) div(ng-show='list.view == "complete"') .alert =env.t('lotOfToDos') - button.task-action-btn.tile.spacious.bright(ng-click='user.ops.clearCompleted({})',popover=env.t('deleteToDosExplanation'),popover-trigger='mouseenter')=env.t('clearCompleted') + button.task-action-btn.tile.spacious.bright(ng-click='User.clearCompleted({})',popover=env.t('deleteToDosExplanation'),popover-trigger='mouseenter')=env.t('clearCompleted') // remaining/completed tabs ul.task-filter li(ng-class='{active: list.view == "remaining"}')