new: audiochecks system! according to reperak it sucks but hey im kinda happy with it

This commit is contained in:
ZtereoHYPE 2021-11-27 02:05:25 +01:00
parent 7276ff91a0
commit 77785bc44f
4 changed files with 103 additions and 1 deletions

View file

@ -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);
}

View file

@ -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;
}
}

View file

@ -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();
}

View file

@ -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;
}
}