diff --git a/src/main/java/info/itsthesky/lavaplayer/AudioListener.java b/src/main/java/info/itsthesky/lavaplayer/AudioListener.java index 75ce3c3..1220c09 100644 --- a/src/main/java/info/itsthesky/lavaplayer/AudioListener.java +++ b/src/main/java/info/itsthesky/lavaplayer/AudioListener.java @@ -2,10 +2,14 @@ import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter; +import com.sedmelluq.discord.lavaplayer.tools.FriendlyException; import com.sedmelluq.discord.lavaplayer.track.AudioTrack; +import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason; import info.itsthesky.disky.api.events.BukkitEvent; import info.itsthesky.disky.core.Bot; +import info.itsthesky.disky.core.SkriptUtils; import net.dv8tion.jda.api.entities.Guild; +import org.bukkit.Bukkit; public class AudioListener extends AudioEventAdapter { @@ -25,18 +29,49 @@ public Guild getGuild() { return guild; } + @Override + public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) { + call(TrackEventType.END, player); + } + + @Override + public void onPlayerResume(AudioPlayer player) { + call(TrackEventType.RESUME, player); + } + + @Override + public void onTrackException(AudioPlayer player, AudioTrack track, FriendlyException exception) { + call(TrackEventType.EXCEPTION, player); + } + + @Override + public void onTrackStuck(AudioPlayer player, AudioTrack track, long thresholdMs) { + call(TrackEventType.STUCK, player); + } + + @Override + public void onTrackStart(AudioPlayer player, AudioTrack track) { + call(TrackEventType.START, player); + } + @Override public void onPlayerPause(AudioPlayer player) { - super.onPlayerPause(player); + call(TrackEventType.PAUSE, player); + } + + private void call(TrackEventType type, AudioPlayer player) { + final TrackEvent event = new TrackEvent(type, player, bot, guild); + SkriptUtils.sync(() -> Bukkit.getPluginManager().callEvent(event)); } public enum TrackEventType { - TRACK_START, - TRACK_END, - TRACK_STUCK, - TRACK_PAUSE, - TRACK_RESUME, - TRACK_SEEK, + START, + END, + STUCK, + EXCEPTION, + PAUSE, + RESUME, + SEEK, ; } @@ -45,12 +80,16 @@ public class TrackEvent extends BukkitEvent { private final TrackEventType type; private final AudioTrack track; private final AudioPlayer player; + private final Guild guild; + private final Bot bot; - public TrackEvent(final TrackEventType type, AudioPlayer player) { + public TrackEvent(final TrackEventType type, AudioPlayer player, Bot bot, Guild guild) { super(false); this.type = type; this.player = player; this.track = player.getPlayingTrack(); + this.bot = bot; + this.guild = guild; } public TrackEventType getType() { @@ -64,5 +103,13 @@ public AudioPlayer getPlayer() { public AudioTrack getTrack() { return track; } + + public Guild getGuild() { + return guild; + } + + public Bot getBot() { + return bot; + } } } diff --git a/src/main/java/info/itsthesky/lavaplayer/LavaPlayer.java b/src/main/java/info/itsthesky/lavaplayer/LavaPlayer.java index 4c0b227..0a5fa5f 100644 --- a/src/main/java/info/itsthesky/lavaplayer/LavaPlayer.java +++ b/src/main/java/info/itsthesky/lavaplayer/LavaPlayer.java @@ -46,6 +46,7 @@ public void init(DiSky disky, SkriptAddon addon) { registerType(AudioTrack.class, "audiotrack", AudioTrack::getIdentifier); registerType(SearchTracks.AudioSource.class, "audiosource"); + registerType(AudioListener.TrackEventType.class, "trackeventtype"); } diff --git a/src/main/java/info/itsthesky/lavaplayer/elements/events/TrackEvent.java b/src/main/java/info/itsthesky/lavaplayer/elements/events/TrackEvent.java new file mode 100644 index 0000000..da1742e --- /dev/null +++ b/src/main/java/info/itsthesky/lavaplayer/elements/events/TrackEvent.java @@ -0,0 +1,60 @@ +package info.itsthesky.lavaplayer.elements.events; + +import ch.njol.skript.Skript; +import ch.njol.skript.lang.Literal; +import ch.njol.skript.lang.SkriptEvent; +import ch.njol.skript.lang.SkriptParser; +import com.sedmelluq.discord.lavaplayer.track.AudioTrack; +import info.itsthesky.disky.core.Bot; +import info.itsthesky.disky.core.SkriptUtils; +import info.itsthesky.lavaplayer.AudioListener; +import net.dv8tion.jda.api.entities.Guild; +import org.bukkit.event.Event; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class TrackEvent extends SkriptEvent { + + static { + Skript.registerEvent( + "Track Event", TrackEvent.class, AudioListener.TrackEvent.class, + "track [event] %trackeventtype%" + ).description("Fired when a track receive a specific event. Use the literal to define the event's type such as:", + " - START", + " - END", + " - STUCK", + " - PAUSE", + " - RESUME", + " - SEEK" + ).examples("on track play:", "on track end:", "on track exception:"); + + SkriptUtils.registerValue(AudioListener.TrackEvent.class, Bot.class, AudioListener.TrackEvent::getBot); + SkriptUtils.registerValue(AudioListener.TrackEvent.class, Guild.class, AudioListener.TrackEvent::getGuild); + SkriptUtils.registerValue(AudioListener.TrackEvent.class, AudioTrack.class, AudioListener.TrackEvent::getTrack); + SkriptUtils.registerValue(AudioListener.TrackEvent.class, AudioListener.TrackEventType.class, AudioListener.TrackEvent::getType); + + } + + private AudioListener.TrackEventType type; + + @Override + public boolean init(Literal @NotNull [] args, int matchedPattern, SkriptParser.@NotNull ParseResult parseResult) { + type = ((Literal) args[0]).getSingle(); + return true; + } + + @Override + public boolean check(@NotNull Event e) { + return e instanceof AudioListener.TrackEvent && type == ((AudioListener.TrackEvent) e).getType(); + } + + @Override + public boolean isEventPrioritySupported() { + return false; + } + + @Override + public @NotNull String toString(@Nullable Event e, boolean debug) { + return "track " + type.name(); + } +}