Manager Class
The Manager
class is the main entry point for Moonlink.js. It manages connections to Lavalink nodes, creates and manages players, and handles events. The Manager class extends EventEmitter to provide a robust event system.See also:
- Player - For player management
- NodeManager - For node management
- PlayerManager - For player collection management
The Manager must be initialized after your Discord client is ready using the init
method.
Configuration
Configuration Options
When creating a manager, you can specify several options:
interface IConfigManager {
nodes: INode[];
sendPayload: (guildId: string, payload: any) => void;
options?: IOptionsManager;
}
interface INode {
host: string;
port: number;
password: string;
secure?: boolean;
identifier?: string;
retryAmount?: number;
retryDelay?: number;
regions?: string[];
sessionId?: string;
pathVersion?: string;
}
interface IOptionsManager {
clientName?: string;
clientId?: string;
defaultPlatformSearch?: string;
sortTypeNode?: TSortTypeNode;
plugins?: Plugin[];
noReplace?: boolean;
NodeLinkFeatures?: boolean;
logFile?: { path: string; log: boolean };
movePlayersOnReconnect?: boolean;
sortPlayersByRegion?: boolean;
autoResume?: boolean;
resume?: boolean;
partialTrack?: TPartialTrackProperties[];
disableDatabase?: boolean;
disableNativeSources?: boolean;
blacklisteSources?: string[];
spotify?: {
limitLoadPlaylist?: number;
limitLoadAlbum?: number;
limitLoadArtist?: number;
limitLoadSearch?: number;
limitLoadRecommendations?: number;
};
deezer?: {
maxSearchResults?: number;
maxAlbumTracks?: number;
maxPlaylistTracks?: number;
maxArtistTracks?: number;
};
}
Properties
Available Properties
Property | Type | Description | Default |
---|---|---|---|
initialize | boolean | Whether the manager has been initialized | false |
options | IOptionsManager | Manager configuration options | Created |
sendPayload | Function | Function for sending voice state updates | Required |
nodes | NodeManager | Node manager instance | Created |
players | PlayerManager | Player manager instance | Created |
version | string | Current version of Moonlink.js | Package version |
database | Database | Database instance | Created |
sources | SourceManager | Source manager instance | Created |
pluginManager | PluginManager | Plugin manager instance | Created |
lyricsResultCache | `Map<string, ILavaLyricsObject | null>` | Cache for lyrics search results |
Methods
init
Initialize Manager
Initializes the manager and connects to all configured nodes. This method sets up the database, initializes nodes, and prepares the manager for handling voice connections.
Parameters
Returns & Example
Returns
• void
client.once('ready', () => {
manager.init(client.user.id);
});
search
Search Tracks
Searches for tracks using the configured nodes or native sources (like Spotify). The search will be performed on the best available node or a specific node if provided. Supports fallback sources.
Parameters
Returns & Example
Returns
• Promise<SearchResult>
— Search results containing tracks and playlist info
const results = await manager.search({
query: 'Never Gonna Give You Up',
source: 'youtube',
fallbackSources: ['soundcloud', 'deezer']
});
lavaSearch
LavaSearch Tracks
Performs a search using the LavaSearch plugin, supporting multiple result types (tracks, albums, artists, playlists, text). Requires a NodeLink server with LavaSearch plugin.
Parameters
Returns & Example
Returns
• Promise<SearchResult>
— Search results containing various types of data.
const results = await manager.lavaSearch({
query: 'Never Gonna Give You Up',
source: 'youtube',
types: 'track,artist'
});
if (results.tracks.length > 0) {
console.log('Found tracks:', results.tracks.map(t => t.title));
}
if (results.artists && results.artists.length > 0) {
console.log('Found artists:', results.artists.map(a => a.info.name));
}
getLyrics
Get Lyrics
Fetches lyrics for a track using available lyrics plugins. Supports fetching by player's current track, encoded track, or video ID. Prioritizes timed lyrics.
Parameters
Returns & Example
Returns
• Promise<ILavaLyricsObject | null>
— Lyrics data or null
if not found.
// Get lyrics for current playing track
const lyrics = await manager.getLyrics({ player: myPlayer });
if (lyrics) {
console.log(`Lyrics for ${lyrics.track.title}:
${lyrics.text}`);
}
// Get lyrics by video ID
const youtubeLyrics = await manager.getLyrics({ videoId: 'dQw4w9WgXcQ' });
searchLyrics
Search Lyrics
Searches for lyrics based on a query using available lyrics plugins.
Parameters
Returns & Example
Returns
• Promise<any[] | null>
— An array of search results or null
if no results found.
const searchResults = await manager.searchLyrics({ query: 'Never Gonna Give You Up Rick Astley' });
if (searchResults && searchResults.length > 0) {
console.log('Found lyrics search results:', searchResults);
}
subscribeLyrics
Subscribe to Live Lyrics
Subscribes to live lyrics updates for a specific guild. The provided callback will be invoked with each new lyrics line.
Parameters
Returns & Example
Returns
• Promise<void>
manager.subscribeLyrics('123456789', (line) => {
console.log(`Live Lyric: ${line.line} (at ${line.timestamp}ms)`);
});
unsubscribeLyrics
Unsubscribe from Live Lyrics
Unsubscribes from live lyrics updates for a specific guild.
Parameters
Returns & Example
Returns
• Promise<void>
manager.unsubscribeLyrics('123456789');
console.log('Unsubscribed from live lyrics.');
createPlayer
Create Player
This method is deprecated. Use manager.players.create()
instead.
Parameters
Returns & Example
Returns
• Player
— The created player instance
const player = manager.createPlayer({
guildId: '123456789',
voiceChannelId: '123456789',
textChannelId: '123456789'
});
getPlayer
Get Player
This method is deprecated. Use manager.players.get()
instead.
Parameters
Returns & Example
Returns
• Player
— The player instance if it exists
const player = manager.getPlayer('123456789');
hasPlayer
Has Player
This method is deprecated. Use manager.players.has()
instead.
Parameters
Returns & Example
Returns
• boolean
— Whether the player exists
const exists = manager.hasPlayer('123456789');
deletePlayer
Delete Player
This method is deprecated. Use manager.players.delete()
instead.
Parameters
Returns & Example
Returns
• boolean
— Whether the deletion was successful
manager.deletePlayer('123456789');
getAllPlayers
Get All Players
This method is deprecated. Use manager.players.all
instead.
Returns & Example
Returns
• Map<string, Player>
— Map of all players
const players = manager.getAllPlayers();
Events
Node Events
Event | Description | Parameters |
---|---|---|
nodeCreate | Emitted when a node is created | node: Node |
nodeReady | Emitted when a node is ready | node: Node, stats: NodeStats |
nodeConnected | Emitted when a node connects | node: Node |
nodeError | Emitted when a node errors | node: Node, error: Error |
nodeReconnect | Emitted when a node reconnects | node: Node |
nodeDisconnect | Emitted when a node disconnects | node: Node, code: number, reason: string |
nodeDestroy | Emitted when a node is destroyed | identifier: string |
nodeAutoResumed | Emitted when players are auto-resumed | node: Node, players: Player[] |
nodeStateChange | Emitted when a node's state changes | node: Node, oldState: NodeState, newState: NodeState |
Player Events
Event | Description | Parameters |
---|---|---|
playerCreate | Emitted when a player is created | player: Player |
playerUpdate | Emitted when player state updates | player: Player, track: Track, payload: any |
playerDestroy | Emitted when a player is destroyed | player: Player |
playerSwitchedNode | Emitted when a player switches nodes | player: Player, oldNode: Node, newNode: Node |
playerConnecting | Emitted when a player attempts to connect to a voice channel | player: Player |
playerReady | Emitted when a player is ready to play | player: Player |
playerResuming | Emitted when a player is attempting to resume playback | player: Player |
playerResumed | Emitted when a player successfully resumes playback | player: Player |
playerConnected | Emitted when a player connects to a voice channel | player: Player |
playerDisconnected | Emitted when a player disconnects from a voice channel | player: Player |
playerReconnect | Emitted when a player attempts to reconnect | player: Player, reason?: string |
playerMoved | Emitted when a player moves channels | player: Player, oldChannel: string, newChannel: string |
playerDestroyed | Emitted when a player is destroyed | player: Player, reason?: string |
playerTriggeredBack | Emitted when a player goes back to the previous track | player: Player, track: Track |
playerChapterSkipped | Emitted when a player skips to a new chapter | player: Player, chapter: IChapter |
Track Events
Event | Description | Parameters |
---|---|---|
trackStart | Emitted when a track starts | player: Player, track: Track |
trackEnd | Emitted when a track ends | player: Player, track: Track, type: TTrackEndType, payload?: any |
trackStuck | Emitted when a track gets stuck | player: Player, track: Track, threshold: number |
trackException | Emitted when a track errors | player: Player, track: Track, exception: any |
queueEnd | Emitted when the queue ends | player: Player |
trackBlacklisted | Emitted when a track from a blacklisted source is encountered | player: Player, track: Track |
Player State Events
Event | Description | Parameters |
---|---|---|
playerTriggeredPlay | Emitted on play | player: Player, track: Track |
playerTriggeredPause | Emitted on pause | player: Player |
playerTriggeredResume | Emitted on resume | player: Player |
playerTriggeredStop | Emitted on stop | player: Player |
playerTriggeredSkip | Emitted on skip | player: Player, oldTrack: Track, newTrack: Track |
playerTriggeredSeek | Emitted on seek | player: Player, position: number |
playerTriggeredShuffle | Emitted on shuffle | player: Player, oldQueue: Track[], newQueue: Track[] |
playerSpeak | Emitted when the player speaks using TTS | player: Player, text: string, options?: ISpeakOptions |
Settings Events
Event | Description | Parameters |
---|---|---|
playerChangedVolume | Emitted when volume changes | player: Player, oldVolume: number, newVolume: number |
playerChangedLoop | Emitted when loop mode changes | player: Player, oldLoop: TPlayerLoop, newLoop: TPlayerLoop, oldLoopCount?: number, newLoopCount?: number |
playerAutoPlaySet | Emitted when autoplay changes | player: Player, autoPlay: boolean |
playerAutoLeaveSet | Emitted when auto-leave changes | player: Player, autoLeave: boolean |
Queue Events
Event | Description | Parameters |
---|---|---|
queueAdd | Emitted when tracks are added to the queue | `player: Player, tracks: Track |
queueRemove | Emitted when tracks are removed from the queue | `player: Player, tracks: Track |
queueMoveRange | Emitted when a range of tracks is moved within the queue | player: Player, tracks: Track[], fromIndex: number, toIndex: number |
queueRemoveRange | Emitted when a range of tracks is removed from the queue | player: Player, tracks: Track[], startIndex: number, endIndex: number |
queueDuplicate | Emitted when tracks are duplicated in the queue | player: Player, tracks: Track[], index: number |
Filter Events
Event | Description | Parameters |
---|---|---|
filtersUpdate | Emitted when audio filters are updated | player: Player, filters: Filters |
Source Events
Event | Description | Parameters |
---|---|---|
sourceAdd | Emitted when a source is added | source: ISource |
sourceRemove | Emitted when a source is removed | source: string |
sourceClear | Emitted when all sources are cleared | void |
SponsorBlock Events
Event | Description | Parameters |
---|---|---|
segmentsLoaded | Emitted when SponsorBlock segments are loaded for a track | player: Player, segments: ISegment[] |
segmentSkipped | Emitted when a SponsorBlock segment is skipped | player: Player, segment: ISegment |
Chapter Events
Event | Description | Parameters |
---|---|---|
chaptersLoaded | Emitted when chapters are loaded for a track | player: Player, chapters: IChapter[] |
chapterStarted | Emitted when a new chapter starts playing | player: Player, chapter: IChapter |
WebSocket Events
Event | Description | Parameters |
---|---|---|
socketClosed | Emitted when the WebSocket connection is closed | player: Player, code: number, reason: string, byRemote: boolean |
Now playing: ${track.title}
);
});manager.on('nodeError', (node, error) => {
console.error(Node ${node.identifier} had an error:
, error);
}); ::