Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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