Handle stuck tracks/Lavalink disconnections

This commit is contained in:
Essem 2022-07-22 00:22:23 -05:00
parent 00ab7308ff
commit 2d050046e4
No known key found for this signature in database
GPG key ID: 7D497397CC3A2A8C
3 changed files with 22 additions and 3 deletions

View file

@ -29,6 +29,10 @@ class NowPlayingCommand extends MusicCommand {
name: "💬 Channel:",
value: this.channel.guild.channels.get(this.member.voiceState.channelID).name
},
{
name: "🌐 Node:",
value: player.node.name
},
{
name: `${"▬".repeat(parts)}🔘${"▬".repeat(10 - parts)}`,
value: `${format(player.position)}/${track.isStream ? "∞" : format(track.length)}`

View file

@ -11,7 +11,7 @@ class QueueCommand extends MusicCommand {
if (!this.channel.guild.members.get(this.client.user.id).voiceState.channelID) return "I'm not in a voice channel!";
if (!this.channel.permissionsOf(this.client.user.id).has("embedLinks")) return "I don't have the `Embed Links` permission!";
const player = this.connection;
const node = nodes.filter((val) => { return val.name === player.player.node.name })[0];
const node = nodes.filter((val) => val.name === player.player.node.name)[0];
const tracks = await fetch(`http://${node.url}/decodetracks`, { method: "POST", body: JSON.stringify(this.queue), headers: { Authorization: node.auth, "Content-Type": "application/json" } }).then(res => res.json());
const trackList = [];
const firstTrack = tracks.shift();
@ -41,6 +41,9 @@ class QueueCommand extends MusicCommand {
}, {
name: "🔁 Looping?",
value: player.loop ? "Yes" : "No"
}, {
name: "🌐 Node",
value: player.node.name
}, {
name: "🗒️ Queue",
value: value !== "del" ? value.join("\n") : "There's nothing in the queue!"

View file

@ -31,7 +31,7 @@ export async function checkStatus() {
}
export async function connect(client) {
manager = new Shoukaku(new Connectors.Eris(client), nodes);
manager = new Shoukaku(new Connectors.Eris(client), nodes, { moveOnDisconnect: true, resume: true, reconnectInterval: 500, reconnectTries: 1 });
client.emit("ready"); // workaround
manager.on("error", (node, error) => {
logger.error(`An error occurred on Lavalink node ${node}: ${error}`);
@ -83,7 +83,8 @@ export async function play(client, sound, options, music = false) {
response = await node.rest.resolve(sound);
if (!response) return "🔊 I couldn't get a response from the audio server.";
if (response.loadType === "NO_MATCHES" || response.loadType === "LOAD_FAILED") return "I couldn't find that song!";
} catch {
} catch (e) {
logger.error(e);
return "🔊 Hmmm, seems that all of the audio servers are down. Try again in a bit.";
}
const oldQueue = queues.get(voiceChannel.guild.id);
@ -144,6 +145,10 @@ export async function nextSong(client, options, connection, track, info, music,
name: "💬 Channel:",
value: voiceChannel.name
},
{
name: "🌐 Node:",
value: connection.node.name
},
{
name: `${"▬".repeat(parts)}🔘${"▬".repeat(10 - parts)}`,
value: `0:00/${info.isStream ? "∞" : format(info.length)}`
@ -161,6 +166,7 @@ export async function nextSong(client, options, connection, track, info, music,
}
}
connection.removeAllListeners("exception");
connection.removeAllListeners("stuck");
connection.removeAllListeners("end");
connection.playTrack({ track });
players.set(voiceChannel.guild.id, { player: connection, type: music ? "music" : "sound", host: host, voiceChannel: voiceChannel, originalChannel: options.channel, loop, shuffle, playMessage: playingMessage });
@ -177,6 +183,7 @@ export async function nextSong(client, options, connection, track, info, music,
} catch {
// no-op
}
connection.removeAllListeners("stuck");
connection.removeAllListeners("end");
players.delete(voiceChannel.guild.id);
queues.delete(voiceChannel.guild.id);
@ -188,6 +195,11 @@ export async function nextSong(client, options, connection, track, info, music,
await options.interaction.createMessage(content);
}
});
connection.on("stuck", () => {
const nodeName = manager.getNode().name;
connection.move(nodeName);
connection.resume();
});
connection.on("end", async (data) => {
if (data.reason === "REPLACED") return;
let queue = queues.get(voiceChannel.guild.id);