/* jslint node: true */ 'use strict'; // ENiGMA½ const { MenuModule } = require('./menu_module.js'); const { getAchievementsEarnedByUser } = require('./achievement.js'); const UserProps = require('./user_property.js'); // deps const async = require('async'); const _ = require('lodash'); exports.moduleInfo = { name: 'User Achievements Earned', desc: 'Lists achievements earned by a user', author: 'NuSkooler', }; const MciViewIds = { achievementList: 1, customRangeStart: 10, // updated @ index update }; exports.getModule = class UserAchievementsEarned extends MenuModule { constructor(options) { super(options); } mciReady(mciData, cb) { super.mciReady(mciData, err => { if (err) { return cb(err); } async.waterfall( [ callback => { this.prepViewController('achievements', 0, mciData.menu, err => { return callback(err); }); }, callback => { return this.validateMCIByViewIds( 'achievements', MciViewIds.achievementList, callback ); }, callback => { return getAchievementsEarnedByUser( this.client.user.userId, callback ); }, (achievementsEarned, callback) => { this.achievementsEarned = achievementsEarned; const achievementListView = this.viewControllers.achievements.getView( MciViewIds.achievementList ); achievementListView.on('index update', idx => { this.selectionIndexUpdate(idx); }); const dateTimeFormat = _.get( this, 'menuConfig.config.dateTimeFormat', this.client.currentTheme.helpers.getDateFormat('short') ); achievementListView.setItems( achievementsEarned.map(achiev => Object.assign(achiev, this.getUserInfo(), { ts: achiev.timestamp.format(dateTimeFormat), }) ) ); achievementListView.redraw(); this.selectionIndexUpdate(0); return callback(null); }, ], err => { return cb(err); } ); }); } getUserInfo() { // :TODO: allow args to pass in a different user - ie from user list -> press A for achievs, so on... return { userId: this.client.user.userId, userName: this.client.user.username, realName: this.client.user.getProperty(UserProps.RealName), location: this.client.user.getProperty(UserProps.Location), affils: this.client.user.getProperty(UserProps.Affiliations), totalCount: this.client.user.getPropertyAsNumber( UserProps.AchievementTotalCount ), totalPoints: this.client.user.getPropertyAsNumber( UserProps.AchievementTotalPoints ), }; } selectionIndexUpdate(index) { const achiev = this.achievementsEarned[index]; if (!achiev) { return; } this.updateCustomViewTextsWithFilter( 'achievements', MciViewIds.customRangeStart, achiev ); } };