From 77785bc44f738605d36985ae4fc43c257d2537e0 Mon Sep 17 00:00:00 2001 From: ZtereoHYPE <57519662+ZtereoHYPE@users.noreply.github.com> Date: Sat, 27 Nov 2021 02:05:25 +0100 Subject: [PATCH] new: audiochecks system! according to reperak it sucks but hey im kinda happy with it --- .../ztereomusic/audio/TrackManagers.java | 3 + .../ztereomusic/command/CommandMeta.java | 5 +- .../command/permissions/Check.java | 10 +++ .../command/permissions/VoiceChecks.java | 86 +++++++++++++++++++ 4 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 src/main/java/codes/ztereohype/ztereomusic/command/permissions/Check.java create mode 100644 src/main/java/codes/ztereohype/ztereomusic/command/permissions/VoiceChecks.java diff --git a/src/main/java/codes/ztereohype/ztereomusic/audio/TrackManagers.java b/src/main/java/codes/ztereohype/ztereomusic/audio/TrackManagers.java index 63f84c6..58443e1 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/audio/TrackManagers.java +++ b/src/main/java/codes/ztereohype/ztereomusic/audio/TrackManagers.java @@ -9,6 +9,7 @@ import net.dv8tion.jda.api.entities.VoiceChannel; import java.util.Objects; public class TrackManagers { + //todo: change to a statement that only returns a trackmanager if it exists and overload it to accept various things eg guild but also vc or infoMessage channel public static TrackManager getGuildTrackManager(Guild guild) { long guildId = guild.getIdLong(); @@ -23,11 +24,13 @@ public class TrackManagers { return trackManager; } + //todo: rename to getOrCreateGuildTrackManager public static TrackManager getGuildTrackManager(Guild guild, MessageChannel infoChannel, VoiceChannel connectedChannel, VoiceChannel requestedChannel) { long guildId = guild.getIdLong(); boolean isInSameVC = Objects.equals(connectedChannel, requestedChannel); // If I get called in a different vc I delete the old manager + //todo: move this check to the audio micropermissions and handle it there if (!isInSameVC) { ZtereoMUSIC.getInstance().getGuildTrackManagerMap().remove(guildId); } diff --git a/src/main/java/codes/ztereohype/ztereomusic/command/CommandMeta.java b/src/main/java/codes/ztereohype/ztereomusic/command/CommandMeta.java index 6de894a..49e6c32 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/command/CommandMeta.java +++ b/src/main/java/codes/ztereohype/ztereomusic/command/CommandMeta.java @@ -1,5 +1,6 @@ package codes.ztereohype.ztereomusic.command; +import codes.ztereohype.ztereomusic.command.permissions.VoiceChecks; import lombok.Getter; @Getter @@ -9,12 +10,14 @@ public class CommandMeta { private final String[] aliases; private final boolean isNsfw; private final boolean isHidden; + private final VoiceChecks[] checks; - public CommandMeta(String name, String description, String[] aliases, boolean isNsfw, boolean isHidden) { + public CommandMeta(String name, String description, String[] aliases, boolean isNsfw, boolean isHidden, VoiceChecks[] checks) { this.name = name; this.description = description; this.aliases = aliases; this.isNsfw = isNsfw; this.isHidden = isHidden; + this.checks = checks; } } diff --git a/src/main/java/codes/ztereohype/ztereomusic/command/permissions/Check.java b/src/main/java/codes/ztereohype/ztereomusic/command/permissions/Check.java new file mode 100644 index 0000000..f0a655c --- /dev/null +++ b/src/main/java/codes/ztereohype/ztereomusic/command/permissions/Check.java @@ -0,0 +1,10 @@ +package codes.ztereohype.ztereomusic.command.permissions; + +import codes.ztereohype.ztereomusic.audio.TrackManager; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.VoiceChannel; + +public interface Check { + boolean getResult(Member messageAuthor, VoiceChannel connectedChannel, TrackManager trackManager); + String getErrorCode(); +} \ No newline at end of file diff --git a/src/main/java/codes/ztereohype/ztereomusic/command/permissions/VoiceChecks.java b/src/main/java/codes/ztereohype/ztereomusic/command/permissions/VoiceChecks.java new file mode 100644 index 0000000..2fe6d5e --- /dev/null +++ b/src/main/java/codes/ztereohype/ztereomusic/command/permissions/VoiceChecks.java @@ -0,0 +1,86 @@ +package codes.ztereohype.ztereomusic.command.permissions; + +import codes.ztereohype.ztereomusic.audio.TrackManager; +import codes.ztereohype.ztereomusic.audio.TrackManagers; +import lombok.Getter; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.VoiceChannel; +import net.dv8tion.jda.api.managers.AudioManager; + +import javax.annotation.Nullable; +import java.util.Objects; + +// todo: make an actual good system +// Since these permission checks basically need to run for every single voice-related command, +// we just get the info we need... idk i need to think this through +public enum VoiceChecks { + BOT_CONNECTED(new Check() { + @Override + public boolean getResult(Member messageAuthor, VoiceChannel connectedChannel, TrackManager trackManager) { + return connectedChannel != null; + } + + @Override + public String getErrorCode() { + return "I am not playing anything."; + } + }), + + BOT_PLAYING(new Check() { + @Override + public boolean getResult(Member messageAuthor, VoiceChannel connectedChannel, @Nullable TrackManager trackManager) { + return trackManager != null && trackManager.getPlayer().getPlayingTrack() != null; + } + + @Override + public String getErrorCode() { + return "I am not playing anything."; + } + }), + + USER_CONNECTED(new Check() { + @Override + public boolean getResult(Member messageAuthor, VoiceChannel connectedChannel, TrackManager trackManager) { + if (messageAuthor.getVoiceState() == null) return false; + return messageAuthor.getVoiceState().inVoiceChannel(); + } + + @Override + public String getErrorCode() { + return "You are not connected to a voice channel."; + } + }), + + SAME_VC_IF_CONNECTED(new Check() { // the "if connected" specifies to the bot: if the bot is not connected always return true since the condition should be ignored basically. if the user is not in vc and the bot is though... + @Override + public boolean getResult(Member messageAuthor, VoiceChannel connectedChannel, TrackManager trackManager) { + if (connectedChannel == null) return true; + if (messageAuthor.getVoiceState() == null) return false; + return Objects.equals(messageAuthor.getVoiceState().getChannel(), connectedChannel); + } + + @Override + public String getErrorCode() { + return "We are not in the same voice channel."; + } + }), + + // Note: this is currently unused but will be used for role-based permissions + HAS_ROLE(new Check() { + @Override + public boolean getResult(Member messageAuthor, VoiceChannel connectedChannel, TrackManager trackManager) { + return false; + } + + @Override + public String getErrorCode() { + return "You don't have the *DJ role*."; + } + }); + + private @Getter final Check check; + + VoiceChecks(Check check) { + this.check = check; + } +}