aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorKevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>2023-06-20 12:08:38 +0800
committerKevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>2023-06-21 17:36:56 +0800
commit8a5abeaec788dd5d17d8ddfb548a16fd2e8c5e43 (patch)
tree13c3d5c7deb73b7a0772da90872f994056ad19a5 /src/main/java
parent6dcbd5b6ceda32e6c347a2c0d40f9f522b9eaa02 (diff)
downloadSkyblocker-8a5abeaec788dd5d17d8ddfb548a16fd2e8c5e43.tar.gz
Skyblocker-8a5abeaec788dd5d17d8ddfb548a16fd2e8c5e43.tar.bz2
Skyblocker-8a5abeaec788dd5d17d8ddfb548a16fd2e8c5e43.zip
Async DiscordRPC
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java67
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java4
3 files changed, 52 insertions, 21 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
index bfc5013b..189ecca3 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
@@ -82,7 +82,7 @@ public class SkyblockerMod implements ClientModInitializer {
containerSolverManager.init();
DungeonMap.init();
scheduler.scheduleCyclic(Utils::sbChecker, 20);
- scheduler.scheduleCyclic(DiscordRPCManager::update, 100);
+ scheduler.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 100);
scheduler.scheduleCyclic(DungeonBlaze::update, 4);
scheduler.scheduleCyclic(LividColor::update, 10);
scheduler.scheduleCyclic(BackpackPreview::tick, 50);
diff --git a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java
index 1ac2f6d5..f7ec2f33 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java
@@ -11,43 +11,74 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.DecimalFormat;
+import java.util.concurrent.CompletableFuture;
public class DiscordRPCManager {
public static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("###,###.##");
public static final Logger LOGGER = LoggerFactory.getLogger("Skyblocker Discord RPC");
+ public static CompletableFuture<Void> updateTask;
public static long startTimeStamp;
public static int cycleCount;
public static void init() {
- SkyblockEvents.LEAVE.register(DiscordIPC::stop);
+ SkyblockEvents.LEAVE.register(DiscordRPCManager::initAndUpdatePresence);
SkyblockEvents.JOIN.register(() -> {
startTimeStamp = System.currentTimeMillis();
- if (DiscordIPC.start(934607927837356052L, null)) {
- if (SkyblockerConfig.get().richPresence.enableRichPresence) {
- DiscordIPC.setActivity(buildPresence());
- LOGGER.info("Discord RPC started successfully");
- } else {
- LOGGER.info("Discord RPC started successfully but is currently disabled");
- }
- } else {
- LOGGER.error("Discord RPC failed to start");
- }
+ initAndUpdatePresence(true);
});
}
- public static void update() {
+ public static void updateDataAndPresence() {
// If the custom message is empty, discord will keep the last message, this is can serve as a default if the user doesn't want a custom message
if (SkyblockerConfig.get().richPresence.customMessage.isEmpty()) {
SkyblockerConfig.get().richPresence.customMessage = "Playing Skyblock";
AutoConfig.getConfigHolder(SkyblockerConfig.class).save();
}
- if ((!Utils.isOnSkyblock() || !SkyblockerConfig.get().richPresence.enableRichPresence) && DiscordIPC.isConnected()) {
- DiscordIPC.stop();
- LOGGER.info("Discord RPC stopped");
- return;
- }
if (SkyblockerConfig.get().richPresence.cycleMode) cycleCount = (cycleCount + 1) % 3;
- DiscordIPC.setActivity(buildPresence());
+ initAndUpdatePresence();
+ }
+
+ private static void initAndUpdatePresence() {
+ initAndUpdatePresence(false);
+ }
+
+ /**
+ * Updates discord presence asynchronously.
+ * <p>
+ * When the {@link #updateTask previous update} does not exist or {@link CompletableFuture#isDone() has completed}:
+ * <p>
+ * Connects to discord if {@link SkyblockerConfig.RichPresence#enableRichPresence rich presence is enabled},
+ * the player {@link Utils#isOnSkyblock() is on Skyblock}, and {@link DiscordIPC#isConnected() discord is not already connected}.
+ * Updates the presence if {@link SkyblockerConfig.RichPresence#enableRichPresence rich presence is enabled}
+ * and the player {@link Utils#isOnSkyblock() is on Skyblock}.
+ * Stops the connection if {@link SkyblockerConfig.RichPresence#enableRichPresence rich presence is disabled}
+ * or the player {@link Utils#isOnSkyblock() is not on Skyblock} and {@link DiscordIPC#isConnected() discord is connected}.
+ * Saves the update task in {@link #updateTask}
+ *
+ * @param initialization whether this is the first time the presence is being updates. If {@code true}, a message will be logged
+ * if {@link SkyblockerConfig.RichPresence#enableRichPresence rich presence is disabled}.
+ */
+ private static void initAndUpdatePresence(boolean initialization) {
+ if (updateTask == null || updateTask.isDone()) {
+ updateTask = CompletableFuture.runAsync(() -> {
+ if (SkyblockerConfig.get().richPresence.enableRichPresence && Utils.isOnSkyblock()) {
+ if (!DiscordIPC.isConnected()) {
+ if (DiscordIPC.start(934607927837356052L, null)) {
+ LOGGER.info("Discord RPC started successfully");
+ } else {
+ LOGGER.error("Discord RPC failed to start");
+ return;
+ }
+ }
+ DiscordIPC.setActivity(buildPresence());
+ } else if (DiscordIPC.isConnected()) {
+ DiscordIPC.stop();
+ LOGGER.info("Discord RPC stopped");
+ } else if (initialization) {
+ LOGGER.info("Discord RPC is currently disabled");
+ }
+ });
+ }
}
public static RichPresence buildPresence() {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java
index 028386ab..a4e403fc 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java
@@ -52,13 +52,13 @@ public class Utils {
isInjected = true;
ItemTooltipCallback.EVENT.register(PriceInfoTooltip::onInjectTooltip);
}
- SkyblockEvents.JOIN.invoker().onSkyblockJoin();
isOnSkyblock = true;
+ SkyblockEvents.JOIN.invoker().onSkyblockJoin();
}
} else if (isOnSkyblock) {
- SkyblockEvents.LEAVE.invoker().onSkyblockLeave();
isOnSkyblock = false;
isInDungeons = false;
+ SkyblockEvents.LEAVE.invoker().onSkyblockLeave();
}
isInDungeons = isOnSkyblock && string.contains("The Catacombs");
}