2.0.1 • Published 4 months ago

tyzen v2.0.1

Weekly downloads
-
License
MIT
Repository
github
Last release
4 months ago

Tyzen

A stable and updated wrapper around Lavalink

Tyzen

Features

✅ Stable

✅ Documented

✅ Updated

✅ Extendable

✅ ESM & CommonJS supported

✅ Very cute (Very Important)

Supported Libraries

Refer to /src/connectors for list of supported libraries + how to support other libraries

Installation

  • Stable (3.x.x) | Needs Lavalink Versions: "3.5.x" < "3.9.x" >

npm install tyzen

  • Dev (4.0.0-dev) | Needs Lavalink Versions: "4.x.x <"

npm install https://github.com/itachi9797/tyzen.git

Lavalink v4 support is currently deployed on main branch, do npm install https://github.com/itachi9797/tyzen.git

Dev versions are not guaranteed to stay the same api wise, and even with last known stable, I won't say it's 100% stable

Small code snippet examples

Initializing the library (Using Connector Discord.JS)

const { Client } = require('discord.js');
const { Tyzen, Connectors } = require('tyzen');
const Nodes = [{
    name: 'sikku', // example
    url: 'sikku:890', // example
    auth: 'sikku202838' // example
}];
const client = new Client();
const tyzen = new Tyzen(new Connectors.DiscordJS(client), Nodes);
// ALWAYS handle error, logging it will do
tyzen.on('error', (_, error) => console.error(error));
client.login('token');
// If you want tyzen to be available on client, then bind it to it, here is one example of it
client.tyzen = tyzen;

Never initialize Tyzen like this, or else she will never initialize, start tyzen before you call client.login()

// NEVER DO THIS, OR TYZEN WILL NEVER INITIALIZE
client.on('ready', () => {
    client.tyzen = new Tyzen(new Connectors.DiscordJS(client), Nodes);
});

Join a voice channel, search for a track, play the track, then disconnect after 30 seconds

const player = await tyzen.joinVoiceChannel({
    guildId: 'your_guild_id',
    channelId: 'your_channel_id',
    shardId: 0 // if unsharded it will always be zero (depending on your library implementation)
});
// player is created, now search for a track
const result = await player.node.rest.resolve('scsearch:snowhalation');
if (!result?.tracks.length) return;
const metadata = result.tracks.shift();
// play the searched track
await player.playTrack({ track: metadata.encoded });
// disconnect after 30 seconds
setTimeout(() => tyzen.leaveVoiceChannel(player.guildId), 30000).unref();

Playing a track and changing a playback option (in this example, volume)

await player.playTrack({ track: metadata.encoded });
await player.setGlobalVolume(50);

Updating the whole player if you don\'t want to use my helper functions

await player.update({ ...playerOptions });

Setting a custom get node ideal function

const player = await tyzen.joinVoiceChannel({
    guildId: 'your_guild_id',
    channelId: 'your_channel_id',
    shardId: 0,
    getNode: (nodes, connection) => { 
        nodes = [ ...nodes.values() ];
        return nodes.find(node => node.group === connection.region);
    }
});

Updating from V3 -> V4 (notable changes)

The way of joining and leaving voice channels is now different

const { Client } = require('discord.js');
const { Tyzen, Connectors } = require('tyzen');
const Nodes = [{
    name: 'sikku', // example
    url: 'sikku:890', // example
    auth: 'sikku202838' // example
}];
const client = new Client();
const tyzen = new Tyzen(new Connectors.DiscordJS(client), Nodes);
tyzen.on('error', (_, error) => console.error(error));
client.login('token');
client.once('ready', async () => {
    // get a node with least load to resolve a track
    const node = tyzen.getIdealNode();
    const result = await node.rest.resolve('scsearch:snowhalation');
    if (!result?.tracks.length) return;
    // we now have a track metadata, we can use this to play tracks
    const metadata = result.tracks.shift();
    // you now join a voice channel by querying the main tyzen class, not on the node anymore
    const player = await tyzen.joinVoiceChannel({
        guildId: 'your_guild_id',
        channelId: 'your_channel_id',
        shardId: 0 // if unsharded it will always be zero (depending on your library implementation)
    });
    // if you want you can also use the player.node property after it connects to resolve tracks
    const result_2 = await player.node.rest.resolve('scsearch:snowhalation');
    console.log(result_2.tracks.shift());
    // now we can play the track
    await player.playTrack({ track: metadata.encoded });
    setTimeout(async () => {
        // simulate a timeout event, after specific amount of time, we leave the voice channel
        // you now destroy players / leave voice channels by calling leaveVoiceChannel in main tyzen class
        await tyzen.leaveVoiceChannel(player.guildId);
    }, 30000);
})

Usual player methods now return promises

await player.playTrack(...data);
await player.stopTrack();

There are 2 kinds of volumes you can set, global and filter

// global volume accepts 0-1000 as it's values
await player.setGlobalVolume(100);
// to check the current global volume
console.log(player.volume);
// filter volume accepts 0.0-5.0 as it's values
await player.setFilterVolume(1.0);
// to check the current filter volume (filters.volume can be undefined)
console.log(player.filters.volume)

There are other internal changes like

// new variable in tyzen class, which handles the "connection data" of discord only
console.log(tyzen.connections);
// getNode() is removed in favor of joinVoiceChannel custom get node function, example:
const player = await tyzen.joinVoiceChannel({
    guildId: 'your_guild_id',
    channelId: 'your_channel_id',
    shardId: 0,
    getNode: (nodes, connection) => {
        nodes = [ ...nodes.values() ];
        return nodes.find(node => node.group === connection.region);
    }
});
// you can still get the least loaded node to resolve tracks via getIdealNode();
console.log(tyzen.getIdealNode());
// and other changes I'm not able to document(?);

Support Server HERE

2.0.1

4 months ago

1.0.4

6 months ago

1.0.3

7 months ago

1.0.2

7 months ago

1.0.1

7 months ago

1.0.0

7 months ago

1.0.0-dev

7 months ago