discordjs-nextgen-voice 0.1.0
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/README.md +147 -0
- package/dist/cjs/augmentations.d.ts +11 -0
- package/dist/cjs/augmentations.d.ts.map +1 -0
- package/dist/cjs/augmentations.js +4 -0
- package/dist/cjs/augmentations.js.map +1 -0
- package/dist/cjs/core/GuildVoiceSession.d.ts +37 -0
- package/dist/cjs/core/GuildVoiceSession.d.ts.map +1 -0
- package/dist/cjs/core/GuildVoiceSession.js +140 -0
- package/dist/cjs/core/GuildVoiceSession.js.map +1 -0
- package/dist/cjs/core/VoiceManager.d.ts +38 -0
- package/dist/cjs/core/VoiceManager.d.ts.map +1 -0
- package/dist/cjs/core/VoiceManager.js +144 -0
- package/dist/cjs/core/VoiceManager.js.map +1 -0
- package/dist/cjs/index.d.ts +6 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +9 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/plugin/VoicePlugin.d.ts +12 -0
- package/dist/cjs/plugin/VoicePlugin.d.ts.map +1 -0
- package/dist/cjs/plugin/VoicePlugin.js +34 -0
- package/dist/cjs/plugin/VoicePlugin.js.map +1 -0
- package/dist/cjs/types.d.ts +28 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils/ffmpeg.d.ts +8 -0
- package/dist/cjs/utils/ffmpeg.d.ts.map +1 -0
- package/dist/cjs/utils/ffmpeg.js +41 -0
- package/dist/cjs/utils/ffmpeg.js.map +1 -0
- package/dist/esm/augmentations.d.ts +11 -0
- package/dist/esm/augmentations.d.ts.map +1 -0
- package/dist/esm/augmentations.js +2 -0
- package/dist/esm/augmentations.js.map +1 -0
- package/dist/esm/core/GuildVoiceSession.d.ts +37 -0
- package/dist/esm/core/GuildVoiceSession.d.ts.map +1 -0
- package/dist/esm/core/GuildVoiceSession.js +136 -0
- package/dist/esm/core/GuildVoiceSession.js.map +1 -0
- package/dist/esm/core/VoiceManager.d.ts +38 -0
- package/dist/esm/core/VoiceManager.d.ts.map +1 -0
- package/dist/esm/core/VoiceManager.js +140 -0
- package/dist/esm/core/VoiceManager.js.map +1 -0
- package/dist/esm/index.d.ts +6 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/plugin/VoicePlugin.d.ts +12 -0
- package/dist/esm/plugin/VoicePlugin.d.ts.map +1 -0
- package/dist/esm/plugin/VoicePlugin.js +30 -0
- package/dist/esm/plugin/VoicePlugin.js.map +1 -0
- package/dist/esm/types.d.ts +28 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils/ffmpeg.d.ts +8 -0
- package/dist/esm/utils/ffmpeg.d.ts.map +1 -0
- package/dist/esm/utils/ffmpeg.js +34 -0
- package/dist/esm/utils/ffmpeg.js.map +1 -0
- package/package.json +57 -0
package/README.md
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# discordjs-nextgen-voice
|
|
2
|
+
|
|
3
|
+
`@discordjs/voice` tabanli, `discordjs-nextgen` icin voice plugin.
|
|
4
|
+
|
|
5
|
+
## Kurulum
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install discordjs-nextgen discordjs-nextgen-voice
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Hizli Kullanim
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { App, Intents } from 'discordjs-nextgen';
|
|
15
|
+
import { VoicePlugin } from 'discordjs-nextgen-voice';
|
|
16
|
+
|
|
17
|
+
const app = new App({ intents: Intents.ALL });
|
|
18
|
+
|
|
19
|
+
app.use(new VoicePlugin({
|
|
20
|
+
autoLeave: true,
|
|
21
|
+
defaultVolume: 0.5,
|
|
22
|
+
}));
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Bu kullanimda plugin, adapter'i otomatik olarak `discordjs-nextgen` core'dan alir.
|
|
26
|
+
|
|
27
|
+
## Botu Ses Kanalina Katma (ctx.voice.join)
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
const joinCommand = {
|
|
31
|
+
name: 'join',
|
|
32
|
+
run: async (ctx, args) => {
|
|
33
|
+
const channelId = args[0]; // ornek: !join 1234567890
|
|
34
|
+
if (!channelId) {
|
|
35
|
+
return ctx.reply('Kullanim: !join <channelId>');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
await ctx.voice.join({ channelId });
|
|
39
|
+
|
|
40
|
+
await ctx.reply('Ses kanalina baglandim.');
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Botu Ses Kanalina Katma (app.voice.join)
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
await app.voice.join({
|
|
49
|
+
guildId: 'GUILD_ID',
|
|
50
|
+
channelId: 'VOICE_CHANNEL_ID',
|
|
51
|
+
// adapterCreator opsiyonel (core otomatik saglar)
|
|
52
|
+
});
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Opsiyonel: Adapter Ozellestirme
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
app.use(new VoicePlugin({
|
|
59
|
+
adapterProvider: (guildId, ctx) => {
|
|
60
|
+
// Otomatik adapter yerine kendi adapterCreator kaynagini verebilirsin.
|
|
61
|
+
return undefined;
|
|
62
|
+
},
|
|
63
|
+
}));
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Muzik Calma (ctx.voice.play)
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
const playCommand = {
|
|
70
|
+
name: 'play',
|
|
71
|
+
run: async (ctx, args) => {
|
|
72
|
+
const url = args[0];
|
|
73
|
+
await ctx.voice.play(url, {
|
|
74
|
+
title: 'Requested song',
|
|
75
|
+
requestedBy: ctx.user.tag,
|
|
76
|
+
join: {
|
|
77
|
+
channelId: 'VOICE_CHANNEL_ID',
|
|
78
|
+
// adapterCreator opsiyonel, adapterProvider varsa gerekmez.
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
await ctx.reply('Calma basladi.');
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Diger Komut Ornekleri
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
const pauseCommand = {
|
|
91
|
+
name: 'pause',
|
|
92
|
+
run: async (ctx) => {
|
|
93
|
+
const ok = ctx.voice.pause();
|
|
94
|
+
await ctx.reply(ok ? 'Duraklatildi.' : 'Duraklatilacak bir sey yok.');
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const resumeCommand = {
|
|
99
|
+
name: 'resume',
|
|
100
|
+
run: async (ctx) => {
|
|
101
|
+
const ok = ctx.voice.resume();
|
|
102
|
+
await ctx.reply(ok ? 'Devam ediyor.' : 'Devam ettirilemedi.');
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const skipCommand = {
|
|
107
|
+
name: 'skip',
|
|
108
|
+
run: async (ctx) => {
|
|
109
|
+
const ok = ctx.voice.skip();
|
|
110
|
+
await ctx.reply(ok ? 'Parca gecildi.' : 'Gecilecek parca yok.');
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const leaveCommand = {
|
|
115
|
+
name: 'leave',
|
|
116
|
+
run: async (ctx) => {
|
|
117
|
+
ctx.voice.leave();
|
|
118
|
+
await ctx.reply('Kanaldan ayrildim.');
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## API
|
|
124
|
+
|
|
125
|
+
- `app.voice.join({ guildId, channelId, adapterCreator })`
|
|
126
|
+
- `app.voice.play(guildId, source, options?)`
|
|
127
|
+
- `app.voice.pause(guildId)`
|
|
128
|
+
- `app.voice.resume(guildId)`
|
|
129
|
+
- `app.voice.skip(guildId)`
|
|
130
|
+
- `app.voice.stop(guildId)`
|
|
131
|
+
- `app.voice.setVolume(guildId, value)` (`0` - `2`)
|
|
132
|
+
- `app.voice.getQueue(guildId)`
|
|
133
|
+
- `ctx.voice.join(...)`
|
|
134
|
+
- `ctx.voice.play(...)`
|
|
135
|
+
- `ctx.voice.pause()`
|
|
136
|
+
- `ctx.voice.resume()`
|
|
137
|
+
- `ctx.voice.skip()`
|
|
138
|
+
- `ctx.voice.stop()`
|
|
139
|
+
- `ctx.voice.setVolume(value)`
|
|
140
|
+
- `ctx.voice.getQueue()`
|
|
141
|
+
|
|
142
|
+
## Notlar
|
|
143
|
+
|
|
144
|
+
- Remote URL veya stream kaynaklarinda ffmpeg gerekir. Paket `ffmpeg-static` ile gelir.
|
|
145
|
+
- Bot izinleri: `Connect`, `Speak`.
|
|
146
|
+
- YouTube icin `play-dl` / `ytdl-core` ile stream olusturup `ctx.voice.play(stream)` verebilirsin.
|
|
147
|
+
- `ctx.voice.join()` ve `ctx.voice.play(..., { join: ... })` kullanmak icin guild context gerekir.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import 'discordjs-nextgen';
|
|
2
|
+
import type { VoiceManager, ContextVoice } from './core/VoiceManager.js';
|
|
3
|
+
declare module 'discordjs-nextgen' {
|
|
4
|
+
interface App {
|
|
5
|
+
voice: VoiceManager;
|
|
6
|
+
}
|
|
7
|
+
interface Context {
|
|
8
|
+
voice: ContextVoice;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=augmentations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"augmentations.d.ts","sourceRoot":"","sources":["../../src/augmentations.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEzE,OAAO,QAAQ,mBAAmB,CAAC;IACjC,UAAU,GAAG;QACX,KAAK,EAAE,YAAY,CAAC;KACrB;IAED,UAAU,OAAO;QACf,KAAK,EAAE,YAAY,CAAC;KACrB;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"augmentations.js","sourceRoot":"","sources":["../../src/augmentations.ts"],"names":[],"mappings":";;AAAA,6BAA2B"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type DiscordGatewayAdapterCreator } from '@discordjs/voice';
|
|
2
|
+
import type { AudioSource, QueueTrack, VoicePlayOptions } from '../types.js';
|
|
3
|
+
export interface GuildVoiceSessionOptions {
|
|
4
|
+
guildId: string;
|
|
5
|
+
defaultVolume: number;
|
|
6
|
+
autoLeave: boolean;
|
|
7
|
+
autoLeaveDelayMs: number;
|
|
8
|
+
}
|
|
9
|
+
export declare class GuildVoiceSession {
|
|
10
|
+
private readonly options;
|
|
11
|
+
private connection;
|
|
12
|
+
private readonly player;
|
|
13
|
+
private readonly queue;
|
|
14
|
+
private current;
|
|
15
|
+
private leaveTimer;
|
|
16
|
+
private currentResource;
|
|
17
|
+
private ffmpegProcess?;
|
|
18
|
+
private volume;
|
|
19
|
+
constructor(options: GuildVoiceSessionOptions);
|
|
20
|
+
join(channelId: string, adapterCreator: DiscordGatewayAdapterCreator): Promise<void>;
|
|
21
|
+
destroy(): void;
|
|
22
|
+
isConnected(): boolean;
|
|
23
|
+
pause(): boolean;
|
|
24
|
+
resume(): boolean;
|
|
25
|
+
stop(): boolean;
|
|
26
|
+
skip(): boolean;
|
|
27
|
+
setVolume(value: number): void;
|
|
28
|
+
getVolume(): number;
|
|
29
|
+
getQueue(): QueueTrack[];
|
|
30
|
+
play(source: AudioSource, options?: VoicePlayOptions): Promise<void>;
|
|
31
|
+
clearQueue(): void;
|
|
32
|
+
private playNext;
|
|
33
|
+
private createResource;
|
|
34
|
+
private cleanupCurrentTrack;
|
|
35
|
+
private clearLeaveTimer;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=GuildVoiceSession.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GuildVoiceSession.d.ts","sourceRoot":"","sources":["../../../src/core/GuildVoiceSession.ts"],"names":[],"mappings":"AAAA,OAAO,EAWL,KAAK,4BAA4B,EAElC,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE7E,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,iBAAiB;IAUhB,OAAO,CAAC,QAAQ,CAAC,OAAO;IATpC,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,aAAa,CAAC,CAAmD;IACzE,OAAO,CAAC,MAAM,CAAK;gBAEU,OAAO,EAAE,wBAAwB;IAmBxD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC;IAc1F,OAAO,IAAI,IAAI;IAOf,WAAW,IAAI,OAAO;IAItB,KAAK,IAAI,OAAO;IAIhB,MAAM,IAAI,OAAO;IAIjB,IAAI,IAAI,OAAO;IAKf,IAAI,IAAI,OAAO;IAIf,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK9B,SAAS,IAAI,MAAM;IAInB,QAAQ,IAAI,UAAU,EAAE;IAKlB,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAa9E,UAAU,IAAI,IAAI;YAIJ,QAAQ;IAkBtB,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,eAAe;CAKxB"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GuildVoiceSession = void 0;
|
|
4
|
+
const voice_1 = require("@discordjs/voice");
|
|
5
|
+
const node_stream_1 = require("node:stream");
|
|
6
|
+
const ffmpeg_js_1 = require("../utils/ffmpeg.js");
|
|
7
|
+
class GuildVoiceSession {
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.options = options;
|
|
10
|
+
this.connection = null;
|
|
11
|
+
this.queue = [];
|
|
12
|
+
this.current = null;
|
|
13
|
+
this.leaveTimer = null;
|
|
14
|
+
this.currentResource = null;
|
|
15
|
+
this.volume = 1;
|
|
16
|
+
this.volume = options.defaultVolume;
|
|
17
|
+
this.player = (0, voice_1.createAudioPlayer)({
|
|
18
|
+
behaviors: {
|
|
19
|
+
noSubscriber: voice_1.NoSubscriberBehavior.Pause,
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
this.player.on(voice_1.AudioPlayerStatus.Idle, () => {
|
|
23
|
+
this.cleanupCurrentTrack();
|
|
24
|
+
void this.playNext();
|
|
25
|
+
});
|
|
26
|
+
this.player.on('error', () => {
|
|
27
|
+
this.cleanupCurrentTrack();
|
|
28
|
+
void this.playNext();
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
async join(channelId, adapterCreator) {
|
|
32
|
+
const joinOptions = {
|
|
33
|
+
channelId,
|
|
34
|
+
guildId: this.options.guildId,
|
|
35
|
+
adapterCreator,
|
|
36
|
+
selfDeaf: false,
|
|
37
|
+
selfMute: false,
|
|
38
|
+
};
|
|
39
|
+
this.connection = (0, voice_1.joinVoiceChannel)(joinOptions);
|
|
40
|
+
this.connection.subscribe(this.player);
|
|
41
|
+
await (0, voice_1.entersState)(this.connection, voice_1.VoiceConnectionStatus.Ready, 20000);
|
|
42
|
+
}
|
|
43
|
+
destroy() {
|
|
44
|
+
this.clearQueue();
|
|
45
|
+
this.cleanupCurrentTrack();
|
|
46
|
+
this.connection?.destroy();
|
|
47
|
+
this.connection = null;
|
|
48
|
+
}
|
|
49
|
+
isConnected() {
|
|
50
|
+
return !!this.connection && this.connection.state.status !== voice_1.VoiceConnectionStatus.Destroyed;
|
|
51
|
+
}
|
|
52
|
+
pause() {
|
|
53
|
+
return this.player.pause();
|
|
54
|
+
}
|
|
55
|
+
resume() {
|
|
56
|
+
return this.player.unpause();
|
|
57
|
+
}
|
|
58
|
+
stop() {
|
|
59
|
+
this.clearQueue();
|
|
60
|
+
return this.player.stop(true);
|
|
61
|
+
}
|
|
62
|
+
skip() {
|
|
63
|
+
return this.player.stop();
|
|
64
|
+
}
|
|
65
|
+
setVolume(value) {
|
|
66
|
+
this.volume = Math.max(0, Math.min(2, value));
|
|
67
|
+
this.currentResource?.volume?.setVolume(this.volume);
|
|
68
|
+
}
|
|
69
|
+
getVolume() {
|
|
70
|
+
return this.volume;
|
|
71
|
+
}
|
|
72
|
+
getQueue() {
|
|
73
|
+
const now = this.current ? [this.current] : [];
|
|
74
|
+
return [...now, ...this.queue];
|
|
75
|
+
}
|
|
76
|
+
async play(source, options = {}) {
|
|
77
|
+
this.queue.push({
|
|
78
|
+
source,
|
|
79
|
+
title: options.title,
|
|
80
|
+
requestedBy: options.requestedBy,
|
|
81
|
+
metadata: options.metadata,
|
|
82
|
+
});
|
|
83
|
+
if (this.player.state.status === voice_1.AudioPlayerStatus.Idle) {
|
|
84
|
+
await this.playNext();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
clearQueue() {
|
|
88
|
+
this.queue.length = 0;
|
|
89
|
+
}
|
|
90
|
+
async playNext() {
|
|
91
|
+
this.clearLeaveTimer();
|
|
92
|
+
const nextTrack = this.queue.shift();
|
|
93
|
+
if (!nextTrack) {
|
|
94
|
+
this.current = null;
|
|
95
|
+
if (this.options.autoLeave) {
|
|
96
|
+
this.leaveTimer = setTimeout(() => this.destroy(), this.options.autoLeaveDelayMs);
|
|
97
|
+
}
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
this.current = nextTrack;
|
|
101
|
+
const resource = this.createResource(nextTrack.source);
|
|
102
|
+
this.currentResource = resource;
|
|
103
|
+
this.player.play(resource);
|
|
104
|
+
}
|
|
105
|
+
createResource(source) {
|
|
106
|
+
if (source instanceof node_stream_1.Readable) {
|
|
107
|
+
const res = (0, voice_1.createAudioResource)(source, { inlineVolume: true });
|
|
108
|
+
res.volume?.setVolume(this.volume);
|
|
109
|
+
return res;
|
|
110
|
+
}
|
|
111
|
+
if ((0, ffmpeg_js_1.isRemoteUrl)(source)) {
|
|
112
|
+
const ffmpeg = (0, ffmpeg_js_1.createFfmpegStream)(source);
|
|
113
|
+
this.ffmpegProcess = ffmpeg.process;
|
|
114
|
+
const res = (0, voice_1.createAudioResource)(ffmpeg.stream, {
|
|
115
|
+
inputType: voice_1.StreamType.Raw,
|
|
116
|
+
inlineVolume: true,
|
|
117
|
+
});
|
|
118
|
+
res.volume?.setVolume(this.volume);
|
|
119
|
+
return res;
|
|
120
|
+
}
|
|
121
|
+
const res = (0, voice_1.createAudioResource)(source, { inlineVolume: true });
|
|
122
|
+
res.volume?.setVolume(this.volume);
|
|
123
|
+
return res;
|
|
124
|
+
}
|
|
125
|
+
cleanupCurrentTrack() {
|
|
126
|
+
this.currentResource = null;
|
|
127
|
+
if (this.ffmpegProcess && !this.ffmpegProcess.killed) {
|
|
128
|
+
this.ffmpegProcess.kill('SIGKILL');
|
|
129
|
+
}
|
|
130
|
+
this.ffmpegProcess = undefined;
|
|
131
|
+
}
|
|
132
|
+
clearLeaveTimer() {
|
|
133
|
+
if (!this.leaveTimer)
|
|
134
|
+
return;
|
|
135
|
+
clearTimeout(this.leaveTimer);
|
|
136
|
+
this.leaveTimer = null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
exports.GuildVoiceSession = GuildVoiceSession;
|
|
140
|
+
//# sourceMappingURL=GuildVoiceSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GuildVoiceSession.js","sourceRoot":"","sources":["../../../src/core/GuildVoiceSession.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { App, Context } from 'discordjs-nextgen';
|
|
2
|
+
import type { AudioSource, QueueTrack, VoiceJoinOptions, VoicePlayOptions, VoicePluginOptions } from '../types.js';
|
|
3
|
+
export interface ContextVoice {
|
|
4
|
+
join: (options: Omit<VoiceJoinOptions, 'guildId'> & {
|
|
5
|
+
guildId?: string;
|
|
6
|
+
}) => Promise<void>;
|
|
7
|
+
leave: () => void;
|
|
8
|
+
play: (source: AudioSource, options?: VoicePlayOptions) => Promise<void>;
|
|
9
|
+
pause: () => boolean;
|
|
10
|
+
resume: () => boolean;
|
|
11
|
+
stop: () => boolean;
|
|
12
|
+
skip: () => boolean;
|
|
13
|
+
setVolume: (value: number) => void;
|
|
14
|
+
getVolume: () => number;
|
|
15
|
+
getQueue: () => QueueTrack[];
|
|
16
|
+
}
|
|
17
|
+
export declare class VoiceManager {
|
|
18
|
+
private readonly app;
|
|
19
|
+
private readonly sessions;
|
|
20
|
+
private readonly options;
|
|
21
|
+
constructor(app: App, options?: VoicePluginOptions);
|
|
22
|
+
forContext(ctx: Context): ContextVoice;
|
|
23
|
+
join(options: VoiceJoinOptions): Promise<void>;
|
|
24
|
+
leave(guildId: string): void;
|
|
25
|
+
play(guildId: string, source: AudioSource, options?: VoicePlayOptions): Promise<void>;
|
|
26
|
+
pause(guildId: string): boolean;
|
|
27
|
+
resume(guildId: string): boolean;
|
|
28
|
+
stop(guildId: string): boolean;
|
|
29
|
+
skip(guildId: string): boolean;
|
|
30
|
+
setVolume(guildId: string, value: number): void;
|
|
31
|
+
getVolume(guildId: string): number;
|
|
32
|
+
getQueue(guildId: string): QueueTrack[];
|
|
33
|
+
destroyAll(): void;
|
|
34
|
+
private getOrCreateSession;
|
|
35
|
+
private resolveGuildId;
|
|
36
|
+
private resolveAdapterCreator;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=VoiceManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VoiceManager.d.ts","sourceRoot":"","sources":["../../../src/core/VoiceManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGtD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEnH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3F,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,KAAK,EAAE,MAAM,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB,IAAI,EAAE,MAAM,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,OAAO,CAAC;IACpB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,UAAU,EAAE,CAAC;CAC9B;AAED,qBAAa,YAAY;IAIX,OAAO,CAAC,QAAQ,CAAC,GAAG;IAHhC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwC;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsG;gBAEjG,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,kBAAuB;IASvE,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY;IAoDhC,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpD,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOtB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3F,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI/B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIhC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI9B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI9B,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI/C,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAIlC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE;IAKvC,UAAU,IAAI,IAAI;IAOlB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,qBAAqB;CAc9B"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VoiceManager = void 0;
|
|
4
|
+
const GuildVoiceSession_js_1 = require("./GuildVoiceSession.js");
|
|
5
|
+
class VoiceManager {
|
|
6
|
+
constructor(app, options = {}) {
|
|
7
|
+
this.app = app;
|
|
8
|
+
this.sessions = new Map();
|
|
9
|
+
this.options = {
|
|
10
|
+
autoLeave: options.autoLeave ?? true,
|
|
11
|
+
autoLeaveDelayMs: options.autoLeaveDelayMs ?? 120000,
|
|
12
|
+
defaultVolume: options.defaultVolume ?? 1,
|
|
13
|
+
adapterProvider: options.adapterProvider,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
forContext(ctx) {
|
|
17
|
+
return {
|
|
18
|
+
join: async (options) => {
|
|
19
|
+
const guildId = options.guildId ?? this.resolveGuildId(ctx);
|
|
20
|
+
const adapterCreator = options.adapterCreator ?? this.resolveAdapterCreator(guildId, ctx);
|
|
21
|
+
if (!adapterCreator) {
|
|
22
|
+
throw new Error('No adapterCreator available. Provide options.adapterCreator or configure VoicePlugin({ adapterProvider }).');
|
|
23
|
+
}
|
|
24
|
+
await this.join({
|
|
25
|
+
guildId,
|
|
26
|
+
channelId: options.channelId,
|
|
27
|
+
adapterCreator,
|
|
28
|
+
});
|
|
29
|
+
},
|
|
30
|
+
leave: () => this.leave(this.resolveGuildId(ctx)),
|
|
31
|
+
play: async (source, options = {}) => {
|
|
32
|
+
const guildId = options.join?.guildId ?? this.resolveGuildId(ctx);
|
|
33
|
+
const hasSession = this.sessions.has(guildId);
|
|
34
|
+
if (!hasSession) {
|
|
35
|
+
if (!options.join) {
|
|
36
|
+
throw new Error('No active voice session for this guild. Join first or pass play(..., { join: { channelId, adapterCreator } }).');
|
|
37
|
+
}
|
|
38
|
+
const adapterCreator = options.join.adapterCreator ?? this.resolveAdapterCreator(guildId, ctx);
|
|
39
|
+
if (!adapterCreator) {
|
|
40
|
+
throw new Error('No adapterCreator available. Provide join.adapterCreator or configure VoicePlugin({ adapterProvider }).');
|
|
41
|
+
}
|
|
42
|
+
await this.join({
|
|
43
|
+
guildId,
|
|
44
|
+
channelId: options.join.channelId,
|
|
45
|
+
adapterCreator,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
await this.play(guildId, source, options);
|
|
49
|
+
},
|
|
50
|
+
pause: () => this.pause(this.resolveGuildId(ctx)),
|
|
51
|
+
resume: () => this.resume(this.resolveGuildId(ctx)),
|
|
52
|
+
stop: () => this.stop(this.resolveGuildId(ctx)),
|
|
53
|
+
skip: () => this.skip(this.resolveGuildId(ctx)),
|
|
54
|
+
setVolume: (value) => this.setVolume(this.resolveGuildId(ctx), value),
|
|
55
|
+
getVolume: () => this.getVolume(this.resolveGuildId(ctx)),
|
|
56
|
+
getQueue: () => this.getQueue(this.resolveGuildId(ctx)),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async join(options) {
|
|
60
|
+
const guildId = options.guildId;
|
|
61
|
+
if (!guildId)
|
|
62
|
+
throw new Error('guildId is required for joining voice.');
|
|
63
|
+
const adapterCreator = options.adapterCreator ?? this.resolveAdapterCreator(guildId);
|
|
64
|
+
if (!adapterCreator) {
|
|
65
|
+
throw new Error('No adapterCreator available. Provide options.adapterCreator or configure VoicePlugin({ adapterProvider }).');
|
|
66
|
+
}
|
|
67
|
+
const session = this.getOrCreateSession(guildId);
|
|
68
|
+
await session.join(options.channelId, adapterCreator);
|
|
69
|
+
}
|
|
70
|
+
leave(guildId) {
|
|
71
|
+
const session = this.sessions.get(guildId);
|
|
72
|
+
if (!session)
|
|
73
|
+
return;
|
|
74
|
+
session.destroy();
|
|
75
|
+
this.sessions.delete(guildId);
|
|
76
|
+
}
|
|
77
|
+
async play(guildId, source, options) {
|
|
78
|
+
const session = this.getOrCreateSession(guildId);
|
|
79
|
+
if (!session.isConnected()) {
|
|
80
|
+
throw new Error('No active voice connection. Call join() first.');
|
|
81
|
+
}
|
|
82
|
+
await session.play(source, options);
|
|
83
|
+
}
|
|
84
|
+
pause(guildId) {
|
|
85
|
+
return this.sessions.get(guildId)?.pause() ?? false;
|
|
86
|
+
}
|
|
87
|
+
resume(guildId) {
|
|
88
|
+
return this.sessions.get(guildId)?.resume() ?? false;
|
|
89
|
+
}
|
|
90
|
+
stop(guildId) {
|
|
91
|
+
return this.sessions.get(guildId)?.stop() ?? false;
|
|
92
|
+
}
|
|
93
|
+
skip(guildId) {
|
|
94
|
+
return this.sessions.get(guildId)?.skip() ?? false;
|
|
95
|
+
}
|
|
96
|
+
setVolume(guildId, value) {
|
|
97
|
+
this.getOrCreateSession(guildId).setVolume(value);
|
|
98
|
+
}
|
|
99
|
+
getVolume(guildId) {
|
|
100
|
+
return this.getOrCreateSession(guildId).getVolume();
|
|
101
|
+
}
|
|
102
|
+
getQueue(guildId) {
|
|
103
|
+
const session = this.sessions.get(guildId);
|
|
104
|
+
return session ? session.getQueue() : [];
|
|
105
|
+
}
|
|
106
|
+
destroyAll() {
|
|
107
|
+
for (const [guildId, session] of this.sessions) {
|
|
108
|
+
session.destroy();
|
|
109
|
+
this.sessions.delete(guildId);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
getOrCreateSession(guildId) {
|
|
113
|
+
const existing = this.sessions.get(guildId);
|
|
114
|
+
if (existing)
|
|
115
|
+
return existing;
|
|
116
|
+
const created = new GuildVoiceSession_js_1.GuildVoiceSession({
|
|
117
|
+
guildId,
|
|
118
|
+
autoLeave: this.options.autoLeave,
|
|
119
|
+
autoLeaveDelayMs: this.options.autoLeaveDelayMs,
|
|
120
|
+
defaultVolume: this.options.defaultVolume,
|
|
121
|
+
});
|
|
122
|
+
this.sessions.set(guildId, created);
|
|
123
|
+
return created;
|
|
124
|
+
}
|
|
125
|
+
resolveGuildId(ctx) {
|
|
126
|
+
const guildId = ctx.guild?.id;
|
|
127
|
+
if (!guildId) {
|
|
128
|
+
throw new Error('Voice actions require a guild context.');
|
|
129
|
+
}
|
|
130
|
+
return guildId;
|
|
131
|
+
}
|
|
132
|
+
resolveAdapterCreator(guildId, ctx) {
|
|
133
|
+
const fromOptions = this.options.adapterProvider?.(guildId, ctx);
|
|
134
|
+
if (fromOptions)
|
|
135
|
+
return fromOptions;
|
|
136
|
+
const appWithVoiceAdapter = this.app;
|
|
137
|
+
if (typeof appWithVoiceAdapter.createVoiceAdapter === 'function') {
|
|
138
|
+
return appWithVoiceAdapter.createVoiceAdapter(guildId);
|
|
139
|
+
}
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
exports.VoiceManager = VoiceManager;
|
|
144
|
+
//# sourceMappingURL=VoiceManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VoiceManager.js","sourceRoot":"","sources":["../../../src/core/VoiceManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import './augmentations.js';
|
|
2
|
+
export { VoicePlugin } from './plugin/VoicePlugin.js';
|
|
3
|
+
export { VoiceManager } from './core/VoiceManager.js';
|
|
4
|
+
export type { ContextVoice, } from './core/VoiceManager.js';
|
|
5
|
+
export type { AudioSource, QueueTrack, VoiceJoinOptions, VoicePlayOptions, VoicePluginOptions, } from './types.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,YAAY,EACV,YAAY,GACb,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EACV,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VoiceManager = exports.VoicePlugin = void 0;
|
|
4
|
+
require("./augmentations.js");
|
|
5
|
+
var VoicePlugin_js_1 = require("./plugin/VoicePlugin.js");
|
|
6
|
+
Object.defineProperty(exports, "VoicePlugin", { enumerable: true, get: function () { return VoicePlugin_js_1.VoicePlugin; } });
|
|
7
|
+
var VoiceManager_js_1 = require("./core/VoiceManager.js");
|
|
8
|
+
Object.defineProperty(exports, "VoiceManager", { enumerable: true, get: function () { return VoiceManager_js_1.VoiceManager; } });
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,8BAA4B;AAE5B,0DAAsD;AAA7C,6GAAA,WAAW,OAAA;AACpB,0DAAsD;AAA7C,+GAAA,YAAY,OAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { App, AppPlugin } from 'discordjs-nextgen';
|
|
2
|
+
import { VoiceManager } from '../core/VoiceManager.js';
|
|
3
|
+
import type { VoicePluginOptions } from '../types.js';
|
|
4
|
+
export declare class VoicePlugin implements AppPlugin {
|
|
5
|
+
private readonly options;
|
|
6
|
+
name: string;
|
|
7
|
+
private _manager;
|
|
8
|
+
constructor(options?: VoicePluginOptions);
|
|
9
|
+
get manager(): VoiceManager;
|
|
10
|
+
setup(app: App): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=VoicePlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VoicePlugin.d.ts","sourceRoot":"","sources":["../../../src/plugin/VoicePlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAW,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,qBAAa,WAAY,YAAW,SAAS;IAI/B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,IAAI,SAA6B;IACjC,OAAO,CAAC,QAAQ,CAA6B;gBAEhB,OAAO,GAAE,kBAAuB;IAG7D,IAAI,OAAO,IAAI,YAAY,CAK1B;IAED,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;CAmBtB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VoicePlugin = void 0;
|
|
4
|
+
const VoiceManager_js_1 = require("../core/VoiceManager.js");
|
|
5
|
+
class VoicePlugin {
|
|
6
|
+
constructor(options = {}) {
|
|
7
|
+
this.options = options;
|
|
8
|
+
this.name = 'discordjs-nextgen-voice';
|
|
9
|
+
this._manager = null;
|
|
10
|
+
}
|
|
11
|
+
get manager() {
|
|
12
|
+
if (!this._manager) {
|
|
13
|
+
throw new Error('VoicePlugin is not initialized yet. Register it with app.use(new VoicePlugin()).');
|
|
14
|
+
}
|
|
15
|
+
return this._manager;
|
|
16
|
+
}
|
|
17
|
+
setup(app) {
|
|
18
|
+
const manager = new VoiceManager_js_1.VoiceManager(app, this.options);
|
|
19
|
+
this._manager = manager;
|
|
20
|
+
app.voice = manager;
|
|
21
|
+
app.use(async (ctx, next) => {
|
|
22
|
+
ctx.voice = manager.forContext(ctx);
|
|
23
|
+
await next();
|
|
24
|
+
});
|
|
25
|
+
app.on('guildDelete', ({ id }) => {
|
|
26
|
+
manager.leave(id);
|
|
27
|
+
});
|
|
28
|
+
app.on('error', () => {
|
|
29
|
+
// Keep voice lifecycle independent from core errors.
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.VoicePlugin = VoicePlugin;
|
|
34
|
+
//# sourceMappingURL=VoicePlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VoicePlugin.js","sourceRoot":"","sources":["../../../src/plugin/VoicePlugin.ts"],"names":[],"mappings":";;;AACA,6DAAuD;AAGvD,MAAa,WAAW;IAItB,YAA6B,UAA8B,EAAE;QAAhC,YAAO,GAAP,OAAO,CAAyB;QAH7D,SAAI,GAAG,yBAAyB,CAAC;QACzB,aAAQ,GAAwB,IAAI,CAAC;IAG7C,CAAC;IAED,IAAI,OAAO;QACT,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;QACtG,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,GAAQ;QACZ,MAAM,OAAO,GAAG,IAAI,8BAAY,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QAEvB,GAAW,CAAC,KAAK,GAAG,OAAO,CAAC;QAE7B,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAY,EAAE,IAAyB,EAAE,EAAE;YACvD,GAAW,CAAC,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC7C,MAAM,IAAI,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAkB,EAAE,EAAE;YAC/C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,qDAAqD;QACvD,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAjCD,kCAiCC"}
|