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 :broken_heart: 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 implemented[^activities] | ActivityExample.java |
Applications | π‘ π partially implemented[^applications] | |
Voice | π’ π implemented | |
Images | π’ π implemented | none yet :cry: (see imageTest() for now) |
Lobbies | π΄ π not implemented | |
Networking | π΄ π not implemented | |
Overlay | π’ β€οΈ implemented | none yet :cry: (see overlayTest() for now) |
Relationships | π’ β€οΈ implemented | RelationshipExample.java, FriendNotificationExample.java |
Storage | π΄ π not implemented | |
Store | π΄ π not implemented | |
Users | π‘ β€οΈ partially implemented[^users] | none yet :cry: (see userTest() for now) |
[^activities]: The methods registerCommand
and registerSteam
are not implemented, because they simply create shortcuts.
The method acceptRequest
is not implemented, because I cannot figure out how it works. Help is appreciated! π
[^applications]: Only the method getOAuth2Token
and the custom more exhaustive method authenticate
are implemented.
[^users]: The method getCurrentUserPremiumType
is not implemented because I don't have Discord Nitro, so I cannot test it.
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.
DISCORD_INSTANCE_ID
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:
$XDG_RUNTIME_DIR/discord-ipc-{0,1,2,3,...}
).
The following directories (in the order given) are searched: $XDG_RUNTIME_DIR
, $TMPDIR
, $TMP
, $TEMP
.<one of the directories from 1.>/app/com.discordapp.Discord
.<one of the directories from 1.>/snap.discord
.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
.
DISCORD_IPC_PATH
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.