sxcybot

OSRS oriented Discord Bot
git clone git://git.wimdupont.com/sxcybot.git
Log | Files | Refs | README | LICENSE

commit d2815705322e4bf5f0d55eb4ee7dbba3d7783ac0
parent c579c4f923193c16397840719ad0b45170b3c2c0
Author: Wim Dupont <wim@wimdupont.com>
Date:   Thu,  1 Aug 2024 19:58:32 +0200

role by id

Diffstat:
Msrc/main/java/com/wimdupont/sxcybot/services/guild/pvmrole/PvmRoleAssignerService.java | 97+++++++++++++++++++++++++++++++++++++++++--------------------------------------
1 file changed, 50 insertions(+), 47 deletions(-)

diff --git a/src/main/java/com/wimdupont/sxcybot/services/guild/pvmrole/PvmRoleAssignerService.java b/src/main/java/com/wimdupont/sxcybot/services/guild/pvmrole/PvmRoleAssignerService.java @@ -1,6 +1,7 @@ package com.wimdupont.sxcybot.services.guild.pvmrole; import com.wimdupont.sxcybot.enums.PvmRole; +import com.wimdupont.sxcybot.exceptions.EntityNotFoundException; import com.wimdupont.sxcybot.repository.guild.dao.ChannelDetail; import com.wimdupont.sxcybot.repository.guild.pvmrole.dao.PvmRoleUser; import com.wimdupont.sxcybot.util.JdaUtil; @@ -27,69 +28,71 @@ public class PvmRoleAssignerService { public void postScoreboardAndAssignRoles(Guild guild, MessageChannel textChannel, Map<PvmRole, LinkedHashMap<PvmRoleUser, BigDecimal>> scoreBoard, ChannelDetail channelDetail, boolean persist) { - for (PvmRole pvmRole : scoreBoard.keySet()) { - String rolename = getRolename(pvmRole, channelDetail); - EmbedBuilder embedBuilder = new EmbedBuilder(); - embedBuilder.setColor(Color.red); - embedBuilder.setTitle(String.format("**%s** Scoreboard results:", rolename)); - if (scoreBoard.get(pvmRole).isEmpty()) { - embedBuilder.addField(String.format("No KC gains detected for %s", pvmRole.name().toLowerCase()), "No increase in KC found for participants, role will remain unchanged.", false); - textChannel.sendMessageEmbeds(embedBuilder.build()).queue(); - continue; - } - List<Map.Entry<PvmRoleUser, BigDecimal>> entries = new ArrayList<>(scoreBoard.get(pvmRole).entrySet()); - entries.sort(Map.Entry.comparingByValue(Comparator.reverseOrder())); - scoreBoard.get(pvmRole).clear(); - entries.forEach(f -> scoreBoard.get(pvmRole).put(f.getKey(), f.getValue())); - guild.loadMembers().onSuccess(memberlist -> { - long limit = 5; - int i = 1; - int winningRank = 1; - for (Map.Entry<PvmRoleUser, BigDecimal> entry : scoreBoard.get(pvmRole).entrySet()) { - if (limit-- == 0) break; - Optional<Member> member = memberlist.stream() - .filter(f -> f.getUser().getId().equals(entry.getKey().getDiscordId())).findAny(); - if (member.isPresent()) { - embedBuilder.addField(String.format("#%s %s", i, entry.getKey().getRsn()), String.format("%s with a score of %s!", member.get(), entry.getValue()), false); - if (i == winningRank && persist) { - Optional<Role> role = guild.getRoles().stream().filter(f -> rolename.equalsIgnoreCase(f.getName())).findFirst(); - if (role.isPresent()) { - guild.findMembersWithRoles(role.get()) + try { + for (PvmRole pvmRole : scoreBoard.keySet()) { + var role = getRole(pvmRole, channelDetail, guild); + EmbedBuilder embedBuilder = new EmbedBuilder(); + embedBuilder.setColor(Color.red); + embedBuilder.setTitle(String.format("**%s** Scoreboard results:", role.getName())); + if (scoreBoard.get(pvmRole).isEmpty()) { + embedBuilder.addField(String.format("No KC gains detected for %s", pvmRole.name().toLowerCase()), "No increase in KC found for participants, role will remain unchanged.", false); + textChannel.sendMessageEmbeds(embedBuilder.build()).queue(); + continue; + } + List<Map.Entry<PvmRoleUser, BigDecimal>> entries = new ArrayList<>(scoreBoard.get(pvmRole).entrySet()); + entries.sort(Map.Entry.comparingByValue(Comparator.reverseOrder())); + scoreBoard.get(pvmRole).clear(); + entries.forEach(f -> scoreBoard.get(pvmRole).put(f.getKey(), f.getValue())); + guild.loadMembers().onSuccess(memberlist -> { + long limit = 5; + int i = 1; + int winningRank = 1; + for (Map.Entry<PvmRoleUser, BigDecimal> entry : scoreBoard.get(pvmRole).entrySet()) { + if (limit-- == 0) break; + Optional<Member> member = memberlist.stream() + .filter(f -> f.getUser().getId().equals(entry.getKey().getDiscordId())).findAny(); + if (member.isPresent()) { + embedBuilder.addField(String.format("#%s %s", i, entry.getKey().getRsn()), String.format("%s with a score of %s!", member.get(), entry.getValue()), false); + if (i == winningRank && persist) { + guild.findMembersWithRoles(role) .onSuccess(oldWinners -> { if (oldWinners.isEmpty()) { - addRoleToWinner(guild, member.get(), role.get(), textChannel, entry.getKey().getRsn()); + addRoleToWinner(guild, member.get(), role, textChannel, entry.getKey().getRsn()); } else { - oldWinners.forEach(f -> guild.removeRoleFromMember(f, role.get()).queue(complete -> - addRoleToWinner(guild, member.get(), role.get(), textChannel, entry.getKey().getRsn()))); + oldWinners.forEach(f -> guild.removeRoleFromMember(f, role).queue(complete -> + addRoleToWinner(guild, member.get(), role, textChannel, entry.getKey().getRsn()))); } }); - } else { - textChannel.sendMessage(String.format("No role %s found in the channel, role could not get assigned.", rolename)).queue(); } + } else { + if (i == winningRank) winningRank++; + embedBuilder.addField(String.format("#%s %s", i, entry.getKey().getRsn()), String.format("%s with a score of %s!", + JdaUtil.getNameById(memberlist, entry.getKey().getDiscordId()) + .orElse(String.format("{discordId:%s}", entry.getKey().getDiscordId())), entry.getValue()), false); + textChannel.sendMessage(String.format("No guildmember found for discordname %s. User did not receive any awards.", + JdaUtil.getNameById(memberlist, entry.getKey().getDiscordId()) + .orElse(String.format("{discordId:%s}", entry.getKey().getDiscordId())))).queue(); } - } else { - if (i == winningRank) winningRank++; - embedBuilder.addField(String.format("#%s %s", i, entry.getKey().getRsn()), String.format("%s with a score of %s!", - JdaUtil.getNameById(memberlist, entry.getKey().getDiscordId()) - .orElse(String.format("{discordId:%s}", entry.getKey().getDiscordId())), entry.getValue()), false); - textChannel.sendMessage(String.format("No guildmember found for discordname %s. User did not receive any awards.", - JdaUtil.getNameById(memberlist, entry.getKey().getDiscordId()) - .orElse(String.format("{discordId:%s}", entry.getKey().getDiscordId())))).queue(); + i++; } - i++; - } - textChannel.sendMessageEmbeds(embedBuilder.build()).queue(); - }); + textChannel.sendMessageEmbeds(embedBuilder.build()).queue(); + }); + } + } catch (EntityNotFoundException e) { + textChannel.sendMessage(e.getMessage()).queue(); } } - private String getRolename(PvmRole pvmRole, ChannelDetail channelDetail) { - return switch (pvmRole) { + private Role getRole(PvmRole pvmRole, ChannelDetail channelDetail, Guild guild) throws EntityNotFoundException { + var roleId = switch (pvmRole) { case GENERAL -> channelDetail.getPvmRoleGeneral(); case RAIDS -> channelDetail.getPvmRoleRaids(); case WILDERNESS -> channelDetail.getPvmRoleWilderness(); default -> "Something went wrong."; }; + return guild.getRoles().stream().filter(f -> roleId.equals(f.getId())).findFirst() + .orElseThrow(() -> new EntityNotFoundException( + String.format("No role %s found in the channel, role could not get assigned.", roleId))); } private void addRoleToWinner(Guild guild, Member member, Role role, MessageChannel textChannel, String rsn) {