[AB-112] adding star levels to setup feature wizard

moving star level configuration to only be instantiated when needed
This commit is contained in:
Sheldan
2021-02-14 16:35:51 +01:00
parent 23bdf4e906
commit 94532be54d
22 changed files with 153 additions and 142 deletions

View File

@@ -26,8 +26,8 @@ public class ExperienceConfigListener implements ServerConfigListener {
@Override @Override
public void updateServerConfig(AServer server) { public void updateServerConfig(AServer server) {
log.info("Setting up experience configuration for server {}.", server.getId()); log.info("Setting up experience configuration for server {}.", server.getId());
service.createIfNotExists(server.getId(), ExperienceFeatureConfig.MIN_EXP_KEY, defaultConfigManagementService.getDefaultConfig(ExperienceFeatureConfig.MIN_EXP_KEY).getLongValue()); service.loadOrCreateIfNotExists(server.getId(), ExperienceFeatureConfig.MIN_EXP_KEY, defaultConfigManagementService.getDefaultConfig(ExperienceFeatureConfig.MIN_EXP_KEY).getLongValue());
service.createIfNotExists(server.getId(), ExperienceFeatureConfig.MAX_EXP_KEY, defaultConfigManagementService.getDefaultConfig(ExperienceFeatureConfig.MAX_EXP_KEY).getLongValue()); service.loadOrCreateIfNotExists(server.getId(), ExperienceFeatureConfig.MAX_EXP_KEY, defaultConfigManagementService.getDefaultConfig(ExperienceFeatureConfig.MAX_EXP_KEY).getLongValue());
service.createIfNotExists(server.getId(), ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, defaultConfigManagementService.getDefaultConfig(ExperienceFeatureConfig.EXP_MULTIPLIER_KEY).getDoubleValue()); service.loadOrCreateIfNotExists(server.getId(), ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, defaultConfigManagementService.getDefaultConfig(ExperienceFeatureConfig.EXP_MULTIPLIER_KEY).getDoubleValue());
} }
} }

View File

@@ -22,6 +22,6 @@ public class WarnDecayConfigListener implements ServerConfigListener {
@Override @Override
public void updateServerConfig(AServer server) { public void updateServerConfig(AServer server) {
log.info("Updating decay day configuration for server {}.", server.getId()); log.info("Updating decay day configuration for server {}.", server.getId());
configManagementService.createIfNotExists(server.getId(), WarningDecayFeature.DECAY_DAYS_KEY, defaultConfigManagementService.getDefaultConfig(WarningDecayFeature.DECAY_DAYS_KEY).getLongValue()); configManagementService.loadOrCreateIfNotExists(server.getId(), WarningDecayFeature.DECAY_DAYS_KEY, defaultConfigManagementService.getDefaultConfig(WarningDecayFeature.DECAY_DAYS_KEY).getLongValue());
} }
} }

View File

@@ -30,7 +30,7 @@ public class ModMailConfigListener implements ServerConfigListener {
@Override @Override
public void updateServerConfig(AServer server) { public void updateServerConfig(AServer server) {
log.info("Updating modmail related configuration for server {}.", server.getId()); log.info("Updating modmail related configuration for server {}.", server.getId());
configService.createIfNotExists(server.getId(), ModMailThreadServiceBean.MODMAIL_CATEGORY, 0L); configService.loadOrCreateIfNotExists(server.getId(), ModMailThreadServiceBean.MODMAIL_CATEGORY, 0L);
configService.createIfNotExists(server.getId(), MODMAIL_CLOSING_MESSAGE_TEXT, templateService.renderSimpleTemplate("modmail_closing_user_message_description")); configService.loadOrCreateIfNotExists(server.getId(), MODMAIL_CLOSING_MESSAGE_TEXT, templateService.renderSimpleTemplate("modmail_closing_user_message_description"));
} }
} }

View File

@@ -6,7 +6,7 @@
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" > http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
<property name="modmailModule" value="(SELECT id FROM module WHERE name = 'modMail')"/> <property name="modmailModule" value="(SELECT id FROM module WHERE name = 'modmail')"/>
<property name="modmailFeature" value="(SELECT id FROM feature WHERE key = 'modmail')"/> <property name="modmailFeature" value="(SELECT id FROM feature WHERE key = 'modmail')"/>
<property name="today" value="(SELECT NOW())"/> <property name="today" value="(SELECT NOW())"/>

View File

@@ -1,32 +0,0 @@
package dev.sheldan.abstracto.utility.config;
import dev.sheldan.abstracto.core.listener.sync.entity.ServerConfigListener;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.management.ConfigManagementService;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.utility.service.StarboardServiceBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class StarboardConfigListener implements ServerConfigListener {
@Autowired
private ConfigManagementService configManagementService;
@Autowired
private DefaultConfigManagementService defaultConfigManagementService;
@Override
public void updateServerConfig(AServer server) {
log.info("Creating starboard config for server {}", server.getId());
int maxLevels = defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY).getLongValue().intValue();
for (int i = 0; i < maxLevels; i++) {
String configKey = StarboardServiceBean.STAR_LVL_CONFIG_PREFIX + (i + 1);
Integer value = defaultConfigManagementService.getDefaultConfig(configKey).getLongValue().intValue();
configManagementService.createIfNotExists(server.getId(), configKey, Long.valueOf(value));
}
}
}

