diff --git a/.gitignore b/.gitignore index 0d4473e..1f884a6 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,4 @@ gradle-app.setting dcf.properties plugins/ +data/ diff --git a/build.gradle b/build.gradle index 684d86a..c89ad9f 100644 --- a/build.gradle +++ b/build.gradle @@ -30,6 +30,9 @@ dependencies { // Util compile group: 'net.jodah', name: 'failsafe', version: '0.8.3' + // Permissions + compile group: 'org.mapdb', name: 'mapdb', version: '3.0.1' + testCompile group: 'junit', name: 'junit', version: '4.11' } diff --git a/src/main/java/net/pingex/dcf/permissions/DefaultPermissionsProvider.java b/src/main/java/net/pingex/dcf/permissions/DefaultPermissionsProvider.java index 2d1958a..1e549f0 100644 --- a/src/main/java/net/pingex/dcf/permissions/DefaultPermissionsProvider.java +++ b/src/main/java/net/pingex/dcf/permissions/DefaultPermissionsProvider.java @@ -1,24 +1,98 @@ package net.pingex.dcf.permissions; import net.pingex.dcf.commands.Command; +import net.pingex.dcf.core.Configuration; +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.mapdb.DB; +import org.mapdb.DBMaker; +import org.mapdb.Serializer; import sx.blah.discord.handle.obj.IGuild; import sx.blah.discord.handle.obj.IRole; import sx.blah.discord.handle.obj.IUser; +import java.io.File; +import java.util.Map; /** * The one and only permissions provider for now. */ public class DefaultPermissionsProvider implements ICommandPermissionsProvider { + /** + * Datastore instance + */ + private DB datastore; + + /** + * User permissions store + */ + private Map userStore; + + /** + * Group permissions store + */ + private Map groupStore; + + private static final Logger LOGGER = LogManager.getLogger(DefaultPermissionsProvider.class); + + public DefaultPermissionsProvider() + { + LOGGER.info("Building datastore."); + + datastore = DBMaker.fileDB(new File(Configuration.DATA_DIR + "/permissions.db")) + .closeOnJvmShutdown() + .make(); + + userStore = datastore.hashMap("user", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); + groupStore = datastore.hashMap("group", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); + } + @Override public Boolean validateUser(IGuild guild, IUser user, Command command) { - return null; + return userStore.get(generateUserKey(guild, user, command)); } @Override public Boolean validateGroup(IRole role, Command command) { - return null; + return groupStore.get(generateGroupKey(role, command)); + } + + @Override + public void setUserPermission(IGuild guild, IUser user, Command command, Boolean value) + { + if(value == null) // Unset + { + userStore.remove(generateUserKey(guild, user, command)); + } + else + { + userStore.put(generateUserKey(guild, user, command), value); + } + } + + @Override + public void setGroupPermissions(IRole role, Command command, Boolean value) + { + if(value == null) // Unset + { + groupStore.remove(generateGroupKey(role, command)); + } + else + { + groupStore.put(generateGroupKey(role, command), value); + } + } + + private String generateUserKey(IGuild guild, IUser user, Command command) + { + return (guild != null ? guild.getID() : "*") + "/" + user.getID() + "/" + command.getName(); + } + + private String generateGroupKey(IRole role, Command command) + { + return role.getID() + "/" + command.getName(); } }