diff --git a/build.gradle.kts b/build.gradle.kts index 1db0d5cf..5927ace4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -48,8 +48,8 @@ dependencies { modApi("com.noxcrew.noxesium:fabric:${properties["noxesium_version"]!!}") // Other libraries - include("com.github.JnCrMx:discord-game-sdk4j:v0.5.5") - implementation("com.github.JnCrMx:discord-game-sdk4j:v0.5.5") + include("com.github.JnCrMx:discord-game-sdk4j:v1.0.0") + implementation("com.github.JnCrMx:discord-game-sdk4j:v1.0.0") } java { diff --git a/src/main/java/net/asodev/islandutils/discord/DiscordPresence.java b/src/main/java/net/asodev/islandutils/discord/DiscordPresence.java index ba7cd8cb..9875a308 100644 --- a/src/main/java/net/asodev/islandutils/discord/DiscordPresence.java +++ b/src/main/java/net/asodev/islandutils/discord/DiscordPresence.java @@ -2,45 +2,31 @@ import de.jcm.discordgamesdk.Core; import de.jcm.discordgamesdk.CreateParams; - -import java.io.File; +import de.jcm.discordgamesdk.LogLevel; public class DiscordPresence { static Core core; - static boolean initalised = false; - - static String os = System.getProperty("os.name").toLowerCase(); + static boolean initialised = false; public static boolean init() { - if (initalised) return true; + if (initialised) return true; - File discordLibrary; try { - discordLibrary = NativeLibrary.grabDiscordNative(); - File discordJNI = NativeLibrary.grabDiscordJNI(); - - if (os.contains("windows")) System.load(discordLibrary.getAbsolutePath()); - System.load(discordJNI.getAbsolutePath()); - } catch (Exception e) { - System.out.println("Failed to grab Natives: " + e.getMessage()); - return false; - } - - Core.initDiscordNative(discordLibrary.getAbsolutePath()); - - CreateParams params = new CreateParams(); - params.setClientID(1027930697417101344L); - params.setFlags(CreateParams.Flags.NO_REQUIRE_DISCORD); + clear(); // just in case :) - try { + CreateParams params = new CreateParams(); + params.setClientID(1027930697417101344L); + params.setFlags(CreateParams.Flags.NO_REQUIRE_DISCORD); core = new Core(params); - initalised = true; + // By default, logging is set to verbose for some reason, causing a lot of spam in the logs + core.setLogHook(LogLevel.WARN, Core.DEFAULT_LOG_HOOK); + initialised = true; } catch (Exception e) { System.out.println("Failed to Initialise Discord Presence."); + e.printStackTrace(); return false; } - new Thread(() -> { while (core != null && core.isOpen()) { core.runCallbacks(); @@ -59,7 +45,7 @@ public static void clear() { try { core.close(); } catch (Exception e) { e.printStackTrace(); } - initalised = false; + initialised = false; core = null; } diff --git a/src/main/java/net/asodev/islandutils/discord/DiscordPresenceUpdator.java b/src/main/java/net/asodev/islandutils/discord/DiscordPresenceUpdator.java index 71fac84b..80956a02 100644 --- a/src/main/java/net/asodev/islandutils/discord/DiscordPresenceUpdator.java +++ b/src/main/java/net/asodev/islandutils/discord/DiscordPresenceUpdator.java @@ -7,13 +7,14 @@ import net.asodev.islandutils.options.IslandOptions; import net.asodev.islandutils.options.categories.DiscordOptions; import net.asodev.islandutils.state.Game; -import net.minecraft.client.resources.language.I18n; import net.asodev.islandutils.state.MccIslandState; +import net.minecraft.client.resources.language.I18n; import org.jetbrains.annotations.Nullable; import java.time.Instant; import java.util.List; import java.util.UUID; +import java.util.function.Consumer; public class DiscordPresenceUpdator { @@ -24,6 +25,9 @@ public class DiscordPresenceUpdator { // dear contributors: // i am sorry. + // from contributors: + // it's ok :) + @Nullable public static Activity activity; public static UUID timeLeftBossbar = null; public static Instant started; @@ -97,7 +101,7 @@ public static void updatePlace(Game game) { activity.setDetails(I18n.get("islandutils.discordPresence.details.inThePlace", I18n.get("islandutils.discordPresence.place.hub"))); else activity.setDetails(I18n.get("islandutils.discordPresence.details.inHub")); - + REMAIN_STATE = null; ROUND_STATE = null; activity.setState(""); @@ -199,6 +203,7 @@ public static void updateActivity() { overrideActivityWithBigRat(); } + recreateActivity(activity); try { core.activityManager().updateActivity(activity); } catch (Exception e) { e.printStackTrace(); } } @@ -243,4 +248,61 @@ public static void updateFromConfig(DiscordOptions options) { } catch (Exception e) { e.printStackTrace(); } } + // Discord Game SDK does not accept empty strings as payload + // to deal with that we recreate it with only valid fields + public static void recreateActivity(@Nullable Activity oldActivity) throws RuntimeException { + if (oldActivity == null) { + activity = null; + return; + } + + Activity newActivity = new Activity(); + + copyIfNotBlank(oldActivity.getDetails(), newActivity::setDetails); + copyIfNotBlank(oldActivity.getState(), newActivity::setState); + + copyIfNotBlank( + oldActivity.assets().getLargeImage(), + newActivity.assets()::setLargeImage + ); + copyIfNotBlank( + oldActivity.assets().getLargeText(), + newActivity.assets()::setLargeText + ); + copyIfNotBlank( + oldActivity.assets().getSmallImage(), + newActivity.assets()::setSmallImage + ); + copyIfNotBlank( + oldActivity.assets().getSmallText(), + newActivity.assets()::setSmallText + ); + + copyTimestampsSafely(oldActivity, newActivity); + + activity = newActivity; + } + + private static void copyIfNotBlank(@Nullable String value, Consumer setter) { + if (value != null && !value.isBlank()) { + setter.accept(value); + } + } + + private static void copyTimestampsSafely(Activity oldActivity, Activity newActivity) { + try { + Instant start = oldActivity.timestamps().getStart(); + if (start != null && !start.equals(Instant.ofEpochSecond(0))) { + newActivity.timestamps().setStart(start); + } + } catch (Exception ignored) {} + + try { + Instant end = oldActivity.timestamps().getEnd(); + if (end != null && !end.equals(Instant.ofEpochSecond(0))) { + newActivity.timestamps().setEnd(end); + } + } catch (Exception ignored) {} + } + } diff --git a/src/main/java/net/asodev/islandutils/discord/NativeLibrary.java b/src/main/java/net/asodev/islandutils/discord/NativeLibrary.java deleted file mode 100644 index cefbcde2..00000000 --- a/src/main/java/net/asodev/islandutils/discord/NativeLibrary.java +++ /dev/null @@ -1,83 +0,0 @@ -package net.asodev.islandutils.discord; - -import net.asodev.islandutils.util.resourcepack.ResourcePackOptions; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.StandardCopyOption; - -import static net.asodev.islandutils.util.Utils.assertIslandFolder; - -public class NativeLibrary { - - public static String os = System.getProperty("os.name").toLowerCase(); - public static String architecture = System.getProperty("os.arch").toLowerCase(); - - public static File grabDiscordNative() throws Exception { - String name = "discord_game_sdk"; - String extention; - - if (os.contains("windows")) extention = ".dll"; - else if (os.contains("linux")) extention = ".so"; - else if (os.contains("mac os")) extention = ".dylib"; - else { throw new RuntimeException("Can't get OS type: " + os + ". Discord Presence Disabled."); } - - if (architecture.equals("amd64")) architecture = "x86_64"; - - String libIndex = "native/lib/" + architecture + "/" + name+extention; - - assertIslandFolder(); - File outFile = ResourcePackOptions.islandFolder.resolve(libIndex).toFile(); - if (!outFile.exists()) { - System.out.println("Extracting Discord Natives."); - InputStream stream = NativeLibrary.class.getResourceAsStream("/" + libIndex); - if (stream == null) throw new IOException("Natives couldn't be found in the resources. (" + libIndex + ")"); - - outFile.mkdirs(); - Files.copy(stream, outFile.toPath(), StandardCopyOption.REPLACE_EXISTING); - } - - return outFile; - } - - public static File grabDiscordJNI() throws IOException { - String name = "discord_game_sdk_jni"; - String osName = os; - - String fileName; - - if(osName.contains("windows")) { - osName = "windows"; - fileName = name + ".dll"; - } - else if(osName.contains("linux")) { - osName = "linux"; - fileName = "lib" + name + ".so"; - } - else if(osName.contains("mac os")) { - osName = "macos"; - fileName = "lib" + name + ".dylib"; - } - else { - throw new RuntimeException("cannot determine OS type: "+osName); - } - - if(architecture.equals("x86_64")) - architecture = "amd64"; - - String libIndex = "native/"+osName+"/"+architecture+"/"+fileName; - - File outFile = ResourcePackOptions.islandFolder.resolve(libIndex).toFile(); - if (!outFile.exists()) { - InputStream stream = NativeLibrary.class.getResourceAsStream("/" + libIndex); - if (stream == null) throw new IOException("JNI couldn't be found in the resources. (" + libIndex + ")"); - - outFile.mkdirs(); - Files.copy(stream, outFile.toPath(), StandardCopyOption.REPLACE_EXISTING); - } - return outFile; - } - -} diff --git a/src/main/resources/native/lib/aarch64/discord_game_sdk.bundle b/src/main/resources/native/lib/aarch64/discord_game_sdk.bundle deleted file mode 100644 index 8f086062..00000000 Binary files a/src/main/resources/native/lib/aarch64/discord_game_sdk.bundle and /dev/null differ diff --git a/src/main/resources/native/lib/aarch64/discord_game_sdk.dylib b/src/main/resources/native/lib/aarch64/discord_game_sdk.dylib deleted file mode 100644 index 8f086062..00000000 Binary files a/src/main/resources/native/lib/aarch64/discord_game_sdk.dylib and /dev/null differ diff --git a/src/main/resources/native/lib/x86/discord_game_sdk.dll b/src/main/resources/native/lib/x86/discord_game_sdk.dll deleted file mode 100644 index 45b9bb17..00000000 Binary files a/src/main/resources/native/lib/x86/discord_game_sdk.dll and /dev/null differ diff --git a/src/main/resources/native/lib/x86/discord_game_sdk.dll.lib b/src/main/resources/native/lib/x86/discord_game_sdk.dll.lib deleted file mode 100644 index 02c417e6..00000000 Binary files a/src/main/resources/native/lib/x86/discord_game_sdk.dll.lib and /dev/null differ diff --git a/src/main/resources/native/lib/x86_64/discord_game_sdk.bundle b/src/main/resources/native/lib/x86_64/discord_game_sdk.bundle deleted file mode 100644 index 3402426b..00000000 Binary files a/src/main/resources/native/lib/x86_64/discord_game_sdk.bundle and /dev/null differ diff --git a/src/main/resources/native/lib/x86_64/discord_game_sdk.dll b/src/main/resources/native/lib/x86_64/discord_game_sdk.dll deleted file mode 100644 index be946ea7..00000000 Binary files a/src/main/resources/native/lib/x86_64/discord_game_sdk.dll and /dev/null differ diff --git a/src/main/resources/native/lib/x86_64/discord_game_sdk.dll.lib b/src/main/resources/native/lib/x86_64/discord_game_sdk.dll.lib deleted file mode 100644 index 562b01cd..00000000 Binary files a/src/main/resources/native/lib/x86_64/discord_game_sdk.dll.lib and /dev/null differ diff --git a/src/main/resources/native/lib/x86_64/discord_game_sdk.dylib b/src/main/resources/native/lib/x86_64/discord_game_sdk.dylib deleted file mode 100644 index 3402426b..00000000 Binary files a/src/main/resources/native/lib/x86_64/discord_game_sdk.dylib and /dev/null differ diff --git a/src/main/resources/native/lib/x86_64/discord_game_sdk.so b/src/main/resources/native/lib/x86_64/discord_game_sdk.so deleted file mode 100644 index 9dacf946..00000000 Binary files a/src/main/resources/native/lib/x86_64/discord_game_sdk.so and /dev/null differ diff --git a/src/main/resources/native/linux/amd64/libdiscord_game_sdk_jni.so b/src/main/resources/native/linux/amd64/libdiscord_game_sdk_jni.so deleted file mode 100644 index 8e36260c..00000000 Binary files a/src/main/resources/native/linux/amd64/libdiscord_game_sdk_jni.so and /dev/null differ diff --git a/src/main/resources/native/macos/amd64/libdiscord_game_sdk_jni.dylib b/src/main/resources/native/macos/amd64/libdiscord_game_sdk_jni.dylib deleted file mode 100644 index 82a22f4d..00000000 Binary files a/src/main/resources/native/macos/amd64/libdiscord_game_sdk_jni.dylib and /dev/null differ diff --git a/src/main/resources/native/windows/amd64/discord_game_sdk_jni.dll b/src/main/resources/native/windows/amd64/discord_game_sdk_jni.dll deleted file mode 100644 index 9125a736..00000000 Binary files a/src/main/resources/native/windows/amd64/discord_game_sdk_jni.dll and /dev/null differ diff --git a/src/main/resources/native/windows/x86/discord_game_sdk_jni.dll b/src/main/resources/native/windows/x86/discord_game_sdk_jni.dll deleted file mode 100644 index dfb803a6..00000000 Binary files a/src/main/resources/native/windows/x86/discord_game_sdk_jni.dll and /dev/null differ