Skip to content

Commit 11b3fc0

Browse files
committed
Properly transfer a node if another one gets removed
Fixes #29
1 parent 032b636 commit 11b3fc0

File tree

4 files changed

+47
-15
lines changed

4 files changed

+47
-15
lines changed

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,10 @@ class LavalinkClient(val userId: Long) : Closeable, Disposable {
148148
return
149149
}
150150

151-
if (nodes.size == 1) {
151+
// In case a node was removed and we have a single node left.
152+
// we should always check if the node is the same
153+
// NEVER assume that the disconnected node is still in the nodes list.
154+
if (nodes.size == 1 && nodes.first() == node) {
152155
linkMap.forEach { (_, link) ->
153156
link.state = LinkState.DISCONNECTED
154157
}

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

+9-5
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,15 @@ class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Clos
129129
}
130130

131131
override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
132+
handleFailureTrhowable(t)
133+
134+
node.available = false
135+
open = false
136+
137+
node.lavalink.onNodeDisconnected(node)
138+
}
139+
140+
private fun handleFailureTrhowable(t: Throwable) {
132141
when(t) {
133142
is EOFException -> {
134143
logger.debug("Got disconnected from ${node.name}, trying to reconnect", t)
@@ -156,11 +165,6 @@ class LavalinkSocket(private val node: LavalinkNode) : WebSocketListener(), Clos
156165
logger.error("Unknown error on ${node.name}", t)
157166
}
158167
}
159-
160-
node.available = false
161-
open = false
162-
163-
node.lavalink.onNodeDisconnected(node)
164168
}
165169

166170
override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {

testbot/src/main/java/me/duncte123/testbot/JDAListener.java

+25
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ public void onReady(@NotNull ReadyEvent event) {
3737
event.getJDA().updateCommands()
3838
.addCommands(
3939
Commands.slash("lyrics", "Testing custom requests"),
40+
Commands.slash("node", "What node am I on?"),
41+
Commands.slash("del-node", "test")
42+
.addOption(
43+
OptionType.STRING,
44+
"node-name",
45+
"Name of the node",
46+
true
47+
),
4048
Commands.slash("join", "Join the voice channel you are in."),
4149
Commands.slash("leave", "Leaves the vc"),
4250
Commands.slash("stop", "Stops the current track"),
@@ -67,6 +75,23 @@ public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent even
6775
}
6876

6977
switch (event.getFullCommandName()) {
78+
case "node": {
79+
final var link = this.client.getLinkIfCached(guild.getIdLong());
80+
81+
if (link == null) {
82+
event.reply("No link for this guild").queue();
83+
break;
84+
}
85+
86+
event.reply("Connected to: " + link.getNode().getName()).queue();
87+
88+
break;
89+
}
90+
case "del-node": {
91+
this.client.removeNode(event.getOption("node-name").getAsString());
92+
event.reply("Ok").queue();
93+
break;
94+
}
7095
case "join":
7196
joinHelper(event);
7297
break;

testbot/src/main/java/me/duncte123/testbot/Main.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,16 @@ private static void registerLavalinkNodes(LavalinkClient client) {
6666
.setServerUri("ws://optiplex.local.duncte123.lgbt")
6767
.setPassword("youshallnotpass")
6868
.build()
69-
)
69+
),
7070

71-
// client.addNode(
72-
// new NodeOptions.Builder()
73-
// .setName("pi")
74-
// .setServerUri("ws://pi.local.duncte123.lgbt:2333/bepis")
75-
// .setPassword("youshallnotpass")
76-
// .setRegionFilter(RegionGroup.US)
77-
// .build()
78-
// )
71+
client.addNode(
72+
new NodeOptions.Builder()
73+
.setName("pi")
74+
.setServerUri("ws://pi.local.duncte123.lgbt:2333")
75+
.setPassword("youshallnotpass")
76+
.setRegionFilter(RegionGroup.US)
77+
.build()
78+
)
7979
).forEach((node) -> {
8080
node.on(TrackStartEvent.class).subscribe((event) -> {
8181
final LavalinkNode node1 = event.getNode();

0 commit comments

Comments
 (0)