Improve music list
The code for it is messier now but it is better functionality-wise so yuup!!!!
This commit is contained in:
parent
1b6f040122
commit
46a3d8e3ef
1 changed files with 52 additions and 5 deletions
|
@ -1,5 +1,6 @@
|
||||||
package land.chipmunk.chipmunkbot.commands;
|
package land.chipmunk.chipmunkbot.commands;
|
||||||
|
|
||||||
|
import land.chipmunk.chipmunkbot.ChipmunkBot;
|
||||||
import land.chipmunk.chipmunkbot.song.Song;
|
import land.chipmunk.chipmunkbot.song.Song;
|
||||||
import land.chipmunk.chipmunkbot.plugins.SongPlayer;
|
import land.chipmunk.chipmunkbot.plugins.SongPlayer;
|
||||||
import land.chipmunk.chipmunkbot.command.*;
|
import land.chipmunk.chipmunkbot.command.*;
|
||||||
|
@ -21,7 +22,10 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
||||||
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
|
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
|
import net.kyori.adventure.text.event.ClickEvent;
|
||||||
|
import net.kyori.adventure.text.event.HoverEvent;
|
||||||
import net.kyori.adventure.text.JoinConfiguration;
|
import net.kyori.adventure.text.JoinConfiguration;
|
||||||
|
import java.io.File;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -134,23 +138,66 @@ public class MusicCommand {
|
||||||
|
|
||||||
public int list (CommandContext<CommandSource> context, Path path) throws CommandSyntaxException {
|
public int list (CommandContext<CommandSource> context, Path path) throws CommandSyntaxException {
|
||||||
final CommandSource source = context.getSource();
|
final CommandSource source = context.getSource();
|
||||||
final SongPlayer songPlayer = source.client().songPlayer();
|
final ChipmunkBot client = source.client();
|
||||||
|
final String prefix = client.chatCommandHandler().prefix();
|
||||||
|
|
||||||
final String[] filenames = path.toFile().list();
|
final File directory = path.toFile();
|
||||||
|
final String[] filenames = directory.list();
|
||||||
if (filenames == null) throw DIRECTORY_DOES_NOT_EXIST.create();
|
if (filenames == null) throw DIRECTORY_DOES_NOT_EXIST.create();
|
||||||
|
|
||||||
final List<Component> list = new ArrayList<>();
|
final Path root = Path.of(SongPlayer.SONG_DIR.getAbsoluteFile().getPath()).toAbsolutePath();
|
||||||
|
String relativePath;
|
||||||
|
if (path.getNameCount() - root.getNameCount() > 0) relativePath = path.subpath(root.getNameCount(), path.getNameCount()).toString();
|
||||||
|
else relativePath = "";
|
||||||
|
|
||||||
|
final List<Component> directories = new ArrayList<>();
|
||||||
|
final List<Component> files = new ArrayList<>();
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
for (String filename : filenames) {
|
for (String filename : filenames) {
|
||||||
list.add(Component.text(filename, (i++ & 1) == 0 ? NamedTextColor.DARK_GREEN : NamedTextColor.GREEN));
|
final NamedTextColor color = (i++ & 1) == 0 ? NamedTextColor.DARK_GREEN : NamedTextColor.GREEN;
|
||||||
|
|
||||||
|
final File file = new File(directory, filename);
|
||||||
|
final Path relativeFilepath = Path.of(relativePath, filename);
|
||||||
|
final String escapedPath = escapePath(relativeFilepath.toString());
|
||||||
|
|
||||||
|
if (file.isDirectory()) {
|
||||||
|
directories.add(
|
||||||
|
Component.text(filename + "/", color)
|
||||||
|
.clickEvent(ClickEvent.suggestCommand(prefix + "music list " + escapedPath))
|
||||||
|
.hoverEvent(HoverEvent.showText(Component.translatable("Click to list %s", Component.text(filename, NamedTextColor.GREEN))))
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
files.add(
|
||||||
|
Component.text(filename, color)
|
||||||
|
.clickEvent(ClickEvent.suggestCommand(prefix + "music play " + escapedPath))
|
||||||
|
.hoverEvent(HoverEvent.showText(Component.translatable("Click to play %s", Component.text(filename, NamedTextColor.GREEN))))
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final Component component = Component.translatable("Songs - %s", Component.join(JoinConfiguration.separator(Component.space()), list)).color(NamedTextColor.GREEN);
|
final ArrayList<Component> mergedList = new ArrayList<>();
|
||||||
|
for (Component component : directories) mergedList.add(component);
|
||||||
|
for (Component component : files) mergedList.add(component);
|
||||||
|
final Component component = Component.translatable("Songs - %s", Component.join(JoinConfiguration.separator(Component.space()), mergedList)).color(NamedTextColor.GREEN);
|
||||||
source.sendOutput(component, false);
|
source.sendOutput(component, false);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Move this into some utility class, as it is more related to brigadier strings in general than to the list command in specific
|
||||||
|
private String escapePath (String path) {
|
||||||
|
final StringBuilder sb = new StringBuilder("'");
|
||||||
|
|
||||||
|
for (char character : path.toCharArray()) {
|
||||||
|
if (character == '\'' || character == '\\') sb.append('\\');
|
||||||
|
sb.append(character);
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.append("'");
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
public int toggleLoop (CommandContext<CommandSource> context) throws CommandSyntaxException {
|
public int toggleLoop (CommandContext<CommandSource> context) throws CommandSyntaxException {
|
||||||
final CommandSource source = context.getSource();
|
final CommandSource source = context.getSource();
|
||||||
final SongPlayer songPlayer = source.client().songPlayer();
|
final SongPlayer songPlayer = source.client().songPlayer();
|
||||||
|
|
Loading…
Reference in a new issue