Skip to content

Commit

Permalink
Test out lavalink v2
Browse files Browse the repository at this point in the history
  • Loading branch information
duncte123 committed Dec 15, 2023
1 parent c7d5403 commit b37d3b6
Show file tree
Hide file tree
Showing 11 changed files with 133 additions and 122 deletions.
25 changes: 11 additions & 14 deletions bot/src/main/java/fredboat/audio/player/LavalinkManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
package fredboat.audio.player;

import dev.arbjerg.lavalink.client.*;
import dev.arbjerg.lavalink.protocol.v4.Track;
import dev.arbjerg.lavalink.client.protocol.Track;
import ml.duncte123.skybot.objects.config.DunctebotConfig;
import ml.duncte123.skybot.utils.AirUtils;
import ml.duncte123.skybot.utils.AudioUtils;
Expand Down Expand Up @@ -143,20 +143,19 @@ private void loadNodes() {
}

private void registerPlayerUpdateEvent() {
lavalink.on(PlayerUpdateEvent.class).subscribe((stats) -> {
final long guildIdLong = Long.parseUnsignedLong(stats.getEvent().getGuildId());
lavalink.on(PlayerUpdateEvent.class).subscribe((event) -> {
final long guildIdLong = event.getGuildId();
final var mng = audioUtils.getMusicManagers().get(guildIdLong);

if (mng != null) {
mng.getPlayer().updateLocalPlayerState(stats.getEvent().getState());
mng.getPlayer().updateLocalPlayerState(event.getState());
}
});
}

private void registerTrackStartEvent() {
lavalink.on(TrackStartEvent.class).subscribe((data) -> {
final var event = data.getEvent();
final long guildIdLong = Long.parseUnsignedLong(event.getGuildId());
lavalink.on(TrackStartEvent.class).subscribe((event) -> {
final long guildIdLong = event.getGuildId();
final var mng = audioUtils.getMusicManagers().get(guildIdLong);

if (mng != null) {
Expand All @@ -168,22 +167,20 @@ private void registerTrackStartEvent() {
}

private void registerTrackEndEvent() {
lavalink.on(TrackEndEvent.class).subscribe((data) -> {
final var event = data.getEvent();
final long guildIdLong = Long.parseUnsignedLong(event.getGuildId());
lavalink.on(TrackEndEvent.class).subscribe((event) -> {
final long guildIdLong = event.getGuildId();
final var mng = audioUtils.getMusicManagers().get(guildIdLong);

if (mng != null) {
mng.getPlayer().updateCurrentTrack(null);
mng.getScheduler().onTrackEnd(event.getTrack(), event.getReason());
mng.getScheduler().onTrackEnd(event.getTrack(), event.getEndReason());
}
});
}

private void registerTrackExceptionEvent() {
lavalink.on(TrackExceptionEvent.class).subscribe((data) -> {
final var event = data.getEvent();
final long guildIdLong = Long.parseUnsignedLong(event.getGuildId());
lavalink.on(TrackExceptionEvent.class).subscribe((event) -> {
final long guildIdLong = event.getGuildId();
final var mng = audioUtils.getMusicManagers().get(guildIdLong);

if (mng != null) {
Expand Down
135 changes: 63 additions & 72 deletions bot/src/main/java/ml/duncte123/skybot/audio/AudioLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@

package ml.duncte123.skybot.audio;

import dev.arbjerg.lavalink.protocol.v4.Exception;
import dev.arbjerg.lavalink.protocol.v4.*;
import kotlinx.serialization.json.JsonElementKt;
import kotlinx.serialization.json.JsonObject;
import dev.arbjerg.lavalink.client.AbstractAudioLoadResultHandler;
import dev.arbjerg.lavalink.client.protocol.*;
import dev.arbjerg.lavalink.protocol.v4.PlaylistInfo;
import dev.arbjerg.lavalink.protocol.v4.TrackInfo;
import me.duncte123.botcommons.messaging.MessageConfig;
import ml.duncte123.skybot.CommandManager;
import ml.duncte123.skybot.commands.music.RadioCommand;
Expand All @@ -31,16 +31,18 @@
import ml.duncte123.skybot.objects.RadioStream;
import ml.duncte123.skybot.objects.TrackUserData;
import net.dv8tion.jda.api.entities.MessageEmbed;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;
import java.util.function.Consumer;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

import static me.duncte123.botcommons.messaging.EmbedUtils.embedMessage;
import static me.duncte123.botcommons.messaging.MessageUtils.sendMsg;

public class AudioLoader implements Consumer<LoadResult> {
public class AudioLoader extends AbstractAudioLoadResultHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(AudioLoader.class);

private final AudioData data;
Expand All @@ -60,32 +62,10 @@ public AudioLoader(AudioData data, GuildMusicManager mng, boolean announce, Stri
}

@Override
public void accept(LoadResult loadResult) {
if (loadResult instanceof LoadResult.TrackLoaded trackLoaded) {
this.trackLoaded(trackLoaded);
} else if (loadResult instanceof LoadResult.PlaylistLoaded playlistLoaded) {
this.playlistLoaded(playlistLoaded);
} else if (loadResult instanceof LoadResult.SearchResult searchResult) {
LOGGER.error("Search result not handled: {}", searchResult);
sendMsg(
new MessageConfig.Builder()
.setChannel(this.data.getChannel())
.replyTo(this.data.getReplyToMessage())
.setEmbeds(embedMessage("Error: Unhandled search result, please report this bug to the devs!"))
.build()
);
// this.searchLoaded(searchResult);
} else if (loadResult instanceof LoadResult.NoMatches) {
this.noMatches();
} else if (loadResult instanceof LoadResult.LoadFailed loadFailed) {
this.loadFailed(loadFailed.getData());
}
}
public void ontrackLoaded(@NotNull TrackLoaded trackLoaded) {
final Track track = trackLoaded.getTrack();

private void trackLoaded(LoadResult.TrackLoaded data) {
final Track track = data.getData().copyWithUserData(new JsonObject(Map.of(
"uuid", JsonElementKt.JsonPrimitive(UUID.randomUUID().toString())
)));
track.setUserData(new UUIDUserData());

mng.getScheduler().storeUserData(track, new TrackUserData(this.requester));

Expand Down Expand Up @@ -132,9 +112,9 @@ private void trackLoaded(LoadResult.TrackLoaded data) {
}
}

private void playlistLoaded(LoadResult.PlaylistLoaded playlistLoaded) {
final Playlist playlist = playlistLoaded.getData();
final List<Track> tracks = playlist.getTracks();
@Override
public void onPlaylistLoaded(@NotNull PlaylistLoaded playlistLoaded) {
final List<Track> tracks = playlistLoaded.getTracks();

if (tracks.isEmpty()) {
sendMsg(
Expand All @@ -148,7 +128,7 @@ private void playlistLoaded(LoadResult.PlaylistLoaded playlistLoaded) {
return;
}

final PlaylistInfo playlistInfo = playlist.getInfo();
final PlaylistInfo playlistInfo = playlistLoaded.getInfo();

try {
final TrackScheduler trackScheduler = this.mng.getScheduler();
Expand All @@ -160,14 +140,10 @@ private void playlistLoaded(LoadResult.PlaylistLoaded playlistLoaded) {
tracksRaw = tracksRaw.subList(selectedTrackIndex, tracksRaw.size());
}

final List<Track> limitedTracks = tracksRaw.stream().map((track) -> {
track = track.copyWithUserData(new JsonObject(Map.of(
"uuid", JsonElementKt.JsonPrimitive(UUID.randomUUID().toString())
)));
final List<Track> limitedTracks = tracksRaw.stream().peek((track) -> {
track.setUserData(new UUIDUserData());

mng.getScheduler().storeUserData(track, new TrackUserData(this.requester));

return track;
}).toList();

for (final Track track : limitedTracks) {
Expand Down Expand Up @@ -202,39 +178,20 @@ private void playlistLoaded(LoadResult.PlaylistLoaded playlistLoaded) {
}
}

private String getPlaylistMsg(List<Track> tracks, PlaylistInfo playlistInfo) {
final String sizeMsg = String.valueOf(tracks.size());

/*if (playlist instanceof BigChungusPlaylist bigBoi && bigBoi.isBig()) {
sizeMsg = tracks.size() + "/" + bigBoi.getOriginalSize();
} else {
sizeMsg = String.valueOf(tracks.size());
}*/

return String.format(
"Adding **%s** tracks to the queue from **%s**",
sizeMsg,
playlistInfo.getName()
@Override
public void onSearchResultLoaded(@NotNull SearchResult searchResult) {
LOGGER.error("Search result not handled: {}", searchResult);
sendMsg(
new MessageConfig.Builder()
.setChannel(this.data.getChannel())
.replyTo(this.data.getReplyToMessage())
.setEmbeds(embedMessage("Error: Unhandled search result, please report this bug to the devs!"))
.build()
);
}

// private void searchLoaded(LoadResult.SearchResult searchResult) {
// System.out.println("WARNING A SEARCH RESULT WAS TRIGGERED " + searchResult);
// }

private void noMatches() {
if (this.announce) {
sendMsg(
new MessageConfig.Builder()
.setChannel(this.data.getChannel())
.replyTo(this.data.getReplyToMessage())
.setEmbeds(embedMessage("Nothing found by *" + StringKt.abbreviate(this.trackUrl, MessageEmbed.VALUE_MAX_LENGTH) + '*'))
.build()
);
}
}

private void loadFailed(Exception exception) {
@Override
public void loadFailed(@NotNull LoadFailed loadFailed) {
/*if (exception.getCause() != null && exception.getCause() instanceof final LimitReachedException cause) {
sendMsg(
new MessageConfig.Builder()
Expand All @@ -253,6 +210,8 @@ private void loadFailed(Exception exception) {
return;
}

final TrackException exception = loadFailed.getException();

final String finalCause = Objects.requireNonNullElse(exception.getMessage(), exception.getCause());

if (finalCause.endsWith("Playback on other websites has been disabled by the video owner.")) {
Expand All @@ -279,7 +238,39 @@ private void loadFailed(Exception exception) {
)
.build()
);
}

private String getPlaylistMsg(List<Track> tracks, PlaylistInfo playlistInfo) {
final String sizeMsg = String.valueOf(tracks.size());

/*if (playlist instanceof BigChungusPlaylist bigBoi && bigBoi.isBig()) {
sizeMsg = tracks.size() + "/" + bigBoi.getOriginalSize();
} else {
sizeMsg = String.valueOf(tracks.size());
}*/

return String.format(
"Adding **%s** tracks to the queue from **%s**",
sizeMsg,
playlistInfo.getName()
);
}

// private void searchLoaded(LoadResult.SearchResult searchResult) {
// System.out.println("WARNING A SEARCH RESULT WAS TRIGGERED " + searchResult);
// }

@Override
public void noMatches() {
if (this.announce) {
sendMsg(
new MessageConfig.Builder()
.setChannel(this.data.getChannel())
.replyTo(this.data.getReplyToMessage())
.setEmbeds(embedMessage("Nothing found by *" + StringKt.abbreviate(this.trackUrl, MessageEmbed.VALUE_MAX_LENGTH) + '*'))
.build()
);
}
}

private static String getSteamTitle(Track track, String rawTitle, CommandManager commandManager) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import dev.arbjerg.lavalink.client.Link;
import dev.arbjerg.lavalink.protocol.v4.Filters;
import dev.arbjerg.lavalink.protocol.v4.PlayerState;
import dev.arbjerg.lavalink.protocol.v4.Track;
import dev.arbjerg.lavalink.client.protocol.Track;
import fredboat.audio.player.LavalinkManager;
import reactor.core.publisher.Mono;

Expand Down
25 changes: 12 additions & 13 deletions bot/src/main/java/ml/duncte123/skybot/audio/TrackScheduler.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,10 @@

package ml.duncte123.skybot.audio;

import dev.arbjerg.lavalink.protocol.v4.Exception;
import dev.arbjerg.lavalink.client.protocol.Track;
import dev.arbjerg.lavalink.client.protocol.TrackException;
import dev.arbjerg.lavalink.protocol.v4.Message.EmittedEvent.TrackEndEvent.AudioTrackEndReason;
import dev.arbjerg.lavalink.protocol.v4.Track;
import dev.arbjerg.lavalink.protocol.v4.TrackInfo;
import kotlinx.serialization.json.JsonPrimitive;
import me.duncte123.botcommons.messaging.MessageConfig;
import ml.duncte123.skybot.exceptions.LimitReachedException;
import ml.duncte123.skybot.extensions.AudioTrackKt;
Expand Down Expand Up @@ -167,15 +166,15 @@ public void onTrackEnd(Track lastTrack, AudioTrackEndReason endReason) {
if (this.looping) {
LOGGER.debug("repeating the current song");

final Track clone = AudioTrackKt.makeClone(lastTrack);
final Track clone = AudioTrackKt.internalClone(lastTrack);
storeUserData(clone, copyTrackDataOrCreateNew(lastTrack, wasForceAnnounce));
this.play(clone);

return;
} else if (this.loopingQueue) {
LOGGER.debug("repeating the queue");
//Offer it to the queue to prevent the player from playing it
final Track clone = AudioTrackKt.makeClone(lastTrack);
final Track clone = AudioTrackKt.internalClone(lastTrack);
storeUserData(clone, copyTrackDataOrCreateNew(lastTrack, wasForceAnnounce));
queue.offer(clone);
}
Expand Down Expand Up @@ -225,7 +224,7 @@ private TrackUserData copyTrackDataOrCreateNew(Track track, boolean wasForceAnno
return newData;
}

public void onTrackException(Track track, Exception exception) {
public void onTrackException(Track track, TrackException exception) {
final String finalCause = Objects.requireNonNullElse(exception.getMessage(), exception.getCause());

if (finalCause.contains("Something went wrong when decoding the track.")) {
Expand All @@ -246,28 +245,28 @@ public void onTrackException(Track track, Exception exception) {
}

public TrackUserData getUserData(Track track) {
final var element = Objects.requireNonNull((JsonPrimitive) track.getUserData().get("uuid"));
final var element = Objects.requireNonNull(track.getUserData().get("uuid"));

return this.userData.get(element.getContent());
return this.userData.get(element.asText());
}

public void storeUserData(Track track, TrackUserData data) {
final var element = Objects.requireNonNull((JsonPrimitive) track.getUserData().get("uuid"));
final var element = Objects.requireNonNull(track.getUserData().get("uuid"));

this.userData.put(element.getContent(), data);
this.userData.put(element.asText(), data);
}

public void removeUserData(Track track) {
final var element = Objects.requireNonNull((JsonPrimitive) track.getUserData().get("uuid"));
final var element = Objects.requireNonNull(track.getUserData().get("uuid"));

this.userData.remove(element.getContent());
this.userData.remove(element.asText());
}

private void play(Track track) {
this.guildMusicManager.getPlayer()
.getLink()
.updatePlayer(
(builder) -> builder.applyTrack(track)
(builder) -> builder.setTrack(track)
)
.subscribe();
}
Expand Down
27 changes: 27 additions & 0 deletions bot/src/main/java/ml/duncte123/skybot/audio/UUIDUserData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
* Skybot, a multipurpose discord bot
* Copyright (C) 2017 Duncan "duncte123" Sterken & Ramid "ramidzkh" Khan & Maurice R S "Sanduhr32"
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

package ml.duncte123.skybot.audio;

import java.util.UUID;

public record UUIDUserData(String uuid) {
public UUIDUserData() {
this(UUID.randomUUID().toString());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

package ml.duncte123.skybot.commands.music;

import dev.arbjerg.lavalink.protocol.v4.Track;
import dev.arbjerg.lavalink.client.protocol.Track;
import ml.duncte123.skybot.Variables;
import ml.duncte123.skybot.audio.LocalPlayer;
import ml.duncte123.skybot.objects.command.CommandContext;
Expand Down
Loading

0 comments on commit b37d3b6

Please sign in to comment.