Files
OpenIsle/backend/src/main/java/com/openisle/service/LevelService.java
2025-09-18 14:42:25 +08:00

93 lines
2.8 KiB
Java

package com.openisle.service;
import com.openisle.model.ExperienceLog;
import com.openisle.model.User;
import com.openisle.repository.ExperienceLogRepository;
import com.openisle.repository.UserRepository;
import java.time.LocalDate;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class LevelService {
private final UserRepository userRepository;
// repositories for experience-related entities
private final ExperienceLogRepository experienceLogRepository;
private final UserVisitService userVisitService;
private static final int[] LEVEL_EXP = { 100, 200, 300, 600, 1200, 10000 };
private ExperienceLog getTodayLog(User user) {
LocalDate today = LocalDate.now();
return experienceLogRepository
.findByUserAndLogDate(user, today)
.orElseGet(() -> {
ExperienceLog log = new ExperienceLog();
log.setUser(user);
log.setLogDate(today);
log.setPostCount(0);
log.setCommentCount(0);
log.setReactionCount(0);
return experienceLogRepository.save(log);
});
}
private int addExperience(User user, int amount) {
user.setExperience(user.getExperience() + amount);
userRepository.save(user);
return amount;
}
public int awardForPost(String username) {
User user = userRepository.findByUsername(username).orElseThrow();
ExperienceLog log = getTodayLog(user);
if (log.getPostCount() > 1) return 0;
log.setPostCount(log.getPostCount() + 1);
experienceLogRepository.save(log);
return addExperience(user, 30);
}
public int awardForComment(String username) {
User user = userRepository.findByUsername(username).orElseThrow();
ExperienceLog log = getTodayLog(user);
if (log.getCommentCount() > 3) return 0;
log.setCommentCount(log.getCommentCount() + 1);
experienceLogRepository.save(log);
return addExperience(user, 10);
}
public int awardForReaction(String username) {
User user = userRepository.findByUsername(username).orElseThrow();
ExperienceLog log = getTodayLog(user);
if (log.getReactionCount() > 3) return 0;
log.setReactionCount(log.getReactionCount() + 1);
experienceLogRepository.save(log);
return addExperience(user, 5);
}
public int awardForSignin(String username) {
boolean first = userVisitService.recordVisit(username);
if (!first) return 0;
User user = userRepository.findByUsername(username).orElseThrow();
return addExperience(user, 5);
}
public int getLevel(int exp) {
int level = 0;
for (int t : LEVEL_EXP) {
if (exp >= t) level++;
else break;
}
return level;
}
public int nextLevelExp(int exp) {
for (int t : LEVEL_EXP) {
if (exp < t) return t;
}
return LEVEL_EXP[LEVEL_EXP.length - 1];
}
}