mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-01-26 13:46:19 +00:00
[AB-78] fixing users with previous experience not awarding the experience role if they join and are pending
This commit is contained in:
@@ -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());
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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> {
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user