diff --git a/http-api/src/main/java/net/runelite/http/api/xp/XpData.java b/http-api/src/main/java/net/runelite/http/api/xp/XpData.java index 33217bafe0..348faa5c78 100644 --- a/http-api/src/main/java/net/runelite/http/api/xp/XpData.java +++ b/http-api/src/main/java/net/runelite/http/api/xp/XpData.java @@ -26,8 +26,10 @@ package net.runelite.http.api.xp; import java.time.Instant; import lombok.Data; +import lombok.EqualsAndHashCode; @Data +@EqualsAndHashCode(exclude = "time") public class XpData { private Instant time; @@ -56,6 +58,7 @@ public class XpData private int hunter_xp; private int construction_xp; + private int overall_rank; private int attack_rank; private int defence_rank; private int strength_rank; diff --git a/http-service/src/main/java/net/runelite/http/service/xp/XpMapper.java b/http-service/src/main/java/net/runelite/http/service/xp/XpMapper.java index 0e23aa3959..ad72f43c47 100644 --- a/http-service/src/main/java/net/runelite/http/service/xp/XpMapper.java +++ b/http-service/src/main/java/net/runelite/http/service/xp/XpMapper.java @@ -24,9 +24,11 @@ */ package net.runelite.http.service.xp; +import net.runelite.http.api.hiscore.HiscoreResult; import net.runelite.http.api.xp.XpData; import net.runelite.http.service.xp.beans.XpEntity; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; @Mapper @@ -35,4 +37,54 @@ public interface XpMapper XpMapper INSTANCE = Mappers.getMapper(XpMapper.class); XpData xpEntityToXpData(XpEntity xpEntity); + + @Mapping(source = "attack.experience", target = "attack_xp") + @Mapping(source = "defence.experience", target = "defence_xp") + @Mapping(source = "strength.experience", target = "strength_xp") + @Mapping(source = "hitpoints.experience", target = "hitpoints_xp") + @Mapping(source = "ranged.experience", target = "ranged_xp") + @Mapping(source = "prayer.experience", target = "prayer_xp") + @Mapping(source = "magic.experience", target = "magic_xp") + @Mapping(source = "cooking.experience", target = "cooking_xp") + @Mapping(source = "woodcutting.experience", target = "woodcutting_xp") + @Mapping(source = "fletching.experience", target = "fletching_xp") + @Mapping(source = "fishing.experience", target = "fishing_xp") + @Mapping(source = "firemaking.experience", target = "firemaking_xp") + @Mapping(source = "crafting.experience", target = "crafting_xp") + @Mapping(source = "smithing.experience", target = "smithing_xp") + @Mapping(source = "mining.experience", target = "mining_xp") + @Mapping(source = "herblore.experience", target = "herblore_xp") + @Mapping(source = "agility.experience", target = "agility_xp") + @Mapping(source = "thieving.experience", target = "thieving_xp") + @Mapping(source = "slayer.experience", target = "slayer_xp") + @Mapping(source = "farming.experience", target = "farming_xp") + @Mapping(source = "runecraft.experience", target = "runecraft_xp") + @Mapping(source = "hunter.experience", target = "hunter_xp") + @Mapping(source = "construction.experience", target = "construction_xp") + + @Mapping(source = "overall.rank", target = "overall_rank") + @Mapping(source = "attack.rank", target = "attack_rank") + @Mapping(source = "defence.rank", target = "defence_rank") + @Mapping(source = "strength.rank", target = "strength_rank") + @Mapping(source = "hitpoints.rank", target = "hitpoints_rank") + @Mapping(source = "ranged.rank", target = "ranged_rank") + @Mapping(source = "prayer.rank", target = "prayer_rank") + @Mapping(source = "magic.rank", target = "magic_rank") + @Mapping(source = "cooking.rank", target = "cooking_rank") + @Mapping(source = "woodcutting.rank", target = "woodcutting_rank") + @Mapping(source = "fletching.rank", target = "fletching_rank") + @Mapping(source = "fishing.rank", target = "fishing_rank") + @Mapping(source = "firemaking.rank", target = "firemaking_rank") + @Mapping(source = "crafting.rank", target = "crafting_rank") + @Mapping(source = "smithing.rank", target = "smithing_rank") + @Mapping(source = "mining.rank", target = "mining_rank") + @Mapping(source = "herblore.rank", target = "herblore_rank") + @Mapping(source = "agility.rank", target = "agility_rank") + @Mapping(source = "thieving.rank", target = "thieving_rank") + @Mapping(source = "slayer.rank", target = "slayer_rank") + @Mapping(source = "farming.rank", target = "farming_rank") + @Mapping(source = "runecraft.rank", target = "runecraft_rank") + @Mapping(source = "hunter.rank", target = "hunter_rank") + @Mapping(source = "construction.rank", target = "construction_rank") + XpData hiscoreResultToXpData(HiscoreResult hiscoreResult); } diff --git a/http-service/src/main/java/net/runelite/http/service/xp/XpTrackerService.java b/http-service/src/main/java/net/runelite/http/service/xp/XpTrackerService.java index 7e79f1de80..bd97ae9b00 100644 --- a/http-service/src/main/java/net/runelite/http/service/xp/XpTrackerService.java +++ b/http-service/src/main/java/net/runelite/http/service/xp/XpTrackerService.java @@ -26,8 +26,10 @@ package net.runelite.http.service.xp; import java.io.IOException; import java.time.Instant; +import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.hiscore.HiscoreEndpoint; import net.runelite.http.api.hiscore.HiscoreResult; +import net.runelite.http.api.xp.XpData; import net.runelite.http.service.hiscore.HiscoreResultBuilder; import net.runelite.http.service.hiscore.HiscoreService; import net.runelite.http.service.xp.beans.PlayerEntity; @@ -39,6 +41,7 @@ import org.sql2o.Connection; import org.sql2o.Sql2o; @Service +@Slf4j public class XpTrackerService { @Autowired @@ -61,6 +64,19 @@ public class XpTrackerService { PlayerEntity playerEntity = findOrCreatePlayer(username); + XpEntity currentXp = findXpAtTime(username, Instant.now()); + if (currentXp != null) + { + XpData hiscoreData = XpMapper.INSTANCE.hiscoreResultToXpData(hiscoreResult); + XpData existingData = XpMapper.INSTANCE.xpEntityToXpData(currentXp); + + if (hiscoreData.equals(existingData)) + { + log.debug("Hiscore for {} already up to date", username); + return; + } + } + con.createQuery("insert into xp (player,attack_xp,defence_xp,strength_xp,hitpoints_xp,ranged_xp,prayer_xp,magic_xp,cooking_xp,woodcutting_xp," + "fletching_xp,fishing_xp,firemaking_xp,crafting_xp,smithing_xp,mining_xp,herblore_xp,agility_xp,thieving_xp,slayer_xp,farming_xp," + "runecraft_xp,hunter_xp,construction_xp,attack_rank,defence_rank,strength_rank,hitpoints_rank,ranged_rank,prayer_rank,magic_rank," diff --git a/http-service/src/test/java/net/runelite/http/service/xp/XpMapperTest.java b/http-service/src/test/java/net/runelite/http/service/xp/XpMapperTest.java new file mode 100644 index 0000000000..f337cb635d --- /dev/null +++ b/http-service/src/test/java/net/runelite/http/service/xp/XpMapperTest.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.service.xp; + +import net.runelite.http.api.hiscore.HiscoreResult; +import net.runelite.http.api.hiscore.Skill; +import net.runelite.http.api.xp.XpData; +import net.runelite.http.service.xp.beans.XpEntity; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class XpMapperTest +{ + @Test + public void testXpEntityToXpData() + { + XpEntity xpEntity = new XpEntity(); + xpEntity.setAgility_rank(42); + xpEntity.setAgility_xp(9001); + + XpData xpData = XpMapper.INSTANCE.xpEntityToXpData(xpEntity); + assertEquals(42, xpData.getAgility_rank()); + assertEquals(9001, xpData.getAgility_xp()); + } + + @Test + public void testHiscoreResultToXpData() + { + HiscoreResult hiscoreResult = new HiscoreResult(); + hiscoreResult.setAgility(new Skill(42, 9, 9001)); + + XpData xpData = XpMapper.INSTANCE.hiscoreResultToXpData(hiscoreResult); + assertEquals(42, xpData.getAgility_rank()); + assertEquals(9001, xpData.getAgility_xp()); + } + +}