sxcybot

Discord bot for OSRS based channels
git clone git://git.wimdupont.com/sxcybot.git
Log | Files | Refs | README | LICENSE

commit cb519b548bc7a0b84a39ab259532bb628f6564ae
parent 406f61b6bf95dc1cb16d62ac1b0a41d5f6398f15
Author: Wim Dupont <wim@wimdupont.com>
Date:   Sat, 15 Nov 2025 07:37:52 +0100

added pvm rerun and fix roleAssigner

Diffstat:
Msrc/main/java/com/wimdupont/sxcybot/enums/Command.java | 3++-
Msrc/main/java/com/wimdupont/sxcybot/listeners/AdminCommandListener.java | 8++++++++
Asrc/main/java/com/wimdupont/sxcybot/listeners/admin/RerunPvmPollListener.java | 21+++++++++++++++++++++
Msrc/main/java/com/wimdupont/sxcybot/listeners/member/PvmRolePollListener.java | 2+-
Msrc/main/java/com/wimdupont/sxcybot/services/PvMRoleResolver.java | 16+++++++++-------
Msrc/main/java/com/wimdupont/sxcybot/services/guild/pvmrole/PvmRoleAssignerService.java | 38+++++++++++++++++++-------------------
6 files changed, 60 insertions(+), 28 deletions(-)

