11package dev.arbjerg.lavalink.client
22
33import dev.arbjerg.lavalink.client.event.ClientEvent
4+ import dev.arbjerg.lavalink.client.event.ResumeSynchronizationEvent
45import dev.arbjerg.lavalink.client.http.HttpBuilder
56import dev.arbjerg.lavalink.client.player.*
67import dev.arbjerg.lavalink.client.player.Track
@@ -17,12 +18,14 @@ import kotlinx.serialization.serializer
1718import okhttp3.Call
1819import okhttp3.OkHttpClient
1920import okhttp3.Response
21+ import org.slf4j.LoggerFactory
2022import reactor.core.Disposable
2123import reactor.core.publisher.Flux
2224import reactor.core.publisher.Mono
2325import reactor.core.publisher.Sinks
2426import reactor.core.publisher.Sinks.Many
2527import reactor.kotlin.core.publisher.toMono
28+ import reactor.util.retry.Retry
2629import java.io.Closeable
2730import java.io.IOException
2831import java.time.Duration
@@ -38,6 +41,7 @@ class LavalinkNode(
3841 private val nodeOptions : NodeOptions ,
3942 val lavalink : LavalinkClient
4043) : Disposable, Closeable {
44+ private val logger = LoggerFactory .getLogger(LavalinkNode ::class .java)
4145 // "safe" uri with all paths removed
4246 val baseUri = " ${nodeOptions.serverUri.scheme} ://${nodeOptions.serverUri.host} :${nodeOptions.serverUri.port} "
4347
@@ -238,7 +242,7 @@ class LavalinkNode(
238242 }
239243
240244 /* *
241- * Enables resuming. This causes Lavalink to continue playing for [duration] , during which
245+ * Enables resuming. This causes Lavalink to continue playing for [timeout] amount of time , during which
242246 * we can reconnect without losing our session data. */
243247 fun enableResuming (timeout : Duration ): Mono <Session > {
244248 return rest.patchSession(Session (resuming = true , timeout.seconds)).doOnSuccess {
@@ -428,7 +432,9 @@ class LavalinkNode(
428432 }
429433
430434 internal fun synchronizeAfterResume () {
431- getPlayers().subscribe { players ->
435+ getPlayers()
436+ .retryWhen(Retry .fixedDelay(3 , Duration .ofSeconds(1 )))
437+ .map { players ->
432438 val remoteGuildIds = players.map { it.guildId }
433439
434440 players.forEach { player ->
@@ -450,6 +456,13 @@ class LavalinkNode(
450456 val link = lavalink.getLinkIfCached(guildId) ? : return @forEach
451457 if (link.node == this ) link.state = LinkState .DISCONNECTED
452458 }
459+
460+ ResumeSynchronizationEvent (this , failureReason = null )
461+ }.doOnError {
462+ logger.error(" Failure while attempting synchronization with $this " , it)
463+ sink.tryEmitNext(ResumeSynchronizationEvent (this , failureReason = it))
464+ }.subscribe {
465+ sink.tryEmitNext(it)
453466 }
454467 }
455468
0 commit comments