diff --git a/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java b/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java index 793b661fdd..bc1b6de369 100644 --- a/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java +++ b/http-api/src/main/java/net/runelite/http/api/loottracker/LootTrackerClient.java @@ -33,6 +33,7 @@ import java.io.InputStreamReader; import java.util.Collection; import java.util.List; import java.util.UUID; +import java.util.concurrent.CompletableFuture; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import net.runelite.http.api.RuneLiteAPI; @@ -52,8 +53,10 @@ public class LootTrackerClient private final UUID uuid; - public void submit(Collection lootRecords) + public CompletableFuture submit(Collection lootRecords) { + CompletableFuture future = new CompletableFuture<>(); + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() .addPathSegment("loottracker") .build(); @@ -70,6 +73,7 @@ public class LootTrackerClient public void onFailure(Call call, IOException e) { log.warn("unable to submit loot", e); + future.completeExceptionally(e); } @Override @@ -77,8 +81,11 @@ public class LootTrackerClient { log.debug("Submitted loot"); response.close(); + future.complete(null); } }); + + return future; } public Collection get() throws IOException diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java index afad2d6af8..e10427eec3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java @@ -46,10 +46,13 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import javax.annotation.Nullable; import javax.inject.Inject; import javax.swing.SwingUtilities; import lombok.AccessLevel; @@ -80,6 +83,7 @@ import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.ClientShutdown; import net.runelite.client.events.ConfigChanged; import net.runelite.client.events.NpcLootReceived; import net.runelite.client.events.PlayerLootReceived; @@ -340,6 +344,16 @@ public class LootTrackerPlugin extends Plugin chestLooted = false; } + @Subscribe + public void onClientShutdown(ClientShutdown event) + { + Future future = submitLoot(); + if (future != null) + { + event.waitFor(future); + } + } + @Subscribe public void onGameStateChanged(final GameStateChanged event) { @@ -629,14 +643,15 @@ public class LootTrackerPlugin extends Plugin submitLoot(); } - private void submitLoot() + @Nullable + private CompletableFuture submitLoot() { List copy; synchronized (queuedLoots) { if (queuedLoots.isEmpty()) { - return; + return null; } copy = new ArrayList<>(queuedLoots); @@ -645,12 +660,13 @@ public class LootTrackerPlugin extends Plugin if (lootTrackerClient == null || !config.saveLoot()) { - return; + return null; } log.debug("Submitting {} loot records", copy.size()); - lootTrackerClient.submit(copy); + CompletableFuture future = lootTrackerClient.submit(copy); + return future; } private void takeInventorySnapshot()