View File

@@ -7,6 +7,7 @@ import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AUser; import dev.sheldan.abstracto.core.models.database.AUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer; import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.models.database.PostTarget; import dev.sheldan.abstracto.core.models.database.PostTarget;
import dev.sheldan.abstracto.core.models.property.SystemConfigProperty;
import dev.sheldan.abstracto.core.service.*; import dev.sheldan.abstracto.core.service.*;
import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import dev.sheldan.abstracto.core.service.management.ChannelManagementService;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService; import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
@@ -15,6 +16,7 @@ import dev.sheldan.abstracto.core.service.management.UserInServerManagementServi
import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.abstracto.core.utils.FutureUtils;
import dev.sheldan.abstracto.templating.model.MessageToSend; import dev.sheldan.abstracto.templating.model.MessageToSend;
import dev.sheldan.abstracto.templating.service.TemplateService; import dev.sheldan.abstracto.templating.service.TemplateService;
import dev.sheldan.abstracto.utility.config.features.StarboardFeature;
import dev.sheldan.abstracto.utility.config.posttargets.StarboardPostTarget; import dev.sheldan.abstracto.utility.config.posttargets.StarboardPostTarget;
import dev.sheldan.abstracto.utility.models.database.StarboardPost; import dev.sheldan.abstracto.utility.models.database.StarboardPost;
import dev.sheldan.abstracto.utility.models.template.commands.starboard.StarStatsModel; import dev.sheldan.abstracto.utility.models.template.commands.starboard.StarStatsModel;
@@ -44,8 +46,6 @@ import java.util.stream.Collectors;
public class StarboardServiceBean implements StarboardService { public class StarboardServiceBean implements StarboardService {
public static final String STARBOARD_POST_TEMPLATE = "starboard_post"; public static final String STARBOARD_POST_TEMPLATE = "starboard_post";
public static final String STAR_LVL_CONFIG_PREFIX = "starLvl";
public static final String STAR_LEVELS_CONFIG_KEY = "starLvls";
@Autowired @Autowired
private MemberService memberService; private MemberService memberService;
@@ -227,17 +227,19 @@ public class StarboardServiceBean implements StarboardService {
} }
private String buildBadgeName(Integer position) { private String buildBadgeName(Integer position) {
return "starboardBadge" + position; return StarboardFeature.STAR_BADGE_EMOTE_PREFIX + position;
} }
private String getAppropriateEmote(Long serverId, Integer starCount) { private String getAppropriateEmote(Long serverId, Integer starCount) {
int maxLevels = defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY).getLongValue().intValue(); int maxLevels = defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LEVELS_CONFIG_KEY).getLongValue().intValue();
for(int i = maxLevels; i > 0; i--) { for(int i = maxLevels; i > 0; i--) {
Long starMinimum = configService.getLongValue(STAR_LVL_CONFIG_PREFIX + i, serverId); String key = StarboardFeature.STAR_LVL_CONFIG_PREFIX + i;
SystemConfigProperty defaultStars = defaultConfigManagementService.getDefaultConfig(key);
Long starMinimum = configService.getLongValue(key, serverId, defaultStars.getLongValue());
if(starCount >= starMinimum) { if(starCount >= starMinimum) {
return emoteService.getUsableEmoteOrDefault(serverId, "star" + i); return emoteService.getUsableEmoteOrDefault(serverId, StarboardFeature.STAR_EMOTE_PREFIX + i);
} }
} }
return emoteService.getUsableEmoteOrDefault(serverId, "star0"); return emoteService.getUsableEmoteOrDefault(serverId, StarboardFeature.STAR_EMOTE_PREFIX);
} }
} }

View File

@@ -6,7 +6,7 @@ import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.FeatureValidatorService; import dev.sheldan.abstracto.core.service.FeatureValidatorService;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService; import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.utility.StarboardFeatureValidator; import dev.sheldan.abstracto.utility.StarboardFeatureValidator;
import dev.sheldan.abstracto.utility.service.StarboardServiceBean; import dev.sheldan.abstracto.utility.config.features.StarboardFeature;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -23,10 +23,10 @@ public class StarboardFeatureValidatorService implements StarboardFeatureValidat
@Override @Override
public void featureIsSetup(FeatureConfig featureConfig, AServer server, FeatureValidationResult validationResult) { public void featureIsSetup(FeatureConfig featureConfig, AServer server, FeatureValidationResult validationResult) {
int levelAmount = defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY).getLongValue().intValue(); int levelAmount = defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LEVELS_CONFIG_KEY).getLongValue().intValue();
log.info("Validating starboard feature for server {}.", server.getId()); log.info("Validating starboard feature for server {}.", server.getId());
for(int i = 1; i <= levelAmount; i++) { for(int i = 1; i <= levelAmount; i++) {
featureValidatorService.checkSystemConfig("starLvl" + i, server, validationResult); featureValidatorService.checkSystemConfig(StarboardFeature.STAR_LVL_CONFIG_PREFIX + i, server, validationResult);
} }
} }
} }

