diff --git a/src/Main/Player.ts b/src/Main/Player.ts index a5eb8c7..a9e2f58 100644 --- a/src/Main/Player.ts +++ b/src/Main/Player.ts @@ -7,7 +7,6 @@ import { VoiceManager } from "../Voice"; import { Playlist, Queue, QueueManager, Track } from "../Queue"; import type { CreateQueueOptions, - EmptyObject, PlayerEventMap, PlayerOptions, PlayOptions, @@ -18,10 +17,11 @@ import type { SearchResult, CreateNodeOptions, PlayerInstanceOptions, + QueueContext, } from "../Typings"; export class Player< - Context extends Record = EmptyObject, + Context extends Record = QueueContext, Plugins extends PlayerPlugin[] = PlayerPlugin[], > extends EventEmitter { #initialized = false; diff --git a/src/Plugins/LavaLyrics.ts b/src/Plugins/LavaLyrics.ts index 4cd6183..c1587bc 100644 --- a/src/Plugins/LavaLyrics.ts +++ b/src/Plugins/LavaLyrics.ts @@ -2,13 +2,13 @@ import { HttpStatusCode } from "axios"; import { OPType } from "../Typings"; import { Routes } from "../Constants"; import { isString } from "../Functions"; -import type { BaseEventPayload, EmptyObject, JsonObject, PlayerPlugin } from "../Typings"; +import type { BaseEventPayload, CommonPluginInfo, JsonObject, PlayerPlugin } from "../Typings"; import type { Node } from "../Node"; import type { Queue } from "../Queue"; import type { Player } from "../Main"; export namespace LavaLyrics { - export interface Lyrics { + export interface Lyrics { sourceName: string; provider: string; text: string | null; @@ -16,7 +16,7 @@ export namespace LavaLyrics { plugin: PluginInfo; } - export interface LyricsLine { + export interface LyricsLine { timestamp: number; duration: number | null; line: string; diff --git a/src/Queue/FilterManager.ts b/src/Queue/FilterManager.ts index 7ca30b2..1af07a7 100644 --- a/src/Queue/FilterManager.ts +++ b/src/Queue/FilterManager.ts @@ -1,9 +1,9 @@ import { LookupSymbol } from "../Constants/Symbols"; -import type { APIPlayer, EmptyObject, FilterNames, FilterValue, JsonObject, Filters } from "../Typings"; +import type { APIPlayer, FilterNames, FilterValue, JsonObject, Filters, CommonPluginFilters } from "../Typings"; import type { VoiceState } from "../Voice"; import type { Player } from "../Main"; -export class FilterManager { +export class FilterManager { #player: APIPlayer; #voice: VoiceState; diff --git a/src/Queue/Playlist.ts b/src/Queue/Playlist.ts index 97ee086..2c48b2f 100644 --- a/src/Queue/Playlist.ts +++ b/src/Queue/Playlist.ts @@ -1,11 +1,11 @@ import { formatDuration, isArray, isNumber, isRecord, isString } from "../Functions"; import { Track } from "./index"; -import type { APIPlaylist, EmptyObject, JsonObject } from "../Typings"; +import type { APIPlaylist, CommonPluginInfo, JsonObject } from "../Typings"; /** * A class representing API Playlist */ -export class Playlist { +export class Playlist { /** * Name of the playlist */ diff --git a/src/Queue/Queue.ts b/src/Queue/Queue.ts index f00fbab..5809361 100644 --- a/src/Queue/Queue.ts +++ b/src/Queue/Queue.ts @@ -6,16 +6,16 @@ import { VoiceState } from "../Voice"; import { FilterManager } from "./index"; import type { APIPlayer, - EmptyObject, Exception, JsonObject, PlayerUpdateQueryParams, PlayerUpdateRequestBody, + QueueContext, RepeatMode, } from "../Typings"; import type { Player } from "../Main"; -export class Queue = EmptyObject> { +export class Queue = QueueContext> { #player: APIPlayer; #autoplay = false; diff --git a/src/Queue/QueueManager.ts b/src/Queue/QueueManager.ts index a9fa77a..f11b4ba 100644 --- a/src/Queue/QueueManager.ts +++ b/src/Queue/QueueManager.ts @@ -15,14 +15,14 @@ import type { EventPayload, TrackEndEventPayload, CreateQueueOptions, - EmptyObject, TrackStartEventPayload, TrackExceptionEventPayload, TrackStuckEventPayload, + QueueContext, } from "../Typings"; import type { Player } from "../Main"; -export class QueueManager = EmptyObject> implements Partial< +export class QueueManager = QueueContext> implements Partial< Map> > { #cache = new Map(); diff --git a/src/Queue/Track.ts b/src/Queue/Track.ts index 4691994..98ddc8e 100644 --- a/src/Queue/Track.ts +++ b/src/Queue/Track.ts @@ -1,7 +1,7 @@ import { formatDuration, isNumber, isRecord, isString } from "../Functions"; -import type { APITrack, EmptyObject, JsonObject } from "../Typings"; +import type { APITrack, CommonPluginInfo, CommonUserData, JsonObject } from "../Typings"; -export class Track { +export class Track { /** * Id of the track */ diff --git a/src/Typings/API/Rest.ts b/src/Typings/API/Rest.ts index 884ca2b..7dd4d7d 100644 --- a/src/Typings/API/Rest.ts +++ b/src/Typings/API/Rest.ts @@ -1,4 +1,4 @@ -import type { EmptyObject, JsonObject } from "../Utility"; +import type { CommonPluginFilters, CommonPluginInfo, CommonUserData, EmptyObject, JsonObject } from "../Utility"; import type { Exception, PlayerState } from "./Websocket"; export const enum LoadType { @@ -94,7 +94,10 @@ export interface RestError { path: string; } -export interface APITrack { +export interface APITrack< + UserData extends JsonObject = CommonUserData, + PluginInfo extends JsonObject = CommonPluginInfo, +> { /** * The base64 encoded track data */ @@ -190,7 +193,7 @@ export interface TrackLoadResult { data: APITrack; } -export interface APIPlaylist { +export interface APIPlaylist { /** * The info of the playlist */ @@ -283,7 +286,7 @@ export interface APIVoiceState { sessionId: string; } -export interface Filters { +export interface Filters { /** * Adjusts the player volume from 0.0 to 5.0, where 1.0 is 100%. Values >1.0 may cause clipping */ @@ -572,7 +575,7 @@ export interface PlayerUpdateRequestBody { voice?: APIVoiceState; } -export interface PlayerUpdateTrackData { +export interface PlayerUpdateTrackData { /** * The base64 encoded track to play. `null` stops the current track. * `encoded` and `identifier` are mutually exclusive. diff --git a/src/Typings/Main/Player.ts b/src/Typings/Main/Player.ts index e0597b2..ee239ca 100644 --- a/src/Typings/Main/Player.ts +++ b/src/Typings/Main/Player.ts @@ -1,4 +1,4 @@ -import type { EmptyObject, JsonObject, RequiredProp } from "../Utility"; +import type { CommonUserData, JsonObject, QueueContext, RequiredProp } from "../Utility"; import type { Exception, PlayerState, TrackEndReason } from "../API"; import type { CreateNodeOptions, NodeEventMap } from "../Node"; import type { CreateQueueOptions } from "../Queue"; @@ -135,8 +135,8 @@ export interface SearchOptions { * Options for customizing a 'play' operation */ export interface PlayOptions< - Context extends Record = EmptyObject, - UserData extends JsonObject = EmptyObject, + Context extends Record = QueueContext, + UserData extends JsonObject = CommonUserData, > extends SearchOptions, CreateQueueOptions { userData?: UserData; diff --git a/src/Typings/Queue/FilterManager.ts b/src/Typings/Queue/FilterManager.ts index fae651b..5580781 100644 --- a/src/Typings/Queue/FilterManager.ts +++ b/src/Typings/Queue/FilterManager.ts @@ -1,15 +1,18 @@ -import type { EmptyObject, JsonObject } from "../Utility"; +import type { CommonPluginFilters, JsonObject } from "../Utility"; import type { Filters } from "../API"; /** * Yields a union type of filter names (plugins included) */ -export type FilterNames = keyof Filters | keyof PluginFilters; +export type FilterNames = keyof Filters | keyof PluginFilters; /** * Yields the value of a filter by name */ -export type FilterValue, PluginFilters extends JsonObject = EmptyObject> = - Name extends keyof PluginFilters ? Required[Name] - : Name extends keyof Filters ? Required[Name] +export type FilterValue< + Name extends FilterNames, + PluginFilters extends JsonObject = CommonPluginFilters, +> = + Name extends keyof Filters ? Required[Name] + : Name extends keyof PluginFilters ? Required[Name] : never; diff --git a/src/Typings/Queue/QueueManager.ts b/src/Typings/Queue/QueueManager.ts index dbe63f1..7eb9582 100644 --- a/src/Typings/Queue/QueueManager.ts +++ b/src/Typings/Queue/QueueManager.ts @@ -1,10 +1,10 @@ -import type { EmptyObject } from "../Utility"; +import type { QueueContext } from "../Utility"; import type { PlayerUpdateRequestBody } from "../API"; /** * Options for creating a queue via manager */ -export interface CreateQueueOptions = EmptyObject> extends Pick< +export interface CreateQueueOptions = QueueContext> extends Pick< PlayerUpdateRequestBody, "filters" | "volume" > { diff --git a/src/Typings/Utility.ts b/src/Typings/Utility.ts index 7edea3b..50451f0 100644 --- a/src/Typings/Utility.ts +++ b/src/Typings/Utility.ts @@ -29,3 +29,23 @@ export type RequiredProp = Omit & Required = { [K in keyof T]: K extends P ? NonNullable : T[K]; }; + +/** + * Queue context, extend via module declaration + */ +export interface QueueContext extends Record {} + +/** + * Basic user data, extend via module declaration + */ +export interface CommonUserData extends Record {} + +/** + * Common info provided by plugins, extend via module declaration + */ +export interface CommonPluginInfo extends Record {} + +/** + * Common plugin filters, extend via module declaration + */ +export interface CommonPluginFilters extends Record {}