@@ -196,50 +196,47 @@ sub edit_handler ($c) {
196
196
# Handler for assigning achievements to users
197
197
sub assign_handler ($c ) {
198
198
my $db = $c -> db;
199
- my @users = $db -> listUsers;
200
199
my $overwrite = $c -> param(' action.assign.overwrite' ) eq ' everything' ;
201
200
my $scope = $c -> param(' action.assign.scope' );
202
201
my @achievementIDs = $scope eq ' all' ? @{ $c -> {allAchievementIDs } } : @{ $c -> {selectedAchievementIDs } };
203
202
204
- # Enable all achievements
203
+ my @users = $db -> listUsers;
205
204
my @achievements = $db -> getAchievements(@achievementIDs );
206
205
207
- for my $achievement (@achievements ) {
208
- $achievement -> enabled(1);
209
- $db -> putAchievement($achievement );
210
- }
211
-
212
- # Assign globalUserAchievement data, overwriting if necc
206
+ # Enable all achievements.
207
+ for my $achievement (@achievements ) { $achievement -> enabled(1); }
208
+ $db -> Achievement-> update_records(\@achievements ) if @achievements ;
213
209
210
+ # Assign globalUserAchievement data, overwriting if necessary.
211
+ my (@globalAchievementRecordsToAdd , @globalAchievementRecordsToPut );
212
+ my %existingGlobalUserAchievements = map { $_ => 1 } $db -> listGlobalUserAchievements;
214
213
for my $user (@users ) {
215
- if (not $db -> existsGlobalUserAchievement($user )) {
216
- my $globalUserAchievement = $db -> newGlobalUserAchievement();
217
- $globalUserAchievement -> user_id($user );
218
- $db -> addGlobalUserAchievement($globalUserAchievement );
214
+ my $globalUserAchievement = $db -> newGlobalUserAchievement(user_id => $user );
215
+ if (!$existingGlobalUserAchievements {$user }) {
216
+ push (@globalAchievementRecordsToAdd , $globalUserAchievement );
219
217
} elsif ($overwrite ) {
220
- my $globalUserAchievement = $db -> newGlobalUserAchievement();
221
- $globalUserAchievement -> user_id($user );
222
- $db -> putGlobalUserAchievement($globalUserAchievement );
218
+ push (@globalAchievementRecordsToPut , $globalUserAchievement );
223
219
}
224
220
}
221
+ $db -> GlobalUserAchievement-> insert_records(\@globalAchievementRecordsToAdd ) if @globalAchievementRecordsToAdd ;
222
+ $db -> GlobalUserAchievement-> update_records(\@globalAchievementRecordsToPut ) if @globalAchievementRecordsToPut ;
225
223
226
- # Assign userAchievement data, overwriting if necc
227
-
224
+ # Assign userAchievement data, overwriting if necessary.
225
+ my ( @userAchievementRecordsToAdd , @userAchievementRecordsToPut );
228
226
for my $achievementID (@achievementIDs ) {
227
+ my %existingUserAchievements =
228
+ map { $_ -> [0] => 1 } $db -> listUserAchievementsWhere({ achievement_id => $achievementID });
229
229
for my $user (@users ) {
230
- if (not $db -> existsUserAchievement($user , $achievementID )) {
231
- my $userAchievement = $db -> newUserAchievement();
232
- $userAchievement -> user_id($user );
233
- $userAchievement -> achievement_id($achievementID );
234
- $db -> addUserAchievement($userAchievement );
230
+ my $userAchievement = $db -> newUserAchievement(user_id => $user , achievement_id => $achievementID );
231
+ if (!$existingUserAchievements {$user }) {
232
+ push (@userAchievementRecordsToAdd , $userAchievement );
235
233
} elsif ($overwrite ) {
236
- my $userAchievement = $db -> newUserAchievement();
237
- $userAchievement -> user_id($user );
238
- $userAchievement -> achievement_id($achievementID );
239
- $db -> putUserAchievement($userAchievement );
234
+ push (@userAchievementRecordsToPut , $userAchievement );
240
235
}
241
236
}
242
237
}
238
+ $db -> UserAchievement-> insert_records(\@userAchievementRecordsToAdd ) if @userAchievementRecordsToAdd ;
239
+ $db -> UserAchievement-> update_records(\@userAchievementRecordsToPut ) if @userAchievementRecordsToPut ;
243
240
244
241
return (1, $c -> maketext(' Assigned achievements to users.' ));
245
242
}
@@ -462,7 +459,7 @@ sub import_handler ($c) {
462
459
$count ++;
463
460
$allAchievementIDs {$achievement_id } = 1;
464
461
465
- # Assign to usesrs if neccessary
462
+ # Assign to users if necessary.
466
463
if ($assign eq " all" ) {
467
464
for my $user (@users ) {
468
465
if (not $db -> existsGlobalUserAchievement($user )) {
0 commit comments