View File

@@ -1,54 +0,0 @@
package dev.sheldan.abstracto.utility.config;
import dev.sheldan.abstracto.core.models.property.SystemConfigProperty;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.management.ConfigManagementService;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.core.test.MockUtils;
import dev.sheldan.abstracto.utility.service.StarboardServiceBean;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.*;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.List;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class StarboardConfigListenerTest {
@InjectMocks
private StarboardConfigListener testUnit;
@Mock
private ConfigManagementService configManagementService;
@Mock
private DefaultConfigManagementService defaultConfigManagementService;
@Captor
private ArgumentCaptor<String> configKeyCaptor;
@Test
public void testUpdateServerConfig() {
AServer server = MockUtils.getServer();
int numberOfLevels = 4;
SystemConfigProperty config = Mockito.mock(SystemConfigProperty.class);
when(config.getLongValue()).thenReturn((long) numberOfLevels);
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LVL_CONFIG_PREFIX + 1)).thenReturn(config);
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LVL_CONFIG_PREFIX + 2)).thenReturn(config);
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LVL_CONFIG_PREFIX + 3)).thenReturn(config);
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LVL_CONFIG_PREFIX + 4)).thenReturn(config);
testUnit.updateServerConfig(server);
verify(configManagementService, times(numberOfLevels)).createIfNotExists(eq(server.getId()), configKeyCaptor.capture(), anyLong());
List<String> keys = configKeyCaptor.getAllValues();
for (int i = 0; i < numberOfLevels; i++) {
Assert.assertEquals(StarboardServiceBean.STAR_LVL_CONFIG_PREFIX + (i + 1), keys.get(i));
}
Assert.assertEquals(numberOfLevels, keys.size());
}
}

View File

