Skip to content

Commit 86016c8

Browse files
emyfopsAvanatiker
andauthored
Feature: Discord RPC (#13)
Discord RPC implementation Custom HTTP server for publc/private parties Uses connection server hash and discord access token to verify the ownership of the account ## Features - Create parties with visibility (public/private) - Invite friends in-game from discord - Show who is speaking in-game (later) --------- Co-authored-by: Constructor <fractalminds@protonmail.com>
1 parent a5814ee commit 86016c8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1124
-23
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,7 @@ logs/
4949

5050
### Architectury ###
5151
.architectury-transformer/
52+
53+
### Kotlin ###
54+
*.kotlin_module
55+
.kotlin/

build.gradle.kts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,11 @@ allprojects {
6262
base.archivesName = modId
6363

6464
repositories {
65-
maven("https://api.modrinth.com/maven")
66-
maven("https://jitpack.io")
67-
maven("https://maven.shedaniel.me/") { name = "Architectury" }
65+
maven("https://maven.shedaniel.me/") // Architectury
6866
maven("https://maven.terraformersmc.com/releases/")
69-
maven("https://babbaj.github.io/maven/")
67+
maven("https://babbaj.github.io/maven/") // Baritone
68+
maven("https://jitpack.io") // KDiscordIPC
69+
mavenCentral()
7070

7171
// Allow the use of local libraries
7272
flatDir {

common/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ val modId: String by project
22
val fabricLoaderVersion: String by project
33
val kotlinVersion: String by project
44
val kotlinxCoroutinesVersion: String by project
5+
val discordIPCVersion: String by project
56

67
architectury { common("fabric", "forge", "neoforge") }
78

@@ -21,6 +22,7 @@ dependencies {
2122

2223
// Add dependencies on the required Kotlin modules.
2324
implementation("org.reflections:reflections:0.10.2")
25+
implementation("com.github.Edouard127:KDiscordIPC:$discordIPCVersion")
2426

2527
// Add Kotlin
2628
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinxCoroutinesVersion")

common/src/main/java/com/lambda/mixin/ClientConnectionMixin.java renamed to common/src/main/java/com/lambda/mixin/network/ClientConnectionMixin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.lambda.mixin;
1+
package com.lambda.mixin.network;
22

33
import com.lambda.event.EventFlow;
44
import com.lambda.event.events.ConnectionEvent;
@@ -73,7 +73,7 @@ private void onConnect(
7373
ConnectionIntent intent,
7474
CallbackInfo ci
7575
) {
76-
EventFlow.post(new ConnectionEvent.Connect(address, port, listener, intent));
76+
EventFlow.post(new ConnectionEvent.Connect.Pre(address, port, listener, intent));
7777
}
7878

7979
@Inject(method = "disconnect(Lnet/minecraft/text/Text;)V", at = @At("HEAD"))
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.lambda.mixin.network;
2+
3+
import com.lambda.event.EventFlow;
4+
import com.lambda.event.events.ConnectionEvent;
5+
import com.lambda.module.modules.client.DiscordRPC;
6+
import net.minecraft.client.network.ClientLoginNetworkHandler;
7+
import net.minecraft.network.packet.s2c.login.LoginSuccessS2CPacket;
8+
import net.minecraft.text.Text;
9+
import org.spongepowered.asm.mixin.Mixin;
10+
import org.spongepowered.asm.mixin.injection.At;
11+
import org.spongepowered.asm.mixin.injection.Inject;
12+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
13+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
14+
15+
@Mixin(ClientLoginNetworkHandler.class)
16+
public class ClientLoginNetworkMixin {
17+
18+
@Inject(method = "onSuccess(Lnet/minecraft/network/packet/s2c/login/LoginSuccessS2CPacket;)V", at = @At("HEAD"))
19+
private void onSuccess(LoginSuccessS2CPacket packet, CallbackInfo ci) {
20+
EventFlow.post(new ConnectionEvent.Connect.Post(packet.getProfile()));
21+
}
22+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.lambda.mixin.network;
2+
3+
import com.lambda.event.EventFlow;
4+
import com.lambda.event.events.ConnectionEvent;
5+
import net.minecraft.network.packet.c2s.handshake.ConnectionIntent;
6+
import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.Inject;
10+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
11+
12+
@Mixin(HandshakeC2SPacket.class)
13+
public class HandshakeC2SPacketMixin {
14+
@Inject(method = "<init>(ILjava/lang/String;ILnet/minecraft/network/packet/c2s/handshake/ConnectionIntent;)V", at = @At("TAIL"))
15+
private void onHandshakeC2SPacket(int i, String string, int j, ConnectionIntent connectionIntent, CallbackInfo ci) {
16+
EventFlow.post(new ConnectionEvent.Connect.Handshake(i, string, j, connectionIntent));
17+
}
18+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.lambda.mixin.network;
2+
3+
import com.lambda.event.EventFlow;
4+
import com.lambda.event.events.ConnectionEvent;
5+
import net.minecraft.network.packet.c2s.login.LoginHelloC2SPacket;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.injection.At;
8+
import org.spongepowered.asm.mixin.injection.Inject;
9+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
10+
11+
import java.util.UUID;
12+
13+
@Mixin(LoginHelloC2SPacket.class)
14+
public class LoginHelloC2SPacketMixin {
15+
@Inject(method = "<init>(Ljava/lang/String;Ljava/util/UUID;)V", at = @At("TAIL"))
16+
private void onLoginHelloC2SPacket(String string, UUID uUID, CallbackInfo ci) {
17+
EventFlow.post(new ConnectionEvent.Connect.Login.Hello(string, uUID));
18+
}
19+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.lambda.mixin.network;
2+
3+
import com.lambda.event.EventFlow;
4+
import com.lambda.event.events.ConnectionEvent;
5+
import net.minecraft.network.packet.c2s.login.LoginKeyC2SPacket;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.injection.At;
8+
import org.spongepowered.asm.mixin.injection.Inject;
9+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
10+
11+
import javax.crypto.SecretKey;
12+
import java.security.PublicKey;
13+
14+
@Mixin(LoginKeyC2SPacket.class)
15+
public class LoginKeyC2SPacketMixin {
16+
@Inject(method = "<init>(Ljavax/crypto/SecretKey;Ljava/security/PublicKey;[B)V", at = @At("TAIL"))
17+
private void onLoginKeyC2SPacket(SecretKey secretKey, PublicKey publicKey, byte[] nonce, CallbackInfo ci) {
18+
// Please note this won't work if the server is offline mode because the player doesn't
19+
// fetch the server's public key.
20+
EventFlow.post(new ConnectionEvent.Connect.Login.Key(secretKey, publicKey, nonce));
21+
}
22+
}

common/src/main/kotlin/com/lambda/Lambda.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ object Lambda {
2626
const val MOD_NAME = "Lambda"
2727
const val MOD_ID = "lambda"
2828
const val SYMBOL = "λ"
29+
const val APP_ID = "1221289599427416127"
2930
val VERSION: String = LoaderInfo.getVersion()
3031
val LOG: Logger = LogManager.getLogger(SYMBOL)
3132

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.lambda.command.commands
2+
3+
import com.lambda.brigadier.*
4+
import com.lambda.brigadier.argument.literal
5+
import com.lambda.brigadier.argument.value
6+
import com.lambda.brigadier.argument.word
7+
import com.lambda.command.LambdaCommand
8+
import com.lambda.module.modules.client.DiscordRPC
9+
import com.lambda.util.extension.CommandBuilder
10+
11+
object RpcCommand : LambdaCommand(
12+
name = "rpc",
13+
description = "Discord Rich Presence commands.",
14+
usage = "rpc <join [id] | accept>"
15+
) {
16+
override fun CommandBuilder.create() {
17+
required(literal("join")) {
18+
required(word("id")) { id ->
19+
execute {
20+
DiscordRPC.join(id().value())
21+
}
22+
}
23+
}
24+
25+
required(literal("accept")) {
26+
execute {
27+
DiscordRPC.join()
28+
}
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)