mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-04-14 03:45:57 +00:00
[AB-xxx] small code improvements
This commit is contained in:
@@ -313,107 +313,107 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
|
|||||||
Long userInServerId = userInAServer.getUserInServerId();
|
Long userInServerId = userInAServer.getUserInServerId();
|
||||||
Optional<AUserExperience> aUserExperienceOptional = userExperienceManagementService.findByUserInServerIdOptional(userInAServer.getUserInServerId());
|
Optional<AUserExperience> aUserExperienceOptional = userExperienceManagementService.findByUserInServerIdOptional(userInAServer.getUserInServerId());
|
||||||
AUserExperience aUserExperience = aUserExperienceOptional.orElseGet(() -> userExperienceManagementService.createUserInServer(userInAServer));
|
AUserExperience aUserExperience = aUserExperienceOptional.orElseGet(() -> userExperienceManagementService.createUserInServer(userInAServer));
|
||||||
if(Boolean.FALSE.equals(aUserExperience.getExperienceGainDisabled())) {
|
if (aUserExperience.getExperienceGainDisabled().equals(Boolean.TRUE)) {
|
||||||
List<AExperienceLevel> levels = experienceLevelManagementService.getLevelConfig();
|
|
||||||
levels.sort(Comparator.comparing(AExperienceLevel::getExperienceNeeded));
|
|
||||||
|
|
||||||
Long minExp = configService.getLongValueOrConfigDefault(ExperienceFeatureConfig.MIN_EXP_KEY, serverId);
|
|
||||||
Long maxExp = configService.getLongValueOrConfigDefault(ExperienceFeatureConfig.MAX_EXP_KEY, serverId);
|
|
||||||
Double multiplier = configService.getDoubleValueOrConfigDefault(ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, serverId);
|
|
||||||
Long experienceRange = maxExp - minExp + 1;
|
|
||||||
Long gainedExperience = (secureRandom.nextInt(experienceRange.intValue()) + minExp);
|
|
||||||
gainedExperience = (long) Math.floor(gainedExperience * multiplier);
|
|
||||||
|
|
||||||
List<AExperienceRole> roles = experienceRoleManagementService.getExperienceRolesForServer(server);
|
|
||||||
roles.sort(Comparator.comparing(role -> role.getLevel().getLevel()));
|
|
||||||
|
|
||||||
log.debug("Handling {}. The user gains {}.", userInServerId, gainedExperience);
|
|
||||||
|
|
||||||
Long oldExperience = aUserExperience.getExperience();
|
|
||||||
Long newExperienceCount = oldExperience + gainedExperience;
|
|
||||||
aUserExperience.setExperience(newExperienceCount);
|
|
||||||
AExperienceLevel newLevel = calculateLevel(levels, newExperienceCount);
|
|
||||||
RoleCalculationResult result = RoleCalculationResult
|
|
||||||
.builder()
|
|
||||||
.build();
|
|
||||||
boolean userChangesLevel = !Objects.equals(newLevel.getLevel(), aUserExperience.getCurrentLevel().getLevel());
|
|
||||||
Integer oldLevel = aUserExperience.getCurrentLevel() != null ? aUserExperience.getCurrentLevel().getLevel() : 0;
|
|
||||||
if(userChangesLevel) {
|
|
||||||
log.info("User {} in server {} changed level. New {}, Old {}.", member.getIdLong(),
|
|
||||||
member.getGuild().getIdLong(), newLevel.getLevel(),
|
|
||||||
oldLevel);
|
|
||||||
aUserExperience.setCurrentLevel(newLevel);
|
|
||||||
AExperienceRole calculatedNewRole = experienceRoleService.calculateRole(roles, newLevel.getLevel());
|
|
||||||
Long oldRoleId = aUserExperience.getCurrentExperienceRole() != null && aUserExperience.getCurrentExperienceRole().getRole() != null ? aUserExperience.getCurrentExperienceRole().getRole().getId() : null;
|
|
||||||
Long newRoleId = calculatedNewRole != null && calculatedNewRole.getRole() != null ? calculatedNewRole.getRole().getId() : null;
|
|
||||||
result.setOldRoleId(oldRoleId);
|
|
||||||
result.setNewRoleId(newRoleId);
|
|
||||||
if(message != null
|
|
||||||
&& aUserExperience.getLevelUpNotification()
|
|
||||||
&& featureModeService.featureModeActive(ExperienceFeatureDefinition.EXPERIENCE, serverId, ExperienceFeatureMode.LEVEL_UP_NOTIFICATION)) {
|
|
||||||
LevelUpNotificationModel model = LevelUpNotificationModel
|
|
||||||
.builder()
|
|
||||||
.memberDisplay(MemberDisplay.fromMember(member))
|
|
||||||
.oldExperience(oldExperience)
|
|
||||||
.newExperience(newExperienceCount)
|
|
||||||
.newLevel(newLevel.getLevel())
|
|
||||||
.oldLevel(oldLevel)
|
|
||||||
.newRole(oldRoleId != null ? RoleDisplay.fromRole(oldRoleId) : null)
|
|
||||||
.newRole(newRoleId != null ? RoleDisplay.fromRole(newRoleId) : null)
|
|
||||||
.build();
|
|
||||||
MessageToSend messageToSend = templateService.renderEmbedTemplate("experience_level_up_notification", model, serverId);
|
|
||||||
FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, message.getChannel())).thenAccept(unused -> {
|
|
||||||
log.info("Sent level up notification to user {} in server {} in channel {}.", member.getIdLong(), serverId, message.getChannel().getIdLong());
|
|
||||||
}).exceptionally(throwable -> {
|
|
||||||
log.warn("Failed to send level up notification to user {} in server {} in channel {}.", member.getIdLong(), serverId, message.getChannel().getIdLong());
|
|
||||||
return null;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
aUserExperience.setCurrentExperienceRole(calculatedNewRole);
|
|
||||||
}
|
|
||||||
aUserExperience.setMessageCount(aUserExperience.getMessageCount() + 1L);
|
|
||||||
if(userChangesLevel && featureModeService.featureModeActive(ExperienceFeatureDefinition.EXPERIENCE, server, ExperienceFeatureMode.LEVEL_ACTION)) {
|
|
||||||
levelActionService.applyLevelActionsToUser(aUserExperience, oldLevel)
|
|
||||||
.thenAccept(unused -> {
|
|
||||||
log.info("Executed level actions for user {}.", userInServerId);
|
|
||||||
})
|
|
||||||
.exceptionally(throwable -> {
|
|
||||||
log.warn("Failed to execute level actions for user {}.", userInServerId, throwable);
|
|
||||||
return null;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if(aUserExperienceOptional.isEmpty()) {
|
|
||||||
userExperienceManagementService.saveUser(aUserExperience);
|
|
||||||
}
|
|
||||||
if(!Objects.equals(result.getOldRoleId(), result.getNewRoleId())) {
|
|
||||||
if(result.getOldRoleId() != null && result.getNewRoleId() != null) {
|
|
||||||
roleService.updateRolesIds(member, Arrays.asList(result.getOldRoleId()), Arrays.asList(result.getNewRoleId())).thenAccept(unused -> {
|
|
||||||
log.debug("Removed role {} from and added role {} to member {} in server {}.", result.getOldRoleId(), result.getNewRoleId(), member.getIdLong(), member.getGuild().getIdLong());
|
|
||||||
}).exceptionally(throwable -> {
|
|
||||||
log.warn("Failed to remove role {} from and add role {} to member {} in server {}.", result.getOldRoleId(), result.getNewRoleId(), member.getIdLong(), member.getGuild().getIdLong(), throwable);
|
|
||||||
return null;
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
if(result.getOldRoleId() != null) {
|
|
||||||
roleService.removeRoleFromMemberAsync(member, result.getOldRoleId()).thenAccept(unused -> {
|
|
||||||
log.debug("Removed role {} from member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong());
|
|
||||||
}).exceptionally(throwable -> {
|
|
||||||
log.warn("Failed to remove role {} from member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong(), throwable);
|
|
||||||
return null;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if(result.getNewRoleId() != null) {
|
|
||||||
roleService.addRoleToMemberAsync(member, result.getNewRoleId()).thenAccept(unused -> {
|
|
||||||
log.debug("Added role {} to member {} in server {}.", result.getNewRoleId(), member.getIdLong(), member.getGuild().getIdLong());
|
|
||||||
}).exceptionally(throwable -> {
|
|
||||||
log.warn("Failed to add role {} to member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong(), throwable);
|
|
||||||
return null;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
log.debug("Experience gain was disabled. User did not gain any experience.");
|
log.debug("Experience gain was disabled. User did not gain any experience.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List<AExperienceLevel> levels = experienceLevelManagementService.getLevelConfig();
|
||||||
|
levels.sort(Comparator.comparing(AExperienceLevel::getExperienceNeeded));
|
||||||
|
|
||||||
|
Long minExp = configService.getLongValueOrConfigDefault(ExperienceFeatureConfig.MIN_EXP_KEY, serverId);
|
||||||
|
Long maxExp = configService.getLongValueOrConfigDefault(ExperienceFeatureConfig.MAX_EXP_KEY, serverId);
|
||||||
|
Double multiplier = configService.getDoubleValueOrConfigDefault(ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, serverId);
|
||||||
|
Long experienceRange = maxExp - minExp + 1;
|
||||||
|
Long gainedExperience = (secureRandom.nextInt(experienceRange.intValue()) + minExp);
|
||||||
|
gainedExperience = (long) Math.floor(gainedExperience * multiplier);
|
||||||
|
|
||||||
|
List<AExperienceRole> roles = experienceRoleManagementService.getExperienceRolesForServer(server);
|
||||||
|
roles.sort(Comparator.comparing(role -> role.getLevel().getLevel()));
|
||||||
|
|
||||||
|
log.debug("Handling {}. The user gains {}.", userInServerId, gainedExperience);
|
||||||
|
|
||||||
|
Long oldExperience = aUserExperience.getExperience();
|
||||||
|
Long newExperienceCount = oldExperience + gainedExperience;
|
||||||
|
aUserExperience.setExperience(newExperienceCount);
|
||||||
|
AExperienceLevel newLevel = calculateLevel(levels, newExperienceCount);
|
||||||
|
RoleCalculationResult result = RoleCalculationResult
|
||||||
|
.builder()
|
||||||
|
.build();
|
||||||
|
boolean userChangesLevel = !Objects.equals(newLevel.getLevel(), aUserExperience.getCurrentLevel().getLevel());
|
||||||
|
Integer oldLevel = aUserExperience.getCurrentLevel() != null ? aUserExperience.getCurrentLevel().getLevel() : 0;
|
||||||
|
if(userChangesLevel) {
|
||||||
|
log.info("User {} in server {} changed level. New {}, Old {}.", member.getIdLong(),
|
||||||
|
member.getGuild().getIdLong(), newLevel.getLevel(),
|
||||||
|
oldLevel);
|
||||||
|
aUserExperience.setCurrentLevel(newLevel);
|
||||||
|
AExperienceRole calculatedNewRole = experienceRoleService.calculateRole(roles, newLevel.getLevel());
|
||||||
|
Long oldRoleId = aUserExperience.getCurrentExperienceRole() != null && aUserExperience.getCurrentExperienceRole().getRole() != null ? aUserExperience.getCurrentExperienceRole().getRole().getId() : null;
|
||||||
|
Long newRoleId = calculatedNewRole != null && calculatedNewRole.getRole() != null ? calculatedNewRole.getRole().getId() : null;
|
||||||
|
result.setOldRoleId(oldRoleId);
|
||||||
|
result.setNewRoleId(newRoleId);
|
||||||
|
if(message != null
|
||||||
|
&& aUserExperience.getLevelUpNotification()
|
||||||
|
&& featureModeService.featureModeActive(ExperienceFeatureDefinition.EXPERIENCE, serverId, ExperienceFeatureMode.LEVEL_UP_NOTIFICATION)) {
|
||||||
|
LevelUpNotificationModel model = LevelUpNotificationModel
|
||||||
|
.builder()
|
||||||
|
.memberDisplay(MemberDisplay.fromMember(member))
|
||||||
|
.oldExperience(oldExperience)
|
||||||
|
.newExperience(newExperienceCount)
|
||||||
|
.newLevel(newLevel.getLevel())
|
||||||
|
.oldLevel(oldLevel)
|
||||||
|
.newRole(oldRoleId != null ? RoleDisplay.fromRole(oldRoleId) : null)
|
||||||
|
.newRole(newRoleId != null ? RoleDisplay.fromRole(newRoleId) : null)
|
||||||
|
.build();
|
||||||
|
MessageToSend messageToSend = templateService.renderEmbedTemplate("experience_level_up_notification", model, serverId);
|
||||||
|
FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, message.getChannel())).thenAccept(unused -> {
|
||||||
|
log.info("Sent level up notification to user {} in server {} in channel {}.", member.getIdLong(), serverId, message.getChannel().getIdLong());
|
||||||
|
}).exceptionally(throwable -> {
|
||||||
|
log.warn("Failed to send level up notification to user {} in server {} in channel {}.", member.getIdLong(), serverId, message.getChannel().getIdLong());
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
aUserExperience.setCurrentExperienceRole(calculatedNewRole);
|
||||||
|
}
|
||||||
|
aUserExperience.setMessageCount(aUserExperience.getMessageCount() + 1L);
|
||||||
|
if(userChangesLevel && featureModeService.featureModeActive(ExperienceFeatureDefinition.EXPERIENCE, server, ExperienceFeatureMode.LEVEL_ACTION)) {
|
||||||
|
levelActionService.applyLevelActionsToUser(aUserExperience, oldLevel)
|
||||||
|
.thenAccept(unused -> {
|
||||||
|
log.info("Executed level actions for user {}.", userInServerId);
|
||||||
|
})
|
||||||
|
.exceptionally(throwable -> {
|
||||||
|
log.warn("Failed to execute level actions for user {}.", userInServerId, throwable);
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if(aUserExperienceOptional.isEmpty()) {
|
||||||
|
userExperienceManagementService.saveUser(aUserExperience);
|
||||||
|
}
|
||||||
|
if(!Objects.equals(result.getOldRoleId(), result.getNewRoleId())) {
|
||||||
|
if(result.getOldRoleId() != null && result.getNewRoleId() != null) {
|
||||||
|
roleService.updateRolesIds(member, List.of(result.getOldRoleId()), List.of(result.getNewRoleId())).thenAccept(unused -> {
|
||||||
|
log.debug("Removed role {} from and added role {} to member {} in server {}.", result.getOldRoleId(), result.getNewRoleId(), member.getIdLong(), member.getGuild().getIdLong());
|
||||||
|
}).exceptionally(throwable -> {
|
||||||
|
log.warn("Failed to remove role {} from and add role {} to member {} in server {}.", result.getOldRoleId(), result.getNewRoleId(), member.getIdLong(), member.getGuild().getIdLong(), throwable);
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
if(result.getOldRoleId() != null) {
|
||||||
|
roleService.removeRoleFromMemberAsync(member, result.getOldRoleId()).thenAccept(unused -> {
|
||||||
|
log.debug("Removed role {} from member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong());
|
||||||
|
}).exceptionally(throwable -> {
|
||||||
|
log.warn("Failed to remove role {} from member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong(), throwable);
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if(result.getNewRoleId() != null) {
|
||||||
|
roleService.addRoleToMemberAsync(member, result.getNewRoleId()).thenAccept(unused -> {
|
||||||
|
log.debug("Added role {} to member {} in server {}.", result.getNewRoleId(), member.getIdLong(), member.getGuild().getIdLong());
|
||||||
|
}).exceptionally(throwable -> {
|
||||||
|
log.warn("Failed to add role {} to member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong(), throwable);
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -521,7 +521,7 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
|
|||||||
public LeaderBoardEntry getRankOfUserInServer(AUserInAServer userInAServer) {
|
public LeaderBoardEntry getRankOfUserInServer(AUserInAServer userInAServer) {
|
||||||
log.debug("Retrieving rank for {}", userInAServer.getUserReference().getId());
|
log.debug("Retrieving rank for {}", userInAServer.getUserReference().getId());
|
||||||
Optional<AUserExperience> aUserExperienceOptional = userExperienceManagementService.findByUserInServerIdOptional(userInAServer.getUserInServerId());
|
Optional<AUserExperience> aUserExperienceOptional = userExperienceManagementService.findByUserInServerIdOptional(userInAServer.getUserInServerId());
|
||||||
if(!aUserExperienceOptional.isPresent()) {
|
if(aUserExperienceOptional.isEmpty()) {
|
||||||
throw new NoExperienceTrackedException();
|
throw new NoExperienceTrackedException();
|
||||||
}
|
}
|
||||||
Integer rank = 0;
|
Integer rank = 0;
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ public class ExperienceLevelServiceBean implements ExperienceLevelService {
|
|||||||
if(level < 0) {
|
if(level < 0) {
|
||||||
throw new IllegalArgumentException("Level should not be less to 0.");
|
throw new IllegalArgumentException("Level should not be less to 0.");
|
||||||
}
|
}
|
||||||
return 5L * (level * level) + 50 * level + 100;
|
return 5L * ((long) level * level) + 50L * level + 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ public class ExperienceRoleServiceBean implements ExperienceRoleService {
|
|||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Void> unsetRoles(List<ARole> rolesToUnset, GuildMessageChannel messageChannel) {
|
public CompletableFuture<Void> unsetRoles(List<ARole> rolesToUnset, GuildMessageChannel messageChannel) {
|
||||||
List<AExperienceRole> rolesInServer = experienceRoleManagementService.getRolesInServer(rolesToUnset);
|
List<AExperienceRole> rolesInServer = experienceRoleManagementService.getRolesInServer(rolesToUnset);
|
||||||
Integer totalCount = 0;
|
int totalCount = 0;
|
||||||
for (AExperienceRole aExperienceRole : rolesInServer) {
|
for (AExperienceRole aExperienceRole : rolesInServer) {
|
||||||
totalCount += aExperienceRole.getUsers().size();
|
totalCount += aExperienceRole.getUsers().size();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package dev.sheldan.abstracto.experience.service;
|
package dev.sheldan.abstracto.experience.service;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
@@ -17,11 +18,9 @@ import java.util.concurrent.locks.ReentrantLock;
|
|||||||
@Component
|
@Component
|
||||||
public class RunTimeExperienceService {
|
public class RunTimeExperienceService {
|
||||||
|
|
||||||
private Map<Long,Map<Long, Instant>> runtimeExperience = new HashMap<>();
|
@Getter
|
||||||
|
private final Map<Long,Map<Long, Instant>> runtimeExperience = new HashMap<>();
|
||||||
private static final Lock lock = new ReentrantLock();
|
private static final Lock lock = new ReentrantLock();
|
||||||
public Map<Long, Map<Long, Instant>> getRuntimeExperience() {
|
|
||||||
return runtimeExperience;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Acquires the lock of the runtime experience data structure. Operations on it should only be done, while holding the lock
|
* Acquires the lock of the runtime experience data structure. Operations on it should only be done, while holding the lock
|
||||||
|
|||||||
Reference in New Issue
Block a user