이 오픈 소스 라이브러리는 실시간 게이트웨이 및 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 애플리케이션 대시보드에서 애플리케이션을 생성하고 봇 토큰을 가져와야 합니다. 이에 대한 단계별 가이드는 위키 페이지 Discord Bot 만들기에서 찾을 수 있습니다.
JDA를 소개하기 위해 다양한 사례를 제공합니다. 공식 Wiki, 문서 및 FAQ를 살펴볼 수도 있습니다.
JDA에 의해 구현된 모든 봇은 JDABuilder 또는 DefaultShardManagerBuilder를 사용하여 시작됩니다. 두 빌더 모두 캐시 사용 및 수신하려는 이벤트에 대한 기본 사전 설정 세트를 제공합니다.
createDefault
- 음성 채널 및 모든 캐시 플래그에서 활성 상태인 사용자에 대한 캐시를 활성화합니다.createLight
- 모든 사용자 캐시 및 캐시 플래그를 비활성화합니다.create
- 멤버 청크를 활성화하고 모든 사용자를 캐시하며 모든 캐시 플래그를 활성화합니다.봇을 올바르게 구성하는 방법을 알아보려면 캐싱 및 의도에 대한 가이드를 읽어보는 것이 좋습니다. 가능한 사용 사례는 다음과 같습니다.
메모
다음 예에서는 애플리케이션 대시보드에서 명시적으로 활성화해야 하는 권한 있는 의도 GatewayIntent.MESSAGE_CONTENT
를 사용합니다. 위키 가이드에서 인텐트에 대해 자세히 알아볼 수 있습니다.
간단히 콘솔에 메시지를 기록하면 됩니다. 수천 개의 길드로 성장할 의도가 없는 소규모 봇을 위한 진입점인 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에는 다양한 예제가 있습니다.
sedmelluq에 의해 생성되었으며 현재 lavalink 커뮤니티에 의해 유지관리되고 있습니다.
Lavaplayer는 Java로 만들어진 Music Bot이 사용하는 가장 인기 있는 라이브러리입니다. JDA 및 Discord4J와 매우 호환되며 YouTube, Soundcloud, Twitch, Bandcamp 및 기타 제공업체의 오디오를 재생할 수 있습니다.
자체 AudioSourceManager를 구현하고 등록하면 라이브러리를 더 많은 서비스로 쉽게 확장할 수 있습니다. GC 일시 중지로 인한 끊김 문제를 방지하려면 lavaplayer 외에 udpqueue도 사용하는 것이 좋습니다.
적절한 구현을 이해하려면 Lavaplayer의 사용 섹션을 읽는 것이 좋습니다.
Sedmelluq는 자신의 저장소에서 JDA의 구현 예를 보여주는 데모를 제공했습니다: https://github.com/lavalink-devs/lavaplayer/tree/master/demo-jda
sedmelluq에 의해 생성 및 유지 관리되고 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
).