added tests for experience tracking module

refactored some things in experience tracking
changed the paging behaviour for leader board and added check for negative numbers
fixed rank not being correct for further pages
added test-common module to have some common code für tests
fixed command creation
This commit is contained in:
Sheldan
2020-05-30 09:27:41 +02:00
parent 62de5c2255
commit 563564aabe
69 changed files with 2825 additions and 136 deletions

View File

@@ -24,7 +24,9 @@ public class DisableExpForRole extends AbstractConditionableCommand {
@Override
public CommandResult execute(CommandContext commandContext) {
ARole role = (ARole) commandContext.getParameters().getParameters().get(0);
checkParameters(commandContext);
List<Object> parameters = commandContext.getParameters().getParameters();
ARole role = (ARole) parameters.get(0);
if(!disabledExpRoleManagementService.isExperienceDisabledForRole(role)) {
disabledExpRoleManagementService.setRoleToBeDisabledForExp(role);
}

View File

@@ -29,6 +29,7 @@ public class DisableExpGain extends AbstractConditionableCommand {
@Override
public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
Member para = (Member) commandContext.getParameters().getParameters().get(0);
AUserInAServer userInAServer = userInServerManagementService.loadUser(para);
aUserExperienceService.disableExperienceForUser(userInAServer);

View File

@@ -24,6 +24,7 @@ public class EnableExpForRole extends AbstractConditionableCommand {
@Override
public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
ARole role = (ARole) commandContext.getParameters().getParameters().get(0);
if(disabledExpRoleManagementService.isExperienceDisabledForRole(role)) {
disabledExpRoleManagementService.removeRoleToBeDisabledForExp(role);

View File

@@ -29,6 +29,7 @@ public class EnableExpGain extends AbstractConditionableCommand {
@Override
public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
Member para = (Member) commandContext.getParameters().getParameters().get(0);
AUserInAServer userInAServer = userInServerManagementService.loadUser(para);
aUserExperienceService.enableExperienceForUser(userInAServer);

View File

@@ -27,6 +27,7 @@ public class ExpScale extends AbstractConditionableCommand {
@Override
public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
Double scale = (Double) commandContext.getParameters().getParameters().get(0);
Long guildId = commandContext.getGuild().getIdLong();
configService.setDoubleValue(EXP_MULTIPLIER_KEY, guildId, scale);

View File

@@ -15,7 +15,6 @@ import dev.sheldan.abstracto.experience.models.LeaderBoard;
import dev.sheldan.abstracto.experience.models.LeaderBoardEntry;
import dev.sheldan.abstracto.experience.models.templates.LeaderBoardModel;
import dev.sheldan.abstracto.experience.service.AUserExperienceService;
import dev.sheldan.abstracto.experience.service.management.UserExperienceManagementService;
import dev.sheldan.abstracto.templating.model.MessageToSend;
import dev.sheldan.abstracto.templating.service.TemplateService;
import lombok.extern.slf4j.Slf4j;
@@ -33,9 +32,6 @@ public class LeaderBoardCommand extends AbstractConditionableCommand {
@Autowired
private AUserExperienceService userExperienceService;
@Autowired
private UserExperienceManagementService userExperienceManagementService;
@Autowired
private TemplateService templateService;
@@ -48,9 +44,10 @@ public class LeaderBoardCommand extends AbstractConditionableCommand {
@Override
public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
List<Object> parameters = commandContext.getParameters().getParameters();
// parameter is optional, in case its not present, we default to the 0th page
Integer page = !parameters.isEmpty() ? (Integer) parameters.get(0) : 0;
Integer page = !parameters.isEmpty() ? (Integer) parameters.get(0) : 1;
LeaderBoard leaderBoard = userExperienceService.findLeaderBoardData(commandContext.getUserInitiatedContext().getServer(), page);
LeaderBoardModel leaderBoardModel = (LeaderBoardModel) ContextConverter.fromCommandContext(commandContext, LeaderBoardModel.class);
leaderBoardModel.setUserExperiences(converter.fromLeaderBoard(leaderBoard));

View File

@@ -35,6 +35,7 @@ public class ListDisabledExperienceRoles extends AbstractConditionableCommand {
@Override
public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
List<ADisabledExpRole> disabledRolesForServer = disabledExpRoleManagementService.getDisabledRolesForServer(commandContext.getUserInitiatedContext().getServer());
DisabledExperienceRolesModel disabledExperienceRolesModel = (DisabledExperienceRolesModel) ContextConverter.fromCommandContext(commandContext, DisabledExperienceRolesModel.class);
disabledRolesForServer.forEach(aDisabledExpRole -> {

View File

@@ -41,11 +41,12 @@ public class Rank extends AbstractConditionableCommand {
private ExperienceLevelService experienceLevelService;
@Autowired
protected ChannelService channelService;
private ChannelService channelService;
@Override
public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
RankModel rankModel = (RankModel) ContextConverter.fromCommandContext(commandContext, RankModel.class);
LeaderBoardEntry userRank = userExperienceService.getRankOfUserInServer(commandContext.getUserInitiatedContext().getAUserInAServer());
rankModel.setRankUser(converter.fromLeaderBoardEntry(userRank));

View File

@@ -11,17 +11,14 @@ import dev.sheldan.abstracto.core.exception.RoleNotFoundInGuildException;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.RoleService;
import dev.sheldan.abstracto.core.service.management.RoleManagementService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeature;
import dev.sheldan.abstracto.experience.service.ExperienceRoleService;
import dev.sheldan.abstracto.templating.service.TemplateService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@Component
@Slf4j
@@ -30,31 +27,21 @@ public class SetExpRole extends AbstractConditionableCommand {
@Autowired
private ExperienceRoleService experienceRoleService;
@Autowired
private RoleManagementService roleManagementService;
@Autowired
private RoleService roleService;
@Autowired
private TemplateService templateService;
@Override
public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
Integer level = (Integer) commandContext.getParameters().getParameters().get(0);
Long roleId = (Long) commandContext.getParameters().getParameters().get(1);
Optional<ARole> roleOpt = roleManagementService.findRole(roleId, commandContext.getUserInitiatedContext().getServer());
if(roleOpt.isPresent()) {
ARole role = roleOpt.get();
AServer server = commandContext.getUserInitiatedContext().getServer();
if(!roleService.isRoleInServer(role)) {
throw new RoleNotFoundInGuildException(role.getId(), server.getId());
}
log.info("Setting role {} to be used for level {} on server {}", roleId, level, server.getId());
experienceRoleService.setRoleToLevel(role, level, server, commandContext.getUserInitiatedContext().getChannel());
return CommandResult.fromSuccess();
ARole role = (ARole) commandContext.getParameters().getParameters().get(1);
AServer server = commandContext.getUserInitiatedContext().getServer();
if(!roleService.isRoleInServer(role)) {
throw new RoleNotFoundInGuildException(role.getId(), server.getId());
}
return CommandResult.fromError(templateService.renderTemplate("could_not_find_role", new Object()));
log.info("Setting role {} to be used for level {} on server {}", role.getId(), level, server.getId());
experienceRoleService.setRoleToLevel(role, level, commandContext.getUserInitiatedContext().getChannel());
return CommandResult.fromSuccess();
}
@Override

View File

@@ -8,7 +8,6 @@ import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.service.management.RoleManagementService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeature;
import dev.sheldan.abstracto.experience.service.ExperienceRoleService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -20,18 +19,16 @@ import java.util.List;
@Component
public class UnSetExpRole extends AbstractConditionableCommand {
@Autowired
private RoleManagementService roleManagementService;
@Autowired
private ExperienceRoleService experienceRoleService;
@Override
public CommandResult execute(CommandContext commandContext) {
checkParameters(commandContext);
ARole role = (ARole) commandContext.getParameters().getParameters().get(0);
// do not check for the existence of the role, because if the role was deleted, users should be able
// to get rid of it in the configuration
experienceRoleService.unsetRole(role, commandContext.getUserInitiatedContext().getServer(), commandContext.getUserInitiatedContext().getChannel());
experienceRoleService.unsetRole(role, commandContext.getUserInitiatedContext().getChannel());
return CommandResult.fromSuccess();
}

View File

@@ -23,7 +23,7 @@ public class ExperienceConfig {
/**
* The default multiplier from the properties file. This is used, when the bot joins a new guild.
*/
private Integer expMultiplier;
private Double expMultiplier;
/**
* The defaul maxLevel from the properties file. This configuration applies globally, as the amount of levels does not depend on the server.

View File

@@ -3,6 +3,7 @@ package dev.sheldan.abstracto.experience.config;
import dev.sheldan.abstracto.core.listener.ServerConfigListener;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.management.ConfigManagementService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeatureConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -24,8 +25,8 @@ public class ExperienceConfigListener implements ServerConfigListener {
@Override
public void updateServerConfig(AServer server) {
log.info("Setting up experience configuration for server {}.", server.getId());
service.createIfNotExists(server.getId(), "minExp", experienceConfig.getMinExp().longValue());
service.createIfNotExists(server.getId(), "maxExp", experienceConfig.getMaxExp().longValue());
service.createIfNotExists(server.getId(), "expMultiplier", experienceConfig.getExpMultiplier().doubleValue());
service.createIfNotExists(server.getId(), ExperienceFeatureConfig.MIN_EXP_KEY, experienceConfig.getMinExp().longValue());
service.createIfNotExists(server.getId(), ExperienceFeatureConfig.MAX_EXP_KEY, experienceConfig.getMaxExp().longValue());
service.createIfNotExists(server.getId(), ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, experienceConfig.getExpMultiplier());
}
}

View File

@@ -1,12 +1,14 @@
package dev.sheldan.abstracto.experience.config;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeatureConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@Component
public class ExperienceDefaultConfigListener {
@@ -19,8 +21,8 @@ public class ExperienceDefaultConfigListener {
@EventListener
@Transactional
public void handleContextRefreshEvent(ContextRefreshedEvent ctxStartEvt) {
defaultConfigManagementService.createDefaultConfig("minExp", experienceConfig.getMinExp().longValue());
defaultConfigManagementService.createDefaultConfig("maxExp", experienceConfig.getMaxExp().longValue());
defaultConfigManagementService.createDefaultConfig("expMultiplier", experienceConfig.getExpMultiplier().doubleValue());
defaultConfigManagementService.createDefaultConfig(ExperienceFeatureConfig.MIN_EXP_KEY, experienceConfig.getMinExp().longValue());
defaultConfigManagementService.createDefaultConfig(ExperienceFeatureConfig.MAX_EXP_KEY, experienceConfig.getMaxExp().longValue());
defaultConfigManagementService.createDefaultConfig(ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, experienceConfig.getExpMultiplier());
}
}

View File

@@ -12,7 +12,7 @@ import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
@@ -32,7 +32,7 @@ public class ExperiencePersistingJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
HashMap<Long, List<AServer>> runtimeExperience = userExperienceService.getRuntimeExperience();
Map<Long, List<AServer>> runtimeExperience = userExperienceService.getRuntimeExperience();
log.info("Running experience persisting job.");
Long pastMinute = (Instant.now().getEpochSecond() / 60) - 1;
if(runtimeExperience.containsKey(pastMinute)) {

View File

@@ -18,12 +18,11 @@ import java.util.List;
public interface ExperienceRoleRepository extends JpaRepository<AExperienceRole, Long> {
/**
* Finds the {@link AExperienceRole} of the given {@link AServer} and {@link ARole}
* @param server The {@link AServer} to retrieve the {@link AExperienceRole} for
* @param role The {@link ARole} to filter for
* @return The {@link AExperienceRole} found or null if the query did not return any results
*/
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
AExperienceRole findByRoleServerAndRole(AServer server, ARole role);
AExperienceRole findByRole(ARole role);
/**
* Finds a list of {@link AExperienceRole} (if there are multiple ones, because of misconfiguration) of the given

View File

@@ -1,6 +1,5 @@
package dev.sheldan.abstracto.experience.service;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
@@ -9,6 +8,7 @@ import dev.sheldan.abstracto.core.service.BotService;
import dev.sheldan.abstracto.core.service.ConfigService;
import dev.sheldan.abstracto.core.service.MessageService;
import dev.sheldan.abstracto.core.service.RoleService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeatureConfig;
import dev.sheldan.abstracto.experience.models.database.*;
import dev.sheldan.abstracto.experience.models.LeaderBoard;
import dev.sheldan.abstracto.experience.models.LeaderBoardEntry;
@@ -36,7 +36,6 @@ import java.util.stream.Collectors;
@Slf4j
public class AUserExperienceServiceBean implements AUserExperienceService {
private HashMap<Long, List<AServer>> runtimeExperience = new HashMap<>();
@Autowired
private UserExperienceManagementService userExperienceManagementService;
@@ -68,6 +67,9 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
@Autowired
private BotService botService;
@Autowired
private RunTimeExperienceService runTimeExperienceService;
/**
* Creates the user in the runtime experience, if the user was not in yet. Also creates an entry for the minute, if necessary.
* @param userInAServer The {@link AUserInAServer} to be added to the list of users gaining experience
@@ -75,6 +77,7 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
@Override
public void addExperience(AUserInAServer userInAServer) {
Long second = Instant.now().getEpochSecond() / 60;
Map<Long, List<AServer>> runtimeExperience = runTimeExperienceService.getRuntimeExperience();
if(runtimeExperience.containsKey(second)) {
List<AServer> existing = runtimeExperience.get(second);
existing.forEach(server -> {
@@ -94,39 +97,40 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
}
@Override
public HashMap<Long, List<AServer>> getRuntimeExperience() {
return runtimeExperience;
public Map<Long, List<AServer>> getRuntimeExperience() {
return runTimeExperienceService.getRuntimeExperience();
}
/**
* Calculates the level of the given {@link AUserExperience} accoring to the given {@link AExperienceLevel} list
* @param experience The {@link AUserExperience} to calculate the level for
* @param levels The list of {@link AExperienceLevel} representing the level configuration
* @param levels The list of {@link AExperienceLevel} representing the level configuration, this must include the initial level 0
* * This level will be taken as the initial value, and if no other level qualifies, this will be taken.
* The levels must be ordered.
* @return The appropriate level according to the level config
*/
@Override
public Integer calculateLevel(AUserExperience experience, List<AExperienceLevel> levels) {
public AExperienceLevel calculateLevel(AUserExperience experience, List<AExperienceLevel> levels) {
AExperienceLevel lastLevel = levels.get(0);
for (AExperienceLevel level : levels) {
if(level.getExperienceNeeded() >= experience.getExperience()) {
return lastLevel.getLevel();
return lastLevel;
} else {
lastLevel = level;
}
}
return lastLevel.getLevel();
return lastLevel;
}
@Override
public boolean updateUserlevel(AUserExperience userExperience, List<AExperienceLevel> levels) {
public boolean updateUserLevel(AUserExperience userExperience, List<AExperienceLevel> levels) {
AUserInAServer user = userExperience.getUser();
Integer correctLevel = calculateLevel(userExperience, levels);
AExperienceLevel correctLevel = calculateLevel(userExperience, levels);
Integer currentLevel = userExperience.getCurrentLevel() != null ? userExperience.getCurrentLevel().getLevel() : 0;
if(!correctLevel.equals(currentLevel)) {
log.info("User {} leveled from {} to {}", user.getUserReference().getId(), currentLevel, correctLevel);
AExperienceLevel currentLevel1 = experienceLevelManagementService.getLevel(correctLevel)
.orElseThrow(() -> new AbstractoRunTimeException(String.format("Could not find level %s", correctLevel)));
userExperience.setCurrentLevel(currentLevel1);
if(!correctLevel.getLevel().equals(currentLevel)) {
log.info("User {} leveled from {} to {}", user.getUserReference().getId(), currentLevel, correctLevel.getLevel());
userExperience.setCurrentLevel(correctLevel);
return true;
}
return false;
@@ -145,9 +149,9 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
public void handleExperienceGain(List<AServer> servers) {
servers.forEach(serverExp -> {
log.trace("Handling experience for server {}", serverExp.getId());
int minExp = configService.getLongValue("minExp", serverExp.getId()).intValue();
int maxExp = configService.getLongValue("maxExp", serverExp.getId()).intValue();
Double multiplier = configService.getDoubleValue("expMultiplier", serverExp.getId());
int minExp = configService.getLongValue(ExperienceFeatureConfig.MIN_EXP_KEY, serverExp.getId()).intValue();
int maxExp = configService.getLongValue(ExperienceFeatureConfig.MAX_EXP_KEY, serverExp.getId()).intValue();
Double multiplier = configService.getDoubleValue(ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, serverExp.getId());
PrimitiveIterator.OfInt iterator = new Random().ints(serverExp.getUsers().size(), minExp, maxExp + 1).iterator();
List<AExperienceLevel> levels = experienceLevelManagementService.getLevelConfig();
levels.sort(Comparator.comparing(AExperienceLevel::getExperienceNeeded));
@@ -163,7 +167,7 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
log.trace("Handling {}. The user gains {}", userInAServer.getUserReference().getId(), gainedExperience);
AUserExperience aUserExperience = userExperienceManagementService.incrementExpForUser(userInAServer, gainedExperience.longValue(), 1L);
if(Boolean.FALSE.equals(aUserExperience.getExperienceGainDisabled())) {
updateUserlevel(aUserExperience, levels);
updateUserLevel(aUserExperience, levels);
updateUserRole(aUserExperience, roles);
userExperienceManagementService.saveUser(aUserExperience);
} else {
@@ -299,11 +303,16 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
*/
@Override
public LeaderBoard findLeaderBoardData(AServer server, Integer page) {
List<AUserExperience> experiences = userExperienceManagementService.findLeaderboardUsersPaginated(server, page * 10, (page +1) * 10);
if(page <= 0) {
throw new IllegalArgumentException("Page needs to be >= 1");
}
page--;
int pageSize = 10;
List<AUserExperience> experiences = userExperienceManagementService.findLeaderboardUsersPaginated(server, page * pageSize, (page + 1) * pageSize);
List<LeaderBoardEntry> entries = new ArrayList<>();
for (int i = 0; i < experiences.size(); i++) {
AUserExperience userExperience = experiences.get(i);
entries.add(LeaderBoardEntry.builder().experience(userExperience).rank(i + 1).build());
entries.add(LeaderBoardEntry.builder().experience(userExperience).rank((page * pageSize) + i + 1).build());
}
return LeaderBoard.builder().entries(entries).build();
}
@@ -316,19 +325,15 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
@Override
public LeaderBoardEntry getRankOfUserInServer(AUserInAServer userInAServer) {
log.info("Retrieving rank for {}", userInAServer.getUserReference().getId());
AUserExperience experience = userExperienceManagementService.findUserInServer(userInAServer);
LeaderBoardEntryResult rankOfUserInServer = userExperienceManagementService.getRankOfUserInServer(experience);
AExperienceLevel currentLevel = experienceLevelManagementService.getLevel(rankOfUserInServer.getLevel())
.orElseThrow(() -> new AbstractoRunTimeException(String.format("Could not find level %s", rankOfUserInServer.getLevel())));
AUserExperience aUserExperience = AUserExperience
.builder()
.experience(rankOfUserInServer.getExperience())
.user(userInAServer)
.messageCount(rankOfUserInServer.getMessageCount())
.id(userInAServer.getUserInServerId())
.currentLevel(currentLevel)
.build();
return LeaderBoardEntry.builder().experience(aUserExperience).rank(rankOfUserInServer.getRank()).build();
AUserExperience aUserExperience = userExperienceManagementService.findUserInServer(userInAServer);
Integer rank = 0;
if(aUserExperience != null) {
LeaderBoardEntryResult rankOfUserInServer = userExperienceManagementService.getRankOfUserInServer(aUserExperience);
if(rankOfUserInServer != null) {
rank = rankOfUserInServer.getRank();
}
}
return LeaderBoardEntry.builder().experience(aUserExperience).rank(rank).build();
}
}

View File

@@ -41,7 +41,10 @@ public class ExperienceLevelServiceBean implements ExperienceLevelService {
* @param level The level to calculate the experience amount for
* @return The needed experience to reach this level, if the user already has the level below the passed one
*/
private Long calculateExperienceForLevel(Integer level) {
public Long calculateExperienceForLevel(Integer level) {
if(level < 0) {
throw new IllegalArgumentException("Level should not be less to 0.");
}
return 5L * (level * level) + 50 * level + 100;
}

View File

@@ -1,6 +1,5 @@
package dev.sheldan.abstracto.experience.service;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
@@ -35,14 +34,13 @@ public class ExperienceRoleServiceBean implements ExperienceRoleService {
* in the given {@link AServer}
* @param role The {@link ARole} to set the level to
* @param level The level the {@link ARole} should be awareded at
* @param server The {@link AServer} for which this configuration should be done
*/
@Override
public void setRoleToLevel(ARole role, Integer level, AServer server, AChannel feedbackChannel) {
AExperienceLevel experienceLevel = experienceLevelService.getLevel(level).orElseThrow(() -> new AbstractoRunTimeException(String.format("Could not find level %s", level)));
unsetRole(role, server, feedbackChannel);
experienceRoleManagementService.removeAllRoleAssignmentsForLevelInServer(experienceLevel, server);
experienceRoleManagementService.setLevelToRole(experienceLevel, role, server);
public void setRoleToLevel(ARole role, Integer level, AChannel feedbackChannel) {
AExperienceLevel experienceLevel = experienceLevelService.getLevel(level).orElseThrow(() -> new IllegalArgumentException(String.format("Could not find level %s", level)));
unsetRole(role, feedbackChannel);
experienceRoleManagementService.removeAllRoleAssignmentsForLevelInServer(experienceLevel, role.getServer());
experienceRoleManagementService.setLevelToRole(experienceLevel, role);
}
/**
@@ -50,15 +48,14 @@ public class ExperienceRoleServiceBean implements ExperienceRoleService {
* {@link net.dv8tion.jda.api.entities.Role}.
* @param role The {@link ARole} to remove from the {@link dev.sheldan.abstracto.experience.models.database.AExperienceRole}
* configuration
* @param server The {@link AServer} for which the {@link ARole} should be removed from the configuration
*/
@Override
public void unsetRole(ARole role, AServer server, AChannel feedbackChannel) {
AExperienceRole roleInServer = experienceRoleManagementService.getRoleInServer(role, server);
public void unsetRole(ARole role, AChannel feedbackChannel) {
AExperienceRole roleInServer = experienceRoleManagementService.getRoleInServer(role);
if(roleInServer != null) {
if(!roleInServer.getUsers().isEmpty()) {
log.info("Recalculating the roles for {} users, because their current role was removed from experience tracking.", roleInServer.getUsers().size());
List<AExperienceRole> roles = experienceRoleManagementService.getExperienceRolesForServer(server);
List<AExperienceRole> roles = experienceRoleManagementService.getExperienceRolesForServer(role.getServer());
roles.removeIf(role1 -> role1.getId().equals(roleInServer.getId()));
userExperienceService.executeActionOnUserExperiencesWithFeedBack(roleInServer.getUsers(), feedbackChannel,
@@ -93,7 +90,7 @@ public class ExperienceRoleServiceBean implements ExperienceRoleService {
@Override
public AExperienceLevel getLevelOfNextRole(AExperienceLevel startLevel, AServer server) {
List<AExperienceRole> roles = experienceRoleManagementService.getExperienceRolesForServer(server);
roles = roles.stream().filter(role -> role.getLevel().getLevel() < startLevel.getLevel()).collect(Collectors.toList());
roles = roles.stream().filter(role -> role.getLevel().getLevel() > startLevel.getLevel()).collect(Collectors.toList());
roles.sort(Comparator.comparing(role -> role.getLevel().getLevel()));
AExperienceRole aExperienceRole = roles.stream().findFirst().orElse(null);
return aExperienceRole != null ? aExperienceRole.getLevel() : AExperienceLevel.builder().level(200).build();

View File

@@ -0,0 +1,18 @@
package dev.sheldan.abstracto.experience.service;
import dev.sheldan.abstracto.core.models.database.AServer;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class RunTimeExperienceService {
private Map<Long, List<AServer>> runtimeExperience = new HashMap<>();
public Map<Long, List<AServer>> getRuntimeExperience() {
return runtimeExperience;
}
}

View File

@@ -22,8 +22,7 @@ public class DisabledExpRoleManagementServiceBean implements DisabledExpRoleMana
.role(role)
.build();
disabledExpRoleRepository.save(newRole);
return newRole;
return disabledExpRoleRepository.save(newRole);
}
@Override

View File

@@ -21,8 +21,7 @@ public class ExperienceLevelManagementServiceBean implements ExperienceLevelMana
.experienceNeeded(neededExperience)
.level(level)
.build();
experienceLevelRepository.save(experienceLevel);
return experienceLevel;
return experienceLevelRepository.save(experienceLevel);
}
@Override

View File

@@ -36,8 +36,8 @@ public class ExperienceRoleManagementServiceBean implements ExperienceRoleManage
}
@Override
public AExperienceRole getRoleInServer(ARole role, AServer server) {
return experienceRoleRepository.findByRoleServerAndRole(server, role);
public AExperienceRole getRoleInServer(ARole role) {
return experienceRoleRepository.findByRole(role);
}
@Override
@@ -46,18 +46,19 @@ public class ExperienceRoleManagementServiceBean implements ExperienceRoleManage
}
@Override
public void setLevelToRole(AExperienceLevel level, ARole role, AServer server) {
AExperienceRole byRoleServerAndRole = experienceRoleRepository.findByRoleServerAndRole(server, role);
public AExperienceRole setLevelToRole(AExperienceLevel level, ARole role) {
AExperienceRole byRoleServerAndRole = experienceRoleRepository.findByRole(role);
if(byRoleServerAndRole != null) {
byRoleServerAndRole.setLevel(level);
} else {
byRoleServerAndRole = AExperienceRole
.builder()
.level(level)
.roleServer(server)
.roleServer(role.getServer())
.role(role)
.build();
byRoleServerAndRole = experienceRoleRepository.save(byRoleServerAndRole);
}
experienceRoleRepository.save(byRoleServerAndRole);
return byRoleServerAndRole;
}
}

View File

@@ -90,8 +90,8 @@ public class UserExperienceManagementServiceBean implements UserExperienceManage
}
@Override
public void saveUser(AUserExperience userExperience) {
repository.save(userExperience);
public AUserExperience saveUser(AUserExperience userExperience) {
return repository.save(userExperience);
}
}