Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bugfix/duplicate clue notification #33

Open
wants to merge 16 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions src/main/java/universalDiscord/ItemSearcher.java
Original file line number Diff line number Diff line change
@@ -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<String, Integer> 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<String, String> 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<String, String> 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<String, String> 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);
}
}
15 changes: 14 additions & 1 deletion src/main/java/universalDiscord/UniversalDiscordConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -260,11 +262,22 @@ default boolean deathSendImage() {
return false;
}

@ConfigItem(
keyName = "deathThumbnail",
name = "Thumbnail to use",
description = "Send a thumbnail with the notification",
position = 3,
section = deathSection
)
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() {
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/universalDiscord/UniversalDiscordPlugin.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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.*;
Expand All @@ -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);
Expand All @@ -57,6 +59,8 @@ public class UniversalDiscordPlugin extends Plugin {
@Override
protected void startUp() {
Utils.plugin = this;
itemSearcher.loadItemIdsAndNames();

log.info("Started up Universal Discord");
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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),
Expand All @@ -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);
}
}
21 changes: 21 additions & 0 deletions src/main/java/universalDiscord/enums/DeathThumbnail.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package universalDiscord.enums;

@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");

private final String thumbnailUrl;

DeathThumbnail(String thumbnailUrl) {
this.thumbnailUrl = thumbnailUrl;
}

@Override
public String getThumbnailUrl() {
return this.thumbnailUrl;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package universalDiscord;
package universalDiscord.enums;

public enum PlayerUrlService {
NONE("None"),
Expand Down
43 changes: 43 additions & 0 deletions src/main/java/universalDiscord/enums/SkillThumbnail.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
5 changes: 5 additions & 0 deletions src/main/java/universalDiscord/enums/ThumbnailUrl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package universalDiscord.enums;

public interface ThumbnailUrl {
String getThumbnailUrl();
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/universalDiscord/message/MessageBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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()) {
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/universalDiscord/notifiers/ClueNotifier.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
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;
import net.runelite.api.widgets.WidgetID;
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;
Expand Down
11 changes: 9 additions & 2 deletions src/main/java/universalDiscord/notifiers/CollectionNotifier.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@
import universalDiscord.UniversalDiscordPlugin;
import universalDiscord.Utils;
import universalDiscord.message.MessageBuilder;
import universalDiscord.message.discord.Image;
import universalDiscord.notifiers.onevent.ChatMessageHandler;

import javax.inject.Inject;
import java.util.regex.Matcher;
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: (?<itemName>[\\w,\\s-.]+)");
public static final Pattern COLLECTION_LOG_REGEX = Pattern.compile("New item added to your collection log: (?<itemName>[\\w,\\s-.'()]+)");

private Matcher lastMatcher;

Expand All @@ -32,10 +33,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();
Expand Down
21 changes: 19 additions & 2 deletions src/main/java/universalDiscord/notifiers/DeathNotifier.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package universalDiscord.notifiers;

import net.runelite.api.events.ActorDeath;
import universalDiscord.enums.DeathThumbnail;
import universalDiscord.UniversalDiscordPlugin;
import universalDiscord.Utils;
import universalDiscord.message.MessageBuilder;
import universalDiscord.message.discord.Image;

import javax.inject.Inject;
import java.util.Objects;
Expand All @@ -21,6 +23,10 @@ public void handleNotify() {
String notifyMessage = Utils.replaceCommonPlaceholders(plugin.config.deathNotifyMessage());

MessageBuilder messageBuilder = MessageBuilder.textAsEmbed(notifyMessage, plugin.config.deathSendImage());
String thumbnailUrl = deathThumbNail().getThumbnailUrl();
if (thumbnailUrl != null) {
messageBuilder.setFirstThumbnail(new Image(thumbnailUrl));
}
plugin.messageHandler.sendMessage(messageBuilder);

reset();
Expand All @@ -29,8 +35,19 @@ public void handleNotify() {
@Override
public boolean shouldNotify() {
return isEnabled()
&& lastActorDeath != null
&& Objects.equals(lastActorDeath.getActor().getName(), Utils.getPlayerName());
&& lastActorDeathIsLocalPlayer();
}

public boolean lastActorDeathIsLocalPlayer() {
if (lastActorDeath != null) {
return Objects.equals(lastActorDeath.getActor(), plugin.client.getLocalPlayer());
}

return false;
}

public DeathThumbnail deathThumbNail() {
return plugin.config.deathThumbnail();
}

@Override
Expand Down
Loading