[AB-78] fixing users with previous experience not awarding the experience role if they join and are pending

This commit is contained in:
Sheldan
2022-12-10 15:44:09 +01:00
parent 0461c8e4ec
commit a0d83763d4
7 changed files with 160 additions and 0 deletions

View File

@@ -37,6 +37,10 @@ public class JoiningUserRoleListener implements AsyncJoinListener {
@Override @Override
public DefaultListenerResult execute(MemberJoinModel model) { public DefaultListenerResult execute(MemberJoinModel model) {
if(model.getMember().isPending()) {
log.info("Joining member {} in guild {} is still pending - ignoring for experience role assignment.", model.getJoiningUser().getUserId(), model.getJoiningUser().getServerId());
return DefaultListenerResult.IGNORED;
}
Optional<AUserInAServer> userInAServerOptional = userInServerManagementService.loadUserOptional(model.getServerId(), model.getJoiningUser().getUserId()); Optional<AUserInAServer> userInAServerOptional = userInServerManagementService.loadUserOptional(model.getServerId(), model.getJoiningUser().getUserId());
userInAServerOptional.ifPresent(aUserInAServer -> { userInAServerOptional.ifPresent(aUserInAServer -> {
Optional<AUserExperience> userExperienceOptional = userExperienceManagementService.findByUserInServerIdOptional(aUserInAServer.getUserInServerId()); Optional<AUserExperience> userExperienceOptional = userExperienceManagementService.findByUserInServerIdOptional(aUserInAServer.getUserInServerId());

View File

@@ -0,0 +1,60 @@
package dev.sheldan.abstracto.experience.listener;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
import dev.sheldan.abstracto.core.listener.async.jda.AsyncUpdatePendingListener;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.models.listener.MemberUpdatePendingModel;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.experience.config.ExperienceFeatureDefinition;
import dev.sheldan.abstracto.experience.model.database.AUserExperience;
import dev.sheldan.abstracto.experience.service.AUserExperienceService;
import dev.sheldan.abstracto.experience.service.management.UserExperienceManagementService;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Optional;
/**
* If a {@link Member member} updates the pending status, this {@link AsyncUpdatePendingListener listener} retrieves the previously stored {@link AUserExperience experience} and gives the
* member the necessary {@link net.dv8tion.jda.api.entities.Role role} according to the current configuration, if any
*/
@Component
@Slf4j
public class MemberPendingRoleListener implements AsyncUpdatePendingListener {
@Autowired
private UserExperienceManagementService userExperienceManagementService;
@Autowired
private AUserExperienceService userExperienceService;
@Autowired
private UserInServerManagementService userInServerManagementService;
@Override
public DefaultListenerResult execute(MemberUpdatePendingModel model) {
Optional<AUserInAServer> userInAServerOptional = userInServerManagementService.loadUserOptional(model.getServerId(), model.getUser().getUserId());
userInAServerOptional.ifPresent(aUserInAServer -> {
Optional<AUserExperience> userExperienceOptional = userExperienceManagementService.findByUserInServerIdOptional(aUserInAServer.getUserInServerId());
if(userExperienceOptional.isPresent()) {
log.info("User {} updated pending status {} with previous experience. Setting up experience role again (if necessary).", model.getUser().getUserId(), model.getServerId());
userExperienceService.syncForSingleUser(userExperienceOptional.get(), model.getMember()).thenAccept(result ->
log.info("Finished re-assigning experience for update pending user {} in server {}.", model.getUser().getUserId(), model.getServerId())
);
} else {
log.info("Member updating pending {} in server {} does not have any previous experience. Not setting up anything.", model.getUser().getUserId(), model.getServerId());
}
});
return DefaultListenerResult.PROCESSED;
}
@Override
public FeatureDefinition getFeature() {
return ExperienceFeatureDefinition.EXPERIENCE;
}
}

View File

@@ -75,9 +75,18 @@ public class JoiningUserRoleListenerTest {
@Test @Test
public void testUserWithOutExperienceRejoining() { public void testUserWithOutExperienceRejoining() {
when(model.getMember()).thenReturn(member);
when(userExperienceManagementService.findByUserInServerIdOptional(USER_IN_SERVER_ID)).thenReturn(Optional.empty()); when(userExperienceManagementService.findByUserInServerIdOptional(USER_IN_SERVER_ID)).thenReturn(Optional.empty());
testUnit.execute(model); testUnit.execute(model);
verify(userExperienceService, times(0)).syncForSingleUser(any(), any()); verify(userExperienceService, times(0)).syncForSingleUser(any(), any());
} }
@Test
public void testPendingUserJoining() {
when(member.isPending()).thenReturn(true);
when(model.getMember()).thenReturn(member);
testUnit.execute(model);
verify(userExperienceService, times(0)).syncForSingleUser(any(), any());
}
} }

View File

@@ -22,6 +22,11 @@ public class ListenerExecutorConfig {
return executorService.setupExecutorFor("joinListener"); return executorService.setupExecutorFor("joinListener");
} }
@Bean(name = "memberPendingUpdateExecutor")
public TaskExecutor memberPendingUpdateExecutor() {
return executorService.setupExecutorFor("memberPendingUpdateListener");
}
@Bean(name = "leaveListenerExecutor") @Bean(name = "leaveListenerExecutor")
public TaskExecutor leaveListenerExecutor() { public TaskExecutor leaveListenerExecutor() {
return executorService.setupExecutorFor("leaveListener"); return executorService.setupExecutorFor("leaveListener");

View File

@@ -0,0 +1,53 @@
package dev.sheldan.abstracto.core.listener.async.jda;
import dev.sheldan.abstracto.core.listener.ListenerService;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.models.listener.MemberUpdatePendingModel;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdatePendingEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Nonnull;
import java.util.List;
@Component
@Slf4j
public class AsyncMemberPendingUpdateListenerBean extends ListenerAdapter {
@Autowired(required = false)
private List<AsyncUpdatePendingListener> listenerList;
@Autowired
@Qualifier("memberPendingUpdateExecutor")
private TaskExecutor memberPendingUpdateListenerExecutor;
@Autowired
private ListenerService listenerService;
@Override
@Transactional
public void onGuildMemberUpdatePending(@Nonnull GuildMemberUpdatePendingEvent event) {
if(listenerList == null) return;
MemberUpdatePendingModel model = getModel(event);
listenerList.forEach(joinListener -> listenerService.executeFeatureAwareListener(joinListener, model, memberPendingUpdateListenerExecutor));
}
private MemberUpdatePendingModel getModel(GuildMemberUpdatePendingEvent event) {
ServerUser serverUser = ServerUser
.builder()
.serverId(event.getGuild().getIdLong())
.userId(event.getUser().getIdLong())
.isBot(event.getUser().isBot())
.build();
return MemberUpdatePendingModel
.builder()
.user(serverUser)
.member(event.getMember())
.build();
}
}

View File

@@ -0,0 +1,8 @@
package dev.sheldan.abstracto.core.listener.async.jda;
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
import dev.sheldan.abstracto.core.listener.FeatureAwareListener;
import dev.sheldan.abstracto.core.models.listener.MemberUpdatePendingModel;
public interface AsyncUpdatePendingListener extends FeatureAwareListener<MemberUpdatePendingModel, DefaultListenerResult> {
}

View File

@@ -0,0 +1,21 @@
package dev.sheldan.abstracto.core.models.listener;
import dev.sheldan.abstracto.core.listener.FeatureAwareListenerModel;
import dev.sheldan.abstracto.core.models.ServerUser;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import net.dv8tion.jda.api.entities.Member;
@Getter
@Setter
@Builder
public class MemberUpdatePendingModel implements FeatureAwareListenerModel {
private ServerUser user;
private Member member;
@Override
public Long getServerId() {
return user.getServerId();
}
}