Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
38 changes: 12 additions & 26 deletions src/main/java/net/asodev/islandutils/discord/DiscordPresence.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -59,7 +45,7 @@ public static void clear() {
try { core.close(); }
catch (Exception e) { e.printStackTrace(); }

initalised = false;
initialised = false;
core = null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -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;
Expand Down Expand Up @@ -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("");
Expand Down Expand Up @@ -199,6 +203,7 @@ public static void updateActivity() {
overrideActivityWithBigRat();
}

recreateActivity(activity);
try { core.activityManager().updateActivity(activity); }
catch (Exception e) { e.printStackTrace(); }
}
Expand Down Expand Up @@ -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<String> 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) {}
}

}
83 changes: 0 additions & 83 deletions src/main/java/net/asodev/islandutils/discord/NativeLibrary.java

This file was deleted.

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading