Skip to content

Commit da36944

Browse files
committed
Use cached player instead of fetching it from the node
1 parent 5f4b8ac commit da36944

File tree

6 files changed

+102
-103
lines changed

6 files changed

+102
-103
lines changed

bot/src/main/java/fredboat/audio/player/LavalinkManager.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ public void start(DunctebotConfig config, AudioUtils audioUtils) {
5858

5959
lavalink = new LavalinkClient(userId);
6060

61-
this.registerPlayerUpdateEvent();
6261
this.registerTrackStartEvent();
6362
this.registerTrackEndEvent();
6463
this.registerTrackExceptionEvent();
@@ -138,26 +137,13 @@ private void loadNodes() {
138137
}
139138
}
140139

141-
private void registerPlayerUpdateEvent() {
142-
lavalink.on(PlayerUpdateEvent.class).subscribe((event) -> {
143-
final long guildIdLong = event.getGuildId();
144-
final var mng = audioUtils.getMusicManagers().get(guildIdLong);
145-
146-
if (mng != null) {
147-
mng.getPlayer().updateLocalPlayerState(event.getState());
148-
}
149-
});
150-
}
151-
152140
private void registerTrackStartEvent() {
153141
lavalink.on(TrackStartEvent.class).subscribe((event) -> {
154142
final long guildIdLong = event.getGuildId();
155143
final var mng = audioUtils.getMusicManagers().get(guildIdLong);
156144

157145
if (mng != null) {
158-
final Track track = event.getTrack();
159-
mng.getPlayer().updateCurrentTrack(track);
160-
mng.getScheduler().onTrackStart(track);
146+
mng.getScheduler().onTrackStart(event.getTrack());
161147
}
162148
});
163149
}
@@ -168,7 +154,6 @@ private void registerTrackEndEvent() {
168154
final var mng = audioUtils.getMusicManagers().get(guildIdLong);
169155

170156
if (mng != null) {
171-
mng.getPlayer().updateCurrentTrack(null);
172157
mng.getScheduler().onTrackEnd(event.getTrack(), event.getEndReason());
173158
}
174159
});
@@ -180,7 +165,6 @@ private void registerTrackExceptionEvent() {
180165
final var mng = audioUtils.getMusicManagers().get(guildIdLong);
181166

182167
if (mng != null) {
183-
mng.getPlayer().updateCurrentTrack(null);
184168
mng.getScheduler().onTrackException(event.getTrack(), event.getException());
185169
}
186170
});

bot/src/main/java/me/duncte123/skybot/audio/LocalPlayer.java

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,15 @@
2121
import dev.arbjerg.lavalink.client.IUpdatablePlayer;
2222
import dev.arbjerg.lavalink.client.LavalinkPlayer;
2323
import dev.arbjerg.lavalink.client.Link;
24-
import dev.arbjerg.lavalink.protocol.v4.Filters;
25-
import dev.arbjerg.lavalink.protocol.v4.PlayerState;
2624
import dev.arbjerg.lavalink.client.protocol.Track;
25+
import dev.arbjerg.lavalink.protocol.v4.Filters;
2726
import fredboat.audio.player.LavalinkManager;
28-
import reactor.core.publisher.Mono;
2927

3028
import javax.annotation.Nullable;
31-
import java.util.concurrent.atomic.AtomicReference;
29+
import java.util.Optional;
3230

