diff --git a/src/main/java/dinkplugin/DinkPlugin.java b/src/main/java/dinkplugin/DinkPlugin.java index fe07a109..f85ce544 100644 --- a/src/main/java/dinkplugin/DinkPlugin.java +++ b/src/main/java/dinkplugin/DinkPlugin.java @@ -24,6 +24,7 @@ import dinkplugin.notifiers.LeaguesNotifier; import dinkplugin.util.AccountTypeTracker; import dinkplugin.util.KillCountService; +import dinkplugin.util.SlayerService; import dinkplugin.util.Utils; import dinkplugin.util.WorldTypeTracker; import lombok.extern.slf4j.Slf4j; @@ -86,6 +87,7 @@ public class DinkPlugin extends Plugin { private @Inject WorldTypeTracker worldTracker; private @Inject KillCountService killCountService; + private @Inject SlayerService slayerService; private @Inject CollectionNotifier collectionNotifier; private @Inject PetNotifier petNotifier; @@ -145,6 +147,7 @@ protected void shutDown() { accountTracker.clear(); worldTracker.clear(); metaNotifier.reset(); + slayerService.reset(); } void resetNotifiers() { @@ -263,6 +266,7 @@ public void onChatMessage(ChatMessage message) { return; } + slayerService.onGameMessage(chatMessage); collectionNotifier.onChatMessage(chatMessage); lootNotifier.onGameMessage(chatMessage); petNotifier.onChatMessage(chatMessage); @@ -319,6 +323,7 @@ public void onActorDeath(ActorDeath actor) { @Subscribe public void onInteractingChanged(InteractingChanged event) { deathNotifier.onInteraction(event); + slayerService.onInteraction(event); } @Subscribe diff --git a/src/main/java/dinkplugin/notifiers/LootNotifier.java b/src/main/java/dinkplugin/notifiers/LootNotifier.java index 1f1ed0a2..5d928cd2 100644 --- a/src/main/java/dinkplugin/notifiers/LootNotifier.java +++ b/src/main/java/dinkplugin/notifiers/LootNotifier.java @@ -12,12 +12,14 @@ import dinkplugin.notifiers.data.LootNotificationData; import dinkplugin.notifiers.data.RareItemStack; import dinkplugin.notifiers.data.SerializedItemStack; +import dinkplugin.notifiers.data.SlayerMetadata; import dinkplugin.util.ConfigUtil; import dinkplugin.util.ItemUtils; import dinkplugin.util.KillCountService; import dinkplugin.util.MathUtils; -import dinkplugin.util.ThievingService; import dinkplugin.util.RarityService; +import dinkplugin.util.SlayerService; +import dinkplugin.util.ThievingService; import dinkplugin.util.Utils; import dinkplugin.util.WorldUtils; import lombok.extern.slf4j.Slf4j; @@ -63,6 +65,9 @@ public class LootNotifier extends BaseNotifier { @Inject private RarityService rarityService; + @Inject + private SlayerService slayerService; + @Inject private ThievingService thievingService; @@ -303,6 +308,13 @@ private void handleNotify(Collection items, String dropper, LootRecor .orElse(null); } + Boolean onTask = type == LootRecordType.NPC && slayerService.isTaskActive().filter(b -> b).isPresent() + ? slayerService.getTargetName().filter(dropper::equals).isPresent() + : null; + SlayerMetadata slayerMetadata = onTask != null + ? SlayerMetadata.from(onTask, slayerService.getRuneliteService()) + : null; + String overrideUrl = getWebhookUrl(); if (config.lootRedirectPlayerKill() && !config.pkWebhook().isBlank()) { if (type == LootRecordType.PLAYER || (type == LootRecordType.EVENT && "Loot Chest".equals(dropper))) { @@ -328,7 +340,7 @@ private void handleNotify(Collection items, String dropper, LootRecor NotificationBody.builder() .text(notifyMessage) .embeds(embeds) - .extra(new LootNotificationData(serializedItems, dropper, type, kc, rarity, party, npcId)) + .extra(new LootNotificationData(serializedItems, dropper, type, kc, rarity, party, npcId, slayerMetadata)) .type(NotificationType.LOOT) .thumbnailUrl(ItemUtils.getItemImageUrl(max.getId())) .build() diff --git a/src/main/java/dinkplugin/notifiers/SlayerNotifier.java b/src/main/java/dinkplugin/notifiers/SlayerNotifier.java index 59a0fa2d..d90c229d 100644 --- a/src/main/java/dinkplugin/notifiers/SlayerNotifier.java +++ b/src/main/java/dinkplugin/notifiers/SlayerNotifier.java @@ -11,23 +11,20 @@ import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.VisibleForTesting; import javax.inject.Singleton; import java.util.Optional; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Matcher; -import java.util.regex.Pattern; + +import static dinkplugin.util.SlayerService.BOSS_REGEX; +import static dinkplugin.util.SlayerService.SLAYER_COMPLETE_REGEX; +import static dinkplugin.util.SlayerService.SLAYER_TASK_REGEX; +import static dinkplugin.util.SlayerService.TASK_MONSTER_REGEX; @Singleton public class SlayerNotifier extends BaseNotifier { - private static final Pattern BOSS_REGEX = Pattern.compile("You are granted .+ Slayer XP for completing your boss task against(?: the)? (?.+)\\.$"); - @VisibleForTesting - static final Pattern SLAYER_TASK_REGEX = Pattern.compile("You have completed your task! You killed (?[\\d,]+ [^.]+)\\..*"); - private static final Pattern SLAYER_COMPLETE_REGEX = Pattern.compile("You've completed (?:at least )?(?[\\d,]+) (?:Wilderness )?tasks?(?: and received (?[\\d,]+) points, giving you a total of [\\d,]+|\\.You'll be eligible to earn reward points if you complete tasks from a more advanced Slayer Master\\.| and reached the maximum amount of Slayer points \\((?[\\d,]+)\\))?"); - private static final Pattern TASK_MONSTER_REGEX = Pattern.compile("^(?\\d*)\\s*(?.+)$"); - private final AtomicReference slayerTask = new AtomicReference<>(""); private final AtomicInteger badTicks = new AtomicInteger(); // used to prevent notifs from using stale data diff --git a/src/main/java/dinkplugin/notifiers/data/LootNotificationData.java b/src/main/java/dinkplugin/notifiers/data/LootNotificationData.java index 5f5f642b..a7b57c5e 100644 --- a/src/main/java/dinkplugin/notifiers/data/LootNotificationData.java +++ b/src/main/java/dinkplugin/notifiers/data/LootNotificationData.java @@ -34,9 +34,12 @@ public class LootNotificationData extends NotificationData { @Nullable Integer npcId; + @Nullable + SlayerMetadata slayerMetadata; + @Override public List getFields() { - List fields = new ArrayList<>(4); + List fields = new ArrayList<>(5); if (killCount != null) { fields.add( new Field( @@ -57,6 +60,10 @@ public List getFields() { if (party != null && !party.isEmpty()) { fields.add(new Field("Party Size", Field.formatBlock("", String.valueOf(party.size())))); } + if (slayerMetadata != null) { + String slayerStatus = slayerMetadata.isOnTask() ? "On Task" : "Not on task"; + fields.add(new Field("Slayer Status", Field.formatBlock("", slayerStatus))); + } return fields; } diff --git a/src/main/java/dinkplugin/notifiers/data/SlayerMetadata.java b/src/main/java/dinkplugin/notifiers/data/SlayerMetadata.java new file mode 100644 index 00000000..be4bea68 --- /dev/null +++ b/src/main/java/dinkplugin/notifiers/data/SlayerMetadata.java @@ -0,0 +1,28 @@ +package dinkplugin.notifiers.data; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import net.runelite.client.plugins.slayer.SlayerPluginService; +import org.jetbrains.annotations.Nullable; + +@Data +@Setter(AccessLevel.NONE) +@RequiredArgsConstructor +@AllArgsConstructor +public class SlayerMetadata { + private final boolean onTask; + private @Nullable String task; + private @Nullable String taskLocation; + private @Nullable Integer initialAmount; + private @Nullable Integer remainingAmount; + + public static SlayerMetadata from(boolean onTask, SlayerPluginService service) { + if (!onTask) { + return new SlayerMetadata(false); + } + return new SlayerMetadata(true, service.getTask(), service.getTaskLocation(), service.getInitialAmount(), service.getRemainingAmount()); + } +} diff --git a/src/main/java/dinkplugin/util/SlayerService.java b/src/main/java/dinkplugin/util/SlayerService.java new file mode 100644 index 00000000..ea83cbf0 --- /dev/null +++ b/src/main/java/dinkplugin/util/SlayerService.java @@ -0,0 +1,82 @@ +package dinkplugin.util; + +import lombok.Getter; +import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.events.InteractingChanged; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.plugins.slayer.SlayerPlugin; +import net.runelite.client.plugins.slayer.SlayerPluginService; +import org.apache.commons.lang3.StringUtils; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.lang.ref.WeakReference; +import java.util.Optional; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; + +@Singleton +public class SlayerService { + + public static final Pattern BOSS_REGEX = Pattern.compile("You are granted .+ Slayer XP for completing your boss task against(?: the)? (?.+)\\.$"); + public static final Pattern SLAYER_TASK_REGEX = Pattern.compile("You have completed your task! You killed (?[\\d,]+ [^.]+)\\..*"); + public static final Pattern SLAYER_COMPLETE_REGEX = Pattern.compile("You've completed (?:at least )?(?[\\d,]+) (?:Wilderness )?tasks?(?: and received (?[\\d,]+) points, giving you a total of [\\d,]+|\\.You'll be eligible to earn reward points if you complete tasks from a more advanced Slayer Master\\.| and reached the maximum amount of Slayer points \\((?[\\d,]+)\\))?"); + public static final Pattern TASK_MONSTER_REGEX = Pattern.compile("^(?\\d*)\\s*(?.+)$"); + + private static final String RL_PLUGIN_CLASS_NAME = SlayerPlugin.class.getSimpleName().toLowerCase(); + + @Inject + private Client client; + + @Inject + private ConfigManager configManager; + + @Getter + @Inject + private SlayerPluginService runeliteService; + + @Inject + private ScheduledExecutorService executor; + + private boolean hasTask = false; + private WeakReference slayerTarget = new WeakReference<>(null); + + public void reset() { + this.hasTask = false; + this.slayerTarget.clear(); + } + + public void onGameMessage(String chatMessage) { + if (SLAYER_TASK_REGEX.matcher(chatMessage).matches() || SLAYER_COMPLETE_REGEX.matcher(chatMessage).matches()) { + executor.schedule(this::reset, 30, TimeUnit.SECONDS); + } + } + + public void onInteraction(InteractingChanged event) { + if (event.getSource() != client.getLocalPlayer()) return; + if (!(event.getTarget() instanceof NPC)) return; + + this.hasTask = StringUtils.isNotEmpty(runeliteService.getTask()); + if (!hasTask) return; + + NPC npc = (NPC) event.getTarget(); + if (runeliteService.getTargets().contains(npc)) { + this.slayerTarget = new WeakReference<>(npc); + } + } + + public Optional isTaskActive() { + return ConfigUtil.isPluginDisabled(configManager, RL_PLUGIN_CLASS_NAME) + ? Optional.empty() + : Optional.of(this.hasTask); + } + + public Optional getTargetName() { + NPC npc = slayerTarget.get(); + if (npc == null) return Optional.empty(); + return Optional.ofNullable(npc.getName()); + } + +} diff --git a/src/test/java/dinkplugin/notifiers/LootNotifierTest.java b/src/test/java/dinkplugin/notifiers/LootNotifierTest.java index 7b11d2ed..ead052cf 100644 --- a/src/test/java/dinkplugin/notifiers/LootNotifierTest.java +++ b/src/test/java/dinkplugin/notifiers/LootNotifierTest.java @@ -120,7 +120,7 @@ void testNotifyNpc() { .replacement("{{source}}", Replacements.ofWiki(name)) .build() ) - .extra(new LootNotificationData(Collections.singletonList(new AnnotatedItemStack(ItemID.RUBY, 1, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE))), name, LootRecordType.NPC, kc + 1, null, null, 9999)) + .extra(new LootNotificationData(Collections.singletonList(new AnnotatedItemStack(ItemID.RUBY, 1, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE))), name, LootRecordType.NPC, kc + 1, null, null, 9999, null)) .type(NotificationType.LOOT) .build() ); @@ -158,7 +158,7 @@ void testNotifyNpcRarity() { .replacement("{{source}}", Replacements.ofWiki(name)) .build() ) - .extra(new LootNotificationData(List.of(new RareItemStack(ItemID.SLAYER_WILDERNESS_KEY, 1, LARRAN_PRICE, "Larran's key", criteria, rarity)), name, LootRecordType.NPC, 1, rarity, null, NpcID.ICE_SPIDER)) + .extra(new LootNotificationData(List.of(new RareItemStack(ItemID.SLAYER_WILDERNESS_KEY, 1, LARRAN_PRICE, "Larran's key", criteria, rarity)), name, LootRecordType.NPC, 1, rarity, null, NpcID.ICE_SPIDER, null)) .type(NotificationType.LOOT) .thumbnailUrl(ItemUtils.getItemImageUrl(ItemID.SLAYER_WILDERNESS_KEY)) .build() @@ -231,7 +231,7 @@ void testNotifyAllowlist() { .replacement("{{source}}", Replacements.ofLink(LOOTED_NAME, config.playerLookupService().getPlayerUrl(LOOTED_NAME))) .build() ) - .extra(new LootNotificationData(Collections.singletonList(new AnnotatedItemStack(ItemID.TUNA, 1, TUNA_PRICE, "Tuna", EnumSet.of(LootCriteria.ALLOWLIST))), LOOTED_NAME, LootRecordType.PLAYER, 1, null, null, null)) + .extra(new LootNotificationData(Collections.singletonList(new AnnotatedItemStack(ItemID.TUNA, 1, TUNA_PRICE, "Tuna", EnumSet.of(LootCriteria.ALLOWLIST))), LOOTED_NAME, LootRecordType.PLAYER, 1, null, null, null, null)) .type(NotificationType.LOOT) .build() ); @@ -260,7 +260,7 @@ void testNotifyAllowlistWildcard() { .replacement("{{source}}", Replacements.ofLink(LOOTED_NAME, config.playerLookupService().getPlayerUrl(LOOTED_NAME))) .build() ) - .extra(new LootNotificationData(Collections.singletonList(new AnnotatedItemStack(ItemID.TUNA, 1, TUNA_PRICE, "Tuna", EnumSet.of(LootCriteria.ALLOWLIST))), LOOTED_NAME, LootRecordType.PLAYER, 1, null, null, null)) + .extra(new LootNotificationData(Collections.singletonList(new AnnotatedItemStack(ItemID.TUNA, 1, TUNA_PRICE, "Tuna", EnumSet.of(LootCriteria.ALLOWLIST))), LOOTED_NAME, LootRecordType.PLAYER, 1, null, null, null, null)) .type(NotificationType.LOOT) .build() ); @@ -326,7 +326,7 @@ void testNotifyWhisperer() { .replacement("{{source}}", Replacements.ofWiki(name)) .build() ) - .extra(new LootNotificationData(Collections.singletonList(new AnnotatedItemStack(ItemID.RUBY, 1, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE))), name, LootRecordType.NPC, 1, null, null, NpcID.WHISPERER)) + .extra(new LootNotificationData(Collections.singletonList(new AnnotatedItemStack(ItemID.RUBY, 1, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE))), name, LootRecordType.NPC, 1, null, null, NpcID.WHISPERER, null)) .type(NotificationType.LOOT) .build() ); @@ -389,7 +389,7 @@ void testNotifyPickpocket() { .replacement("{{source}}", Replacements.ofWiki(name)) .build() ) - .extra(new LootNotificationData(Collections.singletonList(new RareItemStack(ItemID.BLOOD_SHARD, 1, SHARD_PRICE, "Blood shard", EnumSet.of(LootCriteria.VALUE), rarity)), name, LootRecordType.PICKPOCKET, 1, rarity, null, NpcID.REMUS_KANINUS)) + .extra(new LootNotificationData(Collections.singletonList(new RareItemStack(ItemID.BLOOD_SHARD, 1, SHARD_PRICE, "Blood shard", EnumSet.of(LootCriteria.VALUE), rarity)), name, LootRecordType.PICKPOCKET, 1, rarity, null, NpcID.REMUS_KANINUS, null)) .type(NotificationType.LOOT) .build() ); @@ -427,7 +427,7 @@ void testNotifyClue() { .replacement("{{source}}", Replacements.ofWiki(source)) .build() ) - .extra(new LootNotificationData(Collections.singletonList(new AnnotatedItemStack(ItemID.RUBY, 1, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE))), source, LootRecordType.EVENT, 42, null, null, null)) + .extra(new LootNotificationData(Collections.singletonList(new AnnotatedItemStack(ItemID.RUBY, 1, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE))), source, LootRecordType.EVENT, 42, null, null, null, null)) .type(NotificationType.LOOT) .build() ); @@ -470,7 +470,7 @@ void testNotifyPlayer() { .replacement("{{source}}", Replacements.ofLink(LOOTED_NAME, config.playerLookupService().getPlayerUrl(LOOTED_NAME))) .build() ) - .extra(new LootNotificationData(Arrays.asList(new AnnotatedItemStack(ItemID.RUBY, 1, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE)), new AnnotatedItemStack(ItemID.TUNA, 1, TUNA_PRICE, "Tuna", EnumSet.noneOf(LootCriteria.class))), LOOTED_NAME, LootRecordType.PLAYER, 1, null, null, null)) + .extra(new LootNotificationData(Arrays.asList(new AnnotatedItemStack(ItemID.RUBY, 1, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE)), new AnnotatedItemStack(ItemID.TUNA, 1, TUNA_PRICE, "Tuna", EnumSet.noneOf(LootCriteria.class))), LOOTED_NAME, LootRecordType.PLAYER, 1, null, null, null, null)) .type(NotificationType.LOOT) .build() ); @@ -501,7 +501,7 @@ void testNotifyPlayerForwarded() { .replacement("{{source}}", Replacements.ofLink(LOOTED_NAME, config.playerLookupService().getPlayerUrl(LOOTED_NAME))) .build() ) - .extra(new LootNotificationData(Arrays.asList(new AnnotatedItemStack(ItemID.RUBY, 1, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE)), new AnnotatedItemStack(ItemID.TUNA, 1, TUNA_PRICE, "Tuna", EnumSet.noneOf(LootCriteria.class))), LOOTED_NAME, LootRecordType.PLAYER, 1, null, null, null)) + .extra(new LootNotificationData(Arrays.asList(new AnnotatedItemStack(ItemID.RUBY, 1, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE)), new AnnotatedItemStack(ItemID.TUNA, 1, TUNA_PRICE, "Tuna", EnumSet.noneOf(LootCriteria.class))), LOOTED_NAME, LootRecordType.PLAYER, 1, null, null, null, null)) .type(NotificationType.LOOT) .build() ); @@ -531,7 +531,7 @@ void testNotifyPlayerForwardBlank() { .replacement("{{source}}", Replacements.ofLink(LOOTED_NAME, config.playerLookupService().getPlayerUrl(LOOTED_NAME))) .build() ) - .extra(new LootNotificationData(Arrays.asList(new AnnotatedItemStack(ItemID.RUBY, 1, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE)), new AnnotatedItemStack(ItemID.TUNA, 1, TUNA_PRICE, "Tuna", EnumSet.noneOf(LootCriteria.class))), LOOTED_NAME, LootRecordType.PLAYER, 1, null, null, null)) + .extra(new LootNotificationData(Arrays.asList(new AnnotatedItemStack(ItemID.RUBY, 1, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE)), new AnnotatedItemStack(ItemID.TUNA, 1, TUNA_PRICE, "Tuna", EnumSet.noneOf(LootCriteria.class))), LOOTED_NAME, LootRecordType.PLAYER, 1, null, null, null, null)) .type(NotificationType.LOOT) .build() ); @@ -563,7 +563,7 @@ void testNotifyPkChest() { .replacement("{{source}}", Replacements.ofWiki(source)) .build() ) - .extra(new LootNotificationData(List.of(new AnnotatedItemStack(ItemID.OPAL, 1, OPAL_PRICE, "Opal", EnumSet.noneOf(LootCriteria.class)), new AnnotatedItemStack(ItemID.TUNA, 2, TUNA_PRICE, "Tuna", EnumSet.noneOf(LootCriteria.class))), source, LootRecordType.EVENT, 1, null, null, null)) + .extra(new LootNotificationData(List.of(new AnnotatedItemStack(ItemID.OPAL, 1, OPAL_PRICE, "Opal", EnumSet.noneOf(LootCriteria.class)), new AnnotatedItemStack(ItemID.TUNA, 2, TUNA_PRICE, "Tuna", EnumSet.noneOf(LootCriteria.class))), source, LootRecordType.EVENT, 1, null, null, null, null)) .type(NotificationType.LOOT) .thumbnailUrl(ItemUtils.getItemImageUrl(ItemID.TUNA)) .build() @@ -633,7 +633,7 @@ void testNotifyMultiple() { .replacement("{{source}}", Replacements.ofWiki(LOOTED_NAME)) .build() ) - .extra(new LootNotificationData(Arrays.asList(new AnnotatedItemStack(ItemID.RUBY, 1, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE)), new AnnotatedItemStack(ItemID.OPAL, 1, OPAL_PRICE, "Opal", EnumSet.of(LootCriteria.VALUE)), new AnnotatedItemStack(ItemID.TUNA, 1, TUNA_PRICE, "Tuna", EnumSet.noneOf(LootCriteria.class))), LOOTED_NAME, LootRecordType.EVENT, 1, null, null, null)) + .extra(new LootNotificationData(Arrays.asList(new AnnotatedItemStack(ItemID.RUBY, 1, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE)), new AnnotatedItemStack(ItemID.OPAL, 1, OPAL_PRICE, "Opal", EnumSet.of(LootCriteria.VALUE)), new AnnotatedItemStack(ItemID.TUNA, 1, TUNA_PRICE, "Tuna", EnumSet.noneOf(LootCriteria.class))), LOOTED_NAME, LootRecordType.EVENT, 1, null, null, null, null)) .type(NotificationType.LOOT) .build() ); @@ -671,7 +671,7 @@ void testNotifyRepeated() { .replacement("{{source}}", Replacements.ofWiki(LOOTED_NAME)) .build() ) - .extra(new LootNotificationData(Collections.singletonList(new AnnotatedItemStack(ItemID.TUNA, 5, TUNA_PRICE, "Tuna", EnumSet.of(LootCriteria.VALUE))), LOOTED_NAME, LootRecordType.EVENT, 1, null, null, null)) + .extra(new LootNotificationData(Collections.singletonList(new AnnotatedItemStack(ItemID.TUNA, 5, TUNA_PRICE, "Tuna", EnumSet.of(LootCriteria.VALUE))), LOOTED_NAME, LootRecordType.EVENT, 1, null, null, null, null)) .type(NotificationType.LOOT) .build() ); @@ -726,7 +726,7 @@ void testNotifyGauntlet() { .replacement("{{source}}", Replacements.ofWiki(realSource)) .build() ) - .extra(new LootNotificationData(List.of(new AnnotatedItemStack(ItemID.RUBY, quantity, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE))), realSource, LootRecordType.EVENT, kc, null, null, null)) + .extra(new LootNotificationData(List.of(new AnnotatedItemStack(ItemID.RUBY, quantity, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE))), realSource, LootRecordType.EVENT, kc, null, null, null, null)) .type(NotificationType.LOOT) .build() ); @@ -759,7 +759,7 @@ void testNotifyCorruptedGauntlet() { .replacement("{{source}}", Replacements.ofWiki(realSource)) .build() ) - .extra(new LootNotificationData(List.of(new AnnotatedItemStack(ItemID.RUBY, quantity, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE))), realSource, LootRecordType.EVENT, kc, null, null, null)) + .extra(new LootNotificationData(List.of(new AnnotatedItemStack(ItemID.RUBY, quantity, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE))), realSource, LootRecordType.EVENT, kc, null, null, null, null)) .type(NotificationType.LOOT) .build() ); @@ -790,7 +790,7 @@ void testNotifyAmascut() { .replacement("{{source}}", Replacements.ofWiki(source)) .build() ) - .extra(new LootNotificationData(List.of(new AnnotatedItemStack(ItemID.RUBY, quantity, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE))), source, LootRecordType.EVENT, kc, null, null, null)) + .extra(new LootNotificationData(List.of(new AnnotatedItemStack(ItemID.RUBY, quantity, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE))), source, LootRecordType.EVENT, kc, null, null, null, null)) .type(NotificationType.LOOT) .build() ); @@ -821,7 +821,7 @@ void testNotifyAmascutExpert() { .replacement("{{source}}", Replacements.ofWiki(source)) .build() ) - .extra(new LootNotificationData(List.of(new AnnotatedItemStack(ItemID.RUBY, quantity, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE))), source, LootRecordType.EVENT, kc, null, null, null)) + .extra(new LootNotificationData(List.of(new AnnotatedItemStack(ItemID.RUBY, quantity, RUBY_PRICE, "Ruby", EnumSet.of(LootCriteria.VALUE))), source, LootRecordType.EVENT, kc, null, null, null, null)) .type(NotificationType.LOOT) .build() ); @@ -848,7 +848,7 @@ void testNotifyPharaohSceptre() { .replacement("{{source}}", Replacements.ofWiki(source)) .build() ) - .extra(new LootNotificationData(List.of(new AnnotatedItemStack(ItemID.PHARAOHS_SCEPTRE, 1, SCEPTRE_PRICE, "Pharaoh's sceptre", EnumSet.of(LootCriteria.VALUE))), source, LootRecordType.EVENT, null, null, null, null)) + .extra(new LootNotificationData(List.of(new AnnotatedItemStack(ItemID.PHARAOHS_SCEPTRE, 1, SCEPTRE_PRICE, "Pharaoh's sceptre", EnumSet.of(LootCriteria.VALUE))), source, LootRecordType.EVENT, null, null, null, null, null)) .type(NotificationType.LOOT) .build() ); @@ -887,7 +887,7 @@ void testNotifyRarityValueIntersectionValue() { .replacement("{{source}}", Replacements.ofWiki(name)) .build() ) - .extra(new LootNotificationData(List.of(new RareItemStack(ItemID.SLAYER_WILDERNESS_KEY, 1, LARRAN_PRICE, "Larran's key", criteria, rarity)), name, LootRecordType.NPC, 1, rarity, null, NpcID.ICE_SPIDER)) + .extra(new LootNotificationData(List.of(new RareItemStack(ItemID.SLAYER_WILDERNESS_KEY, 1, LARRAN_PRICE, "Larran's key", criteria, rarity)), name, LootRecordType.NPC, 1, rarity, null, NpcID.ICE_SPIDER, null)) .type(NotificationType.LOOT) .thumbnailUrl(ItemUtils.getItemImageUrl(ItemID.SLAYER_WILDERNESS_KEY)) .build() diff --git a/src/test/java/dinkplugin/notifiers/MatchersTest.java b/src/test/java/dinkplugin/notifiers/MatchersTest.java index 85c56bd5..2c5a5cea 100644 --- a/src/test/java/dinkplugin/notifiers/MatchersTest.java +++ b/src/test/java/dinkplugin/notifiers/MatchersTest.java @@ -1,5 +1,6 @@ package dinkplugin.notifiers; +import dinkplugin.util.SlayerService; import org.apache.commons.lang3.tuple.Pair; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; @@ -21,7 +22,7 @@ class MatchersTest { @ParameterizedTest(name = "Slayer task completion message should trigger {0}") @ArgumentsSource(SlayerTaskProvider.class) void slayerTaskCompletionRegexFindsMatch(String message, String task) { - Matcher matcher = SlayerNotifier.SLAYER_TASK_REGEX.matcher(message); + Matcher matcher = SlayerService.SLAYER_TASK_REGEX.matcher(message); assertTrue(matcher.find()); assertEquals(task, matcher.group("task")); } @@ -35,7 +36,7 @@ void slayerTaskCompletionRegexFindsMatch(String message, String task) { } ) void slayerTaskCompletionRegexDoesNotMatch(String message) { - Matcher matcher = SlayerNotifier.SLAYER_TASK_REGEX.matcher(message); + Matcher matcher = SlayerService.SLAYER_TASK_REGEX.matcher(message); assertFalse(matcher.find()); } diff --git a/src/test/java/dinkplugin/notifiers/MockedNotifierTest.java b/src/test/java/dinkplugin/notifiers/MockedNotifierTest.java index 53aa7669..6b44cb20 100644 --- a/src/test/java/dinkplugin/notifiers/MockedNotifierTest.java +++ b/src/test/java/dinkplugin/notifiers/MockedNotifierTest.java @@ -37,6 +37,7 @@ import net.runelite.client.discord.DiscordService; import net.runelite.client.game.ItemManager; import net.runelite.client.game.NPCManager; +import net.runelite.client.plugins.slayer.SlayerPluginService; import net.runelite.client.ui.DrawManager; import net.runelite.client.util.ImageCapture; import net.runelite.http.api.RuneLiteAPI; @@ -94,6 +95,9 @@ abstract class MockedNotifierTest extends MockedTestBase { @Bind protected DiscordService discordService = Mockito.mock(DiscordService.class); + @Bind + protected SlayerPluginService slayerPluginService = Mockito.mock(SlayerPluginService.class); + @Bind protected ChatMessageManager chatManager = Mockito.mock(ChatMessageManager.class);