added check to check if a role is in the server

added more log output
This commit is contained in:
Sheldan
2020-04-21 19:25:12 +02:00
parent 5edb2e4cc8
commit 7b56b89157
29 changed files with 126 additions and 40 deletions

View File

@@ -8,6 +8,7 @@ import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.service.ConfigService;
import dev.sheldan.abstracto.experience.config.ExperienceFeatures;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -15,6 +16,7 @@ import java.util.ArrayList;
import java.util.List;
@Component
@Slf4j
public class ExpScale extends AbstractConditionableCommand {
public static final String EXP_MULTIPLIER_KEY = "expMultiplier";
@@ -24,7 +26,9 @@ public class ExpScale extends AbstractConditionableCommand {
@Override
public CommandResult execute(CommandContext commandContext) {
Double scale = (Double) commandContext.getParameters().getParameters().get(0);
configService.setDoubleValue(EXP_MULTIPLIER_KEY, commandContext.getGuild().getIdLong(), scale);
Long guildId = commandContext.getGuild().getIdLong();
configService.setDoubleValue(EXP_MULTIPLIER_KEY, guildId, scale);
log.info("Setting experience scale to {} for {}", scale, guildId);
return CommandResult.fromSuccess();
}

View File

@@ -6,10 +6,15 @@ import dev.sheldan.abstracto.core.command.config.HelpInfo;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.exception.RoleException;
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.ExperienceFeatures;
import dev.sheldan.abstracto.experience.service.ExperienceRoleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -17,7 +22,8 @@ import java.util.ArrayList;
import java.util.List;
@Component
public class SetRole extends AbstractConditionableCommand {
@Slf4j
public class SetExpRole extends AbstractConditionableCommand {
@Autowired
private ExperienceRoleService experienceRoleService;
@@ -25,13 +31,21 @@ public class SetRole extends AbstractConditionableCommand {
@Autowired
private RoleManagementService roleManagementService;
@Autowired
private RoleService roleService;
@Override
public CommandResult execute(CommandContext commandContext) {
Integer level = (Integer) commandContext.getParameters().getParameters().get(0);
Long roleId = (Long) commandContext.getParameters().getParameters().get(1);
ARole role = roleManagementService.findRole(roleId);
experienceRoleService.setRoleToLevel(role, level, commandContext.getUserInitiatedContext().getServer());
AServer server = commandContext.getUserInitiatedContext().getServer();
if(!roleService.isRoleInServer(server, role)) {
throw new RoleException("Role not found.");
}
log.info("Setting role {} to be used for level {} on server {}", roleId, level, server.getId());
experienceRoleService.setRoleToLevel(role, level, server);
return CommandResult.fromSuccess();
}
@@ -40,9 +54,9 @@ public class SetRole extends AbstractConditionableCommand {
List<Parameter> parameters = new ArrayList<>();
parameters.add(Parameter.builder().name("level").type(Integer.class).build());
parameters.add(Parameter.builder().name("roleId").type(Long.class).build());
HelpInfo helpInfo = HelpInfo.builder().longHelp("Sets the role to a certain level").usage("setRole <level> <roleId>").build();
HelpInfo helpInfo = HelpInfo.builder().longHelp("Sets the role to a certain level").usage("setExpRole <level> <roleId>").build();
return CommandConfiguration.builder()
.name("setRole")
.name("setExpRole")
.module(ExperienceModule.EXPERIENCE)
.description("Sets the role to a certain level")
.causesReaction(true)

View File

@@ -6,8 +6,10 @@ import dev.sheldan.abstracto.core.command.config.HelpInfo;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.execution.CommandResult;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.experience.config.ExperienceFeatures;
import dev.sheldan.abstracto.experience.service.ExperienceTrackerService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -15,6 +17,7 @@ import java.util.ArrayList;
import java.util.List;
@Component
@Slf4j
public class SyncRoles extends AbstractConditionableCommand {
@Autowired
@@ -22,7 +25,9 @@ public class SyncRoles extends AbstractConditionableCommand {
@Override
public CommandResult execute(CommandContext commandContext) {
experienceTrackerService.syncUserRolesWithFeedback(commandContext.getUserInitiatedContext().getServer(), commandContext.getUserInitiatedContext().getChannel());
AServer server = commandContext.getUserInitiatedContext().getServer();
log.info("Synchronizing roles on server {}", server.getId());
experienceTrackerService.syncUserRolesWithFeedback(server, commandContext.getUserInitiatedContext().getChannel());
return CommandResult.fromSuccess();
}

View File

@@ -17,7 +17,7 @@ import java.util.ArrayList;
import java.util.List;
@Component
public class UnSetRole extends AbstractConditionableCommand {
public class UnSetExpRole extends AbstractConditionableCommand {
@Autowired
private RoleManagementService roleManagementService;
@@ -25,7 +25,6 @@ public class UnSetRole extends AbstractConditionableCommand {
@Autowired
private ExperienceRoleService experienceRoleService;
@Override
public CommandResult execute(CommandContext commandContext) {
Long roleId = (Long) commandContext.getParameters().getParameters().get(0);
@@ -38,9 +37,9 @@ public class UnSetRole extends AbstractConditionableCommand {
public CommandConfiguration getConfiguration() {
List<Parameter> parameters = new ArrayList<>();
parameters.add(Parameter.builder().name("roleId").type(Long.class).build());
HelpInfo helpInfo = HelpInfo.builder().longHelp("Removes the role from the experience tracking").usage("unsetRole <roleId>").build();
HelpInfo helpInfo = HelpInfo.builder().longHelp("Removes the role from the experience tracking").usage("unSetExpRole <roleId>").build();
return CommandConfiguration.builder()
.name("unsetRole")
.name("unSetExpRole")
.module(ExperienceModule.EXPERIENCE)
.description("Removes the role from experience tracking")
.causesReaction(true)

View File

@@ -20,7 +20,7 @@ public class ExperienceConfigListener implements ServerConfigListener {
@Override
public void updateServerConfig(AServer server) {
log.info("Setting up experience for {}", server.getId());
log.info("Setting up experience configuration for server {}.", server.getId());
service.createDoubleValueIfNotExist("minExp", server.getId(), experienceConfig.getMinExp().doubleValue());
service.createDoubleValueIfNotExist("maxExp", server.getId(), experienceConfig.getMaxExp().doubleValue());
service.createDoubleValueIfNotExist("expMultiplier", server.getId(), experienceConfig.getExpMultiplier().doubleValue());

View File

@@ -21,6 +21,7 @@ public class ExperienceLevelLoader {
public void handleContextRefreshEvent(ContextRefreshedEvent ctxStartEvt) {
Integer maxLevel = experienceConfig.getMaxLvl();
Long experience = 0L;
log.info("Setting up experience level configuration.");
experienceLevelService.createExperienceLevel(0, 0L);
for (int i = 1; i < maxLevel; i++) {
experience = experience + experienceLevelService.calculateExperienceForLevel(i - 1);

View File

@@ -28,9 +28,10 @@ public class ExperiencePersistingJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
HashMap<Long, List<AServer>> runtimeExperience = experienceTrackerService.getRuntimeExperience();
log.info("Persisting experience");
log.info("Running experience persisting job.");
Long pastMinute = (Instant.now().getEpochSecond() / 60) - 1;
if(runtimeExperience.containsKey(pastMinute)) {
log.info("Found experience to persist.");
experienceTrackerService.handleExperienceGain(runtimeExperience.get(pastMinute));
runtimeExperience.remove(pastMinute);
}

View File

@@ -7,12 +7,14 @@ import dev.sheldan.abstracto.experience.config.ExperienceFeatures;
import dev.sheldan.abstracto.experience.models.database.AUserExperience;
import dev.sheldan.abstracto.experience.service.ExperienceTrackerService;
import dev.sheldan.abstracto.experience.service.management.UserExperienceManagementService;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class JoiningUserRoleListener implements JoinListener {
@Autowired
@@ -28,6 +30,7 @@ public class JoiningUserRoleListener implements JoinListener {
public void execute(Member member, Guild guild, AUserInAServer aUserInAServer) {
AUserExperience userExperience = userExperienceManagementService.findUserInServer(aUserInAServer);
if(userExperience != null) {
log.info("User {} joined {} with previous experience. Setting up experience role again (if necessary).", member.getUser().getIdLong(), guild.getIdLong());
experienceTrackerService.syncForSingleUser(userExperience);
}
}

View File

@@ -2,10 +2,12 @@ package dev.sheldan.abstracto.experience.service;
import dev.sheldan.abstracto.experience.models.database.AExperienceLevel;
import dev.sheldan.abstracto.experience.service.management.ExperienceLevelManagementService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class ExperienceLevelServiceBean implements ExperienceLevelService {
@Autowired
@@ -14,6 +16,7 @@ public class ExperienceLevelServiceBean implements ExperienceLevelService {
@Override
public void createExperienceLevel(Integer level, Long experienceNeeded) {
if(!experienceLevelManagementService.levelExists(level)) {
log.trace("Creating new experience level {} with experience needed {}.", level, experienceNeeded);
experienceLevelManagementService.createExperienceLevel(level, experienceNeeded);
}
}

View File

@@ -7,12 +7,14 @@ import dev.sheldan.abstracto.experience.models.database.AExperienceRole;
import dev.sheldan.abstracto.experience.service.management.ExperienceLevelManagementService;
import dev.sheldan.abstracto.experience.service.management.ExperienceRoleManagementService;
import dev.sheldan.abstracto.experience.service.management.UserExperienceManagementService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Slf4j
public class ExperienceRoleServiceBean implements ExperienceRoleService {
@Autowired
@@ -38,6 +40,7 @@ public class ExperienceRoleServiceBean implements ExperienceRoleService {
public void unsetRole(ARole role, AServer server) {
AExperienceRole roleInServer = experienceRoleManagementService.getRoleInServer(role, server);
if(roleInServer.getUsers().size() > 0) {
log.info("Recalculating the roles for {} users, because their current role was removed from experience tracking.", roleInServer.getUsers().size());
roleInServer.getUsers().forEach(userExperience -> {
List<AExperienceRole> roles = experienceRoleManagementService.getExperienceRoleForServer(server);
roles.removeIf(role1 -> role1.getId().equals(roleInServer.getId()));

View File

@@ -60,6 +60,7 @@ public class ExperienceTrackerServiceBean implements ExperienceTrackerService {
@Override
public void addExperience(AUserInAServer userInAServer) {
log.trace("Adding experience for user {} in server {}", userInAServer.getUserReference().getId(), userInAServer.getServerReference().getId());
Long second = Instant.now().getEpochSecond() / 60;
if(runtimeExperience.containsKey(second)) {
List<AServer> existing = runtimeExperience.get(second);
@@ -115,11 +116,13 @@ public class ExperienceTrackerServiceBean implements ExperienceTrackerService {
@Override
public void increaseExpForUser(AUserExperience userInAServer, Long experience, List<AExperienceLevel> levels) {
AUserInAServer user = userInAServer.getUser();
log.trace("Increasing experience for user {} in server {} by {}.", user.getUserReference().getId(), user.getServerReference().getId(), experience);
userInAServer.setExperience(userInAServer.getExperience() + experience);
Integer correctLevel = calculateLevel(userInAServer, levels);
Integer currentLevel = userInAServer.getCurrentLevel() != null ? userInAServer.getCurrentLevel().getLevel() : 0;
if(!correctLevel.equals(currentLevel)) {
log.info("User {} leveled from {} to {}", userInAServer.getUser().getUserReference().getId(), currentLevel, correctLevel);
log.info("User {} leveled from {} to {}", user.getUserReference().getId(), currentLevel, correctLevel);
userInAServer.setCurrentLevel(experienceLevelManagementService.getLevel(correctLevel));
}
}
@@ -128,7 +131,7 @@ public class ExperienceTrackerServiceBean implements ExperienceTrackerService {
@Override
public void handleExperienceGain(List<AServer> servers) {
servers.forEach(serverExp -> {
log.debug("Handling experience for server {}", serverExp.getId());
log.trace("Handling experience for server {}", serverExp.getId());
int minExp = configService.getDoubleValue("minExp", serverExp.getId()).intValue();
int maxExp = configService.getDoubleValue("maxExp", serverExp.getId()).intValue();
Integer multiplier = configService.getDoubleValue("expMultiplier", serverExp.getId()).intValue();
@@ -136,10 +139,11 @@ public class ExperienceTrackerServiceBean implements ExperienceTrackerService {
List<AExperienceLevel> levels = experienceLevelManagementService.getLevelConfig();
List<AExperienceRole> roles = experienceRoleManagementService.getExperienceRoleForServer(serverExp);
levels.sort(Comparator.comparing(AExperienceLevel::getExperienceNeeded));
roles.sort(Comparator.comparing(role -> role.getLevel().getLevel()));
serverExp.getUsers().forEach(userInAServer -> {
Integer gainedExperience = iterator.next();
gainedExperience *= multiplier;
log.debug("Handling {}. The user gains {}", userInAServer.getUserReference().getId(), gainedExperience);
log.trace("Handling {}. The user gains {}", userInAServer.getUserReference().getId(), gainedExperience);
AUserExperience userExperience = userExperienceManagementService.findUserInServer(userInAServer);
increaseExpForUser(userExperience, gainedExperience.longValue(), levels);
userExperience.setMessageCount(userExperience.getMessageCount() + 1);
@@ -150,21 +154,23 @@ public class ExperienceTrackerServiceBean implements ExperienceTrackerService {
@Override
public void handleExperienceRoleForUser(AUserExperience userExperience, List<AExperienceRole> roles) {
AUserInAServer user = userExperience.getUser();
log.trace("Updating experience role for user {} in server {}", user.getUserReference().getId(), user.getServerReference().getId());
AExperienceRole role = calculateRole(userExperience, roles);
boolean currentlyHasNoExperienceRole = userExperience.getCurrentExperienceRole() == null;
if(role == null) {
if(!currentlyHasNoExperienceRole){
roleService.removeRoleFromUser(userExperience.getUser(), userExperience.getCurrentExperienceRole().getRole());
roleService.removeRoleFromUser(user, userExperience.getCurrentExperienceRole().getRole());
}
return;
}
if(currentlyHasNoExperienceRole || !role.getRole().getId().equals(userExperience.getCurrentExperienceRole().getRole().getId())) {
log.info("User {} gets a new role {}", userExperience.getUser().getUserReference().getId(), role.getRole().getId());
log.info("User {} in server {} gets a new role {}", user.getUserReference().getId(), user.getServerReference().getId(), role.getRole().getId());
if(!currentlyHasNoExperienceRole) {
roleService.removeRoleFromUser(userExperience.getUser(), userExperience.getCurrentExperienceRole().getRole());
roleService.removeRoleFromUser(user, userExperience.getCurrentExperienceRole().getRole());
}
userExperience.setCurrentExperienceRole(role);
roleService.addRoleToUser(userExperience.getUser(), userExperience.getCurrentExperienceRole().getRole());
roleService.addRoleToUser(user, userExperience.getCurrentExperienceRole().getRole());
}
}
@@ -175,7 +181,7 @@ public class ExperienceTrackerServiceBean implements ExperienceTrackerService {
List<AExperienceRole> roles = experienceRoleManagementService.getExperienceRoleForServer(server);
for (int i = 0; i < aUserExperiences.size(); i++) {
AUserExperience userExperience = aUserExperiences.get(i);
log.debug("Synchronizing {} out of {}", i, aUserExperiences.size());
log.trace("Synchronizing {} out of {}", i, aUserExperiences.size());
handleExperienceRoleForUser(userExperience, roles);
}
}
@@ -189,13 +195,15 @@ public class ExperienceTrackerServiceBean implements ExperienceTrackerService {
MessageToSend status = templateService.renderEmbedTemplate("status_message", statusModel);
try {
Message statusMessage = messageService.createStatusMessage(status, channel).get();
int interval = Math.min(aUserExperiences.size() / 10, 100);
for (int i = 0; i < aUserExperiences.size(); i++) {
if((i % 100) == 1) {
if((i % interval) == 1) {
log.trace("Updating feedback message with new index {} out of {}", i, aUserExperiences.size());
UserSyncStatusModel incrementalStatusModel = UserSyncStatusModel.builder().currentCount(i).totalUserCount(aUserExperiences.size()).build();
status = templateService.renderEmbedTemplate("status_message", incrementalStatusModel);
messageService.updateStatusMessage(channel, statusMessage.getIdLong(), status);
}
log.debug("Synchronizing {} out of {}", i, aUserExperiences.size());
log.trace("Synchronizing {} out of {}", i, aUserExperiences.size());
AUserExperience userExperience = aUserExperiences.get(i);
handleExperienceRoleForUser(userExperience, roles);
}
@@ -210,15 +218,15 @@ public class ExperienceTrackerServiceBean implements ExperienceTrackerService {
@Override
public void syncForSingleUser(AUserExperience userExperience) {
log.info("Synchronizing for user {}", userExperience.getUser().getUserReference().getId());
List<AExperienceRole> roles = experienceRoleManagementService.getExperienceRoleForServer(userExperience.getUser().getServerReference());
AUserInAServer user = userExperience.getUser();
log.info("Synchronizing for user {} in server {}", user.getUserReference().getId(), user.getServerReference().getId());
List<AExperienceRole> roles = experienceRoleManagementService.getExperienceRoleForServer(user.getServerReference());
handleExperienceRoleForUser(userExperience, roles);
}
@Override
public LeaderBoard findLeaderBoardData(AServer server, Integer page) {
List<AUserExperience> experiences = userExperienceManagementService.findLeaderboardUsersPaginated(server, page * 10, (page +1) * 10);
log.info("We found {}", experiences.size());
List<LeaderBoardEntry> entries = new ArrayList<>();
for (int i = 0; i < experiences.size(); i++) {
AUserExperience userExperience = experiences.get(i);
@@ -229,6 +237,7 @@ public class ExperienceTrackerServiceBean implements ExperienceTrackerService {
@Override
public LeaderBoardEntry getRankOfUserInServer(AUserInAServer userInAServer) {
log.info("Retrieving rank for {}", userInAServer.getUserReference().getId());
AUserExperience experience = userExperienceManagementService.findUserInServer(userInAServer);
LeaderBoardEntryResult rankOfUserInServer = userExperienceManagementService.getRankOfUserInServer(experience);
AUserExperience aUserExperience = AUserExperience

View File

@@ -5,12 +5,14 @@ import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.experience.models.database.AExperienceLevel;
import dev.sheldan.abstracto.experience.models.database.AExperienceRole;
import dev.sheldan.abstracto.experience.repository.ExperienceRoleRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Slf4j
public class ExperienceRoleManagementServiceBean implements ExperienceRoleManagementService {
@Autowired
@@ -18,6 +20,7 @@ public class ExperienceRoleManagementServiceBean implements ExperienceRoleManage
@Override
public void unSetLevelInServer(AExperienceLevel level, AServer server) {
log.trace("Removing all role assignments for level {}.", level.getLevel());
List<AExperienceRole> existingExperienceRoles = experienceRoleRepository.findByLevelAndRoleServer(level, server);
existingExperienceRoles.forEach(existingRole -> {
experienceRoleRepository.delete(existingRole);