npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

lavabeats

v1.1.0

Published

Manage your musics with LavaBeats.

Downloads

10

Readme

LavaBeats is the best library for playing and manage your music on Discord with Lavalink's server !

Things required :

A latest version of Java (JDK) for execute your Lavalink's server

Lavalink.jar https://github.com/lavalink-devs/Lavalink/tags

FOR HELP: https://discord.gg/tSHCBKhYc8

Official support of Lavalink: https://discord.gg/lavalink-1082302532421943407

Create your 'application.yml' for Config your Lavalink's server

BEFORE EXECUTE YOUR BOT, EXECUTE THE LAVALINK'S SERVER

Libraries we support: ALL (Discord.JS, ERIS...)

Example code Bot (Discord.js)

const { Client } = require('discord.js');
const { LavaBeats } = require('lavabeats');

const client = new Client({intents: 3276799}); //All intents
client.login("TOKEN DISCORD BOT");

client.on('ready', () => {
  console.log(client.user.tag);
  client.music = new LavaBeats(client, [{
    host: "localhost",
    password: "LAVABEATS_PASSWORD", //PASSWORD CONFIGURED ON application.yml
    port: 2635, //PORT CONFIGURED ON application.yml
    secure: false
  }], { 
    send: (payload) => {
      const guild = client.guilds.cache.get(payload.d.guild_id);
      if(guild) guild.shard.send(payload);
      /*Update this function if your library don't work with LavaBeats*/
    }
  });

  client.on("raw", (d) => client.music?.updateVoiceState(d));
  client.music.init(client.user.id);
  client.music.on('nodeConnect', async () => {
    console.log("Node connected !");

    //If you want to configure a poToken as well as visitorData to properly use the YouTube plugin, use this request:
    client.music.nodeMap.get(/*YOUR CURRENT NODE*/).rest.updateYoutubePluginData("your poToken", "your visitorData")
  }); //If you don't have this log, start your Lavalink.jar (and if you have already start Lavalink, check the console of Lavalink for get the errors)
  client.music.on('trackStart', (player, track) => client.channels.cache.get(player.textChannel)?.send(`:crystal_ball: New Music Started!\n\n- ${track.info.author}\n- ${track.info.title} [MUSIC HERE](${track.info.uri})`)); //Not required
  client.music.on('queueEnd', player => {
    player.destroy();
    return client.channels.cache.get(player.textChannel)?.send("Queen has ended. (I leave the voice channel)");
  }); //Not required
});

Exemple of multiple commands:

client.on('messageCreate', async message => {
  if(!message.guild || !message.member || !message.content) return;

  const args = message.content.split(' ');
  if(!args) return;

  const commandName = args.shift()?.toLowerCase();
  if(!commandName) return;

  if(commandName === "!play") {
    if(!message.member.voice.channel) return message.reply(":x: Please join a voice channel !");

    const music = args.join(" ");
    let source = "ytmsearch:";

    if(/^(https?:\/\/)?(www\.)?(youtube\.com\/|youtu\.be\/)/.test(music)) source = ""; //If is YouTube URL, Lavalink can't found with "ytsearch: or ytmsearch:"
    if(/https?:\/\/(www\.)?open\.spotify\.com\/[^\s]*/g.test(music)) source = "ytmsearch:"; //If is Spotify URL, the source search method is set on defaultSearchPlateform.spotify

    return await client.music.search({
      query: music,
      requester: message.author,
      source: source
    }).then(musicSearch => {
      if(!musicSearch || !musicSearch.tracks) return message.reply(":x: No music found !");
      if(musicSearch.tracks) {
        const player = client.music.players.get(message.guild.id) || client.music.createConnection({
          guildId: message.guild.id,
          voiceChannel: message.member.voice.channel.id,
          textChannel: message.channel.id,
          deaf: true
        });

        player.queue.push(musicSearch.tracks[0]);
        if(!player.playing) player.play();

        return message.reply(`:notes: Music added to queue!\n- ${musicSearch.tracks[0].info.author}\n- ${musicSearch.tracks[0].info.title} [MUSIC HERE](${musicSearch.tracks[0].info.uri})`);
      };
    });
  };

  if(commandName === "!playlist") {
    if(!message.member.voice.channel) return message.reply(":x: Please join a voice channel !");
    
    const playlist = args[0];
    if(!playlist) return message.reply(":x: No playlist specified!");

    let source = null;
    if(/^(https?:\/\/)?(www\.)?(youtube\.com\/|youtu\.be\/)/.test(playlist)) source = ""; //If is YouTube URL, Lavalink can't found with "ytsearch: or ytmsearch:"
    if(/https?:\/\/(www\.)?open\.spotify\.com\/[^\s]*/g.test(playlist)) source = "ytmsearch:"; //If is Spotify URL, the source search method is set on defaultSearchPlateform.spotify

    if(source === null) return message.reply(":x: No valid playlist specified!");

    return await client.music.search({
      query: playlist,
      requester: message.author,
      source: source
    }).then(musicSearch => {
      if(!musicSearch || !musicSearch.tracks) return message.reply(":x: No music found !");
      if(musicSearch.tracks && musicSearch.tracks.length > 1) {
        const player = client.music.players.get(message.guild.id) || client.music.createConnection({
          guildId: message.guild.id,
          voiceChannel: message.member.voice.channel.id,
          textChannel: message.channel.id,
          deaf: true
        });

        musicSearch.tracks?.forEach(music => player.queue.push(music));
        if(!player.playing) player.play();

        return message.reply(`:scroll: The playlist ${musicSearch.playlistInfo.name} has been load!\n${musicSearch.tracks.length} musics add!`);
      };
    });
  };

  if(commandName === "!skip") {
    if(!message.member.voice.channel) return message.reply(":x: Please join a voice channel !");
    
    const player = client.music.players.get(message.guild.id);
    if(!player || !player.queue.length) return message.reply(":x: No Music available !");

    player.stop();
    return message.reply(`:skip: Music skipped!\n- ${player.current.info.author}\n- [${player.current.info.title}](${player.current.info.uri})`);
  };

  if(commandName === "!leave") {
    if(!message.member.voice.channel) return message.reply(":x: Please join a voice channel !");

    const player = client.music.players.get(message.guild.id);
    if(!player || !player.current) return message.reply(":x: No Player available!");

    player.destroy();
    return message.reply(':white_check_mark: Leaving the voice channel !');
  };

  if(commandName === "!pause") {
    if(!message.member.voice.channel) return message.reply(":x: Please join a voice channel !");

    const player = client.music.players.get(message.guild.id);
    if(!player || !player.current) return message.reply(":x: No Player available!");

    const options = args[0];
    if(!options || !["on", "off"].includes(options)) return message.reply(":x: Please include a option. (on/off)");

    player.setPause(options === "on");
    return message.reply(`:white_check_mark: The music is ${options === "on" ? "paused" : "unpaused"} !`);
  };

  if(commandName === "!volume") {
    if(!message.member.voice.channel) return message.reply(":x: Please join a voice channel !");

    const player = client.music.players.get(message.guild.id);
    if(!player || !player.current) return message.reply(":x: No Player available!");

    const options = parseInt(args[0]);
    if(!options || isNaN(parseInt(args[0])) || options < 1 || options > 1000) return message.reply(":x: Please specified a new volume. (1-1000)");

    player.setVolume(options);
    return message.reply(`:white_check_mark: The volume is on ${options}/1000`);
  };

  if(commandName === "!filter") {
    if(!message.member.voice.channel) return message.reply(":x: Please join a voice channel !");

    const player = client.music.players.get(message.guild.id);
    if(!player || !player.current) return message.reply(":x: No Player available!");

    const filter = args[0];
    if(!filter) return message.reply(":x: No filter specified !");

    const enable_filter = args[1];
    if(!enable_filter || !["on", "off"].includes(enable_filter)) return message.reply(":x: Please include a option. (on/off)");

    const newFilter = player.filters.setFilter(filter, enable_filter === "on");
    if(!newFilter) return message.reply(':x: The specified filter is invailable!');

    return message.reply(`:white_check_mark: The filter ${filter} is ${enable_filter === "on" ? "now used" : "not used"} !`);
  }; //Filters options: ["karaoke", "timescale", "tremolo", "vibrato", "rotation", "distortion", "channelMix", "lowPass", "bassboost", "slowmode", "nightcore", "vaporwave", "8d"]

  if(commandName === "!repeat") {
    if(!message.member.voice.channel) return message.reply(":x: Please join a voice channel !");

    const player = client.music.players.get(message.guild.id);
    if(!player || !player.current) return message.reply(":x: No Player available!");

    const loopOption = args[0];
    if(!loopOption || !["track", "queue", "none"].includes(loopOption)) return message.reply(":x: No repeat option specified !"); //track = actual song/queue = all queue/none = disabled
    player.setLoop(loopOption);

    return message.reply(`:white_check_mark: The loop option is set on ${loopOption} !`);
  };

  if(commandName === "!lyrics") {
    if(!message.member.voice.channel) return message.reply(":x: Please join a voice channel !");

    const player = client.music.players.get(message.guild.id);
    if(!player || !player.current) return message.reply(":x: No Player available!");
    
    const lyrics = await player.getLyrics(message.guild.id);
    console.log(lyrics)
    if(lyrics && lyrics.text) return message.reply(lyrics.text.slice(0, 2000)); //console.log(lyrics) (is possible get the time for track in direct the lyrics)
    
    return message.reply(`:x: No lyrics found!`);
  };
});

Options available but not created to !command

/* All options player.queue = [] //All pending music will be in this list. (Useful for making a !queue command) player.current = {} //The current music (Useful for making a !current command) player.seek(NUMBER) //Edit the position of the music (NUMBER based on seconds) EX: (15) = 0:15 seconds

use console.log(player) for fetch all data and create yours commands */