diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..32cfc61 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.watcherExclude": { + "**/target": true + } +} \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index 14a96d6..f97fa64 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "discord-rpc-client" -version = "0.5.1" +version = "0.5.2" description = "A Rust client for Discord RPC." authors = [ "Patrick Auernig ", diff --git a/examples/java.rs b/examples/java.rs index d9e8b2f..65f25ff 100644 --- a/examples/java.rs +++ b/examples/java.rs @@ -15,7 +15,17 @@ pub extern "system" fn Java_com_discord_rpc_DiscordRPC_connect(env: JNIEnv, obj: Java_com_discord_rpc_DiscordRPC_connect0(env, obj, client_id).is_ok() } +#[no_mangle] +pub extern "system" fn Java_com_discord_rpc_DiscordRPC_disconnect(env: JNIEnv, obj: JObject) -> bool { + Java_com_discord_rpc_DiscordRPC_disconnect0(env, obj).is_ok() +} + #[no_mangle] pub extern "system" fn Java_com_discord_rpc_DiscordRPC_setActivity(env: JNIEnv, obj: JObject, j_activity: JObject) -> bool { Java_com_discord_rpc_DiscordRPC_setActivity0(env, obj, j_activity).is_ok() } + +#[no_mangle] +pub extern "system" fn Java_com_discord_rpc_DiscordRPC_clearActivity(env: JNIEnv, obj: JObject) -> bool { + Java_com_discord_rpc_DiscordRPC_clearActivity0(env, obj).is_ok() +} diff --git a/java/build.sbt b/java/build.sbt index 01e2596..9ae117d 100644 --- a/java/build.sbt +++ b/java/build.sbt @@ -1,8 +1,11 @@ ThisBuild / organization := "com.discord" -ThisBuild / version := "0.2.0" +ThisBuild / version := "0.2.1" -lazy val hello = (project in file(".")) +lazy val root = (project in file(".")) .settings( name := "discord-rpc" ) +//libraryDependencies += "org.scalactic" %% "scalactic" % "3.2.10" +//libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % "test" +libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.10" % Test diff --git a/java/src/main/java/com/discord/rpc/DiscordRPC.java b/java/src/main/java/com/discord/rpc/DiscordRPC.java index 6d313f7..37d8e3f 100644 --- a/java/src/main/java/com/discord/rpc/DiscordRPC.java +++ b/java/src/main/java/com/discord/rpc/DiscordRPC.java @@ -16,8 +16,12 @@ public final class DiscordRPC { public native boolean connect(String clientId); + public native boolean disconnect(); + public native boolean setActivity(Activity activity); + public native boolean clearActivity(); + static { final var dir = System.getProperty("com.discord.librarypath"); if (dir != null) { @@ -26,5 +30,10 @@ public final class DiscordRPC { System.loadLibrary("discord_rpc"); } } -} + /** + * This method does nothing, but ensures that the native library will be loaded. + */ + public static void initialize() { + } +} diff --git a/java/src/test/scala/com/discord/rpc/DiscordRPCSpec.scala b/java/src/test/scala/com/discord/rpc/DiscordRPCSpec.scala new file mode 100644 index 0000000..e6e8bba --- /dev/null +++ b/java/src/test/scala/com/discord/rpc/DiscordRPCSpec.scala @@ -0,0 +1,11 @@ +import org.scalatest._ +import flatspec._ +import matchers._ +import com.discord.rpc.DiscordRPC + +class DiscordRPCSpec extends AnyFlatSpec with should.Matchers { + "DiscordRPC.initialize()" should "load library and bind native methods" in { + // FIXME: this test fails because the lib isn't in the java.library.path and com.discord.librarypath is not set. + DiscordRPC.initialize() + } +} diff --git a/src/java.rs b/src/java.rs index 9562fc9..c20a0a7 100644 --- a/src/java.rs +++ b/src/java.rs @@ -74,6 +74,14 @@ pub fn Java_com_discord_rpc_DiscordRPC_connect0(env: JNIEnv, obj: JObject, clien Ok(()) } +#[inline(always)] +pub fn Java_com_discord_rpc_DiscordRPC_disconnect0(env: JNIEnv, obj: JObject) -> Result<(), ()> { + let client = get_client(&env, obj)?; + + RUNTIME.block_on(async { client.disconnect().await }); + Ok(()) +} + #[inline(always)] pub fn Java_com_discord_rpc_DiscordRPC_setActivity0(env: JNIEnv, obj: JObject, j_activity: JObject) -> Result<(), ()> { let client = get_client(&env, obj)?; @@ -83,6 +91,14 @@ pub fn Java_com_discord_rpc_DiscordRPC_setActivity0(env: JNIEnv, obj: JObject, j Ok(()) } +#[inline(always)] +pub fn Java_com_discord_rpc_DiscordRPC_clearActivity0(env: JNIEnv, obj: JObject) -> Result<(), ()> { + let client = get_client(&env, obj)?; + + debug_and_discard_err(RUNTIME.block_on(async { client.clear_activity().await }))?; + Ok(()) +} + fn jobject_to_activity(env: JNIEnv, jobject: JObject) -> Result { let j_state = env.get_field(jobject, "state", SIG_STRING).map_err(|_| ())?; let j_details = env.get_field(jobject, "details", SIG_STRING).map_err(|_| ())?;