package com.faforever.client.achievements;
import com.faforever.client.api.AchievementDefinition;
import com.faforever.client.audio.AudioController;
import com.faforever.client.i18n.I18n;
import com.faforever.client.notification.NotificationServiceImpl;
import com.faforever.client.notification.TransientNotification;
import com.faforever.client.remote.FafService;
import com.faforever.client.remote.UpdatedAchievement;
import com.faforever.client.remote.UpdatedAchievementsMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.lang.invoke.MethodHandles;
public class AchievementUnlockedNotifier {
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@Resource
NotificationServiceImpl notificationService;
@Resource
I18n i18n;
@Resource
AchievementService achievementService;
@Resource
FafService fafService;
@Resource
AudioController audioController;
private long lastSoundPlayed;
@PostConstruct
void postConstruct() {
fafService.addOnMessageListener(UpdatedAchievementsMessage.class, this::onUpdatedAchievementsMessage);
}
private void onUpdatedAchievementsMessage(UpdatedAchievementsMessage message) {
message.getUpdatedAchievements().stream()
.filter(UpdatedAchievement::getNewlyUnlocked)
.forEachOrdered(updatedAchievement -> achievementService.getAchievementDefinition(updatedAchievement.getAchievementId())
.thenAccept(this::notifyAboutUnlockedAchievement)
.exceptionally(throwable -> {
logger.warn("Could not get achievement definition for achievement: {}", updatedAchievement.getAchievementId(), throwable);
return null;
})
);
}
private void notifyAboutUnlockedAchievement(AchievementDefinition achievementDefinition) {
if (lastSoundPlayed < System.currentTimeMillis() - 1000) {
audioController.playAchievementUnlockedSound();
lastSoundPlayed = System.currentTimeMillis();
}
notificationService.addNotification(new TransientNotification(
i18n.get("achievement.unlockedTitle"),
achievementDefinition.getName(),
achievementService.getRevealedIcon(achievementDefinition)
)
);
}
}