该开源库旨在使用实时网关和 REST API 在 Discord 上实现机器人。它提供基于事件的功能来实现任何类型的机器人,从而实现有效且可扩展的应用程序。
JDA 的核心概念旨在使构建可扩展的应用程序变得容易:
您可以通过访问我们的 wiki 或参考我们的 Javadocs 了解更多信息。
该库可在 Maven Central 上找到。最新版本始终显示在 GitHub 版本中。
JDA 支持的最低 Java 版本是Java SE 8 。 JDA 还使用 JSR 305 来支持与 Kotlin 开箱即用的可靠互操作性。
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 >
要使用此库,您必须在 Discord 应用程序仪表板中创建一个应用程序并获取您的机器人令牌。您可以在我们的 wiki 页面创建 Discord 机器人 中找到这方面的分步指南。
我们提供了许多示例来向您介绍 JDA。您还可以查看我们的官方 Wiki、文档和常见问题解答。
JDA 实现的每个机器人都从使用 JDABuilder 或 DefaultShardManagerBuilder 开始。两个构建器都提供了一组用于缓存使用及其想要接收的事件的默认预设:
createDefault
- 为语音通道中处于活动状态的用户启用缓存以及所有缓存标志createLight
- 禁用所有用户缓存和缓存标志create
- 启用成员分块、缓存所有用户并启用所有缓存标志我们建议阅读有关缓存和意图的指南,以了解如何正确配置您的机器人。以下是一些可能的用例:
笔记
以下示例使用特权意图GatewayIntent.MESSAGE_CONTENT
,必须在应用程序仪表板中显式启用该意图。您可以在我们的 wiki 指南中找到有关意图的更多信息。
只需将消息记录到控制台即可。利用 JDABuilder,这是不打算发展到数千个公会的小型机器人的预期入口点。
使用正确的意图启动您的机器人并附加事件侦听器:
public static void main ( String [] args ) {
JDABuilder . createLight ( token , EnumSet . of ( GatewayIntent . GUILD_MESSAGES , GatewayIntent . MESSAGE_CONTENT ))
. addEventListeners ( new MessageReceiveListener ())
. build ();
}
您的事件侦听器可能如下所示:
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 ());
}
}
您可以使用 MessageLoggerExample 类找到更全面的示例。
这是一个利用交互来响应用户命令的机器人。与消息记录机器人不同,该机器人可以在没有任何启用意图的情况下工作,因为交互始终可用。
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 ();
}
响应命令的事件侦听器可能如下所示:
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 ;
}
}
}
您可以使用 SlashBotExample 类找到更全面的示例。
在此库中,RestAction 接口用作所有 API 端点的请求构建器。该接口代表一个惰性请求构建器,如以下简单示例所示:
channel . sendMessage ( "Hello Friend!" )
. addFiles ( FileUpload . fromData ( greetImage )) // Chain builder methods to configure the request
. queue () // Send the request asynchronously
重要的
最后调用queue()
发送请求。您还可以同步发送请求或使用 futures 发送请求,请查看 RestAction Wiki 中的扩展指南。
RestAction 接口还支持许多运算符以避免回调地狱:
map
RestAction
的结果转换为不同的值flatMap
RestAction
delay
以及组合器,例如:
and
allOf
mapToResult
)zip
and
类似,但将结果合并到一个列表中配置器如:
timeout
和deadline
setCheck
reason
例子:
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
}
然后可以在代码中使用它:
selfDestruct ( channel , "Hello friend, this is my secret message" ). queue ();
由 MinnDevelopment 创建和维护。
为RestAction和事件提供 Kotlin 扩展,从而提供更惯用的 Kotlin 体验。
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()
}
}
自述文件中提供了许多示例。
由 sedmelluq 创建,现在由 lavalink 社区维护
Lavaplayer 是用 Java 创建的音乐机器人使用的最流行的库。它与 JDA 和 Discord4J 高度兼容,并允许播放来自 YouTube、Soundcloud、Twitch、Bandcamp 和更多提供商的音频。
通过实现您自己的 AudioSourceManager 并注册它,可以轻松地将库扩展到更多服务。除了 lavaplayer 之外,我们建议还使用 udpqueue,以避免 GC 暂停导致的卡顿问题。
建议阅读 Lavaplayer 的使用部分以了解正确的实现。
Sedmelluq 在他的存储库中提供了一个演示,其中展示了 JDA 的示例实现:https://github.com/lavalink-devs/lavaplayer/tree/master/demo-jda
由 sedmelluq 创建和维护,并由 MinnDevelopment 扩展
为 JDA 音频发送系统提供本机实现,以避免 GC 暂停可能导致连续音频播放出现问题。
请注意,此发送系统会创建一个额外的 UDP 客户端,这会导致音频接收不再正常工作,因为 Discord 将发送 UDP 客户端识别为接收者。
JDABuilder builder = JDABuilder . createDefault ( BOT_TOKEN )
. setAudioSendFactory ( new NativeAudioSendFactory ());
由 Freya Arbjerg 创建,现在由 lavalink 社区维护。
Lavalink是一个流行的基于Lavaplayer的独立音频发送节点。 Lavalink 在构建时考虑到了可扩展性,并允许通过许多服务器传输音乐。它支持 Lavaplayer 的大部分功能。
许多大型机器人以及无法使用 Lavaplayer 等 Java 库的机器人开发人员都使用 Lavalink。如果您计划使用 JDA 提供较小规模的音乐服务,通常最好直接使用 Lavaplayer,因为这样更容易。
Lavalink-Client 是 JDA 的官方 Lavalink 客户端。
如果您想为 JDA 做出贡献,请确保您的分支基于我们的主分支(或功能分支),并在同一分支中创建您的 PR。
请遵循我们的贡献指南。
不要指望您的拉取请求会立即得到关注,有时需要很长时间才能得到响应。您可以加入我们的 Discord 服务器,并在开始处理新 PR 之前在 #lib-dev 中提问,以便从我们的社区成员那里获得更即时的反馈。
由于 Discord API 的性质,该库将定期引入重大更改,以便快速采用更新的功能。我们试图将这些重大变化保持在最低限度,但无法完全避免它们。
大多数重大更改将导致次要版本提升( 5.1.2
→ 5.2.0
)。