const {
Client,
GatewayIntentBits,
SlashCommandBuilder,
REST,
Routes
} = require('discord.js');
const {
joinVoiceChannel,
createAudioPlayer,
createAudioResource,
AudioPlayerStatus,
VoiceConnectionStatus,
getVoiceConnection
} = require('@discordjs/voice');
const ytdl = require('ytdl-core');
const YouTube = require('simple-youtube-api');
const {
generateDependencyReport
} = require('@discordjs/voice');
const OpusScript = require('opusscript');
console.log(generateDependencyReport());
const sodium = require('libsodium-wrappers');
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildVoiceStates
]
});
const youtube = new YouTube('');
const commands = [
new SlashCommandBuilder()
.setName('play')
.setDescription('Проигрывает музыкальный трек из YouTube')
.addStringOption(option =>
option.setName('query')
.setDescription('Поисковый запрос')
.setRequired(true))
].map(command => command.toJSON());
const rest = new REST({
version: '9'
}).setToken('');
(async () => {
try {
console.log('Начинаю обновление (/) команд.');
await rest.put(
Routes.applicationCommands(''), {
body: commands
},
);
console.log('Успешно зарегистрировал (/)-команды.');
} catch (error) {
console.error('Ошибка при регистрации команд:', error);
}
})();
client.on('ready', () => {
console.log(`Вошёл в систему как ${client.user.tag}!`);
});
async function searchYouTube(query) {
const searchResults = await youtube.searchVideos(query, 1).catch(console.error);
if (searchResults.length === 0) {
return [];
}
return [{
title: searchResults[0].title,
url: `https://www.youtube.com/watch?v=${searchResults[0].id}`
}];
}
client.on('interactionCreate', async (interaction) => {
if (!interaction.isCommand()) return;
const {
commandName
} = interaction;
if (commandName === 'play') {
try {
await interaction.deferReply();
const voiceChannel = interaction.member.voice.channel;
if (!voiceChannel) {
await interaction.editReply('Пожалуйста, присоединитесь к голосовому каналу, чтобы использовать эту команду.');
return;
}
const searchQuery = interaction.options.getString('query');
console.log(`Поисковый запрос: ${searchQuery}`);
const videos = await searchYouTube(searchQuery);
if (videos.length === 0) {
await interaction.editReply('Не удалось найти видео по вашему запросу.');
return;
}
console.log(`Найденное видео: ${videos[0].title}, URL: ${videos[0].url}`);
const connection = joinVoiceChannel({
channelId: voiceChannel.id,
guildId: voiceChannel.guild.id,
adapterCreator: voiceChannel.guild.voiceAdapterCreator,
});
connection.on(VoiceConnectionStatus.Ready, () => {
console.log('Бот присоединился к голосовому каналу.');
});
connection.on(VoiceConnectionStatus.Disconnected, () => {
console.log('Соединение разорвано и уничтожено.');
connection.destroy();
});
function play(resource, player, connection) {
player.play(resource);
connection.subscribe(player);
player.on('error', async error => {
console.error('Ошибка плеера:', error);
if (!interaction.replied) {
await interaction.editReply('Произошла ошибка при воспроизведении музыки. Повторная попытка.');
}
const newStream = ytdl(videos[0].url, {
filter: 'audioonly'
});
const newResource = createAudioResource(newStream);
play(newResource, player, connection);
});
player.on(AudioPlayerStatus.Idle, async () => {
if (!interaction.replied) {
await interaction.editReply('Воспроизведение музыки завершено.');
}
connection.disconnect();
connection.destroy();
});
player.on(AudioPlayerStatus.Playing, () => {
console.log('Музыка играет.');
});
}
const stream = ytdl(videos[0].url, {
filter: 'audioonly'
});
const resource = createAudioResource(stream);
const player = createAudioPlayer();
await interaction.editReply(`Воспроизведение: ${videos[0].title}`);
play(resource, player, connection);
} catch (error) {
console.error('Ошибка при обработке команды:', error);
await interaction.editReply('Произошла ошибка')
}
}
})
client.login("");