Эта библиотека с открытым исходным кодом предназначена для реализации ботов в Discord с использованием шлюза реального времени и REST API. Он обеспечивает функциональность на основе событий для реализации ботов любого типа, что позволяет создавать эффективные и масштабируемые приложения.
Основные концепции JDA были разработаны для упрощения создания масштабируемых приложений:
Вы можете узнать больше, посетив нашу вики или ознакомившись с нашей документацией по Java.
Эта библиотека доступна на Maven Central. Последняя версия всегда отображается в выпуске GitHub.
Минимальная версия Java, поддерживаемая JDA, — 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.
Мы предоставляем ряд примеров, чтобы познакомить вас с JDA. Вы также можете просмотреть нашу официальную Wiki, документацию и часто задаваемые вопросы.
Каждый бот, реализованный 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.
Lavplayer — самая популярная библиотека, используемая музыкальными ботами, созданная на Java. Он полностью совместим с JDA и Discord4J и позволяет воспроизводить аудио с YouTube, Soundcloud, Twitch, Bandcamp и других провайдеров.
Библиотеку можно легко расширить за счет большего количества сервисов, реализовав собственный AudioSourceManager и зарегистрировав его. Мы рекомендуем также использовать udpqueue в дополнение к lavaplayer, чтобы избежать проблем с заиканием, вызванных паузами GC.
Рекомендуется прочитать раздел «Использование» Lavaplayer, чтобы понять правильную реализацию.
Седмеллюк предоставил в своем репозитории демо-версию, в которой представлен пример реализации 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 ());
Создан Фрейей Арбьерг и в настоящее время поддерживается сообществом lavalink.
Lavalink — популярный автономный узел отправки аудио, основанный на Lavaplayer. Lavalink был создан с учетом масштабируемости и позволяет передавать музыку через множество серверов. Он поддерживает большинство функций Laplaylayer.
Lavalink используется многими крупными ботами, а также разработчиками ботов, которые не могут использовать библиотеки Java, такие как Laplaylayer. Если вы планируете подавать музыку в меньшем масштабе с помощью JDA, зачастую предпочтительнее просто использовать Lavaplayer напрямую, поскольку это проще.
Lavalink-Client — официальный клиент Lavalink для JDA.
Если вы хотите внести свой вклад в JDA, обязательно создайте свою ветку на основе нашей основной ветки (или функциональной ветки) и создайте свой PR в этой же ветке.
Пожалуйста, следуйте нашим Правилам внесения вклада.
Не ждите, что ваш запрос на включение сразу же привлечет внимание: иногда получение ответа может занять много времени. Вы можете присоединиться к нашему серверу Discord и задать вопрос в #lib-dev, прежде чем приступить к работе над новым PR, чтобы получить более немедленную обратную связь от членов нашего сообщества.
Из-за особенностей Discord API в библиотеку регулярно будут вноситься критические изменения, позволяющие быстро внедрять новые функции. Мы стараемся свести эти критические изменения к минимуму, но не можем полностью их избежать.
Большинство критических изменений приведут к незначительному обновлению версии ( 5.1.2
→ 5.2.0
).