-
Notifications
You must be signed in to change notification settings - Fork 14
/
PlayCommand.java
185 lines (164 loc) · 6.95 KB
/
PlayCommand.java
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
package com.bot.commands.voice;
import com.bot.Bot;
import com.bot.commands.VoiceCommand;
import com.bot.voice.VoiceSendHandler;
import com.jagrosh.jdautilities.command.CommandEvent;
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import net.dv8tion.jda.core.entities.Message;
import java.util.ArrayList;
import java.util.List;
import static com.bot.utils.FormattingUtils.msToMinSec;
public class PlayCommand extends VoiceCommand {
private Bot bot;
public PlayCommand(Bot bot) {
this.bot = bot;
this.name = "play";
this.arguments = "<title|URL>";
this.help = "plays the provided audio track";
}
@Override
protected void executeCommand(CommandEvent commandEvent) {
if (commandEvent.getArgs().isEmpty()) {
VoiceSendHandler handler = (VoiceSendHandler) commandEvent.getGuild().getAudioManager().getSendingHandler();
if(handler != null && handler.getPlayer().isPaused()) {
handler.getPlayer().setPaused(false);
commandEvent.reply(commandEvent.getClient().getSuccess() + " Resumed paused stream.");
}
else {
commandEvent.reply(commandEvent.getClient().getWarning() + " You must give me something to play.\n" +
"`" + commandEvent.getClient().getPrefix() +"play <URL>` - Plays media at the provided URL\n" +
"`" + commandEvent.getClient().getPrefix() + "play <search term>` - Searchs youtube for the first result of the search term");
}
return;
}
String URLRegex = "\\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
String URL = commandEvent.getArgs().split(" ")[0];
if (URL.matches(URLRegex)) {
// URL input, grab from source
// Separate URL from any other possible args
commandEvent.reply("\u231A Loading... `["+commandEvent.getArgs()+"]`", m -> bot.getManager().loadItemOrdered(commandEvent.getGuild(), URL, new PlayHandler(m, URL, commandEvent, false)));
}
else {
// Not a URL, Treat as a YT search
commandEvent.reply("\u231A Searching for `["+commandEvent.getArgs()+"]`", m -> bot.getManager().loadItemOrdered(commandEvent.getGuild(), "ytsearch:" + commandEvent.getArgs(), new PlayHandler(m, commandEvent.getArgs(), commandEvent, true)));
}
}
private class PlayHandler implements AudioLoadResultHandler {
private final CommandEvent commandEvent;
private final String source;
private final Message message;
private final boolean search;
private PlayHandler(Message message, String source, CommandEvent commandEvent, boolean search) {
this.message = message;
this.source = source;
this.commandEvent = commandEvent;
this.search = search;
}
private boolean loadTracks(AudioTrack track, List<AudioTrack> playlist) {
if (playlist == null) {
if (VoiceSendHandler.isSongTooLong(track)) {
message.editMessage(commandEvent.getClient().getWarning() + " The track was longer than the max length of " +
msToMinSec(VoiceSendHandler.MAX_DURATION * 1000)).queue();
return false;
}
// If the queue track was successful go on, if not return.
if (bot.queueTrack(track, commandEvent, message)) {
message.editMessage(commandEvent.getClient().getSuccess() + " Successfully added `"+ track.getInfo().title + "` to queue.").queue();
return true;
} else {
message.editMessage(commandEvent.getClient().getError() + " Failed to add track to playlist.").queue();
return false;
}
} else {
// This will only happen with a playlist
int count = 0;
List<String> tracksAdded = new ArrayList<>();
for (AudioTrack t : playlist) {
if (loadTracks(t, null)) {
count++;
tracksAdded.add(t.getInfo().title);
} else {
message.editMessage(commandEvent.getClient().getError() + " Failed to add a track to playlist. Added " + count + " tracks.").queue();
return false;
}
}
if (!tracksAdded.isEmpty()) {
commandEvent.reply("Added the following tracks: " + prettyPrintTracks(tracksAdded));
}
return true;
}
}
@Override
public void trackLoaded(AudioTrack audioTrack) {
loadTracks(audioTrack, null);
}
@Override
public void playlistLoaded(AudioPlaylist audioPlaylist) {
if (audioPlaylist.isSearchResult()) {
AudioTrack track = audioPlaylist.getTracks().get(0);
loadTracks(track, null);
return;
}
if (commandEvent.getArgs().split(" ").length < 2) {
loadTracks(null, audioPlaylist.getTracks());
} else {
// They gave multiple args, assume one is the tracks.
String[] trackNums = commandEvent.getArgs().split(" ")[1].split("-");
if(trackNums.length == 2) {
int to, from;
try {
from = Integer.parseInt(trackNums[0]);
to = Integer.parseInt(trackNums[1]);
} catch (NumberFormatException e) {
commandEvent.reply(commandEvent.getClient().getWarning() + " NumberFormatException: Invalid number given, please only user numeric characters.");
return;
}
if (from > to) {
commandEvent.reply(commandEvent.getClient().getWarning() + " Error: Beginning index is bigger than ending index.");
return;
} else if (from < 0) {
commandEvent.reply(commandEvent.getClient().getWarning() + " Error: Beginning index is less than 0.");
return;
} else if (to > audioPlaylist.getTracks().size()) {
commandEvent.reply(commandEvent.getClient().getWarning() + " Error: Requesting tracks out of range. Only " + audioPlaylist.getTracks().size() + " tracks in playlist :x:");
return;
} else if (to - from > 9) {
commandEvent.reply(commandEvent.getClient().getWarning() + " Warning: Requesting number of tracks that is greater than 10. Trimming results to " +
"" + from + "-" + (from + 9) +" :exclamation:");
to = from + 9;
}
loadTracks(null, audioPlaylist.getTracks().subList(from, to));
} else {
commandEvent.reply(commandEvent.getClient().getWarning() + " Error: Incorrect number of parameters. Make sure that there are no spaces between your track numbers and the dash.");
}
}
}
@Override
public void noMatches() {
message.editMessage(commandEvent.getClient().getWarning() + " Failed to find a track for " + commandEvent.getArgs()).queue();
}
@Override
public void loadFailed(FriendlyException e) {
// If a common exception give the message
if (e.severity == FriendlyException.Severity.COMMON) {
message.editMessage(commandEvent.getClient().getError() + " I encountered an error loading track: \n `" +
e.getMessage() + "`").queue();
}
// If an uncommon exception do not give any details to the user
else {
message.editMessage(commandEvent.getClient().getError() + " I encountered an error loading track.").queue();
}
}
private String prettyPrintTracks(List<String> tracks) {
String prettyString = "```";
for (String s: tracks) {
prettyString += s + "\n";
}
prettyString += "```";
return prettyString;
}
}
}