This project provides Java bindings for the Discord GameSDK.
To be honest I'm not sure if people even need this, because Discord apparently discarded its game store idea.
But maybe the activity, overlay, user, and relationship features could be useful to some people.
If you are just looking for an alternative to the deprecated Discord Rich Presence SDK, head over to the ActivityExample.java!
Some of the features are deprecated by Discord as of Wed, 09 Nov 2022 and will be decommissioned and stop working on Tuesday May 2, 2023. They are marked with 💔 in the table. Those already implemented will most likely continue to work until Discord decommissions them. Those not implemented will remains such, as putting work into features which will end working in less than a year does not seem worth it to me.
The Java-only implementation currently does not support all features fully. I am aiming to fully implement all non-deprecated features soon.
Feature | State | Example |
---|---|---|
Achievements | 🔴 💔 not implemented | |
Activities | 🟡 ❤️ partially implemented1 | ActivityExample.java |
Applications | 🟡 💔 partially implemented2 | |
Voice | 🟢 💔 implemented | |
Images | 🟢 💔 implemented | none yet 😢 (see imageTest() for now) |
Lobbies | 🔴 💔 not implemented | |
Networking | 🔴 💔 not implemented | |
Overlay | 🟢 ❤️ implemented | none yet 😢 (see overlayTest() for now) |
Relationships | 🟢 ❤️ implemented | RelationshipExample.java, FriendNotificationExample.java |
Storage | 🔴 💔 not implemented | |
Store | 🔴 💔 not implemented | |
Users | 🟡 ❤️ partially implemented3 | none yet 😢 (see userTest() for now) |
There are pre-compiled builds on JitPack together with instructions how to use them for all common build tools.
For projects not using any build tools, download a pre-compiled JAR-file (discord-game-sdk4j-<version>.jar
)
from the releases page.
If you want, you can also download the JavaDocs (discord-game-sdk4j-<version>-javadoc.jar
) or
the sources (discord-game-sdk4j-<version>-sources.jar
).
After downloading those JARs, just add the main JAR to your project's classpath and optionally attach sources or JavaDocs.
To install the library from source first of all clone the repository:
git clone https://github.com/JnCrMx/discord-game-sdk4j.git
Finally build (and install) the library with Maven:
mvn install
If you want to skip the tests (sometimes they fail for really weird reasons), add -DskipTests
to the command arguments.
Create a Core
object to start using the library:
try(CreateParams params = new CreateParams())
{
params.setClientID(<your application ID as a long>);
params.setFlags(CreateParams.getDefaultFlags());
try(Core core = new Core(params))
{
// do something with your Core
}
}
For real examples see the examples/
directory in this repository.
This library supports using the DISCORD_INSTANCE_ID
environment variable to select a Discord instance to use.
On Windows, this results in the socket \\.\pipe\discord-ipc-${DISCORD_INSTANCE_ID}
being used.
This should equal the behaviour of the official native libraries.
On Linux however, there are multiple locations and sockets, which this library tries to support, but the offical library does not. Therefore, an order of instances is established as follows:
- Discord instances running directly as host applications (i.e.
$XDG_RUNTIME_DIR/discord-ipc-{0,1,2,3,...}
). The following directories (in the order given) are searched:$XDG_RUNTIME_DIR
,$TMPDIR
,$TMP
,$TEMP
. - Discord instances running as a Flatpak, whose socket is found in
<one of the directories from 1.>/app/com.discordapp.Discord
. - Discord instances running as a Snap, whose socket is found in
<one of the directories from 1.>/snap.discord
. - Discord instances running as a Snap with a different instance name (using the
experimental.parallel-instances
setting), whose socket is found in<one of the directories from 1.>/snap.discord_${instance_name}
in alphabetical order.
Example:
Let's say there are a total of five Discord instances running.
Two of them are running on the host system directly, one is running as a Flatpak and one is running as a "normal"
Snap and one running as a Snap (with experimental.parallel-instances
) as discord_test
.
Then the two Discord instances on the host system get the DISCORD_INSTANCE_ID
0
and 1
.
The Flatpak one is getting the DISCORD_INSTANCE_ID
2
and the normal Snap one is getting the DISCORD_INSTANCE_ID
3
.
Lately, the Snap one installed as discord_test
gets DISCORD_INSTANCE_ID
4
.
To make it possible to select one specific Discord instance, rather than relying on this ordering,
this library introduces the environment variable DISCORD_IPC_PATH
.
If this variable is set, this library will not search for any sockets at all.
It will simply assume that a socket is preset at $DISCORD_IPC_PATH
and use that one.
This can be useful for automated tests, that might break on changing Discord instances.
Footnotes
-
The methods
registerCommand
andregisterSteam
are not implemented, because they simply create shortcuts. The methodacceptRequest
is not implemented, because I cannot figure out how it works. Help is appreciated! 😄 ↩ -
Only the method
getOAuth2Token
and the custom more exhaustive methodauthenticate
are implemented. ↩ -
The method
getCurrentUserPremiumType
is not implemented because I don't have Discord Nitro, so I cannot test it. ↩