added liquibase for setup of databases and initial values

fixed some table names to be singular
migrated templates to separate repository
added seed data to initial version in liquibase migrations instead of property files (post targets, emotes etc) and created some default tables containing those default values
added separate artifacts to be used containing only the liquibase config
added shell script as a wrapper for ansible deployment, to handle an environment variable defining whether or not the deployment should be executed
added logback scan period
added licenses for ansible, liquibase, docker and docker-compose
This commit is contained in:
Sheldan
2020-07-01 20:44:21 +02:00
parent e8767429bf
commit 9374dfb912
965 changed files with 15775 additions and 2935 deletions

View File

@@ -11,6 +11,28 @@
<artifactId>experience-tracking-impl</artifactId>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/assembly/liquibase.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>dev.sheldan.abstracto.modules</groupId>
@@ -25,6 +47,7 @@
<type>test-jar</type>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,18 @@
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
<id>liquibase</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<outputDirectory>.</outputDirectory>
<directory>${project.basedir}/src/main/resources/migrations</directory>
<includes>
<include>**/*</include>
</includes>
</fileSet>
</fileSets>
</assembly>

View File

@@ -1,33 +0,0 @@
package dev.sheldan.abstracto.experience.config;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@Getter
@Setter
@ConfigurationProperties(prefix = "abstracto.experience")
public class ExperienceConfig {
/**
* The default min experience range from the properties file. This is used, when the bot joins a new guild.
*/
private Integer minExp;
/**
* The default max experience range from the properties file. This is used, when the bot joins a new guild.
*/
private Integer maxExp;
/**
* The default multiplier from the properties file. This is used, when the bot joins a new guild.
*/
private Double expMultiplier;
/**
* The default maxLevel from the properties file. This configuration applies globally, as the amount of levels does not depend on the server.
* This is only used once, when creating the {@link dev.sheldan.abstracto.experience.models.database.AExperienceLevel} once
*/
private Integer maxLvl;
}

View File

