diff --git a/src/main/java/me/chayapak1/chomensbot_mabe/Bot.java b/src/main/java/me/chayapak1/chomensbot_mabe/Bot.java index 8f77bf03..2739e36d 100644 --- a/src/main/java/me/chayapak1/chomensbot_mabe/Bot.java +++ b/src/main/java/me/chayapak1/chomensbot_mabe/Bot.java @@ -88,6 +88,7 @@ public class Bot { for (SessionListener listener : listeners) { listener.packetError(packetErrorEvent); } + packetErrorEvent.setSuppress(false); // ? idk what this does but whatever } @Override diff --git a/src/main/java/me/chayapak1/chomensbot_mabe/commands/MusicCommand.java b/src/main/java/me/chayapak1/chomensbot_mabe/commands/MusicCommand.java index fc60cfbe..98b12826 100644 --- a/src/main/java/me/chayapak1/chomensbot_mabe/commands/MusicCommand.java +++ b/src/main/java/me/chayapak1/chomensbot_mabe/commands/MusicCommand.java @@ -4,6 +4,7 @@ import me.chayapak1.chomensbot_mabe.Bot; import me.chayapak1.chomensbot_mabe.command.Command; import me.chayapak1.chomensbot_mabe.command.CommandContext; import me.chayapak1.chomensbot_mabe.plugins.MusicPlayerPlugin; +import me.chayapak1.chomensbot_mabe.song.Song; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.JoinConfiguration; import net.kyori.adventure.text.event.ClickEvent; @@ -16,6 +17,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedList; import java.util.List; public class MusicCommand implements Command { @@ -36,6 +38,9 @@ public class MusicCommand implements Command { usages.add("skip"); usages.add("nowplaying"); usages.add("queue"); + usages.add("goto"); + usages.add("pause"); + usages.add("resume"); return usages; } @@ -67,6 +72,19 @@ public class MusicCommand implements Command { case "skip" -> { return skip(context); } + case "nowplaying" -> { + return nowplaying(context); + } + case "queue" -> queue(context); + case "goto" -> { + return goTo(context, args); + } + case "pause", "resume" -> { + return pause(context); + } + default -> { + return Component.text("Invalid argument").color(NamedTextColor.RED); + } } return Component.text("success"); @@ -102,15 +120,32 @@ public class MusicCommand implements Command { int loop; switch (args[1]) { - case "off" -> loop = 0; - case "current" -> loop = 1; - case "all" -> loop = 2; + case "off" -> { + loop = 0; + context.sendOutput( + Component.empty() + .append(Component.text("Looping is now ")) + .append(Component.text("disabled").color(NamedTextColor.RED)) + ); + } + case "current" -> { + loop = 1; + context.sendOutput( + Component.empty() + .append(Component.text("Now looping ")) + .append(bot.music().currentSong().name.color(NamedTextColor.GOLD)) + ); + } + case "all" -> { + loop = 2; + context.sendOutput(Component.text("Now looping every song")); + } default -> { - return Component.text("Invalid argument"); + return Component.text("Invalid argument").color(NamedTextColor.RED); } } - bot.music().currentSong().looping = loop; + bot.music().loop(loop); return Component.text("success"); } @@ -167,7 +202,65 @@ public class MusicCommand implements Command { .append(music.currentSong().name.color(NamedTextColor.GOLD)) ); - music.stopPlaying(); + music.skip(); + + return Component.text("success"); + } + + public Component nowplaying (CommandContext context) { + final Bot bot = context.bot(); + final Song song = bot.music().currentSong(); + if (song == null) return Component.text("No song is currently playing").color(NamedTextColor.RED); + context.sendOutput( + Component.empty() + .append(Component.text("Now playing ")) + .append(song.name.color(NamedTextColor.GOLD)) + ); + + return Component.text("success"); + } + + public void queue (CommandContext context) { + final Bot bot = context.bot(); + final LinkedList queue = bot.music().songQueue(); + + final List queueWithNames = new ArrayList<>(); + for (Song song : queue) queueWithNames.add(song.name); + + context.sendOutput( + Component.empty() + .append(Component.text("Queue: ").color(NamedTextColor.GREEN)) + .append(Component.join(JoinConfiguration.separator(Component.space()), queueWithNames)) + ); + } + + // lazy fix for java using "goto" as keyword real + public Component goTo (CommandContext context, String[] args) { + final Bot bot = context.bot(); + final Song currentSong = bot.music().currentSong(); + final long milliseconds = Long.getLong(args[0]); + + if (currentSong == null) return Component.text("No song is currently playing").color(NamedTextColor.RED); + if (milliseconds < 0 || milliseconds > currentSong.length) return Component.text("Invalid timestamp").color(NamedTextColor.RED); + + currentSong.setTime(milliseconds); + + return Component.text("success"); + } + + public Component pause (CommandContext context) { + final Bot bot = context.bot(); + final Song currentSong = bot.music().currentSong(); + + if (currentSong == null) return Component.text("No song is currently playing").color(NamedTextColor.RED); + + if (currentSong.paused) { + currentSong.play(); + context.sendOutput(Component.text("Resumed the current song")); + } else { + currentSong.pause(); + context.sendOutput(Component.text("Paused the current song")); + } return Component.text("success"); } diff --git a/src/main/java/me/chayapak1/chomensbot_mabe/plugins/MusicPlayerPlugin.java b/src/main/java/me/chayapak1/chomensbot_mabe/plugins/MusicPlayerPlugin.java index fcf78fb6..ebe540f4 100644 --- a/src/main/java/me/chayapak1/chomensbot_mabe/plugins/MusicPlayerPlugin.java +++ b/src/main/java/me/chayapak1/chomensbot_mabe/plugins/MusicPlayerPlugin.java @@ -36,7 +36,8 @@ public class MusicPlayerPlugin extends SessionAdapter { @Getter @Setter private Song currentSong; @Getter @Setter private LinkedList songQueue = new LinkedList<>(); @Getter @Setter private SongLoaderThread loaderThread; - private int ticksUntilPausedActionbar = 20; + @Getter @Setter private int loop = 0; + private int ticksUntilPausedBossbar = 20; private final String bossbarName = "chomens_bot:music"; // maybe make this in the config? public MusicPlayerPlugin (Bot bot) { @@ -97,13 +98,13 @@ public class MusicPlayerPlugin extends SessionAdapter { if (currentSong == null) { if (songQueue.size() == 0) return; - currentSong = songQueue.poll(); + currentSong = songQueue.get(0); // songQueue.poll(); bot.chat().tellraw(Component.translatable("Now playing %s", Component.empty().append(currentSong.name).color(NamedTextColor.GOLD))); currentSong.play(); } - if (currentSong.paused && ticksUntilPausedActionbar-- < 0) return; - else ticksUntilPausedActionbar = 20; + if (currentSong.paused && ticksUntilPausedBossbar-- < 0) return; + else ticksUntilPausedBossbar = 20; bot.core().run("minecraft:bossbar add " + bossbarName + " \"\""); bot.core().run("minecraft:bossbar set " + bossbarName + " players " + SELECTOR); @@ -120,7 +121,28 @@ public class MusicPlayerPlugin extends SessionAdapter { if (currentSong.finished()) { removeBossbar(); bot.chat().tellraw(Component.translatable("Finished playing %s", Component.empty().append(currentSong.name).color(NamedTextColor.GOLD))); - currentSong = null; + + if (loop == 1) { + currentSong.setTime(0); + return; + } + if (loop == 2) { + skip(); + return; + } + + songQueue.remove(); + + if (songQueue.size() == 0) { + stopPlaying(); + bot.chat().tellraw(Component.text("Finished playing every sone in the queue")); + return; + } + if (currentSong.size() > 0) { + currentSong = songQueue.get(0); + currentSong.setTime(0); + currentSong.play(); + } } }; @@ -129,6 +151,19 @@ public class MusicPlayerPlugin extends SessionAdapter { if (currentSong != null) currentSong.play(); } + public void skip () { + if (loop == 2) { + songQueue.add(songQueue.remove()); // bot.music.queue.push(bot.music.queue.shift()) in js + } else { + songQueue.remove(); + stopPlaying(); + } + if (songQueue.size() == 0) return; + currentSong = songQueue.get(0); + currentSong.setTime(0); + currentSong.play(); + } + public void removeBossbar () { bot.core().run("minecraft:bossbar remove " + bossbarName); } @@ -144,14 +179,13 @@ public class MusicPlayerPlugin extends SessionAdapter { if (currentSong.paused) { return component .append(Component.text(" | ", NamedTextColor.DARK_GRAY)) - .append(Component.text("Paused", NamedTextColor.GREEN)); + .append(Component.text("Paused", NamedTextColor.LIGHT_PURPLE)); } - if (currentSong.looping > 0) { - final int looping = currentSong().looping; + if (loop > 0) { return component .append(Component.translatable(" | ", NamedTextColor.DARK_GRAY)) - .append(Component.translatable("Looping " + ((looping == 1) ? "current" : "all"), NamedTextColor.DARK_GREEN)); + .append(Component.translatable("Looping " + ((loop == 1) ? "current" : "all"), NamedTextColor.LIGHT_PURPLE)); } return component; diff --git a/src/main/java/me/chayapak1/chomensbot_mabe/song/Song.java b/src/main/java/me/chayapak1/chomensbot_mabe/song/Song.java index d94644b6..c98cdeb7 100644 --- a/src/main/java/me/chayapak1/chomensbot_mabe/song/Song.java +++ b/src/main/java/me/chayapak1/chomensbot_mabe/song/Song.java @@ -14,13 +14,12 @@ public class Song { public long startTime = 0; // Start time in millis since unix epoch public long length = 0; // Milliseconds in the song public long time = 0; // Time since start of song - public long loopPosition = 0; // Milliseconds into the song to start looping - public int loopCount = 0; // Number of times to loop - public int currentLoop = 0; // Number of loops so far - public int queueIndex = 0; + public long loopPosition = 200; // Milliseconds into the song to start looping +// public int loopCount = 0; // Number of times to loop +// public int currentLoop = 0; // Number of loops so far private Bot bot; - + public Song (Component name, Bot bot) { this.bot = bot; this.name = name; @@ -30,11 +29,11 @@ public class Song { this(Component.text(name), bot); this.bot = bot; } - + public Note get (int i) { return notes.get(i); } - + public void add (Note e) { notes.add(e); } @@ -84,8 +83,7 @@ public class Song { if (position < notes.size()) { return notes.get(position).time <= time; } else { - if (time > length && shouldLoop()) { - loop(); + if (finished() && bot.music().loop() > 0) { if (position < notes.size()) { return notes.get(position).time <= time; } else { @@ -99,65 +97,61 @@ public class Song { public Note getNextNote () { if (position >= notes.size()) { - if (shouldLoop()) { - loop(); - } else { - return null; - } + if (bot.music().loop() == 0) return null; } return notes.get(position++); } public boolean finished () { - return time > length && !shouldLoop(); + return time > length; } - private void loop () { +// private void loop () { +// if (looping == 2) { +// System.out.println("before adding any single shit length " + bot.music().songQueue().size()); +// System.out.println("looping is 2 position " + position); +// final Song toAdd = bot.music().songQueue().remove(); +// System.out.println("TO ADD " + toAdd.name); +// bot.music().songQueue().add(toAdd); +// try { +// for (Song song : bot.music().songQueue()) { +// System.out.println("song in list here " + song.name); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// System.out.println("BOT SONG QUEUEUE SIZE IS " + bot.music().songQueue().size()); +// } +// +// System.out.println("now doing the position and the shits to reset the shit TIME"); +// // position = 0; // startTime += length - loopPosition; // time -= length - loopPosition; // while (position < notes.size() && notes.get(position).time < loopPosition) { // position++; // } -// currentLoop++; -// if (looping == 1) { - position = 0; - startTime += length - loopPosition; - time -= length - loopPosition; - while (position < notes.size() && notes.get(position).time < loopPosition) { - position++; - } -// System.out.println("looping is 1 we did all shits here and position is " + position); -// } else if (looping == 2) { -// position = 0; -// setTime(0); -// System.out.println("looping is 2 position " + position); -// queueIndex = (queueIndex + 1) % bot.music().songQueue().size(); -// System.out.println("queue INDEX IS " + queueIndex); -// System.out.println("BOT SONG QUEUEUE SIZE IS " + bot.music().songQueue().size()); -// } -// System.out.println(currentLoop); - currentLoop++; - } +//// currentLoop++; +// } - private boolean shouldLoop () { -// if (looping) { +// private boolean shouldLoop () { +//// if (looping) { +//// if (loopCount == 0) { +//// return true; +//// } else { +//// return currentLoop < loopCount; +//// } +//// } else { +//// return false; +//// } +// if (looping == 1) { // if (loopCount == 0) { // return true; // } else { // return currentLoop < loopCount; // } -// } else { -// return false; -// } - if (looping == 1) { - if (loopCount == 0) { - return true; - } else { - return currentLoop < loopCount; - } - } else return looping == 2; - } +// } else return looping == 2; +// } public int size () { return notes.size();