-
Notifications
You must be signed in to change notification settings - Fork 0
/
music.js
139 lines (109 loc) · 3.35 KB
/
music.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
const API_KEY = "<my API Key>";
var discord = require("discord.js");
var ytdl = require('ytdl-core');
var request = require('superagent');
var bot = new discord.Client();
var voiceChannel = null;
var ytAudioQueue = [];
bot.on('ready', function() {
console.log('I am ready');
});
bot.on('message', function(message) {
var messageParts = message.content.split(' ');
var command = messageParts[0].toLowerCase();
var parameters = messageParts.splice(1, messageParts.length);
console.log("command: " + command);
console.log("parameters: " + parameters);
switch (command) {
case "hi":
message.reply("Hey there!");
break;
case "*help":
HelpCommand(message);
break;
case "*join":
message.reply("Attempting to join channel: " + parameters[0]);
JoinCommand(parameters[0], message);
break;
case "*play":
PlayCommand(parameters.join(" "), message);
break;
}
});
voiceChannel.on('speaking', (user, speaking) => {
// the audio has finished playing, so remove it from the queue and start playing the next song
if (!speaking && ytAudioQueue.length > 1) {
ytAudioQueue.pop();
if (voiceChannel == null) {
JoinCommand(bot.channels.find(val => val.type === 'voice').name).then(function() {
PlayStream(ytAudioQueue.first);
});
}
else {
PlayStream(ytAudioQueue.first);
}
}
});
/* COMMAND HANDLERS */
/// lists out all of the bot commands
function HelpCommand(originalMessage) {
originalMessage.reply("*join <channel-to-join> - Connects to bot to a channel by channel name");
originalMessage.reply("*play <YouTube search term> - Plays audio from YouTube based on the search term");
}
/// plays audio based on results from youtube search
function PlayCommand(searchTerm) {
//bot.sendMessage("Searching Youtube for audio...");
YoutubeSearch(searchTerm);
}
/// joins the bot to the specified voice channel
function JoinCommand(channelName) {
if (voiceChannel) {
voiceChannel.disconnet();
}
var voiceChannel = GetChannelByName(channelName);
return voiceChannel.join();
}
/* END COMMAND HANDLERS */
/* HELPER METHODS */
/// returns the channel that matches the name provided
function GetChannelByName(name) {
var channel = bot.channels.find(val => val.name === name);
return channel;
}
function YoutubeSearch(searchKeywords) {
var requestUrl = 'https://www.googleapis.com/youtube/v3/search' + `?part=snippet&q=${escape(searchKeywords)}&key=${API_KEY}`;
request(requestUrl, (error, response) => {
if (!error && response.statusCode == 200) {
var body = response.body;
if (body.items.length == 0) {
console.log("Your search gave 0 results");
return videoId;
}
for (var item of body.items) {
if (item.id.kind === 'youtube#video') {
QueueYtAudioStream(item.id.videoId);
}
}
}
else {
console.log("Unexpected error when searching YouTube");
return null;
}
});
return null;
}
/// Queues result of Youtube search into stream
function QueueYtAudioStream(videoId) {
var streamUrl = `https://www.youtube.com/watch?v=${videoId}`;
ytAudioQueue.push(streamUrl);
}
// plays a given stream
function PlayStream(streamUrl) {
const streamOptions = {seek: 0, volume: 1};
console.log("Streaming audio from " + streamUrl);
if (streamUrl) {
const stream = ytdl(streamUrl, {filter: 'audioonly'});
const dispatcher = bot.voiceConnections.first().playStream(stream, streamOptions);
}
}
/* END HELPER METHODS */