Skip to content

Commit 8526e0f

Browse files
committed
Discord Integration
1 parent 0018535 commit 8526e0f

File tree

10 files changed

+163
-7
lines changed

10 files changed

+163
-7
lines changed

gradle.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ org.gradle.jvmargs=-Xmx2G
33
org.gradle.parallel=true
44

55
# SimpleClient
6-
simpleclient_version=0.2.4
6+
simpleclient_version=0.2.5
7+
discord_game_sdk_version=v0.5.5

simpleclient-1.19.4/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ targetCompatibility = JavaVersion.VERSION_17
88

99
repositories {
1010
maven { url = "https://ladysnake.jfrog.io/artifactory/mods" }
11+
maven { url = "https://jitpack.io"}
1112
}
1213

1314
dependencies {
@@ -22,6 +23,8 @@ dependencies {
2223
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}"
2324
modImplementation "io.github.ladysnake:satin:${project.satin_version}"
2425
include "io.github.ladysnake:satin:${project.satin_version}"
26+
implementation "com.github.JnCrMx:discord-game-sdk4j:${rootProject.discord_game_sdk_version}"
27+
include "com.github.JnCrMx:discord-game-sdk4j:${rootProject.discord_game_sdk_version}"
2528
}
2629

2730
loom {

simpleclient-1.19.4/src/main/java/simpleclient/SimpleClient.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
11
package simpleclient;
22

33
import net.fabricmc.api.ClientModInitializer;
4+
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientEntityEvents;
5+
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
6+
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
7+
import net.fabricmc.fabric.api.entity.event.v1.ServerEntityWorldChangeEvents;
48
import net.fabricmc.loader.api.FabricLoader;
9+
import net.minecraft.client.Minecraft;
10+
import net.minecraft.client.multiplayer.ClientLevel;
11+
import net.minecraft.client.player.AbstractClientPlayer;
12+
import net.minecraft.client.player.LocalPlayer;
13+
import net.minecraft.world.entity.player.Player;
514
import org.slf4j.Logger;
615
import org.slf4j.LoggerFactory;
716
import simpleclient.adapter.TranslationAdapter;
817
import simpleclient.adapter.TranslationAdapterImpl;
918
import simpleclient.feature.FeatureManager;
19+
import simpleclient.util.DiscordRPC;
20+
21+
import java.net.InetSocketAddress;
22+
import java.time.Instant;
1023

1124
public class SimpleClient implements ClientModInitializer {
1225
public static final Logger LOGGER = LoggerFactory.getLogger("simpleclient");
@@ -17,6 +30,23 @@ public void onInitializeClient() {
1730
VERSION = loadVersion();
1831
TranslationAdapter.INSTANCE = new TranslationAdapterImpl();
1932
FeatureManager.INSTANCE.init();
33+
DiscordRPC.INSTANCE.init(() -> {
34+
Minecraft mc = Minecraft.getInstance();
35+
if (mc.player != null && mc.level != null) {
36+
if (DiscordRPC.INSTANCE.getIngameTimestamp() == null) DiscordRPC.INSTANCE.setIngameTimestamp(Instant.now());
37+
if (mc.getSingleplayerServer() == null) {
38+
InetSocketAddress address = (InetSocketAddress) mc.getConnection().getConnection().getRemoteAddress();
39+
return DiscordRPC.activity("Multiplayer", address.getHostName(), DiscordRPC.INSTANCE.getIngameTimestamp());
40+
} else {
41+
String gamemode = mc.player.isCreative() ? "Creative Mode" : mc.player.isSpectator() ? "Spectator Mode" : "Survival Mode";
42+
return DiscordRPC.activity("Singleplayer", gamemode, DiscordRPC.INSTANCE.getIngameTimestamp());
43+
}
44+
} else {
45+
if (DiscordRPC.INSTANCE.getIngameTimestamp() != null) DiscordRPC.INSTANCE.setIngameTimestamp(null);
46+
return DiscordRPC.activity("Not playing", null, DiscordRPC.INSTANCE.getStartTimestamp());
47+
}
48+
});
49+
ClientLifecycleEvents.CLIENT_STOPPING.register(client -> DiscordRPC.INSTANCE.close());
2050
}
2151

2252
public String loadVersion() {

simpleclient-1.20.1/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ dependencies {
2222
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}"
2323
modImplementation "io.github.ladysnake:satin:${project.satin_version}"
2424
include "io.github.ladysnake:satin:${project.satin_version}"
25+
implementation "com.github.JnCrMx:discord-game-sdk4j:${rootProject.discord_game_sdk_version}"
26+
include "com.github.JnCrMx:discord-game-sdk4j:${rootProject.discord_game_sdk_version}"
2527
}
2628

2729
loom {

simpleclient-1.20.1/src/main/java/simpleclient/SimpleClient.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
package simpleclient;
22

33
import net.fabricmc.api.ClientModInitializer;
4+
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
45
import net.fabricmc.loader.api.FabricLoader;
6+
import net.minecraft.client.Minecraft;
57
import org.slf4j.Logger;
68
import org.slf4j.LoggerFactory;
79
import simpleclient.adapter.TranslationAdapter;
810
import simpleclient.adapter.TranslationAdapterImpl;
911
import simpleclient.feature.FeatureManager;
12+
import simpleclient.util.DiscordRPC;
13+
14+
import java.net.InetSocketAddress;
15+
import java.time.Instant;
1016

1117
public class SimpleClient implements ClientModInitializer {
1218
public static final Logger LOGGER = LoggerFactory.getLogger("simpleclient");
@@ -17,6 +23,23 @@ public void onInitializeClient() {
1723
VERSION = loadVersion();
1824
TranslationAdapter.INSTANCE = new TranslationAdapterImpl();
1925
FeatureManager.INSTANCE.init();
26+
DiscordRPC.INSTANCE.init(() -> {
27+
Minecraft mc = Minecraft.getInstance();
28+
if (mc.player != null && mc.level != null) {
29+
if (DiscordRPC.INSTANCE.getIngameTimestamp() == null) DiscordRPC.INSTANCE.setIngameTimestamp(Instant.now());
30+
if (mc.getSingleplayerServer() == null) {
31+
InetSocketAddress address = (InetSocketAddress) mc.getConnection().getConnection().getRemoteAddress();
32+
return DiscordRPC.activity("Multiplayer", address.getHostName(), DiscordRPC.INSTANCE.getIngameTimestamp());
33+
} else {
34+
String gamemode = mc.player.isCreative() ? "Creative Mode" : mc.player.isSpectator() ? "Spectator Mode" : "Survival Mode";
35+
return DiscordRPC.activity("Singleplayer", gamemode, DiscordRPC.INSTANCE.getIngameTimestamp());
36+
}
37+
} else {
38+
if (DiscordRPC.INSTANCE.getIngameTimestamp() != null) DiscordRPC.INSTANCE.setIngameTimestamp(null);
39+
return DiscordRPC.activity("Not playing", null, DiscordRPC.INSTANCE.getStartTimestamp());
40+
}
41+
});
42+
ClientLifecycleEvents.CLIENT_STOPPING.register(client -> DiscordRPC.INSTANCE.close());
2043
}
2144

2245
public String loadVersion() {

simpleclient-1.20/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ dependencies {
2222
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}"
2323
modImplementation "io.github.ladysnake:satin:${project.satin_version}"
2424
include "io.github.ladysnake:satin:${project.satin_version}"
25+
implementation "com.github.JnCrMx:discord-game-sdk4j:${rootProject.discord_game_sdk_version}"
26+
include "com.github.JnCrMx:discord-game-sdk4j:${rootProject.discord_game_sdk_version}"
2527
}
2628

2729
loom {

simpleclient-1.20/src/main/java/simpleclient/SimpleClient.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
package simpleclient;
22

33
import net.fabricmc.api.ClientModInitializer;
4+
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
45
import net.fabricmc.loader.api.FabricLoader;
6+
import net.minecraft.client.Minecraft;
57
import org.slf4j.Logger;
68
import org.slf4j.LoggerFactory;
79
import simpleclient.adapter.TranslationAdapter;
810
import simpleclient.adapter.TranslationAdapterImpl;
911
import simpleclient.feature.FeatureManager;
12+
import simpleclient.util.DiscordRPC;
13+
14+
import java.net.InetSocketAddress;
15+
import java.time.Instant;
1016

1117
public class SimpleClient implements ClientModInitializer {
1218
public static final Logger LOGGER = LoggerFactory.getLogger("simpleclient");
@@ -17,6 +23,23 @@ public void onInitializeClient() {
1723
VERSION = loadVersion();
1824
TranslationAdapter.INSTANCE = new TranslationAdapterImpl();
1925
FeatureManager.INSTANCE.init();
26+
DiscordRPC.INSTANCE.init(() -> {
27+
Minecraft mc = Minecraft.getInstance();
28+
if (mc.player != null && mc.level != null) {
29+
if (DiscordRPC.INSTANCE.getIngameTimestamp() == null) DiscordRPC.INSTANCE.setIngameTimestamp(Instant.now());
30+
if (mc.getSingleplayerServer() == null) {
31+
InetSocketAddress address = (InetSocketAddress) mc.getConnection().getConnection().getRemoteAddress();
32+
return DiscordRPC.activity("Multiplayer", address.getHostName(), DiscordRPC.INSTANCE.getIngameTimestamp());
33+
} else {
34+
String gamemode = mc.player.isCreative() ? "Creative Mode" : mc.player.isSpectator() ? "Spectator Mode" : "Survival Mode";
35+
return DiscordRPC.activity("Singleplayer", gamemode, DiscordRPC.INSTANCE.getIngameTimestamp());
36+
}
37+
} else {
38+
if (DiscordRPC.INSTANCE.getIngameTimestamp() != null) DiscordRPC.INSTANCE.setIngameTimestamp(null);
39+
return DiscordRPC.activity("Not playing", null, DiscordRPC.INSTANCE.getStartTimestamp());
40+
}
41+
});
42+
ClientLifecycleEvents.CLIENT_STOPPING.register(client -> DiscordRPC.INSTANCE.close());
2043
}
2144

2245
public String loadVersion() {

simpleclient-core/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ plugins {
44

55
repositories {
66
mavenCentral()
7+
maven { url = "https://jitpack.io"}
78
}
89

910
dependencies {
1011
compileOnly 'com.google.guava:guava:31.1-jre'
1112
compileOnly 'com.google.code.gson:gson:2.10.1'
1213
compileOnly 'org.slf4j:slf4j-api:2.0.5'
14+
compileOnly "com.github.JnCrMx:discord-game-sdk4j:${rootProject.discord_game_sdk_version}"
1315
}
1416

1517
tasks.withType(JavaCompile).configureEach {
Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1 @@
1-
# Minecraft (https://fabricmc.net/develop)
2-
minecraft_version=1.19.4
3-
fabric_loader_version=0.14.21
4-
5-
# Dependencies
6-
fabric_api_version=0.83.0+1.19.4
1+
# Dependencies
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package simpleclient.util;
2+
3+
import de.jcm.discordgamesdk.Core;
4+
import de.jcm.discordgamesdk.CreateParams;
5+
import de.jcm.discordgamesdk.activity.Activity;
6+
import de.jcm.discordgamesdk.activity.ActivityType;
7+
8+
import java.time.Instant;
9+
import java.util.function.Supplier;
10+
11+
public class DiscordRPC extends Thread {
12+
public static DiscordRPC INSTANCE = new DiscordRPC();
13+
private boolean running = true;
14+
private Core core = null;
15+
private Instant startTimestamp = null;
16+
private Instant ingameTimestamp = null;
17+
private Supplier<Activity> activitySupplier;
18+
private long tick = 0;
19+
20+
@Override
21+
public void run() {
22+
try {
23+
while(running) {
24+
if (tick % 20 == 0) core.activityManager().updateActivity(activitySupplier.get());
25+
core.runCallbacks();
26+
Thread.sleep(50);
27+
tick++;
28+
}
29+
} catch (Exception e) {
30+
e.printStackTrace();
31+
}
32+
}
33+
34+
public void init(Supplier<Activity> activitySupplier) {
35+
try {
36+
Core.initDownload();
37+
CreateParams params = new CreateParams();
38+
params.setClientID(1124616010658484335L);
39+
params.setFlags(CreateParams.getDefaultFlags());
40+
core = new Core(params);
41+
startTimestamp = Instant.now();
42+
this.activitySupplier = activitySupplier;
43+
start();
44+
} catch (Exception e) {
45+
e.printStackTrace();
46+
}
47+
}
48+
49+
public void close() {
50+
running = false;
51+
core.close();
52+
}
53+
54+
public Instant getStartTimestamp() {
55+
return startTimestamp;
56+
}
57+
58+
public Instant getIngameTimestamp() {
59+
return ingameTimestamp;
60+
}
61+
62+
public void setIngameTimestamp(Instant ingameTimestamp) {
63+
this.ingameTimestamp = ingameTimestamp;
64+
}
65+
66+
public static Activity activity(String line1, String line2, Instant timestamp) {
67+
Activity activity = new Activity();
68+
activity.setType(ActivityType.PLAYING);
69+
if (line1 != null) activity.setDetails(line1);
70+
if (line2 != null) activity.setState(line2);
71+
if (timestamp != null) activity.timestamps().setStart(timestamp);
72+
activity.assets().setLargeImage("simpleclient_1024");
73+
return activity;
74+
}
75+
}

0 commit comments

Comments
 (0)