Diese Open-Source-Bibliothek ist für die Implementierung von Bots auf Discord mithilfe des Echtzeit-Gateways und der REST-API gedacht. Es bietet ereignisbasierte Funktionen zur Implementierung von Bots jeglicher Art und ermöglicht so effektive und skalierbare Anwendungen.
Die Kernkonzepte von JDA wurden entwickelt, um die Erstellung skalierbarer Apps zu vereinfachen:
Weitere Informationen finden Sie in unserem Wiki oder in unseren Javadocs.
Diese Bibliothek ist auf Maven Central verfügbar. Die neueste Version wird immer im GitHub-Release angezeigt.
Die von JDA unterstützte Mindest-Java-Version ist Java SE 8 . JDA verwendet außerdem JSR 305, um sofort eine solide Interoperabilität mit Kotlin zu unterstützen.
repositories {
mavenCentral()
}
dependencies {
implementation( " net.dv8tion:JDA: $v ersion " ) { // replace $version with the latest version
// Optionally disable audio natives to reduce jar size by excluding `opus-java`
// Gradle DSL:
// exclude module: 'opus-java'
// Kotlin DSL:
// exclude(module="opus-java")
}
}
< dependency >
< groupId >net.dv8tion groupId >
< artifactId >JDA artifactId >
< version >$version version >
dependency >
Um diese Bibliothek nutzen zu können, müssen Sie im Discord Application Dashboard eine Anwendung erstellen und sich Ihren Bot-Token holen. Eine Schritt-für-Schritt-Anleitung dazu finden Sie auf unserer Wiki-Seite Einen Discord-Bot erstellen.
Wir stellen Ihnen anhand einiger Beispiele JDA vor. Sie können auch einen Blick auf unser offizielles Wiki, unsere Dokumentation und unsere FAQ werfen.
Jeder von JDA implementierte Bot verwendet zunächst den JDABuilder oder DefaultShardManagerBuilder. Beide Builder bieten eine Reihe von Standardvoreinstellungen für die Cache-Nutzung und die Ereignisse, die sie empfangen möchten:
createDefault
– Aktiviert den Cache für Benutzer, die in Sprachkanälen aktiv sind, und alle Cache-FlagscreateLight
– Deaktiviert alle Benutzer-Cache- und Cache-Flagscreate
– Aktiviert das Chunking von Mitgliedern, speichert alle Benutzer im Cache und aktiviert alle Cache-FlagsWir empfehlen Ihnen, den Leitfaden zu Caching und Absichten zu lesen, um ein Gefühl für die richtige Konfiguration Ihres Bots zu bekommen. Hier sind einige mögliche Anwendungsfälle:
Notiz
Das folgende Beispiel nutzt die privilegierte Absicht GatewayIntent.MESSAGE_CONTENT
, die explizit in Ihrem Anwendungs-Dashboard aktiviert werden muss. Mehr zu Intents erfahren Sie in unserem Wiki-Guide.
Protokollieren Sie einfach Nachrichten in der Konsole. Nutzung von JDABuilder, dem vorgesehenen Einstiegspunkt für kleinere Bots, die nicht die Absicht haben, zu Tausenden von Gilden zu wachsen.
Starten Sie Ihren Bot und hängen Sie einen Ereignis-Listener mit den richtigen Absichten an:
public static void main ( String [] args ) {
JDABuilder . createLight ( token , EnumSet . of ( GatewayIntent . GUILD_MESSAGES , GatewayIntent . MESSAGE_CONTENT ))
. addEventListeners ( new MessageReceiveListener ())
. build ();
}
Ihr Event-Listener könnte so aussehen:
public class MessageReceiveListener extends ListenerAdapter {
@ Override
public void onMessageReceived ( MessageReceivedEvent event ) {
System . out . printf ( "[%s] %#s: %s n " ,
event . getChannel (),
event . getAuthor (),
event . getMessage (). getContentDisplay ());
}
}
Ein ausführlicheres Beispiel finden Sie in der Klasse MessageLoggerExample.
Hierbei handelt es sich um einen Bot, der Interaktionen nutzt, um auf Benutzerbefehle zu reagieren. Im Gegensatz zum Nachrichtenprotokollierungsbot kann dieser Bot ohne aktivierte Absichten arbeiten, da Interaktionen immer verfügbar sind.
public static void main ( String [] args ) {
JDA jda = JDABuilder . createLight ( token , Collections . emptyList ())
. addEventListeners ( new SlashCommandListener ())
. build ();
// Register your commands to make them visible globally on Discord:
CommandListUpdateAction commands = jda . updateCommands ();
// Add all your commands on this action instance
commands . addCommands (
Commands . slash ( "say" , "Makes the bot say what you tell it to" )
. addOption ( STRING , "content" , "What the bot should say" , true ), // Accepting a user input
Commands . slash ( "leave" , "Makes the bot leave the server" )
. setGuildOnly ( true ) // this doesn't make sense in DMs
. setDefaultPermissions ( DefaultMemberPermissions . DISABLED ) // only admins should be able to use this command.
);
// Then finally send your commands to discord using the API
commands . queue ();
}
Ein Ereignis-Listener, der auf Befehle reagiert, könnte folgendermaßen aussehen:
public class SlashCommandListener extends ListenerAdapter {
@ Override
public void onSlashCommandInteraction ( SlashCommandInteractionEvent event ) {
switch ( event . getName ()) {
case "say" -> {
String content = event . getOption ( "content" , OptionMapping :: getAsString );
event . reply ( content ). queue ();
};
case "leave" -> {
event . reply ( "I'm leaving the server now!" )
. setEphemeral ( true ) // this message is only visible to the command user
. flatMap ( m -> event . getGuild (). leave ()) // append a follow-up action using flatMap
. queue (); // enqueue both actions to run in sequence (send message -> leave guild)
};
default -> return ;
}
}
}
Ein ausführlicheres Beispiel finden Sie in der Klasse SlashBotExample.
In dieser Bibliothek wird die RestAction-Schnittstelle als Anforderungsgenerator für alle API-Endpunkte verwendet. Diese Schnittstelle stellt einen Lazy-Request-Builder dar, wie in diesem einfachen Beispiel gezeigt:
channel . sendMessage ( "Hello Friend!" )
. addFiles ( FileUpload . fromData ( greetImage )) // Chain builder methods to configure the request
. queue () // Send the request asynchronously
Wichtig
Der letzte Aufruf von queue()
sendet die Anfrage. Sie können die Anfrage auch synchron senden oder Futures verwenden. Schauen Sie sich unseren erweiterten Leitfaden im RestAction-Wiki an.
Die RestAction-Schnittstelle unterstützt auch eine Reihe von Operatoren, um die Callback-Hölle zu vermeiden:
map
RestAction
in einen anderen WertflatMap
RestAction
mit dem Ergebnisdelay
Sowie Kombinatoren wie:
and
allOf
mapToResult
).zip
and
, fasst die Ergebnisse jedoch in einer Liste zusammenUnd Konfiguratoren wie:
timeout
und deadline
setCheck
reason
Beispiel :
public RestAction < Void > selfDestruct ( MessageChannel channel , String content ) {
return channel . sendMessage ( "The following message will destroy itself in 1 minute!" )
. addActionRow ( Button . danger ( "delete" , "Delete now" )) // further amend message before sending
. delay ( 10 , SECONDS , scheduler ) // after sending, wait 10 seconds
. flatMap (( it ) -> it . editMessage ( content )) // then edit the message
. delay ( 1 , MINUTES , scheduler ) // wait another minute
. flatMap ( Message :: delete ); // then delete
}
Dies könnte dann im Code verwendet werden:
selfDestruct ( channel , "Hello friend, this is my secret message" ). queue ();
Erstellt und gepflegt von MinnDevelopment.
Bietet Kotlin-Erweiterungen für RestAction und Ereignisse, die ein idiomatischeres Kotlin-Erlebnis bieten.
fun main () {
val jda = light( BOT_TOKEN )
jda.onCommand( " ping " ) { event ->
val time = measureTime {
event.reply( " Pong! " ).await() // suspending
}.inWholeMilliseconds
event.hook.editOriginal( " Pong: $time ms " ).queue()
}
}
In der README-Datei finden Sie eine Reihe von Beispielen.
Erstellt von sedmelluq und jetzt verwaltet von der Lavalink-Community
Lavaplayer ist die beliebteste Bibliothek, die von in Java erstellten Music Bots verwendet wird. Es ist hochkompatibel mit JDA und Discord4J und ermöglicht die Wiedergabe von Audio von YouTube, Soundcloud, Twitch, Bandcamp und weiteren Anbietern.
Die Bibliothek kann problemlos um weitere Dienste erweitert werden, indem Sie Ihren eigenen AudioSourceManager implementieren und registrieren. Wir empfehlen, zusätzlich zum Lavaplayer auch udpqueue zu verwenden, um durch GC-Pausen verursachte Stotterprobleme zu vermeiden.
Es wird empfohlen, den Abschnitt „Nutzung“ von Lavaplayer zu lesen, um eine ordnungsgemäße Implementierung zu verstehen.
Sedmelluq hat in seinem Repository eine Demo bereitgestellt, die eine Beispielimplementierung für JDA präsentiert: https://github.com/lavalink-devs/lavaplayer/tree/master/demo-jda
Erstellt und gepflegt von sedmelluq und erweitert von MinnDevelopment
Bietet eine native Implementierung für das JDA Audio Send-System , um GC-Pausen zu vermeiden, die möglicherweise Probleme bei der kontinuierlichen Audiowiedergabe verursachen .
Beachten Sie, dass dieses Sendesystem einen zusätzlichen UDP-Client erstellt, der dazu führt, dass der Audioempfang nicht mehr ordnungsgemäß funktioniert, da Discord den sendenden UDP-Client als Empfänger identifiziert.
JDABuilder builder = JDABuilder . createDefault ( BOT_TOKEN )
. setAudioSendFactory ( new NativeAudioSendFactory ());
Erstellt von Freya Arbjerg und jetzt gepflegt von der Lavalink-Community.
Lavalink ist ein beliebter eigenständiger Audio-Sendeknoten, der auf Lavaplayer basiert. Lavalink wurde im Hinblick auf Skalierbarkeit entwickelt und ermöglicht das Streamen von Musik über viele Server. Es unterstützt die meisten Funktionen von Lavaplayer.
Lavalink wird von vielen großen Bots verwendet, aber auch von Bot-Entwicklern, die keine Java-Bibliothek wie Lavaplayer verwenden können. Wenn Sie mit JDA Musik in kleinerem Umfang bereitstellen möchten, ist es oft vorzuziehen, einfach Lavaplayer direkt zu verwenden, da dies einfacher ist.
Lavalink-Client ist der offizielle Lavalink-Client für JDA.
Wenn Sie zu JDA beitragen möchten, stellen Sie sicher, dass Ihr Branch auf unserem Master -Branch (oder einem Feature-Branch) basiert und Ihre PR in demselben Branch erstellt.
Bitte befolgen Sie unsere Beitragsrichtlinien.
Erwarten Sie nicht, dass Ihre Pull-Anfrage sofort Aufmerksamkeit erregt. Manchmal dauert es lange, bis Sie eine Antwort erhalten. Sie können unserem Discord-Server beitreten und #lib-dev eingeben, bevor Sie mit der Arbeit an einer neuen PR beginnen, um unmittelbareres Feedback von unseren Community-Mitgliedern zu erhalten.
Aufgrund der Natur der Discord-API führt die Bibliothek regelmäßig wichtige Änderungen ein, um eine schnelle Einführung neuer Funktionen zu ermöglichen. Wir versuchen, diese bahnbrechenden Änderungen minimal zu halten, können sie aber nicht ganz vermeiden.
Die meisten wichtigen Änderungen führen zu einer geringfügigen Versionsverbesserung ( 5.1.2
→ 5.2.0
).