Skip to content

Commit

Permalink
Implement lavalink v4 (#303)
Browse files Browse the repository at this point in the history
* Start working on moving to lavalink v4

* Getting closer to being able to remove lavaplayer

* Temp sollution for testing

* Disable kotlin linter until bug is fixed

* V4 works!

* Now it compiles again

* Add skip votes to player embed

* Stuff mostly works now

* Fix auto-search

* Log error for search result

* Fuck the linter man

* Linter fixes

* Move makeClone

* cleanup

* Rename 'wasFromSkip' to 'forceAnnoune'

* More code linting

* Remove useless entries from config
  • Loading branch information
duncte123 authored Dec 1, 2023
1 parent 7c1cfed commit a128e60
Show file tree
Hide file tree
Showing 132 changed files with 761 additions and 1,970 deletions.
16 changes: 14 additions & 2 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

root = true

[*]
Expand All @@ -9,4 +8,17 @@ indent_style = space
indent_size = 4

[gradlew]
end_of_line = lf
end_of_line = lf

[*.{kt,kts}]
ktlint_code_style = ktlint_official
ktlint_standard = enabled
ktlint_experimental = disabled
ktlint_custom-rule-set = disabled
ktlint_standard_filename = disabled
ktlint_standard_function-signature = disabled
ktlint_standard_no-wildcard-imports = disabled
ktlint_standard_argument-list-wrapping = disabled
ktlint_standard_string-template-indent = disabled
ktlint_standard_trailing-comma-on-call-site = disabled
ktlint_standard_multiline-expression-wrapping = disabled
15 changes: 15 additions & 0 deletions .idea/jarRepositories.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/kotlinc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 0 additions & 10 deletions bot/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,6 @@ dependencies {
implementation(libs.jda) {
exclude(module = "opus-java")
}
implementation(libs.sourceManagers)
implementation(libs.lavaplayer)
implementation(libs.lavalink.client) {
exclude(module = "lavaplayer")
}
Expand Down Expand Up @@ -181,14 +179,6 @@ shadowJar.apply {
kotlinter {
ignoreFailures = false
reporters = arrayOf("checkstyle", "plain")
experimentalRules = true
disabledRules = arrayOf(
"filename", "no-wildcard-imports", "experimental:indent",
"argument-list-wrapping",
"experimental:spacing-between-declarations-with-annotations",
"experimental:spacing-between-declarations-with-comments",
"experimental:comment-wrapping"
)
}

pmd {
Expand Down
2 changes: 0 additions & 2 deletions bot/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ services:
- API_GOOGLE=
- API_WEEBSH=
- API_KSOFT=
- API_SPOTIFY_CLIENT_ID=
- API_SPOTIFY_CLIENT_SECRET=
- API_BLARGBOT=
- API_WOLFRAMALPHA=
- API_THECATAPI=
Expand Down
122 changes: 75 additions & 47 deletions bot/src/main/java/fredboat/audio/player/LavalinkManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,8 @@

package fredboat.audio.player;

import lavalink.client.io.Link;
import lavalink.client.io.jda.JdaLavalink;
import lavalink.client.player.LavalinkPlayer;
import ml.duncte123.skybot.SkyBot;
import dev.arbjerg.lavalink.client.*;
import dev.arbjerg.lavalink.protocol.v4.Track;
import ml.duncte123.skybot.objects.config.DunctebotConfig;
import ml.duncte123.skybot.utils.AirUtils;
import ml.duncte123.skybot.utils.AudioUtils;
Expand All @@ -32,7 +30,6 @@

import javax.annotation.Nonnull;
import java.net.URI;
import java.util.Base64;

/**
* This class has been taken from
Expand All @@ -41,46 +38,43 @@
*/
public final class LavalinkManager {
public static final LavalinkManager INS = new LavalinkManager();
private JdaLavalink lavalink = null;
private LavalinkClient lavalink = null;
private DunctebotConfig config = null;
private AudioUtils audioUtils;
private boolean enabledOverride = true;

private LavalinkManager() {
}

public void start(SkyBot skybot, DunctebotConfig config, AudioUtils audioUtils) {
public void start(DunctebotConfig config, AudioUtils audioUtils) {
this.config = config;
this.audioUtils = audioUtils;

if (!isEnabled()) {
return;
}

final String userId = getIdFromToken(this.config.discord.token);
final long userId = Helpers.getUserIdFromToken(this.config.discord.token);

lavalink = new JdaLavalink(
userId,
this.config.discord.totalShards,
shardId -> skybot.getShardManager().getShardById(shardId)
);
lavalink = new LavalinkClient(userId);

this.registerPlayerUpdateEvent();
this.registerTrackStartEvent();
this.registerTrackEndEvent();
this.registerTrackExceptionEvent();
this.registerTrackStuckEvent();

loadNodes();
}

@SuppressWarnings("unused") // we need it from eval
public void forceEnable(boolean enabled) {
if (enabled) {
this.loadNodes();
this.start(this.config, this.audioUtils);
} else {
AirUtils.stopMusic(this.audioUtils);

// disconnect all links
this.lavalink.getLinks().forEach(Link::destroy);
// close all connections to all nodes
for (int i = 0; i < this.lavalink.getNodes().size(); i++) {
this.lavalink.removeNode(i);
}
this.lavalink.close();
}

// Do this last, otherwise we can't disconnect
Expand All @@ -91,45 +85,33 @@ public boolean isEnabled() {
return this.enabledOverride && config.lavalink.enable;
}

public LavalinkPlayer createPlayer(long guildId) {
if (!isEnabled()) {
throw new IllegalStateException("Music is not enabled right now");
}

return lavalink.getLink(String.valueOf(guildId)).getPlayer();
}

public void openConnection(AudioChannel channel) {
if (isEnabled()) {
final AudioManager audioManager = channel.getGuild().getAudioManager();

// Turn on the deafen icon for the bot
audioManager.setSelfDeafened(true);

lavalink.getLink(channel.getGuild()).connect(channel);
channel.getJDA().getDirectAudioController().connect(channel);
}
}

public void closeConnection(Guild guild) {
closeConnection(guild.getId());
}

public void closeConnection(String guildId) {
if (isEnabled()) {
lavalink.getLink(guildId).destroy();
guild.getJDA().getDirectAudioController().disconnect(guild);
}
}

public boolean isConnected(Guild guild) {
return isConnected(guild.getId());
return isConnected(guild.getIdLong());
}

public boolean isConnected(String guildId) {
public boolean isConnected(long guildId) {
if (!isEnabled()) {
return false;
}

return lavalink.getLink(guildId).getState() == Link.State.CONNECTED;
return lavalink.getLink(guildId).getState() == LinkState.CONNECTED;
}

@SuppressWarnings("ConstantConditions") // cache is enabled
Expand All @@ -143,27 +125,73 @@ public AudioChannelUnion getConnectedChannel(@Nonnull Guild guild) {

public void shutdown() {
if (isEnabled()) {
this.lavalink.shutdown();
this.lavalink.close();
}
}

public JdaLavalink getLavalink() {
public LavalinkClient getLavalink() {
return lavalink;
}

private void loadNodes() {
final JdaLavalink lavalink = getLavalink();
final LavalinkClient lavalink = getLavalink();

for (final DunctebotConfig.Lavalink.LavalinkNode node : config.lavalink.nodes) {
lavalink.addNode(URI.create(node.wsurl), node.pass);
// TODO: region filter mapping
lavalink.addNode(node.name, URI.create(node.wsurl), node.pass);
}
}

private String getIdFromToken(String token) {
return new String(
Base64.getDecoder().decode(
token.split("\\.")[0]
)
);
private void registerPlayerUpdateEvent() {
lavalink.on(PlayerUpdateEvent.class).subscribe((stats) -> {
final long guildIdLong = Long.parseUnsignedLong(stats.getEvent().getGuildId());
final var mng = audioUtils.getMusicManagers().get(guildIdLong);

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

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

if (mng != null) {
final Track track = event.getTrack();
mng.getPlayer().updateCurrentTrack(track);
mng.getScheduler().onTrackStart(track);
}
});
}

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

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

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

if (mng != null) {
mng.getPlayer().updateCurrentTrack(null);
mng.getScheduler().onTrackException(event.getTrack(), event.getException());
}
});
}

private void registerTrackStuckEvent() {}
}
4 changes: 2 additions & 2 deletions bot/src/main/java/ml/duncte123/skybot/CommandManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@
import ml.duncte123.skybot.commands.animals.*;
import ml.duncte123.skybot.commands.essentials.*;
import ml.duncte123.skybot.commands.essentials.eval.EvalCommand;
import ml.duncte123.skybot.commands.fun.*;
import ml.duncte123.skybot.commands.funCmds.*;
import ml.duncte123.skybot.commands.funcmds.*;
import ml.duncte123.skybot.commands.guild.GuildInfoCommand;
import ml.duncte123.skybot.commands.guild.GuildJoinsCommand;
import ml.duncte123.skybot.commands.guild.mod.*;
Expand Down Expand Up @@ -279,7 +280,6 @@ public CommandManager(Variables variables) {
this.addCommand(new SkipCommand());
this.addCommand(new SlowModeCommand());
this.addCommand(new SoftbanCommand());
this.addCommand(new SPLookupCommand());
this.addCommand(new StatsCommand());
this.addCommand(new StopCommand());
this.addCommand(new SuggestCommand());
Expand Down
5 changes: 0 additions & 5 deletions bot/src/main/java/ml/duncte123/skybot/EventManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

package ml.duncte123.skybot;

import fredboat.audio.player.LavalinkManager;
import io.sentry.Sentry;
import me.duncte123.botcommons.text.TextColor;
import ml.duncte123.skybot.commands.mod.DeHoistListener;
Expand Down Expand Up @@ -71,10 +70,6 @@ public class EventManager implements IEventManager {
this.listeners.add(reactionHandler);
this.listeners.add(shardWatcher);
this.listeners.add(inviteTracker);

if (LavalinkManager.INS.isEnabled()) {
this.listeners.add(LavalinkManager.INS.getLavalink());
}
}

@Override
Expand Down
7 changes: 5 additions & 2 deletions bot/src/main/java/ml/duncte123/skybot/SkyBot.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package ml.duncte123.skybot;

import dev.arbjerg.lavalink.libraries.jda.JDAVoiceUpdateListener;
import fredboat.audio.player.LavalinkManager;
import me.duncte123.botcommons.messaging.EmbedUtils;
import me.duncte123.botcommons.messaging.MessageConfig;
Expand Down Expand Up @@ -97,7 +98,7 @@ private SkyBot() throws LoginException {
final LongLongPair commandCount = commandManager.getCommandCount();

logger.info("{} commands with {} aliases loaded.", commandCount.getFirst(), commandCount.getSecond());
LavalinkManager.INS.start(this, config, variables.getAudioUtils());
LavalinkManager.INS.start(config, variables.getAudioUtils());

final EventManager eventManager = new EventManager(variables);
// Build our shard manager
Expand Down Expand Up @@ -133,7 +134,9 @@ private SkyBot() throws LoginException {

// If lavalink is enabled we will hook it into jda
if (LavalinkManager.INS.isEnabled()) {
builder.setVoiceDispatchInterceptor(LavalinkManager.INS.getLavalink().getVoiceInterceptor());
builder.setVoiceDispatchInterceptor(
new JDAVoiceUpdateListener(LavalinkManager.INS.getLavalink())
);
}

this.shardManager = builder.build();
Expand Down
2 changes: 1 addition & 1 deletion bot/src/main/java/ml/duncte123/skybot/Variables.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ public final class Variables {
this.apis = new DuncteApis("Bot " + this.config.discord.token, this.mapper);
this.commandManager = new CommandManager(this);
this.blargBot = new BlargBot(this.config.apis.blargbot, this.mapper);
this.audioUtils = new AudioUtils(this.config.apis, this);
this.audioUtils = new AudioUtils(this);
this.alexflipnote = new Alexflipnote(this.mapper, this.config.apis.alexflipnote);
this.weebApi = new WeebApiBuilder(TokenType.WOLKETOKENS)
.setBotInfo("DuncteBot(SkyBot)", Settings.VERSION, "Production")
Expand Down
Loading

0 comments on commit a128e60

Please sign in to comment.