Skip to content

Instantly share code, notes, and snippets.

@idaspin idaspin/Server.js Secret
Last active Dec 15, 2018

Embed
What would you like to do?
const Discord = require('discord.js');
const client = new Discord.Client();
const config = require("./config.json");
// Либы для плеера
const fs = require('fs');
const yt = require('ytdl-core');
const searchYoutube = require('youtube-api-v3-search');
var radio_channels = null;
var queue = {};
client.on("ready", () => {
// Загрузка списка url на Youtube музыкальные стримы в массив radio_channels
getRadioChannels()
.then(()=> {
// Подключаю бота к голосовому каналу
joinBot();
// Вызов checkTime через час для остановки Радио, если его никто не слушает. Также используется для доп. задач.
var now = new Date();
client.setTimeout(checkTime, (59 - now.getUTCMinutes()) * 60 * 1000);
}
});
client.on('message', async message => {
let command = message.content.toLowerCase().slice(config.prefix.length).split(' ')[0];
// commands[14] представляет из себя ['радио','плеер','музыка',...]
if (commands[14].includes(command)){
getPlayer(message);
}
});
// здесь распределяю суб команды
function getPlayer(msg) {
const args = msg.content.slice(config.prefix.length).trim().split(/ +/g);
// Запуск радио
if (commands[0].includes(args[1])) {
radioTojpsplay(msg);
// Добавить трек
} else if (commands[1].includes(args[1])) {
radioTojpsadd(msg);
// Подключить к голосовому каналу
} else if (commands[2].includes(args[1])) {
radioTojpsjoin(msg);
// Показать очередь
} else if (commands[3].includes(args[1])) {
radioTojpsqueue(msg);
// Добавить заготовленный трек (youtube стрим 24/7 с музыкой) и запустить
} else if (commands[4].includes(args[1])) {
radioTojpschannel(msg);
// Если радио играет, на текстовом канале 431843705167544332 бот отдельно реагирует на сл. команды через collector. Потому здесь Бот должен игнорировать их.
} else if (queue[client.guilds.first().id].playing && msg.channel.id == 431843705167544332) {
if (commands[5].includes(args[1])) {
// do nothing
} else if (commands[6].includes(args[1])) {
// do nothing
} else if (commands[7].includes(args[1])) {
// do nothing
} else if (commands[8].includes(args[1])) {
// do nothing
} else if (commands[9].includes(args[1])) {
// do nothing
} else {
msg.reply(`Если радио не играет, введи \`${config.prefix}${commands[14][0]} запуск\`. Проверить плейлист: \`${config.prefix}${commands[14][0]} очередь\`. Выбрать канал радио: \`${config.prefix}${commands[14][0]} ${commands[4][0]}\`. Если бот покинул голосовой канал: \`${config.prefix}${commands[14][0]} подключить\`. Ну а, чтобы добавить трек введи \`${config.prefix}${commands[14][0]} добавить\` и ссылку на видео в конце через пробел.`);
}
} else {
msg.reply(`Если радио не играет, введи \`${config.prefix}${commands[14][0]} запуск\`. Проверить плейлист: \`${config.prefix}${commands[14][0]} очередь\`. Выбрать канал радио: \`${config.prefix}${commands[14][0]} ${commands[4][0]}\`. Если бот покинул голосовой канал: \`${config.prefix}${commands[14][0]} подключить\`. Ну а, чтобы добавить трек введи \`${config.prefix}${commands[14][0]} добавить\` и ссылку на видео в конце через пробел.`);
}
}
function checkTime() {
var now2 = new Date();
// Голосовой канал для Радио
var channel = client.channels.find(x => x.id === '451433414516801557');
let count = channel.members.size;
// Свой способ вывода логов
devLog(1, `В голосовом канале \`${channel.name}\` ${count} слушателей.`);
if (count <= 1) {
devLog(1, `\"Радио 24/7\" выключено.`);
// todo выключение бота
}
var tm = (59 - now2.getUTCMinutes() == 0 ? 60 : 59 - now2.getUTCMinutes()) * 60 * 1000;
client.setTimeout(checkTime, tm);
}
// Подключения бота к голосовому каналу
function joinBot() {
channel = client.channels.find(x => x.name === 'Радио 24/7');
channel.join();
devLog(1, `Бот был подключен к голосовому каналу \"Радио 24/7\".`);
channel.overwritePermissions(client.guilds.first().roles.find(x => x.name === "Призраки"), {
'VIEW_CHANNEL': true
});
// client.channels.get("431843705167544332").send(`Радио включено! Для прослушивания нужно подключиться к одноименному голосовому каналу. Для просмотра настроек, используй команду`+"`"+`!радио`+"`");
//botIsOn = true;
}
// Отключение бота от голосового канала
function discBot() {
channel = client.channels.find(x => x.name === 'Радио 24/7');
channel.leave();
devLog(1, `Бот был отключен от голосового канала \"Радио 24/7\".`);
channel.overwritePermissions(client.guilds.first().roles.find(x => x.name === "Призраки"), {
'VIEW_CHANNEL': false
});
//client.channels.get("431843705167544332").send(`Радио выключено!`);
//botIsOn = false;
}
// Функция запуска радио
function radioTojpsplay(msg) {
let dispatcher;
let channel = client.channels.find(x => x.id === '451433414516801557');
let count = channel.members.size;
console.log('Кол-во человек на канале - '+count);
if (count <= 1) {
// Если на канале только Бот, и ни один трек не играет
if (queue[client.guilds.first().id] === undefined) {
// do nothing
// just
// return;
}
// Если на канале только Бот, а очередь не пуста - нужно выключить Радио
if (queue[client.guilds.first().id] != undefined) {
queue[client.guilds.first().id].playing = false;
//discBot();
}
} else {
// Раз на канале кроме Бота есть кто-то, следует включить радио предварительно добавив дефолтный трек в очередь
if (queue[client.guilds.first().id] === undefined) {
return radioTojpsadddef(msg).then(() => {
radioTojpsplay(msg);
});
}
}
if (queue[client.guilds.first().id].playing) return msg.channel.send('Радио уже тип играет. Попробуй команду `!радио канал 1`');
if (!client.guilds.first().voiceConnection) return radioTojpsjoin(msg).then(() => play(song));
queue[client.guilds.first().id].playing = true;
(function play(song) {
devLog(1, `Была вызвана команда проигрывания трека. В качестве объекта песни отправлено: ${song.url}`);
if (song === undefined) return devLog(1, 'Очередь пуста').then(() => {
let channel = client.channels.find(x => x.id === '451433414516801557');
let count = channel.members.size;
if (count <= 1) {
queue[client.guilds.first().id].playing = false;
discBot();
} else {
radioTojpsadddef(msg).then(() => {
let song = queue[client.guilds.first().id].songs.shift();
play(song);
});
}
}); // 503429965937901588 - #заказ музыки
client.channels.get("503429965937901588").send(`Играет: **${song.title}** по запросу от: **${song.requester}**`);
dispatcher = client.guilds.first().voiceConnection.playStream(yt(song.url, { audioonly: true }), { passes : config.passes });
let collector = client.channels.get("503429965937901588").createCollector(m => m);
collector.on('collect', m => {
if (m.author.bot) return;
if (m.channel.type == "dm") return;
const args = m.content.slice(config.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
const mesg = args.join(" ");
if (commands[14].includes(command)) {
if (commands[5].includes(args[0])) {
m.channel.send('Воспроизведение приостановлено.').then(() => {dispatcher.pause();});
} else if (commands[6].includes(args[0])) {
m.channel.send('Воспроизведение продолжилось.').then(() => {dispatcher.resume();});
} else if (commands[7].includes(args[0])) {
if (queue[client.guilds.first().id] === undefined) return msg.channel.send(`Сначала добавь пару треков в очередь с командой \`${config.prefix}${commands[14][0]} добавить\``);
var k = 0;
queue[client.guilds.first().id].songs.forEach((song, i) => {
k++;
});
if (k != 0) {
m.channel.send('Трек пропущен.').then(() => {dispatcher.end();});
} else {
m.channel.send(`Сначала добавь пару треков в очередь с командой \`${config.prefix}${commands[14][0]} добавить\``);
}
} else if (commands[8].includes(args[0])) {
m.channel.send(`Время трека: ${Math.floor(dispatcher.time / 60000)}:${Math.floor((dispatcher.time % 60000)/1000) <10 ? '0'+Math.floor((dispatcher.time % 60000)/1000) : Math.floor((dispatcher.time % 60000)/1000)}`);
} else if (commands[9].includes(args[0])) {
// do nothing
} else {
m.reply(`На данный момент, на этом канале доступны команды: \`${config.prefix}${commands[14][0]} пауза\`, \`${config.prefix}${commands[14][0]} продолжить\`, \`${config.prefix}${commands[14][0]} пропуск\`, \`${config.prefix}${commands[14][0]} время\`, `);
}
}
});
dispatcher.on('end', () => {
collector.stop();
play(queue[client.guilds.first().id].songs.shift());
/*collector.stop();
let sng = queue[client.guilds.first().id].songs.shift();
let channel = client.channels.find(x => x.id === '451433414516801557');
let count = channel.members.size;
collector.stop();
if (count <= 1) {
//play(queue[client.guilds.first().id].songs.shift());
} else {
if (sng === undefined) {
radioTojpsadddef(msg).then(()=>{
if (queue[client.guilds.first().id].playing != true) {
radioTojpsplay(msg);
}
});
} else {
play(queue[client.guilds.first().id].songs.shift());
}
}
devLog(1, `Трек завершен, в качестве трека отправляю: ${sng.url}`);
*/
});
dispatcher.on('error', (err) => {
return msg.channel.sendMessage('Ошибка: ' + err).then(() => {
collector.stop();
play(queue[client.guilds.first().id].songs.shift());
});
});
})(queue[client.guilds.first().id].songs.shift());
}
function radioTojpsjoin(msg) {
return new Promise((resolve, reject) => {
joinBot();
msg.channel.send(`Принял. Подключился и готов к работе.`);
resolve();
});
}
function radioTojpsadd(msg) {
return new Promise((resolve, reject) => {
var url = msg.content.split(' ')[2];
if (url == '' || url === undefined) return msg.channel.send(`Тебе следовало добавить URL на видео с Youtube, или хотя бы указать id'шник...`);
yt.getInfo(url, {downloadURL: true}, function(err, info) {
if (err) {
var args = msg.content.slice(config.prefix.length).trim().split(" ");
args.splice(0, 2);
var mesg = args.join(" ");
console.log(mesg);
var options = {
q:mesg,
part:'snippet',
type:'video'
};
searchYoutube(config.youtube_api_key,options, function(err, result){
if (err) {
reject(err +" emm " +JSON.stringify(info));
} else {
url = result.items[0].id.videoId;
}
radioTojpsAddUrl(url, msg.author.username).then(resolve()).catch((err)=>reject(err));
});
}
});
});
}
function radioTojpschannel(msg) {
return new Promise((resolve, reject) => {
var args = msg.content.slice(config.prefix.length).trim().split(/ +/g);
if (args[2] != null) {
var url;
radio_channels.forEach(element => {
if (element[`tags`].split(",").includes(args[2])) {
url = element[`url`];
//current_channel = parseInt(element[`tags`].substr(0, element[`tags`].indexOf(',')));
}
});
radioTojpsAddUrl(url, msg.author.username).then(()=>{
/*if (dispatcher != null && dispatcher != undefined) {
dispatcher.end();
}
if (queue[client.guilds.first().id].playing != true) {
radioTojpsplay(msg);
}
resolve();*/
}).catch((err)=>reject(err));
} else {
var gms = "";
radio_channels.forEach(function(item2, i2, radio_channels) {
if (i2 != 0) {
gms += ", ";
}
gms += "`"+item2.tags+"`";
});
msg.reply(`Тебе нужно ввести ключ канала через пробел после команды \`${config.prefix}${commands[14][0]} ${commands[4][0]}\` плюс `+gms);
}
});
}
function radioTojpsadddef(msg) {
return new Promise((resolve, reject) => {
let url = radio_channels[0][`url`];
current_channel = radio_channels[0][`tags`].substr(0, radio_channels[0][`tags`].indexOf(','));
radioTojpsAddUrl(url, msg.author.username).then(()=>{resolve()}).catch((err)=>{reject(err);});
});
}
function radioTojpsqueue(msg) {
if (queue[client.guilds.first().id] === undefined) return msg.channel.send(`Сначала добавь пару треков в очередь с командой \`${config.prefix}${commands[14][0]} добавить\``);
let tosend = [];
queue[client.guilds.first().id].songs.forEach((song, i) => {
tosend.push(`${i+1}. ${song.title} - От: ${song.requester}`);
});
msg.channel.send(`В муз. очереди **${msg.guild.name}:** на данный момент **${tosend.length}** трек ${(tosend.length > 15 ? '*[Показаны только ближайшие 15]*' : '')}\n\`\`\` ${tosend.slice(0,15).join('\n')}\`\`\``);
}
function radioTojpsAddUrl(url, author) {
return new Promise((resolve, reject) => {
yt.getInfo(url, {downloadURL: true}, function(err, info) {
if (err || JSON.stringify(info) === "undefined") {
devLog(0, 'Не могу распознать здесь ССЫЛКУ или ID\'шник: ' + err);
reject(err);
} else {
if (!queue.hasOwnProperty(client.guilds.first().id)) queue[client.guilds.first().id] = {}, queue[client.guilds.first().id].playing = false, queue[client.guilds.first().id].songs = [];
var mtitle = "Я хз что за трек:[";
if (info != undefined && info.title != undefined) {
mtitle = info.title;
}
queue[client.guilds.first().id].songs.push({url: url, title: mtitle, requester: author});
client.channels.get("503429965937901588").send(`**${info.title}** добавил в очередь. Если играет радио, просто введи \`${config.prefix}${commands[14][0]} запуск\` или \`${config.prefix}${commands[14][0]} пропуск\`.`);
devLog(1, `**${info.title}** добавил в очередь. Если играет радио, просто введи \`${config.prefix}${commands[14][0]} запуск\` или \`${config.prefix}${commands[14][0]} пропуск\`.`);
/*if (dispatcher != null && dispatcher != undefined) {
dispatcher.end();
}*/
resolve();
}
});
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.