A lavalink client for Discord.js
mrjacz.github.io/discord.js-lavalink
For stable
# Using yarn
yarn add discord.js-lavalink
# Using npm
npm install discord.js-lavalink
For Development
# Using yarn
yarn add MrJacz/discord.js-lavalink
# Using npm
npm install MrJacz/discord.js-lavalink
Download from the CI server
Put an application.yml
file in your working directory. Example
Run with java -jar Lavalink.jar
If you're having a problem with the module contact us in the Discord Server
Start by creating a new PlayerManager
passing an array of nodes and an object with user
the client's user id and shards
The total number of shards your bot is operating on.
const { PlayerManager } = require("discord.js-lavalink");
const nodes = [{ host: "localhost", port: 2333, password: "youshallnotpass" }];
const manager = new PlayerManager(client, nodes, {
user: client.user.id, // Client id
shards: shardCount // Total number of shards your bot is operating on
});
manager.on("error", (node, error) => {
node; // is the node which the error is from
error; // is the error;
});
Resolving tracks using LavaLink REST API
const fetch = require("node-fetch");
const { URLSearchParams } = require("url");
async function getSongs(search) {
const node = client.player.nodes.first();
const params = new URLSearchParams();
params.append("identifier", search);
return fetch(`http://${node.host}:${node.port}/loadtracks?${params}`, { headers: { Authorization: node.password } })
.then(res => res.json())
.then(data => data.tracks)
.catch(err => {
console.error(err);
return null;
});
}
getSongs("ytsearch:30 second song").then(songs => {
// handle loading of the tracks somehow ¯\_(ツ)_/¯
});
Joining and Leaving channels
// Join
const player = await manager.join({
guild: guildId, // Guild id
channel: channelId, // Channel id
host: "localhost" // lavalink host, based on array of nodes
});
await player.play(track); // Track is a base64 string we get from Lavalink REST API
player.once("error", error => console.error(error));
player.once("end", data => {
if (data.reason === "REPLACED") return; // Ignore REPLACED reason to prevent skip loops
// Play next song
});
// Leave voice channel and destory Player
await manager.leave(guildId); // Player ID aka guild id
For a proper example look at example/app.js