diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index c08b9c8..5b25313 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -95,6 +95,9 @@ + + + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1351eb6..9d486ac 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] -jda = "5.6.1" -lavaplayer = "2.2.3" +jda = "6.4.2" +lavaplayer = "2.2.6" lavalinkClient = "3.4.0" dotenv = "3.2.0" slf4j = "2.1.0-alpha1" diff --git a/lavalink/application.yml b/lavalink/application.yml index 8e26893..72b888b 100644 --- a/lavalink/application.yml +++ b/lavalink/application.yml @@ -14,7 +14,7 @@ plugins: - "ytsearch:\"%ISRC%\"" - "ytsearch:%QUERY%" sources: - spotify: true + spotify: false applemusic: true deezer: false yandexmusic: false @@ -33,7 +33,7 @@ lavalink: plugins: - dependency: "dev.lavalink.youtube:youtube-plugin:1.18.1" repository: "https://maven.lavalink.dev/releases" - - dependency: "com.github.topi314.lavasrc:lavasrc-plugin:4.8.1" + - dependency: "com.github.topi314.lavasrc:lavasrc-plugin:4.8.3" repository: "https://maven.topi.wtf/releases" server: password: "Hch4HiVCxkKs9JPiSnrt4Q" diff --git a/src/main/java/creator/loki/core/BotInitializer.java b/src/main/java/creator/loki/core/BotInitializer.java index 85fc0ba..485c1aa 100644 --- a/src/main/java/creator/loki/core/BotInitializer.java +++ b/src/main/java/creator/loki/core/BotInitializer.java @@ -165,6 +165,10 @@ public class BotInitializer { GatewayIntent.GUILD_VOICE_STATES) .enableCache(CacheFlag.VOICE_STATE); + if (lavalinkManager.getClient() != null) { + builder.setVoiceDispatchInterceptor(new JDAVoiceUpdateListener(lavalinkManager.getClient())); + } + builder.addEventListeners(new RadioBotListener(radioManager)); return builder.build(); diff --git a/src/main/java/creator/loki/feature/counter/CounterManager.java b/src/main/java/creator/loki/feature/counter/CounterManager.java index 1e36170..ea72115 100644 --- a/src/main/java/creator/loki/feature/counter/CounterManager.java +++ b/src/main/java/creator/loki/feature/counter/CounterManager.java @@ -1,6 +1,6 @@ package creator.loki.feature.counter; -import java.util.*; +import java.util.List; import creator.loki.feature.config.repository.ConfigRepository; import creator.loki.feature.counter.repository.CounterStatsRepository; diff --git a/src/main/java/creator/loki/feature/entertainment/EntertainmentCommandRegistrar.java b/src/main/java/creator/loki/feature/entertainment/EntertainmentCommandRegistrar.java index 6f7679a..540640c 100644 --- a/src/main/java/creator/loki/feature/entertainment/EntertainmentCommandRegistrar.java +++ b/src/main/java/creator/loki/feature/entertainment/EntertainmentCommandRegistrar.java @@ -5,10 +5,31 @@ import creator.loki.config.BotConfig; import creator.loki.core.registry.CommandRegistrar; import creator.loki.core.registry.CommandRegistry; import creator.loki.core.security.CooldownManager; -import creator.loki.feature.entertainment.commands.*; +import creator.loki.feature.entertainment.commands.BoykisserCommand; +import creator.loki.feature.entertainment.commands.CoinCommand; +import creator.loki.feature.entertainment.commands.DiceCommand; +import creator.loki.feature.entertainment.commands.EightBallCommand; +import creator.loki.feature.entertainment.commands.FatCommand; +import creator.loki.feature.entertainment.commands.GayCommand; +import creator.loki.feature.entertainment.commands.GlazbobaCommand; +import creator.loki.feature.entertainment.commands.IqCommand; +import creator.loki.feature.entertainment.commands.MemeCommand; +import creator.loki.feature.entertainment.commands.MustacheCommand; +import creator.loki.feature.entertainment.commands.PpCommand; +import creator.loki.feature.entertainment.commands.RandomChoiceCommand; +import creator.loki.feature.entertainment.commands.RateCommand; import creator.loki.feature.ship.ShipCommand; import creator.loki.feature.ship.repository.ShipPairRepository; -import creator.loki.feature.social.commands.*; +import creator.loki.feature.social.commands.ComplimentCommand; +import creator.loki.feature.social.commands.CuddleCommand; +import creator.loki.feature.social.commands.FeedCommand; +import creator.loki.feature.social.commands.RoastCommand; +import creator.loki.feature.social.commands.HugCommand; +import creator.loki.feature.social.commands.KissCommand; +import creator.loki.feature.social.commands.PatCommand; +import creator.loki.feature.social.commands.PokeCommand; +import creator.loki.feature.social.commands.SlapCommand; +import creator.loki.feature.social.commands.TickleCommand; public class EntertainmentCommandRegistrar implements CommandRegistrar { private final CooldownManager cooldownManager; diff --git a/src/main/java/creator/loki/feature/help/HelpMenuHandler.java b/src/main/java/creator/loki/feature/help/HelpMenuHandler.java index dbd4212..e8aef4c 100644 --- a/src/main/java/creator/loki/feature/help/HelpMenuHandler.java +++ b/src/main/java/creator/loki/feature/help/HelpMenuHandler.java @@ -15,7 +15,8 @@ import creator.loki.embed.HelpCategories; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.events.interaction.component.StringSelectInteractionEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; -import net.dv8tion.jda.api.interactions.components.selections.StringSelectMenu; +import net.dv8tion.jda.api.components.actionrow.ActionRow; +import net.dv8tion.jda.api.components.selections.StringSelectMenu; @Singleton public class HelpMenuHandler extends ListenerAdapter { @@ -94,7 +95,7 @@ public class HelpMenuHandler extends ListenerAdapter { net.dv8tion.jda.api.entities.emoji.Emoji.fromUnicode(emoji)); }); - event.editMessageEmbeds(embed.build()).setActionRow(menuBuilder.build()).queue(); + event.editMessageEmbeds(embed.build()).setComponents(ActionRow.of(menuBuilder.build())).queue(); } private EmbedFactory createCategoryEmbed( diff --git a/src/main/java/creator/loki/feature/help/commands/HelpCommand.java b/src/main/java/creator/loki/feature/help/commands/HelpCommand.java index f6b6745..d4c7949 100644 --- a/src/main/java/creator/loki/feature/help/commands/HelpCommand.java +++ b/src/main/java/creator/loki/feature/help/commands/HelpCommand.java @@ -13,7 +13,8 @@ import creator.loki.embed.EmbedFactory; import creator.loki.embed.HelpCategories; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.User; -import net.dv8tion.jda.api.interactions.components.selections.StringSelectMenu; +import net.dv8tion.jda.api.components.actionrow.ActionRow; +import net.dv8tion.jda.api.components.selections.StringSelectMenu; public class HelpCommand implements Command { private final CommandRegistry registry; @@ -74,7 +75,7 @@ public class HelpCommand implements Command { net.dv8tion.jda.api.entities.emoji.Emoji.fromUnicode(emoji)); }); - context.getChannel().sendMessageEmbeds(embed.build()).addActionRow(menuBuilder.build()).queue(); + context.getChannel().sendMessageEmbeds(embed.build()).addComponents(ActionRow.of(menuBuilder.build())).queue(); } private EmbedFactory createMainPage( diff --git a/src/main/java/creator/loki/feature/leaderboard/LeaderboardButtons.java b/src/main/java/creator/loki/feature/leaderboard/LeaderboardButtons.java index ed05239..f024763 100644 --- a/src/main/java/creator/loki/feature/leaderboard/LeaderboardButtons.java +++ b/src/main/java/creator/loki/feature/leaderboard/LeaderboardButtons.java @@ -2,7 +2,7 @@ package creator.loki.feature.leaderboard; import java.util.List; -import net.dv8tion.jda.api.interactions.components.buttons.Button; +import net.dv8tion.jda.api.components.buttons.Button; /** Кнопки для таблицы лидеров */ public class LeaderboardButtons { diff --git a/src/main/java/creator/loki/feature/leaderboard/LeaderboardCommand.java b/src/main/java/creator/loki/feature/leaderboard/LeaderboardCommand.java index 069ee5d..3f2432c 100644 --- a/src/main/java/creator/loki/feature/leaderboard/LeaderboardCommand.java +++ b/src/main/java/creator/loki/feature/leaderboard/LeaderboardCommand.java @@ -5,6 +5,7 @@ import java.util.concurrent.TimeUnit; import creator.loki.command.Command; import creator.loki.command.CommandContext; import creator.loki.feature.level.service.LeaderboardService; +import net.dv8tion.jda.api.components.actionrow.ActionRow; /** Команда таблицы лидеров (рефакторинг: 241 → 50 строк) */ public class LeaderboardCommand implements Command { @@ -49,7 +50,7 @@ public class LeaderboardCommand implements Command { context .getChannel() .sendMessageEmbeds(embed) - .setActionRow(buttons) + .addComponents(ActionRow.of(buttons)) .queue( message -> { // Удаляем кнопки через 5 минут diff --git a/src/main/java/creator/loki/feature/level/ResetLevelsCommand.java b/src/main/java/creator/loki/feature/level/ResetLevelsCommand.java index 5b49dbe..8a9d1af 100644 --- a/src/main/java/creator/loki/feature/level/ResetLevelsCommand.java +++ b/src/main/java/creator/loki/feature/level/ResetLevelsCommand.java @@ -10,7 +10,8 @@ import creator.loki.feature.level.domain.UserStats; import creator.loki.feature.level.repository.UserStatsRepository; import creator.loki.util.LoggerDecorator; import net.dv8tion.jda.api.Permission; -import net.dv8tion.jda.api.interactions.components.buttons.Button; +import net.dv8tion.jda.api.components.actionrow.ActionRow; +import net.dv8tion.jda.api.components.buttons.Button; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -116,10 +117,11 @@ public class ResetLevelsCommand implements Command { false) .withFooter("Подтвердите действие нажатием кнопки ниже") .build()) - .setActionRow( - Button.success( - "reset_levels_confirm:" + context.getAuthor().getId(), "✅ Подтвердить сброс"), - Button.danger("reset_levels_cancel:" + context.getAuthor().getId(), "❌ Отмена")) + .addComponents( + ActionRow.of( + Button.success( + "reset_levels_confirm:" + context.getAuthor().getId(), "✅ Подтвердить сброс"), + Button.danger("reset_levels_cancel:" + context.getAuthor().getId(), "❌ Отмена"))) .queue(); } diff --git a/src/main/java/creator/loki/feature/level/repository/SqlUserStatsRepository.java b/src/main/java/creator/loki/feature/level/repository/SqlUserStatsRepository.java index c574b87..4fe76f8 100644 --- a/src/main/java/creator/loki/feature/level/repository/SqlUserStatsRepository.java +++ b/src/main/java/creator/loki/feature/level/repository/SqlUserStatsRepository.java @@ -3,7 +3,11 @@ package creator.loki.feature.level.repository; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; import creator.loki.database.Database; import creator.loki.feature.level.domain.UserStats; diff --git a/src/main/java/creator/loki/feature/moderation/ModerationCommandRegistrar.java b/src/main/java/creator/loki/feature/moderation/ModerationCommandRegistrar.java index fdf32d7..4306de7 100644 --- a/src/main/java/creator/loki/feature/moderation/ModerationCommandRegistrar.java +++ b/src/main/java/creator/loki/feature/moderation/ModerationCommandRegistrar.java @@ -18,7 +18,10 @@ import creator.loki.feature.moderation.commands.warn.WarningsHistoryCommand; import creator.loki.feature.moderation.repository.ActiveMuteRepository; import creator.loki.feature.moderation.repository.ModerationCaseRepository; import creator.loki.feature.moderation.repository.WarningRepository; -import creator.loki.feature.role.*; +import creator.loki.feature.role.CustomRoleManager; +import creator.loki.feature.role.DeleteRoleCommand; +import creator.loki.feature.role.EditRoleCommand; +import creator.loki.feature.role.MyRolesCommand; import creator.loki.feature.role.commands.CreateRoleCommand; public class ModerationCommandRegistrar implements CommandRegistrar { diff --git a/src/main/java/creator/loki/feature/music/listener/MusicBotPlayHandler.java b/src/main/java/creator/loki/feature/music/listener/MusicBotPlayHandler.java index 56cff6a..be973a8 100644 --- a/src/main/java/creator/loki/feature/music/listener/MusicBotPlayHandler.java +++ b/src/main/java/creator/loki/feature/music/listener/MusicBotPlayHandler.java @@ -106,7 +106,7 @@ public class MusicBotPlayHandler { g.getAudioManager().openAudioConnection(vc); } - for (int i = 0; i < 30; i++) { + for (int i = 0; i < 10; i++) { if (g.getMember(g.getJDA().getSelfUser()).getVoiceState().inAudioChannel()) break; try { Thread.sleep(200); @@ -116,7 +116,7 @@ public class MusicBotPlayHandler { } Link link = lm.getOrCreateLink(g.getIdLong()); - for (int i = 0; i < 30; i++) { + for (int i = 0; i < 10; i++) { if (link.getCachedPlayer() != null) return; try { Thread.sleep(200); diff --git a/src/main/java/creator/loki/feature/music/manage/TrackScheduler.java b/src/main/java/creator/loki/feature/music/manage/TrackScheduler.java index 7f98756..42c9e69 100644 --- a/src/main/java/creator/loki/feature/music/manage/TrackScheduler.java +++ b/src/main/java/creator/loki/feature/music/manage/TrackScheduler.java @@ -176,11 +176,11 @@ public class TrackScheduler { } private void sendTrackDelayed(Link link, Track track, int attempt) { - if (attempt > 10) return; + if (attempt > 5) return; if (link.getCachedPlayer() == null) { manager .getExecutor() - .schedule(() -> sendTrackDelayed(link, track, attempt + 1), 500, TimeUnit.MILLISECONDS); + .schedule(() -> sendTrackDelayed(link, track, attempt + 1), 300, TimeUnit.MILLISECONDS); return; } link.createOrUpdatePlayer() @@ -189,12 +189,12 @@ public class TrackScheduler { .subscribe( null, err -> { - if (attempt < 10) { + if (attempt < 5) { manager .getExecutor() .schedule( () -> sendTrackDelayed(link, track, attempt + 1), - 1000, + 500, TimeUnit.MILLISECONDS); } }); diff --git a/src/main/java/creator/loki/feature/music/play/PlayCommand.java b/src/main/java/creator/loki/feature/music/play/PlayCommand.java index 9895519..d72c801 100644 --- a/src/main/java/creator/loki/feature/music/play/PlayCommand.java +++ b/src/main/java/creator/loki/feature/music/play/PlayCommand.java @@ -84,7 +84,7 @@ public class PlayCommand implements Command { if (!guild.getAudioManager().isConnected()) { guild.getAudioManager().openAudioConnection(vc); } - for (int i = 0; i < 30; i++) { + for (int i = 0; i < 10; i++) { if (guild.getMember(guild.getJDA().getSelfUser()).getVoiceState().inAudioChannel()) break; try { Thread.sleep(200); @@ -93,7 +93,7 @@ public class PlayCommand implements Command { } } var link = lm.getOrCreateLink(guild.getIdLong()); - for (int i = 0; i < 30; i++) { + for (int i = 0; i < 10; i++) { if (link.getCachedPlayer() != null) break; try { Thread.sleep(200); diff --git a/src/main/java/creator/loki/feature/profile/RankCardGenerator.java b/src/main/java/creator/loki/feature/profile/RankCardGenerator.java index 2851ae1..e50fa42 100644 --- a/src/main/java/creator/loki/feature/profile/RankCardGenerator.java +++ b/src/main/java/creator/loki/feature/profile/RankCardGenerator.java @@ -1,7 +1,11 @@ package creator.loki.feature.profile; -import java.awt.*; +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Font; import java.awt.FontFormatException; +import java.awt.Graphics2D; +import java.awt.RenderingHints; import java.awt.geom.Ellipse2D; import java.awt.image.BufferedImage; import java.io.IOException; diff --git a/src/main/java/creator/loki/feature/radio/RadioManager.java b/src/main/java/creator/loki/feature/radio/RadioManager.java index 62f99bf..39616cb 100644 --- a/src/main/java/creator/loki/feature/radio/RadioManager.java +++ b/src/main/java/creator/loki/feature/radio/RadioManager.java @@ -8,12 +8,9 @@ import creator.loki.feature.music.manage.GuildMusicManager; import creator.loki.util.LoggerDecorator; import dev.arbjerg.lavalink.client.AbstractAudioLoadResultHandler; import dev.arbjerg.lavalink.client.Link; -import dev.arbjerg.lavalink.client.player.Track; import dev.arbjerg.lavalink.client.player.TrackLoaded; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.entities.Guild; -import net.dv8tion.jda.api.entities.Member; -import net.dv8tion.jda.api.entities.channel.concrete.VoiceChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,6 +50,25 @@ public class RadioManager { guild.getJDA().getDirectAudioController().connect( guild.getVoiceChannelById(channelId)); + for (int i = 0; i < 10; i++) { + if (guild.getMember(guild.getJDA().getSelfUser()).getVoiceState().inAudioChannel()) break; + try { + Thread.sleep(200); + } catch (InterruptedException e) { + return; + } + } + + var link = lavalinkManager.getOrCreateLink(guildId); + for (int i = 0; i < 10; i++) { + if (link.getCachedPlayer() != null) break; + try { + Thread.sleep(200); + } catch (InterruptedException e) { + return; + } + } + var mm = new GuildMusicManager(guildId, lavalinkManager, null); state.musicManager = mm; @@ -130,8 +146,27 @@ public class RadioManager { return radioJda; } + public int getVolume(long guildId) { + GuildRadioState state = radioStates.get(guildId); + return state != null ? state.volume : 100; + } + + public void setVolume(long guildId, int volume) { + GuildRadioState state = radioStates.computeIfAbsent(guildId, id -> new GuildRadioState()); + state.volume = Math.max(0, Math.min(100, volume)); + if (lavalinkManager != null) { + var link = lavalinkManager.getClient().getLinkIfCached(guildId); + if (link != null && link.getCachedPlayer() != null) { + link.createOrUpdatePlayer() + .setVolume(state.volume) + .subscribe(null, err -> logger.warn("Lavalink: {}", err.getMessage())); + } + } + } + private static class GuildRadioState { String streamUrl; GuildMusicManager musicManager; + int volume = 100; } } diff --git a/src/main/java/creator/loki/feature/role/CustomRoleManager.java b/src/main/java/creator/loki/feature/role/CustomRoleManager.java index 9530e90..0a35da0 100644 --- a/src/main/java/creator/loki/feature/role/CustomRoleManager.java +++ b/src/main/java/creator/loki/feature/role/CustomRoleManager.java @@ -1,6 +1,6 @@ package creator.loki.feature.role; -import java.util.*; +import java.util.List; import creator.loki.feature.role.repository.CustomRoleRepository; diff --git a/src/main/java/creator/loki/feature/serverstats/ServerStatsService.java b/src/main/java/creator/loki/feature/serverstats/ServerStatsService.java index d29b78a..7a89684 100644 --- a/src/main/java/creator/loki/feature/serverstats/ServerStatsService.java +++ b/src/main/java/creator/loki/feature/serverstats/ServerStatsService.java @@ -1,6 +1,9 @@ package creator.loki.feature.serverstats; -import java.awt.*; +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.time.format.DateTimeFormatter; diff --git a/src/main/java/creator/loki/feature/voice/VoiceButtonHandler.java b/src/main/java/creator/loki/feature/voice/VoiceButtonHandler.java index 1acc059..82617e0 100644 --- a/src/main/java/creator/loki/feature/voice/VoiceButtonHandler.java +++ b/src/main/java/creator/loki/feature/voice/VoiceButtonHandler.java @@ -8,9 +8,10 @@ import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.channel.concrete.VoiceChannel; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; -import net.dv8tion.jda.api.interactions.components.text.TextInput; -import net.dv8tion.jda.api.interactions.components.text.TextInputStyle; -import net.dv8tion.jda.api.interactions.modals.Modal; +import net.dv8tion.jda.api.components.label.Label; +import net.dv8tion.jda.api.components.textinput.TextInput; +import net.dv8tion.jda.api.components.textinput.TextInputStyle; +import net.dv8tion.jda.api.modals.Modal; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -91,7 +92,7 @@ public class VoiceButtonHandler extends ListenerAdapter { private void handleLimit(ButtonInteractionEvent event, VoiceChannel channel) { TextInput limitInput = - TextInput.create("limit", "Лимит пользователей", TextInputStyle.SHORT) + TextInput.create("limit", TextInputStyle.SHORT) .setPlaceholder("0-99 (0 = без лимита)") .setRequired(true) .setMinLength(1) @@ -101,7 +102,7 @@ public class VoiceButtonHandler extends ListenerAdapter { Modal modal = Modal.create("voice_limit:" + channel.getId(), "Установить лимит") - .addActionRow(limitInput) + .addComponents(Label.of("Лимит пользователей", limitInput)) .build(); event.replyModal(modal).queue(); @@ -109,7 +110,7 @@ public class VoiceButtonHandler extends ListenerAdapter { private void handleRename(ButtonInteractionEvent event, VoiceChannel channel) { TextInput nameInput = - TextInput.create("name", "Новое название", TextInputStyle.SHORT) + TextInput.create("name", TextInputStyle.SHORT) .setPlaceholder("Введите название канала") .setRequired(true) .setMinLength(1) @@ -119,7 +120,7 @@ public class VoiceButtonHandler extends ListenerAdapter { Modal modal = Modal.create("voice_rename:" + channel.getId(), "Переименовать канал") - .addActionRow(nameInput) + .addComponents(Label.of("Новое название", nameInput)) .build(); event.replyModal(modal).queue(); @@ -127,7 +128,7 @@ public class VoiceButtonHandler extends ListenerAdapter { private void handleBitrate(ButtonInteractionEvent event, VoiceChannel channel) { TextInput bitrateInput = - TextInput.create("bitrate", "Битрейт (kbps)", TextInputStyle.SHORT) + TextInput.create("bitrate", TextInputStyle.SHORT) .setPlaceholder("8-384") .setRequired(true) .setMinLength(1) @@ -137,7 +138,7 @@ public class VoiceButtonHandler extends ListenerAdapter { Modal modal = Modal.create("voice_bitrate:" + channel.getId(), "🎨 Установить битрейт") - .addActionRow(bitrateInput) + .addComponents(Label.of("Битрейт (kbps)", bitrateInput)) .build(); event.replyModal(modal).queue(); diff --git a/src/main/java/creator/loki/feature/voice/VoiceChannelManager.java b/src/main/java/creator/loki/feature/voice/VoiceChannelManager.java index 14b739e..2acba3d 100644 --- a/src/main/java/creator/loki/feature/voice/VoiceChannelManager.java +++ b/src/main/java/creator/loki/feature/voice/VoiceChannelManager.java @@ -12,7 +12,8 @@ import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.channel.concrete.VoiceChannel; -import net.dv8tion.jda.api.interactions.components.buttons.Button; +import net.dv8tion.jda.api.components.actionrow.ActionRow; +import net.dv8tion.jda.api.components.buttons.Button; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -144,7 +145,7 @@ public class VoiceChannelManager { channel .sendMessageEmbeds(embed.build()) - .addActionRow(lockBtn, limitBtn, renameBtn, bitrateBtn, deleteBtn) + .addComponents(ActionRow.of(lockBtn, limitBtn, renameBtn, bitrateBtn, deleteBtn)) .queue(); }