sxcybot

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

commit c91d9683f15cbdbc1289713656d891d581e04682
parent 18eb6461424e476e7285a5e625ab3ede7edd3905
Author: Wim Dupont <wim@wimdupont.com>
Date:   Thu, 15 May 2025 22:16:42 +0200

hiscore client json upgrade

Diffstat:
Msrc/main/java/com/wimdupont/sxcybot/client/HiScoreClient.java | 86++++++-------------------------------------------------------------------------
Msrc/main/java/com/wimdupont/sxcybot/listeners/member/KillCountListener.java | 6+++---
Msrc/main/java/com/wimdupont/sxcybot/listeners/member/StatsListener.java | 2+-
Msrc/main/java/com/wimdupont/sxcybot/model/CombatDto.java | 14+++++++-------
Dsrc/main/java/com/wimdupont/sxcybot/model/HiScoreBuilder.java | 11-----------
Asrc/main/java/com/wimdupont/sxcybot/model/HiscoreDto.java | 8++++++++
Msrc/main/java/com/wimdupont/sxcybot/model/OsrsBossKc.java | 38++++++++++++++++++++++++++------------
Msrc/main/java/com/wimdupont/sxcybot/model/OsrsStat.java | 51++++++++++++++++++++++++++++++++-------------------
Msrc/main/java/com/wimdupont/sxcybot/repository/osrs/OsrsHiscoreBossRepository.java | 2++
Msrc/main/java/com/wimdupont/sxcybot/services/OsrsMonitoringService.java | 33+++++++++++++++------------------
Msrc/main/java/com/wimdupont/sxcybot/services/guild/pvmrole/PvmRoleSnapshotComparatorService.java | 15+++++++++------
Msrc/main/java/com/wimdupont/sxcybot/services/osrs/OsrsHiscoreBossService.java | 7+++++++
Msrc/main/java/com/wimdupont/sxcybot/services/osrs/StatMessageSender.java | 10++++++----
Asrc/main/resources/db/migration/V1_26__updated_hiscore_client.sql | 1+
Msrc/test/java/com/wimdupont/sxcybot/client/HiScoreClientTest.java | 14+++++++-------
15 files changed, 130 insertions(+), 168 deletions(-)

