added command to set roles for which experience gain is disabled

and separate command to remove them from the list again
added command to see all roles for which experience gain is disabled
This commit is contained in:
Sheldan
2020-05-17 20:35:53 +02:00
parent cf1816597c
commit 0260862e8e
27 changed files with 380 additions and 13 deletions
@@ -0,0 +1,53 @@
package dev.sheldan.abstracto.experience.commands;
import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand;
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
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.config.FeatureEnum;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeature;
import dev.sheldan.abstracto.experience.service.management.DisabledExpRoleManagementService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class DisableExpForRole extends AbstractConditionableCommand {
@Autowired
private DisabledExpRoleManagementService disabledExpRoleManagementService;
@Override
public CommandResult execute(CommandContext commandContext) {
ARole role = (ARole) commandContext.getParameters().getParameters().get(0);
if(!disabledExpRoleManagementService.isExperienceDisabledForRole(role)) {
disabledExpRoleManagementService.setRoleToBeDisabledForExp(role);
}
return CommandResult.fromSuccess();
}
@Override
public CommandConfiguration getConfiguration() {
List<Parameter> parameters = new ArrayList<>();
parameters.add(Parameter.builder().name("role").templated(true).type(ARole.class).build());
HelpInfo helpInfo = HelpInfo.builder().templated(true).build();
return CommandConfiguration.builder()
.name("disableExpForRole")
.module(ExperienceModule.EXPERIENCE)
.templated(true)
.causesReaction(true)
.parameters(parameters)
.help(helpInfo)
.build();
}
@Override
public FeatureEnum getFeature() {
return ExperienceFeature.EXPERIENCE;
}
}
@@ -0,0 +1,53 @@
package dev.sheldan.abstracto.experience.commands;
import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand;
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
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.config.FeatureEnum;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeature;
import dev.sheldan.abstracto.experience.service.management.DisabledExpRoleManagementService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class EnableExpForRole extends AbstractConditionableCommand {
@Autowired
private DisabledExpRoleManagementService disabledExpRoleManagementService;
@Override
public CommandResult execute(CommandContext commandContext) {
ARole role = (ARole) commandContext.getParameters().getParameters().get(0);
if(disabledExpRoleManagementService.isExperienceDisabledForRole(role)) {
disabledExpRoleManagementService.removeRoleToBeDisabledForExp(role);
}
return CommandResult.fromSuccess();
}
@Override
public CommandConfiguration getConfiguration() {
List<Parameter> parameters = new ArrayList<>();
parameters.add(Parameter.builder().name("role").templated(true).type(ARole.class).build());
HelpInfo helpInfo = HelpInfo.builder().templated(true).build();
return CommandConfiguration.builder()
.name("enableExpForRole")
.module(ExperienceModule.EXPERIENCE)
.templated(true)
.causesReaction(true)
.parameters(parameters)
.help(helpInfo)
.build();
}
@Override
public FeatureEnum getFeature() {
return ExperienceFeature.EXPERIENCE;
}
}
@@ -0,0 +1,71 @@
package dev.sheldan.abstracto.experience.commands;
import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand;
import dev.sheldan.abstracto.core.command.config.CommandConfiguration;
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.command.execution.ContextConverter;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.models.FullRole;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.service.ChannelService;
import dev.sheldan.abstracto.core.service.RoleService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeature;
import dev.sheldan.abstracto.experience.models.database.ADisabledExpRole;
import dev.sheldan.abstracto.experience.models.templates.DisabledExperienceRolesModel;
import dev.sheldan.abstracto.experience.service.management.DisabledExpRoleManagementService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class ListDisabledExperienceRoles extends AbstractConditionableCommand {
@Autowired
private DisabledExpRoleManagementService disabledExpRoleManagementService;
@Autowired
private RoleService roleService;
@Autowired
private ChannelService channelService;
@Override
public CommandResult execute(CommandContext commandContext) {
List<ADisabledExpRole> disabledRolesForServer = disabledExpRoleManagementService.getDisabledRolesForServer(commandContext.getUserInitiatedContext().getServer());
DisabledExperienceRolesModel disabledExperienceRolesModel = (DisabledExperienceRolesModel) ContextConverter.fromCommandContext(commandContext, DisabledExperienceRolesModel.class);
disabledRolesForServer.forEach(aDisabledExpRole -> {
FullRole role = FullRole
.builder()
.role(aDisabledExpRole.getRole())
.serverRole(roleService.getRoleFromGuild(aDisabledExpRole.getRole()))
.build();
disabledExperienceRolesModel.getRoles().add(role);
});
channelService.sendTemplateInChannel("list_disabled_experience_roles", disabledExperienceRolesModel, commandContext.getChannel());
return CommandResult.fromSuccess();
}
@Override
public CommandConfiguration getConfiguration() {
List<Parameter> parameters = new ArrayList<>();
HelpInfo helpInfo = HelpInfo.builder().templated(true).build();
return CommandConfiguration.builder()
.name("listDisabledExperienceRoles")
.module(ExperienceModule.EXPERIENCE)
.templated(true)
.causesReaction(true)
.parameters(parameters)
.help(helpInfo)
.build();
}
@Override
public FeatureEnum getFeature() {
return ExperienceFeature.EXPERIENCE;
}
}
@@ -0,0 +1,19 @@
package dev.sheldan.abstracto.experience.repository;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.experience.models.database.ADisabledExpRole;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface DisabledExpRoleRepository extends JpaRepository<ADisabledExpRole, Long> {
boolean existsByRole(ARole role);
ADisabledExpRole findByRole(ARole role);
void deleteByRole(ARole role);
List<ADisabledExpRole> getByRole_Server(AServer server);
}
@@ -2,19 +2,18 @@ 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;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
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.models.database.LeaderBoardEntryResult;
import dev.sheldan.abstracto.experience.models.database.*;
import dev.sheldan.abstracto.experience.models.LeaderBoard;
import dev.sheldan.abstracto.experience.models.LeaderBoardEntry;
import dev.sheldan.abstracto.experience.models.database.AExperienceLevel;
import dev.sheldan.abstracto.experience.models.database.AExperienceRole;
import dev.sheldan.abstracto.experience.models.database.AUserExperience;
import dev.sheldan.abstracto.experience.models.templates.UserSyncStatusModel;
import dev.sheldan.abstracto.experience.service.management.DisabledExpRoleManagementService;
import dev.sheldan.abstracto.experience.service.management.ExperienceLevelManagementService;
import dev.sheldan.abstracto.experience.service.management.ExperienceRoleManagementService;
import dev.sheldan.abstracto.experience.service.management.UserExperienceManagementService;
@@ -31,6 +30,7 @@ import java.time.Instant;
import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.function.Consumer;
import java.util.stream.Collectors;
@Component
@Slf4j
@@ -62,6 +62,9 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
@Autowired
private TemplateService templateService;
@Autowired
private DisabledExpRoleManagementService disabledExpRoleManagementService;
@Autowired
private BotService botService;
@@ -149,18 +152,25 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
List<AExperienceLevel> levels = experienceLevelManagementService.getLevelConfig();
levels.sort(Comparator.comparing(AExperienceLevel::getExperienceNeeded));
List<AExperienceRole> roles = experienceRoleManagementService.getExperienceRolesForServer(serverExp);
List<ADisabledExpRole> disabledExpRoles = disabledExpRoleManagementService.getDisabledRolesForServer(serverExp);
List<ARole> disabledRoles = disabledExpRoles.stream().map(ADisabledExpRole::getRole).collect(Collectors.toList());
roles.sort(Comparator.comparing(role -> role.getLevel().getLevel()));
serverExp.getUsers().forEach(userInAServer -> {
Integer gainedExperience = iterator.next();
gainedExperience = (int) Math.floor(gainedExperience * multiplier);
log.trace("Handling {}. The user gains {}", userInAServer.getUserReference().getId(), gainedExperience);
AUserExperience aUserExperience = userExperienceManagementService.incrementExpForUser(userInAServer, gainedExperience.longValue(), 1L);
if(!aUserExperience.getExperienceGainDisabled()) {
updateUserlevel(aUserExperience, levels);
updateUserRole(aUserExperience, roles);
userExperienceManagementService.saveUser(aUserExperience);
Member member = botService.getMemberInServer(userInAServer);
if(!roleService.hasAnyOfTheRoles(member, disabledRoles)) {
log.trace("Handling {}. The user gains {}", userInAServer.getUserReference().getId(), gainedExperience);
AUserExperience aUserExperience = userExperienceManagementService.incrementExpForUser(userInAServer, gainedExperience.longValue(), 1L);
if(!aUserExperience.getExperienceGainDisabled()) {
updateUserlevel(aUserExperience, levels);
updateUserRole(aUserExperience, roles);
userExperienceManagementService.saveUser(aUserExperience);
} else {
log.trace("Experience gain was disabled. User did not gain any experience.");
}
} else {
log.trace("Experience gain was disabled. User did not gain any experience.");
log.trace("User {} has a role which makes the user unable to gain experience.", userInAServer.getUserInServerId());
}
});
});
@@ -0,0 +1,45 @@
package dev.sheldan.abstracto.experience.service.management;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.experience.models.database.ADisabledExpRole;
import dev.sheldan.abstracto.experience.repository.DisabledExpRoleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class DisabledExpRoleManagementServiceBean implements DisabledExpRoleManagementService {
@Autowired
private DisabledExpRoleRepository disabledExpRoleRepository;
@Override
public ADisabledExpRole setRoleToBeDisabledForExp(ARole role) {
ADisabledExpRole newRole = ADisabledExpRole
.builder()
.role(role)
.build();
disabledExpRoleRepository.save(newRole);
return newRole;
}
@Override
public void removeRoleToBeDisabledForExp(ARole role) {
disabledExpRoleRepository.deleteByRole(role);
}
@Override
public List<ADisabledExpRole> getDisabledRolesForServer(AServer server) {
return disabledExpRoleRepository.getByRole_Server(server);
}
@Override
public boolean isExperienceDisabledForRole(ARole role) {
return disabledExpRoleRepository.existsByRole(role);
}
}
@@ -0,0 +1,21 @@
{
"author": {
"name": "${member.effectiveName}",
"avatar": "${member.user.effectiveAvatarUrl}"
},
"title": {
"title": "<#include "list_disabled_experience_roles_embed_title">"
},
"color" : {
"r": 200,
"g": 0,
"b": 255
},
"description": "
<#list roles as role>
${role.role.asMention}
<#else>
<#include "list_disabled_experience_roles_embed_no_roles">
</#list>
"
}
@@ -0,0 +1,29 @@
package dev.sheldan.abstracto.experience.models.database;
import dev.sheldan.abstracto.core.models.database.ARole;
import lombok.*;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "disabled_experience_roles")
@Getter
@Setter
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class ADisabledExpRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* Reference to the actual {@link ARole} being marked as disabled for experience gain.
*/
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id", nullable = false)
private ARole role;
}
@@ -0,0 +1,19 @@
package dev.sheldan.abstracto.experience.models.templates;
import dev.sheldan.abstracto.core.models.FullRole;
import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import java.util.ArrayList;
import java.util.List;
@Getter
@Setter
@SuperBuilder
public class DisabledExperienceRolesModel extends UserInitiatedServerContext {
@Builder.Default
private List<FullRole> roles = new ArrayList<>();
}
@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.experience.service.management;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.experience.models.database.ADisabledExpRole;
import java.util.List;
public interface DisabledExpRoleManagementService {
ADisabledExpRole setRoleToBeDisabledForExp(ARole role);
void removeRoleToBeDisabledForExp(ARole role);
List<ADisabledExpRole> getDisabledRolesForServer(AServer server);
boolean isExperienceDisabledForRole(ARole role);
}
@@ -14,11 +14,9 @@ import net.dv8tion.jda.api.entities.Emote;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.TextChannel;
import net.dv8tion.jda.api.utils.cache.CacheFlag;
import org.springframework.stereotype.Service;
import javax.security.auth.login.LoginException;
import java.util.EnumSet;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
@@ -87,6 +87,11 @@ public class RoleServiceBean implements RoleService {
return roles.stream().map(this::getRoleFromGuild).collect(Collectors.toList());
}
@Override
public boolean hasAnyOfTheRoles(Member member, List<ARole> roles) {
return member.getRoles().stream().anyMatch(role1 -> roles.stream().anyMatch(role -> role.getId() == role1.getIdLong()));
}
@Override
public boolean memberHasRole(Member member, Role role) {
return member.getRoles().stream().anyMatch(role1 -> role1.getIdLong() == role.getIdLong());
@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.core.models;
import dev.sheldan.abstracto.core.models.database.ARole;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.Role;
@Getter
@Setter
@Builder
public class FullRole {
private ARole role;
private Role serverRole;
}
@@ -15,6 +15,7 @@ public interface RoleService {
void markDeleted(Long id, AServer server);
Role getRoleFromGuild(ARole role);
List<Role> getRolesFromGuild(List<ARole> roles);
boolean hasAnyOfTheRoles(Member member, List<ARole> roles);
boolean memberHasRole(Member member, Role role);
boolean memberHasRole(Member member, ARole role);
boolean isRoleInServer(ARole role);
@@ -0,0 +1,2 @@
Adds the given role to the roles for which the users having this role should not gain any experience.
If a member has *any* of these roles, the user will not gain experience.
@@ -0,0 +1 @@
Enables the experience gain for the specified role. If a user has any of the roles for which experience gain is disabled, the user will not gain experience.