All files except node_modules
This commit is contained in:
parent
d3252fad5d
commit
505e52701f
1020
package-lock.json
generated
Normal file
1020
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
11
package.json
Normal file
11
package.json
Normal file
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"dependencies": {
|
||||
"@discordjs/opus": "^0.9.0",
|
||||
"@discordjs/voice": "^0.17.0",
|
||||
"discord.js": "^14.15.2",
|
||||
"node-fetch": "^3.3.2",
|
||||
"prism-media": "^1.3.5",
|
||||
"sodium": "^3.0.2",
|
||||
"ytdl-core": "^4.11.5"
|
||||
}
|
||||
}
|
101
src/bot.js
Normal file
101
src/bot.js
Normal file
|
@ -0,0 +1,101 @@
|
|||
const config = require('./config.json')
|
||||
const Discord = require('discord.js');
|
||||
const dVC = require('@discordjs/voice');
|
||||
const prism = require('prism-media');
|
||||
const fs = require('fs');
|
||||
|
||||
const client = new Discord.Client({
|
||||
intents: [
|
||||
"Guilds",
|
||||
"GuildMessages",
|
||||
"MessageContent",
|
||||
"GuildVoiceStates",
|
||||
],
|
||||
});
|
||||
|
||||
const prefix = '!';
|
||||
|
||||
client.once('ready', () => {
|
||||
console.log('Bot is ready!');
|
||||
});
|
||||
|
||||
client.on('messageCreate', async message => {
|
||||
if (!message.content.startsWith(prefix) || message.author.bot) return;
|
||||
|
||||
const args = message.content.slice(prefix.length).trim().split(/ +/);
|
||||
const command = args.shift().toLowerCase();
|
||||
|
||||
console.log(`Received command: ${command}`); // Log the received command
|
||||
|
||||
if (command === 'livestream') {
|
||||
const voiceChannel = message.member.voice.channel;
|
||||
|
||||
if (!voiceChannel) {
|
||||
return message.reply('You need to be in a voice channel to use this command!');
|
||||
}
|
||||
|
||||
fs.readFile('./src/streams/stream.m3u', 'utf8', (err, data) => {
|
||||
if (err) {
|
||||
console.error(`Error occurred: ${err}`);
|
||||
return;
|
||||
}
|
||||
|
||||
// Split the file by newlines and filter out any empty lines
|
||||
const lines = data.split('\n').filter(line => line.trim() !== '');
|
||||
|
||||
// Assume the first line is a URL to an M3U livestream
|
||||
const streamURL = lines[0];
|
||||
|
||||
console.log(`Playing stream: ${streamURL}`);
|
||||
JoinChannel(voiceChannel, 'https://icecast.thisisdax.com/ClassicFM', 2);
|
||||
}
|
||||
) }
|
||||
});
|
||||
|
||||
function JoinChannel(channel, track, volume) {
|
||||
const connection = dVC.joinVoiceChannel({
|
||||
channelId: channel.id,
|
||||
guildId: channel.guild.id,
|
||||
adapterCreator: channel.guild.voiceAdapterCreator,
|
||||
selfDeaf: true
|
||||
});
|
||||
|
||||
|
||||
const resource = dVC.createAudioResource(track, {inlineVolume: true, silencePaddingFrames: 5});
|
||||
const player = dVC.createAudioPlayer();
|
||||
resource.volume.setVolume(2);
|
||||
connection.subscribe(player)
|
||||
player.play(resource);
|
||||
|
||||
connection.on(dVC.VoiceConnectionStatus.Ready, () => {console.log("ready"); player.play(resource);})
|
||||
connection.on(dVC.VoiceConnectionStatus.Disconnected, async (oldState, newState) => {
|
||||
try {
|
||||
console.log("Disconnected.")
|
||||
await Promise.race([
|
||||
dVC.entersState(connection, VoiceConnectionStatus.Signalling, 5_000),
|
||||
dVC.entersState(connection, VoiceConnectionStatus.Connecting, 5_000),
|
||||
]);
|
||||
} catch (error) {
|
||||
connection.destroy();
|
||||
}
|
||||
});
|
||||
player.on('error', error => {
|
||||
console.error(`Error: ${error.message} with resource ${error.resource.metadata.title}`);
|
||||
player.stop();
|
||||
});
|
||||
player.on(dVC.AudioPlayerStatus.Playing, () => {
|
||||
console.log('The audio player has started playing!');
|
||||
});
|
||||
player.on('idle', () => {
|
||||
connection.destroy();
|
||||
})
|
||||
}
|
||||
|
||||
function LeaveVoiceChannel(channel) {
|
||||
// Get resource, player, etc, and destroy them
|
||||
const connection = dVC.getVoiceConnection(channel.guild.id);
|
||||
if (connection) {
|
||||
connection.destroy();
|
||||
}
|
||||
}
|
||||
client.login(config.token).catch(error => console.error(`Login error: ${error}`)); // Log any login errors
|
50
src/commands/livestream.js
Normal file
50
src/commands/livestream.js
Normal file
|
@ -0,0 +1,50 @@
|
|||
const { Readable } = require('stream');
|
||||
const { createReadStream } = require('fs');
|
||||
const { join } = require('path');
|
||||
const { createAudioResource, createAudioPlayer, joinVoiceChannel, AudioPlayerStatus } = require('@discordjs/voice');
|
||||
|
||||
module.exports = {
|
||||
name: 'livestream',
|
||||
description: 'Plays the audio from the m3u stream in a voice channel',
|
||||
async execute(message) {
|
||||
// Check if the user is in a voice channel
|
||||
if (!message.member.voice.channel) {
|
||||
return message.reply('You need to be in a voice channel to use this command!');
|
||||
}
|
||||
|
||||
// Join the voice channel
|
||||
const connection = joinVoiceChannel({
|
||||
channelId: message.member.voice.channel.id,
|
||||
guildId: message.guild.id,
|
||||
adapterCreator: message.guild.voiceAdapterCreator,
|
||||
});
|
||||
|
||||
// Read the m3u stream file
|
||||
const streamPath = join(__dirname, '..', 'streams', 'stream.m3u');
|
||||
const streamFile = createReadStream(streamPath);
|
||||
|
||||
// Create a readable stream from the file
|
||||
const stream = new Readable();
|
||||
stream._read = () => {};
|
||||
stream.push(streamFile);
|
||||
stream.push(null);
|
||||
|
||||
// Create an audio resource from the stream
|
||||
const resource = createAudioResource(stream);
|
||||
|
||||
// Create an audio player and play the resource
|
||||
const player = createAudioPlayer();
|
||||
player.play(resource);
|
||||
|
||||
// Subscribe the player to the connection
|
||||
connection.subscribe(player);
|
||||
|
||||
// Wait for the player to finish playing
|
||||
await new Promise((resolve) => {
|
||||
player.on(AudioPlayerStatus.Idle, () => {
|
||||
connection.destroy();
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
},
|
||||
};
|
3
src/config.json
Normal file
3
src/config.json
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"token": "InsertTokenHere"
|
||||
}
|
1
src/streams/stream.m3u
Normal file
1
src/streams/stream.m3u
Normal file
|
@ -0,0 +1 @@
|
|||
http://icecast.thisisdax.com/ClassicFMMP3.m3u
|
Loading…
Reference in a new issue