aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorKevin <92656833+kevinthegreat1@users.noreply.github.com>2023-06-22 10:49:18 +0800
committerGitHub <noreply@github.com>2023-06-22 10:49:18 +0800
commit4c987071fbc4dc2898afaa0f45f4887808a56de3 (patch)
tree8373f04176469756c59c7c5636ccffdf82dcd1e9 /src/main/java
parenta45c32999abf4ae9218df5e4cb75f50284256322 (diff)
parentf7434efeae8f4ea0d193cdad11928f5a13eb6374 (diff)
downloadSkyblocker-4c987071fbc4dc2898afaa0f45f4887808a56de3.tar.gz
Skyblocker-4c987071fbc4dc2898afaa0f45f4887808a56de3.tar.bz2
Skyblocker-4c987071fbc4dc2898afaa0f45f4887808a56de3.zip
Merge pull request #184 from SkyblockerMod/discord-presence-fix
* Async DiscordRPC * Fix DiscordRPC briefly showing
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.java89
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java4
3 files changed, 71 insertions, 24 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 4fa5265f..29a2c958 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/discord/DiscordRPCManager.java
@@ -11,42 +11,89 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.DecimalFormat;
+import java.util.concurrent.CompletableFuture;
+/**
+ * Manages the discord rich presence. Automatically connects to discord and displays a customizable activity when playing Skyblock.
+ */
public class DiscordRPCManager {
public static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("###,###.##");
public static final Logger LOGGER = LoggerFactory.getLogger("Skyblocker Discord RPC");
+ /**
+ * The update task used to avoid multiple update tasks running simultaneously.
+ */
+ public static CompletableFuture<Void> updateTask;
public static long startTimeStamp;
public static int cycleCount;
- public static void init(){
- SkyblockEvents.LEAVE.register(DiscordIPC::stop);
+ public static void init() {
+ SkyblockEvents.LEAVE.register(DiscordRPCManager::initAndUpdatePresence);
SkyblockEvents.JOIN.register(() -> {
startTimeStamp = System.currentTimeMillis();
- if (DiscordIPC.start(934607927837356052L, null)) {
- DiscordIPC.setActivity(buildPresence());
- LOGGER.info("Discord RPC started");
- } else {
- LOGGER.error("Discord RPC failed to start");
- }
+ initAndUpdatePresence(true);
});
}
- public static void update(){
+ /**
+ * Checks the {@link SkyblockerConfig.RichPresence#customMessage custom message}, updates {@link #cycleCount} if enabled, and updates rich presence.
+ */
+ 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();
+ }
+
+ /**
+ * @see #initAndUpdatePresence(boolean)
+ */
+ 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(){
+ public static RichPresence buildPresence() {
RichPresence presence = new RichPresence();
presence.setLargeImage("skyblocker-default", null);
presence.setStart(startTimeStamp);
@@ -55,16 +102,16 @@ public class DiscordRPCManager {
return presence;
}
- public static String getInfo(){
+ public static String getInfo() {
String info = null;
- if (!SkyblockerConfig.get().richPresence.cycleMode){
- switch (SkyblockerConfig.get().richPresence.info){
+ if (!SkyblockerConfig.get().richPresence.cycleMode) {
+ switch (SkyblockerConfig.get().richPresence.info) {
case BITS -> info = "Bits: " + DECIMAL_FORMAT.format(Utils.getBits());
case PURSE -> info = "Purse: " + DECIMAL_FORMAT.format(Utils.getPurse());
case LOCATION -> info = "⏣ " + Utils.getLocation();
}
- } else if (SkyblockerConfig.get().richPresence.cycleMode){
- switch (cycleCount){
+ } else if (SkyblockerConfig.get().richPresence.cycleMode) {
+ switch (cycleCount) {
case 0 -> info = "Bits: " + DECIMAL_FORMAT.format(Utils.getBits());
case 1 -> info = "Purse: " + DECIMAL_FORMAT.format(Utils.getPurse());
case 2 -> info = "⏣ " + Utils.getLocation();
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");
}