Improve cleanup for music player, fix resume logic, check if player is connected before checking url, refactor context

This commit is contained in:
anthorob committed 2026-08-24 17:02:38 -04:00
1 parent ddd7d119bb
commit 81e15a5394
5 files changed
+48 -152

No files matched your search

@@ -5,7 +5,6 @@ package me.bobert.netneutrality.context;
* https://discord.gg/qUa6zNFZsd * https://discord.gg/qUa6zNFZsd
*/ */
import me.bobert.netneutrality.core.AsyncMessage;
import me.bobert.netneutrality.core.context.CommandContext; import me.bobert.netneutrality.core.context.CommandContext;
import me.bobert.netneutrality.utils.Settings; import me.bobert.netneutrality.utils.Settings;
import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.Message;
@@ -15,6 +14,7 @@ import net.dv8tion.jda.api.interactions.components.LayoutComponent;
import net.dv8tion.jda.api.interactions.modals.Modal; import net.dv8tion.jda.api.interactions.modals.Modal;
import net.dv8tion.jda.api.utils.messages.MessageCreateData; import net.dv8tion.jda.api.utils.messages.MessageCreateData;
import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Consumer; import java.util.function.Consumer;
@@ -77,14 +77,14 @@ public class MessageCommandContext extends CommandContext {
} }
@Override @Override
public void defer(Consumer<AsyncMessage> consumer) { public void defer(boolean ephemeral, Consumer<AsyncContext> consumer) {
reply("Bot is thinking...", consumer); reply("Bot is thinking...", consumer);
} }
@Override @Override
public void reply(MessageCreateData messageCreateData, boolean ephemeral, Consumer<AsyncMessage> consumer, LayoutComponent... components) { public void reply(MessageCreateData messageCreateData, boolean ephemeral, List<LayoutComponent> components, Consumer<AsyncContext> consumer) {
if (getChannel() != null && getChannel().canTalk()) { if (getChannel() != null && getChannel().canTalk()) {
message.reply(messageCreateData).setComponents(components).queue(message1 -> consumer.accept(new AsyncMessage(message1))); message.reply(messageCreateData).setComponents(components).queue(message -> consumer.accept(new AsyncContext(message)));
} }
} }
@@ -94,8 +94,8 @@ public class MessageCommandContext extends CommandContext {
} }
@Override @Override
public void replyEphemeral(MessageCreateData message) { public void replyEphemeral(MessageCreateData messageCreateData) {
sendMessageInPrivate(message); sendMessageInPrivate(messageCreateData);
} }
@Override @Override
@@ -5,17 +5,13 @@ package me.bobert.netneutrality.context;
* https://discord.gg/qUa6zNFZsd * https://discord.gg/qUa6zNFZsd
*/ */
import me.bobert.netneutrality.core.AsyncMessage;
import me.bobert.netneutrality.core.context.CommandContext; import me.bobert.netneutrality.core.context.CommandContext;
import me.bobert.netneutrality.core.context.InteractionContext;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.InteractionHook; import net.dv8tion.jda.api.interactions.InteractionHook;
import net.dv8tion.jda.api.interactions.components.LayoutComponent;
import net.dv8tion.jda.api.interactions.modals.Modal; import net.dv8tion.jda.api.interactions.modals.Modal;
import net.dv8tion.jda.api.utils.messages.MessageCreateData;
import java.util.function.Consumer; public class SlashCommandContext extends CommandContext implements InteractionContext {
public class SlashCommandContext extends CommandContext {
private final SlashCommandInteractionEvent event; private final SlashCommandInteractionEvent event;
public SlashCommandContext(SlashCommandInteractionEvent event) { public SlashCommandContext(SlashCommandInteractionEvent event) {
@@ -28,16 +24,6 @@ public class SlashCommandContext extends CommandContext {
return event; return event;
} }
@Override
public boolean isAcknowledged() {
return event.isAcknowledged();
}
@Override
public boolean isFromGuild() {
return event.isFromGuild();
}
@Override @Override
public InteractionHook getInteractionHook() { public InteractionHook getInteractionHook() {
if (!event.isAcknowledged()) if (!event.isAcknowledged())
@@ -51,36 +37,11 @@ public class SlashCommandContext extends CommandContext {
// not implemented // not implemented
} }
@Override
public void defer(Consumer<AsyncMessage> consumer) {
event.deferReply().queue(hook -> consumer.accept(new AsyncMessage(hook)));
}
@Override
public void reply(MessageCreateData message, boolean ephemeral, Consumer<AsyncMessage> consumer, LayoutComponent... components) {
if (isAcknowledged()) {
getInteractionHook().sendMessage(message).setEphemeral(ephemeral).setComponents(components)
.queue(message1 -> consumer.accept(new AsyncMessage(message1)));
return;
}
event.reply(message).setEphemeral(ephemeral).setComponents(components)
.queue(message1 -> consumer.accept(new AsyncMessage(message1)));
}
@Override @Override
public void reply(Modal modal) { public void reply(Modal modal) {
event.replyModal(modal).queue(); event.replyModal(modal).queue();
} }
@Override
public void ack(boolean ephemeral) {
if (event.isAcknowledged())
throw new RuntimeException("Interaction is already acknowledged, please use getInteractionHook() instead.");
event.deferReply(ephemeral).queue();
}
@Override @Override
public String parseCommandName() { public String parseCommandName() {
return event.getName(); return event.getName();
@@ -1,102 +0,0 @@
package me.bobert.netneutrality.core;
/*
* Copyright (c) anthorob
*
* https://discord.gg/qUa6zNFZsd
*/
import me.bobert.netneutrality.core.context.AbstractContext;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.events.Event;
import net.dv8tion.jda.api.interactions.InteractionHook;
import net.dv8tion.jda.api.interactions.components.LayoutComponent;
import net.dv8tion.jda.api.interactions.modals.Modal;
import net.dv8tion.jda.api.utils.messages.MessageCreateData;
import net.dv8tion.jda.api.utils.messages.MessageEditData;
import java.util.function.Consumer;
public class AsyncMessage extends AbstractContext {
private final InteractionHook hook;
private final Message message;
public AsyncMessage(InteractionHook hook) {
super(hook.getJDA(), hook.getInteraction().getGuild(), hook.getInteraction().getMessageChannel(), hook.getInteraction().getMember(), hook.getInteraction().getUser());
this.hook = hook;
this.message = null;
}
public AsyncMessage(Message message) {
super(message.getJDA(), message.getGuild(), message.getChannel(), message.getMember(), message.getAuthor());
this.hook = null;
this.message = message;
}
@Override
public Event getEvent() {
return null;
}
@Override
public InteractionHook getInteractionHook() {
return hook;
}
@Override
public boolean isAcknowledged() {
return true;
}
@Override
public boolean isFromGuild() {
return false;
}
@Override
public void deleteMessage() {
if (hook != null) {
hook.deleteOriginal().queue();
}
if (message != null) {
message.delete().queue();
}
}
@Override
public void reply(Modal modal) {
}
@Override
public void reply(MessageCreateData messageCreateData, boolean ephemeral, Consumer<AsyncMessage> consumer, LayoutComponent... components) {
if (hook != null) {
hook.sendMessage(messageCreateData).queue();
}
if (message != null) {
message.reply(messageCreateData).queue();
}
}
@Override
public void defer(Consumer<AsyncMessage> consumer) {
}
@Override
public void ack(boolean ephemeral) {
}
@Override
public void edit(MessageEditData messageEditData, boolean ephemeral, Consumer<AsyncMessage> consumer, LayoutComponent... components) {
if (hook != null) {
hook.editOriginal(messageEditData).queue();
}
if (message != null) {
message.editMessage(messageEditData).queue();
}
}
}
@@ -44,9 +44,7 @@ public class AddAllTracksTask extends ButtonTask implements WithParent<LoadPlayl
Member member = context.getGuildUser(); Member member = context.getGuildUser();
if (MusicUtils.connect(context)) { if (MusicUtils.connect(context)) {
for (AudioTrack track : tracks) { manager.getQueueManager().queue(tracks, member);
manager.getQueueManager().queue(track, member);
}
context.reply(MessageFunction.buildAddingPlaylistMessage(tracks, parentTask.getPlaylist().getName(), member, SourceFinder.AudioSourceType.Youtube)); context.reply(MessageFunction.buildAddingPlaylistMessage(tracks, parentTask.getPlaylist().getName(), member, SourceFinder.AudioSourceType.Youtube));
} }
@@ -0,0 +1,39 @@
package me.bobert.netneutrality.thread;
/*
* Copyright (c) anthorob
*
* https://discord.gg/qUa6zNFZsd
*/
import me.bobert.netneutrality.music.MusicManager;
import me.bobert.netneutrality.music.TrackScheduler;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MusicManagerCleanupThread implements Runnable {
private static final Logger logger = LogManager.getLogger(MusicManagerCleanupThread.class);
@Override
public void run() {
try {
for (MusicManager manager : MusicManager.getManagers()) {
processManager(manager);
}
} catch (InterruptedException e) {
logger.error("Interrupted while running MusicManagerCleanupThread", e);
}
}
private void processManager(MusicManager manager) throws InterruptedException {
TrackScheduler scheduler = manager.getScheduler();
// Context is still attached after bot is disconnected, the bot might have been kicked from the channel
if (scheduler.getContext() != null && !manager.isConnected()) {
manager.disconnect();
manager.getQueueManager().clearQueue();
}
}
}