BasicsUsage

Usage

First thing first, you need to have a lavalink node running. You can download the latest version of lavalink from here, or you can use this for free.

2. Creating a Project

We have provided example of both Lavalink v3 and v4. You can see the highlighted code for the difference between the two.

index.js
const { Client, GatewayDispatchEvents } = require("discord.js");
const { Riffy } = require("riffy");
 
const client = new Client({
    intents: [
        "Guilds",
        "GuildMessages",
        "GuildVoiceStates",
        "GuildMessageReactions",
        "MessageContent",
        "DirectMessages"
    ]
});
 
const nodes = [
    {
        host: "localhost",
        password: "youshallnotpass",
        port: 2333,
        secure: false
    },
];
 
client.riffy = new Riffy(client, nodes, {
    send: (payload) => {
        const guild = client.guilds.cache.get(payload.d.guild_id);
        if (guild) guild.shard.send(payload);
    },
    defaultSearchPlatform: "ytmsearch",
    restVersion: "v4"
});
 
client.on("ready", () => {
    client.riffy.init(client.user.id);
    console.log(`Logged in as ${client.user.tag}`);
});
 
client.on("messageCreate", async (message) => {
    if (!message.content.startsWith('!') || message.author.bot) return;
 
    const args = message.content.slice(1).trim().split(" ");
    const command = args.shift().toLowerCase();
 
    if (command === "play") {
        const query = args.join(" ");
 
        const player = client.riffy.createConnection({
            guildId: message.guild.id,
            voiceChannel: message.member.voice.channel.id,
            textChannel: message.channel.id,
            deaf: true
        });
 
        const resolve = await client.riffy.resolve({ query: query, requester: message.author });
        const { loadType, tracks, playlistInfo } = resolve;
 
        if (loadType === 'playlist') {
            for (const track of resolve.tracks) {
                track.info.requester = message.author;
                player.queue.add(track);
            }
 
            message.channel.send(`Added: \`${tracks.length} tracks\` from \`${playlistInfo.name}\``,);
            if (!player.playing && !player.paused) return player.play();
 
        } else if (loadType === 'search' || loadType === 'track') {
            const track = tracks.shift();
            track.info.requester = message.author;
 
            player.queue.add(track);
            message.channel.send(`Added: \`${track.info.title}\``);
            if (!player.playing && !player.paused) return player.play();
        } else {
            return message.channel.send('There are no results found.');
        }
    }
})
 
client.riffy.on("nodeConnect", node => {
    console.log(`Node "${node.name}" connected.`)
})
 
client.riffy.on("nodeError", (node, error) => {
    console.log(`Node "${node.name}" encountered an error: ${error.message}.`)
})
 
client.riffy.on("trackStart", async (player, track) => {
    const channel = client.channels.cache.get(player.textChannel);
 
    channel.send(`Now playing: \`${track.info.title}\` by \`${track.info.author}\`.`);
});
 
client.riffy.on("queueEnd", async (player) => {
    const channel = client.channels.cache.get(player.textChannel);
    
	const autoplay = false;
 
    if (autoplay) {
        player.autoplay(player)
    } else {
        player.destroy();
        channel.send("Queue has ended.");
    }
})
 
client.on("raw", (d) => {
    if (![GatewayDispatchEvents.VoiceStateUpdate, GatewayDispatchEvents.VoiceServerUpdate,].includes(d.t)) return;
    client.riffy.updateVoiceState(d);
});
 
client.login("Discord-Bot-Token-Here");

3. Running our Discord bot

Now that we have created our project, we can run our bot by typing node index.js in the terminal. When the bot is running, you can use the !play song_name command to play music.

preview

Additional

You can use our musicard package to create a music card for your bot. You can see the preview here.