@@ -13,6 +13,7 @@ import dev.sheldan.abstracto.core.service.management.PostTargetManagement;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.templating.model.MessageToSend; import dev.sheldan.abstracto.templating.model.MessageToSend;
import dev.sheldan.abstracto.templating.service.TemplateService; import dev.sheldan.abstracto.templating.service.TemplateService;
import dev.sheldan.abstracto.utility.config.features.StarboardFeature;
import dev.sheldan.abstracto.utility.config.posttargets.StarboardPostTarget; import dev.sheldan.abstracto.utility.config.posttargets.StarboardPostTarget;
import dev.sheldan.abstracto.utility.models.database.StarboardPost; import dev.sheldan.abstracto.utility.models.database.StarboardPost;
import dev.sheldan.abstracto.utility.models.database.StarboardPostReaction; import dev.sheldan.abstracto.utility.models.database.StarboardPostReaction;
@@ -38,7 +39,7 @@ import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import static dev.sheldan.abstracto.utility.service.StarboardServiceBean.STARBOARD_POST_TEMPLATE; import static dev.sheldan.abstracto.utility.config.features.StarboardFeature.STAR_EMOTE_PREFIX;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class) @RunWith(MockitoJUnitRunner.class)
@@ -148,14 +149,18 @@ public class StarboardServiceBeanTest {
when(channelService.getTextChannelFromServerOptional(SERVER_ID, CHANNEL_ID)).thenReturn(Optional.of(mockedTextChannel)); when(channelService.getTextChannelFromServerOptional(SERVER_ID, CHANNEL_ID)).thenReturn(Optional.of(mockedTextChannel));
when(guildService.getGuildByIdOptional(SERVER_ID)).thenReturn(Optional.of(guild)); when(guildService.getGuildByIdOptional(SERVER_ID)).thenReturn(Optional.of(guild));
SystemConfigProperty config = Mockito.mock(SystemConfigProperty.class); SystemConfigProperty config = Mockito.mock(SystemConfigProperty.class);
when(config.getLongValue()).thenReturn(3L); Long defaultValue = 3L;
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY)).thenReturn(config); when(config.getLongValue()).thenReturn(defaultValue);
when(configService.getLongValue("starLvl3", SERVER_ID)).thenReturn(3L); when(defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
when(configService.getLongValue("starLvl2", SERVER_ID)).thenReturn(2L); when(configService.getLongValue(StarboardFeature.STAR_LVL_CONFIG_PREFIX + "2", SERVER_ID, defaultValue)).thenReturn(2L);
when(emoteService.getUsableEmoteOrDefault(SERVER_ID, "star2")).thenReturn("b"); when(configService.getLongValue(StarboardFeature.STAR_LVL_CONFIG_PREFIX + "3", SERVER_ID, defaultValue)).thenReturn(3L);
when(defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LVL_CONFIG_PREFIX + "2")).thenReturn(config);
when(defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LVL_CONFIG_PREFIX + "3")).thenReturn(config);
when(emoteService.getUsableEmoteOrDefault(SERVER_ID, STAR_EMOTE_PREFIX + "2")).thenReturn("b");
when(self.sendStarboardPostAndStore(eq(message), eq(STARRED_SERVER_USER_ID), anyList(), any())).thenReturn(CompletableFuture.completedFuture(null)); when(self.sendStarboardPostAndStore(eq(message), eq(STARRED_SERVER_USER_ID), anyList(), any())).thenReturn(CompletableFuture.completedFuture(null));
CompletableFuture<Void> createPostFuture = testUnit.createStarboardPost(message, userExceptAuthor, userReacting, starredUser); CompletableFuture<Void> createPostFuture = testUnit.createStarboardPost(message, userExceptAuthor, userReacting, starredUser);
Assert.assertTrue(createPostFuture.isDone()); createPostFuture.join();
Assert.assertFalse(createPostFuture.isCompletedExceptionally());
} }
@Test @Test
@@ -163,7 +168,7 @@ public class StarboardServiceBeanTest {
CachedMessage message = Mockito.mock(CachedMessage.class); CachedMessage message = Mockito.mock(CachedMessage.class);
when(message.getServerId()).thenReturn(SERVER_ID); when(message.getServerId()).thenReturn(SERVER_ID);
StarboardPostModel model = Mockito.mock(StarboardPostModel.class); StarboardPostModel model = Mockito.mock(StarboardPostModel.class);
when(templateService.renderEmbedTemplate(STARBOARD_POST_TEMPLATE, model)).thenReturn(messageToSend); when(templateService.renderEmbedTemplate(StarboardServiceBean.STARBOARD_POST_TEMPLATE, model)).thenReturn(messageToSend);
PostTarget postTarget = Mockito.mock(PostTarget.class); PostTarget postTarget = Mockito.mock(PostTarget.class);
when(postTarget.getChannelReference()).thenReturn(starboardChannel); when(postTarget.getChannelReference()).thenReturn(starboardChannel);
when(starboardChannel.getId()).thenReturn(STARBOARD_CHANNEL_ID); when(starboardChannel.getId()).thenReturn(STARBOARD_CHANNEL_ID);
@@ -217,16 +222,19 @@ public class StarboardServiceBeanTest {
when(post.getSourceChanel()).thenReturn(sourceChannel); when(post.getSourceChanel()).thenReturn(sourceChannel);
when(post.getId()).thenReturn(starboardPostId); when(post.getId()).thenReturn(starboardPostId);
MessageToSend postMessage = Mockito.mock(MessageToSend.class); MessageToSend postMessage = Mockito.mock(MessageToSend.class);
when(templateService.renderEmbedTemplate(eq(STARBOARD_POST_TEMPLATE), starboardPostModelArgumentCaptor.capture())).thenReturn(postMessage); when(templateService.renderEmbedTemplate(eq(StarboardServiceBean.STARBOARD_POST_TEMPLATE), starboardPostModelArgumentCaptor.capture())).thenReturn(postMessage);
when(postTargetService.editOrCreatedInPostTarget(oldPostId, postMessage, StarboardPostTarget.STARBOARD, SERVER_ID)).thenReturn(Arrays.asList(CompletableFuture.completedFuture(sendPost))); when(postTargetService.editOrCreatedInPostTarget(oldPostId, postMessage, StarboardPostTarget.STARBOARD, SERVER_ID)).thenReturn(Arrays.asList(CompletableFuture.completedFuture(sendPost)));
when(sendPost.getIdLong()).thenReturn(newPostId); when(sendPost.getIdLong()).thenReturn(newPostId);
SystemConfigProperty config = Mockito.mock(SystemConfigProperty.class); SystemConfigProperty config = Mockito.mock(SystemConfigProperty.class);
when(config.getLongValue()).thenReturn(4L); when(config.getLongValue()).thenReturn(1L);
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY)).thenReturn(config); when(defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
when(defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LVL_CONFIG_PREFIX + 1)).thenReturn(config);
when(starboardPostManagementService.findByStarboardPostId(starboardPostId)).thenReturn(Optional.of(post)); when(starboardPostManagementService.findByStarboardPostId(starboardPostId)).thenReturn(Optional.of(post));
when(memberService.getMemberInServerAsync(SERVER_ID, STARRED_USER_ID)).thenReturn(CompletableFuture.completedFuture(starredMember)); when(memberService.getMemberInServerAsync(SERVER_ID, STARRED_USER_ID)).thenReturn(CompletableFuture.completedFuture(starredMember));
List<AUserInAServer > userExceptAuthor = new ArrayList<>(); List<AUserInAServer > userExceptAuthor = new ArrayList<>();
testUnit.updateStarboardPost(post, message, userExceptAuthor); CompletableFuture<Void> future = testUnit.updateStarboardPost(post, message, userExceptAuthor);
future.join();
Assert.assertFalse(future.isCompletedExceptionally());
verify(postTargetService, times(1)).editOrCreatedInPostTarget(oldPostId, postMessage, StarboardPostTarget.STARBOARD, SERVER_ID); verify(postTargetService, times(1)).editOrCreatedInPostTarget(oldPostId, postMessage, StarboardPostTarget.STARBOARD, SERVER_ID);
verify(starboardPostManagementService, times(1)).setStarboardPostMessageId(post, newPostId); verify(starboardPostManagementService, times(1)).setStarboardPostMessageId(post, newPostId);
} }