diff --git a/src/main/java/com/wimdupont/sxcybot/client/HiScoreClient.java b/src/main/java/com/wimdupont/sxcybot/client/HiScoreClient.java @@ -1,110 +1,36 @@ package com.wimdupont.sxcybot.client; import com.wimdupont.sxcybot.exceptions.EntityNotFoundException; -import com.wimdupont.sxcybot.model.HiScoreBuilder; -import com.wimdupont.sxcybot.model.OsrsBossKc; -import com.wimdupont.sxcybot.model.OsrsStat; -import com.wimdupont.sxcybot.repository.osrs.dao.OsrsHiscore; -import com.wimdupont.sxcybot.repository.osrs.dao.OsrsHiscoreBoss; -import com.wimdupont.sxcybot.repository.osrs.dao.OsrsHiscoreStat; -import com.wimdupont.sxcybot.services.osrs.OsrsHiscoreBossService; -import com.wimdupont.sxcybot.services.osrs.OsrsHiscoreStatService; -import com.wimdupont.sxcybot.util.NumberFormatter; +import com.wimdupont.sxcybot.model.HiscoreDto; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import java.time.Duration; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; @Component public class HiScoreClient { - private static final String URL = "https://secure.runescape.com/m=hiscore_oldschool/index_lite.ws?player=%s"; + private static final String URL = "https://secure.runescape.com/m=hiscore_oldschool/index_lite.json?player=%s"; private static final Logger LOGGER = LoggerFactory.getLogger(HiScoreClient.class); - private final OsrsHiscoreBossService osrsHiscoreBossService; - private final OsrsHiscoreStatService osrsHiscoreStatService; - - public HiScoreClient(OsrsHiscoreBossService osrsHiscoreBossService, - OsrsHiscoreStatService osrsHiscoreStatService) { - this.osrsHiscoreBossService = osrsHiscoreBossService; - this.osrsHiscoreStatService = osrsHiscoreStatService; - } - - public List<OsrsStat> getHiScoreStats(String playername, MessageChannel channel) throws EntityNotFoundException { - List<OsrsHiscoreStat> hiscoreStats = osrsHiscoreStatService.findAll(); - return getHiScores(playername, channel, (osrsStat, hiScoreStatValues, i) -> OsrsStat.Builder.newBuilder() - .name(hiscoreStats.stream().filter(f -> f.getOrderValue() == i).findFirst().orElseThrow(() - -> new EntityNotFoundException(String.format("OsrsStatName for order %s not found!", i))) - .getName()) - .rank(NumberFormatter.format(hiScoreStatValues.getFirst())) - .level(hiScoreStatValues.get(1)) - .experience(NumberFormatter.format(hiScoreStatValues.get(2))) - .build(), getMinOrder(hiscoreStats), getMaxOrder(hiscoreStats)); - } - - public List<OsrsBossKc> getHiScoreBossKc(String playername, MessageChannel channel) throws EntityNotFoundException { - List<OsrsHiscoreBoss> hiscoreBosses = osrsHiscoreBossService.findAll(); - return getHiScores(playername, channel, (osrsKc, hiScoreKcValues, i) -> OsrsBossKc.Builder.newBuilder() - .name(hiscoreBosses.stream().filter(f -> f.getOrderValue() == i).findFirst().orElseThrow(() - -> new EntityNotFoundException(String.format("OsrsBoss for order %s not found!", i))) - .getName()) - .rank(hiScoreKcValues.getFirst()) - .kc(hiScoreKcValues.get(1)) - .build(), getMinOrder(hiscoreBosses), getMaxOrder(hiscoreBosses)); - } - - private <T> List<T> getHiScores(String playername, MessageChannel channel, HiScoreBuilder<T> hiScoreBuilder, int fromIndex, int toIndex) throws EntityNotFoundException { - List<T> hiScoreList = new ArrayList<>(); + public HiscoreDto getHiScores(String playername, MessageChannel channel) throws EntityNotFoundException { RestTemplate restTemplate = new RestTemplateBuilder() .errorHandler(new ClientErrorHandler(channel)) .setReadTimeout(Duration.ofSeconds(30)) .build(); try { - String result = restTemplate.getForObject(String.format(URL, playername), String.class); + HiscoreDto result = restTemplate.getForObject(String.format(URL, playername), HiscoreDto.class); if (result == null) { - throw new Exception(); - } - int i = fromIndex; - List<String> hiScores = Arrays.stream(result.split("\n")).toList(); - for (String osrsHiScoresStats : hiScores.subList(fromIndex, toIndex + 1)) { - List<String> hiScoreStatValues = Arrays.stream(osrsHiScoresStats.split(",")).toList(); - hiScoreList.add(hiScoreBuilder.accept(osrsHiScoresStats, hiScoreStatValues, i)); - i++; - } - if (hiScoreList.isEmpty()) { - throw new Exception(); + throw new Exception("Hiscore result is null"); } + return result; } catch (Exception e) { LOGGER.error(e.getMessage(), e); throw new EntityNotFoundException(String.format("No hiscores available for %s.", playername)); } - return hiScoreList; - } - - private <T extends OsrsHiscore> int getMinOrder(List<T> osrsHiscores) { - if (CollectionUtils.isEmpty(osrsHiscores)) { - return 0; - } - return Collections.min(osrsHiscores, Comparator.comparing(OsrsHiscore::getOrderValue)) - .getOrderValue(); - } - - private <T extends OsrsHiscore> int getMaxOrder(List<T> osrsHiscores) { - if (CollectionUtils.isEmpty(osrsHiscores)) { - return 0; - } - return Collections.max(osrsHiscores, Comparator.comparing(OsrsHiscore::getOrderValue)) - .getOrderValue(); - } } diff --git a/src/main/java/com/wimdupont/sxcybot/listeners/member/KillCountListener.java b/src/main/java/com/wimdupont/sxcybot/listeners/member/KillCountListener.java @@ -26,15 +26,15 @@ public class KillCountListener implements Listener { String msg = event.getMessage().getContentRaw(); try { String player = msg.substring(msg.indexOf(" ")).trim(); - List<OsrsBossKc> bossKcList = hiScoreClient.getHiScoreBossKc(player, event.getChannel()); + List<OsrsBossKc> bossKcList = hiScoreClient.getHiScores(player, event.getChannel()).activities(); event.getChannel().sendTyping().queue(q -> { EmbedBuilder embedBuilder = new EmbedBuilder(); embedBuilder.setTitle(String.format("Killcount for %s", player)); embedBuilder.setColor(Color.RED); int i = 1; - bossKcList.stream().filter(f -> !"-1".equals(f.kc())).forEach(f -> { - embedBuilder.addField(f.name(), String.format("Kc: %s%sRank: %s", f.kc(), System.lineSeparator(), f.rank()), true); + bossKcList.stream().filter(f -> -1 != f.score()).forEach(f -> { + embedBuilder.addField(f.name(), String.format("Kc: %s%sRank: %s", f.score(), System.lineSeparator(), f.rank()), true); if (JdaUtil.requiresBuild(embedBuilder, bossKcList.size(), i)) { event.getChannel().sendMessageEmbeds(embedBuilder.build()).queue(); embedBuilder.clearFields(); diff --git a/src/main/java/com/wimdupont/sxcybot/listeners/member/StatsListener.java b/src/main/java/com/wimdupont/sxcybot/listeners/member/StatsListener.java @@ -25,7 +25,7 @@ public class StatsListener implements Listener { f -> embedBuilder.addField(f.name(), "Level " + f.level() + System.lineSeparator() + "Rank " + f.rank() + System.lineSeparator() + - "Exp " + f.experience(), true), null + "Exp " + f.xp(), true), null )); } } diff --git a/src/main/java/com/wimdupont/sxcybot/model/CombatDto.java b/src/main/java/com/wimdupont/sxcybot/model/CombatDto.java @@ -29,25 +29,25 @@ public record CombatDto( CombatDto.Builder builder = CombatDto.Builder.newBuilder(); for (OsrsStat osrsStat : osrsStatList) { if (OsrsCombatStat.ATTACK.value.equalsIgnoreCase(osrsStat.name())) { - builder.attackLevel(Integer.parseInt(osrsStat.level())); + builder.attackLevel(osrsStat.level()); } if (OsrsCombatStat.STRENGTH.value.equalsIgnoreCase(osrsStat.name())) { - builder.strengthLevel(Integer.parseInt(osrsStat.level())); + builder.strengthLevel(osrsStat.level()); } if (OsrsCombatStat.DEFENCE.value.equalsIgnoreCase(osrsStat.name())) { - builder.defenceLevel(Integer.parseInt(osrsStat.level())); + builder.defenceLevel(osrsStat.level()); } if (OsrsCombatStat.HITPOINTS.value.equalsIgnoreCase(osrsStat.name())) { - builder.hitpointsLevel(Integer.parseInt(osrsStat.level())); + builder.hitpointsLevel(osrsStat.level()); } if (OsrsCombatStat.MAGIC.value.equalsIgnoreCase(osrsStat.name())) { - builder.magicLevel(Integer.parseInt(osrsStat.level())); + builder.magicLevel(osrsStat.level()); } if (OsrsCombatStat.RANGED.value.equalsIgnoreCase(osrsStat.name())) { - builder.rangeLevel(Integer.parseInt(osrsStat.level())); + builder.rangeLevel(osrsStat.level()); } if (OsrsCombatStat.PRAYER.value.equalsIgnoreCase(osrsStat.name())) { - builder.prayerLevel(Integer.parseInt(osrsStat.level())); + builder.prayerLevel(osrsStat.level()); } } return builder.build(); diff --git a/src/main/java/com/wimdupont/sxcybot/model/HiScoreBuilder.java b/src/main/java/com/wimdupont/sxcybot/model/HiScoreBuilder.java @@ -1,11 +0,0 @@ -package com.wimdupont.sxcybot.model; - -import com.wimdupont.sxcybot.exceptions.EntityNotFoundException; - -import java.util.List; - -@FunctionalInterface -public interface HiScoreBuilder<T> { - - T accept(String string, List<String> stringList, int i) throws EntityNotFoundException; -} diff --git a/src/main/java/com/wimdupont/sxcybot/model/HiscoreDto.java b/src/main/java/com/wimdupont/sxcybot/model/HiscoreDto.java @@ -0,0 +1,8 @@ +package com.wimdupont.sxcybot.model; + +import java.util.List; + +public record HiscoreDto( + List<OsrsStat> skills, + List<OsrsBossKc> activities) { +} diff --git a/src/main/java/com/wimdupont/sxcybot/model/OsrsBossKc.java b/src/main/java/com/wimdupont/sxcybot/model/OsrsBossKc.java @@ -1,22 +1,30 @@ package com.wimdupont.sxcybot.model; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; + +@JsonDeserialize(builder = OsrsBossKc.Builder.class) public record OsrsBossKc( + int id, String name, - String rank, - String kc + int rank, + int score ) { private OsrsBossKc(Builder builder) { - this(builder.name, + this(builder.id, + builder.name, builder.rank, - builder.kc); + builder.score); } + @JsonPOJOBuilder(withPrefix = "") public static final class Builder { + private int id; private String name; - private String rank; - private String kc; + private int rank; + private int score; private Builder() { } @@ -25,18 +33,23 @@ public record OsrsBossKc( return new Builder(); } + public Builder id(int val) { + id = val; + return this; + } + public Builder name(String val) { name = val; return this; } - public Builder rank(String val) { + public Builder rank(int val) { rank = val; return this; } - public Builder kc(String val) { - kc = val; + public Builder score(int val) { + score = val; return this; } @@ -48,9 +61,10 @@ public record OsrsBossKc( @Override public String toString() { return "OsrsBossKc{" + - "name='" + name + '\'' + - ", rank='" + rank + '\'' + - ", kc='" + kc + '\'' + + "id=" + id + + ", name='" + name + '\'' + + ", rank=" + rank + + ", score=" + score + '}'; } } diff --git a/src/main/java/com/wimdupont/sxcybot/model/OsrsStat.java b/src/main/java/com/wimdupont/sxcybot/model/OsrsStat.java @@ -1,25 +1,32 @@ package com.wimdupont.sxcybot.model; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; + +@JsonDeserialize(builder = OsrsStat.Builder.class) public record OsrsStat( + int id, String name, - String experience, - String rank, - String level -) { - + int rank, + int level, + int xp) { private OsrsStat(Builder builder) { - this(builder.name, - builder.experience, + this(builder.id, + builder.name, builder.rank, - builder.level); + builder.level, + builder.xp + ); } + @JsonPOJOBuilder(withPrefix = "") public static final class Builder { + private int id; private String name; - private String experience; - private String rank; - private String level; + private int rank; + private int level; + private int xp; private Builder() { } @@ -28,22 +35,27 @@ public record OsrsStat( return new Builder(); } + public Builder id(int val) { + id = val; + return this; + } + public Builder name(String val) { name = val; return this; } - public Builder experience(String val) { - experience = val; + public Builder xp(int val) { + xp = val; return this; } - public Builder rank(String val) { + public Builder rank(int val) { rank = val; return this; } - public Builder level(String val) { + public Builder level(int val) { level = val; return this; } @@ -56,10 +68,11 @@ public record OsrsStat( @Override public String toString() { return "OsrsStat{" + - "name='" + name + '\'' + - ", experience='" + experience + '\'' + - ", rank='" + rank + '\'' + - ", level='" + level + '\'' + + "id=" + id + + ", name='" + name + '\'' + + ", rank=" + rank + + ", level=" + level + + ", xp=" + xp + '}'; } } diff --git a/src/main/java/com/wimdupont/sxcybot/repository/osrs/OsrsHiscoreBossRepository.java b/src/main/java/com/wimdupont/sxcybot/repository/osrs/OsrsHiscoreBossRepository.java @@ -10,4 +10,6 @@ import java.util.Optional; public interface OsrsHiscoreBossRepository extends JpaRepository<OsrsHiscoreBoss, String> { Optional<OsrsHiscoreBoss> findByName(String name); + + Optional<OsrsHiscoreBoss> findTopByOrderByOrderValueDesc(); } diff --git a/src/main/java/com/wimdupont/sxcybot/services/OsrsMonitoringService.java b/src/main/java/com/wimdupont/sxcybot/services/OsrsMonitoringService.java @@ -6,6 +6,7 @@ import com.wimdupont.sxcybot.model.OsrsBossKc; import com.wimdupont.sxcybot.repository.guild.pvmrole.dao.PvmRoleUser; import com.wimdupont.sxcybot.services.guild.ChannelDetailService; import com.wimdupont.sxcybot.services.guild.pvmrole.PvmRoleUserService; +import com.wimdupont.sxcybot.services.osrs.OsrsHiscoreBossService; import com.wimdupont.sxcybot.util.JdaUtil; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.channel.concrete.PrivateChannel; @@ -17,6 +18,7 @@ import org.springframework.stereotype.Service; import java.awt.Color; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; @Service @@ -25,25 +27,22 @@ public class OsrsMonitoringService { private final Logger LOGGER = LoggerFactory.getLogger("monitor"); private final HiScoreClient hiScoreClient; private final PvmRoleUserService pvmRoleUserService; + private final OsrsHiscoreBossService osrsHiscoreBossService; private final MailService mailService; private final String monitorUserName; - private final String monitorBossName; - private final String monitorBossKc; private final ChannelDetailService channelDetailService; public OsrsMonitoringService(HiScoreClient hiScoreClient, PvmRoleUserService pvmRoleUserService, + OsrsHiscoreBossService osrsHiscoreBossService, MailService mailService, @Value("${monitor.user.name}") String monitorUserName, - @Value("${monitor.boss.name}") String monitorBossName, - @Value("${monitor.boss.kc}") String monitorBossKc, ChannelDetailService channelDetailService) { this.hiScoreClient = hiScoreClient; this.pvmRoleUserService = pvmRoleUserService; + this.osrsHiscoreBossService = osrsHiscoreBossService; this.mailService = mailService; this.monitorUserName = monitorUserName; - this.monitorBossName = monitorBossName; - this.monitorBossKc = monitorBossKc; this.channelDetailService = channelDetailService; } @@ -76,7 +75,7 @@ public class OsrsMonitoringService { List<PvmRoleUser> unfound = new ArrayList<>(); for (PvmRoleUser pvmRoleUser : pvmRoleUserService.findAll()) { try { - hiScoreClient.getHiScoreBossKc(pvmRoleUser.getRsn(), null); + hiScoreClient.getHiScores(pvmRoleUser.getRsn(), null); } catch (Exception e) { unfound.add(pvmRoleUser); } @@ -132,17 +131,15 @@ public class OsrsMonitoringService { } public void monitorHiscores() throws EntityNotFoundException { - List<OsrsBossKc> osrsBossKcs = hiScoreClient.getHiScoreBossKc(monitorUserName, null); - OsrsBossKc wintertodtBossKc = osrsBossKcs.stream() - .filter(f -> f.name().equals(monitorBossName)) - .findAny() - .orElseThrow(() -> new EntityNotFoundException(String.format("No \"%s\" hiscores found.", monitorBossName))); - - if (wintertodtBossKc.kc().equals(monitorBossKc)) { - LOGGER.info(String.format("Hiscores check is OK. (%s has %s kc on %s)", monitorUserName, monitorBossKc, monitorBossName)); - } else { - handleError(String.format("Hiscores check not OK: %s kc for user %s is not %s, but is %s", - monitorBossName, monitorUserName, monitorBossKc, wintertodtBossKc.kc())); + var osrsBossKcs = hiScoreClient.getHiScores(monitorUserName, null).activities(); + var maxHiscoreOrder = osrsBossKcs.stream() + .map(OsrsBossKc::id) + .max(Comparator.comparingInt(Integer::valueOf)) + .orElseThrow(); + var maxPersistedOrder = osrsHiscoreBossService.findMaxOrderValue(); + if (maxHiscoreOrder != maxPersistedOrder){ + handleError(String.format("Hiscores check not OK: Online bosses count (%s) != persisted count (%s) ", + maxHiscoreOrder, maxPersistedOrder)); } } diff --git a/src/main/java/com/wimdupont/sxcybot/services/guild/pvmrole/PvmRoleSnapshotComparatorService.java b/src/main/java/com/wimdupont/sxcybot/services/guild/pvmrole/PvmRoleSnapshotComparatorService.java @@ -38,7 +38,9 @@ public class PvmRoleSnapshotComparatorService { this.hiScoreClient = hiScoreClient; } - public void updateScoreboard(PvmRoleUser pvmRoleUser, Map<PvmRole, LinkedHashMap<PvmRoleUser, BigDecimal>> scoreBoard, List<PvmKcSnapshot> unpersistedSnapshots) { + public void updateScoreboard(PvmRoleUser pvmRoleUser, + Map<PvmRole, LinkedHashMap<PvmRoleUser, BigDecimal>> scoreBoard, + List<PvmKcSnapshot> unpersistedSnapshots) { boolean persisted = unpersistedSnapshots == null; List<PvmKcSnapshot> pvmKcSnapshots = pvmKcSnapshotService.findAllByPvmRoleUser(pvmRoleUser); if (pvmKcSnapshots != null && (pvmKcSnapshots.size() > 1 || (!persisted && !pvmKcSnapshots.isEmpty()))) { @@ -48,7 +50,8 @@ public class PvmRoleSnapshotComparatorService { .limit(persisted ? 2 : 1) .toList(); for (PvmRole pvmRole : scoreBoard.keySet()) { - BigDecimal points1 = calculatePoints(pvmRole, persisted ? pvmKcSnapshots.get(0) : unpersistedSnapshots.getFirst()); + BigDecimal points1 = calculatePoints(pvmRole, persisted + ? pvmKcSnapshots.getFirst() : unpersistedSnapshots.getFirst()); BigDecimal points2 = calculatePoints(pvmRole, pvmKcSnapshots.get(persisted ? 1 : 0)); BigDecimal result = points1.subtract(points2); if (BigDecimal.ZERO.compareTo(result) < 0) @@ -69,19 +72,19 @@ public class PvmRoleSnapshotComparatorService { PvmKcSnapshot pvmKcSnapshot = PvmKcSnapshot.Builder.newBuilder() .pvmRoleUser(pvmRoleUser) .build(); - List<OsrsBossKc> osrsBossKcList = hiScoreClient.getHiScoreBossKc(pvmRoleUser.getRsn(), textChannel); + List<OsrsBossKc> osrsBossKcList = hiScoreClient.getHiScores(pvmRoleUser.getRsn(), textChannel).activities(); List<PvmUserKc> pvmUserKcList = new ArrayList<>(); - for (OsrsBossKc osrsBossKc : osrsBossKcList.stream().filter(r -> Integer.parseInt(r.kc()) > 0).toList()) { + for (OsrsBossKc osrsBossKc : osrsBossKcList.stream().filter(r -> r.score() > 0).toList()) { try { PvmUserKc pvmUserKc = PvmUserKc.Builder.newBuilder() .pvmRoleUser(pvmRoleUser) .osrsHiscoreBoss(osrsHiscoreBossService.findByName(osrsBossKc.name())) .pvmKcSnapshot(pvmKcSnapshot) - .kc(Integer.valueOf(osrsBossKc.kc())) + .kc(osrsBossKc.score()) .build(); pvmUserKcList.add(pvmUserKc); } catch (EntityNotFoundException e) { - LOGGER.error(e.getMessage(), e); + LOGGER.warn(e.getMessage()); } } pvmKcSnapshot.setPvmUserKcList(pvmUserKcList); diff --git a/src/main/java/com/wimdupont/sxcybot/services/osrs/OsrsHiscoreBossService.java b/src/main/java/com/wimdupont/sxcybot/services/osrs/OsrsHiscoreBossService.java @@ -28,6 +28,13 @@ public class OsrsHiscoreBossService { () -> new EntityNotFoundException(String.format("No hiscoreBoss found with name %s.", name))); } + public int findMaxOrderValue() { + return osrsHiscoreBossRepository.findTopByOrderByOrderValueDesc().stream() + .map(OsrsHiscoreBoss::getOrderValue) + .findFirst() + .orElse(-1); + } + public OsrsHiscoreBoss save(OsrsHiscoreBoss osrsHiscoreBoss) { return osrsHiscoreBossRepository.save(osrsHiscoreBoss); } diff --git a/src/main/java/com/wimdupont/sxcybot/services/osrs/StatMessageSender.java b/src/main/java/com/wimdupont/sxcybot/services/osrs/StatMessageSender.java @@ -23,16 +23,18 @@ public class StatMessageSender { this.hiScoreClient = hiScoreClient; } - public void sendStatMessage(MessageReceivedEvent event, EmbedBuilder embedBuilder, - Predicate<OsrsStat> predicate, Consumer<OsrsStat> consumer - , Consumer<List<OsrsStat>> calcCombatLevel) { + public void sendStatMessage(MessageReceivedEvent event, + EmbedBuilder embedBuilder, + Predicate<OsrsStat> predicate, + Consumer<OsrsStat> consumer, + Consumer<List<OsrsStat>> calcCombatLevel) { String msg = event.getMessage().getContentRaw(); try { String player = msg.substring(msg.indexOf(" ")).trim(); try { embedBuilder.setColor(Color.RED); embedBuilder.setTitle(String.format("Stats of %s", player)); - List<OsrsStat> osrsStatList = hiScoreClient.getHiScoreStats(player, event.getChannel()); + List<OsrsStat> osrsStatList = hiScoreClient.getHiScores(player, event.getChannel()).skills(); osrsStatList.stream().filter(predicate).forEach(consumer); if (calcCombatLevel != null) { diff --git a/src/main/resources/db/migration/V1_26__updated_hiscore_client.sql b/src/main/resources/db/migration/V1_26__updated_hiscore_client.sql @@ -0,0 +1 @@ +UPDATE osrs_hiscore_boss SET order_value = order_value-24; diff --git a/src/test/java/com/wimdupont/sxcybot/client/HiScoreClientTest.java b/src/test/java/com/wimdupont/sxcybot/client/HiScoreClientTest.java @@ -37,7 +37,7 @@ class HiScoreClientTest { @BeforeEach void setup() { - hiScoreClient = new HiScoreClient(osrsHiscoreBossService, osrsHiscoreStatService); + hiScoreClient = new HiScoreClient(); } @Test @@ -66,19 +66,19 @@ class HiScoreClientTest { ); given(osrsHiscoreStatService.findAll()).willReturn(osrsHiscoreStats); - List<OsrsStat> result = hiScoreClient.getHiScoreStats(playerName, messageChannel); + List<OsrsStat> result = hiScoreClient.getHiScores(playerName, messageChannel).skills(); assertFalse(result.isEmpty()); assertEquals(5, result.size()); assertEquals("Overall", result.get(0).name()); - assertTrue(1939 <= Integer.parseInt(result.get(0).level())); + assertTrue(1939 <= result.get(0).level()); assertEquals("Strength", result.get(3).name()); - assertEquals(99, Integer.parseInt(result.get(3).level())); + assertEquals(99, result.get(3).level()); assertEquals("Hitpoints", result.get(4).name()); - assertEquals(99, Integer.parseInt(result.get(4).level())); + assertEquals(99, result.get(4).level()); } @Test @@ -86,7 +86,7 @@ class HiScoreClientTest { String playerName = "007thisplayershouldneverexist007"; given(messageChannel.sendMessage("No results found. ()")).willReturn(messageCreateAction); Exception exception = assertThrows(EntityNotFoundException.class, () -> - hiScoreClient.getHiScoreStats(playerName, messageChannel)); + hiScoreClient.getHiScores(playerName, messageChannel)); assertEquals(exception.getMessage(), String.format("No hiscores available for %s.", playerName)); } @@ -97,7 +97,7 @@ class HiScoreClientTest { given(messageChannel.sendMessage("No results found. ()")).willReturn(messageCreateAction); Exception exception = assertThrows(EntityNotFoundException.class, () -> - hiScoreClient.getHiScoreBossKc(playerName, messageChannel)); + hiScoreClient.getHiScores(playerName, messageChannel)); assertEquals(exception.getMessage(), String.format("No hiscores available for %s.", playerName)); }