[AB-137] fixing occurrences for templates in cases entities do not exist anymore

fixing feature mode retrieval to adapt to lowercase
fixing disable exp role creation and retrieval
removing ansible code
This commit is contained in:
Sheldan
2021-03-09 21:33:51 +01:00
parent d0c06538e3
commit e780b0e75c
29 changed files with 200 additions and 909 deletions

View File

@@ -19,6 +19,7 @@ import dev.sheldan.abstracto.experience.models.database.ADisabledExpRole;
import dev.sheldan.abstracto.experience.models.templates.DisabledExperienceRolesModel;
import dev.sheldan.abstracto.experience.service.management.DisabledExpRoleManagementService;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.Role;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -51,10 +52,14 @@ public class ListDisabledExperienceRoles extends AbstractConditionableCommand {
List<ADisabledExpRole> disabledRolesForServer = disabledExpRoleManagementService.getDisabledRolesForServer(server);
DisabledExperienceRolesModel disabledExperienceRolesModel = (DisabledExperienceRolesModel) ContextConverter.fromCommandContext(commandContext, DisabledExperienceRolesModel.class);
disabledRolesForServer.forEach(aDisabledExpRole -> {
Role jdaRole = null;
if(!aDisabledExpRole.getRole().getDeleted()) {
jdaRole = roleService.getRoleFromGuild(aDisabledExpRole.getRole());
}
FullRole role = FullRole
.builder()
.role(aDisabledExpRole.getRole())
.serverRole(roleService.getRoleFromGuild(aDisabledExpRole.getRole()))
.serverRole(jdaRole)
.build();
disabledExperienceRolesModel.getRoles().add(role);
});

View File

@@ -4,11 +4,14 @@ import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.MemberService;
import dev.sheldan.abstracto.experience.models.LeaderBoard;
import dev.sheldan.abstracto.experience.models.LeaderBoardEntry;
import dev.sheldan.abstracto.experience.models.database.AUserExperience;
import dev.sheldan.abstracto.experience.models.templates.LeaderBoardEntryModel;
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 org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
@@ -24,6 +27,12 @@ public class LeaderBoardModelConverter {
@Autowired
private MemberService memberService;
@Autowired
private UserExperienceManagementService userExperienceManagementService;
@Autowired
private LeaderBoardModelConverter self;
/**
* Converts the complete {@link LeaderBoard leaderBoard} into a list of {@link LeaderBoardEntryModel leaderbaordEntryModels} which contain additional
* information available for rendering the leader board ({@link Member member} reference and more)
@@ -50,13 +59,21 @@ public class LeaderBoardModelConverter {
*/
public CompletableFuture<LeaderBoardEntryModel> fromLeaderBoardEntry(LeaderBoardEntry leaderBoardEntry) {
AUserInAServer entryUser = leaderBoardEntry.getExperience().getUser();
return memberService.getMemberInServerAsync(entryUser.getServerReference().getId(), entryUser.getUserReference().getId()).thenApply(member ->
LeaderBoardEntryModel
.builder()
.experience(leaderBoardEntry.getExperience())
.member(member).rank(leaderBoardEntry.getRank())
.rank(leaderBoardEntry.getRank())
.build()
);
Long userInServerId = leaderBoardEntry.getExperience().getUser().getUserInServerId();
Integer rank = leaderBoardEntry.getRank();
return memberService.getMemberInServerAsync(entryUser.getServerReference().getId(), entryUser.getUserReference().getId())
.thenApply(member -> self.buildLeaderBoardModel(userInServerId, member, rank))
.exceptionally(throwable -> self.buildLeaderBoardModel(userInServerId, null, rank));
}
@Transactional
public LeaderBoardEntryModel buildLeaderBoardModel(Long userInServerId, Member member, Integer rank) {
AUserExperience experience = userExperienceManagementService.findByUserInServerId(userInServerId);
return LeaderBoardEntryModel
.builder()
.experience(experience)
.member(member)
.rank(rank)
.build();
}
}

View File

@@ -21,6 +21,7 @@ public class DisabledExpRoleManagementServiceBean implements DisabledExpRoleMana
public ADisabledExpRole setRoleToBeDisabledForExp(ARole role) {
ADisabledExpRole newRole = ADisabledExpRole
.builder()
.id(role.getId())
.role(role)
.build();
log.info("Adding disabled exp role {} for server {}.", role.getId(), role.getServer().getId());
@@ -39,7 +40,7 @@ public class DisabledExpRoleManagementServiceBean implements DisabledExpRoleMana
@Override
public boolean isExperienceDisabledForRole(ARole role) {
return disabledExpRoleRepository.existsByRole(role);
return disabledExpRoleRepository.existsById(role.getId());
}

View File

@@ -44,10 +44,12 @@ public class ListDisabledExperienceRolesTest {
@Mock
private ServerManagementService serverManagementService;
@Mock
private AServer server;
@Test
public void testCommandExecutionNoRolesFound() {
CommandContext context = CommandTestUtilities.getNoParameters();
AServer server = Mockito.mock(AServer.class);
when(serverManagementService.loadServer(context.getGuild())).thenReturn(server);
when(disabledExpRoleManagementService.getDisabledRolesForServer(server)).thenReturn(new ArrayList<>());
when(channelService.sendEmbedTemplateInTextChannelList(eq("list_disabled_experience_roles"),
@@ -60,14 +62,20 @@ public class ListDisabledExperienceRolesTest {
@Test
public void testCommandExecutionRolesFound() {
CommandContext context = CommandTestUtilities.getNoParameters();
AServer server = Mockito.mock(AServer.class);
ADisabledExpRole disabledExpRole1 = Mockito.mock(ADisabledExpRole.class);
ADisabledExpRole disabledExpRole2 = Mockito.mock(ADisabledExpRole.class);
when(disabledExpRoleManagementService.getDisabledRolesForServer(server)).thenReturn(Arrays.asList(disabledExpRole1, disabledExpRole2));
Role role1 = Mockito.mock(Role.class);
Role role2 = Mockito.mock(Role.class);
when(roleService.getRoleFromGuild(disabledExpRole1.getRole())).thenReturn(role1);
when(roleService.getRoleFromGuild(disabledExpRole2.getRole())).thenReturn(role2);
ARole aRole = Mockito.mock(ARole.class);
ARole aRole2 = Mockito.mock(ARole.class);
when(roleService.getRoleFromGuild(aRole)).thenReturn(role1);
when(roleService.getRoleFromGuild(aRole2)).thenReturn(role2);
when(aRole.getDeleted()).thenReturn(false);
when(aRole2.getDeleted()).thenReturn(false);
when(disabledExpRole1.getRole()).thenReturn(aRole);
when(disabledExpRole2.getRole()).thenReturn(aRole2);
when(serverManagementService.loadServer(context.getGuild())).thenReturn(server);
when(channelService.sendEmbedTemplateInTextChannelList(eq("list_disabled_experience_roles"),
any(DisabledExperienceRolesModel.class), eq(context.getChannel()))).thenReturn(CommandTestUtilities.messageFutureList());

View File

@@ -9,7 +9,6 @@ import dev.sheldan.abstracto.experience.models.LeaderBoardEntry;
import dev.sheldan.abstracto.experience.models.database.AUserExperience;
import dev.sheldan.abstracto.experience.models.templates.LeaderBoardEntryModel;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.User;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -33,58 +32,60 @@ public class LeaderBoardModelConverterTest {
@Mock
private MemberService memberService;
@Mock
private LeaderBoardModelConverter self;
private static final Long SERVER_ID = 4L;
private static final Long USER_ID = 5L;
private static final Long USER_ID_2 = 6L;
private static final Long USER_IN_SERVER_ID = 7L;
private static final Long USER_IN_SERVER_ID_2 = 8L;
@Test
public void testFromLeaderBoard() {
Integer firstRank = 1;
Long firstExperience = 1L;
LeaderBoardEntry entry = getEntry(firstExperience, firstRank, USER_ID);
LeaderBoardEntry entry = getEntry(firstRank, USER_ID, USER_IN_SERVER_ID);
Integer secondRank = 2;
Long secondExperience = 2L;
LeaderBoardEntry entry2 = getEntry(secondExperience, secondRank, USER_ID_2);
LeaderBoardEntryModel firstEntryModel = Mockito.mock(LeaderBoardEntryModel.class);
LeaderBoardEntryModel secondEntryModel = Mockito.mock(LeaderBoardEntryModel.class);
LeaderBoardEntry entry2 = getEntry(secondRank, USER_ID_2, USER_IN_SERVER_ID_2);
List<LeaderBoardEntry> entries = Arrays.asList(entry, entry2);
LeaderBoard leaderBoard = Mockito.mock(LeaderBoard.class);
when(leaderBoard.getEntries()).thenReturn(entries);
Member member = Mockito.mock(Member.class);
when(memberService.getMemberInServerAsync(SERVER_ID, USER_ID)).thenReturn(CompletableFuture.completedFuture(member));
when(memberService.getMemberInServerAsync(SERVER_ID, USER_ID_2)).thenReturn(CompletableFuture.completedFuture(member));
when(self.buildLeaderBoardModel(USER_IN_SERVER_ID, member, firstRank)).thenReturn(firstEntryModel);
when(self.buildLeaderBoardModel(USER_IN_SERVER_ID_2, member, secondRank)).thenReturn(secondEntryModel);
List<CompletableFuture<LeaderBoardEntryModel>> leaderBoardEntryModels = testUnit.fromLeaderBoard(leaderBoard);
LeaderBoardEntryModel firstEntry = leaderBoardEntryModels.get(0).join();
Assert.assertEquals(firstRank, firstEntry.getRank());
Assert.assertEquals(firstExperience, firstEntry.getExperience().getExperience());
Assert.assertEquals(firstEntryModel, firstEntry);
LeaderBoardEntryModel secondEntry = leaderBoardEntryModels.get(1).join();
Assert.assertEquals(secondRank, secondEntry.getRank());
Assert.assertEquals(secondExperience, secondEntry.getExperience().getExperience());
Assert.assertEquals(secondEntryModel, secondEntry);
Assert.assertEquals(entries.size(), leaderBoardEntryModels.size());
}
@Test
public void testFromEntry() {
Integer rank = 2;
LeaderBoardEntry entry = getEntry(1L, rank, USER_ID);
LeaderBoardEntry entry = getEntry(rank, USER_ID, USER_IN_SERVER_ID);
Member member = Mockito.mock(Member.class);
User user = Mockito.mock(User.class);
when(user.getIdLong()).thenReturn(USER_ID);
when(member.getUser()).thenReturn(user);
LeaderBoardEntryModel entryModelMock = Mockito.mock(LeaderBoardEntryModel.class);
when(memberService.getMemberInServerAsync(SERVER_ID, USER_ID)).thenReturn(CompletableFuture.completedFuture(member));
when(self.buildLeaderBoardModel(USER_IN_SERVER_ID, member, rank)).thenReturn(entryModelMock);
CompletableFuture<LeaderBoardEntryModel> leaderBoardEntryModel = testUnit.fromLeaderBoardEntry(entry);
LeaderBoardEntryModel entryModel = leaderBoardEntryModel.join();
Assert.assertEquals(rank, entryModel.getRank());
Assert.assertEquals(USER_ID, entryModel.getExperience().getUser().getUserReference().getId());
Assert.assertEquals(USER_ID.longValue(), entryModel.getMember().getUser().getIdLong());
Assert.assertEquals(entryModelMock, entryModel);
}
private LeaderBoardEntry getEntry(Long experienceCount, Integer rank, Long userId) {
private LeaderBoardEntry getEntry(Integer rank, Long userId, Long userInServerId) {
AUserExperience experience = Mockito.mock(AUserExperience.class);
when(experience.getExperience()).thenReturn(experienceCount);
AUserInAServer userInAServer = Mockito.mock(AUserInAServer.class);
when(experience.getUser()).thenReturn(userInAServer);
AUser user = Mockito.mock(AUser.class);
when(userInAServer.getUserReference()).thenReturn(user);
when(userInAServer.getUserInServerId()).thenReturn(userInServerId);
when(user.getId()).thenReturn(userId);
AServer server = Mockito.mock(AServer.class);
when(server.getId()).thenReturn(SERVER_ID);

View File

@@ -39,10 +39,12 @@ public class DisabledExpRoleManagementServiceBeanTest {
@Test
public void testIfRoleIsDisabled() {
ARole aRole = Mockito.mock(ARole.class);
when(disabledExpRoleRepository.existsByRole(aRole)).thenReturn(true);
Long roleId = 1L;
when(aRole.getId()).thenReturn(roleId);
when(disabledExpRoleRepository.existsById(roleId)).thenReturn(true);
boolean experienceDisabledForRole = testUnit.isExperienceDisabledForRole(aRole);
Assert.assertTrue(experienceDisabledForRole);
verify(disabledExpRoleRepository, times(1)).existsByRole(aRole);
verify(disabledExpRoleRepository, times(1)).existsById(roleId);
}
@Test

View File

@@ -55,7 +55,8 @@ public class UserNotesConverter {
public List<NoteEntryModel> loadFullNotes(Map<ServerSpecificId, CompletableFuture<Member>> futureHashMap) {
List<NoteEntryModel> entryModels = new ArrayList<>();
futureHashMap.keySet().forEach(serverSpecificId -> {
Member member = futureHashMap.get(serverSpecificId).join();
CompletableFuture<Member> memberFuture = futureHashMap.get(serverSpecificId);
Member member = !memberFuture.isCompletedExceptionally() ? memberFuture.join() : null;
UserNote note = userNoteManagementService.loadNote(serverSpecificId.getServerId(), serverSpecificId.getId());
FullUserInServer fullUser = FullUserInServer
.builder()

View File

@@ -57,25 +57,26 @@ public class WarnEntryConverter {
public List<WarnEntry> loadFullWarnEntries(Map<ServerSpecificId, FutureMemberPair> loadedWarnInfo) {
List<WarnEntry> entries = new ArrayList<>();
loadedWarnInfo.keySet().forEach(warning -> {
Warning warn = warnManagementService.findById(warning.getId(), warning.getServerId());
FutureMemberPair memberPair = loadedWarnInfo.get(warning);
Member warnedMember = memberPair.getSecondMember().join();
Member warnedMember = !memberPair.getSecondMember().isCompletedExceptionally() ? memberPair.getSecondMember().join() : null;
FullUserInServer warnedUser = FullUserInServer
.builder()
.member(warnedMember)
.aUserInAServer(userInServerManagementService.loadOrCreateUser(warnedMember))
.aUserInAServer(warn.getWarnedUser())
.build();
Member warningMember = memberPair.getFirstMember().join();
Member warningMember = !memberPair.getFirstMember().isCompletedExceptionally() ? memberPair.getFirstMember().join() : null;
FullUserInServer warningUser = FullUserInServer
.builder()
.member(warningMember)
.aUserInAServer(userInServerManagementService.loadOrCreateUser(warningMember))
.aUserInAServer(warn.getWarningUser())
.build();
WarnEntry entry = WarnEntry
.builder()
.warnedUser(warnedUser)
.warningUser(warningUser)
.warning(warnManagementService.findById(warning.getId(), warning.getServerId()))
.warning(warn)
.build();
entries.add(entry);
});

View File

@@ -339,11 +339,13 @@ public class MuteServiceBean implements MuteService {
public CompletableFuture<Void> sendUnmuteLog(Long muteId, Guild guild, CompletableFuture<Member> mutingMemberFuture, CompletableFuture<Member> mutedMemberFuture) {
Mute mute = muteManagementService.findMute(muteId, guild.getIdLong());
AServer mutingServer = serverManagementService.loadServer(guild.getIdLong());
Member mutingMember = !mutingMemberFuture.isCompletedExceptionally() ? mutingMemberFuture.join() : null;
Member mutedMember = !mutedMemberFuture.isCompletedExceptionally() ? mutedMemberFuture.join() : null;
UnMuteLog unMuteLog = UnMuteLog
.builder()
.mute(mute)
.mutingUser(mutingMemberFuture.join())
.unMutedUser(mutedMemberFuture.join())
.mutingUser(mutingMember)
.unMutedUser(mutedMember)
.guild(guild)
.build();
CompletableFuture<Void> notificationFuture = sendUnMuteLogMessage(unMuteLog, mutingServer);

View File

@@ -2,6 +2,7 @@ package dev.sheldan.abstracto.moderation.service;
import dev.sheldan.abstracto.core.models.FutureMemberPair;
import dev.sheldan.abstracto.core.models.ServerSpecificId;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.*;
@@ -187,14 +188,25 @@ public class WarnServiceBean implements WarnService {
warningsToDecay.forEach(warning -> {
CompletableFuture<Member> warningMember = memberService.getMemberInServerAsync(warning.getWarningUser());
CompletableFuture<Member> warnedMember = memberService.getMemberInServerAsync(warning.getWarnedUser());
FutureMemberPair futurePair = FutureMemberPair.builder().firstMember(warningMember).secondMember(warnedMember).build();
FutureMemberPair futurePair = FutureMemberPair
.builder()
.firstMember(warningMember)
.secondMember(warnedMember)
.firstUser(ServerUser.fromAUserInAServer(warning.getWarningUser()))
.secondUser(ServerUser.fromAUserInAServer(warning.getWarnedUser()))
.build();
warningMembers.put(warning.getWarnId(), futurePair);
allFutures.add(warningMember);
allFutures.add(warnedMember);
});
CompletableFuture<Void> sendingFuture = new CompletableFuture<>();
FutureUtils.toSingleFutureGeneric(allFutures).handle((aVoid, throwable) -> {
self.renderAndSendWarnDecayLogs(serverId, warningMembers).thenAccept(aVoid1 ->
sendingFuture.complete(null)
);
).exceptionally(throwable1 -> {
sendingFuture.completeExceptionally(throwable1);
return null;
});
return null;
});
@@ -207,16 +219,23 @@ public class WarnServiceBean implements WarnService {
AServer server = serverManagementService.loadServer(serverId);
List<WarnDecayWarning> warnDecayWarnings = new ArrayList<>();
warningMembers.keySet().forEach(serverSpecificId -> {
Warning warning = warnManagementService.findById(serverSpecificId.getId(), serverSpecificId.getServerId());
FutureMemberPair pair = warningMembers.get(serverSpecificId);
// TODO add ids to render in case any member left the server
WarnDecayWarning warnDecayWarning = WarnDecayWarning
.builder()
.warningMember(pair.getFirstMember().join())
.warnedMember(pair.getSecondMember().join())
.warning(warning)
.build();
warnDecayWarnings.add(warnDecayWarning);
try {
Warning warning = warnManagementService.findById(serverSpecificId.getId(), serverSpecificId.getServerId());
FutureMemberPair pair = warningMembers.get(serverSpecificId);
Member warningMember = !pair.getFirstMember().isCompletedExceptionally() ? pair.getFirstMember().join() : null;
Member warnedMember = !pair.getSecondMember().isCompletedExceptionally() ? pair.getSecondMember().join() : null;
WarnDecayWarning warnDecayWarning = WarnDecayWarning
.builder()
.warningMember(warningMember)
.warningUser(pair.getFirstUser())
.warnedMember(warnedMember)
.warnedUser(pair.getSecondUser())
.warning(warning)
.build();
warnDecayWarnings.add(warnDecayWarning);
} catch (Exception ex) {
log.error("exception.", ex);
}
});
WarnDecayLogModel warnDecayLogModel = WarnDecayLogModel
.builder()

View File

@@ -85,8 +85,12 @@ public class WarnEntryConverterTest {
Warning warning2 = Mockito.mock(Warning.class);
ServerSpecificId firstWarnId = new ServerSpecificId(SERVER_ID, WARN_ID_1);
when(warning1.getWarnId()).thenReturn(firstWarnId);
when(warning1.getWarningUser()).thenReturn(warningUser);
when(warning1.getWarnedUser()).thenReturn(warnedUser);
ServerSpecificId secondWarnId = new ServerSpecificId(SERVER_ID, WARN_ID_2);
when(warning2.getWarnId()).thenReturn(secondWarnId);
when(warning2.getWarningUser()).thenReturn(warningUser);
when(warning2.getWarnedUser()).thenReturn(warnedUser);
HashMap<ServerSpecificId, FutureMemberPair> map = new HashMap<>();
FutureMemberPair memberPair = Mockito.mock(FutureMemberPair.class);
when(memberPair.getFirstMember()).thenReturn(CompletableFuture.completedFuture(warningMember));
@@ -95,8 +99,6 @@ public class WarnEntryConverterTest {
map.put(secondWarnId, memberPair);
when(warnManagementService.findById(WARN_ID_1, SERVER_ID)).thenReturn(warning1);
when(warnManagementService.findById(WARN_ID_2, SERVER_ID)).thenReturn(warning2);
when(userInServerManagementService.loadOrCreateUser(warnedMember)).thenReturn(warnedUser);
when(userInServerManagementService.loadOrCreateUser(warningMember)).thenReturn(warningUser);
List<WarnEntry> models = testUnit.loadFullWarnEntries(map);
Assert.assertEquals(2, models.size());
WarnEntry firstEntry = models.get(0);

View File

@@ -2,6 +2,7 @@ package dev.sheldan.abstracto.moderation.service;
import dev.sheldan.abstracto.core.models.ServerSpecificId;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.models.property.SystemConfigProperty;
import dev.sheldan.abstracto.core.service.*;
@@ -103,6 +104,15 @@ public class WarnServiceBeanTest {
@Mock
private AUserInAServer secondWarnedUser;
@Mock
private AUser firstAUser;
@Mock
private AUser secondAUser;
@Mock
private AUser thirdAUser;
@Mock
private Warning firstWarning;
@@ -225,9 +235,15 @@ public class WarnServiceBeanTest {
private void setupWarnings() {
when(firstWarning.getWarningUser()).thenReturn(warningUser);
when(secondWarning.getWarningUser()).thenReturn(warningUser);
when(warningUser.getServerReference()).thenReturn(server);
when(warningUser.getUserReference()).thenReturn(thirdAUser);
when(firstWarning.getWarnedUser()).thenReturn(firstWarnedUser);
when(firstWarnedUser.getServerReference()).thenReturn(server);
when(firstWarnedUser.getUserReference()).thenReturn(firstAUser);
when(secondWarning.getWarnedUser()).thenReturn(secondWarnedUser);
when(secondWarnedUser.getServerReference()).thenReturn(server);
when(secondWarnedUser.getUserReference()).thenReturn(secondAUser);
when(firstWarning.getWarnId()).thenReturn(new ServerSpecificId(SERVER_ID, WARN_ID));
when(secondWarning.getWarnId()).thenReturn(new ServerSpecificId(SERVER_ID, 9L));
when(server.getId()).thenReturn(SERVER_ID);

View File

@@ -1,5 +1,6 @@
package dev.sheldan.abstracto.moderation.models.template.job;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.moderation.models.database.Warning;
import lombok.Builder;
import lombok.Getter;
@@ -26,4 +27,14 @@ public class WarnDecayWarning {
* The user which casted the warn, is null if the user left the server
*/
private Member warningMember;
/**
* The {@link ServerUser serverUser} which was warned, can be used in case the {@link Member warningMember} is null
*/
private ServerUser warningUser;
/**
* The {@link ServerUser serverUser} who cast the warn, can be used in case the {@link Member warnedMember} is null
*/
private ServerUser warnedUser;
}

View File

@@ -1,13 +1,14 @@
package dev.sheldan.abstracto.utility.repository.converter;
import dev.sheldan.abstracto.core.models.database.AUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.MemberService;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.core.service.management.UserManagementService;
import dev.sheldan.abstracto.utility.models.template.commands.starboard.StarStatsUser;
import dev.sheldan.abstracto.utility.repository.StarStatsGuildUserResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
@@ -22,6 +23,12 @@ public class StarStatsUserConverter {
@Autowired
private UserInServerManagementService userInServerManagementService;
@Autowired
private UserManagementService userManagementService;
@Autowired
private StarStatsUserConverter self;
public List<CompletableFuture<StarStatsUser>> convertToStarStatsUser(List<StarStatsGuildUserResult> users, Long serverId) {
List<CompletableFuture<StarStatsUser>> result = new ArrayList<>();
users.forEach(starStatsUserResult ->
@@ -32,14 +39,18 @@ public class StarStatsUserConverter {
private CompletableFuture<StarStatsUser> createStarStatsUser(Long serverId, StarStatsGuildUserResult starStatsGuildUserResult) {
AUserInAServer aUserInAServer = userInServerManagementService.loadOrCreateUser(starStatsGuildUserResult.getUserId());
return memberService.getMemberInServerAsync(serverId, aUserInAServer.getUserReference().getId()).thenApply(member ->
StarStatsUser
.builder()
.starCount(starStatsGuildUserResult.getStarCount())
.member(member)
// TODO properly load this instance instead of just building one
.user(AUser.builder().id(starStatsGuildUserResult.getUserId()).build())
.build()
);
return memberService.getMemberInServerAsync(serverId, aUserInAServer.getUserReference().getId())
.thenApply(member -> self.loadStarStatsUser(starStatsGuildUserResult, member))
.exceptionally(throwable -> self.loadStarStatsUser(starStatsGuildUserResult, null));
}
@Transactional
public StarStatsUser loadStarStatsUser(StarStatsGuildUserResult starStatsGuildUserResult, net.dv8tion.jda.api.entities.Member member) {
return StarStatsUser
.builder()
.starCount(starStatsGuildUserResult.getStarCount())
.member(member)
.user(userInServerManagementService.loadOrCreateUser(starStatsGuildUserResult.getUserId()))
.build();
}
}

View File

@@ -10,6 +10,7 @@ import net.dv8tion.jda.api.entities.Member;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
@@ -33,13 +34,14 @@ public class StarStatsUserConverterTest {
@Mock
private UserInServerManagementService userInServerManagementService;
@Mock
private StarStatsUserConverter self;
@Test
public void testConversionOfMultipleItems() {
Long serverId = 5L;
Long firstUserId = 5L;
Integer firstStarCount = 5;
Long secondUserId = 9L;
Integer secondStarCount = 10;
List<StarStatsGuildUserResult> results = new ArrayList<>();
StarStatsGuildUserResult firstResult = Mockito.mock(StarStatsGuildUserResult.class);
Member firstMember = Mockito.mock(Member.class);
@@ -50,7 +52,6 @@ public class StarStatsUserConverterTest {
when(userInServerManagementService.loadOrCreateUser(firstUserId)).thenReturn(firstUser);
when(memberService.getMemberInServerAsync(serverId, firstUserId)).thenReturn(CompletableFuture.completedFuture(firstMember));
when(firstResult.getUserId()).thenReturn(firstUserId);
when(firstResult.getStarCount()).thenReturn(firstStarCount);
results.add(firstResult);
StarStatsGuildUserResult secondResult = Mockito.mock(StarStatsGuildUserResult.class);
Member secondMember = Mockito.mock(Member.class);
@@ -62,19 +63,20 @@ public class StarStatsUserConverterTest {
when(memberService.getMemberInServerAsync(serverId, secondUserId)).thenReturn(CompletableFuture.completedFuture(secondMember));
when(secondResult.getUserId()).thenReturn(secondUserId);
when(secondResult.getStarCount()).thenReturn(secondStarCount);
results.add(secondResult);
List<CompletableFuture<StarStatsUser>> starStatsUsers = testUnit.convertToStarStatsUser(results, serverId);
StarStatsUser firstConverted = starStatsUsers.get(0).join();
Assert.assertEquals(firstStarCount, firstConverted.getStarCount());
Assert.assertEquals(firstMember, firstConverted.getMember());
Assert.assertEquals(firstUserId, firstConverted.getUser().getId());
StarStatsUser secondConverted = starStatsUsers.get(1).join();
Assert.assertEquals(secondStarCount, secondConverted.getStarCount());
Assert.assertEquals(secondMember, secondConverted.getMember());
Assert.assertEquals(secondUserId, secondConverted.getUser().getId());
Assert.assertEquals(2, starStatsUsers.size());
testUnit.convertToStarStatsUser(results, serverId);
ArgumentCaptor<StarStatsGuildUserResult> resultArgumentCaptor = ArgumentCaptor.forClass(StarStatsGuildUserResult.class);
ArgumentCaptor<Member> memberArgumentCaptor = ArgumentCaptor.forClass(Member.class);
verify(self, times(2)).loadStarStatsUser(resultArgumentCaptor.capture(), memberArgumentCaptor.capture());
List<StarStatsGuildUserResult> resultCaptorValues = resultArgumentCaptor.getAllValues();
Assert.assertEquals(2, resultCaptorValues.size());
Assert.assertEquals(firstResult, resultCaptorValues.get(0));
Assert.assertEquals(secondResult, resultCaptorValues.get(1));
List<Member> memberCaptorValues = memberArgumentCaptor.getAllValues();
Assert.assertEquals(2, memberCaptorValues.size());
Assert.assertEquals(firstMember, memberCaptorValues.get(0));
Assert.assertEquals(secondMember, memberCaptorValues.get(1));
}
@Test

View File

@@ -1,6 +1,6 @@
package dev.sheldan.abstracto.utility.models.template.commands.starboard;
import dev.sheldan.abstracto.core.models.database.AUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@@ -11,7 +11,7 @@ import net.dv8tion.jda.api.entities.Member;
@Setter
@Builder
public class StarStatsUser {
private AUser user;
private AUserInAServer user;
private Member member;
private Integer starCount;

View File

@@ -59,14 +59,12 @@ public class ListChannelGroups extends AbstractConditionableCommand {
List<ChannelGroupChannelModel> convertedChannels = new ArrayList<>();
group.getChannels().forEach(channel -> {
Optional<TextChannel> textChannelInGuild = channelService.getTextChannelFromServerOptional(channel.getServer().getId(), channel.getId());
if(textChannelInGuild.isPresent()) {
ChannelGroupChannelModel convertedChannel = ChannelGroupChannelModel
.builder()
.channel(channel)
.discordChannel(textChannelInGuild.get())
.build();
convertedChannels.add(convertedChannel);
}
ChannelGroupChannelModel convertedChannel = ChannelGroupChannelModel
.builder()
.channel(channel)
.discordChannel(textChannelInGuild.orElse(null))
.build();
convertedChannels.add(convertedChannel);
});
ChannelGroupModel channelGroup = ChannelGroupModel
.builder()

View File

@@ -41,11 +41,11 @@ public class DefaultFeatureModeManagementBean implements DefaultFeatureModeManag
public Optional<FeatureModeProperty> getFeatureModeOptional(AFeature feature, String mode) {
return Optional.ofNullable(defaultConfigProperties
.getFeatureModes()
.get(mode));
.get(mode.toLowerCase()));
}
@Override
public FeatureModeProperty getFeatureMode(AFeature feature, String mode) {
return getFeatureModeOptional(feature, mode).orElseThrow(() -> new FeatureModeNotFoundException(mode, featureConfigService.getFeatureModesFromFeatureAsString(feature.getKey())));
return getFeatureModeOptional(feature, mode.toLowerCase()).orElseThrow(() -> new FeatureModeNotFoundException(mode, featureConfigService.getFeatureModesFromFeatureAsString(feature.getKey())));
}
}

View File

@@ -14,4 +14,6 @@ import java.util.concurrent.CompletableFuture;
public class FutureMemberPair {
private CompletableFuture<Member> firstMember;
private CompletableFuture<Member> secondMember;
private ServerUser firstUser;
private ServerUser secondUser;
}

View File

@@ -1,5 +1,6 @@
package dev.sheldan.abstracto.core.models;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
@@ -12,4 +13,11 @@ import lombok.Setter;
public class ServerUser {
private Long serverId;
private Long userId;
public static ServerUser fromAUserInAServer(AUserInAServer aUserInAServer) {
return ServerUser
.builder()
.serverId(aUserInAServer.getServerReference().getId())
.userId(aUserInAServer.getUserReference().getId()).build();
}
}

View File

@@ -23,7 +23,7 @@ Showing the leader board of the server::
* Usage: `leaderboard [page]`
* Description: Shows the leader board of the server in a paginated format. This does not use the interactive pagination.
If no parameter is provided, it will show the top 10 members and their message count, level, experience and rank.
Additionally the same information for the user executing is shown, regardless whether or not the user is already shown on the given leader board page.
Additionally, the same information for the user executing is shown, regardless whether or not the user is already shown on the given leader board page.
If a `page` is provided, it will display the leader board of the ranks `page * 10` until `(page + 1) * 10` instead. If `page` is beyond the member count, the last members are shown.

View File

@@ -1 +0,0 @@
ansible_python_interpreter: /usr/bin/python3

View File

@@ -1,8 +0,0 @@
---
- hosts: localhost
connection: local
gather_facts: no
roles:
- role: database

View File

@@ -1,10 +0,0 @@
---
- include_tasks: deploy_template_artifact.yaml
name: Deploying translations
vars:
group_id: "{{ artifact.group_id }}"
version: "{{ artifact.version }}"
with_items: "{{ artifact.modules }}"
loop_control:
loop_var: module

View File

@@ -1,46 +0,0 @@
---
- name: Prepare target directoy
delegate_to: localhost
file:
path: "{{ installer_base_dir }}/liquibase/{{ artifact.group_id }}/{{ artifact.module }}"
state: directory
mode: '0755'
- name: "Download liquibase artifact {{ artifact.module }} in {{ artifact.group_id }}"
delegate_to: localhost
maven_artifact:
group_id: "{{ artifact.group_id }}"
artifact_id: "{{ artifact.module }}"
dest: "{{ installer_base_dir }}/liquibase/{{ artifact.group_id }}-{{ artifact.module }}.zip"
extension: zip
version: "{{ artifact.version }}"
repository_url: "file://{{ lookup('env','HOME') }}/.m2/repository"
classifier: liquibase
- name: Extract artifact zip
delegate_to: localhost
unarchive:
src: "{{ installer_base_dir }}/liquibase/{{ artifact.group_id }}-{{ artifact.module }}.zip"
dest: "{{ installer_base_dir }}/liquibase/{{ artifact.group_id }}/{{ artifact.module }}"
- name: Render liquibase.properties template
template:
src: liquibase.properties.j2
dest: "{{ installer_base_dir }}/liquibase/{{ artifact.group_id }}/{{ artifact.module }}/liquibase.properties"
vars:
- change_log_file: "{{ installer_base_dir }}//liquibase/{{ artifact.group_id }}/{{ artifact.module }}/{{ artifact.file }}"
- name: Run liquibase migration
shell: "{{ liquibase_path }}/liquibase --defaultsFile={{ installer_base_dir }}/liquibase/{{ artifact.group_id }}/{{ artifact.module }}/liquibase.properties --liquibaseSchemaName=abstracto --liquibaseCatalogName=abstracto --logLevel=info update"
- name: Cleanup folder
file:
path: "{{ installer_base_dir }}/liquibase/{{ artifact.group_id }}"
state: absent
- name: Cleanup zip
file:
path: "{{ installer_base_dir }}/liquibase/{{ artifact.group_id }}-{{ artifact.module }}.zip"
state: absent

View File

@@ -1,35 +0,0 @@
---
- name: Prepare target directoy
delegate_to: localhost
file:
path: "{{ installer_base_dir }}/templates/{{ group_id }}/{{ module }}"
state: directory
mode: '0755'
- name: Download template artifact {{ module }} in {{ group_id }}
delegate_to: localhost
maven_artifact:
group_id: "{{ group_id }}"
artifact_id: "{{ module }}"
dest: "{{ installer_base_dir }}/templates/{{ group_id }}-{{ module }}.zip"
extension: zip
version: "{{ version }}"
repository_url: "file://{{ lookup('env','HOME') }}/.m2/repository"
- name: Extract artifact zip
delegate_to: localhost
unarchive:
src: "{{ installer_base_dir }}/templates/{{ group_id }}-{{ module }}.zip"
dest: "{{ installer_base_dir }}/templates/{{ group_id }}/{{ module }}"
- name: Deploy templates
script: deploy_templates.py "{{ installer_base_dir }}/templates/{{ group_id }}/{{ module }}"
args:
executable: "{{ ansible_python_interpreter }}"
- name: Cleanup folder
file:
path: "{{ installer_base_dir }}/templates/"
state: absent

View File

@@ -1,23 +0,0 @@
---
- name: Include custom variables
include_vars:
dir: "{{ installer_base_dir }}/ansible"
depth: 1
- include_tasks: deploy_liquibase_change_log.yaml
name: Deploying abstracto liquibase changelogs
with_items: "{{ liquibase_artifacts }}"
loop_control:
loop_var: artifact
when: execute_liquibase
- include_tasks: deploy_artifacts.yaml
name: Deploying abstracto templates
with_items: "{{ template_artifacts }}"
loop_control:
loop_var: artifact
when: execute_templates

View File

@@ -1,19 +0,0 @@
custom_template_artifacts: []
liquibase_artifacts: []
db_credentials:
host: "{{ lookup('env','DB_HOST') }}"
port: "{{ lookup('env','DB_PORT') }}"
database: "{{ lookup('env','DB_NAME') }}"
user: "{{ lookup('env','DB_USER') }}"
password: "{{ lookup('env','DB_PASS') }}"
liquibase_path: "{{ lookup('env','LIQUIBASE_PATH') }}"
postgres_driver_path: "{{ lookup('env','POSTGRES_DRIVER_PATH') }}"
installer_base_dir: "/tmp/installer"
execute_liquibase_input: yes
execute_templates_input: yes
execute_liquibase: "{{ True if (execute_liquibase_input | bool) else False }}"
execute_templates: "{{ True if (execute_templates_input | bool) else False }}"