diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java b/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java index 173d54f..de7aad2 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/PermissionManager.java @@ -5,32 +5,43 @@ package dev.salmonllama.fsbot.guthix; +import java.util.Collection; +import java.util.concurrent.atomic.AtomicBoolean; + import org.javacord.api.entity.message.MessageAuthor; +import dev.salmonllama.fsbot.database.controllers.StaticPermissionController; +import dev.salmonllama.fsbot.database.models.StaticPermission; + public class PermissionManager { public PermissionManager() { } public boolean hasPermission(CommandPermission reqPerm, CommandContext ctx) { - PermissionType permtype = reqPerm.getType(); + PermissionType permType = reqPerm.getType(); + String permValue = reqPerm.getValue(); - switch (permtype) { + switch (permType) { case NONE: return true; case ROLE: // If the author has the role, yes. Doesn't work in DM - return roleHandler(reqPerm.getValue(), ctx); + return roleHandler(permValue, ctx); + case STATIC: + return staticHandler(permValue, ctx); + case PERMISSION: + return permissionHandler(ctx); case OWNER: // If the author is the owner, yes. return ownerHandler(ctx); + default: + return false; } - - return false; } private boolean roleHandler(String roleId, CommandContext ctx) { - if (!ctx.getUserRoles().isPresent()) { + if (ctx.getUserRoles().isEmpty()) { ctx.reply("This command can only be used in a server"); return false; } @@ -41,6 +52,27 @@ public class PermissionManager { return ctx.isUserOwner(); } + private boolean permissionHandler(CommandContext ctx) { + // Not implemented yet + return false; + } + + private boolean staticHandler(String staticPerm, CommandContext ctx) { + AtomicBoolean ret = new AtomicBoolean(false); + + StaticPermissionController.getByUser(ctx.getAuthor().getIdAsString()).thenAccept(possiblePerms -> { + possiblePerms.ifPresent( + staticPermissions -> ret.set( + staticPermissions.stream() + .map(StaticPermission::getPermission) + .anyMatch(staticPerm::equals) + ) + ); + }); + + return ret.get(); + } + boolean sourceIsValid(MessageAuthor author) { return !author.isBotUser() && !author.isWebhook(); } diff --git a/src/main/java/dev/salmonllama/fsbot/guthix/PermissionType.java b/src/main/java/dev/salmonllama/fsbot/guthix/PermissionType.java index b20e97b..bafca5e 100644 --- a/src/main/java/dev/salmonllama/fsbot/guthix/PermissionType.java +++ b/src/main/java/dev/salmonllama/fsbot/guthix/PermissionType.java @@ -7,6 +7,8 @@ package dev.salmonllama.fsbot.guthix; public enum PermissionType { ROLE, // User has a specific role inside the server + PERMISSION, // User has a specific Discord permission bit + STATIC, // User has a pre-defined permission stored in the database OWNER, // User is the bot owner NONE // No requirement }