@@ -3,6 +3,7 @@ package dev.sheldan.abstracto.experience.config;
import dev.sheldan.abstracto.core.listener.ServerConfigListener;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.management.ConfigManagementService;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeatureConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -17,7 +18,7 @@ public class ExperienceConfigListener implements ServerConfigListener {
@Autowired
private ExperienceConfig experienceConfig;
private DefaultConfigManagementService defaultConfigManagementService;
@Autowired
private ConfigManagementService service;
@@ -25,8 +26,8 @@ public class ExperienceConfigListener implements ServerConfigListener {
@Override
public void updateServerConfig(AServer server) {
log.info("Setting up experience configuration for server {}.", server.getId());
service.createIfNotExists(server.getId(), ExperienceFeatureConfig.MIN_EXP_KEY, experienceConfig.getMinExp().longValue());
service.createIfNotExists(server.getId(), ExperienceFeatureConfig.MAX_EXP_KEY, experienceConfig.getMaxExp().longValue());
service.createIfNotExists(server.getId(), ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, experienceConfig.getExpMultiplier());
service.createIfNotExists(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.createIfNotExists(server.getId(), ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, defaultConfigManagementService.getDefaultConfig(ExperienceFeatureConfig.EXP_MULTIPLIER_KEY).getDoubleValue());
}
}

View File

@@ -1,32 +0,0 @@
package dev.sheldan.abstracto.experience.config;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeatureConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/**
* Bean used to define the default values for the required configuration in the experience module.
* This {@link dev.sheldan.abstracto.core.models.database.ADefaultConfig} is used, when a config key in a module is set to the default value
* This service only creates a value if no one is previously there.
*/
@Component
public class ExperienceDefaultConfigListener {
@Autowired
private DefaultConfigManagementService defaultConfigManagementService;
@Autowired
private ExperienceConfig experienceConfig;
@EventListener
@Transactional
public void handleContextRefreshEvent(ContextRefreshedEvent ctxStartEvt) {
defaultConfigManagementService.createDefaultConfig(ExperienceFeatureConfig.MIN_EXP_KEY, experienceConfig.getMinExp().longValue());
defaultConfigManagementService.createDefaultConfig(ExperienceFeatureConfig.MAX_EXP_KEY, experienceConfig.getMaxExp().longValue());
defaultConfigManagementService.createDefaultConfig(ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, experienceConfig.getExpMultiplier());
}
}

View File

@@ -1,30 +0,0 @@
package dev.sheldan.abstracto.experience.config;
import dev.sheldan.abstracto.experience.service.ExperienceLevelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
/**
* Component responsible to create the amount of {@link dev.sheldan.abstracto.experience.models.database.AExperienceLevel}
* configured in the {@link ExperienceConfig}. This is executed when the application starts up.
*/
@Component
@Slf4j
public class ExperienceLevelLoader {
@Autowired
private ExperienceConfig experienceConfig;
@Autowired
private ExperienceLevelService experienceLevelService;
@EventListener
public void handleContextRefreshEvent(ContextRefreshedEvent ctxStartEvt) {
Integer maxLevel = experienceConfig.getMaxLvl();
log.info("Creating experience levels up to level {}", maxLevel);
experienceLevelService.createLevelsUntil(maxLevel);
}
}

View File

@@ -1,9 +0,0 @@
package dev.sheldan.abstracto.experience.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource("classpath:experience.properties")
public class ExperienceProperties {
}

View File

@@ -1,16 +0,0 @@
abstracto.scheduling.jobs.experienceJob.name=experienceJob
abstracto.scheduling.jobs.experienceJob.group=experience
abstracto.scheduling.jobs.experienceJob.clazz=dev.sheldan.abstracto.experience.job.ExperiencePersistingJob
abstracto.scheduling.jobs.experienceJob.standAlone=true
abstracto.scheduling.jobs.experienceJob.active=true
abstracto.scheduling.jobs.experienceJob.cronExpression=30 * * * * ?
abstracto.scheduling.jobs.experienceJob.recovery=false
abstracto.features.experience.enabled=true
abstracto.experience.minExp=10
abstracto.experience.maxExp=25
abstracto.experience.expMultiplier=1
abstracto.experience.maxLvl=200

View File

@@ -0,0 +1,11 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/pro ../dbchangelog-3.8.xsd" >
<include file="experience-tables/tables.xml" relativeToChangelogFile="true"/>
<include file="experience-seedData/data.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -0,0 +1,81 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/pro ../../dbchangelog-3.8.xsd" >
<property name="experienceModule" value="(SELECT id FROM module WHERE name = 'experience')"/>
<property name="experienceFeature" value="(SELECT id FROM feature WHERE key = 'experience')"/>
<property name="today" value="(SELECT NOW())"/>
<changeSet author="Sheldan" id="experience-commands">
<insert tableName="command">
<column name="name" value="disableExpForRole"/>
<column name="module_id" valueComputed="${experienceModule}"/>
<column name="feature_id" valueComputed="${experienceFeature}"/>
<column name="created" valueComputed="${today}"/>
</insert>
<insert tableName="command">
<column name="name" value="disableExpGain"/>
<column name="module_id" valueComputed="${experienceModule}"/>
<column name="feature_id" valueComputed="${experienceFeature}"/>
<column name="created" valueComputed="${today}"/>
</insert>
<insert tableName="command">
<column name="name" value="enableExpForRole"/>
<column name="module_id" valueComputed="${experienceModule}"/>
<column name="feature_id" valueComputed="${experienceFeature}"/>
<column name="created" valueComputed="${today}"/>
</insert>
<insert tableName="command">
<column name="name" value="enableExpGain"/>
<column name="module_id" valueComputed="${experienceModule}"/>
<column name="feature_id" valueComputed="${experienceFeature}"/>
<column name="created" valueComputed="${today}"/>
</insert>
<insert tableName="command">
<column name="name" value="expScale"/>
<column name="module_id" valueComputed="${experienceModule}"/>
<column name="feature_id" valueComputed="${experienceFeature}"/>
<column name="created" valueComputed="${today}"/>
</insert>
<insert tableName="command">
<column name="name" value="leaderboard"/>
<column name="module_id" valueComputed="${experienceModule}"/>
<column name="feature_id" valueComputed="${experienceFeature}"/>
<column name="created" valueComputed="${today}"/>
</insert>
<insert tableName="command">
<column name="name" value="listDisabledExperienceRoles"/>
<column name="module_id" valueComputed="${experienceModule}"/>
<column name="feature_id" valueComputed="${experienceFeature}"/>
<column name="created" valueComputed="${today}"/>
</insert>
<insert tableName="command">
<column name="name" value="rank"/>
<column name="module_id" valueComputed="${experienceModule}"/>
<column name="feature_id" valueComputed="${experienceFeature}"/>
<column name="created" valueComputed="${today}"/>
</insert>
<insert tableName="command">
<column name="name" value="setExpRole"/>
<column name="module_id" valueComputed="${experienceModule}"/>
<column name="feature_id" valueComputed="${experienceFeature}"/>
<column name="created" valueComputed="${today}"/>
</insert>
<insert tableName="command">
<column name="name" value="syncExpRoles"/>
<column name="module_id" valueComputed="${experienceModule}"/>
<column name="feature_id" valueComputed="${experienceFeature}"/>
<column name="created" valueComputed="${today}"/>
</insert>
<insert tableName="command">
<column name="name" value="unSetExpRole"/>
<column name="module_id" valueComputed="${experienceModule}"/>
<column name="feature_id" valueComputed="${experienceFeature}"/>
<column name="created" valueComputed="${today}"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,16 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/pro ../../dbchangelog-3.8.xsd" >
<include file="experience_level.xml" relativeToChangelogFile="true"/>
<include file="feature.xml" relativeToChangelogFile="true"/>
<include file="module.xml" relativeToChangelogFile="true"/>
<include file="command.xml" relativeToChangelogFile="true"/>
<include file="default_config.xml" relativeToChangelogFile="true"/>
<include file="experience_job.xml" relativeToChangelogFile="true"/>
<include file="default_feature_flag.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -0,0 +1,28 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/pro ../../dbchangelog-3.8.xsd" >
<property name="today" value="(SELECT NOW())"/>
<changeSet author="Sheldan" id="experience_default_config-insert">
<insert tableName="default_config">
<column name="name" value="minExp"/>
<column name="long_value" value="10"/>
<column name="created" valueComputed="${today}"/>
</insert>
<insert tableName="default_config">
<column name="name" value="maxExp"/>
<column name="long_value" value="25"/>
<column name="created" valueComputed="${today}"/>
</insert>
<insert tableName="default_config">
<column name="name" value="expMultiplier"/>
<column name="double_value" value="1"/>
<column name="created" valueComputed="${today}"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,18 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/pro ../../dbchangelog-3.8.xsd" >
<property name="experienceFeature" value="(SELECT id FROM feature WHERE key = 'experience')"/>
<property name="today" value="(SELECT NOW())"/>
<changeSet author="Sheldan" id="experience_default_feature_flag-insertion">
<insert tableName="default_feature_flag">
<column name="enabled" value="false"/>
<column name="feature_id" valueComputed="${experienceFeature}" />
<column name="created" valueComputed="${today}"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,19 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="reminder-job-insert">
<insert tableName="scheduler_job">
<column name="name" value="experienceJob"/>
<column name="group_name" value="experience"/>
<column name="clazz" value="dev.sheldan.abstracto.experience.job.ExperiencePersistingJob"/>
<column name="active" value="true"/>
<column name="cron_expression" value="30 * * * * ?"/>
<column name="recovery" value="false"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,417 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="experience_levels-insert">
<insert tableName="experience_level">
<column name="level" value="0"/>
<column name="experience_needed" value="0"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="1"/>
<column name="experience_needed" value="100"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="2"/>
<column name="experience_needed" value="255"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="3"/>
<column name="experience_needed" value="475"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="4"/>
<column name="experience_needed" value="770"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="5"/>
<column name="experience_needed" value="1150"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="6"/>
<column name="experience_needed" value="1625"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="7"/>
<column name="experience_needed" value="2205"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="8"/>
<column name="experience_needed" value="2900"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="9"/>
<column name="experience_needed" value="3720"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="10"/>
<column name="experience_needed" value="4675"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="11"/>
<column name="experience_needed" value="5775"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="12"/>
<column name="experience_needed" value="7030"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="13"/>
<column name="experience_needed" value="8450"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="14"/>
<column name="experience_needed" value="10045"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="15"/>
<column name="experience_needed" value="11825"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="16"/>
<column name="experience_needed" value="13800"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="17"/>
<column name="experience_needed" value="15980"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="18"/>
<column name="experience_needed" value="18375"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="19"/>
<column name="experience_needed" value="20995"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="20"/>
<column name="experience_needed" value="23850"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="21"/>
<column name="experience_needed" value="26950"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="22"/>
<column name="experience_needed" value="30305"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="23"/>
<column name="experience_needed" value="33925"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="24"/>
<column name="experience_needed" value="37820"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="25"/>
<column name="experience_needed" value="42000"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="26"/>
<column name="experience_needed" value="46475"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="27"/>
<column name="experience_needed" value="51255"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="28"/>
<column name="experience_needed" value="56350"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="29"/>
<column name="experience_needed" value="61770"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="30"/>
<column name="experience_needed" value="67525"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="31"/>
<column name="experience_needed" value="73625"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="32"/>
<column name="experience_needed" value="80080"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="33"/>
<column name="experience_needed" value="86900"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="34"/>
<column name="experience_needed" value="94095"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="35"/>
<column name="experience_needed" value="101675"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="36"/>
<column name="experience_needed" value="109650"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="37"/>
<column name="experience_needed" value="118030"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="38"/>
<column name="experience_needed" value="126825"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="39"/>
<column name="experience_needed" value="136045"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="40"/>
<column name="experience_needed" value="145700"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="41"/>
<column name="experience_needed" value="155800"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="42"/>
<column name="experience_needed" value="166355"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="43"/>
<column name="experience_needed" value="177375"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="44"/>
<column name="experience_needed" value="188870"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="45"/>
<column name="experience_needed" value="200850"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="46"/>
<column name="experience_needed" value="213325"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="47"/>
<column name="experience_needed" value="226305"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="48"/>
<column name="experience_needed" value="239800"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="49"/>
<column name="experience_needed" value="253820"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="50"/>
<column name="experience_needed" value="268375"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="51"/>
<column name="experience_needed" value="283475"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="52"/>
<column name="experience_needed" value="299130"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="53"/>
<column name="experience_needed" value="315350"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="54"/>
<column name="experience_needed" value="332145"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="55"/>
<column name="experience_needed" value="349525"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="56"/>
<column name="experience_needed" value="367500"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="57"/>
<column name="experience_needed" value="386080"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="58"/>
<column name="experience_needed" value="405275"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="59"/>
<column name="experience_needed" value="425095"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="60"/>
<column name="experience_needed" value="445550"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="61"/>
<column name="experience_needed" value="466650"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="62"/>
<column name="experience_needed" value="488405"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="63"/>
<column name="experience_needed" value="510825"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="64"/>
<column name="experience_needed" value="533920"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="65"/>
<column name="experience_needed" value="557700"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="66"/>
<column name="experience_needed" value="582175"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="67"/>
<column name="experience_needed" value="607355"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="68"/>
<column name="experience_needed" value="633250"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="69"/>
<column name="experience_needed" value="659870"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="70"/>
<column name="experience_needed" value="687225"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="71"/>
<column name="experience_needed" value="715325"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="72"/>
<column name="experience_needed" value="744180"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="73"/>
<column name="experience_needed" value="773800"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="74"/>
<column name="experience_needed" value="804195"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="75"/>
<column name="experience_needed" value="835375"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="76"/>
<column name="experience_needed" value="867350"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="77"/>
<column name="experience_needed" value="900130"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="78"/>
<column name="experience_needed" value="933725"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="79"/>
<column name="experience_needed" value="968145"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="80"/>
<column name="experience_needed" value="1003400"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="81"/>
<column name="experience_needed" value="1039500"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="82"/>
<column name="experience_needed" value="1076455"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="83"/>
<column name="experience_needed" value="1114275"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="84"/>
<column name="experience_needed" value="1152970"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="85"/>
<column name="experience_needed" value="1192550"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="86"/>
<column name="experience_needed" value="1233025"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="87"/>
<column name="experience_needed" value="1274405"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="88"/>
<column name="experience_needed" value="1316700"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="89"/>
<column name="experience_needed" value="1359920"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="90"/>
<column name="experience_needed" value="1404075"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="91"/>
<column name="experience_needed" value="1449175"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="92"/>
<column name="experience_needed" value="1495230"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="93"/>
<column name="experience_needed" value="1542250"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="94"/>
<column name="experience_needed" value="1590245"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="95"/>
<column name="experience_needed" value="1639225"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="96"/>
<column name="experience_needed" value="1689200"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="97"/>
<column name="experience_needed" value="1740180"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="98"/>
<column name="experience_needed" value="1792175"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="99"/>
<column name="experience_needed" value="1845195"/>
</insert>
<insert tableName="experience_level">
<column name="level" value="100"/>
<column name="experience_needed" value="1899250"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,16 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/pro ../../dbchangelog-3.8.xsd" >
<property name="today" value="(SELECT NOW())"/>
<changeSet author="Sheldan" id="experience_feature-insertion">
<insert tableName="feature">
<column name="key" value="experience"/>
<column name="created" valueComputed="${today}"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,16 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/pro ../../dbchangelog-3.8.xsd" >
<property name="today" value="(SELECT NOW())"/>
<changeSet author="Sheldan" id="experience-module-insertion">
<insert tableName="module">
<column name="name" value="experience"/>
<column name="created" valueComputed="${today}"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,24 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="disabled_experience_roles-table">
<createTable tableName="disabled_experience_roles">
<column autoIncrement="true" name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="disabled_experience_roles_pkey"/>
</column>
<column name="role_id" type="BIGINT">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
<changeSet author="Sheldan" id="disabled_experience_roles-fk_disabled_experience_role_role">
<addForeignKeyConstraint baseColumnNames="role_id" baseTableName="disabled_experience_roles" constraintName="fk_disabled_experience_role_role" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="role" validate="true"/>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,19 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="experience_level-table">
<createTable tableName="experience_level">
<column name="level" type="INTEGER">
<constraints nullable="false" primaryKey="true" primaryKeyName="experience_level_pkey"/>
</column>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="experience_needed" type="BIGINT"/>
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
</createTable>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,37 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="experience_role-table">
<createTable tableName="experience_role">
<column autoIncrement="true" name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="experience_role_pkey"/>
</column>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="level_id" type="INTEGER">
<constraints nullable="false"/>
</column>
<column name="role_id" type="BIGINT">
<constraints nullable="false"/>
</column>
<column name="server_id" type="BIGINT">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
<changeSet author="Sheldan" id="experience_role-fk_experience_role_level">
<addForeignKeyConstraint baseColumnNames="level_id" baseTableName="experience_role" constraintName="fk_experience_role_level" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="level" referencedTableName="experience_level" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="experience_role-fk_experience_role_role">
<addForeignKeyConstraint baseColumnNames="role_id" baseTableName="experience_role" constraintName="fk_experience_role_role" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="role" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="experience_role-fk_experience_role_server">
<addForeignKeyConstraint baseColumnNames="server_id" baseTableName="experience_role" constraintName="fk_experience_role_server" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="server" validate="true"/>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,13 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/pro ../../dbchangelog-3.8.xsd" >
<include file="experience_level.xml" relativeToChangelogFile="true"/>
<include file="experience_role.xml" relativeToChangelogFile="true"/>
<include file="user_experience.xml" relativeToChangelogFile="true"/>
<include file="disabled_experience_roles.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -0,0 +1,32 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/pro ../../dbchangelog-3.8.xsd" >
<changeSet author="Sheldan" id="user_experience-table">
<createTable tableName="user_experience">
<column name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="user_experience_pkey"/>
</column>
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="experience" type="BIGINT"/>
<column name="experience_gain_disabled" type="BOOLEAN"/>
<column name="message_count" type="BIGINT"/>
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
<column name="experience_role_id" type="BIGINT"/>
<column name="level_id" type="INTEGER">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
<changeSet author="Sheldan" id="user_experience-fk_user_experience_level">
<addForeignKeyConstraint baseColumnNames="level_id" baseTableName="user_experience" constraintName="fk_user_experience_level" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="level" referencedTableName="experience_level" validate="true"/>
</changeSet>
<changeSet author="Sheldan" id="user_experience-fk_user_experience_role">
<addForeignKeyConstraint baseColumnNames="experience_role_id" baseTableName="user_experience" constraintName="fk_user_experience_role" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="experience_role" validate="true"/>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,10 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/pro dbchangelog-3.8.xsd" >
<include file="1.0-experience/collection.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

View File

@@ -1,21 +0,0 @@
{
<#macro userDisplay user>
${user.rank} ${user.member.effectiveName} ${user.experience.experience} ${user.experience.currentLevel.level} ${user.experience.messageCount}
</#macro>
"author": {
"name": "${member.effectiveName}",
"avatar": "${member.user.effectiveAvatarUrl}"
},
"color" : {
"r": 200,
"g": 0,
"b": 255
},
"description": "
<#include "leaderboard_rank_column"> | <#include "leaderboard_name_column"> | <#include "leaderboard_experience_column"> | <#include "leaderboard_level_column"> | <#include "leaderboard_messages_column">
<#list userExperiences as user>
<@userDisplay user=user />
</#list>
<@userDisplay user=userExecuting />
"
}

View File

@@ -1,21 +0,0 @@
{
"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>
"
}

View File

@@ -1,38 +0,0 @@
{
"author": {
"name": "${member.effectiveName}",
"avatar": "${member.user.effectiveAvatarUrl}"
},
"color" : {
"r": 200,
"g": 0,
"b": 255
},
"fields": [
{
"name": "<#include "rank_xp_field_title">",
"value": "${rankUser.experience.experience}",
"inline": "true"
},
{
"name": "<#include "rank_level_field_title">",
"value": "${rankUser.experience.currentLevel.level}",
"inline": "true"
},
{
"name": "<#include "rank_messages_field_title">",
"value": "${rankUser.experience.messageCount}",
"inline": "true"
},
{
"name": "<#include "rank_to_next_level_field_title">",
"value": "${experienceToNextLevel}",
"inline": "true"
},
{
"name": "<#include "rank_rank_field_title">",
"value": "${rankUser.rank}",
"inline": "true"
}
]
}

View File

@@ -1,3 +0,0 @@
{
"additionalMessage": "<#include "syncExpRoles_updating_users_label">: ${currentCount}/${totalUserCount}."
}

View File

@@ -1,57 +0,0 @@
package dev.sheldan.abstracto.experience.config;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.management.ConfigManagementService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeatureConfig;
import dev.sheldan.abstracto.test.MockUtils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.List;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class ExperienceConfigListenerTest {
@InjectMocks
private ExperienceConfigListener testUnit;
@Mock
private ExperienceConfig experienceConfig;
@Mock
private ConfigManagementService service;
@Captor
private ArgumentCaptor<Long> configValueCaptor;
@Captor
private ArgumentCaptor<String> configKeyCaptor;
@Test
public void setSettingUp() {
int minExp = 4;
int maxExp = 10;
double expMultiplier = 2;
when(experienceConfig.getMinExp()).thenReturn(minExp);
when(experienceConfig.getMaxExp()).thenReturn(maxExp);
when(experienceConfig.getExpMultiplier()).thenReturn(expMultiplier);
AServer server = MockUtils.getServer();
testUnit.updateServerConfig(server);
verify(service, times(2)).createIfNotExists(eq(server.getId()), configKeyCaptor.capture(), configValueCaptor.capture());
verify(service, times(1)).createIfNotExists(server.getId(), ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, expMultiplier);
List<String> configKeys = configKeyCaptor.getAllValues();
List<Long> configValues = configValueCaptor.getAllValues();
Assert.assertEquals(ExperienceFeatureConfig.MIN_EXP_KEY, configKeys.get(0));
Assert.assertEquals(minExp, configValues.get(0).intValue());
Assert.assertEquals(ExperienceFeatureConfig.MAX_EXP_KEY, configKeys.get(1));
Assert.assertEquals(maxExp, configValues.get(1).intValue());
}
}

View File

@@ -1,54 +0,0 @@
package dev.sheldan.abstracto.experience.config;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.experience.config.features.ExperienceFeatureConfig;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.List;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class ExperienceDefaultConfigListenerTest {
@InjectMocks
private ExperienceDefaultConfigListener testUnit;
@Mock
private ExperienceConfig experienceConfig;
@Mock
private DefaultConfigManagementService service;
@Captor
private ArgumentCaptor<Long> configValueCaptor;
@Captor
private ArgumentCaptor<String> configKeyCaptor;
@Test
public void setSettingUp() {
int minExp = 4;
int maxExp = 10;
double expMultiplier = 2;
when(experienceConfig.getMinExp()).thenReturn(minExp);
when(experienceConfig.getMaxExp()).thenReturn(maxExp);
when(experienceConfig.getExpMultiplier()).thenReturn(expMultiplier);
testUnit.handleContextRefreshEvent(null);
verify(service, times(2)).createDefaultConfig(configKeyCaptor.capture(), configValueCaptor.capture());
verify(service, times(1)).createDefaultConfig(ExperienceFeatureConfig.EXP_MULTIPLIER_KEY, expMultiplier);
List<String> configKeys = configKeyCaptor.getAllValues();
List<Long> configValues = configValueCaptor.getAllValues();
Assert.assertEquals(ExperienceFeatureConfig.MIN_EXP_KEY, configKeys.get(0));
Assert.assertEquals(minExp, configValues.get(0).intValue());
Assert.assertEquals(ExperienceFeatureConfig.MAX_EXP_KEY, configKeys.get(1));
Assert.assertEquals(maxExp, configValues.get(1).intValue());
}
}