From 92bb58367e7c12bba4261db56708418efeb3215e Mon Sep 17 00:00:00 2001 From: Tom Bolks Date: Sat, 12 Nov 2022 21:31:04 +0100 Subject: [PATCH 01/15] Added a simple test for collection log regex. Fixed regex now works with ' and () in item names. --- .../notifiers/CollectionNotifier.java | 2 +- .../CollectionNotifierTest.java | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 src/test/java/universalDiscord/CollectionNotifierTest.java diff --git a/src/main/java/universalDiscord/notifiers/CollectionNotifier.java b/src/main/java/universalDiscord/notifiers/CollectionNotifier.java index 4e1e19c..4cc76c0 100644 --- a/src/main/java/universalDiscord/notifiers/CollectionNotifier.java +++ b/src/main/java/universalDiscord/notifiers/CollectionNotifier.java @@ -12,7 +12,7 @@ import java.util.regex.Pattern; public class CollectionNotifier extends BaseNotifier implements ChatMessageHandler { - private static final Pattern COLLECTION_LOG_REGEX = Pattern.compile("New item added to your collection log: (?[\\w,\\s-.]+)"); + public static final Pattern COLLECTION_LOG_REGEX = Pattern.compile("New item added to your collection log: (?[\\w,\\s-.'()]+)"); private Matcher lastMatcher; diff --git a/src/test/java/universalDiscord/CollectionNotifierTest.java b/src/test/java/universalDiscord/CollectionNotifierTest.java new file mode 100644 index 0000000..2de1ae3 --- /dev/null +++ b/src/test/java/universalDiscord/CollectionNotifierTest.java @@ -0,0 +1,38 @@ +package universalDiscord; + +import org.junit.Test; +import universalDiscord.notifiers.CollectionNotifier; + +import java.util.regex.Matcher; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + + +public class CollectionNotifierTest { + + + @Test + public void testCollectionLogRegex() { + String[] itemNames = { + "Xerics talisman", + "Jar of miasma", + "Saradomin's light", + "Craw's bow", + "Thammaron's sceptre", + "Chompy bird hat (ogre yeoman)", + "Robe bottoms of the eye", + "Bucket helm (g)", + "Black d'hide body (g)", + "Tzhaar-ket-om ornament kit", + }; + + for (String itemName : itemNames) { + String chatLine = "New item added to your collection log: " + itemName; + Matcher matcher = CollectionNotifier.COLLECTION_LOG_REGEX.matcher(chatLine); + boolean finds = matcher.find(); + assertTrue(finds); + assertEquals(itemName, matcher.group("itemName")); + } + } +} From 2b074c7544c170d893072e811e4152741ffa0964 Mon Sep 17 00:00:00 2001 From: Tom Bolks Date: Sat, 12 Nov 2022 21:35:26 +0100 Subject: [PATCH 02/15] Fixed Xeric talisman in test --- src/test/java/universalDiscord/CollectionNotifierTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/universalDiscord/CollectionNotifierTest.java b/src/test/java/universalDiscord/CollectionNotifierTest.java index 2de1ae3..20840d7 100644 --- a/src/test/java/universalDiscord/CollectionNotifierTest.java +++ b/src/test/java/universalDiscord/CollectionNotifierTest.java @@ -15,7 +15,7 @@ public class CollectionNotifierTest { @Test public void testCollectionLogRegex() { String[] itemNames = { - "Xerics talisman", + "Xeric's talisman (inert)", "Jar of miasma", "Saradomin's light", "Craw's bow", From eb96a488e41449840d61489d2100b44475286f53 Mon Sep 17 00:00:00 2001 From: Tom Bolks Date: Sat, 12 Nov 2022 22:11:57 +0100 Subject: [PATCH 03/15] Fixed death notifcation when monster dies and has same name as the player. --- src/main/java/universalDiscord/notifiers/DeathNotifier.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/universalDiscord/notifiers/DeathNotifier.java b/src/main/java/universalDiscord/notifiers/DeathNotifier.java index 1f27b8b..688115e 100644 --- a/src/main/java/universalDiscord/notifiers/DeathNotifier.java +++ b/src/main/java/universalDiscord/notifiers/DeathNotifier.java @@ -1,5 +1,6 @@ package universalDiscord.notifiers; +import net.runelite.api.Player; import net.runelite.api.events.ActorDeath; import universalDiscord.UniversalDiscordPlugin; import universalDiscord.Utils; @@ -30,7 +31,8 @@ public void handleNotify() { public boolean shouldNotify() { return isEnabled() && lastActorDeath != null - && Objects.equals(lastActorDeath.getActor().getName(), Utils.getPlayerName()); + && lastActorDeath.getActor() instanceof Player + && Objects.equals(((Player) lastActorDeath.getActor()).getId(), plugin.client.getLocalPlayer().getId()); } @Override From 937d5ab6f69a69b2cde5828beca44bee51a7b08d Mon Sep 17 00:00:00 2001 From: Tom Bolks Date: Sat, 12 Nov 2022 22:35:41 +0100 Subject: [PATCH 04/15] moved some logic to it's own function --- .../universalDiscord/notifiers/DeathNotifier.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/universalDiscord/notifiers/DeathNotifier.java b/src/main/java/universalDiscord/notifiers/DeathNotifier.java index 688115e..860e9cd 100644 --- a/src/main/java/universalDiscord/notifiers/DeathNotifier.java +++ b/src/main/java/universalDiscord/notifiers/DeathNotifier.java @@ -30,9 +30,16 @@ public void handleNotify() { @Override public boolean shouldNotify() { return isEnabled() - && lastActorDeath != null - && lastActorDeath.getActor() instanceof Player - && Objects.equals(((Player) lastActorDeath.getActor()).getId(), plugin.client.getLocalPlayer().getId()); + && lastActorDeathIsLocalPlayer(); + } + + public boolean lastActorDeathIsLocalPlayer() { + if (lastActorDeath != null && lastActorDeath.getActor() instanceof Player) { + Player lastPlayerDeath = (Player) lastActorDeath.getActor(); + return Objects.equals(lastPlayerDeath.getId(), plugin.client.getLocalPlayer().getId()); + } + + return false; } @Override From 62d9ddf8116e54b3475b618643797ed9c956f609 Mon Sep 17 00:00:00 2001 From: Tom Bolks Date: Sat, 12 Nov 2022 22:42:18 +0100 Subject: [PATCH 05/15] Reduced the code a bit. --- src/main/java/universalDiscord/notifiers/DeathNotifier.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/universalDiscord/notifiers/DeathNotifier.java b/src/main/java/universalDiscord/notifiers/DeathNotifier.java index 860e9cd..4e95224 100644 --- a/src/main/java/universalDiscord/notifiers/DeathNotifier.java +++ b/src/main/java/universalDiscord/notifiers/DeathNotifier.java @@ -34,9 +34,8 @@ public boolean shouldNotify() { } public boolean lastActorDeathIsLocalPlayer() { - if (lastActorDeath != null && lastActorDeath.getActor() instanceof Player) { - Player lastPlayerDeath = (Player) lastActorDeath.getActor(); - return Objects.equals(lastPlayerDeath.getId(), plugin.client.getLocalPlayer().getId()); + if (lastActorDeath != null) { + return Objects.equals(lastActorDeath.getActor(), plugin.client.getLocalPlayer()); } return false; From b9aa32bf314bbee2b12194472f2b8dcef885ec15 Mon Sep 17 00:00:00 2001 From: Tom Bolks Date: Sat, 12 Nov 2022 23:05:34 +0100 Subject: [PATCH 06/15] Added config option to select a thumbnail for when player dies. --- src/main/java/universalDiscord/DeathThumbnail.java | 14 ++++++++++++++ .../universalDiscord/UniversalDiscordConfig.java | 13 ++++++++++++- .../universalDiscord/notifiers/DeathNotifier.java | 10 ++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/main/java/universalDiscord/DeathThumbnail.java diff --git a/src/main/java/universalDiscord/DeathThumbnail.java b/src/main/java/universalDiscord/DeathThumbnail.java new file mode 100644 index 0000000..faa109b --- /dev/null +++ b/src/main/java/universalDiscord/DeathThumbnail.java @@ -0,0 +1,14 @@ +package universalDiscord; + +public enum DeathThumbnail { + NONE(null), + DEATH("https://oldschool.runescape.wiki/images/Death.png"), + GRAVE("https://oldschool.runescape.wiki/images/Grave.png"), + ANGEL_GRAVE("https://oldschool.runescape.wiki/images/Grave_%28Angel%29.png"); + + public final String thumbnailUrl; + + DeathThumbnail(String thumbnailUrl) { + this.thumbnailUrl = thumbnailUrl; + } +} diff --git a/src/main/java/universalDiscord/UniversalDiscordConfig.java b/src/main/java/universalDiscord/UniversalDiscordConfig.java index 81e8d8e..12a9971 100644 --- a/src/main/java/universalDiscord/UniversalDiscordConfig.java +++ b/src/main/java/universalDiscord/UniversalDiscordConfig.java @@ -249,11 +249,22 @@ default boolean notifyDeath() { return false; } + @ConfigItem( + keyName = "deathThumbnail", + name = "Thumbnail to use", + description = "Send a thumbnail with the notification", + position = 2, + section = deathSection + ) + default DeathThumbnail deathThumbnail() { + return DeathThumbnail.DEATH; + } + @ConfigItem( keyName = "deathSendImage", name = "Send Image", description = "Send image with the notification", - position = 2, + position = 3, section = deathSection ) default boolean deathSendImage() { diff --git a/src/main/java/universalDiscord/notifiers/DeathNotifier.java b/src/main/java/universalDiscord/notifiers/DeathNotifier.java index 4e95224..5333e77 100644 --- a/src/main/java/universalDiscord/notifiers/DeathNotifier.java +++ b/src/main/java/universalDiscord/notifiers/DeathNotifier.java @@ -2,9 +2,11 @@ import net.runelite.api.Player; import net.runelite.api.events.ActorDeath; +import universalDiscord.DeathThumbnail; import universalDiscord.UniversalDiscordPlugin; import universalDiscord.Utils; import universalDiscord.message.MessageBuilder; +import universalDiscord.message.discord.Image; import javax.inject.Inject; import java.util.Objects; @@ -22,6 +24,10 @@ public void handleNotify() { String notifyMessage = Utils.replaceCommonPlaceholders(plugin.config.deathNotifyMessage()); MessageBuilder messageBuilder = MessageBuilder.textAsEmbed(notifyMessage, plugin.config.deathSendImage()); + String thumbnailUrl = deathThumbNail().thumbnailUrl; + if (thumbnailUrl != null) { + messageBuilder.webhookBody.getEmbeds().stream().findFirst().ifPresent((embed -> embed.setThumbnail(new Image(thumbnailUrl)))); + } plugin.messageHandler.sendMessage(messageBuilder); reset(); @@ -41,6 +47,10 @@ public boolean lastActorDeathIsLocalPlayer() { return false; } + public DeathThumbnail deathThumbNail() { + return plugin.config.deathThumbnail(); + } + @Override public boolean isEnabled() { return plugin.config.notifyDeath(); From 4de84fecc217b6cf8dee96afcd2fbdb4f0de55b6 Mon Sep 17 00:00:00 2001 From: Tom Bolks Date: Sat, 12 Nov 2022 23:14:28 +0100 Subject: [PATCH 07/15] Added bones --- src/main/java/universalDiscord/DeathThumbnail.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/universalDiscord/DeathThumbnail.java b/src/main/java/universalDiscord/DeathThumbnail.java index faa109b..8d10372 100644 --- a/src/main/java/universalDiscord/DeathThumbnail.java +++ b/src/main/java/universalDiscord/DeathThumbnail.java @@ -4,6 +4,7 @@ public enum DeathThumbnail { NONE(null), DEATH("https://oldschool.runescape.wiki/images/Death.png"), GRAVE("https://oldschool.runescape.wiki/images/Grave.png"), + BONES("https://oldschool.runescape.wiki/images/Bones_detail.png"), ANGEL_GRAVE("https://oldschool.runescape.wiki/images/Grave_%28Angel%29.png"); public final String thumbnailUrl; From d1af2a3bc4f20e70e37e04ee27d5a25e648ecebf Mon Sep 17 00:00:00 2001 From: Tom Bolks Date: Sat, 12 Nov 2022 23:17:44 +0100 Subject: [PATCH 08/15] Sorted the death configs --- .../UniversalDiscordConfig.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/universalDiscord/UniversalDiscordConfig.java b/src/main/java/universalDiscord/UniversalDiscordConfig.java index 12a9971..2ab528d 100644 --- a/src/main/java/universalDiscord/UniversalDiscordConfig.java +++ b/src/main/java/universalDiscord/UniversalDiscordConfig.java @@ -250,32 +250,32 @@ default boolean notifyDeath() { } @ConfigItem( - keyName = "deathThumbnail", - name = "Thumbnail to use", - description = "Send a thumbnail with the notification", + keyName = "deathSendImage", + name = "Send Image", + description = "Send image with the notification", position = 2, section = deathSection ) - default DeathThumbnail deathThumbnail() { - return DeathThumbnail.DEATH; + default boolean deathSendImage() { + return false; } @ConfigItem( - keyName = "deathSendImage", - name = "Send Image", - description = "Send image with the notification", + keyName = "deathThumbnail", + name = "Thumbnail to use", + description = "Send a thumbnail with the notification", position = 3, section = deathSection ) - default boolean deathSendImage() { - return false; + default DeathThumbnail deathThumbnail() { + return DeathThumbnail.DEATH; } @ConfigItem( keyName = "deathNotifMessage", name = "Notification Message", description = "The message to be sent through the webhook. Use %USERNAME% to insert your username", - position = 3, + position = 4, section = deathSection ) default String deathNotifyMessage() { From 2755b50880c2a3037119aad2a65aa0d21971697b Mon Sep 17 00:00:00 2001 From: Tom Bolks Date: Sun, 13 Nov 2022 12:39:47 +0100 Subject: [PATCH 09/15] Levels now have a thumbnail. --- .../UniversalDiscordConfig.java | 2 + .../{ => enums}/ClueType.java | 13 ++++-- .../{ => enums}/DeathThumbnail.java | 12 ++++-- .../{ => enums}/PlayerUrlService.java | 2 +- .../enums/SkillThumbnail.java | 43 +++++++++++++++++++ .../universalDiscord/enums/ThumbnailUrl.java | 5 +++ .../notifiers/ClueNotifier.java | 3 +- .../notifiers/DeathNotifier.java | 5 +-- .../notifiers/LevelNotifier.java | 7 +++ 9 files changed, 80 insertions(+), 12 deletions(-) rename src/main/java/universalDiscord/{ => enums}/ClueType.java (68%) rename src/main/java/universalDiscord/{ => enums}/DeathThumbnail.java (61%) rename src/main/java/universalDiscord/{ => enums}/PlayerUrlService.java (96%) create mode 100644 src/main/java/universalDiscord/enums/SkillThumbnail.java create mode 100644 src/main/java/universalDiscord/enums/ThumbnailUrl.java diff --git a/src/main/java/universalDiscord/UniversalDiscordConfig.java b/src/main/java/universalDiscord/UniversalDiscordConfig.java index 2ab528d..1e401e6 100644 --- a/src/main/java/universalDiscord/UniversalDiscordConfig.java +++ b/src/main/java/universalDiscord/UniversalDiscordConfig.java @@ -4,6 +4,8 @@ import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; import net.runelite.client.config.ConfigSection; +import universalDiscord.enums.DeathThumbnail; +import universalDiscord.enums.PlayerUrlService; @ConfigGroup("universalDiscord") public interface UniversalDiscordConfig extends Config { diff --git a/src/main/java/universalDiscord/ClueType.java b/src/main/java/universalDiscord/enums/ClueType.java similarity index 68% rename from src/main/java/universalDiscord/ClueType.java rename to src/main/java/universalDiscord/enums/ClueType.java index 4d5b7f5..1d80004 100644 --- a/src/main/java/universalDiscord/ClueType.java +++ b/src/main/java/universalDiscord/enums/ClueType.java @@ -1,9 +1,11 @@ -package universalDiscord; +package universalDiscord.enums; import net.runelite.api.ItemID; +import universalDiscord.Utils; import universalDiscord.message.discord.Image; -public enum ClueType { +@SuppressWarnings("unused") +public enum ClueType implements ThumbnailUrl { BEGINNER(ItemID.REWARD_CASKET_BEGINNER), EASY(ItemID.REWARD_CASKET_EASY), MEDIUM(ItemID.REWARD_CASKET_MEDIUM), @@ -18,10 +20,15 @@ public enum ClueType { } public Image getCasketImage() { - return new Image(Utils.getItemImageUrl(casketItemId)); + return new Image(this.getThumbnailUrl()); } public String getMarkdownWikiUrl() { return Utils.asMarkdownWikiUrl(this.name().toLowerCase().concat(" clue"), this.name().toLowerCase()); } + + @Override + public String getThumbnailUrl() { + return Utils.getItemImageUrl(casketItemId); + } } diff --git a/src/main/java/universalDiscord/DeathThumbnail.java b/src/main/java/universalDiscord/enums/DeathThumbnail.java similarity index 61% rename from src/main/java/universalDiscord/DeathThumbnail.java rename to src/main/java/universalDiscord/enums/DeathThumbnail.java index 8d10372..9601839 100644 --- a/src/main/java/universalDiscord/DeathThumbnail.java +++ b/src/main/java/universalDiscord/enums/DeathThumbnail.java @@ -1,15 +1,21 @@ -package universalDiscord; +package universalDiscord.enums; -public enum DeathThumbnail { +@SuppressWarnings("unused") +public enum DeathThumbnail implements ThumbnailUrl { NONE(null), DEATH("https://oldschool.runescape.wiki/images/Death.png"), GRAVE("https://oldschool.runescape.wiki/images/Grave.png"), BONES("https://oldschool.runescape.wiki/images/Bones_detail.png"), ANGEL_GRAVE("https://oldschool.runescape.wiki/images/Grave_%28Angel%29.png"); - public final String thumbnailUrl; + private final String thumbnailUrl; DeathThumbnail(String thumbnailUrl) { this.thumbnailUrl = thumbnailUrl; } + + @Override + public String getThumbnailUrl() { + return this.thumbnailUrl; + } } diff --git a/src/main/java/universalDiscord/PlayerUrlService.java b/src/main/java/universalDiscord/enums/PlayerUrlService.java similarity index 96% rename from src/main/java/universalDiscord/PlayerUrlService.java rename to src/main/java/universalDiscord/enums/PlayerUrlService.java index 918b646..083d152 100644 --- a/src/main/java/universalDiscord/PlayerUrlService.java +++ b/src/main/java/universalDiscord/enums/PlayerUrlService.java @@ -1,4 +1,4 @@ -package universalDiscord; +package universalDiscord.enums; public enum PlayerUrlService { NONE("None"), diff --git a/src/main/java/universalDiscord/enums/SkillThumbnail.java b/src/main/java/universalDiscord/enums/SkillThumbnail.java new file mode 100644 index 0000000..8588754 --- /dev/null +++ b/src/main/java/universalDiscord/enums/SkillThumbnail.java @@ -0,0 +1,43 @@ +package universalDiscord.enums; + +@SuppressWarnings("unused") +public enum SkillThumbnail implements ThumbnailUrl { + ATTACK("https://oldschool.runescape.wiki/images/Attack_icon_%28detail%29.png"), + DEFENCE("https://oldschool.runescape.wiki/images/Defence_icon_%28detail%29.png"), + STRENGTH("https://oldschool.runescape.wiki/images/Strength_icon_%28detail%29.png"), + HITPOINTS("https://oldschool.runescape.wiki/images/Hitpoints_icon_%28detail%29.png"), + RANGED("https://oldschool.runescape.wiki/images/Ranged_icon_%28detail%29.png"), + PRAYER("https://oldschool.runescape.wiki/images/Prayer_icon_%28detail%29.png"), + MAGIC("https://oldschool.runescape.wiki/images/Magic_icon_%28detail%29.png"), + COOKING("https://oldschool.runescape.wiki/images/Cooking_icon_%28detail%29.png"), + WOODCUTTING("https://oldschool.runescape.wiki/images/Woodcutting_icon_%28detail%29.png"), + FLETCHING("https://oldschool.runescape.wiki/images/Fletching_icon_%28detail%29.png"), + FISHING("https://oldschool.runescape.wiki/images/Fishing_icon_%28detail%29.png"), + FIREMAKING("https://oldschool.runescape.wiki/images/Firemaking_icon_%28detail%29.png"), + CRAFTING("https://oldschool.runescape.wiki/images/Crafting_icon_%28detail%29.png"), + SMITHING("https://oldschool.runescape.wiki/images/Smithing_icon_%28detail%29.png"), + MINING("https://oldschool.runescape.wiki/images/Mining_icon_%28detail%29.png"), + HERBLORE("https://oldschool.runescape.wiki/images/Herblore_icon_%28detail%29.png"), + AGILITY("https://oldschool.runescape.wiki/images/Agility_icon_%28detail%29.png"), + THIEVING("https://oldschool.runescape.wiki/images/Thieving_icon_%28detail%29.png"), + SLAYER("https://oldschool.runescape.wiki/images/Slayer_icon_%28detail%29.png"), + FARMING("https://oldschool.runescape.wiki/images/Farming_icon_%28detail%29.png"), + RUNECRAFT("https://oldschool.runescape.wiki/images/Runecraft_icon_%28detail%29.png"), + HUNTER("https://oldschool.runescape.wiki/images/Hunter_icon_%28detail%29.png"), + CONSTRUCTION("https://oldschool.runescape.wiki/images/Construction_icon_%28detail%29.png"), + /** + * The level of all skills added together. + */ + OVERALL("https://oldschool.runescape.wiki/images/Stats_icon.png"); + + private final String thumbnailUrl; + + SkillThumbnail(String thumbnailUrl) { + this.thumbnailUrl = thumbnailUrl; + } + + @Override + public String getThumbnailUrl() { + return this.thumbnailUrl; + } +} diff --git a/src/main/java/universalDiscord/enums/ThumbnailUrl.java b/src/main/java/universalDiscord/enums/ThumbnailUrl.java new file mode 100644 index 0000000..e90d82a --- /dev/null +++ b/src/main/java/universalDiscord/enums/ThumbnailUrl.java @@ -0,0 +1,5 @@ +package universalDiscord.enums; + +public interface ThumbnailUrl { + String getThumbnailUrl(); +} diff --git a/src/main/java/universalDiscord/notifiers/ClueNotifier.java b/src/main/java/universalDiscord/notifiers/ClueNotifier.java index e85ce53..06b4843 100644 --- a/src/main/java/universalDiscord/notifiers/ClueNotifier.java +++ b/src/main/java/universalDiscord/notifiers/ClueNotifier.java @@ -1,7 +1,6 @@ package universalDiscord.notifiers; import net.runelite.api.ItemComposition; -import net.runelite.api.ItemID; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.Widget; @@ -9,7 +8,7 @@ import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.util.QuantityFormatter; import net.runelite.client.util.Text; -import universalDiscord.ClueType; +import universalDiscord.enums.ClueType; import universalDiscord.UniversalDiscordPlugin; import universalDiscord.Utils; import universalDiscord.message.MessageBuilder; diff --git a/src/main/java/universalDiscord/notifiers/DeathNotifier.java b/src/main/java/universalDiscord/notifiers/DeathNotifier.java index 5333e77..35eac6b 100644 --- a/src/main/java/universalDiscord/notifiers/DeathNotifier.java +++ b/src/main/java/universalDiscord/notifiers/DeathNotifier.java @@ -1,8 +1,7 @@ package universalDiscord.notifiers; -import net.runelite.api.Player; import net.runelite.api.events.ActorDeath; -import universalDiscord.DeathThumbnail; +import universalDiscord.enums.DeathThumbnail; import universalDiscord.UniversalDiscordPlugin; import universalDiscord.Utils; import universalDiscord.message.MessageBuilder; @@ -24,7 +23,7 @@ public void handleNotify() { String notifyMessage = Utils.replaceCommonPlaceholders(plugin.config.deathNotifyMessage()); MessageBuilder messageBuilder = MessageBuilder.textAsEmbed(notifyMessage, plugin.config.deathSendImage()); - String thumbnailUrl = deathThumbNail().thumbnailUrl; + String thumbnailUrl = deathThumbNail().getThumbnailUrl(); if (thumbnailUrl != null) { messageBuilder.webhookBody.getEmbeds().stream().findFirst().ifPresent((embed -> embed.setThumbnail(new Image(thumbnailUrl)))); } diff --git a/src/main/java/universalDiscord/notifiers/LevelNotifier.java b/src/main/java/universalDiscord/notifiers/LevelNotifier.java index 0977c2a..0e1d459 100644 --- a/src/main/java/universalDiscord/notifiers/LevelNotifier.java +++ b/src/main/java/universalDiscord/notifiers/LevelNotifier.java @@ -3,7 +3,9 @@ import lombok.extern.slf4j.Slf4j; import universalDiscord.UniversalDiscordPlugin; import universalDiscord.Utils; +import universalDiscord.enums.SkillThumbnail; import universalDiscord.message.MessageBuilder; +import universalDiscord.message.discord.Image; import javax.inject.Inject; import java.util.ArrayList; @@ -26,9 +28,12 @@ public LevelNotifier(UniversalDiscordPlugin plugin) { public void handleNotify() { StringBuilder skillMessage = new StringBuilder(); int index = 0; + SkillThumbnail skillThumb = SkillThumbnail.OVERALL; for (String skill : levelledSkills) { + skillThumb = SkillThumbnail.valueOf(skill.toUpperCase()); if (index == levelledSkills.size()) { + skillThumb = SkillThumbnail.OVERALL; skillMessage.append(" and "); } else if (index > 0) { skillMessage.append(", "); @@ -43,6 +48,8 @@ public void handleNotify() { .replaceAll("%SKILL%", skillString); MessageBuilder messageBuilder = MessageBuilder.textAsEmbed(fullNotification, plugin.config.levelSendImage()); + SkillThumbnail finalSkillThumb = skillThumb; + messageBuilder.webhookBody.getEmbeds().stream().findFirst().ifPresent((embed -> embed.setThumbnail(new Image(finalSkillThumb.getThumbnailUrl())))); plugin.messageHandler.sendMessage(messageBuilder); reset(); From 9e9809c16afcd8058912c75210ea5013c83148b7 Mon Sep 17 00:00:00 2001 From: Tom Bolks Date: Mon, 14 Nov 2022 17:36:40 +0100 Subject: [PATCH 10/15] Made bit of code reusable and added thumbnail to Quest notifier. --- src/main/java/universalDiscord/message/MessageBuilder.java | 5 +++++ src/main/java/universalDiscord/notifiers/DeathNotifier.java | 2 +- src/main/java/universalDiscord/notifiers/LevelNotifier.java | 2 +- src/main/java/universalDiscord/notifiers/QuestNotifier.java | 5 ++++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/universalDiscord/message/MessageBuilder.java b/src/main/java/universalDiscord/message/MessageBuilder.java index 2fb29af..352609c 100644 --- a/src/main/java/universalDiscord/message/MessageBuilder.java +++ b/src/main/java/universalDiscord/message/MessageBuilder.java @@ -4,6 +4,7 @@ import universalDiscord.Utils; import universalDiscord.message.discord.Author; import universalDiscord.message.discord.Embed; +import universalDiscord.message.discord.Image; import universalDiscord.message.discord.WebhookBody; public class MessageBuilder { @@ -26,6 +27,10 @@ public MessageBuilder(WebhookBody webhookBody, boolean sendScreenImage) { this.sendScreenImage = sendScreenImage; } + public void setFirstThumbnail(Image image) { + webhookBody.getEmbeds().stream().findFirst().ifPresent((embed -> embed.setThumbnail(image))); + } + public void setPlayerAsAuthorForEmbeds() { Author author = playerAsAuthor(); for (Embed embed : webhookBody.getEmbeds()) { diff --git a/src/main/java/universalDiscord/notifiers/DeathNotifier.java b/src/main/java/universalDiscord/notifiers/DeathNotifier.java index 35eac6b..8302db5 100644 --- a/src/main/java/universalDiscord/notifiers/DeathNotifier.java +++ b/src/main/java/universalDiscord/notifiers/DeathNotifier.java @@ -25,7 +25,7 @@ public void handleNotify() { MessageBuilder messageBuilder = MessageBuilder.textAsEmbed(notifyMessage, plugin.config.deathSendImage()); String thumbnailUrl = deathThumbNail().getThumbnailUrl(); if (thumbnailUrl != null) { - messageBuilder.webhookBody.getEmbeds().stream().findFirst().ifPresent((embed -> embed.setThumbnail(new Image(thumbnailUrl)))); + messageBuilder.setFirstThumbnail(new Image(thumbnailUrl)); } plugin.messageHandler.sendMessage(messageBuilder); diff --git a/src/main/java/universalDiscord/notifiers/LevelNotifier.java b/src/main/java/universalDiscord/notifiers/LevelNotifier.java index 0e1d459..49baa89 100644 --- a/src/main/java/universalDiscord/notifiers/LevelNotifier.java +++ b/src/main/java/universalDiscord/notifiers/LevelNotifier.java @@ -49,7 +49,7 @@ public void handleNotify() { MessageBuilder messageBuilder = MessageBuilder.textAsEmbed(fullNotification, plugin.config.levelSendImage()); SkillThumbnail finalSkillThumb = skillThumb; - messageBuilder.webhookBody.getEmbeds().stream().findFirst().ifPresent((embed -> embed.setThumbnail(new Image(finalSkillThumb.getThumbnailUrl())))); + messageBuilder.setFirstThumbnail(new Image(finalSkillThumb.getThumbnailUrl())); plugin.messageHandler.sendMessage(messageBuilder); reset(); diff --git a/src/main/java/universalDiscord/notifiers/QuestNotifier.java b/src/main/java/universalDiscord/notifiers/QuestNotifier.java index 46043da..3cb51bd 100644 --- a/src/main/java/universalDiscord/notifiers/QuestNotifier.java +++ b/src/main/java/universalDiscord/notifiers/QuestNotifier.java @@ -8,6 +8,7 @@ import universalDiscord.UniversalDiscordPlugin; import universalDiscord.Utils; import universalDiscord.message.MessageBuilder; +import universalDiscord.message.discord.Image; import universalDiscord.notifiers.onevent.WidgetLoadHandler; import java.util.regex.Matcher; @@ -33,7 +34,9 @@ public void handleNotify() { String notifyMessage = Utils.replaceCommonPlaceholders(plugin.config.questNotifyMessage()) .replaceAll("%QUEST%", Utils.asMarkdownWikiUrl(parseQuestWidget(lastQuestText))); - plugin.messageHandler.sendMessage(MessageBuilder.textAsEmbed(notifyMessage, plugin.config.questSendImage())); + MessageBuilder messageBuilder = MessageBuilder.textAsEmbed(notifyMessage, plugin.config.questSendImage()); + messageBuilder.setFirstThumbnail(new Image("https://oldschool.runescape.wiki/images/Quests.png")); + plugin.messageHandler.sendMessage(messageBuilder); reset(); } From 9f8867c466c5f234883163a39d2912c61ff28691 Mon Sep 17 00:00:00 2001 From: Tom Bolks Date: Tue, 15 Nov 2022 00:52:02 +0100 Subject: [PATCH 11/15] Added thumbnail for collection log items. --- .../java/universalDiscord/ItemSearcher.java | 73 +++++++++++++++++++ .../UniversalDiscordPlugin.java | 8 +- .../message/DiscordMessageHandler.java | 1 - .../notifiers/CollectionNotifier.java | 10 ++- 4 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 src/main/java/universalDiscord/ItemSearcher.java diff --git a/src/main/java/universalDiscord/ItemSearcher.java b/src/main/java/universalDiscord/ItemSearcher.java new file mode 100644 index 0000000..5f51834 --- /dev/null +++ b/src/main/java/universalDiscord/ItemSearcher.java @@ -0,0 +1,73 @@ +package universalDiscord; + +import com.google.gson.Gson; +import com.google.gson.JsonIOException; +import com.google.gson.JsonSyntaxException; +import lombok.extern.slf4j.Slf4j; +import okhttp3.*; + +import javax.inject.Inject; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +final public class ItemSearcher { + @Inject + private OkHttpClient okHttpClient; + private Map nameAndIds = new HashMap<>(); + + public void loadItemIdsAndNames() { + Request request = new Request.Builder().url("https://static.runelite.net/cache/item/names.json").build(); + okHttpClient.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + log.warn("Failed to load item names and ids."); + } + + @Override + public void onResponse(Call call, Response response) { + Gson gson = new Gson(); + try { + Map items = gson.fromJson(response.body().charStream(), Map.class); + filterNotedItems(items); + } catch (JsonSyntaxException | JsonIOException e) { + log.error("UniversalDiscord failed to load names"); + } + } + }); + } + + private void filterNotedItems(Map items) { + Request request = new Request.Builder().url("https://static.runelite.net/cache/item/notes.json").build(); + okHttpClient.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + log.warn("Failed to remove noted items."); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + Gson gson = new Gson(); + try { + Map notes = gson.fromJson(response.body().charStream(), Map.class); + notes.keySet().forEach(items::remove); + } catch (JsonSyntaxException | JsonIOException e) { + log.error("UniversalDiscord failed to filter noted items"); + } + // Always set the items even when failing to filter noted items. + nameAndIds = items + .entrySet() + .stream() + .collect( + Collectors.toMap(Map.Entry::getValue, (e) -> Integer.parseInt(e.getKey()), (Integer a, Integer b) -> a) + ); + } + }); + } + + public Integer findItemId(String name) { + return nameAndIds.get(name); + } +} diff --git a/src/main/java/universalDiscord/UniversalDiscordPlugin.java b/src/main/java/universalDiscord/UniversalDiscordPlugin.java index af56015..3b0fdf5 100644 --- a/src/main/java/universalDiscord/UniversalDiscordPlugin.java +++ b/src/main/java/universalDiscord/UniversalDiscordPlugin.java @@ -1,5 +1,6 @@ package universalDiscord; +import com.google.inject.Guice; import com.google.inject.Provides; import lombok.extern.slf4j.Slf4j; import net.runelite.api.ChatMessageType; @@ -12,12 +13,10 @@ import net.runelite.client.events.NpcLootReceived; import net.runelite.client.events.PlayerLootReceived; import net.runelite.client.game.ItemManager; -import net.runelite.client.game.WorldService; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.loottracker.LootReceived; import net.runelite.client.ui.DrawManager; -import net.runelite.http.api.worlds.WorldResult; import okhttp3.OkHttpClient; import universalDiscord.message.DiscordMessageHandler; import universalDiscord.notifiers.*; @@ -43,6 +42,9 @@ public class UniversalDiscordPlugin extends Plugin { @Inject public ItemManager itemManager; + @Inject + public ItemSearcher itemSearcher; + public final DiscordMessageHandler messageHandler = new DiscordMessageHandler(this); private final CollectionNotifier collectionNotifier = new CollectionNotifier(this); private final PetNotifier petNotifier = new PetNotifier(this); @@ -57,6 +59,8 @@ public class UniversalDiscordPlugin extends Plugin { @Override protected void startUp() { Utils.plugin = this; + itemSearcher.loadItemIdsAndNames(); + log.info("Started up Universal Discord"); } diff --git a/src/main/java/universalDiscord/message/DiscordMessageHandler.java b/src/main/java/universalDiscord/message/DiscordMessageHandler.java index a1999b5..541b457 100644 --- a/src/main/java/universalDiscord/message/DiscordMessageHandler.java +++ b/src/main/java/universalDiscord/message/DiscordMessageHandler.java @@ -8,7 +8,6 @@ import okhttp3.internal.annotations.EverythingIsNonNull; import universalDiscord.UniversalDiscordPlugin; import universalDiscord.Utils; -import universalDiscord.message.discord.Embed; import universalDiscord.message.discord.Image; import javax.inject.Inject; diff --git a/src/main/java/universalDiscord/notifiers/CollectionNotifier.java b/src/main/java/universalDiscord/notifiers/CollectionNotifier.java index 4e1e19c..6ef5a8c 100644 --- a/src/main/java/universalDiscord/notifiers/CollectionNotifier.java +++ b/src/main/java/universalDiscord/notifiers/CollectionNotifier.java @@ -1,10 +1,12 @@ package universalDiscord.notifiers; +import net.runelite.api.ItemID; import net.runelite.api.events.ChatMessage; import net.runelite.client.util.Text; import universalDiscord.UniversalDiscordPlugin; import universalDiscord.Utils; import universalDiscord.message.MessageBuilder; +import universalDiscord.message.discord.Image; import universalDiscord.notifiers.onevent.ChatMessageHandler; import javax.inject.Inject; @@ -32,10 +34,16 @@ public boolean isEnabled() { } public void handleNotify() { + String itemName = lastMatcher.group("itemName"); String notifyMessage = Utils.replaceCommonPlaceholders(plugin.config.collectionNotifyMessage()) - .replaceAll("%ITEM%", Utils.asMarkdownWikiUrl(lastMatcher.group("itemName"))); + .replaceAll("%ITEM%", Utils.asMarkdownWikiUrl(itemName)); MessageBuilder messageBuilder = MessageBuilder.textAsEmbed(notifyMessage, plugin.config.collectionSendImage()); + Integer itemId = plugin.itemSearcher.findItemId(itemName); + if (itemId != null) { + messageBuilder.setFirstThumbnail(new Image(Utils.getItemImageUrl(itemId))); + } + plugin.messageHandler.sendMessage(messageBuilder); reset(); From 34589b47fa1e76a7ce1ef0cf5917091f690f3709 Mon Sep 17 00:00:00 2001 From: Tom Bolks Date: Wed, 16 Nov 2022 18:45:16 +0100 Subject: [PATCH 12/15] Show highest value stack item as thumbnail --- .../notifiers/CollectionNotifier.java | 1 - .../notifiers/LootNotifier.java | 19 ++++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/universalDiscord/notifiers/CollectionNotifier.java b/src/main/java/universalDiscord/notifiers/CollectionNotifier.java index 9999522..ac9858c 100644 --- a/src/main/java/universalDiscord/notifiers/CollectionNotifier.java +++ b/src/main/java/universalDiscord/notifiers/CollectionNotifier.java @@ -1,6 +1,5 @@ package universalDiscord.notifiers; -import net.runelite.api.ItemID; import net.runelite.api.events.ChatMessage; import net.runelite.client.util.Text; import universalDiscord.UniversalDiscordPlugin; diff --git a/src/main/java/universalDiscord/notifiers/LootNotifier.java b/src/main/java/universalDiscord/notifiers/LootNotifier.java index 5cb95ab..3410abe 100644 --- a/src/main/java/universalDiscord/notifiers/LootNotifier.java +++ b/src/main/java/universalDiscord/notifiers/LootNotifier.java @@ -43,6 +43,8 @@ public boolean isEnabled() { public void handleNotify() { WebhookBody webhookBody = new WebhookBody(); StringBuilder lootMessage = new StringBuilder(); + ItemComposition highestValueItem = null; + long highestValueStackPrice = 0; long totalLootValue = 0; for (ItemStack item : Utils.reduceItemStack(receivedLoot)) { @@ -53,6 +55,12 @@ public void handleNotify() { ItemComposition itemComposition = plugin.itemManager.getItemComposition(itemId); lootMessage.append(String.format("%s x %s (%s)\n", quantity, Utils.asMarkdownWikiUrl(itemComposition.getName()), QuantityFormatter.quantityToStackSize(itemStackPrice))); + + if (highestValueStackPrice < itemStackPrice) { + highestValueStackPrice = itemStackPrice; + highestValueItem = itemComposition; + } + if (plugin.config.lootIcons()) { Embed embed = Embed.builder() .image(new Image(Utils.getItemImageUrl(itemId))) @@ -70,7 +78,12 @@ public void handleNotify() { .replaceAll("%SOURCE%", Utils.asMarkdownWikiUrl(dropper)) .replaceAll("%TOTAL_VALUE%", QuantityFormatter.quantityToStackSize(totalLootValue)) .trim(); - webhookBody.getEmbeds().add(0, Embed.builder().description(notifyMessage).build()); + webhookBody.getEmbeds().add(0, + Embed.builder() + .description(notifyMessage) + .thumbnail(getThumbnail(highestValueItem)) + .build() + ); MessageBuilder messageBuilder = new MessageBuilder(webhookBody, plugin.config.lootSendImage()); plugin.messageHandler.sendMessage(messageBuilder); @@ -79,6 +92,10 @@ public void handleNotify() { reset(); } + private Image getThumbnail(ItemComposition highestValueItem) { + return new Image(Utils.getItemImageUrl(highestValueItem.getId())); + } + public void handleNpcLootReceived(NpcLootReceived npcLootReceived) { dropper = npcLootReceived.getNpc().getName(); receivedLoot = npcLootReceived.getItems(); From 0b2d3e1a52252979a1f2b452d5e24c21354f526a Mon Sep 17 00:00:00 2001 From: Tom Bolks Date: Fri, 18 Nov 2022 18:39:42 +0100 Subject: [PATCH 13/15] Fixed duplicate notification for clues. Made LootNotifier bit more null safe. --- .../notifiers/LootNotifier.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/universalDiscord/notifiers/LootNotifier.java b/src/main/java/universalDiscord/notifiers/LootNotifier.java index 3410abe..b97a231 100644 --- a/src/main/java/universalDiscord/notifiers/LootNotifier.java +++ b/src/main/java/universalDiscord/notifiers/LootNotifier.java @@ -16,9 +16,11 @@ import javax.inject.Inject; import java.util.Collection; +import java.util.regex.Pattern; public class LootNotifier extends BaseNotifier { + final public Pattern CLUE_NAME_REGEX = Pattern.compile("Clue Scroll (\\w)"); private Collection receivedLoot; private String dropper; @@ -41,6 +43,10 @@ public boolean isEnabled() { } public void handleNotify() { + if (CLUE_NAME_REGEX.matcher(dropper).find()) { + reset(); + return; + } WebhookBody webhookBody = new WebhookBody(); StringBuilder lootMessage = new StringBuilder(); ItemComposition highestValueItem = null; @@ -78,12 +84,13 @@ public void handleNotify() { .replaceAll("%SOURCE%", Utils.asMarkdownWikiUrl(dropper)) .replaceAll("%TOTAL_VALUE%", QuantityFormatter.quantityToStackSize(totalLootValue)) .trim(); - webhookBody.getEmbeds().add(0, - Embed.builder() - .description(notifyMessage) - .thumbnail(getThumbnail(highestValueItem)) - .build() - ); + Embed.EmbedBuilder embedBuilder = Embed.builder() + .description(notifyMessage); + if (highestValueItem != null) { + embedBuilder.thumbnail(getThumbnail(highestValueItem)); + } + + webhookBody.getEmbeds().add(0, embedBuilder.build()); MessageBuilder messageBuilder = new MessageBuilder(webhookBody, plugin.config.lootSendImage()); plugin.messageHandler.sendMessage(messageBuilder); From 917f5f8b3e3e767cc7977af9f1db240384dcc2cf Mon Sep 17 00:00:00 2001 From: Tom Bolks Date: Fri, 18 Nov 2022 18:47:18 +0100 Subject: [PATCH 14/15] Forgot to escape the parentheses --- src/main/java/universalDiscord/notifiers/LootNotifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/universalDiscord/notifiers/LootNotifier.java b/src/main/java/universalDiscord/notifiers/LootNotifier.java index b97a231..4ef1e68 100644 --- a/src/main/java/universalDiscord/notifiers/LootNotifier.java +++ b/src/main/java/universalDiscord/notifiers/LootNotifier.java @@ -20,7 +20,7 @@ public class LootNotifier extends BaseNotifier { - final public Pattern CLUE_NAME_REGEX = Pattern.compile("Clue Scroll (\\w)"); + final public Pattern CLUE_NAME_REGEX = Pattern.compile("Clue Scroll \\(\\w\\)"); private Collection receivedLoot; private String dropper; From 0647381aace862910ab65d8afb77fcf2064787f1 Mon Sep 17 00:00:00 2001 From: Tom Bolks Date: Fri, 18 Nov 2022 18:55:54 +0100 Subject: [PATCH 15/15] Added quantifier operator --- src/main/java/universalDiscord/notifiers/LootNotifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/universalDiscord/notifiers/LootNotifier.java b/src/main/java/universalDiscord/notifiers/LootNotifier.java index 4ef1e68..3848cd7 100644 --- a/src/main/java/universalDiscord/notifiers/LootNotifier.java +++ b/src/main/java/universalDiscord/notifiers/LootNotifier.java @@ -20,7 +20,7 @@ public class LootNotifier extends BaseNotifier { - final public Pattern CLUE_NAME_REGEX = Pattern.compile("Clue Scroll \\(\\w\\)"); + final public Pattern CLUE_NAME_REGEX = Pattern.compile("Clue Scroll \\(\\w+\\)"); private Collection receivedLoot; private String dropper;