yukimu 2.0.8 → 2.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/BitrateOptimizer.d.ts +52 -0
- package/dist/BitrateOptimizer.d.ts.map +1 -0
- package/dist/BitrateOptimizer.js +115 -0
- package/dist/BitrateOptimizer.js.map +1 -0
- package/dist/ConnectionPool.d.ts +84 -0
- package/dist/ConnectionPool.d.ts.map +1 -0
- package/dist/ConnectionPool.js +203 -0
- package/dist/ConnectionPool.js.map +1 -0
- package/dist/Constants.d.ts +45 -0
- package/dist/Constants.d.ts.map +1 -0
- package/dist/Constants.js +168 -0
- package/dist/Constants.js.map +1 -0
- package/dist/Logger.d.ts +22 -0
- package/dist/Logger.d.ts.map +1 -0
- package/dist/Logger.js +74 -0
- package/dist/Logger.js.map +1 -0
- package/dist/Node.d.ts +61 -0
- package/dist/Node.d.ts.map +1 -0
- package/dist/Node.js +446 -0
- package/dist/Node.js.map +1 -0
- package/dist/Player.d.ts +135 -0
- package/dist/Player.d.ts.map +1 -0
- package/dist/Player.js +530 -0
- package/dist/Player.js.map +1 -0
- package/dist/Plugin.d.ts +25 -0
- package/dist/Plugin.d.ts.map +1 -0
- package/dist/Plugin.js +15 -0
- package/dist/Plugin.js.map +1 -0
- package/dist/Queue.d.ts +89 -0
- package/dist/Queue.d.ts.map +1 -0
- package/dist/Queue.js +188 -0
- package/dist/Queue.js.map +1 -0
- package/dist/Resolver.d.ts +68 -0
- package/dist/Resolver.d.ts.map +1 -0
- package/dist/Resolver.js +361 -0
- package/dist/Resolver.js.map +1 -0
- package/dist/Rest.d.ts +46 -0
- package/dist/Rest.d.ts.map +1 -0
- package/dist/Rest.js +246 -0
- package/dist/Rest.js.map +1 -0
- package/dist/TrackCache.d.ts +41 -0
- package/dist/TrackCache.d.ts.map +1 -0
- package/dist/TrackCache.js +144 -0
- package/dist/TrackCache.js.map +1 -0
- package/dist/WsQueue.d.ts +41 -0
- package/dist/WsQueue.d.ts.map +1 -0
- package/dist/WsQueue.js +116 -0
- package/dist/WsQueue.js.map +1 -0
- package/dist/Yukimu.d.ts +84 -0
- package/dist/Yukimu.d.ts.map +1 -0
- package/dist/Yukimu.js +290 -0
- package/dist/Yukimu.js.map +1 -0
- package/dist/connector/Connector.d.ts +34 -0
- package/dist/connector/Connector.d.ts.map +1 -0
- package/dist/connector/Connector.js +39 -0
- package/dist/connector/Connector.js.map +1 -0
- package/dist/connector/DiscordJS.d.ts +27 -0
- package/dist/connector/DiscordJS.d.ts.map +1 -0
- package/dist/connector/DiscordJS.js +69 -0
- package/dist/connector/DiscordJS.js.map +1 -0
- package/dist/connector/Eris.d.ts +19 -0
- package/dist/connector/Eris.d.ts.map +1 -0
- package/dist/connector/Eris.js +62 -0
- package/dist/connector/Eris.js.map +1 -0
- package/dist/connector/Oceanic.d.ts +19 -0
- package/dist/connector/Oceanic.d.ts.map +1 -0
- package/dist/connector/Oceanic.js +60 -0
- package/dist/connector/Oceanic.js.map +1 -0
- package/dist/errors/YukimuError.d.ts +51 -0
- package/dist/errors/YukimuError.d.ts.map +1 -0
- package/dist/errors/YukimuError.js +105 -0
- package/dist/errors/YukimuError.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/AutoResume.d.ts +25 -0
- package/dist/plugins/AutoResume.d.ts.map +1 -0
- package/dist/plugins/AutoResume.js +132 -0
- package/dist/plugins/AutoResume.js.map +1 -0
- package/dist/plugins/AutoplayPlugin.d.ts +35 -0
- package/dist/plugins/AutoplayPlugin.d.ts.map +1 -0
- package/dist/plugins/AutoplayPlugin.js +111 -0
- package/dist/plugins/AutoplayPlugin.js.map +1 -0
- package/dist/plugins/InactivityPlugin.d.ts +30 -0
- package/dist/plugins/InactivityPlugin.d.ts.map +1 -0
- package/dist/plugins/InactivityPlugin.js +86 -0
- package/dist/plugins/InactivityPlugin.js.map +1 -0
- package/dist/plugins/PlayerMoved.d.ts +29 -0
- package/dist/plugins/PlayerMoved.d.ts.map +1 -0
- package/dist/plugins/PlayerMoved.js +75 -0
- package/dist/plugins/PlayerMoved.js.map +1 -0
- package/dist/types.d.ts +309 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/package.json +1 -1
package/dist/Player.js
ADDED
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Yukimu v2.0.0 — Player with State Safety & Bitrate Optimization */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.Player = void 0;
|
|
5
|
+
const Queue_1 = require("./Queue");
|
|
6
|
+
const BitrateOptimizer_1 = require("./BitrateOptimizer");
|
|
7
|
+
const Constants_1 = require("./Constants");
|
|
8
|
+
const YukimuError_1 = require("./errors/YukimuError");
|
|
9
|
+
/**
|
|
10
|
+
* Represents an audio player for a specific Discord guild.
|
|
11
|
+
*
|
|
12
|
+
* Critical fixes from v1:
|
|
13
|
+
* 1. play() — only sets playing=true AFTER the REST call succeeds
|
|
14
|
+
* 2. pause() — paused tracks are still "playing" from Lavalink's perspective
|
|
15
|
+
* 3. moveToNode() — properly re-sends voice state to the new node
|
|
16
|
+
* 4. sendVoicePayload() — deferred until connector is ready (safe for startup)
|
|
17
|
+
* 5. Proper cleanup in destroy() — all state, timers, and references
|
|
18
|
+
* 6. Input validation on filter values
|
|
19
|
+
* 7. Boost-tier-aware audio optimization
|
|
20
|
+
*/
|
|
21
|
+
class Player {
|
|
22
|
+
manager;
|
|
23
|
+
node;
|
|
24
|
+
queue;
|
|
25
|
+
guildId;
|
|
26
|
+
voiceChannelId;
|
|
27
|
+
textChannelId;
|
|
28
|
+
state = Constants_1.PlayerState.DISCONNECTED;
|
|
29
|
+
playing = false;
|
|
30
|
+
paused = false;
|
|
31
|
+
position = 0;
|
|
32
|
+
ping = -1;
|
|
33
|
+
lastUpdated = Date.now();
|
|
34
|
+
volume;
|
|
35
|
+
loop = "none";
|
|
36
|
+
autoplay = false;
|
|
37
|
+
sessionId = null;
|
|
38
|
+
voiceToken = null;
|
|
39
|
+
voiceEndpoint = null;
|
|
40
|
+
selfDeaf;
|
|
41
|
+
selfMute;
|
|
42
|
+
filters = {};
|
|
43
|
+
data = new Map();
|
|
44
|
+
constructor(manager, node, options) {
|
|
45
|
+
this.manager = manager;
|
|
46
|
+
this.node = node;
|
|
47
|
+
this.queue = new Queue_1.Queue();
|
|
48
|
+
this.guildId = options.guildId;
|
|
49
|
+
this.voiceChannelId = options.voiceChannelId;
|
|
50
|
+
this.textChannelId = options.textChannelId;
|
|
51
|
+
this.volume = options.volume ?? 100;
|
|
52
|
+
this.selfDeaf = options.selfDeaf ?? true;
|
|
53
|
+
this.selfMute = options.selfMute ?? false;
|
|
54
|
+
// Send the voice state update to Discord (join the channel)
|
|
55
|
+
// This is safe — connector.sendPayload handles missing guilds gracefully
|
|
56
|
+
this.sendVoicePayload(options.voiceChannelId, this.selfDeaf, this.selfMute);
|
|
57
|
+
this.state = Constants_1.PlayerState.CONNECTING;
|
|
58
|
+
}
|
|
59
|
+
// ─── Getters ────────────────────────────────────────────────────────────
|
|
60
|
+
get connected() {
|
|
61
|
+
return this.state === Constants_1.PlayerState.CONNECTED;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Estimated real-time position accounting for time since last update.
|
|
65
|
+
* Returns the actual position (capped at track length).
|
|
66
|
+
*/
|
|
67
|
+
get realPosition() {
|
|
68
|
+
if (!this.playing || this.paused)
|
|
69
|
+
return this.position;
|
|
70
|
+
const trackLength = this.queue.current?.info?.length ?? Infinity;
|
|
71
|
+
return Math.min(this.position + (Date.now() - this.lastUpdated), trackLength);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get the current boost tier of the guild this player is in.
|
|
75
|
+
*/
|
|
76
|
+
get boostTier() {
|
|
77
|
+
return this.manager.connector.getGuildBoostTier(this.guildId);
|
|
78
|
+
}
|
|
79
|
+
// ─── Voice ──────────────────────────────────────────────────────────────
|
|
80
|
+
sendVoicePayload(channelId, selfDeaf, selfMute) {
|
|
81
|
+
this.manager.connector.sendPayload(this.guildId, {
|
|
82
|
+
op: 4,
|
|
83
|
+
d: {
|
|
84
|
+
guild_id: this.guildId,
|
|
85
|
+
channel_id: channelId,
|
|
86
|
+
self_deaf: selfDeaf,
|
|
87
|
+
self_mute: selfMute,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check if we have all voice connection data and send it to Lavalink.
|
|
93
|
+
*/
|
|
94
|
+
checkVoiceReady() {
|
|
95
|
+
if (!this.sessionId || !this.voiceToken || !this.voiceEndpoint)
|
|
96
|
+
return;
|
|
97
|
+
const voiceState = {
|
|
98
|
+
token: this.voiceToken,
|
|
99
|
+
endpoint: this.voiceEndpoint,
|
|
100
|
+
sessionId: this.sessionId,
|
|
101
|
+
channelId: this.voiceChannelId,
|
|
102
|
+
};
|
|
103
|
+
if (this.node.version === 4) {
|
|
104
|
+
this.node.rest.updatePlayer(this.guildId, { voice: voiceState }).catch((err) => {
|
|
105
|
+
this.manager.logger.error(`Failed to send voice update for guild ${this.guildId}: ${err}`);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
this.node.send({
|
|
110
|
+
op: "voiceUpdate",
|
|
111
|
+
guildId: this.guildId,
|
|
112
|
+
sessionId: this.sessionId,
|
|
113
|
+
event: {
|
|
114
|
+
token: this.voiceToken,
|
|
115
|
+
guild_id: this.guildId,
|
|
116
|
+
endpoint: this.voiceEndpoint,
|
|
117
|
+
},
|
|
118
|
+
}).catch((err) => {
|
|
119
|
+
this.manager.logger.error(`Failed to send voice update for guild ${this.guildId}: ${err}`);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
this.state = Constants_1.PlayerState.CONNECTED;
|
|
123
|
+
}
|
|
124
|
+
// ─── Playback ───────────────────────────────────────────────────────────
|
|
125
|
+
/**
|
|
126
|
+
* Play a track. If no track is provided, plays the current queue track.
|
|
127
|
+
*
|
|
128
|
+
* FIX: Only sets `playing = true` after the REST call succeeds.
|
|
129
|
+
* In v1, state was set before the REST call, causing ghost playing state on failure.
|
|
130
|
+
*/
|
|
131
|
+
async play(track, options) {
|
|
132
|
+
const toPlay = track ?? this.queue.current;
|
|
133
|
+
if (!toPlay) {
|
|
134
|
+
throw new YukimuError_1.PlayerError("No track to play", YukimuError_1.ErrorCode.PLAYER_NO_TRACK);
|
|
135
|
+
}
|
|
136
|
+
this.queue.current = toPlay;
|
|
137
|
+
if (this.node.version === 4) {
|
|
138
|
+
await this.node.rest.updatePlayer(this.guildId, {
|
|
139
|
+
track: { encoded: toPlay.encoded },
|
|
140
|
+
volume: this.volume,
|
|
141
|
+
...(options?.startTime !== undefined && { position: options.startTime }),
|
|
142
|
+
...(options?.endTime !== undefined && { endTime: options.endTime }),
|
|
143
|
+
}, options?.noReplace ?? false);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
await this.node.send({
|
|
147
|
+
op: "play",
|
|
148
|
+
guildId: this.guildId,
|
|
149
|
+
track: toPlay.encoded,
|
|
150
|
+
volume: String(this.volume),
|
|
151
|
+
...(options?.startTime !== undefined && { startTime: String(options.startTime) }),
|
|
152
|
+
...(options?.endTime !== undefined && { endTime: String(options.endTime) }),
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
// Only update state AFTER the call succeeds
|
|
156
|
+
this.playing = true;
|
|
157
|
+
this.paused = false;
|
|
158
|
+
this.lastUpdated = Date.now();
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Pause or unpause playback.
|
|
162
|
+
*
|
|
163
|
+
* FIX: `playing` now reflects "has an active track" independently of pause state.
|
|
164
|
+
* A paused player is still "playing" (it has an active track, just paused).
|
|
165
|
+
*/
|
|
166
|
+
async pause(state = true) {
|
|
167
|
+
if (this.node.version === 4) {
|
|
168
|
+
await this.node.rest.updatePlayer(this.guildId, { paused: state });
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
await this.node.send({ op: "pause", guildId: this.guildId, pause: state });
|
|
172
|
+
}
|
|
173
|
+
this.paused = state;
|
|
174
|
+
// `playing` stays true — the track is still loaded, just paused
|
|
175
|
+
}
|
|
176
|
+
async resume() {
|
|
177
|
+
return this.pause(false);
|
|
178
|
+
}
|
|
179
|
+
async stop() {
|
|
180
|
+
if (this.node.version === 4) {
|
|
181
|
+
await this.node.rest.updatePlayer(this.guildId, { track: { encoded: null } });
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
await this.node.send({ op: "stop", guildId: this.guildId });
|
|
185
|
+
}
|
|
186
|
+
this.playing = false;
|
|
187
|
+
this.paused = false;
|
|
188
|
+
this.position = 0;
|
|
189
|
+
this.queue.current = null;
|
|
190
|
+
}
|
|
191
|
+
async skip() {
|
|
192
|
+
const next = this.queue.next();
|
|
193
|
+
if (next) {
|
|
194
|
+
await this.play(next);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
await this.stop();
|
|
198
|
+
this.manager.emit("queueEnd", this);
|
|
199
|
+
}
|
|
200
|
+
return next;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Play the previous track (from history).
|
|
204
|
+
* @returns The previous track, or null if no history exists
|
|
205
|
+
*/
|
|
206
|
+
async previous() {
|
|
207
|
+
const prev = this.queue.previous[0];
|
|
208
|
+
if (!prev)
|
|
209
|
+
return null;
|
|
210
|
+
// Move current back to front of queue
|
|
211
|
+
if (this.queue.current) {
|
|
212
|
+
this.queue.add(this.queue.current, 0);
|
|
213
|
+
}
|
|
214
|
+
// Remove from previous history
|
|
215
|
+
this.queue.previous.shift();
|
|
216
|
+
await this.play(prev);
|
|
217
|
+
return prev;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Restart the currently playing track from the beginning.
|
|
221
|
+
*/
|
|
222
|
+
async replay() {
|
|
223
|
+
if (!this.queue.current) {
|
|
224
|
+
throw new YukimuError_1.PlayerError("No track to replay", YukimuError_1.ErrorCode.PLAYER_NO_TRACK);
|
|
225
|
+
}
|
|
226
|
+
await this.play(this.queue.current, { startTime: 0 });
|
|
227
|
+
}
|
|
228
|
+
async seek(position) {
|
|
229
|
+
if (!this.queue.current?.info?.isSeekable) {
|
|
230
|
+
throw new YukimuError_1.PlayerError("Current track is not seekable", YukimuError_1.ErrorCode.PLAYER_NOT_SEEKABLE);
|
|
231
|
+
}
|
|
232
|
+
if (position < 0)
|
|
233
|
+
position = 0;
|
|
234
|
+
if (this.node.version === 4) {
|
|
235
|
+
await this.node.rest.updatePlayer(this.guildId, { position });
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
await this.node.send({ op: "seek", guildId: this.guildId, position });
|
|
239
|
+
}
|
|
240
|
+
this.position = position;
|
|
241
|
+
this.lastUpdated = Date.now();
|
|
242
|
+
}
|
|
243
|
+
// ─── Volume ─────────────────────────────────────────────────────────────
|
|
244
|
+
async setVolume(volume) {
|
|
245
|
+
if (typeof volume !== "number" || isNaN(volume)) {
|
|
246
|
+
throw new YukimuError_1.PlayerError("Volume must be a number", YukimuError_1.ErrorCode.PLAYER_INVALID_VOLUME);
|
|
247
|
+
}
|
|
248
|
+
volume = Math.floor(Math.max(0, Math.min(1000, volume)));
|
|
249
|
+
if (this.node.version === 4) {
|
|
250
|
+
await this.node.rest.updatePlayer(this.guildId, { volume });
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
await this.node.send({ op: "volume", guildId: this.guildId, volume });
|
|
254
|
+
}
|
|
255
|
+
this.volume = volume;
|
|
256
|
+
}
|
|
257
|
+
// ─── Filters ────────────────────────────────────────────────────────────
|
|
258
|
+
async setFilters(filters) {
|
|
259
|
+
this.filters = { ...this.filters, ...filters };
|
|
260
|
+
if (this.node.version === 4) {
|
|
261
|
+
await this.node.rest.updatePlayer(this.guildId, { filters: this.filters });
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
// v3: equalizer is sent separately
|
|
265
|
+
if (filters.equalizer) {
|
|
266
|
+
await this.node.send({ op: "equalizer", guildId: this.guildId, bands: filters.equalizer });
|
|
267
|
+
}
|
|
268
|
+
const rest = { ...filters };
|
|
269
|
+
delete rest.equalizer;
|
|
270
|
+
if (Object.keys(rest).length > 0) {
|
|
271
|
+
await this.node.send({ op: "filters", guildId: this.guildId, ...rest });
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
async clearFilters() {
|
|
276
|
+
this.filters = {};
|
|
277
|
+
if (this.node.version === 4) {
|
|
278
|
+
await this.node.rest.updatePlayer(this.guildId, { filters: {} });
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
await this.node.send({ op: "filters", guildId: this.guildId });
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// ─── Filter Presets ─────────────────────────────────────────────────────
|
|
285
|
+
async setBassBoost(level) {
|
|
286
|
+
const tier = this.boostTier;
|
|
287
|
+
if (level === "off") {
|
|
288
|
+
await this.setFilters({ equalizer: BitrateOptimizer_1.BitrateOptimizer.getFlatEQ() });
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
// Scale bass based on boost tier to prevent clipping
|
|
292
|
+
const scales = { low: 0.3, medium: 0.5, high: 0.75, extreme: 1.0 };
|
|
293
|
+
const scale = scales[level] ?? 0.5;
|
|
294
|
+
const tierScale = tier >= 2 ? 1.0 : tier === 1 ? 0.8 : 0.6;
|
|
295
|
+
const effectiveScale = scale * tierScale;
|
|
296
|
+
const eq = [
|
|
297
|
+
{ band: 0, gain: 0.6 * effectiveScale },
|
|
298
|
+
{ band: 1, gain: 0.5 * effectiveScale },
|
|
299
|
+
{ band: 2, gain: 0.4 * effectiveScale },
|
|
300
|
+
{ band: 3, gain: 0.25 * effectiveScale },
|
|
301
|
+
{ band: 4, gain: 0.1 * effectiveScale },
|
|
302
|
+
{ band: 5, gain: -0.05 * effectiveScale },
|
|
303
|
+
...Array.from({ length: 9 }, (_, i) => ({ band: i + 6, gain: 0 })),
|
|
304
|
+
];
|
|
305
|
+
await this.setFilters({ equalizer: eq });
|
|
306
|
+
}
|
|
307
|
+
async setNightcore(enabled) {
|
|
308
|
+
await this.setFilters({
|
|
309
|
+
timescale: enabled ? { speed: 1.2, pitch: 1.2, rate: 1.0 } : {},
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
async setVaporwave(enabled) {
|
|
313
|
+
await this.setFilters({
|
|
314
|
+
timescale: enabled ? { speed: 0.8, pitch: 0.8, rate: 1.0 } : {},
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
async set8D(enabled) {
|
|
318
|
+
await this.setFilters({
|
|
319
|
+
rotation: enabled ? { rotationHz: 0.2 } : {},
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
async setKaraoke(enabled) {
|
|
323
|
+
await this.setFilters({
|
|
324
|
+
karaoke: enabled
|
|
325
|
+
? { level: 1.0, monoLevel: 1.0, filterBand: 220.0, filterWidth: 100.0 }
|
|
326
|
+
: {},
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
async setTremolo(enabled, frequency = 2.0, depth = 0.5) {
|
|
330
|
+
if (enabled) {
|
|
331
|
+
if (frequency <= 0 || frequency > 14) {
|
|
332
|
+
throw new YukimuError_1.PlayerError("Tremolo frequency must be between 0 and 14", YukimuError_1.ErrorCode.PLAYER_INVALID_FILTER);
|
|
333
|
+
}
|
|
334
|
+
if (depth <= 0 || depth > 1) {
|
|
335
|
+
throw new YukimuError_1.PlayerError("Tremolo depth must be between 0 and 1", YukimuError_1.ErrorCode.PLAYER_INVALID_FILTER);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
await this.setFilters({ tremolo: enabled ? { frequency, depth } : {} });
|
|
339
|
+
}
|
|
340
|
+
async setVibrato(enabled, frequency = 2.0, depth = 0.5) {
|
|
341
|
+
if (enabled) {
|
|
342
|
+
if (frequency <= 0 || frequency > 14) {
|
|
343
|
+
throw new YukimuError_1.PlayerError("Vibrato frequency must be between 0 and 14", YukimuError_1.ErrorCode.PLAYER_INVALID_FILTER);
|
|
344
|
+
}
|
|
345
|
+
if (depth <= 0 || depth > 1) {
|
|
346
|
+
throw new YukimuError_1.PlayerError("Vibrato depth must be between 0 and 1", YukimuError_1.ErrorCode.PLAYER_INVALID_FILTER);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
await this.setFilters({ vibrato: enabled ? { frequency, depth } : {} });
|
|
350
|
+
}
|
|
351
|
+
async setLowPass(enabled, smoothing = 20.0) {
|
|
352
|
+
if (enabled && smoothing <= 0) {
|
|
353
|
+
throw new YukimuError_1.PlayerError("LowPass smoothing must be greater than 0", YukimuError_1.ErrorCode.PLAYER_INVALID_FILTER);
|
|
354
|
+
}
|
|
355
|
+
await this.setFilters({ lowPass: enabled ? { smoothing } : {} });
|
|
356
|
+
}
|
|
357
|
+
/** Set playback speed (1.0 = normal, 2.0 = double speed) */
|
|
358
|
+
async setSpeed(speed) {
|
|
359
|
+
if (speed <= 0 || speed > 10) {
|
|
360
|
+
throw new YukimuError_1.PlayerError("Speed must be between 0 and 10", YukimuError_1.ErrorCode.PLAYER_INVALID_FILTER);
|
|
361
|
+
}
|
|
362
|
+
const existing = (this.filters.timescale ?? {});
|
|
363
|
+
await this.setFilters({
|
|
364
|
+
timescale: { ...existing, speed },
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
/** Set playback pitch (1.0 = normal) */
|
|
368
|
+
async setPitch(pitch) {
|
|
369
|
+
if (pitch <= 0 || pitch > 10) {
|
|
370
|
+
throw new YukimuError_1.PlayerError("Pitch must be between 0 and 10", YukimuError_1.ErrorCode.PLAYER_INVALID_FILTER);
|
|
371
|
+
}
|
|
372
|
+
const existing = (this.filters.timescale ?? {});
|
|
373
|
+
await this.setFilters({
|
|
374
|
+
timescale: { ...existing, pitch },
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
// ─── Queue Shortcuts ───────────────────────────────────────────────────
|
|
378
|
+
/**
|
|
379
|
+
* Add track(s) to the queue. If nothing is currently playing, plays immediately.
|
|
380
|
+
*/
|
|
381
|
+
async add(tracks, requester) {
|
|
382
|
+
const arr = Array.isArray(tracks) ? [...tracks] : [tracks];
|
|
383
|
+
if (requester) {
|
|
384
|
+
for (const t of arr) {
|
|
385
|
+
t["requester"] = requester;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
if (!this.queue.current && arr.length > 0) {
|
|
389
|
+
const first = arr.shift();
|
|
390
|
+
if (arr.length > 0)
|
|
391
|
+
this.queue.add(arr);
|
|
392
|
+
await this.play(first);
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
this.queue.add(arr);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
setLoop(mode) {
|
|
399
|
+
this.loop = mode;
|
|
400
|
+
}
|
|
401
|
+
setAutoplay(enabled) {
|
|
402
|
+
this.autoplay = enabled;
|
|
403
|
+
}
|
|
404
|
+
// ─── Node Movement ─────────────────────────────────────────────────────
|
|
405
|
+
/**
|
|
406
|
+
* Move this player to a different Lavalink node.
|
|
407
|
+
*
|
|
408
|
+
* FIX: Now properly re-sends the voice state to the new node.
|
|
409
|
+
* In v1, the new node didn't know about the voice connection.
|
|
410
|
+
*/
|
|
411
|
+
async moveToNode(node) {
|
|
412
|
+
if (this.node === node)
|
|
413
|
+
return;
|
|
414
|
+
const oldNode = this.node;
|
|
415
|
+
this.node = node;
|
|
416
|
+
// Clean up on old node
|
|
417
|
+
await oldNode.rest.destroyPlayer(this.guildId).catch(() => { });
|
|
418
|
+
// Re-send voice state to new node
|
|
419
|
+
this.checkVoiceReady();
|
|
420
|
+
// Resume playback on new node
|
|
421
|
+
if (this.queue.current) {
|
|
422
|
+
await this.play(this.queue.current, { startTime: this.realPosition });
|
|
423
|
+
}
|
|
424
|
+
// Re-apply filters and volume
|
|
425
|
+
if (Object.keys(this.filters).length > 0) {
|
|
426
|
+
await this.setFilters(this.filters).catch(() => { });
|
|
427
|
+
}
|
|
428
|
+
if (this.volume !== 100) {
|
|
429
|
+
await this.setVolume(this.volume).catch(() => { });
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
/** Move the bot to a different voice channel */
|
|
433
|
+
async move(channelId) {
|
|
434
|
+
this.voiceChannelId = channelId;
|
|
435
|
+
this.sendVoicePayload(channelId, this.selfDeaf, this.selfMute);
|
|
436
|
+
}
|
|
437
|
+
// ─── Audio Quality ──────────────────────────────────────────────────────
|
|
438
|
+
/**
|
|
439
|
+
* Apply optimal audio settings based on the guild's boost tier.
|
|
440
|
+
* Automatically adjusts EQ and filters for best clarity at the available bitrate.
|
|
441
|
+
*/
|
|
442
|
+
async applyOptimalQuality() {
|
|
443
|
+
const tier = this.boostTier;
|
|
444
|
+
const filters = BitrateOptimizer_1.BitrateOptimizer.getOptimalFilters(tier);
|
|
445
|
+
await this.setFilters(filters);
|
|
446
|
+
this.manager.logger.debug(`Applied optimal quality for guild ${this.guildId} (boost tier ${tier}, max ${BitrateOptimizer_1.BitrateOptimizer.getMaxBitrate(tier)}kbps)`);
|
|
447
|
+
}
|
|
448
|
+
/** Maximum audio quality — crystal clear, enhanced bass & treble */
|
|
449
|
+
async setHighQuality() {
|
|
450
|
+
const tier = this.boostTier;
|
|
451
|
+
const scale = tier >= 2 ? 1.0 : tier === 1 ? 0.8 : 0.6;
|
|
452
|
+
await this.setFilters({
|
|
453
|
+
equalizer: [
|
|
454
|
+
{ band: 0, gain: 0.25 * scale },
|
|
455
|
+
{ band: 1, gain: 0.20 * scale },
|
|
456
|
+
{ band: 2, gain: 0.15 * scale },
|
|
457
|
+
{ band: 3, gain: 0.05 * scale },
|
|
458
|
+
{ band: 4, gain: 0.0 },
|
|
459
|
+
{ band: 5, gain: 0.0 },
|
|
460
|
+
{ band: 6, gain: 0.0 },
|
|
461
|
+
{ band: 7, gain: 0.05 * scale },
|
|
462
|
+
{ band: 8, gain: 0.10 * scale },
|
|
463
|
+
{ band: 9, gain: 0.15 * scale },
|
|
464
|
+
{ band: 10, gain: 0.15 * scale },
|
|
465
|
+
{ band: 11, gain: 0.10 * scale },
|
|
466
|
+
{ band: 12, gain: 0.05 * scale },
|
|
467
|
+
{ band: 13, gain: 0.0 },
|
|
468
|
+
{ band: 14, gain: 0.0 },
|
|
469
|
+
],
|
|
470
|
+
lowPass: tier >= 2 ? { smoothing: 5.0 } : {},
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
/** Studio quality — flat, neutral, most accurate */
|
|
474
|
+
async setStudioQuality() {
|
|
475
|
+
await this.clearFilters();
|
|
476
|
+
await this.setFilters({
|
|
477
|
+
equalizer: BitrateOptimizer_1.BitrateOptimizer.getFlatEQ(),
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
/** Concert hall effect — scaled for boost tier */
|
|
481
|
+
async setConcertHall() {
|
|
482
|
+
const tier = this.boostTier;
|
|
483
|
+
const scale = tier >= 2 ? 1.0 : 0.6;
|
|
484
|
+
await this.setFilters({
|
|
485
|
+
equalizer: [
|
|
486
|
+
{ band: 0, gain: 0.1 * scale },
|
|
487
|
+
{ band: 1, gain: 0.1 * scale },
|
|
488
|
+
{ band: 2, gain: 0.05 * scale },
|
|
489
|
+
{ band: 3, gain: 0.0 },
|
|
490
|
+
{ band: 4, gain: -0.05 * scale },
|
|
491
|
+
{ band: 5, gain: 0.0 },
|
|
492
|
+
{ band: 6, gain: 0.05 * scale },
|
|
493
|
+
{ band: 7, gain: 0.1 * scale },
|
|
494
|
+
{ band: 8, gain: 0.1 * scale },
|
|
495
|
+
{ band: 9, gain: 0.05 * scale },
|
|
496
|
+
{ band: 10, gain: 0.0 },
|
|
497
|
+
{ band: 11, gain: 0.0 },
|
|
498
|
+
{ band: 12, gain: 0.0 },
|
|
499
|
+
{ band: 13, gain: 0.0 },
|
|
500
|
+
{ band: 14, gain: 0.0 },
|
|
501
|
+
],
|
|
502
|
+
rotation: { rotationHz: 0.05 },
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
// ─── Lifecycle ──────────────────────────────────────────────────────────
|
|
506
|
+
/**
|
|
507
|
+
* Destroy this player and clean up all resources.
|
|
508
|
+
*/
|
|
509
|
+
async destroy() {
|
|
510
|
+
this.state = Constants_1.PlayerState.DISCONNECTING;
|
|
511
|
+
// Leave voice channel
|
|
512
|
+
this.sendVoicePayload(null, false, false);
|
|
513
|
+
// Destroy on Lavalink
|
|
514
|
+
await this.node.rest.destroyPlayer(this.guildId).catch(() => { });
|
|
515
|
+
// Clean up all state
|
|
516
|
+
this.playing = false;
|
|
517
|
+
this.paused = false;
|
|
518
|
+
this.position = 0;
|
|
519
|
+
this.queue.clear();
|
|
520
|
+
this.data.clear();
|
|
521
|
+
this.filters = {};
|
|
522
|
+
this.sessionId = null;
|
|
523
|
+
this.voiceToken = null;
|
|
524
|
+
this.voiceEndpoint = null;
|
|
525
|
+
this.voiceChannelId = null;
|
|
526
|
+
this.state = Constants_1.PlayerState.DISCONNECTED;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
exports.Player = Player;
|
|
530
|
+
//# sourceMappingURL=Player.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Player.js","sourceRoot":"","sources":["../src/Player.ts"],"names":[],"mappings":"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"}
|
package/dist/Plugin.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Yukimu v2.0.0 — Plugin Base Class */
|
|
2
|
+
import type { Yukimu } from "./Yukimu";
|
|
3
|
+
/**
|
|
4
|
+
* Base class for Yukimu plugins.
|
|
5
|
+
*
|
|
6
|
+
* Plugins extend Yukimu's functionality by hooking into events.
|
|
7
|
+
* Every plugin must implement `name` and `load()`.
|
|
8
|
+
* Plugins should also implement `unload()` to clean up listeners/timers.
|
|
9
|
+
*/
|
|
10
|
+
export declare abstract class Plugin {
|
|
11
|
+
/** Unique name identifying this plugin */
|
|
12
|
+
abstract readonly name: string;
|
|
13
|
+
/**
|
|
14
|
+
* Called when the plugin is loaded into the Yukimu manager.
|
|
15
|
+
* Use this to register event listeners and initialize state.
|
|
16
|
+
*/
|
|
17
|
+
abstract load(manager: Yukimu): void;
|
|
18
|
+
/**
|
|
19
|
+
* Called when the plugin is unloaded.
|
|
20
|
+
* Clean up all event listeners, timers, and state here.
|
|
21
|
+
* Failure to implement this will cause memory leaks.
|
|
22
|
+
*/
|
|
23
|
+
unload?(manager: Yukimu): void;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=Plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../src/Plugin.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAExC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC;;;;;;GAMG;AACH,8BAAsB,MAAM;IAC1B,0CAA0C;IAC1C,kBAAyB,IAAI,EAAE,MAAM,CAAC;IAEtC;;;OAGG;aACa,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAE3C;;;;OAIG;IACI,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CACtC"}
|
package/dist/Plugin.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Yukimu v2.0.0 — Plugin Base Class */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.Plugin = void 0;
|
|
5
|
+
/**
|
|
6
|
+
* Base class for Yukimu plugins.
|
|
7
|
+
*
|
|
8
|
+
* Plugins extend Yukimu's functionality by hooking into events.
|
|
9
|
+
* Every plugin must implement `name` and `load()`.
|
|
10
|
+
* Plugins should also implement `unload()` to clean up listeners/timers.
|
|
11
|
+
*/
|
|
12
|
+
class Plugin {
|
|
13
|
+
}
|
|
14
|
+
exports.Plugin = Plugin;
|
|
15
|
+
//# sourceMappingURL=Plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Plugin.js","sourceRoot":"","sources":["../src/Plugin.ts"],"names":[],"mappings":";AAAA,wCAAwC;;;AAIxC;;;;;;GAMG;AACH,MAAsB,MAAM;CAgB3B;AAhBD,wBAgBC"}
|