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:
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 {