From 336f17b1cf1a414f251998bf772ca8dc30edcd02 Mon Sep 17 00:00:00 2001 From: Taah Date: Mon, 11 Apr 2022 10:56:26 -0700 Subject: [PATCH] refactor packages and rename + add sql permission system + mongodb --- build.gradle | 4 +- src/main/java/dev/plex/Plex.java | 13 ++- src/main/java/dev/plex/cache/DataUtils.java | 1 - .../plex/cache/{player => }/PlayerCache.java | 2 +- .../dev/plex/cache/notes/PlayerNotes.java | 40 -------- .../java/dev/plex/command/PlexCommand.java | 2 +- .../dev/plex/command/impl/AdminChatCMD.java | 2 +- .../dev/plex/listener/impl/ChatListener.java | 5 +- .../plex/listener/impl/CommandListener.java | 5 +- .../plex/listener/impl/PlayerListener.java | 13 +-- .../dev/plex/listener/impl/WorldListener.java | 2 +- .../dev/plex/menu/PunishedPlayerMenu.java | 2 +- .../java/dev/plex/permission/Permission.java | 15 +++ src/main/java/dev/plex/player/PlexPlayer.java | 9 ++ .../java/dev/plex/storage/SQLConnection.java | 5 + .../storage/permission/SQLPermissions.java | 92 +++++++++++++++++++ .../player/MongoPlayerData.java | 3 +- .../player/SQLPlayerData.java | 3 +- .../sql => storage/punishment}/SQLNotes.java | 2 +- .../punishment}/SQLPunishment.java | 2 +- src/main/java/dev/plex/util/PlexUtils.java | 62 +++++++++++++ 21 files changed, 212 insertions(+), 72 deletions(-) rename src/main/java/dev/plex/cache/{player => }/PlayerCache.java (97%) delete mode 100644 src/main/java/dev/plex/cache/notes/PlayerNotes.java create mode 100644 src/main/java/dev/plex/permission/Permission.java create mode 100644 src/main/java/dev/plex/storage/permission/SQLPermissions.java rename src/main/java/dev/plex/{cache => storage}/player/MongoPlayerData.java (98%) rename src/main/java/dev/plex/{cache => storage}/player/SQLPlayerData.java (99%) rename src/main/java/dev/plex/{cache/sql => storage/punishment}/SQLNotes.java (98%) rename src/main/java/dev/plex/{cache/sql => storage/punishment}/SQLPunishment.java (99%) diff --git a/build.gradle b/build.gradle index 6dd1025..4f25285 100644 --- a/build.gradle +++ b/build.gradle @@ -47,7 +47,9 @@ dependencies { library "org.eclipse.jetty:jetty-proxy:11.0.9" library "com.google.code.gson:gson:2.9.0" compileOnly "io.papermc.paper:paper-api:1.18.2-R0.1-SNAPSHOT" - compileOnly "com.github.MilkBowl:VaultAPI:1.7" + compileOnly ("com.github.MilkBowl:VaultAPI:1.7") { + exclude group: "org.bukkit", module: "bukkit" + } implementation "org.bstats:bstats-base:3.0.0" implementation "org.bstats:bstats-bukkit:3.0.0" } diff --git a/src/main/java/dev/plex/Plex.java b/src/main/java/dev/plex/Plex.java index 45037e2..8e476d7 100644 --- a/src/main/java/dev/plex/Plex.java +++ b/src/main/java/dev/plex/Plex.java @@ -3,11 +3,12 @@ package dev.plex; import dev.plex.admin.Admin; import dev.plex.admin.AdminList; import dev.plex.cache.DataUtils; -import dev.plex.cache.player.MongoPlayerData; -import dev.plex.cache.player.PlayerCache; -import dev.plex.cache.player.SQLPlayerData; -import dev.plex.cache.sql.SQLNotes; -import dev.plex.cache.sql.SQLPunishment; +import dev.plex.storage.permission.SQLPermissions; +import dev.plex.storage.player.MongoPlayerData; +import dev.plex.cache.PlayerCache; +import dev.plex.storage.player.SQLPlayerData; +import dev.plex.storage.punishment.SQLNotes; +import dev.plex.storage.punishment.SQLPunishment; import dev.plex.config.Config; import dev.plex.handlers.CommandHandler; import dev.plex.handlers.ListenerHandler; @@ -60,6 +61,7 @@ public class Plex extends JavaPlugin private SQLPunishment sqlPunishment; private SQLNotes sqlNotes; + private SQLPermissions sqlPermissions; private ModuleManager moduleManager; private RankManager rankManager; @@ -155,6 +157,7 @@ public class Plex extends JavaPlugin sqlPlayerData = new SQLPlayerData(); sqlPunishment = new SQLPunishment(); sqlNotes = new SQLNotes(); + sqlPermissions = new SQLPermissions(); } new ListenerHandler(); diff --git a/src/main/java/dev/plex/cache/DataUtils.java b/src/main/java/dev/plex/cache/DataUtils.java index decfc26..662e5b6 100644 --- a/src/main/java/dev/plex/cache/DataUtils.java +++ b/src/main/java/dev/plex/cache/DataUtils.java @@ -1,7 +1,6 @@ package dev.plex.cache; import dev.plex.Plex; -import dev.plex.cache.player.PlayerCache; import dev.plex.player.PlexPlayer; import dev.plex.storage.StorageType; import java.util.UUID; diff --git a/src/main/java/dev/plex/cache/player/PlayerCache.java b/src/main/java/dev/plex/cache/PlayerCache.java similarity index 97% rename from src/main/java/dev/plex/cache/player/PlayerCache.java rename to src/main/java/dev/plex/cache/PlayerCache.java index 55a08ef..be31823 100644 --- a/src/main/java/dev/plex/cache/player/PlayerCache.java +++ b/src/main/java/dev/plex/cache/PlayerCache.java @@ -1,4 +1,4 @@ -package dev.plex.cache.player; +package dev.plex.cache; import com.google.common.collect.Maps; import dev.plex.player.PlexPlayer; diff --git a/src/main/java/dev/plex/cache/notes/PlayerNotes.java b/src/main/java/dev/plex/cache/notes/PlayerNotes.java deleted file mode 100644 index 397e8ef..0000000 --- a/src/main/java/dev/plex/cache/notes/PlayerNotes.java +++ /dev/null @@ -1,40 +0,0 @@ -package dev.plex.cache.notes; - -import dev.plex.Plex; -import dev.plex.player.PlexPlayer; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.UUID; - -public class PlayerNotes -{ - private final String SELECT = "SELECT * FROM `notes` WHERE uuid=?"; - //private final String UPDATE = "UPDATE `notes` SET name=?, written_by=?, note=? WHERE uuid=?"; - private final String INSERT = "INSERT INTO `notes` (`uuid`, `name`, `written_by`, `note`) VALUES (?, ?, ?, ?);"; - - public PlexPlayer getByUUID(UUID uuid) - { - try (Connection con = Plex.get().getSqlConnection().getCon()) - { - PreparedStatement statement = con.prepareStatement(SELECT); - statement.setString(1, uuid.toString()); - ResultSet set = statement.executeQuery(); - PlexPlayer plexPlayer = new PlexPlayer(uuid); - while (set.next()) - { - String name = set.getString("name"); - String writtenBy = set.getString("written_by"); - String note = set.getString("note"); - - } - return plexPlayer; - } - catch (SQLException throwables) - { - throwables.printStackTrace(); - } - return null; - } -} diff --git a/src/main/java/dev/plex/command/PlexCommand.java b/src/main/java/dev/plex/command/PlexCommand.java index a735396..861919f 100644 --- a/src/main/java/dev/plex/command/PlexCommand.java +++ b/src/main/java/dev/plex/command/PlexCommand.java @@ -2,7 +2,7 @@ package dev.plex.command; import dev.plex.Plex; import dev.plex.cache.DataUtils; -import dev.plex.cache.player.PlayerCache; +import dev.plex.cache.PlayerCache; import dev.plex.command.annotation.CommandParameters; import dev.plex.command.annotation.CommandPermissions; import dev.plex.command.exception.*; diff --git a/src/main/java/dev/plex/command/impl/AdminChatCMD.java b/src/main/java/dev/plex/command/impl/AdminChatCMD.java index b369e59..8c58382 100644 --- a/src/main/java/dev/plex/command/impl/AdminChatCMD.java +++ b/src/main/java/dev/plex/command/impl/AdminChatCMD.java @@ -1,6 +1,6 @@ package dev.plex.command.impl; -import dev.plex.cache.player.PlayerCache; +import dev.plex.cache.PlayerCache; import dev.plex.command.PlexCommand; import dev.plex.command.annotation.CommandParameters; import dev.plex.command.annotation.CommandPermissions; diff --git a/src/main/java/dev/plex/listener/impl/ChatListener.java b/src/main/java/dev/plex/listener/impl/ChatListener.java index 11b8205..8437882 100644 --- a/src/main/java/dev/plex/listener/impl/ChatListener.java +++ b/src/main/java/dev/plex/listener/impl/ChatListener.java @@ -1,6 +1,6 @@ package dev.plex.listener.impl; -import dev.plex.cache.player.PlayerCache; +import dev.plex.cache.PlayerCache; import dev.plex.listener.PlexListener; import dev.plex.listener.annotation.Toggleable; import dev.plex.player.PlexPlayer; @@ -10,9 +10,6 @@ import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.minimessage.MiniMessage; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; -import org.apache.commons.lang.StringUtils; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/dev/plex/listener/impl/CommandListener.java b/src/main/java/dev/plex/listener/impl/CommandListener.java index 95bc4d8..f3cafce 100644 --- a/src/main/java/dev/plex/listener/impl/CommandListener.java +++ b/src/main/java/dev/plex/listener/impl/CommandListener.java @@ -1,16 +1,13 @@ package dev.plex.listener.impl; import dev.plex.cache.DataUtils; -import dev.plex.cache.player.PlayerCache; +import dev.plex.cache.PlayerCache; import dev.plex.command.blocking.BlockedCommand; import dev.plex.listener.PlexListener; import dev.plex.player.PlexPlayer; import dev.plex.rank.enums.Rank; import dev.plex.services.impl.CommandBlockerService; import dev.plex.util.PlexLog; -import dev.plex.util.PlexUtils; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/src/main/java/dev/plex/listener/impl/PlayerListener.java b/src/main/java/dev/plex/listener/impl/PlayerListener.java index b0848a1..fb1ab71 100644 --- a/src/main/java/dev/plex/listener/impl/PlayerListener.java +++ b/src/main/java/dev/plex/listener/impl/PlayerListener.java @@ -1,13 +1,12 @@ package dev.plex.listener.impl; import dev.plex.cache.DataUtils; -import dev.plex.cache.player.PlayerCache; +import dev.plex.cache.PlayerCache; import dev.plex.listener.PlexListener; import dev.plex.player.PlexPlayer; import dev.plex.storage.StorageType; import dev.plex.util.PlexLog; import dev.plex.util.PlexUtils; -import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -20,7 +19,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import java.util.Arrays; import java.util.List; -public class PlayerListener extends PlexListener +public class PlayerListener extends PlexListener { // setting up a player's data @EventHandler(priority = EventPriority.HIGHEST) @@ -73,19 +72,17 @@ public class PlayerListener extends PlexListener player.openInventory(player.getInventory()); } - assert plexPlayer != null; String loginMessage = plugin.getRankManager().getLoginMessage(plexPlayer); if (!loginMessage.isEmpty()) { PlexUtils.broadcast(PlexUtils.mmDeserialize("" + player.getName() + " is " + loginMessage)); } + PlexUtils.setupPermissions(player); + if (plugin.getStorageType() != StorageType.MONGODB) { - plexPlayer.loadNotes().whenComplete((notes, throwable) -> - { - //TODO: Send note messages to admins - }); + plexPlayer.loadNotes(); } } diff --git a/src/main/java/dev/plex/listener/impl/WorldListener.java b/src/main/java/dev/plex/listener/impl/WorldListener.java index 355b212..b457aad 100644 --- a/src/main/java/dev/plex/listener/impl/WorldListener.java +++ b/src/main/java/dev/plex/listener/impl/WorldListener.java @@ -2,7 +2,7 @@ package dev.plex.listener.impl; import dev.plex.Plex; import dev.plex.cache.DataUtils; -import dev.plex.cache.player.PlayerCache; +import dev.plex.cache.PlayerCache; import dev.plex.listener.PlexListener; import dev.plex.player.PlexPlayer; import dev.plex.rank.enums.Rank; diff --git a/src/main/java/dev/plex/menu/PunishedPlayerMenu.java b/src/main/java/dev/plex/menu/PunishedPlayerMenu.java index 9e06518..cd6ce51 100644 --- a/src/main/java/dev/plex/menu/PunishedPlayerMenu.java +++ b/src/main/java/dev/plex/menu/PunishedPlayerMenu.java @@ -2,7 +2,7 @@ package dev.plex.menu; import com.google.common.collect.Lists; import dev.plex.cache.DataUtils; -import dev.plex.cache.player.PlayerCache; +import dev.plex.cache.PlayerCache; import dev.plex.player.PlexPlayer; import dev.plex.punishment.Punishment; import dev.plex.util.PlexUtils; diff --git a/src/main/java/dev/plex/permission/Permission.java b/src/main/java/dev/plex/permission/Permission.java new file mode 100644 index 0000000..65460e6 --- /dev/null +++ b/src/main/java/dev/plex/permission/Permission.java @@ -0,0 +1,15 @@ +package dev.plex.permission; + +import dev.morphia.annotations.Entity; +import lombok.Data; + +import java.util.UUID; + +@Data +@Entity +public class Permission +{ + private final UUID uuid; + private final String permission; + private boolean allowed = true; +} diff --git a/src/main/java/dev/plex/player/PlexPlayer.java b/src/main/java/dev/plex/player/PlexPlayer.java index fa1645b..b196e97 100644 --- a/src/main/java/dev/plex/player/PlexPlayer.java +++ b/src/main/java/dev/plex/player/PlexPlayer.java @@ -7,6 +7,7 @@ import dev.morphia.annotations.Id; import dev.morphia.annotations.IndexOptions; import dev.morphia.annotations.Indexed; import dev.plex.Plex; +import dev.plex.permission.Permission; import dev.plex.punishment.Punishment; import dev.plex.punishment.extra.Note; import dev.plex.rank.enums.Rank; @@ -26,6 +27,7 @@ import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; +import org.bukkit.permissions.PermissionAttachment; @Getter @Setter @@ -64,6 +66,9 @@ public class PlexPlayer private List ips = Lists.newArrayList(); private List punishments = Lists.newArrayList(); private List notes = Lists.newArrayList(); + private List permissions = Lists.newArrayList(); + + private transient PermissionAttachment permissionAttachment; public PlexPlayer() { @@ -88,6 +93,10 @@ public class PlexPlayer this.rank = ""; this.loadPunishments(); + if (Plex.get().getStorageType() != StorageType.MONGODB) + { + this.permissions.addAll(Plex.get().getSqlPermissions().getPermissions(this.uuid)); + } } public String displayName() diff --git a/src/main/java/dev/plex/storage/SQLConnection.java b/src/main/java/dev/plex/storage/SQLConnection.java index d810625..da22f6f 100644 --- a/src/main/java/dev/plex/storage/SQLConnection.java +++ b/src/main/java/dev/plex/storage/SQLConnection.java @@ -92,6 +92,11 @@ public class SQLConnection extends PlexBase "`note` VARCHAR(2000), " + "`timestamp` BIGINT" + ");").execute(); + con.prepareStatement("CREATE TABLE IF NOT EXISTS `permissions` (" + + "`uuid` VARCHAR(46) NOT NULL," + + "`permission` VARCHAR(1000) NOT NULL," + + "`allowed` BOOLEAN" + + ");"); } catch (SQLException throwables) { diff --git a/src/main/java/dev/plex/storage/permission/SQLPermissions.java b/src/main/java/dev/plex/storage/permission/SQLPermissions.java new file mode 100644 index 0000000..2eafd6e --- /dev/null +++ b/src/main/java/dev/plex/storage/permission/SQLPermissions.java @@ -0,0 +1,92 @@ +package dev.plex.storage.permission; + +import com.google.common.collect.Lists; +import dev.plex.Plex; +import dev.plex.permission.Permission; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; +import java.util.Locale; +import java.util.UUID; + +public class SQLPermissions +{ + private static final String SELECT = "SELECT * FROM `permissions` WHERE uuid=?"; + private static final String INSERT = "INSERT INTO `permissions` (`uuid`, `permission`, `allowed`) VALUES(?, ?, ?)"; + private static final String REMOVE_PERMISSION = "DELETE FROM `permissions` WHERE uuid=? AND permission=?"; + private static final String UPDATE_PERMISSION = "UPDATE `permissions` SET allowed=? WHERE uuid=? AND permission=?"; + + public List getPermissions(UUID uuid) + { + List permissions = Lists.newArrayList(); + try (Connection con = Plex.get().getSqlConnection().getCon()) + { + PreparedStatement statement = con.prepareStatement(SELECT); + statement.setString(1, uuid.toString()); + ResultSet set = statement.executeQuery(); + while (set.next()) + { + Permission permission = new Permission(UUID.fromString(set.getString("uuid")), set.getString("permission")); + permission.setAllowed(set.getBoolean("allowed")); + permissions.add(permission); + } + } catch (SQLException e) + { + e.printStackTrace(); + } + return permissions; + } + + public void addPermission(Permission permission) + { + try (Connection con = Plex.get().getSqlConnection().getCon()) + { + PreparedStatement statement = con.prepareStatement(INSERT); + statement.setString(1, permission.getUuid().toString()); + statement.setString(2, permission.getPermission().toLowerCase(Locale.ROOT)); + statement.setBoolean(3, permission.isAllowed()); + statement.execute(); + } catch (SQLException e) + { + e.printStackTrace(); + } + } + + public void updatePermission(Permission permission, boolean newValue) + { + try (Connection con = Plex.get().getSqlConnection().getCon()) + { + PreparedStatement statement = con.prepareStatement(UPDATE_PERMISSION); + statement.setBoolean(1, newValue); + statement.setString(2, permission.getUuid().toString()); + statement.setString(3, permission.getPermission().toLowerCase(Locale.ROOT)); + statement.executeUpdate(); + } catch (SQLException e) + { + e.printStackTrace(); + } + } + + public void removePermission(Permission permission) + { + this.removePermission(permission.getUuid(), permission.getPermission()); + } + + public void removePermission(UUID uuid, String permission) + { + try (Connection con = Plex.get().getSqlConnection().getCon()) + { + PreparedStatement statement = con.prepareStatement(REMOVE_PERMISSION); + statement.setString(1, uuid.toString()); + statement.setString(2, permission.toLowerCase(Locale.ROOT)); + statement.execute(); + } catch (SQLException e) + { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/dev/plex/cache/player/MongoPlayerData.java b/src/main/java/dev/plex/storage/player/MongoPlayerData.java similarity index 98% rename from src/main/java/dev/plex/cache/player/MongoPlayerData.java rename to src/main/java/dev/plex/storage/player/MongoPlayerData.java index be12409..2ccd043 100644 --- a/src/main/java/dev/plex/cache/player/MongoPlayerData.java +++ b/src/main/java/dev/plex/storage/player/MongoPlayerData.java @@ -1,4 +1,4 @@ -package dev.plex.cache.player; +package dev.plex.storage.player; import dev.morphia.Datastore; import dev.morphia.query.Query; @@ -6,6 +6,7 @@ import dev.morphia.query.Update; import dev.morphia.query.experimental.filters.Filters; import dev.morphia.query.experimental.updates.UpdateOperators; import dev.plex.Plex; +import dev.plex.cache.PlayerCache; import dev.plex.player.PlexPlayer; import java.util.Collections; import java.util.List; diff --git a/src/main/java/dev/plex/cache/player/SQLPlayerData.java b/src/main/java/dev/plex/storage/player/SQLPlayerData.java similarity index 99% rename from src/main/java/dev/plex/cache/player/SQLPlayerData.java rename to src/main/java/dev/plex/storage/player/SQLPlayerData.java index e837b36..f16a9bf 100644 --- a/src/main/java/dev/plex/cache/player/SQLPlayerData.java +++ b/src/main/java/dev/plex/storage/player/SQLPlayerData.java @@ -1,8 +1,9 @@ -package dev.plex.cache.player; +package dev.plex.storage.player; import com.google.common.reflect.TypeToken; import com.google.gson.Gson; import dev.plex.Plex; +import dev.plex.cache.PlayerCache; import dev.plex.player.PlexPlayer; import java.sql.Connection; import java.sql.PreparedStatement; diff --git a/src/main/java/dev/plex/cache/sql/SQLNotes.java b/src/main/java/dev/plex/storage/punishment/SQLNotes.java similarity index 98% rename from src/main/java/dev/plex/cache/sql/SQLNotes.java rename to src/main/java/dev/plex/storage/punishment/SQLNotes.java index cc3f6b2..2af54fd 100644 --- a/src/main/java/dev/plex/cache/sql/SQLNotes.java +++ b/src/main/java/dev/plex/storage/punishment/SQLNotes.java @@ -1,4 +1,4 @@ -package dev.plex.cache.sql; +package dev.plex.storage.punishment; import com.google.common.collect.Lists; import dev.plex.Plex; diff --git a/src/main/java/dev/plex/cache/sql/SQLPunishment.java b/src/main/java/dev/plex/storage/punishment/SQLPunishment.java similarity index 99% rename from src/main/java/dev/plex/cache/sql/SQLPunishment.java rename to src/main/java/dev/plex/storage/punishment/SQLPunishment.java index ba1d592..fa20a21 100644 --- a/src/main/java/dev/plex/cache/sql/SQLPunishment.java +++ b/src/main/java/dev/plex/storage/punishment/SQLPunishment.java @@ -1,4 +1,4 @@ -package dev.plex.cache.sql; +package dev.plex.storage.punishment; import com.google.common.collect.Lists; import dev.plex.Plex; diff --git a/src/main/java/dev/plex/util/PlexUtils.java b/src/main/java/dev/plex/util/PlexUtils.java index 1ce9b5a..2e18f0e 100644 --- a/src/main/java/dev/plex/util/PlexUtils.java +++ b/src/main/java/dev/plex/util/PlexUtils.java @@ -4,7 +4,10 @@ import com.google.common.collect.ImmutableSet; import com.google.common.reflect.ClassPath; import dev.plex.Plex; import dev.plex.PlexBase; +import dev.plex.cache.DataUtils; import dev.plex.config.Config; +import dev.plex.permission.Permission; +import dev.plex.player.PlexPlayer; import dev.plex.storage.StorageType; import java.time.format.DateTimeFormatter; import net.kyori.adventure.text.Component; @@ -17,7 +20,9 @@ import org.bukkit.*; import org.bukkit.command.Command; import org.bukkit.command.PluginCommandYamlParser; import org.bukkit.entity.Player; +import org.bukkit.permissions.PermissionAttachment; import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; @@ -73,6 +78,63 @@ public class PlexUtils extends PlexBase } } + public static void setupPermissions(@NotNull Player player) + { + PlexPlayer plexPlayer = DataUtils.getPlayer(player.getUniqueId()); + PermissionAttachment attachment = player.addAttachment(Plex.get()); + plexPlayer.getPermissions().forEach(permission -> attachment.setPermission(permission.getPermission(), permission.isAllowed())); + plexPlayer.setPermissionAttachment(attachment); + } + + public static void addPermission(PlexPlayer player, Permission permission) + { + Plex.get().getSqlPermissions().addPermission(addToArrayList(player.getPermissions(), permission)); + Player p = Bukkit.getPlayer(player.getUuid()); + if (p == null) + { + return; + } + player.getPermissionAttachment().setPermission(permission.getPermission(), permission.isAllowed()); + } + + public static void addPermission(PlexPlayer player, String permission) + { + addPermission(player, new Permission(player.getUuid(), permission)); + } + + public static void removePermission(PlexPlayer player, String permission) + { + Plex.get().getSqlPermissions().removePermission(player.getUuid(), permission); + player.getPermissions().removeIf(permission1 -> permission1.getPermission().equalsIgnoreCase(permission)); + Player p = Bukkit.getPlayer(player.getUuid()); + if (p == null) + { + return; + } + player.getPermissionAttachment().unsetPermission(permission); + } + + public static void updatePermission(PlexPlayer player, String permission, boolean newValue) + { + player.getPermissions().stream().filter(permission1 -> permission.equalsIgnoreCase(permission)).findFirst().ifPresent(permission1 -> { + Plex.get().getSqlPermissions().updatePermission(permission1, newValue); + }); + player.getPermissions().removeIf(permission1 -> permission1.getPermission().equalsIgnoreCase(permission)); + Player p = Bukkit.getPlayer(player.getUuid()); + if (p == null) + { + return; + } + player.getPermissionAttachment().unsetPermission(permission); + + } + + public static T addToArrayList(List list, T object) + { + list.add(object); + return object; + } + public static void disabledEffect(Player player, Location location) { Particle.CLOUD.builder().location(location).receivers(player).extra(0).offset(0.5, 0.5, 0.5).count(5).spawn();