@@ -46,37 +46,40 @@ sub initialize ($c) {
4646 my %globalUserAchievements =
4747 map { $_ -> user_id => $_ } $db -> getGlobalUserAchievementsWhere({ user_id => { not_like => ' set_id:%' } });
4848
49- my @allBadgeIDs = $db -> listAchievements;
50- my @allBadges = @allBadgeIDs ? sortAchievements($db -> getAchievements(@allBadgeIDs )) : ();
51-
5249 $c -> {showUserNames } = $c -> authz-> hasPermissions($c -> {userName }, ' view_leaderboard_usernames' );
5350 $c -> {showLevels } = 0; # Hide level column unless at least one user has a level achievement.
5451
52+ my %allUserAchievements ;
53+ for ($db -> getUserAchievementsWhere({
54+ user_id => { not_like => ' set_id:%' },
55+ achievement_id => [ map { $_ -> achievement_id } grep { $_ -> category ne ' level' } @achievements ],
56+ }))
57+ {
58+ $allUserAchievements { $_ -> user_id }{ $_ -> achievement_id } = $_ ;
59+ }
60+
5561 my @rows ;
5662 for my $user ($db -> getUsersWhere({ user_id => { not_like => ' set_id:%' } })) {
5763 # Only include users who can be shown in stats.
5864 next unless $ce -> status_abbrev_has_behavior($user -> status, ' include_in_stats' );
5965
66+ my $globalData = $globalUserAchievements { $user -> user_id };
67+ my $userAchievements = $allUserAchievements { $user -> user_id };
68+
6069 # Skip unless user has achievement data.
61- my $globalData = $globalUserAchievements { $user -> user_id };
62- next unless $globalData ;
70+ next unless $globalData && $userAchievements ;
6371
6472 my $level = $globalData -> level_achievement_id ? $achievementsById { $globalData -> level_achievement_id } : ' ' ;
6573
66- my %userAchievements = map { $_ -> achievement_id => $_ } $db -> getUserAchievementsWhere({
67- user_id => $user -> user_id,
68- achievement_id => [ map { $_ -> achievement_id } grep { $_ -> category ne ' level' } @achievements ],
69- });
70-
7174 my @badges ;
7275 for my $achievement (@achievements ) {
7376 # Skip level achievements and only show earned achievements.
7477 last if $achievement -> category eq ' level' ;
7578
7679 push (@badges , $achievement )
77- if $userAchievements { $achievement -> achievement_id }
80+ if $userAchievements -> { $achievement -> achievement_id }
7881 && $achievement -> enabled
79- && $userAchievements { $achievement -> achievement_id }-> earned;
82+ && $userAchievements -> { $achievement -> achievement_id }-> earned;
8083 }
8184
8285 push (@rows , [ $globalData -> achievement_points || 0, $level , $user , \@badges ]);
0 commit comments