View File

@@ -5,7 +5,7 @@ import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.FeatureValidatorService; import dev.sheldan.abstracto.core.service.FeatureValidatorService;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService; import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.core.test.MockUtils; import dev.sheldan.abstracto.core.test.MockUtils;
import dev.sheldan.abstracto.utility.service.StarboardServiceBean; import dev.sheldan.abstracto.utility.config.features.StarboardFeature;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -37,14 +37,14 @@ public class StarboardFeatureValidatorServiceTest {
int levelCount = 4; int levelCount = 4;
SystemConfigProperty config = Mockito.mock(SystemConfigProperty.class); SystemConfigProperty config = Mockito.mock(SystemConfigProperty.class);
when(config.getLongValue()).thenReturn((long) levelCount); when(config.getLongValue()).thenReturn((long) levelCount);
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY)).thenReturn(config); when(defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
testUnit.featureIsSetup(null, server, null); testUnit.featureIsSetup(null, server, null);
verify(featureValidatorService, times(levelCount)).checkSystemConfig(configKeyCaptor.capture(), eq(server), any()); verify(featureValidatorService, times(levelCount)).checkSystemConfig(configKeyCaptor.capture(), eq(server), any());
List<String> allValues = configKeyCaptor.getAllValues(); List<String> allValues = configKeyCaptor.getAllValues();
for (int i = 0; i < allValues.size(); i++) { for (int i = 0; i < allValues.size(); i++) {
String key = allValues.get(i); String key = allValues.get(i);
Assert.assertEquals("starLvl" + ( i + 1 ), key); Assert.assertEquals(StarboardFeature.STAR_LVL_CONFIG_PREFIX + ( i + 1 ), key);
} }
Assert.assertEquals(levelCount, allValues.size()); Assert.assertEquals(levelCount, allValues.size());
} }

View File