3331
public class LocalPlayer {
3432
private final long guildId;
35-
private final AtomicReference<Track> currentTrack = new AtomicReference<>(null);
36-
private final AtomicReference<PlayerState> state = new AtomicReference<>(null);
3733

3834
public LocalPlayer(long guildId) {
3935
this.guildId = guildId;
@@ -47,8 +43,10 @@ public IUpdatablePlayer update() {
4743
return this.getLink().createOrUpdatePlayer();
4844
}
4945

50-
public Mono<LavalinkPlayer> getLavalinkPlayer() {
51-
return this.getLink().getPlayer();
46+
public Optional<LavalinkPlayer> getLavalinkPlayer() {
47+
return Optional.ofNullable(
48+
this.getLink().getCachedPlayer()
49+
);
5250
}
5351

5452
public void stopPlayback() {
@@ -72,30 +70,22 @@ public void seekTo(long position) {
7270

7371
@Nullable
7472
public Track getCurrentTrack() {
75-
return this.currentTrack.get();
76-
}
77-
78-
public long getPosition() {
79-
final var currentState = this.state.get();
80-
81-
if (currentState == null) {
82-
final Track currentTrack = getCurrentTrack();
73+
final LavalinkPlayer player = this.getLink().getCachedPlayer();
8374

84-
if (currentTrack == null) {
85-
return 0;
86-
}
87-
88-
return currentTrack.getInfo().getPosition();
75+
if (player == null) {
76+
return null;
8977
}
9078

91-
return currentState.getPosition();
79+
return player.getTrack();
9280
}
9381

94-
public void updateLocalPlayerState(PlayerState state) {
95-
this.state.set(state);
96-
}
82+
public long getPosition() {
83+
final LavalinkPlayer player = this.getLink().getCachedPlayer();
84+
85+
if (player == null) {
86+
return -1;
87+
}
9788

98-
public void updateCurrentTrack(Track track) {
99-
this.currentTrack.set(track);
89+
return player.getPosition();
10090
}
10191
}

bot/src/main/java/me/duncte123/skybot/utils/MusicEmbedUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public class MusicEmbedUtils {
3737
private MusicEmbedUtils() {}
3838

3939
public static void createPlayerString(GuildMusicManager mng, Consumer<String> callback) {
40-
mng.getPlayer().getLavalinkPlayer().subscribe((player) -> {
40+
mng.getPlayer().getLavalinkPlayer().ifPresentOrElse((player) -> {
4141
final TrackInfo trackInfo = player.getTrack().getInfo();
4242
final long position = player.getPosition();
4343
final long duration = trackInfo.getLength();
@@ -51,7 +51,7 @@ public static void createPlayerString(GuildMusicManager mng, Consumer<String> ca
5151
getVolumeIcon(player.getVolume())
5252
)
5353
);
54-
});
54+
}, () -> callback.accept("Not playing anything."));
5555
}
5656

5757
private static String generateProgressBar(double percent) {

bot/src/main/kotlin/me/duncte123/skybot/commands/music/PauseCommand.kt

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,30 +34,36 @@ class PauseCommand : MusicCommand() {
3434
override fun run(ctx: CommandContext) {
3535
val mng = ctx.audioUtils.getMusicManager(ctx.guildId)
3636
val localPlayer = mng.player
37-
val player = localPlayer.lavalinkPlayer.block()!!
3837

39-
if (player.track == null) {
40-
sendMsg(ctx, "Cannot pause or resume player because no track is loaded for playing.")
41-
return
42-
}
38+
localPlayer.lavalinkPlayer.ifPresentOrElse({ player ->
39+
if (player.track == null) {
40+
sendMsg(ctx, "Cannot pause or resume player because no track is loaded for playing.")
41+
return@ifPresentOrElse
42+
}
4343

44-
player.setPaused(!player.paused).asMono().subscribe {
45-
sendMsg(ctx, "The player has ${if (it.paused) "been paused" else "resumed playing"}.")
44+
player.setPaused(!player.paused).subscribe {
45+
sendMsg(ctx, "The player has ${if (it.paused) "been paused" else "resumed playing"}.")
46+
}
47+
}) {
48+
sendMsg(ctx, "Cannot pause or resume player because no track is loaded for playing.")
4649
}
4750
}
4851

4952
override fun handleEvent(event: SlashCommandInteractionEvent, variables: Variables) {
5053
val mng = variables.audioUtils.getMusicManager(event.guild!!.idLong)
5154
val localPlayer = mng.player
52-
val player = localPlayer.lavalinkPlayer.block()!!
5355

54-
if (player.track == null) {
55-
event.reply("Cannot pause or resume player because no track is loaded for playing.").queue()
56-
return
57-
}
56+
localPlayer.lavalinkPlayer.ifPresentOrElse({player ->
57+
if (player.track == null) {
58+
event.reply("Cannot pause or resume player because no track is loaded for playing.").queue()
59+
return@ifPresentOrElse
60+
}
5861

59-
player.setPaused(!player.paused).asMono().subscribe {
60-
event.reply("The player has ${if (it.paused) "been paused" else "resumed playing"}.").queue()
62+
player.setPaused(!player.paused).subscribe {
63+
event.reply("The player has ${if (it.paused) "been paused" else "resumed playing"}.").queue()
64+
}
65+
}) {
66+
event.reply("Cannot pause or resume player because no track is loaded for playing.").queue()
6167
}
6268
}
6369
}

bot/src/main/kotlin/me/duncte123/skybot/commands/music/PlayCommand.kt

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import me.duncte123.skybot.utils.CommandUtils
3030
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent
3131
import net.dv8tion.jda.api.interactions.commands.OptionType
3232
import net.dv8tion.jda.api.interactions.commands.build.SubcommandData
33+
import kotlin.jvm.optionals.getOrNull
3334

3435
open class PlayCommand(private val skipParsing: Boolean = false) : MusicCommand() {
3536
private val pornhubRegex = "https?://([a-z]+\\.)?pornhub\\.(com|net|org)"
@@ -50,23 +51,28 @@ open class PlayCommand(private val skipParsing: Boolean = false) : MusicCommand(
5051
}
5152

5253
val mng = ctx.audioUtils.getMusicManager(ctx.guildId)
53-
val player = mng.player.lavalinkPlayer.block()!!
54-
val scheduler = mng.scheduler
54+
val player = mng.player.lavalinkPlayer.getOrNull()
5555

56-
when {
57-
player.paused -> {
58-
player.setPaused(false).asMono().subscribe()
56+
if (player == null) {
57+
sendMsg(ctx, "Nothing is playing currently, add an argument to play something.")
58+
} else {
59+
val scheduler = mng.scheduler
5960

60-
sendMsg(ctx, "Playback has been resumed.")
61-
}
61+
when {
62+
player.paused -> {
63+
player.setPaused(false).subscribe()
64+
65+
sendMsg(ctx, "Playback has been resumed.")
66+
}
6267

63-
player.track != null -> sendMsg(ctx, "Player is already playing!")
68+
player.track != null -> sendMsg(ctx, "Player is already playing!")
6469

65-
scheduler.queue.isEmpty() -> sendMsg(
66-
ctx,
67-
"The current audio queue is empty! Add something to the queue first!\n" +
68-
"For example `${ctx.prefix}play https://www.youtube.com/watch?v=KKOBXrRzZwA`"
69-
)
70+
scheduler.queue.isEmpty() -> sendMsg(
71+
ctx,
72+
"The current audio queue is empty! Add something to the queue first!\n" +
73+
"For example `${ctx.prefix}play https://www.youtube.com/watch?v=KKOBXrRzZwA`"
74+
)
75+
}
7076
}
7177

7278
return
@@ -75,7 +81,10 @@ open class PlayCommand(private val skipParsing: Boolean = false) : MusicCommand(
7581
var toPlay = ctx.argsRaw
7682

7783
if (toPlay.contains(pornhubRegex.toRegex()) && !ctx.isChannelNSFW) {
78-
sendMsg(ctx, "Because of thumbnails being loaded you can only use PornHub links in channels that are marked as NSFW")
84+
sendMsg(
85+
ctx,
86+
"Because of thumbnails being loaded you can only use PornHub links in channels that are marked as NSFW"
87+
)
7988
return
8089
}
8190

@@ -164,7 +173,8 @@ open class PlayCommand(private val skipParsing: Boolean = false) : MusicCommand(
164173
var toPlay = event.getOption("item")!!.asString
165174

166175
if (toPlay.contains(pornhubRegex.toRegex()) && !event.channel.isNSFW) {
167-
event.reply("Because of thumbnails being loaded you can only use PornHub links in channels that are marked as NSFW").queue()
176+
event.reply("Because of thumbnails being loaded you can only use PornHub links in channels that are marked as NSFW")
177+
.queue()
168178
return
169179
}
170180

bot/src/main/kotlin/me/duncte123/skybot/commands/music/VolumeCommand.kt

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEve
2727
import net.dv8tion.jda.api.interactions.commands.OptionType
2828
import net.dv8tion.jda.api.interactions.commands.build.OptionData
2929
import net.dv8tion.jda.api.interactions.commands.build.SubcommandData
30+
import kotlin.jvm.optionals.getOrNull
3031
import kotlin.math.max
3132
import kotlin.math.min
3233

@@ -43,24 +44,28 @@ class VolumeCommand : MusicCommand() {
4344
}
4445

4546
val mng = ctx.audioUtils.getMusicManager(ctx.guildId)
46-
val player = mng.player.lavalinkPlayer.block()!!
47-
val args = ctx.args
4847

49-
if (args.isEmpty()) {
50-
sendMsg(ctx, "The current volume is **${player.volume}%**")
51-
return
52-
}
48+
mng.player.lavalinkPlayer.ifPresentOrElse({ player ->
49+
val args = ctx.args
50+
51+
if (args.isEmpty()) {
52+
sendMsg(ctx, "The current volume is **${player.volume}%**")
53+
return@ifPresentOrElse
54+
}
5355

54-
try {
55-
val userInput = args[0].toInt()
56-
val newVolume = max(0, min(1000, userInput))
57-
val oldVolume = player.volume
56+
try {
57+
val userInput = args[0].toInt()
58+
val newVolume = max(0, min(1000, userInput))
59+
val oldVolume = player.volume
5860

59-
player.setVolume(newVolume).asMono().subscribe()
61+
player.setVolume(newVolume).subscribe()
6062

61-
sendMsg(ctx, "Player volume changed from **$oldVolume%** to **$newVolume%**")
62-
} catch (e: NumberFormatException) {
63-
sendMsg(ctx, "**${args[0]}** is not a valid integer. (0 - 1000)")
63+
sendMsg(ctx, "Player volume changed from **$oldVolume%** to **$newVolume%**")
64+
} catch (e: NumberFormatException) {
65+
sendMsg(ctx, "**${args[0]}** is not a valid integer. (0 - 1000)")
66+
}
67+
}) {
68+
sendMsg(ctx, "There is no player connected to this guild")
6469
}
6570
}
6671

@@ -84,24 +89,28 @@ class VolumeCommand : MusicCommand() {
8489
}
8590

8691
val mng = variables.audioUtils.getMusicManager(event.guild!!.idLong)
87-
val player = mng.player.lavalinkPlayer.block()!!
88-
val volumeOpt = event.getOption("volume")
8992

90-
if (volumeOpt == null) {
91-
event.reply("The current volume is **${player.volume}%**").queue()
92-
return
93-
}
93+
mng.player.lavalinkPlayer.ifPresentOrElse({ player ->
94+
val volumeOpt = event.getOption("volume")
95+
96+
if (volumeOpt == null) {
97+
event.reply("The current volume is **${player.volume}%**").queue()
98+
return@ifPresentOrElse
99+
}
94100

95-
try {
96-
val userInput = volumeOpt.asInt
97-
val newVolume = max(0, min(1000, userInput))
98-
val oldVolume = player.volume
101+
try {
102+
val userInput = volumeOpt.asInt
103+
val newVolume = max(0, min(1000, userInput))
104+
val oldVolume = player.volume
99105

100-
player.setVolume(newVolume).asMono().subscribe()
106+
player.setVolume(newVolume).subscribe()
101107

102-
event.reply("Player volume changed from **$oldVolume%** to **$newVolume%**").queue()
103-
} catch (e: NumberFormatException) {
104-
event.reply("**${volumeOpt.asString}** is not a valid integer. (0 - 1000)").queue()
108+
event.reply("Player volume changed from **$oldVolume%** to **$newVolume%**").queue()
109+
} catch (e: NumberFormatException) {
110+
event.reply("**${volumeOpt.asString}** is not a valid integer. (0 - 1000)").queue()
111+
}
112+
}) {
113+
event.reply("There is no player connected to this guild").queue()
105114
}
106115
}
107116
}

0 commit comments

Comments
 (0)