mirror of
https://github.com/nagisa77/OpenIsle.git
synced 2026-02-23 14:40:49 +08:00
91 lines
3.1 KiB
Java
91 lines
3.1 KiB
Java
package com.openisle.service;
|
|
|
|
import com.openisle.model.User;
|
|
import com.openisle.repository.UserRepository;
|
|
import com.openisle.repository.ExperienceLogRepository;
|
|
import com.openisle.model.ExperienceLog;
|
|
import lombok.RequiredArgsConstructor;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import java.time.LocalDate;
|
|
|
|
@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];
|
|
}
|
|
}
|