diff --git a/lavalink/application.yml b/lavalink/application.yml index f494add..695b4c2 100644 --- a/lavalink/application.yml +++ b/lavalink/application.yml @@ -22,8 +22,9 @@ plugins: clientId: "${SPOTIFY_CLIENT_ID}" clientSecret: "${SPOTIFY_CLIENT_SECRET}" countryCode: "RU" - playlistLoadLimit: 6 - albumLoadLimit: 6 + playlistLoadLimit: 10 + albumLoadLimit: 10 + preferPartnerApi: true applemusic: countryCode: "RU" mediaType: "music" diff --git a/src/main/java/creator/loki/core/BotInitializer.java b/src/main/java/creator/loki/core/BotInitializer.java index 44f360a..4801a38 100644 --- a/src/main/java/creator/loki/core/BotInitializer.java +++ b/src/main/java/creator/loki/core/BotInitializer.java @@ -66,6 +66,14 @@ public class BotInitializer { mainJda.getGuilds().forEach(g -> memberCounterListener.startScheduler(g)); healthHttpServer.start(); + lavalinkManager.setVoiceDisconnectHandler( + guildId -> { + var guild = mainJda.getGuildById(guildId); + if (guild != null) { + guild.getAudioManager().closeAudioConnection(); + } + }); + JDA musicJda = createMusicJDA(); JDA radioJda = null; if (config.getRadioToken() != null && !config.getRadioToken().isBlank()) { 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 85dfa7c..8de47be 100644 --- a/src/main/java/creator/loki/feature/music/core/LavalinkManager.java +++ b/src/main/java/creator/loki/feature/music/core/LavalinkManager.java @@ -2,6 +2,7 @@ package creator.loki.feature.music.core; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.LongConsumer; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -29,6 +30,7 @@ public class LavalinkManager { private final Map musicManagers = new ConcurrentHashMap<>(); private final BotConfig config; private final QueueRepository queueRepository; + private volatile LongConsumer voiceDisconnectHandler; @Inject public LavalinkManager(BotConfig config, QueueRepository queueRepository) { @@ -79,7 +81,7 @@ public class LavalinkManager { .on(StatsEvent.class) .subscribe( event -> { - logger.debug( + logger.trace( "Нода '{}' статистика: игроков {}/{}", event.getNode().getName(), event.getPlayingPlayers(), @@ -116,9 +118,17 @@ public class LavalinkManager { return client.getOrCreateLink(guildId); } + public void setVoiceDisconnectHandler(LongConsumer handler) { + this.voiceDisconnectHandler = handler; + } + + public LongConsumer getVoiceDisconnectHandler() { + return voiceDisconnectHandler; + } + public GuildMusicManager getMusicManager(long guildId) { return musicManagers.computeIfAbsent( - guildId, id -> new GuildMusicManager(id, this, queueRepository)); + guildId, id -> new GuildMusicManager(id, this, queueRepository, voiceDisconnectHandler)); } public GuildMusicManager getMusicManagerIfCached(long guildId) { 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 00bd1ea..ebc4d57 100644 --- a/src/main/java/creator/loki/feature/music/manage/GuildMusicManager.java +++ b/src/main/java/creator/loki/feature/music/manage/GuildMusicManager.java @@ -7,6 +7,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import java.util.function.LongConsumer; import creator.loki.feature.music.core.LavalinkManager; import creator.loki.feature.music.repository.QueueRepository; @@ -27,13 +28,21 @@ public class GuildMusicManager { 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, QueueRepository queueRepository, LongConsumer voiceDisconnectHandler) { this.guildId = guildId; this.lavalinkManager = lavalinkManager; this.queueRepository = queueRepository; + this.voiceDisconnectHandler = voiceDisconnectHandler; this.scheduler = new TrackScheduler(this); loadQueueAsync(); } @@ -63,7 +72,7 @@ public class GuildMusicManager { public void startAutoLeaveTimer() { cancelAutoLeaveTimer(); - autoLeaveFuture = executor.schedule(this::autoLeave, 2, TimeUnit.MINUTES); + autoLeaveFuture = executor.schedule(this::autoLeave, 3, TimeUnit.MINUTES); } private void autoLeave() { @@ -73,6 +82,9 @@ public class GuildMusicManager { link -> link.destroy() .subscribe(null, err -> logger.warn("Lavalink: {}", err.getMessage()))); + if (voiceDisconnectHandler != null) { + voiceDisconnectHandler.accept(guildId); + } lavalinkManager.removeMusicManager(guildId); }