summaryrefslogtreecommitdiff
path: root/dist/commands/voice/play.js
blob: b0a624b319989253a764a7ea17fa3bf91abc5484 (plain) (blame)
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
const ytdl = require('ytdl-core');
const { Command } = require('discord.js-commando');
const { MessageEmbed } = require('discord.js');
const Youtube = require('simple-youtube-api');
const { youtubeAPI } = require('../../config.json');
const youtube = new Youtube('AIzaSyB9xJENORzZt-GmOGx4WsNCPgKSIxhJcds');
const emoji = require('emoji-random');
module.exports = class PlayVoice extends Command {
    constructor(client) {
        super(client, {
            name: 'play',
            group: 'voice',
            memberName: 'play',
            description: 'play a youtube video',
            guildOnly: true,
            clientPermissions: ['SPEAK', 'CONNECT'],
            args: [
                {
                    key: 'query',
                    prompt: 'what song u wanna hear?',
                    type: 'string',
                    validate: function (query) {
                        return query.length > 0 && query.length < 200;
                    }
                }
            ],
            examples: [
                's5n!play https://www.youtube.com/watch?v=dQw4w9WgXcQ',
                's5n!play despacito'
            ]
        });
    }
    run(msg, { query }) {
        return __awaiter(this, void 0, void 0, function* () {
            const voiceChannel = msg.member.voice.channel;
            if (!voiceChannel)
                return msg.say('join a channel and try again ' + emoji.random());
            if (query.match(/^(?!.*\?.*\bv=)https:\/\/www\.youtube\.com\/.*\?.*\blist=.*$/)) {
                const playlist = yield youtube.getPlaylist(query).catch(function () {
                    return msg.say('playlist is either private or it does not exist ' + emoji.random());
                });
                const videosObj = yield playlist.getVideos(10).catch(function () {
                    return msg.say('there was a problem getting one of the videos in the playlist ' + emoji.random());
                });
                for (let i = 0; i < videosObj.length; i++) {
                    const video = yield videosObj[i].fetch();
                    msg.guild.musicData.queue.push(this.constructSongObj(video, voiceChannel));
                }
                if (msg.guild.musicData.isPlaying == false) {
                    msg.guild.musicData.isPlaying = true;
                    return this.playSong(msg.guild.musicData.queue, msg);
                }
                else if (msg.guild.musicData.isPlaying == true) {
                    return msg.say(`playlist - :musical_note:  ${playlist.title} :musical_note: has been added to queue ` + emoji.random());
                }
            }
            if (query.match(/^(http(s)?:\/\/)?((w){3}.)?youtu(be|.be)?(\.com)?\/.+/)) {
                query = query
                    .replace(/(>|<)/gi, '')
                    .split(/(vi\/|v=|\/v\/|youtu\.be\/|\/embed\/)/);
                const id = query[2].split(/[^0-9a-z_\-]/i)[0];
                const video = yield youtube.getVideoByID(id).catch(function () {
                    return msg.say('there was a problem getting the video you provided ' + emoji.random());
                });
                msg.guild.musicData.queue.push(this.constructSongObj(video, voiceChannel));
                if (msg.guild.musicData.isPlaying == false ||
                    typeof msg.guild.musicData.isPlaying == 'undefined') {
                    msg.guild.musicData.isPlaying = true;
                    return this.playSong(msg.guild.musicData.queue, msg);
                }
                else if (msg.guild.musicData.isPlaying == true) {
                    return msg.say(`${video.title} added to queue ` + emoji.random());
                }
            }
            const videos = yield youtube.searchVideos(query, 5).catch(function () {
                return msg.say('there was a problem searching the video you requested :( ' + emoji.random());
            });
            if (videos.length < 5) {
                return msg.say(`i had some trouble finding what you were looking for, please try again or be more specific lol ` + emoji.random());
            }
            const vidNameArr = [];
            for (let i = 0; i < videos.length; i++) {
                vidNameArr.push(`${i + 1}: ${videos[i].title}`);
            }
            vidNameArr.push('exit');
            const embed = new MessageEmbed()
                .setColor(0xF97DAE)
                .setTitle('choose a song by msging a number between 1 and 5 ' + emoji.random())
                .addField(`‎`, '**song #**' + vidNameArr[0])
                .addField(`‎`, '**song #**' + vidNameArr[1])
                .addField(`‎`, '**song #**' + vidNameArr[2])
                .addField(`‎`, '**song #**' + vidNameArr[3])
                .addField(`‎`, '**song #**' + vidNameArr[4])
                .addField(`‎`, '**exit selection**: ' + 'exit');
            var songEmbed = yield msg.channel.send({
                embed
            });
            var that = this;
            msg.channel
                .awaitMessages(function (msg) {
                return (msg.content > 0 && msg.content < 6) || msg.content === 'exit';
            }, {
                max: 1,
                time: 60000,
                errors: ['time']
            })
                .then(function (response) {
                const videoIndex = parseInt(response.first().content);
                if (response.first().content === 'exit')
                    return songEmbed.delete();
                youtube
                    .getVideoByID(videos[videoIndex - 1].id)
                    .then(function (video) {
                    msg.guild.musicData.queue.push(that.constructSongObj(video, voiceChannel));
                    if (msg.guild.musicData.isPlaying == false) {
                        msg.guild.musicData.isPlaying = true;
                        if (songEmbed) {
                            songEmbed.delete();
                        }
                        that.playSong(msg.guild.musicData.queue, msg);
                    }
                    else if (msg.guild.musicData.isPlaying == true) {
                        if (songEmbed) {
                            songEmbed.delete();
                        }
                        return msg.say(`${video.title} added to queue ` + emoji.random());
                    }
                })
                    .catch(function () {
                    if (songEmbed) {
                        songEmbed.delete();
                    }
                    return msg.say('an error has occured when trying to get the video id from youtube ' + emoji.random());
                });
            })
                .catch(function () {
                if (songEmbed) {
                    songEmbed.delete();
                }
                return msg.say('try again and enter a number between 1 and 5 or exit ' + emoji.random());
            });
        });
    }
    playSong(queue, msg) {
        const classThis = this;
        queue[0].voiceChannel
            .join()
            .then(function (connection) {
            const dispatcher = connection
                .play(ytdl(queue[0].url, {
                quality: 'highestaudio',
                highWaterMark: 1024 * 1024 * 10
            }))
                .on('start', function () {
                msg.guild.musicData.songDispatcher = dispatcher;
                const volume = 10 / 100;
                msg.guild.musicData.volume = volume;
                dispatcher.setVolume(msg.guild.musicData.volume);
                const videoEmbed = new MessageEmbed()
                    .setThumbnail(queue[0].thumbnail)
                    .setColor(0xF97DAE)
                    .addField('now playing:', queue[0].title)
                    .addField('duration:', queue[0].duration);
                if (queue[1])
                    videoEmbed.addField('next song:', queue[1].title);
                msg.say(videoEmbed);
                msg.guild.musicData.nowPlaying = queue[0];
                return queue.shift();
            })
                .on('finish', function () {
                if (queue.length >= 1) {
                    return classThis.playSong(queue, msg);
                }
                else {
                    msg.guild.musicData.isPlaying = false;
                    msg.guild.musicData.nowPlaying = null;
                    msg.guild.musicData.songDispatcher = null;
                    return msg.guild.me.voice.channel.leave();
                }
            })
                .on('error', function (e) {
                msg.say('can\'t play song ' + emoji.random());
                console.error(e);
                msg.guild.musicData.queue.length = 0;
                msg.guild.musicData.isPlaying = false;
                msg.guild.musicData.nowPlaying = null;
                msg.guild.musicData.songDispatcher = null;
                return msg.guild.me.voice.channel.leave();
            });
        })
            .catch(function (e) {
            console.error(e);
            return msg.guild.me.voice.channel.leave();
        });
    }
    constructSongObj(video, voiceChannel) {
        let duration = this.formatDuration(video.duration);
        if (duration == '00:00')
            duration = 'live stream';
        return {
            url: `https://www.youtube.com/watch?v=${video.raw.id}`,
            title: video.title,
            duration,
            thumbnail: video.thumbnails.high.url,
            voiceChannel
        };
    }
    formatDuration(durationObj) {
        const duration = `${durationObj.hours ? (durationObj.hours + ':') : ''}${durationObj.minutes ? durationObj.minutes : '00'}:${(durationObj.seconds < 10)
            ? ('0' + durationObj.seconds)
            : (durationObj.seconds
                ? durationObj.seconds
                : '00')}`;
        return duration;
    }
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy92b2ljZS9wbGF5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDbEMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ25ELE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDL0MsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDOUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQ3BELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7QUFDdkUsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxTQUFVLFNBQVEsT0FBTztJQUM1QyxZQUFZLE1BQU07UUFDZCxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ1YsSUFBSSxFQUFFLE1BQU07WUFDWixLQUFLLEVBQUUsT0FBTztZQUNkLFVBQVUsRUFBRSxNQUFNO1lBQ2xCLFdBQVcsRUFBRSxzQkFBc0I7WUFDbkMsU0FBUyxFQUFFLElBQUk7WUFDZixpQkFBaUIsRUFBRSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUM7WUFDdkMsSUFBSSxFQUFFO2dCQUNGO29CQUNJLEdBQUcsRUFBRSxPQUFPO29CQUNaLE1BQU0sRUFBRSx5QkFBeUI7b0JBQ2pDLElBQUksRUFBRSxRQUFRO29CQUNkLFFBQVEsRUFBRSxVQUFVLEtBQUs7d0JBQ3JCLE9BQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FB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