diff --git a/src/main/java/com/wimdupont/sxcybot/enums/Command.java b/src/main/java/com/wimdupont/sxcybot/enums/Command.java @@ -32,7 +32,8 @@ public enum Command { EDITROLE("Add/Delete record of roles."), EDITPVM("Add/Edit/Delete record of the PvM Role competition"), EDITBOSS("Update multiplier for a OSRS Boss of the PvM Role competition"), - UPDATEPVM("Attempts to add Pvm Role Competitors using Wise Old Man data"); + UPDATEPVM("Attempts to add Pvm Role Competitors using Wise Old Man data"), + RERUNPVM("Attempts to rerun the last Pvm Role Competition with the known snapshots."); public final String description; diff --git a/src/main/java/com/wimdupont/sxcybot/listeners/AdminCommandListener.java b/src/main/java/com/wimdupont/sxcybot/listeners/AdminCommandListener.java @@ -8,6 +8,7 @@ import com.wimdupont.sxcybot.listeners.admin.EditBanlistListener; import com.wimdupont.sxcybot.listeners.admin.EditPvmListener; import com.wimdupont.sxcybot.listeners.admin.EditRoleListener; import com.wimdupont.sxcybot.listeners.admin.EditRuleListener; +import com.wimdupont.sxcybot.listeners.admin.RerunPvmPollListener; import com.wimdupont.sxcybot.listeners.admin.RoleAssignListener; import com.wimdupont.sxcybot.listeners.admin.pvmrole.AutoUpdatePvmListener; import com.wimdupont.sxcybot.services.AccessService; @@ -34,6 +35,7 @@ public class AdminCommandListener extends ListenerAdapter { private final EditPvmListener editPvmListener; private final AutoUpdatePvmListener autoUpdatePvmListener; private final BossUpdateMultiplierListener bossUpdateMultiplierListener; + private final RerunPvmPollListener rerunPvmPollListener; private final AccessService accessService; public AdminCommandListener(EditRuleListener editRuleListener, @@ -44,6 +46,7 @@ public class AdminCommandListener extends ListenerAdapter { EditPvmListener editPvmListener, AutoUpdatePvmListener autoUpdatePvmListener, BossUpdateMultiplierListener bossUpdateMultiplierListener, + RerunPvmPollListener rerunPvmPollListener, AccessService accessService) { this.editRuleListener = editRuleListener; this.editBanlistListener = editBanlistListener; @@ -53,6 +56,7 @@ public class AdminCommandListener extends ListenerAdapter { this.editPvmListener = editPvmListener; this.autoUpdatePvmListener = autoUpdatePvmListener; this.bossUpdateMultiplierListener = bossUpdateMultiplierListener; + this.rerunPvmPollListener = rerunPvmPollListener; this.accessService = accessService; } @@ -93,6 +97,10 @@ public class AdminCommandListener extends ListenerAdapter { accessService.isAllowed(roleStream, event, ADMIN_ROLE); autoUpdatePvmListener.process(event); } + case RERUNPVM -> { + accessService.isAllowed(roleStream, event, ADMIN_ROLE); + rerunPvmPollListener.process(event); + } } } catch (InsufficientPrivilegesException e) { event.getChannel().sendMessage(e.getMessage()).queue(); diff --git a/src/main/java/com/wimdupont/sxcybot/listeners/admin/RerunPvmPollListener.java b/src/main/java/com/wimdupont/sxcybot/listeners/admin/RerunPvmPollListener.java @@ -0,0 +1,21 @@ +package com.wimdupont.sxcybot.listeners.admin; + +import com.wimdupont.sxcybot.listeners.Listener; +import com.wimdupont.sxcybot.services.PvMRoleResolver; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import org.springframework.stereotype.Component; + +@Component +public class RerunPvmPollListener implements Listener { + + private final PvMRoleResolver pvMRoleResolver; + + public RerunPvmPollListener(PvMRoleResolver pvMRoleResolver) { + this.pvMRoleResolver = pvMRoleResolver; + } + + @Override + public void process(MessageReceivedEvent event) { + pvMRoleResolver.resolvePvMRoles(true, true, null); + } +} diff --git a/src/main/java/com/wimdupont/sxcybot/listeners/member/PvmRolePollListener.java b/src/main/java/com/wimdupont/sxcybot/listeners/member/PvmRolePollListener.java @@ -23,7 +23,7 @@ public class PvmRolePollListener implements Listener { if (event.getMember() != null) { try { var privateChannel = event.getMember().getUser().openPrivateChannel().complete(true); - pvMRoleResolver.resolvePvMRoles(false, privateChannel); + pvMRoleResolver.resolvePvMRoles(false, false, privateChannel); } catch (RateLimitedException e) { LOGGER.error(e.getMessage(), e); } diff --git a/src/main/java/com/wimdupont/sxcybot/services/PvMRoleResolver.java b/src/main/java/com/wimdupont/sxcybot/services/PvMRoleResolver.java @@ -46,10 +46,10 @@ public class PvMRoleResolver { @SuppressWarnings("unused") public void resolvePvMRoles() { LOGGER.info("Running scheduled pvmRoleResolver."); - resolvePvMRoles(true, null); + resolvePvMRoles(true, false, null); } - public void resolvePvMRoles(boolean persist, PrivateChannel privateChannel) { + public void resolvePvMRoles(boolean persist, boolean rerun, PrivateChannel privateChannel) { var scoreBoard = new HashMap<PvmRole, LinkedHashMap<PvmRoleUser, BigDecimal>>(); for (PvmRole pvmRole : PvmRole.values()) { if (!pvmRole.equals(PvmRole.UNUSED)) @@ -60,11 +60,13 @@ public class PvMRoleResolver { var textChannel = getTextChannel(guild, channelDetail, privateChannel); for (PvmRoleUser pvmRoleUser : pvmRoleUserService.findAll()) { List<PvmKcSnapshot> pvmKcSnapshots = new ArrayList<>(); - try { - pvmKcSnapshots.add(pvmRoleSnapshotComparatorService.takeSnapshot(textChannel, pvmRoleUser, false, persist)); - } catch (EntityNotFoundException e) { - textChannel.sendMessage(e.getMessage()).queue(); - continue; + if (!rerun) { + try { + pvmKcSnapshots.add(pvmRoleSnapshotComparatorService.takeSnapshot(textChannel, pvmRoleUser, false, persist)); + } catch (EntityNotFoundException e) { + textChannel.sendMessage(e.getMessage()).queue(); + continue; + } } pvmRoleSnapshotComparatorService.updateScoreboard(pvmRoleUser, scoreBoard, persist ? null : pvmKcSnapshots); } 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 @@ -26,22 +26,22 @@ public class PvmRoleAssignerService { public void postScoreboardAndAssignRoles(Guild guild, MessageChannel textChannel, Map<PvmRole, LinkedHashMap<PvmRoleUser, BigDecimal>> scoreBoard, ChannelDetail channelDetail, boolean persist) { - try { - for (PvmRole pvmRole : scoreBoard.keySet()) { - var role = getRole(pvmRole, channelDetail, guild); - var embedBuilder = EmbedBuilderFactory.createBuilder(); + guild.loadMembers().onSuccess(memberlist -> { + try { + for (PvmRole pvmRole : scoreBoard.keySet()) { + var role = getRole(pvmRole, channelDetail, guild); + var embedBuilder = EmbedBuilderFactory.createBuilder(); - 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; - } - var 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 -> { + 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; + } + var 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())); long limit = 5; int i = 1; int winningRank = 1; @@ -74,11 +74,11 @@ public class PvmRoleAssignerService { i++; } textChannel.sendMessageEmbeds(embedBuilder.build()).queue(); - }); + } + } catch (EntityNotFoundException e) { + textChannel.sendMessage(e.getMessage()).queue(); } - } catch (EntityNotFoundException e) { - textChannel.sendMessage(e.getMessage()).queue(); - } + }); } private Role getRole(PvmRole pvmRole, ChannelDetail channelDetail, Guild guild) throws EntityNotFoundException {