Skip to content

Repository files navigation

Fastlink

CII Best PracticesDiscord ServerFastLink package size

About

FastLink is a low-level Node.js Lavalink client, with a simple and easy-to-use API. It is made to be fast and lightweight.

Installation

FastLink is both available on npm and GitHub Packages. Here's how to install it from npm:

$ npm i @performanc/fastlink

Usage

Minimum requirements

  • Node.js 14 or higher
  • Lavalink v4

Recommended requirements

  • Node.js 18 or higher
  • NodeLink

Example

importFastLinkfrom'@performanc/fastlink'importDiscordfrom'discord.js'constclient=newDiscord.Client({partials: [Discord.Partials.Channel],intents: [Discord.IntentsBitField.Flags.Guilds,Discord.IntentsBitField.Flags.MessageContent,Discord.IntentsBitField.Flags.GuildMessages,Discord.IntentsBitField.Flags.GuildVoiceStates]})constprefix='!'constbotId='Your bot Id here'consttoken='Your bot token here'constevents=FastLink.node.connectNodes([{hostname: '127.0.0.1',secure: false,password: 'youshallnotpass',port: 2333}],{
botId,shards: 1,queue: true})events.on('debug',console.log)client.on('messageCreate',async(message)=>{if(message.author.bot)return;constcommandName=message.content.split(' ')[0].toLowerCase().substring(prefix.length)constargs=message.content.split(' ').slice(1).join(' ')if(commandName==='decodetrack'){constplayer=newFastLink.player.Player(message.guild.id)if(player.playerCreated()===false){message.channel.send('No player found.')return;}consttrack=awaitplayer.decodeTrack(args)message.channel.send(JSON.stringify(track,null,2))return;}if(commandName==='record'){constplayer=newFastLink.player.Player(message.guild.id)if(player.playerCreated()===false){message.channel.send('No player found.')return;}constvoiceEvents=player.listen()voiceEvents.on('endSpeaking',(voice)=>{constbase64Voice=voice.dataconstbuffer=Buffer.from(base64Voice,'base64')constpreviousVoice=fs.readFileSync(`./voice-${message.author.id}.ogg`)||nullfs.writeFileSync(`./voice-${message.author.id}.ogg`,previousVoice ? Buffer.concat([previousVoice,buffer]) : buffer)})message.channel.send('Started recording. Be aware: This will record everything you say in the voice channel, even if the bot is deaf. Server deaf the bot if you don\'t want to be recorded by any chances.')}if(commandName==='stoprecord'){constplayer=newFastLink.player.Player(message.guild.id)if(player.playerCreated()===false){message.channel.send('No player found.')return;}player.stopListen()message.channel.send('Stopped recording.')}if(commandName==='play'){if(!message.member.voice.channel){message.channel.send('You must be in a voice channel.')return;}if(!FastLink.node.anyNodeAvailable()){message.channel.send('There aren\'t nodes connected.')return;}constplayer=newFastLink.player.Player(message.guild.id)if(player.playerCreated()===false)player.createPlayer()player.connect(message.member.voice.channel.id.toString(),{mute: false,deaf: true},(guildId,payload)=>{client.guilds.cache.get(guildId).shard.send(payload)})consttrack=awaitplayer.loadTrack((args.startsWith('https://') ? '' : 'ytsearch:')+args)if(track.loadType==='error'){message.channel.send('Something went wrong. '+track.data.message)return;}if(track.loadType==='empty'){message.channel.send('No matches found.')return;}if(['playlist','album','station','show','podcast','artist'].includes(track.loadType)){player.update({tracks: {encodeds: track.data.tracks.map((track)=>track.encoded)}})message.channel.send(`Added ${track.data.tracks.length} songs to the queue, and playing ${track.data.tracks[0].info.title}.`)return;}if(['track','short'].includes(track.loadType)){player.update({track: {encoded: track.data.encoded}})message.channel.send(`Playing ${track.data.info.title} from ${track.data.info.sourceName} from url search.`)return;}if(track.loadType==='search'){player.update({track: {encoded: track.data[0].encoded}})message.channel.send(`Playing ${track.data[0].info.title} from ${track.data[0].info.sourceName} from search.`)return;}}if(commandName==='volume'){constplayer=newFastLink.player.Player(message.guild.id)if(player.playerCreated()===false){message.channel.send('No player found.')return;}player.update({volume: parseInt(args)})message.channel.send(`Volume set to ${parseInt(args)}`)return;}if(commandName==='pause'){constplayer=newFastLink.player.Player(message.guild.id)if(player.playerCreated()===false){message.channel.send('No player found.')return;}player.update({paused: true})message.channel.send('Paused.')return;}if(commandName==='resume'){constplayer=newFastLink.player.Player(message.guild.id)if(player.playerCreated()===false){message.channel.send('No player found.')return;}player.update({paused: false})message.channel.send('Resumed.')return;}if(commandName==='skip'){constplayer=newFastLink.player.Player(message.guild.id)if(player.playerCreated()===false){message.channel.send('No player found.')return;}constskip=player.skipTrack()if(skip)message.channel.send('Skipped the current track.')elsemessage.channel.send('Could not skip the current track.')return;}if(commandName==='stop'){constplayer=newFastLink.player.Player(message.guild.id)if(player.playerCreated()===false){message.channel.send('No player found.')return;}player.update({track: {encoded: null}})message.channel.send('Stopped the player.')return;}})client.on('raw',(data)=>FastLink.other.handleRaw(data))client.login(token)

Documentation

We have a documentation for FastLink. If you have any issue with it, please report it on GitHub Issues.

Support & Feedback

If you have any questions, or only want to give a feedback, about FastLink or any other PerformanC project, join our Discord server.

License

FastLink is licensed under BSD 3-Clause License. You can read more about it on Open Source Initiative.

Releases

Packages

Used by

Contributors

Languages