@@ -4,20 +4,30 @@ import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureEnum; import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.config.PostTargetEnum; import dev.sheldan.abstracto.core.config.PostTargetEnum;
import dev.sheldan.abstracto.core.service.FeatureValidator; import dev.sheldan.abstracto.core.service.FeatureValidator;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.utility.StarboardFeatureValidator; import dev.sheldan.abstracto.utility.StarboardFeatureValidator;
import dev.sheldan.abstracto.utility.config.posttargets.StarboardPostTarget; import dev.sheldan.abstracto.utility.config.posttargets.StarboardPostTarget;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@Component @Component
public class StarboardFeature implements FeatureConfig { public class StarboardFeature implements FeatureConfig {
public static final String STAR_LVL_CONFIG_PREFIX = "starLvl";
public static final String STAR_EMOTE_PREFIX = "star";
public static final String STAR_BADGE_EMOTE_PREFIX = "starboardBadge";
public static final String STAR_LEVELS_CONFIG_KEY = "starLvls";
@Autowired @Autowired
private StarboardFeatureValidator starboardFeatureValidator; private StarboardFeatureValidator starboardFeatureValidator;
@Autowired
private DefaultConfigManagementService defaultConfigManagementService;
@Override @Override
public FeatureEnum getFeature() { public FeatureEnum getFeature() {
return UtilityFeature.STARBOARD; return UtilityFeature.STARBOARD;
@@ -33,10 +43,30 @@ public class StarboardFeature implements FeatureConfig {
return Arrays.asList(starboardFeatureValidator); return Arrays.asList(starboardFeatureValidator);
} }
// TODO add missing system config keys @Override
public List<String> getRequiredSystemConfigKeys() {
List<String> configKeys = new ArrayList<>();
int maxLevels = getMaxLevels();
for(int i = maxLevels; i > 0; i--) {
configKeys.add(StarboardFeature.STAR_LVL_CONFIG_PREFIX + i);
}
return configKeys;
}
@Override @Override
public List<String> getRequiredEmotes() { public List<String> getRequiredEmotes() {
return Arrays.asList("star", "star1", "star2", "star3", "star4", "starboardBadge1", "starboardBadge2", "starboardBadge3"); List<String> emoteNames = new ArrayList<>();
int maxLevels = getMaxLevels();
for(int i = maxLevels; i > 0; i--) {
emoteNames.add(StarboardFeature.STAR_EMOTE_PREFIX + i);
}
emoteNames.add(StarboardFeature.STAR_BADGE_EMOTE_PREFIX + 1);
emoteNames.add(StarboardFeature.STAR_BADGE_EMOTE_PREFIX + 2);
emoteNames.add(StarboardFeature.STAR_BADGE_EMOTE_PREFIX + 3);
return emoteNames;
}
private int getMaxLevels() {
return defaultConfigManagementService.getDefaultConfig(STAR_LEVELS_CONFIG_KEY).getLongValue().intValue();
} }
} }

View File

@@ -26,7 +26,7 @@ public class SetConfig extends AbstractConditionableCommand {
public CommandResult execute(CommandContext commandContext) { public CommandResult execute(CommandContext commandContext) {
String key = (String) commandContext.getParameters().getParameters().get(0); String key = (String) commandContext.getParameters().getParameters().get(0);
String value = (String) commandContext.getParameters().getParameters().get(1); String value = (String) commandContext.getParameters().getParameters().get(1);
configService.setConfigValue(key, commandContext.getGuild().getIdLong(), value); configService.setOrCreateConfigValue(key, commandContext.getGuild().getIdLong(), value);
return CommandResult.fromSuccess(); return CommandResult.fromSuccess();
} }

View File

@@ -17,7 +17,7 @@ public class SystemConfigDelayedAction implements DelayedAction {
public void execute(DelayedActionConfig delayedActionConfig) { public void execute(DelayedActionConfig delayedActionConfig) {
SystemConfigDelayedActionConfig concrete = (SystemConfigDelayedActionConfig) delayedActionConfig; SystemConfigDelayedActionConfig concrete = (SystemConfigDelayedActionConfig) delayedActionConfig;
log.trace("Executing delayed system config action for key {} in server {}.", concrete.getConfigKey(), concrete.getServerId()); log.trace("Executing delayed system config action for key {} in server {}.", concrete.getConfigKey(), concrete.getServerId());
configService.setConfigValue(concrete.getConfigKey(), concrete.getServerId(), concrete.getValue()); configService.setOrCreateConfigValue(concrete.getServerId(), concrete.getConfigKey(), concrete.getValue());
} }
@Override @Override

View File

@@ -78,7 +78,7 @@ public class SystemConfigSetupStep extends AbstractConfigSetupStep {
config = self.loadDefaultConfig(systemConfigStepParameter); config = self.loadDefaultConfig(systemConfigStepParameter);
log.info("It was decided to keep the original value for key {} in server {}.", systemConfigStepParameter.getConfigKey(), user.getGuildId()); log.info("It was decided to keep the original value for key {} in server {}.", systemConfigStepParameter.getConfigKey(), user.getGuildId());
} else { } else {
config = self.checkValidity(user, systemConfigStepParameter, event); config = self.checkValidity(systemConfigStepParameter, event);
log.trace("The given value for key {} in server {} was valid.", systemConfigStepParameter.getConfigKey(), user.getGuildId()); log.trace("The given value for key {} in server {} was valid.", systemConfigStepParameter.getConfigKey(), user.getGuildId());
} }
SystemConfigDelayedActionConfig build = SystemConfigDelayedActionConfig SystemConfigDelayedActionConfig build = SystemConfigDelayedActionConfig
@@ -120,8 +120,8 @@ public class SystemConfigSetupStep extends AbstractConfigSetupStep {
} }
@Transactional @Transactional
public AConfig checkValidity(AServerChannelUserId user, SystemConfigStepParameter systemConfigStepParameter, MessageReceivedEvent event) { public AConfig checkValidity(SystemConfigStepParameter systemConfigStepParameter, MessageReceivedEvent event) {
return configService.getFakeConfigForValue(systemConfigStepParameter.getConfigKey(), user.getGuildId(), event.getMessage().getContentRaw()); return configService.getFakeConfigForValue(systemConfigStepParameter.getConfigKey(), event.getMessage().getContentRaw());
} }

View File

@@ -22,6 +22,6 @@ public class CoreServiceConfigListener implements ServerConfigListener {
public void updateServerConfig(AServer server) { public void updateServerConfig(AServer server) {
log.info("Creating prefix config for server {}.", server.getId()); log.info("Creating prefix config for server {}.", server.getId());
String defaultPrefix = defaultConfigManagementService.getDefaultConfig(CommandManager.PREFIX).getStringValue(); String defaultPrefix = defaultConfigManagementService.getDefaultConfig(CommandManager.PREFIX).getStringValue();
configManagementService.createIfNotExists(server.getId(), CommandManager.PREFIX, defaultPrefix); configManagementService.loadOrCreateIfNotExists(server.getId(), CommandManager.PREFIX, defaultPrefix);
} }
} }

View File

