Add disconnect and clearActivity

This commit is contained in:
Michael Pfaff 2022-03-21 13:19:12 -04:00
parent 49f58f2623
commit 5d0243df9a
Signed by: michael
GPG Key ID: F1A27427218FCA77
7 changed files with 58 additions and 4 deletions

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"files.watcherExclude": {
"**/target": true
}
}

View File

@ -1,6 +1,6 @@
[package] [package]
name = "discord-rpc-client" name = "discord-rpc-client"
version = "0.5.1" version = "0.5.2"
description = "A Rust client for Discord RPC." description = "A Rust client for Discord RPC."
authors = [ authors = [
"Patrick Auernig <dev.patrick.auernig@gmail.com>", "Patrick Auernig <dev.patrick.auernig@gmail.com>",

View File

@ -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() 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] #[no_mangle]
pub extern "system" fn Java_com_discord_rpc_DiscordRPC_setActivity(env: JNIEnv, obj: JObject, j_activity: JObject) -> bool { 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() 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()
}

View File

@ -1,8 +1,11 @@
ThisBuild / organization := "com.discord" 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( .settings(
name := "discord-rpc" 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

View File

@ -16,8 +16,12 @@ public final class DiscordRPC {
public native boolean connect(String clientId); public native boolean connect(String clientId);
public native boolean disconnect();
public native boolean setActivity(Activity activity); public native boolean setActivity(Activity activity);
public native boolean clearActivity();
static { static {
final var dir = System.getProperty("com.discord.librarypath"); final var dir = System.getProperty("com.discord.librarypath");
if (dir != null) { if (dir != null) {
@ -26,5 +30,10 @@ public final class DiscordRPC {
System.loadLibrary("discord_rpc"); System.loadLibrary("discord_rpc");
} }
} }
}
/**
* This method does nothing, but ensures that the native library will be loaded.
*/
public static void initialize() {
}
}

View File

@ -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()
}
}

View File

@ -74,6 +74,14 @@ pub fn Java_com_discord_rpc_DiscordRPC_connect0(env: JNIEnv, obj: JObject, clien
Ok(()) 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)] #[inline(always)]
pub fn Java_com_discord_rpc_DiscordRPC_setActivity0(env: JNIEnv, obj: JObject, j_activity: JObject) -> Result<(), ()> { pub fn Java_com_discord_rpc_DiscordRPC_setActivity0(env: JNIEnv, obj: JObject, j_activity: JObject) -> Result<(), ()> {
let client = get_client(&env, obj)?; let client = get_client(&env, obj)?;
@ -83,6 +91,14 @@ pub fn Java_com_discord_rpc_DiscordRPC_setActivity0(env: JNIEnv, obj: JObject, j
Ok(()) 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<drpc::models::Activity, ()> { fn jobject_to_activity(env: JNIEnv, jobject: JObject) -> Result<drpc::models::Activity, ()> {
let j_state = env.get_field(jobject, "state", SIG_STRING).map_err(|_| ())?; let j_state = env.get_field(jobject, "state", SIG_STRING).map_err(|_| ())?;
let j_details = env.get_field(jobject, "details", SIG_STRING).map_err(|_| ())?; let j_details = env.get_field(jobject, "details", SIG_STRING).map_err(|_| ())?;