Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@moscowcity/shoukaku

Package Overview
Dependencies
Maintainers
1
Versions
17
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@moscowcity/shoukaku

Forked Shoukaku module with player.info option and session dump & recovery

  • 4.1.5
  • unpublished
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
3
increased by200%
Maintainers
1
Weekly downloads
 
Created
Source

Shoukaku

This is a modified version used in our application infrastructure.

Shoukaku: https://github.com/shipgirlproject/Shoukaku


What's the difference?

We added the "player.info" interface, which wasn't included in Shoukaku, and implemented session recovery from a dump stored in Redis or a Database.


Please, make sure that only the added changes and examples of their usage will be shown, so it's recommended to familiarize yourself with the original repository before starting to read.


Track Interface:

export interface Track {
    encoded: string;
    info: TrackInfo;
};

export interface TrackInfo {
    identifier: string;
    isSeekable: boolean;
    author: string;
    duration: number;
    isStream: boolean;
    position: number;
    title: string;
    uri?: string;
    sourceName?: string;
    artworkUrl?: string;
    isTrackUnavailable?: string;
    isrc?: string;
};

Note that "isTrackUnavailable" won't be accessible, as it's used in our Lavalink fork to check if the track is regionally restricted or a preview.


So, now information will be available by calling:

shoukaku.players.get("id").track.info



Session Restore:

You should listen to the "raw" event from Shoukaku and redirect it to your functions, as regular "player.on" will stop working after a restart and will need to be reassigned manually.

shoukaku.on("raw", (name: string, json: any) => {
    // Forward to your functions like that
    this.listeners[(json.op.type || json.op) as keyof PlayerListeners]?.(name, json)
});

"this.listeners" — the "PlayerListeners" assigned through the constructor. An example class is provided below.

export class PlayerListeners {
    // constructor() {};

    // The function name should match "json.op.type" or "json.op" such as "TrackStartEvent"
    TrackStartEvent(name: string, data: TrackStartEvent) {
        // Do whatever you want
    };
};

Following the example above, we listen to the "raw" event "playerUpdate" and store the data in a Database.
import { PlayerUpdate } from "@moscowcity/shoukaku";

export class PlayerListeners {
    // constructor() {};

    playerUpdate(name: string, data: PlayerUpdate) {
        // Updating data for the received guild
        this.database.updateData("queue", { guild: data.guildId }, 
            { session: this.shoukaku.playersDump.get(data.guildId) }
        );
    };
};

Upon restart, we retrieve the data from the model and give it to Shoukaku.

// queue.session is a PlayerDump that we previously saved using this.shoukaku.playersDump.get(data.guildId).
const QueueData = (await Database.getAllData("queue")).filter((queue: any) => queue.session);

// It doesn't matter how you store the session, but you need to convert them to [String, PlayerDump], where String = guildId
const PreviousSessions = QueueData.map((queue: QueueModel) => [queue.guild, queue.session]);

this.shoukaku = new Shoukaku(new Connectors.Eris(this.app.client), 
    this.app.config.values.nodes, {
        moveOnDisconnect: true,
        resume: true
    }, PreviousSessions
);

© MoscowMusic Discord Bot

Keywords

FAQs

Package last updated on 06 Jan 2024

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc