Skip to content

Commit 2a91585

Browse files
committed
Finally overhauled the music command system... should work alot nicer, and supports playlists!
Now only supports YT, nothing else...
1 parent 76b9042 commit 2a91585

File tree

12 files changed

+311
-104
lines changed

12 files changed

+311
-104
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ dependencies {
7171
installer('org.mangorage:installer:4.0.13')
7272

7373
bootstrap("org.mangorage:mangobotbootstrap:1.0.22")
74-
plugin('org.mangorage:mangobot:12.0.57')
74+
plugin('org.mangorage:mangobot:12.0.61')
7575

7676
library 'org.slf4j:slf4j-simple:2.0.13' // Use a recent version)
7777
library('org.luaj:luaj-jme:3.0.1')
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package org.mangorage.mangobotplugin;
2+
3+
import net.dv8tion.jda.api.entities.Message;
4+
import net.dv8tion.jda.api.interactions.components.buttons.Button;
5+
import org.mangorage.commonutils.misc.PagedList;
6+
import org.mangorage.mangobotcore.jda.event.DiscordButtonInteractEvent;
7+
8+
import java.util.HashMap;
9+
import java.util.Map;
10+
11+
public final class PagedListManager {
12+
// Key must be a messageId
13+
private final Map<String, PagedListWithAction> pages = new HashMap<>();
14+
15+
public PagedListManager() {
16+
DiscordButtonInteractEvent.BUS.addListener(this::onButton);
17+
}
18+
19+
public void putList(String id, PagedListWithAction pagedListWithAction) {
20+
pages.put(id, pagedListWithAction);
21+
}
22+
23+
public void removeList(String id) {
24+
pages.remove(id);
25+
}
26+
27+
public PagedList.Page<String> next(String id) {
28+
return pages.get(id).get().next();
29+
}
30+
31+
public PagedList.Page<String> previous(String id) {
32+
return pages.get(id).get().previous();
33+
}
34+
35+
private void update(PagedListWithAction action, String buttonID) {
36+
var list = action.get();
37+
38+
switch (buttonID) {
39+
case "next" -> list.next();
40+
case "prev" -> list.previous();
41+
}
42+
43+
action.consume();
44+
}
45+
46+
47+
public void onButton(DiscordButtonInteractEvent event) {
48+
var interaction = event.getDiscordEvent();
49+
50+
Message message = interaction.getMessage();
51+
String ID = message.getId();
52+
53+
if (pages.containsKey(ID)) {
54+
update(pages.get(ID), interaction.getButton().getId());
55+
interaction.getInteraction().deferEdit().queue();
56+
}
57+
}
58+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.mangorage.mangobotplugin;
2+
3+
import org.apache.logging.log4j.util.TriConsumer;
4+
import org.mangorage.commonutils.misc.PagedList;
5+
6+
import java.util.function.BiConsumer;
7+
import java.util.function.Consumer;
8+
import java.util.function.Supplier;
9+
10+
public final class PagedListWithAction {
11+
private final PagedList<String> pagedList = new PagedList<>();
12+
private final TriConsumer<PagedList.Page<String>, Integer, Integer> consumer;
13+
14+
public PagedListWithAction(TriConsumer<PagedList.Page<String>, Integer, Integer> consumer) {
15+
this.consumer = consumer;
16+
}
17+
18+
public void consume() {
19+
consumer.accept(pagedList.current(), pagedList.getPage(), pagedList.totalPages());
20+
}
21+
22+
public PagedList<String> get() {
23+
return pagedList;
24+
}
25+
}

src/main/java/org/mangorage/mangobotplugin/commands/music/MusicPlayer.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import java.util.ArrayDeque;
4141
import java.util.Deque;
4242
import java.util.HashMap;
43+
import java.util.List;
4344
import java.util.function.Consumer;
4445

4546
public final class MusicPlayer extends AudioEventAdapter implements AudioSendHandler {
@@ -56,7 +57,7 @@ public static MusicPlayer getInstance(String guildID) {
5657

5758
private final DefaultAudioPlayerManager manager;
5859
private final DefaultAudioPlayer audioPlayer;
59-
private final Deque<AudioTrack> TRACKS_QUEUE = new ArrayDeque<>();
60+
private final Deque<AudioTrack> tracks = new ArrayDeque<>();
6061
private final String guildID;
6162
private AudioStatus status = AudioStatus.STOPPED;
6263
private AudioFrame lastFrame;
@@ -86,8 +87,12 @@ public boolean isPlaying() {
8687
return audioPlayer.getPlayingTrack() != null;
8788
}
8889

90+
public boolean isPaused() {
91+
return audioPlayer.isPaused();
92+
}
93+
8994
public boolean isQueueEmpty() {
90-
return TRACKS_QUEUE.isEmpty();
95+
return tracks.isEmpty();
9196
}
9297

9398
public void load(String URL, Consumer<AudioTrackEvent> eventConsumer) {
@@ -96,28 +101,27 @@ public void load(String URL, Consumer<AudioTrackEvent> eventConsumer) {
96101
manager.loadItem(new AudioReference(URL.trim(), null), new AudioLoadResultHandler() {
97102
@Override
98103
public void trackLoaded(AudioTrack track) {
104+
add(track);
99105
eventConsumer.accept(new AudioTrackEvent(track, AudioTrackEvent.Info.SUCCESS));
100-
System.out.println("LOL");
101106
}
102107

103108
@Override
104109
public void playlistLoaded(AudioPlaylist playlist) {
105-
// Allow playlists maybe?
110+
playlist.getTracks().forEach(track -> {
111+
add(track);
112+
});
106113
eventConsumer.accept(new AudioTrackEvent(playlist.getSelectedTrack(), AudioTrackEvent.Info.SUCCESS));
107-
System.out.println("LOL");
108114
}
109115

110116
@Override
111117
public void noMatches() {
112118
eventConsumer.accept(new AudioTrackEvent(null, AudioTrackEvent.Info.NO_MATCHES));
113-
System.out.println("LOL");
114119
}
115120

116121
@Override
117122
public void loadFailed(FriendlyException exception) {
118123
eventConsumer.accept(new AudioTrackEvent(null, AudioTrackEvent.Info.FAILED));
119124
LogHelper.info(exception.getMessage());
120-
exception.printStackTrace();
121125
}
122126
});
123127
} catch (Throwable e) {
@@ -129,18 +133,22 @@ public AudioStatus getStatus() {
129133
return this.status;
130134
}
131135

136+
public List<AudioTrack> getTracks() {
137+
return tracks.stream().toList();
138+
}
139+
132140
public void play() {
133-
AudioTrack track = TRACKS_QUEUE.poll();
141+
AudioTrack track = tracks.poll();
134142
if (track != null)
135143
audioPlayer.playTrack(track);
136144
}
137145

138146
public void playNext() {
139-
147+
play();
140148
}
141149

142150
public void add(AudioTrack track) {
143-
TRACKS_QUEUE.add(track);
151+
tracks.add(track);
144152
}
145153

146154
public void pause() {
@@ -149,6 +157,8 @@ public void pause() {
149157

150158
public void resume() {
151159
audioPlayer.setPaused(false);
160+
if (audioPlayer.getPlayingTrack() == null)
161+
playNext();
152162
}
153163

154164
public void stop() {

src/main/java/org/mangorage/mangobotplugin/commands/music/MusicUtil.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,18 @@
2727
import net.dv8tion.jda.api.audio.SpeakingMode;
2828
import net.dv8tion.jda.api.entities.Guild;
2929
import net.dv8tion.jda.api.entities.channel.concrete.VoiceChannel;
30+
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
31+
import net.dv8tion.jda.api.interactions.components.buttons.Button;
3032
import net.dv8tion.jda.api.managers.AudioManager;
33+
import net.dv8tion.jda.api.utils.MarkdownUtil;
3134
import org.mangorage.commonutils.log.LogHelper;
35+
import org.mangorage.commonutils.misc.PagedList;
36+
import org.mangorage.commonutils.misc.RunnableTask;
37+
import org.mangorage.commonutils.misc.TaskScheduler;
38+
import org.mangorage.mangobotplugin.PagedListManager;
39+
import org.mangorage.mangobotplugin.PagedListWithAction;
40+
41+
import java.util.concurrent.TimeUnit;
3242

3343
public class MusicUtil {
3444
public static void connectToAudioChannel(VoiceChannel channel) {
@@ -76,4 +86,55 @@ public static void leaveVoiceChannel(Guild guild) {
7686
public static void registerRemoteSources(AudioPlayerManager playerManager) {
7787
playerManager.registerSourceManager(new YoutubeAudioSourceManager());
7888
}
89+
90+
public static String formatDuration(long millis) {
91+
long seconds = millis / 1000;
92+
long hours = seconds / 3600;
93+
long minutes = (seconds % 3600) / 60;
94+
long secs = seconds % 60;
95+
96+
StringBuilder sb = new StringBuilder();
97+
if (hours > 0) sb.append(hours).append("h ");
98+
if (minutes > 0) sb.append(minutes).append("m ");
99+
if (secs > 0 || sb.length() == 0) sb.append(secs).append("s");
100+
101+
return sb.toString().trim();
102+
}
103+
104+
private static String getResult(PagedList.Page<String> page, int currentPage, int totalPage) {
105+
return """
106+
Song: (%s/%s)
107+
%s
108+
""".formatted(currentPage, totalPage, page.getEntries()[0]);
109+
}
110+
111+
public static void sendSongs(MessageChannel channel, PagedListManager listManager, MusicPlayer player) {
112+
var songs = player
113+
.getTracks()
114+
.stream()
115+
.map(track -> {
116+
return MarkdownUtil.maskedLink(track.getInfo().title, track.getInfo().uri);
117+
})
118+
.toArray(String[]::new);
119+
120+
121+
channel.sendMessage(
122+
"""
123+
Getting List...
124+
"""
125+
).queue(m -> {
126+
var list = new PagedListWithAction((page, current, total) -> {
127+
m.editMessage(getResult(page, current, total)).queue();
128+
});
129+
130+
list.get().rebuild(songs, 1);
131+
132+
Button prev = Button.primary("prev".formatted(m.getId()), "previous");
133+
Button next = Button.primary("next".formatted(m.getId()), "next");
134+
135+
m.editMessage(getResult(list.get().current(), list.get().getPage(), list.get().totalPages())).setActionRow(prev, next).queue();
136+
137+
listManager.putList(m.getId(), list);
138+
});
139+
}
79140
}

src/main/java/org/mangorage/mangobotplugin/commands/music/commands/PauseCommand.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@
2828
import net.dv8tion.jda.api.entities.Message;
2929
import net.dv8tion.jda.api.entities.MessageEmbed;
3030
import net.dv8tion.jda.api.entities.channel.unions.MessageChannelUnion;
31+
import net.dv8tion.jda.api.utils.MarkdownUtil;
3132
import org.jetbrains.annotations.NotNull;
3233
import org.mangorage.commonutils.misc.Arguments;
3334
import org.mangorage.mangobotcore.jda.command.api.CommandResult;
3435
import org.mangorage.mangobotcore.jda.command.api.ICommand;
3536
import org.mangorage.mangobotplugin.commands.music.MusicPlayer;
37+
import org.mangorage.mangobotplugin.commands.music.MusicUtil;
3638

3739
import java.util.List;
3840

@@ -63,10 +65,14 @@ public CommandResult execute(Message message, Arguments args) {
6365
MusicPlayer.getInstance(guild.getId()).pause();
6466
AudioTrack track = MusicPlayer.getInstance(guild.getId()).getPlaying();
6567

66-
MessageEmbed embed = new EmbedBuilder()
67-
.setTitle(track.getInfo().title, track.getInfo().uri)
68-
.build();
69-
channel.sendMessage("Paused: ").addEmbeds(embed).queue();
68+
channel.sendMessage(
69+
"""
70+
Paused:
71+
%s/%s
72+
%s
73+
""".formatted(MusicUtil.formatDuration(track.getPosition()), MusicUtil.formatDuration(track.getDuration()), MarkdownUtil.maskedLink(track.getInfo().title, track.getInfo().uri))).queue();
74+
75+
7076
} else
7177
channel.sendMessage("Nothing is playing").queue();
7278
return CommandResult.PASS;

0 commit comments

Comments
 (0)