@@ -2,16 +2,21 @@ package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.exception.ConfigurationKeyNotFoundException; import dev.sheldan.abstracto.core.exception.ConfigurationKeyNotFoundException;
import dev.sheldan.abstracto.core.models.database.AConfig; import dev.sheldan.abstracto.core.models.database.AConfig;
import dev.sheldan.abstracto.core.models.property.SystemConfigProperty;
import dev.sheldan.abstracto.core.service.management.ConfigManagementService; import dev.sheldan.abstracto.core.service.management.ConfigManagementService;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
public class ConfigServiceBean implements ConfigService{ public class ConfigServiceBean implements ConfigService {
@Autowired @Autowired
private ConfigManagementService configManagementService; private ConfigManagementService configManagementService;
@Autowired
private DefaultConfigManagementService defaultConfigManagementService;
@Override @Override
public Double getDoubleValue(String name, Long serverId) { public Double getDoubleValue(String name, Long serverId) {
return getDoubleValue(name, serverId, 0D); return getDoubleValue(name, serverId, 0D);
@@ -84,6 +89,27 @@ public class ConfigServiceBean implements ConfigService{
} }
@Override
public AConfig setOrCreateConfigValue(String name, Long serverId, String value) {
if(defaultConfigManagementService.configKeyExists(name)) {
AConfig fakeConfigValue = getFakeConfigForValue(name, value);
return setOrCreateConfigValue(serverId, name, fakeConfigValue);
} else {
throw new ConfigurationKeyNotFoundException(name);
}
}
@Override
public AConfig setOrCreateConfigValue(Long serverId, String name, AConfig value) {
if(value.getDoubleValue() != null) {
return configManagementService.setOrCreateDoubleValue(serverId, name, value.getDoubleValue());
} else if(value.getLongValue() != null) {
return configManagementService.setOrCreateLongValue(serverId, name, value.getLongValue());
} else {
return configManagementService.setOrCreateStringValue(serverId, name, value.getStringValue());
}
}
@Override @Override
public void setConfigValue(String name, Long serverId, AConfig value) { public void setConfigValue(String name, Long serverId, AConfig value) {
if(value.getDoubleValue() != null) { if(value.getDoubleValue() != null) {
@@ -105,9 +131,9 @@ public class ConfigServiceBean implements ConfigService{
} }
@Override @Override
public boolean configIsFitting(String name, Long serverId, String value) { public boolean configurationIsValid(String name, String value) {
try { try {
getFakeConfigForValue(name, serverId, value); getFakeConfigForValue(name, value);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
return false; return false;
@@ -115,13 +141,13 @@ public class ConfigServiceBean implements ConfigService{
} }
@Override @Override
public AConfig getFakeConfigForValue(String name, Long serverId, String value) { public AConfig getFakeConfigForValue(String name, String value) {
if(configManagementService.configExists(serverId, name)) { if(defaultConfigManagementService.configKeyExists(name)) {
AConfig newConfig = AConfig.builder().name(value).build(); AConfig newConfig = AConfig.builder().name(value).build();
AConfig existing = configManagementService.loadConfig(serverId, name); SystemConfigProperty defaultConfig = defaultConfigManagementService.getDefaultConfig(name);
if(existing.getDoubleValue() != null) { if(defaultConfig.getDoubleValue() != null) {
newConfig.setDoubleValue(Double.parseDouble(value)); newConfig.setDoubleValue(Double.parseDouble(value));
} else if(existing.getLongValue() != null) { } else if(defaultConfig.getLongValue() != null) {
newConfig.setLongValue(Long.parseLong(value)); newConfig.setLongValue(Long.parseLong(value));
} else { } else {
newConfig.setStringValue(value); newConfig.setStringValue(value);

View File

@@ -39,6 +39,17 @@ public class ConfigManagementServiceBean implements ConfigManagementService {
return config; return config;
} }
@Override
public AConfig setOrCreateLongValue(Long serverId, String name, Long value) {
AConfig config = loadConfig(serverId, name);
if(config == null) {
config = createConfig(serverId, name, value);
} else {
config.setLongValue(value);
}
return config;
}
@Override @Override
public AConfig createConfig(Long serverId, String name, String value) { public AConfig createConfig(Long serverId, String name, String value) {
AServer server = serverManagementService.loadOrCreate(serverId); AServer server = serverManagementService.loadOrCreate(serverId);
@@ -82,7 +93,7 @@ public class ConfigManagementServiceBean implements ConfigManagementService {
} }
@Override @Override
public AConfig createIfNotExists(Long serverId, String name, String value) { public AConfig loadOrCreateIfNotExists(Long serverId, String name, String value) {
AConfig config = loadConfig(serverId, name); AConfig config = loadConfig(serverId, name);
if(config == null) { if(config == null) {
return this.createConfig(serverId, name, value); return this.createConfig(serverId, name, value);
@@ -91,7 +102,7 @@ public class ConfigManagementServiceBean implements ConfigManagementService {
} }
@Override @Override
public AConfig createIfNotExists(Long serverId, String name, Long value) { public AConfig loadOrCreateIfNotExists(Long serverId, String name, Long value) {
AConfig config = loadConfig(serverId, name); AConfig config = loadConfig(serverId, name);
if(config == null) { if(config == null) {
return this.createConfig(serverId, name, value); return this.createConfig(serverId, name, value);
@@ -100,7 +111,7 @@ public class ConfigManagementServiceBean implements ConfigManagementService {
} }
@Override @Override
public AConfig createIfNotExists(Long serverId, String name, Double value) { public AConfig loadOrCreateIfNotExists(Long serverId, String name, Double value) {
AConfig config = loadConfig(serverId, name); AConfig config = loadConfig(serverId, name);
if(config == null) { if(config == null) {
return this.createConfig(serverId, name, value); return this.createConfig(serverId, name, value);

View File

@@ -17,4 +17,9 @@ public class DefaultConfigManagementServiceBean implements DefaultConfigManageme
public SystemConfigProperty getDefaultConfig(String key) { public SystemConfigProperty getDefaultConfig(String key) {
return defaultConfigProperties.getSystemConfigs().get(key); return defaultConfigProperties.getSystemConfigs().get(key);
} }
@Override
public boolean configKeyExists(String key) {
return defaultConfigProperties.getSystemConfigs().containsKey(key);
}
} }

View File

@@ -14,4 +14,15 @@ public class SystemConfigProperty {
private Long longValue; private Long longValue;
private String stringValue; private String stringValue;
private Double doubleValue; private Double doubleValue;
public String getValueAsString() {
if(getLongValue() != null) {
return getLongValue().toString();
} else if(getDoubleValue() != null) {
return getDoubleValue().toString();
} else if(getStringValue() != null) {
return getStringValue();
}
return null;
}
} }

View File

@@ -8,12 +8,14 @@ public interface ConfigService {
Double getDoubleValue(String name, Long serverId, Double defaultValue); Double getDoubleValue(String name, Long serverId, Double defaultValue);
String getStringValue(String name, Long serverId, String defaultValue); String getStringValue(String name, Long serverId, String defaultValue);
Long getLongValue(String name, Long serverId, Long defaultValue); Long getLongValue(String name, Long serverId, Long defaultValue);
AConfig setOrCreateConfigValue(Long serverId, String name, AConfig value);
void setDoubleValue(String name, Long serverId, Double value); void setDoubleValue(String name, Long serverId, Double value);
void setLongValue(String name, Long serverId, Long value); void setLongValue(String name, Long serverId, Long value);
void setConfigValue(String name, Long serverId, String value); void setConfigValue(String name, Long serverId, String value);
AConfig setOrCreateConfigValue(String name, Long serverId, String value);
void setConfigValue(String name, Long serverId, AConfig value); void setConfigValue(String name, Long serverId, AConfig value);
void setStringValue(String name, Long serverId, String value); void setStringValue(String name, Long serverId, String value);
boolean configIsFitting(String name, Long serverId, String value); boolean configurationIsValid(String name, String value);
AConfig getFakeConfigForValue(String name, Long serverId, String value); AConfig getFakeConfigForValue(String name, String value);
} }

View File

@@ -6,12 +6,13 @@ import dev.sheldan.abstracto.core.models.database.AServer;
public interface ConfigManagementService { public interface ConfigManagementService {
AConfig setOrCreateStringValue(Long serverId, String name, String value); AConfig setOrCreateStringValue(Long serverId, String name, String value);
AConfig setOrCreateDoubleValue(Long serverId, String name, Double value); AConfig setOrCreateDoubleValue(Long serverId, String name, Double value);
AConfig setOrCreateLongValue(Long serverId, String name, Long value);
AConfig createConfig(Long serverId, String name, String value); AConfig createConfig(Long serverId, String name, String value);
AConfig createConfig(Long serverId, String name, Double value); AConfig createConfig(Long serverId, String name, Double value);
AConfig createConfig(Long serverId, String name, Long value); AConfig createConfig(Long serverId, String name, Long value);
AConfig createIfNotExists(Long serverId, String name, String value); AConfig loadOrCreateIfNotExists(Long serverId, String name, String value);
AConfig createIfNotExists(Long serverId, String name, Long value); AConfig loadOrCreateIfNotExists(Long serverId, String name, Long value);
AConfig createIfNotExists(Long serverId, String name, Double value); AConfig loadOrCreateIfNotExists(Long serverId, String name, Double value);
AConfig loadConfig(Long serverId, String name); AConfig loadConfig(Long serverId, String name);
boolean configExists(Long serverId, String name); boolean configExists(Long serverId, String name);
boolean configExists(AServer server, String name); boolean configExists(AServer server, String name);

View File

@@ -4,4 +4,5 @@ import dev.sheldan.abstracto.core.models.property.SystemConfigProperty;
public interface DefaultConfigManagementService { public interface DefaultConfigManagementService {
SystemConfigProperty getDefaultConfig(String key); SystemConfigProperty getDefaultConfig(String key);
boolean configKeyExists(String key);
} }