mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-01-26 13:46:19 +00:00
[AB-327] adding a third state to the result of a system condition: Ignored, this means that the condition was not evaluated, and is neither true nor false, this is for example used when the feature the condition is about is disabled
adding server ID to has level condition parameters
This commit is contained in:
@@ -8,6 +8,7 @@ import dev.sheldan.abstracto.core.models.template.display.MemberDisplay;
|
|||||||
import dev.sheldan.abstracto.core.service.ConditionService;
|
import dev.sheldan.abstracto.core.service.ConditionService;
|
||||||
import dev.sheldan.abstracto.core.service.ConfigService;
|
import dev.sheldan.abstracto.core.service.ConfigService;
|
||||||
import dev.sheldan.abstracto.core.service.PostTargetService;
|
import dev.sheldan.abstracto.core.service.PostTargetService;
|
||||||
|
import dev.sheldan.abstracto.core.service.SystemCondition;
|
||||||
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
|
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
|
||||||
import dev.sheldan.abstracto.core.templating.model.MessageToSend;
|
import dev.sheldan.abstracto.core.templating.model.MessageToSend;
|
||||||
import dev.sheldan.abstracto.core.templating.service.TemplateService;
|
import dev.sheldan.abstracto.core.templating.service.TemplateService;
|
||||||
@@ -34,6 +35,7 @@ public class MassPingServiceBean implements MassPingService {
|
|||||||
private static final String LEVEL_CONDITION_NAME = "HAS_LEVEL";
|
private static final String LEVEL_CONDITION_NAME = "HAS_LEVEL";
|
||||||
private static final String LEVEL_CONDITION_USER_ID_PARAMETER = "userId";
|
private static final String LEVEL_CONDITION_USER_ID_PARAMETER = "userId";
|
||||||
private static final String LEVEL_CONDITION_LEVEL_PARAMETER = "level";
|
private static final String LEVEL_CONDITION_LEVEL_PARAMETER = "level";
|
||||||
|
private static final String LEVEL_CONDITION_SERVER_PARAMETER = "serverId";
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ConfigService configService;
|
private ConfigService configService;
|
||||||
@@ -85,12 +87,14 @@ public class MassPingServiceBean implements MassPingService {
|
|||||||
AUserInAServer userInAServer = userInServerManagementService.loadOrCreateUser(message.getMember());
|
AUserInAServer userInAServer = userInServerManagementService.loadOrCreateUser(message.getMember());
|
||||||
parameters.put(LEVEL_CONDITION_USER_ID_PARAMETER, userInAServer.getUserInServerId());
|
parameters.put(LEVEL_CONDITION_USER_ID_PARAMETER, userInAServer.getUserInServerId());
|
||||||
parameters.put(LEVEL_CONDITION_LEVEL_PARAMETER, level);
|
parameters.put(LEVEL_CONDITION_LEVEL_PARAMETER, level);
|
||||||
|
parameters.put(LEVEL_CONDITION_SERVER_PARAMETER, message.getGuild().getIdLong());
|
||||||
ConditionContextInstance contextInstance = ConditionContextInstance
|
ConditionContextInstance contextInstance = ConditionContextInstance
|
||||||
.builder()
|
.builder()
|
||||||
.conditionName(LEVEL_CONDITION_NAME)
|
.conditionName(LEVEL_CONDITION_NAME)
|
||||||
.parameters(parameters)
|
.parameters(parameters)
|
||||||
.build();
|
.build();
|
||||||
return conditionService.checkConditions(contextInstance);
|
SystemCondition.Result result = conditionService.checkConditions(contextInstance);
|
||||||
|
return SystemCondition.Result.consideredSuccessful(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import dev.sheldan.abstracto.core.models.ConditionContextInstance;
|
|||||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||||
import dev.sheldan.abstracto.core.models.template.display.RoleDisplay;
|
import dev.sheldan.abstracto.core.models.template.display.RoleDisplay;
|
||||||
import dev.sheldan.abstracto.core.service.ConditionService;
|
import dev.sheldan.abstracto.core.service.ConditionService;
|
||||||
|
import dev.sheldan.abstracto.core.service.SystemCondition;
|
||||||
import net.dv8tion.jda.api.entities.Role;
|
import net.dv8tion.jda.api.entities.Role;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@@ -24,6 +25,7 @@ public class AssignableRoleMinimumLevelConditionImpl implements AssignableRoleCo
|
|||||||
private final String conditionName = "HAS_LEVEL";
|
private final String conditionName = "HAS_LEVEL";
|
||||||
private final String userIdParameter = "userId";
|
private final String userIdParameter = "userId";
|
||||||
private final String levelParameter = "level";
|
private final String levelParameter = "level";
|
||||||
|
private final String serverParameter = "serverId";
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ConditionService conditionService;
|
private ConditionService conditionService;
|
||||||
@@ -34,13 +36,15 @@ public class AssignableRoleMinimumLevelConditionImpl implements AssignableRoleCo
|
|||||||
Map<String, Object> parameters = new HashMap<>();
|
Map<String, Object> parameters = new HashMap<>();
|
||||||
parameters.put(userIdParameter, aUserInAServer.getUserInServerId());
|
parameters.put(userIdParameter, aUserInAServer.getUserInServerId());
|
||||||
parameters.put(levelParameter, level);
|
parameters.put(levelParameter, level);
|
||||||
|
parameters.put(serverParameter, aUserInAServer.getServerReference().getId());
|
||||||
|
|
||||||
ConditionContextInstance contextInstance = ConditionContextInstance
|
ConditionContextInstance contextInstance = ConditionContextInstance
|
||||||
.builder()
|
.builder()
|
||||||
.conditionName(conditionName)
|
.conditionName(conditionName)
|
||||||
.parameters(parameters)
|
.parameters(parameters)
|
||||||
.build();
|
.build();
|
||||||
return conditionService.checkConditions(contextInstance);
|
SystemCondition.Result result = conditionService.checkConditions(contextInstance);
|
||||||
|
return SystemCondition.Result.consideredSuccessful(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -4,8 +4,10 @@ import dev.sheldan.abstracto.core.models.ConditionContext;
|
|||||||
import dev.sheldan.abstracto.core.models.ConditionContextInstance;
|
import dev.sheldan.abstracto.core.models.ConditionContextInstance;
|
||||||
import dev.sheldan.abstracto.core.models.ConditionContextVariable;
|
import dev.sheldan.abstracto.core.models.ConditionContextVariable;
|
||||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||||
|
import dev.sheldan.abstracto.core.service.FeatureFlagService;
|
||||||
import dev.sheldan.abstracto.core.service.SystemCondition;
|
import dev.sheldan.abstracto.core.service.SystemCondition;
|
||||||
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
|
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
|
||||||
|
import dev.sheldan.abstracto.experience.config.ExperienceFeatureDefinition;
|
||||||
import dev.sheldan.abstracto.experience.model.database.AUserExperience;
|
import dev.sheldan.abstracto.experience.model.database.AUserExperience;
|
||||||
import dev.sheldan.abstracto.experience.service.management.UserExperienceManagementService;
|
import dev.sheldan.abstracto.experience.service.management.UserExperienceManagementService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -26,6 +28,7 @@ public class HasLevelCondition implements SystemCondition {
|
|||||||
|
|
||||||
public static final String USER_IN_SERVER_ID_VARIABLE_KEY = "userId";
|
public static final String USER_IN_SERVER_ID_VARIABLE_KEY = "userId";
|
||||||
public static final String LEVEL_VARIABLE = "level";
|
public static final String LEVEL_VARIABLE = "level";
|
||||||
|
public static final String SERVER_VARIABLE = "serverId";
|
||||||
public static final String HAS_LEVEL_CONDITION_KEY = "HAS_LEVEL";
|
public static final String HAS_LEVEL_CONDITION_KEY = "HAS_LEVEL";
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@@ -34,11 +37,18 @@ public class HasLevelCondition implements SystemCondition {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private UserInServerManagementService userInServerManagementService;
|
private UserInServerManagementService userInServerManagementService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FeatureFlagService featureFlagService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean checkCondition(ConditionContextInstance conditionContext) {
|
public Result checkCondition(ConditionContextInstance conditionContext) {
|
||||||
Map<String, Object> parameters = conditionContext.getParameters();
|
Map<String, Object> parameters = conditionContext.getParameters();
|
||||||
Long userInServerId = (Long) parameters.get(USER_IN_SERVER_ID_VARIABLE_KEY);
|
Long userInServerId = (Long) parameters.get(USER_IN_SERVER_ID_VARIABLE_KEY);
|
||||||
|
Long serverId = (Long) parameters.get(SERVER_VARIABLE);
|
||||||
Integer level = (Integer) parameters.get(LEVEL_VARIABLE);
|
Integer level = (Integer) parameters.get(LEVEL_VARIABLE);
|
||||||
|
if(!featureFlagService.getFeatureFlagValue(ExperienceFeatureDefinition.EXPERIENCE, serverId)) {
|
||||||
|
return Result.IGNORED;
|
||||||
|
}
|
||||||
Optional<AUserInAServer> userInServerOptional = userInServerManagementService.loadUserOptional(userInServerId);
|
Optional<AUserInAServer> userInServerOptional = userInServerManagementService.loadUserOptional(userInServerId);
|
||||||
if(userInServerOptional.isPresent()) {
|
if(userInServerOptional.isPresent()) {
|
||||||
AUserInAServer userInServer = userInServerOptional.get();
|
AUserInAServer userInServer = userInServerOptional.get();
|
||||||
@@ -47,11 +57,11 @@ public class HasLevelCondition implements SystemCondition {
|
|||||||
AUserExperience user = userExperienceManagementService.findUserInServer(userInServer);
|
AUserExperience user = userExperienceManagementService.findUserInServer(userInServer);
|
||||||
boolean conditionResult = user.getCurrentLevel() != null && user.getCurrentLevel().getLevel() >= level;
|
boolean conditionResult = user.getCurrentLevel() != null && user.getCurrentLevel().getLevel() >= level;
|
||||||
log.info("Condition evaluated to {}", conditionResult);
|
log.info("Condition evaluated to {}", conditionResult);
|
||||||
return conditionResult;
|
return Result.fromBoolean(conditionResult);
|
||||||
}
|
}
|
||||||
log.info("No user in server object was found. Evaluating has level to false.");
|
log.info("No user in server object was found. Evaluating has level to false.");
|
||||||
|
|
||||||
return false;
|
return Result.FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -71,9 +81,14 @@ public class HasLevelCondition implements SystemCondition {
|
|||||||
.name(LEVEL_VARIABLE)
|
.name(LEVEL_VARIABLE)
|
||||||
.type(Integer.class)
|
.type(Integer.class)
|
||||||
.build();
|
.build();
|
||||||
|
ConditionContextVariable serverVariable = ConditionContextVariable
|
||||||
|
.builder()
|
||||||
|
.name(SERVER_VARIABLE)
|
||||||
|
.type(Long.class)
|
||||||
|
.build();
|
||||||
return ConditionContext
|
return ConditionContext
|
||||||
.builder()
|
.builder()
|
||||||
.requiredVariables(Arrays.asList(userIdVariable, levelVariable))
|
.requiredVariables(Arrays.asList(userIdVariable, levelVariable, serverVariable))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import org.springframework.stereotype.Component;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@@ -19,32 +18,31 @@ public class ConditionServiceBean implements ConditionService {
|
|||||||
private List<SystemCondition> conditionList;
|
private List<SystemCondition> conditionList;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean checkConditions(ConditionContextInstance context) {
|
public SystemCondition.Result checkConditions(ConditionContextInstance context) {
|
||||||
if(conditionList == null || conditionList.isEmpty()) {
|
if (conditionList == null || conditionList.isEmpty()) {
|
||||||
return true;
|
return SystemCondition.Result.SUCCESSFUL;
|
||||||
}
|
}
|
||||||
Optional<SystemCondition> matchingCondition = conditionList
|
log.debug("Checking condition {}.", context.getConditionName());
|
||||||
|
return conditionList
|
||||||
.stream()
|
.stream()
|
||||||
.filter(systemCondition -> systemCondition.getConditionName().equalsIgnoreCase(context.getConditionName()))
|
.filter(systemCondition -> systemCondition.getConditionName().equalsIgnoreCase(context.getConditionName()))
|
||||||
.findAny();
|
.findAny().map(systemCondition -> {
|
||||||
log.debug("Checking condition {}.", context.getConditionName());
|
verifyConditionContext(context, systemCondition);
|
||||||
return matchingCondition.map(systemCondition -> {
|
SystemCondition.Result result = systemCondition.checkCondition(context);
|
||||||
verifyConditionContext(context, systemCondition);
|
log.debug("Condition resulted in {}.", result);
|
||||||
boolean result = systemCondition.checkCondition(context);
|
return result;
|
||||||
log.debug("Condition resulted in {}.", result);
|
}).orElse(SystemCondition.Result.SUCCESSFUL);
|
||||||
return result;
|
|
||||||
}).orElse(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void verifyConditionContext(ConditionContextInstance contextInstance, SystemCondition condition) {
|
private void verifyConditionContext(ConditionContextInstance contextInstance, SystemCondition condition) {
|
||||||
for (ConditionContextVariable conditionContextVariable : condition.getExpectedContext().getRequiredVariables()) {
|
for (ConditionContextVariable conditionContextVariable : condition.getExpectedContext().getRequiredVariables()) {
|
||||||
Map<String, Object> providedParameters = contextInstance.getParameters();
|
Map<String, Object> providedParameters = contextInstance.getParameters();
|
||||||
if(!providedParameters.containsKey(conditionContextVariable.getName())) {
|
if (!providedParameters.containsKey(conditionContextVariable.getName())) {
|
||||||
throw new InvalidConditionParametersException(String.format("Variable %s was not present", conditionContextVariable.getName()));
|
throw new InvalidConditionParametersException(String.format("Variable %s was not present", conditionContextVariable.getName()));
|
||||||
}
|
}
|
||||||
Class expectedType = conditionContextVariable.getType();
|
Class expectedType = conditionContextVariable.getType();
|
||||||
Object providedParameter = providedParameters.get(conditionContextVariable.getName());
|
Object providedParameter = providedParameters.get(conditionContextVariable.getName());
|
||||||
if(!expectedType.isInstance(providedParameter)) {
|
if (!expectedType.isInstance(providedParameter)) {
|
||||||
throw new InvalidConditionParametersException(String.format("Variable %s was of type %s instead of %s.",
|
throw new InvalidConditionParametersException(String.format("Variable %s was of type %s instead of %s.",
|
||||||
conditionContextVariable.getName(), providedParameter.getClass(), expectedType));
|
conditionContextVariable.getName(), providedParameter.getClass(), expectedType));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ package dev.sheldan.abstracto.core.service;
|
|||||||
import dev.sheldan.abstracto.core.models.ConditionContextInstance;
|
import dev.sheldan.abstracto.core.models.ConditionContextInstance;
|
||||||
|
|
||||||
public interface ConditionService {
|
public interface ConditionService {
|
||||||
boolean checkConditions(ConditionContextInstance context);
|
SystemCondition.Result checkConditions(ConditionContextInstance context);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,19 @@ import dev.sheldan.abstracto.core.models.ConditionContext;
|
|||||||
import dev.sheldan.abstracto.core.models.ConditionContextInstance;
|
import dev.sheldan.abstracto.core.models.ConditionContextInstance;
|
||||||
|
|
||||||
public interface SystemCondition {
|
public interface SystemCondition {
|
||||||
boolean checkCondition(ConditionContextInstance conditionContext);
|
Result checkCondition(ConditionContextInstance conditionContext);
|
||||||
String getConditionName();
|
String getConditionName();
|
||||||
ConditionContext getExpectedContext();
|
ConditionContext getExpectedContext();
|
||||||
|
|
||||||
|
enum Result {
|
||||||
|
SUCCESSFUL, FAILED, IGNORED;
|
||||||
|
|
||||||
|
public static Result fromBoolean(boolean value) {
|
||||||
|
return value ? SUCCESSFUL : FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean consideredSuccessful(Result result) {
|
||||||
|
return result == Result.SUCCESSFUL || result == Result.IGNORED;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user