diff --git a/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java b/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java index efccfa7..48e1340 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java +++ b/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java @@ -12,9 +12,9 @@ import codes.ztereohype.ztereomusic.networking.YoutubeSearch; import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; import net.dv8tion.jda.api.entities.*; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.shadew.util.data.Pair; import java.util.Objects; -import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -70,24 +70,24 @@ public class Play implements Command { boolean spotifyUrlFound = matchedSpotifyUrl.find(); if (spotifyUrlFound) { - Optional songSearchQuery = SpotifyApiHelper.query(mergedArgs, messageChannel); + Pair songSearchQuery = SpotifyApiHelper.query(mergedArgs); - if (songSearchQuery.isPresent()) { - mergedArgs = songSearchQuery.get(); + if (songSearchQuery.first()) { + mergedArgs = songSearchQuery.second(); } else { - return; // SpotifyApiHelper takes care of answering why it failed + messageChannel.sendMessage(songSearchQuery.second()).queue(); + return; } } String identifier; // spotify urls need to be queried through youtube if (!urlFound || spotifyUrlFound) { - Optional query = YoutubeSearch.query(mergedArgs); - - if (query.isPresent()) { - identifier = query.get(); + Pair query = YoutubeSearch.query(mergedArgs); + if (query.first()) { + identifier = query.second(); } else { - messageEvent.getChannel().sendMessage("I found no matches for that song!").queue(); + messageEvent.getChannel().sendMessage(query.second()).queue(); return; } } else { diff --git a/src/main/java/codes/ztereohype/ztereomusic/networking/SpotifyApiHelper.java b/src/main/java/codes/ztereohype/ztereomusic/networking/SpotifyApiHelper.java index d85181b..a1e77ad 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/networking/SpotifyApiHelper.java +++ b/src/main/java/codes/ztereohype/ztereomusic/networking/SpotifyApiHelper.java @@ -2,10 +2,9 @@ package codes.ztereohype.ztereomusic.networking; import codes.ztereohype.ztereomusic.ZtereoMUSIC; import lombok.SneakyThrows; -import net.dv8tion.jda.api.entities.MessageChannel; import net.shadew.json.Json; import net.shadew.json.JsonPath; -import net.shadew.json.JsonSyntaxException; +import net.shadew.util.data.Pair; import java.io.IOException; import java.net.URI; @@ -50,7 +49,6 @@ public class SpotifyApiHelper { @SneakyThrows private static Optional getToken() { HttpClient client = HttpClient.newHttpClient(); - HttpRequest request = HttpRequest.newBuilder( URI.create("https://accounts.spotify.com/api/token?grant_type=client_credentials")) .POST(HttpRequest.BodyPublishers.ofString("")) @@ -63,21 +61,21 @@ public class SpotifyApiHelper { HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); String results = JSON.parse(response.body()).query(tokenPath).asString(); return Optional.ofNullable(results); - } catch (IOException | InterruptedException | JsonSyntaxException e) { + } catch (IOException | InterruptedException e) { e.printStackTrace(); return Optional.empty(); } } - public static Optional query(String songUrl, MessageChannel messageChannel) { + // boolean is isSuccessful and string is content -> error if failure and content if success + public static Pair query(String songUrl) { if (spotifyToken == null) { System.out.println("Null Spotify token detected"); - messageChannel.sendMessage("I don't have a spotify token for now. Try again later.").queue(); - return Optional.empty(); + return Pair.of(false, "I don't have a spotify token for now. Try again later."); } - if (songUrl.contains("/playlist/")) { - messageChannel.sendMessage("Playlists aren't supported for now, please send the individual song links.").queue(); + if (songUrl.contains("playlist")) { + return Pair.of(false, "Playlists aren't supported for now, please send the individual song links."); } Matcher matchedSpotifyIdentifier = IDENTIFIER_PATTERN.matcher(songUrl); @@ -85,8 +83,7 @@ public class SpotifyApiHelper { if (matchedSpotifyIdentifier.find()) { spotifyIdentifier = matchedSpotifyIdentifier.group(); } else { - messageChannel.sendMessage("Could not parse Spotify link. Try entering the song title directly.").queue(); - return Optional.empty(); + return Pair.of(false, "Could not parse Spotify link. Try entering the song title directly."); } String query = "https://api.spotify.com/v1/tracks?ids=" @@ -102,19 +99,17 @@ public class SpotifyApiHelper { .build(); JsonPath titlePath = JsonPath.parse("tracks[0].name"); - JsonPath authorPath = JsonPath.parse("tracks[0].artists[0].name"); +// JsonPath authorPath = JsonPath.parse("tracks[0].artists[0].name"); try { HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); String title = JSON.parse(response.body()).query(titlePath).asString(); - String author = JSON.parse(response.body()).query(authorPath).asString(); - String songSearchQuery = title + " " + author + "official audio"; +// String author = JSON.parse(response.body()).query(authorPath).asString(); - return Optional.of(songSearchQuery); - } catch (IOException | InterruptedException | JsonSyntaxException e) { + return Pair.of(true, title); + } catch (IOException | InterruptedException e) { e.printStackTrace(); - messageChannel.sendMessage("Something wrong happened with the spotify request.").queue(); - return Optional.empty(); + return Pair.of(false,"Something wrong happened with the spotify request."); } } } diff --git a/src/main/java/codes/ztereohype/ztereomusic/networking/YoutubeSearch.java b/src/main/java/codes/ztereohype/ztereomusic/networking/YoutubeSearch.java index 8df57c8..6c10d6c 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/networking/YoutubeSearch.java +++ b/src/main/java/codes/ztereohype/ztereomusic/networking/YoutubeSearch.java @@ -4,16 +4,16 @@ import codes.ztereohype.ztereomusic.ZtereoMUSIC; import net.shadew.json.Json; import net.shadew.json.JsonPath; import net.shadew.json.JsonSyntaxException; +import net.shadew.util.data.Pair; import java.io.IOException; import java.net.URL; -import java.util.Optional; public class YoutubeSearch { private static final String API_KEY = ZtereoMUSIC.getInstance().getConfig().getPropreties().get("yt_api_key"); private static final Json JSON = Json.json(); - public static Optional query(String title) { + public static Pair query(String title) { String query = "https://www.googleapis.com/youtube/v3/search?part=snippet&q=%22" + title.replace(' ', '+') + "%22&type=video&key=" + API_KEY; @@ -22,7 +22,7 @@ public class YoutubeSearch { jsonResponse = new String(new URL(query).openStream().readAllBytes()); } catch (IOException e) { e.printStackTrace(); - return Optional.empty(); + return Pair.of(false, "There was a request error contacting youtube."); } JsonPath resultsNumberPath = JsonPath.parse("pageInfo.totalResults"); @@ -30,12 +30,12 @@ public class YoutubeSearch { try { int results = JSON.parse(jsonResponse).query(resultsNumberPath).asInt(); - if (results == 0) return Optional.empty(); + if (results == 0) return Pair.of(false, "I found no matches for that song."); - return Optional.ofNullable(JSON.parse(jsonResponse).query(videoPath).asString()); + return Pair.of(true, JSON.parse(jsonResponse).query(videoPath).asString()); } catch (JsonSyntaxException e) { e.printStackTrace(); - return Optional.empty(); + return Pair.of(false, "There was an error parsing YouTube's reply."); } } }