このオープンソース ライブラリは、リアルタイム ゲートウェイと REST API を使用して Discord にボットを実装することを目的としています。あらゆる種類のボットを実装するためのイベントベースの機能を提供し、効果的でスケーラブルなアプリケーションを可能にします。
JDA の中心的な概念は、スケーラブルなアプリを簡単に構築できるように開発されました。
詳細については、Wiki にアクセスするか、Javadoc を参照してください。
このライブラリは 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、ドキュメント、FAQ もご覧ください。
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()
への最後の呼び出しでリクエストが送信されます。リクエストを同期的に送信したり、先物を使用して送信したりすることもできます。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 によって作成および保守されています。
より慣用的な Kotlin エクスペリエンスを提供するRestActionおよびイベント用の 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()
}
}
README には多数の例が記載されています。
sedmeluq によって作成され、現在は lavalink コミュニティによって維持されています。
Lavaplayer は、Java で作成されたミュージック ボットで使用される最も人気のあるライブラリです。 JDA および Discord4J との互換性が高く、YouTube、Soundcloud、Twitch、Bandcamp などのプロバイダーからオーディオを再生できます。
独自の AudioSourceManager を実装して登録することで、ライブラリをより多くのサービスに簡単に拡張できます。 GC の一時停止によって引き起こされる途切れの問題を避けるために、lavaplayer に加えて udpqueue も使用することをお勧めします。
適切な実装を理解するには、Lavaplayer の「使用法」セクションを読むことをお勧めします。
Sedmelluq は、JDA の実装例を示すデモをリポジトリに提供しました: https://github.com/lavalink-devs/lavaplayer/tree/master/demo-jda
sedmeluq によって作成および保守され、MinnDevelopment によって拡張されました
連続オーディオ再生で問題が発生する可能性がある GC 一時停止を回避するために、 JDA オーディオ送信システムのネイティブ実装を提供します。
Discord は送信側の UDP クライアントを受信側として識別するため、この送信システムは追加の UDP クライアントを作成し、オーディオ受信が適切に機能しなくなることに注意してください。
JDABuilder builder = JDABuilder . createDefault ( BOT_TOKEN )
. setAudioSendFactory ( new NativeAudioSendFactory ());
Freya Arbjerg によって作成され、現在は lavalink コミュニティによって維持されています。
Lavalink は、Lavaplayer をベースにした人気のあるスタンドアロン オーディオ送信ノードです。 Lavalink はスケーラビリティを念頭に置いて構築されており、多くのサーバーを介して音楽をストリーミングできます。 Lavaplayer のほとんどの機能をサポートしています。
Lavalink は、Lavaplayer のような Java ライブラリを使用できないボット開発者だけでなく、多くの大規模なボットでも使用されています。 JDA を使用して小規模な音楽を提供することを計画している場合は、Lavaplayer を直接使用する方が簡単なため、多くの場合推奨されます。
Lavalink-Client は、JDA の公式 Lavalink クライアントです。
JDA に貢献したい場合は、必ずマスターブランチ (またはフィーチャー ブランチ) からブランチを作成し、その同じブランチに PR を作成してください。
貢献ガイドラインに従ってください。
プル リクエストがすぐに注目されることを期待しないでください。場合によっては、応答を得るまでに長い時間がかかることがあります。新しい PR の作業を開始する前に、Discord サーバーに参加して #lib-dev で質問すると、コミュニティ メンバーからよりすぐにフィードバックを得ることができます。
Discord API の性質上、ライブラリでは新しい機能を迅速に導入できるように、定期的に重大な変更が導入されます。これらの互換性を損なう変更を最小限に抑えるよう努めていますが、完全に回避することはできません。
ほとんどの重大な変更は、マイナーなバージョンの変更 ( 5.1.2
→ 5.2.0
) をもたらします。