Skip to content

Commit af38f9d

Browse files
authored
Merge pull request #51 from Sobhan-SRZA/v0.0.0
0.0.0-discord-player
2 parents 4ef10d1 + 74222c7 commit af38f9d

File tree

3 files changed

+62
-58
lines changed

3 files changed

+62
-58
lines changed

index.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ client.token = config.discord.token;
6565
client.commands = new Collection();
6666
client.cooldowns = new Collection();
6767

68+
// Discord Player Setup
69+
const { DefaultExtractors } = require("@discord-player/extractor");
70+
const { Player } = require("discord-player");
71+
const player = new Player(client);
72+
(async () => {
73+
await player.extractors.loadMulti(DefaultExtractors);
74+
})();
75+
6876
// Load Handlers
6977
let count = 0;
7078
post(

package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "radio-bot",
3-
"version": "0.0.0",
3+
"version": "0.0.0-discord-player",
44
"description": "This is an advanced radio bot for Discord voice channels, allowing users to enjoy a wide variety of trending online radios with high quality and seamless performance.",
55
"main": "index.js",
66
"scripts": {
@@ -9,13 +9,17 @@
99
"author": "Sobhan-SRZA (mr.sinre) && Persian Caesar",
1010
"license": "BSD-3-Clause",
1111
"dependencies": {
12+
"@discord-player/extractor": "^7.0.0-dev.3",
1213
"@discordjs/voice": "^0.17.0",
1314
"cli-color": "^2.0.4",
15+
"discord-player": "^7.0.0-dev.3",
1416
"discord.js": "^14.16.2",
1517
"dotenv": "^16.4.5",
1618
"ffmpeg-static": "^5.2.0",
1719
"libsodium-wrappers": "^0.7.14",
20+
"mediaplex": "^1.0.0",
1821
"opusscript": "^0.0.8",
22+
"prism-media": "^1.3.5",
1923
"quick.db": "^9.1.7",
2024
"write-file-atomic": "^5.0.1"
2125
}

src/functions/player.js

Lines changed: 49 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
const
23
{
34
joinVoiceChannel,
@@ -7,8 +8,13 @@ const
78
getVoiceConnection
89
} = require("@discordjs/voice"),
910
chooseRandom = require("./chooseRandom"),
11+
{
12+
useMainPlayer,
13+
QueueRepeatMode,
14+
useQueue,
15+
getVoiceConnections
16+
} = require("discord-player"),
1017
audioPlayer = new Map(),
11-
// queue = new Map(),
1218
audioPlayerData = {
1319
behaviors: {
1420
maxMissedFrames: Math.round(5000 / 20),
@@ -99,7 +105,7 @@ module.exports = class {
99105
* @returns {getVoiceConnection}
100106
*/
101107
get connection() {
102-
return getVoiceConnection(this.data.guildId);
108+
return getVoiceConnections().get(this.data.guildId);
103109
}
104110

105111
/**
@@ -118,8 +124,8 @@ module.exports = class {
118124
* @returns {number}
119125
*/
120126
get volume() {
121-
const player = audioPlayer.get(this.data.guildId);
122-
return Number(player.state.resource.volume.volume);
127+
const queue = (useMainPlayer()).queues.cache.get(this.data.guildId);
128+
return Number(queue.node.volume);
123129
}
124130

125131
/**
@@ -128,12 +134,10 @@ module.exports = class {
128134
* @returns {number}
129135
*/
130136
setVolume(input) {
131-
const player = audioPlayer.get(this.data.guildId);
137+
const queue = (useMainPlayer()).queues.cache.get(this.data.guildId);
132138
if (input <= 100 && input >= 0)
133-
player.state.resource.volume.volume = input / 100;
139+
queue.node.setVolume(input);
134140

135-
const connection = joinVoiceChannel(this.data);
136-
connection.subscribe(player);
137141
return Number(this.volume);
138142
}
139143

@@ -142,18 +146,13 @@ module.exports = class {
142146
* @returns {void}
143147
*/
144148
pause() {
145-
const connection = joinVoiceChannel(this.data);
146-
const player = audioPlayer.get(this.data.guildId);
147-
if (this.isPaused())
148-
player.unpause();
149+
const queue = (useMainPlayer()).queues.cache.get(this.data.guildId);
150+
if (queue.node.isPaused())
151+
queue.node.resume();
149152

150153
else
151-
player.pause();
152-
153-
// if (!this.isPaused())
154-
// player.pause();
154+
queue.node.pause();
155155

156-
connection.subscribe(player);
157156
return this;
158157
}
159158

@@ -162,12 +161,10 @@ module.exports = class {
162161
* @returns {void}
163162
*/
164163
resume() {
165-
const connection = joinVoiceChannel(this.data);
166-
const player = audioPlayer.get(this.data.guildId);
167-
if (this.isPaused())
168-
player.unpause();
164+
const queue = (useMainPlayer()).queues.cache.get(this.data.guildId);
165+
if (queue.node.isPaused())
166+
queue.node.resume();
169167

170-
connection.subscribe(player);
171168
return this;
172169
}
173170

@@ -176,8 +173,8 @@ module.exports = class {
176173
* @returns {boolean}
177174
*/
178175
isPaused() {
179-
const player = audioPlayer.get(this.data.guildId);
180-
if (player.state.status === "paused")
176+
const queue = (useMainPlayer()).queues.cache.get(this.data.guildId);
177+
if (queue.node.isPaused())
181178
return true;
182179

183180
else return false;
@@ -188,13 +185,10 @@ module.exports = class {
188185
* @returns {void}
189186
*/
190187
stop() {
191-
const connection = getVoiceConnection(this.data.guildId);
192-
const player = audioPlayer.get(this.data.guildId);
188+
const queue = (useMainPlayer()).queues.cache.get(this.data.guildId);
193189
try {
194-
player.stop();
195-
audioPlayer.delete(this.data.guildId);
190+
queue.delete();
196191
} catch { }
197-
connection.destroy();
198192
return this;
199193
}
200194

@@ -204,34 +198,32 @@ module.exports = class {
204198
* @returns {import("@discordjs/voice").AudioResource}
205199
*/
206200
async radio(resources) {
207-
const connection = joinVoiceChannel(this.data);
208-
const player = createAudioPlayer(audioPlayerData);
209-
// resources
210-
// .forEach((re, index) => queue.set(++index, re));
211-
212-
// let count = 1;
213-
// if (queue.size < 1)
214-
// throw this.#error("No resource to play!");
215-
216-
player.play(
217-
createAudioResource(await this.#createStream(chooseRandom(resources)), audioResourceData)
218-
);
219-
connection.subscribe(player);
220-
audioPlayer.set(this.data.guildId, player);
221-
player.on("debug", async (e) => {
222-
const [oldStatus, newStatus] = e.replace("state change:", "").split("\n").map(value => value.replace("from", "").replace("to", "").replaceAll(" ", "")).filter(value => value !== "").map(value => JSON.parse(value));
223-
if (newStatus.status === "idle") {
224-
player.play(
225-
// createAudioResource(await this.#createStream(queue.get(++count)), audioResourceData)
226-
createAudioResource(await this.#createStream(chooseRandom(resources)), audioResourceData)
227-
);
228-
// if (count === queue.size) count = 1;
229-
230-
connection.subscribe(player);
231-
audioPlayer.set(this.data.guildId, player);
232-
return this;
233-
}
234-
})
201+
try {
202+
const player = useMainPlayer();
203+
const play = async () => {
204+
try {
205+
const query = (await fetch(chooseRandom(resources))).url;
206+
await player.play(this.data.channelId, query, {
207+
nodeOptions: {
208+
pauseOnEmpty: true,
209+
selfDeaf: true,
210+
volume: 100,
211+
leaveOnEmpty: false,
212+
leaveOnEnd: false,
213+
leaveOnStop: true,
214+
repeatMode: QueueRepeatMode.QUEUE
215+
}
216+
});
217+
} catch {
218+
await play();
219+
}
220+
};
221+
await play();
222+
player.events.on("emptyQueue", await play());
223+
player.events.on("playerError", await play());
224+
player.events.on("error", await play());
225+
player.events.on("connectionDestroyed", await play());
226+
} catch { }
235227
return this;
236228
}
237229

0 commit comments

Comments
 (0)