From eb47c91e65816fcbe3eb78ec0dfc649c0f7c5e2a Mon Sep 17 00:00:00 2001 From: Ffauzan Date: Thu, 23 Jun 2022 09:47:07 +0700 Subject: [PATCH] fix memory leak --- pom.xml | 2 +- .../java/uk/haku/idlook/IdLookPlugin.java | 45 ++++++++++++++++--- .../uk/haku/idlook/commands/LookCommand.java | 43 +++--------------- src/main/resources/plugin.json | 4 +- 4 files changed, 48 insertions(+), 46 deletions(-) diff --git a/pom.xml b/pom.xml index 0abc1cf..fbed731 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ uk.haku IdLook - 1.0.0 + 1.0.1 17 diff --git a/src/main/java/uk/haku/idlook/IdLookPlugin.java b/src/main/java/uk/haku/idlook/IdLookPlugin.java index a157efd..51bc165 100644 --- a/src/main/java/uk/haku/idlook/IdLookPlugin.java +++ b/src/main/java/uk/haku/idlook/IdLookPlugin.java @@ -5,18 +5,28 @@ import emu.grasscutter.Grasscutter; import emu.grasscutter.plugin.Plugin; +import emu.grasscutter.utils.Utils; import uk.haku.idlook.commands.*; -import uk.haku.idlook.objects.*; -import java.io.*; -import java.util.stream.Collectors; import java.io.File; +import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; -import java.security.KeyPair; -import java.util.Timer; -import java.util.concurrent.TimeUnit; +import java.util.Map; + + +import java.util.*; + +import static emu.grasscutter.Configuration.*; + + +import com.google.common.reflect.TypeToken; + +import uk.haku.idlook.IdLookPlugin; +import uk.haku.idlook.objects.PluginConfig; /** * The Grasscutter plugin template. @@ -37,6 +47,10 @@ public static IdLookPlugin getInstance() { /* The plugin's configuration instance. */ private PluginConfig configuration; + + /* Item text map */ + private Map itemTextMap; + /** * This method is called immediately after the plugin is first loaded into system memory. @@ -63,6 +77,18 @@ public static IdLookPlugin getInstance() { this.getLogger().error("Unable to load configuration file."); this.configuration = new PluginConfig(); } + + // Initialize the item text map. + final String textMapFile = "TextMap/TextMap" + DOCUMENT_LANGUAGE + ".json"; + try (InputStreamReader fileReader = new InputStreamReader(new FileInputStream( + Utils.toFilePath(RESOURCE(textMapFile))), StandardCharsets.UTF_8)) { + this.itemTextMap = Grasscutter.getGsonFactory() + .fromJson(fileReader, new TypeToken>() { + }.getType()); + } catch (IOException e) { + Grasscutter.getLogger().warn("Resource does not exist: " + textMapFile); + this.itemTextMap = new HashMap<>(); + } // Log a plugin status message. this.getLogger().info("The IdLook plugin has been loaded."); @@ -94,4 +120,11 @@ public static IdLookPlugin getInstance() { public PluginConfig getConfiguration() { return this.configuration; } + + /** + * Gets the item text map. + */ + public Map getItemTextMap() { + return this.itemTextMap; + } } diff --git a/src/main/java/uk/haku/idlook/commands/LookCommand.java b/src/main/java/uk/haku/idlook/commands/LookCommand.java index 6e63233..532fda4 100644 --- a/src/main/java/uk/haku/idlook/commands/LookCommand.java +++ b/src/main/java/uk/haku/idlook/commands/LookCommand.java @@ -1,25 +1,11 @@ package uk.haku.idlook.commands; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; import java.util.*; -import static emu.grasscutter.Configuration.*; - -import emu.grasscutter.Grasscutter; import emu.grasscutter.command.Command; import emu.grasscutter.command.CommandHandler; import emu.grasscutter.data.GameData; -import emu.grasscutter.data.excels.AvatarData; -import emu.grasscutter.data.excels.ItemData; -import emu.grasscutter.data.excels.MonsterData; import emu.grasscutter.game.player.Player; -import emu.grasscutter.utils.Utils; - -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import com.google.common.reflect.TypeToken; import uk.haku.idlook.IdLookPlugin; import uk.haku.idlook.utils.StringSimilarity; @@ -34,27 +20,10 @@ public final class LookCommand implements CommandHandler { private int resultLimit = config.resultLimit; private int similarityScoreTreshold = config.scoreTreshold; - private Map map; - private Int2ObjectMap avatarMap = GameData.getAvatarDataMap(); - private Int2ObjectMap itemMap = GameData.getItemDataMap(); - private Int2ObjectMap monsterMap = GameData.getMonsterDataMap(); - - @Override public void execute(Player sender, Player targetPlayer, List args) { String lookQuery = String.join(" ", args); ArrayList resultList = new ArrayList(); - final String textMapFile = "TextMap/TextMap" + DOCUMENT_LANGUAGE + ".json"; - try (InputStreamReader fileReader = new InputStreamReader(new FileInputStream( - Utils.toFilePath(RESOURCE(textMapFile))), StandardCharsets.UTF_8)) { - map = Grasscutter.getGsonFactory() - .fromJson(fileReader, new TypeToken>() { - }.getType()); - } catch (IOException e) { - Grasscutter.getLogger().warn("Resource does not exist: " + textMapFile); - map = new HashMap<>(); - } - lookFor(lookQuery, resultList); Collections.sort(resultList); @@ -92,8 +61,8 @@ public void lookFor(String query, ArrayList lookResult) { public void lookForMonster(String query, ArrayList lookResult) { // Monster - monsterMap.forEach((id, data) -> { - String name = map.get(data.getNameTextMapHash()); + GameData.getMonsterDataMap().forEach((id, data) -> { + String name = IdLookPlugin.getInstance().getItemTextMap().get(data.getNameTextMapHash()); if (name != null) { Double similarityScore = StringSimilarity.Fuzzy(query, name); if (similarityScore > similarityScoreTreshold) { @@ -107,8 +76,8 @@ public void lookForMonster(String query, ArrayList lookResult) { public void lookForAvatar(String query, ArrayList lookResult) { // Avatars - avatarMap.forEach((id, data) -> { - String name = map.get(data.getNameTextMapHash()); + GameData.getAvatarDataMap().forEach((id, data) -> { + String name = IdLookPlugin.getInstance().getItemTextMap().get(data.getNameTextMapHash()); if (name != null) { Double similarityScore = StringSimilarity.Fuzzy(query, name); if (similarityScore > similarityScoreTreshold) { @@ -122,8 +91,8 @@ public void lookForAvatar(String query, ArrayList lookResult) { public void lookForItem(String query, ArrayList lookResult) { // Item - itemMap.forEach((id, data) -> { - String name = map.get(data.getNameTextMapHash()); + GameData.getItemDataMap().forEach((id, data) -> { + String name = IdLookPlugin.getInstance().getItemTextMap().get(data.getNameTextMapHash()); if (name != null) { Double similarityScore = StringSimilarity.Fuzzy(query, name); if (similarityScore > similarityScoreTreshold) { diff --git a/src/main/resources/plugin.json b/src/main/resources/plugin.json index 331de13..98111dd 100644 --- a/src/main/resources/plugin.json +++ b/src/main/resources/plugin.json @@ -1,8 +1,8 @@ { "name": "IdLookPlugin", "description": "IdLookPlugin", - "version": "1.0", - "authors": [ "FF" ], + "version": "1.0.1", + "authors": [ "FFauzan" ], "mainClass": "uk.haku.idlook.IdLookPlugin",