[AB-270] adding a channel group to define the channels in which experience gain is disabled

adding a service method to enable migration
This commit is contained in:
Sheldan
2021-05-26 11:29:34 +02:00
parent 184271ff7c
commit 08e2a31f15
5 changed files with 62 additions and 11 deletions

View File

@@ -34,9 +34,13 @@ public class ExperienceTrackerListener implements AsyncMessageReceivedListener {
if(!message.isFromGuild() || message.isWebhookMessage() || message.getType().isSystem() || message.getAuthor().isBot()) { if(!message.isFromGuild() || message.isWebhookMessage() || message.getType().isSystem() || message.getAuthor().isBot()) {
return DefaultListenerResult.IGNORED; return DefaultListenerResult.IGNORED;
} }
AUserInAServer cause = userInServerManagementService.loadOrCreateUser(model.getServerId(), model.getMessage().getAuthor().getIdLong()); if(userExperienceService.experienceGainEnabledInChannel(message.getChannel())) {
userExperienceService.addExperience(cause); AUserInAServer cause = userInServerManagementService.loadOrCreateUser(model.getServerId(), model.getMessage().getAuthor().getIdLong());
return DefaultListenerResult.PROCESSED; userExperienceService.addExperience(cause);
return DefaultListenerResult.PROCESSED;
} else {
return DefaultListenerResult.IGNORED;
}
} }
@Override @Override

View File

@@ -1,15 +1,9 @@
package dev.sheldan.abstracto.experience.service; package dev.sheldan.abstracto.experience.service;
import dev.sheldan.abstracto.core.models.database.AChannel; import dev.sheldan.abstracto.core.models.database.*;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.models.property.SystemConfigProperty; 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.*;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.core.service.management.ServerManagementService;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.core.utils.CompletableFutureList; import dev.sheldan.abstracto.core.utils.CompletableFutureList;
import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.abstracto.core.utils.FutureUtils;
import dev.sheldan.abstracto.experience.config.ExperienceFeatureConfig; import dev.sheldan.abstracto.experience.config.ExperienceFeatureConfig;
@@ -26,6 +20,7 @@ import dev.sheldan.abstracto.core.templating.service.TemplateService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageChannel;
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 org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -82,6 +77,9 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
@Autowired @Autowired
private ChannelManagementService channelManagementService; private ChannelManagementService channelManagementService;
@Autowired
private ChannelGroupService channelGroupService;
@Autowired @Autowired
private DefaultConfigManagementService defaultConfigManagementService; private DefaultConfigManagementService defaultConfigManagementService;
@@ -457,6 +455,33 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
}); });
} }
@Override
public boolean experienceGainEnabledInChannel(MessageChannel messageChannel) {
AChannel channel = channelManagementService.loadChannel(messageChannel.getIdLong());
List<AChannelGroup> channelGroups = channelGroupService.getChannelGroupsOfChannelWithType(channel, EXPERIENCE_GAIN_CHANNEL_GROUP_KEY);
if(!channelGroups.isEmpty()) {
return channelGroups.stream().noneMatch(AChannelGroup::getEnabled);
}
return true;
}
@Override
public AUserExperience createUserExperienceForUser(AUserInAServer aUserInAServer, Long experience, Long messageCount) {
List<AExperienceLevel> levels = experienceLevelManagementService.getLevelConfig();
levels.sort(Comparator.comparing(AExperienceLevel::getExperienceNeeded));
return createUserExperienceForUser(aUserInAServer, experience, messageCount, levels);
}
@Override
public AUserExperience createUserExperienceForUser(AUserInAServer aUserInAServer, Long experience, Long messageCount, List<AExperienceLevel> levels) {
AExperienceLevel level = calculateLevel(levels, experience);
AUserExperience userExperience = userExperienceManagementService.createUserInServer(aUserInAServer);
userExperience.setCurrentLevel(level);
userExperience.setExperience(experience);
userExperience.setMessageCount(messageCount);
return userExperience;
}
@Override @Override
public CompletableFutureList<RoleCalculationResult> executeActionOnUserExperiencesWithFeedBack(List<AUserExperience> experiences, AChannel channel, Function<AUserExperience, CompletableFuture<RoleCalculationResult>> toExecute) { public CompletableFutureList<RoleCalculationResult> executeActionOnUserExperiencesWithFeedBack(List<AUserExperience> experiences, AChannel channel, Function<AUserExperience, CompletableFuture<RoleCalculationResult>> toExecute) {
List<CompletableFuture<RoleCalculationResult>> futures = new ArrayList<>(); List<CompletableFuture<RoleCalculationResult>> futures = new ArrayList<>();

View File

@@ -0,0 +1,14 @@
<?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.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext dbchangelog.xsd
http://www.liquibase.org/xml/ns/pro dbchangelog.xsd" >
<changeSet author="Sheldan" id="experience_gain_channel_group_type-insertion">
<insert tableName="channel_group_type">
<column name="group_type_key" value="experienceGain"/>
</insert>
</changeSet>
</databaseChangeLog>

View File

@@ -11,4 +11,5 @@
<include file="module.xml" relativeToChangelogFile="true"/> <include file="module.xml" relativeToChangelogFile="true"/>
<include file="command.xml" relativeToChangelogFile="true"/> <include file="command.xml" relativeToChangelogFile="true"/>
<include file="experience_job.xml" relativeToChangelogFile="true"/> <include file="experience_job.xml" relativeToChangelogFile="true"/>
<include file="channel_group_types.xml" relativeToChangelogFile="true"/>
</databaseChangeLog> </databaseChangeLog>

View File

@@ -11,6 +11,7 @@ import dev.sheldan.abstracto.experience.model.ServerExperience;
import dev.sheldan.abstracto.experience.model.database.AExperienceLevel; import dev.sheldan.abstracto.experience.model.database.AExperienceLevel;
import dev.sheldan.abstracto.experience.model.database.AExperienceRole; import dev.sheldan.abstracto.experience.model.database.AExperienceRole;
import dev.sheldan.abstracto.experience.model.database.AUserExperience; import dev.sheldan.abstracto.experience.model.database.AUserExperience;
import net.dv8tion.jda.api.entities.MessageChannel;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@@ -22,6 +23,7 @@ import java.util.function.Function;
* user in the guild and retrieving {@link LeaderBoard leaderboard} data. * user in the guild and retrieving {@link LeaderBoard leaderboard} data.
*/ */
public interface AUserExperienceService { public interface AUserExperienceService {
String EXPERIENCE_GAIN_CHANNEL_GROUP_KEY = "experienceGain";
/** /**
* Adds the given {@link AUserInAServer userInAServer} to the list of user who gained experience in the current minute. * Adds the given {@link AUserInAServer userInAServer} to the list of user who gained experience in the current minute.
* Does not add the user to the list of users, if it is already in there. * Does not add the user to the list of users, if it is already in there.
@@ -150,4 +152,9 @@ public interface AUserExperienceService {
* @param results The list of {@link RoleCalculationResult} which should be updated in the database * @param results The list of {@link RoleCalculationResult} which should be updated in the database
*/ */
void syncRolesInStorage(List<RoleCalculationResult> results); void syncRolesInStorage(List<RoleCalculationResult> results);
boolean experienceGainEnabledInChannel(MessageChannel messageChannel);
AUserExperience createUserExperienceForUser(AUserInAServer aUserInAServer, Long experience, Long messageCount);
AUserExperience createUserExperienceForUser(AUserInAServer aUserInAServer, Long experience, Long messageCount, List<AExperienceLevel> levels);
} }