package com.faforever.client.achievements; import com.faforever.client.api.AchievementDefinition; import com.faforever.client.api.FafApiAccessor; import com.faforever.client.api.PlayerAchievement; import com.faforever.client.chat.PlayerInfoBean; import com.faforever.client.config.CacheNames; import com.faforever.client.i18n.I18n; import com.faforever.client.notification.NotificationService; import com.faforever.client.player.PlayerService; import com.faforever.client.remote.FafService; import com.faforever.client.remote.UpdatedAchievementsMessage; import com.faforever.client.theme.ThemeService; import com.faforever.client.user.UserService; import com.google.common.base.Strings; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.image.Image; import org.springframework.cache.annotation.Cacheable; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.Collections; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.ThreadPoolExecutor; public class AchievementServiceImpl implements AchievementService { private static final int ACHIEVEMENT_IMAGE_SIZE = 128; private final ObservableList<PlayerAchievement> readOnlyPlayerAchievements; private final ObservableList<PlayerAchievement> playerAchievements; @Resource UserService userService; @Resource FafApiAccessor fafApiAccessor; @Resource FafService fafService; @Resource NotificationService notificationService; @Resource I18n i18n; @Resource PlayerService playerService; @Resource ThemeService themeService; @Resource ThreadPoolExecutor threadPoolExecutor; public AchievementServiceImpl() { playerAchievements = FXCollections.observableArrayList(); readOnlyPlayerAchievements = FXCollections.unmodifiableObservableList(playerAchievements); } @Override public CompletionStage<List<PlayerAchievement>> getPlayerAchievements(String username) { if (userService.getUsername().equalsIgnoreCase(username)) { if (readOnlyPlayerAchievements.isEmpty()) { reloadAchievements(); } return CompletableFuture.completedFuture(readOnlyPlayerAchievements); } PlayerInfoBean playerForUsername = playerService.getPlayerForUsername(username); if (playerForUsername == null) { return CompletableFuture.completedFuture(Collections.emptyList()); } int playerId = playerForUsername.getId(); return CompletableFuture.supplyAsync(() -> FXCollections.observableList(fafApiAccessor.getPlayerAchievements(playerId)), threadPoolExecutor); } @Override public CompletionStage<List<AchievementDefinition>> getAchievementDefinitions() { return CompletableFuture.supplyAsync(() -> fafApiAccessor.getAchievementDefinitions(), threadPoolExecutor); } @Override public CompletionStage<AchievementDefinition> getAchievementDefinition(String achievementId) { return CompletableFuture.supplyAsync(() -> fafApiAccessor.getAchievementDefinition(achievementId), threadPoolExecutor); } @Override @Cacheable(CacheNames.ACHIEVEMENT_IMAGES) public Image getRevealedIcon(AchievementDefinition achievementDefinition) { if (Strings.isNullOrEmpty(achievementDefinition.getRevealedIconUrl())) { return themeService.getThemeImage(ThemeService.DEFAULT_ACHIEVEMENT_IMAGE); } return new Image(achievementDefinition.getRevealedIconUrl(), ACHIEVEMENT_IMAGE_SIZE, ACHIEVEMENT_IMAGE_SIZE, true, true, true); } @Override @Cacheable(CacheNames.ACHIEVEMENT_IMAGES) public Image getUnlockedIcon(AchievementDefinition achievementDefinition) { if (Strings.isNullOrEmpty(achievementDefinition.getUnlockedIconUrl())) { return themeService.getThemeImage(ThemeService.DEFAULT_ACHIEVEMENT_IMAGE); } return new Image(achievementDefinition.getUnlockedIconUrl(), ACHIEVEMENT_IMAGE_SIZE, ACHIEVEMENT_IMAGE_SIZE, true, true, true); } private void reloadAchievements() { playerAchievements.setAll(fafApiAccessor.getPlayerAchievements(userService.getUid())); } @PostConstruct void postConstruct() { fafService.addOnMessageListener(UpdatedAchievementsMessage.class, updatedAchievementsMessage -> reloadAchievements()); } }