Skip to content

Commit 492c23a

Browse files
authored
Add functionality to nodes to transfer all players to other nodes. (#35)
1 parent f94172d commit 492c23a

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-2
lines changed

src/main/kotlin/dev/arbjerg/lavalink/client/LavalinkClient.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ class LavalinkClient(val userId: Long) : Closeable, Disposable {
196196
transferNodes(node)
197197
}
198198

199-
private fun transferNodes(node: LavalinkNode) {
199+
internal fun transferNodes(node: LavalinkNode) {
200200
linkMap.forEach { (_, link) ->
201201
if (link.node == node) {
202202
val voiceRegion = link.cachedPlayer?.voiceRegion

src/main/kotlin/dev/arbjerg/lavalink/client/LavalinkNode.kt

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ class LavalinkNode(
7070
var available: Boolean = false
7171
internal set
7272

73+
// TODO: Maybe it would make sense to add some node state enums like the links have.
74+
var transferring: Boolean = false
75+
internal set
76+
7377
/**
7478
* A local player cache, allows us to not call the rest client every time we need a player.
7579
*/
@@ -183,7 +187,10 @@ class LavalinkNode(
183187
return rest.destroyPlayer(guildId)
184188
.doOnSuccess {
185189
removeCachedPlayer(guildId)
186-
lavalink.removeDestroyedLink(guildId)
190+
// When transferring to a new node preserve the link
191+
if (!transferring) {
192+
lavalink.removeDestroyedLink(guildId)
193+
}
187194
}
188195
}
189196

@@ -473,6 +480,23 @@ class LavalinkNode(
473480
}
474481
}
475482

483+
/**
484+
* Puts the node into a transferring state, then starts transferring all players to other nodes.
485+
* Once the node is put into this state, a reconnect or calling transferComplete() removes it from that state.
486+
* Transferring state does not remove links from cache when deleting off this node, unless the transfer also fails.
487+
*/
488+
fun transferPlayersToOtherNodes() {
489+
transferring = true
490+
lavalink.transferNodes(this)
491+
}
492+
493+
/**
494+
* Manually removes this node from the transfer state.
495+
*/
496+
fun transferComplete() {
497+
transferring = false
498+
}
499+
476500
override fun equals(other: Any?): Boolean {
477501
if (this === other) return true
478502
if (javaClass != other?.javaClass) return false

src/main/kotlin/dev/arbjerg/lavalink/internal/LavalinkSocket.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Clos
6666

6767
node.sessionId = sessionId
6868
node.available = true
69+
node.transferring = false
6970
logger.info("${node.name} is ready with session id $sessionId")
7071

7172
node.playerCache.values.forEach { player ->

0 commit comments

Comments
 (0)