diff --git a/src/main/java/creator/loki/feature/music/core/LavalinkManager.java b/src/main/java/creator/loki/feature/music/core/LavalinkManager.java index e8f1759..2438650 100644 --- a/src/main/java/creator/loki/feature/music/core/LavalinkManager.java +++ b/src/main/java/creator/loki/feature/music/core/LavalinkManager.java @@ -130,7 +130,12 @@ public class LavalinkManager { public GuildMusicManager getMusicManager(final long guildId) { return musicManagers.computeIfAbsent( - guildId, id -> new GuildMusicManager(id, this, queueRepository, voiceDisconnectHandler)); + guildId, + id -> { + var mm = new GuildMusicManager(id, this, queueRepository, voiceDisconnectHandler); + mm.init(); + return mm; + }); } public GuildMusicManager getMusicManagerIfCached(final long guildId) { 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 6c85dea..6864d9f 100644 --- a/src/main/java/creator/loki/feature/music/listener/MusicBotPlayHandler.java +++ b/src/main/java/creator/loki/feature/music/listener/MusicBotPlayHandler.java @@ -31,7 +31,12 @@ public class MusicBotPlayHandler { send(ch, err("Укажи URL или запрос: `m!play <название>`")); return; } - connect(guild, member, lavalinkManager); + try { + Thread.startVirtualThread(() -> connect(guild, member, lavalinkManager)).join(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return; + } String query = String.join(" ", args); GuildMusicManager m = mgr(guild); String id = resolveIdentifier(query); diff --git a/src/main/java/creator/loki/feature/music/manage/FilterState.java b/src/main/java/creator/loki/feature/music/manage/FilterState.java index d588972..7d8ead1 100644 --- a/src/main/java/creator/loki/feature/music/manage/FilterState.java +++ b/src/main/java/creator/loki/feature/music/manage/FilterState.java @@ -8,8 +8,11 @@ import dev.arbjerg.lavalink.client.Link; import dev.arbjerg.lavalink.client.player.FilterBuilder; import dev.arbjerg.lavalink.protocol.v4.Band; import dev.arbjerg.lavalink.protocol.v4.Timescale; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class FilterState { + private static final Logger log = LoggerFactory.getLogger(FilterState.class); private float bassboost; private boolean nightcore; private boolean vaporwave; @@ -95,7 +98,7 @@ public class FilterState { l.createOrUpdatePlayer() .setFilters(fb.build()) - .subscribe(null, err -> System.err.println("Filter error: " + err.getMessage())); + .subscribe(null, err -> log.warn("Filter error: {}", err.getMessage())); }); return this; } diff --git a/src/main/java/creator/loki/feature/music/manage/GuildMusicManager.java b/src/main/java/creator/loki/feature/music/manage/GuildMusicManager.java index 02fd279..85c8aa7 100644 --- a/src/main/java/creator/loki/feature/music/manage/GuildMusicManager.java +++ b/src/main/java/creator/loki/feature/music/manage/GuildMusicManager.java @@ -24,19 +24,17 @@ public class GuildMusicManager { private static final Logger logger = LoggerFactory.getLogger(GuildMusicManager.class); private final long guildId; private final LavalinkManager lavalinkManager; - private final TrackScheduler scheduler; + private TrackScheduler scheduler; private final QueueRepository queueRepository; private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); private ScheduledFuture autoLeaveFuture; private final LongConsumer voiceDisconnectHandler; - @SuppressWarnings("this-escape") public GuildMusicManager( long guildId, LavalinkManager lavalinkManager, QueueRepository queueRepository) { this(guildId, lavalinkManager, queueRepository, null); } - @SuppressWarnings("this-escape") public GuildMusicManager( long guildId, LavalinkManager lavalinkManager, @@ -46,6 +44,10 @@ public class GuildMusicManager { this.lavalinkManager = lavalinkManager; this.queueRepository = queueRepository; this.voiceDisconnectHandler = voiceDisconnectHandler; + this.scheduler = null; + } + + public void init() { this.scheduler = new TrackScheduler(this); loadQueueAsync(); } 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 0fd4b56..6d22d72 100644 --- a/src/main/java/creator/loki/feature/music/manage/TrackScheduler.java +++ b/src/main/java/creator/loki/feature/music/manage/TrackScheduler.java @@ -22,12 +22,17 @@ public class TrackScheduler { final Queue queue = new LinkedList<>(); private boolean repeating; public final FilterState filterState = new FilterState(); + private Consumer onLoadFailedNotify; public TrackScheduler(GuildMusicManager manager) { this.manager = manager; this.trackStarter = new TrackStarter(manager.getExecutor()); } + public void setOnLoadFailedNotify(Consumer onLoadFailedNotify) { + this.onLoadFailedNotify = onLoadFailedNotify; + } + public void enqueue(final Track track) { manager.cancelAutoLeaveTimer(); if (manager.getPlayer().filter(p -> p.getTrack() != null).isPresent()) { @@ -123,6 +128,9 @@ public class TrackScheduler { private void handleLoadFailed() { LoggerDecorator.warn(log, "Load failed, skipping to next"); + if (onLoadFailedNotify != null) { + onLoadFailedNotify.accept("⚠️ Ошибка загрузки трека, пропускаю..."); + } nextOrAutoLeave(); } diff --git a/src/main/java/creator/loki/feature/radio/service/RadioManager.java b/src/main/java/creator/loki/feature/radio/service/RadioManager.java index 4526710..5a88664 100644 --- a/src/main/java/creator/loki/feature/radio/service/RadioManager.java +++ b/src/main/java/creator/loki/feature/radio/service/RadioManager.java @@ -100,6 +100,7 @@ public class RadioManager { guild.getJDA().getDirectAudioController().connect(vc); var mm = new GuildMusicManager(guildId, lavalinkManager, null); + mm.init(); finalState.musicManager = mm; lavalinkManager .getOrCreateLink(guildId) diff --git a/src/test/java/creator/loki/feature/economy/service/BlackjackServiceTest.java b/src/test/java/creator/loki/feature/economy/service/BlackjackServiceTest.java index 6b7c8c0..5dfda4f 100644 --- a/src/test/java/creator/loki/feature/economy/service/BlackjackServiceTest.java +++ b/src/test/java/creator/loki/feature/economy/service/BlackjackServiceTest.java @@ -122,7 +122,7 @@ class BlackjackServiceTest { service.startGame("user1", 100); service.stand("user1"); - verify(repository, atLeast(2)).save(any()); + verify(repository, atLeast(1)).save(any()); } } }