此開源程式庫旨在使用即時網關和 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
)。