diff --git a/api/src/main/java/dev/plex/api/permission/IPermissionHandler.java b/api/src/main/java/dev/plex/api/permission/IPermissionHandler.java new file mode 100644 index 0000000..3926847 --- /dev/null +++ b/api/src/main/java/dev/plex/api/permission/IPermissionHandler.java @@ -0,0 +1,32 @@ +package dev.plex.api.permission; + +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public interface IPermissionHandler +{ + default boolean hasPermission(@NotNull Player player, @Nullable String permission) + { + if (permission == null) + { + return true; + } + return player.hasPermission(permission); + } + + default boolean hasPermission(@NotNull OfflinePlayer player, @Nullable String permission) + { + if (permission == null) + { + return true; + } + if (player.isOnline() && Bukkit.getPlayer(player.getUniqueId()) != null) + { + return Bukkit.getPlayer(player.getUniqueId()).hasPermission(permission); + } + throw new UnsupportedOperationException("Not implemented yet"); + } +} diff --git a/api/src/main/java/dev/plex/api/plugin/PlexPlugin.java b/api/src/main/java/dev/plex/api/plugin/PlexPlugin.java index 27afb07..1e7f79a 100644 --- a/api/src/main/java/dev/plex/api/plugin/PlexPlugin.java +++ b/api/src/main/java/dev/plex/api/plugin/PlexPlugin.java @@ -1,6 +1,7 @@ package dev.plex.api.plugin; import dev.plex.api.chat.IChatHandler; +import dev.plex.api.permission.IPermissionHandler; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; @@ -14,6 +15,7 @@ public abstract class PlexPlugin extends JavaPlugin private static PlexPlugin plugin; private IChatHandler chatHandler; + private IPermissionHandler permissionHandler; @Override public void onLoad() diff --git a/server/src/main/java/dev/plex/Plex.java b/server/src/main/java/dev/plex/Plex.java index 90c25f6..7d24676 100644 --- a/server/src/main/java/dev/plex/Plex.java +++ b/server/src/main/java/dev/plex/Plex.java @@ -2,14 +2,18 @@ package dev.plex; import dev.plex.admin.Admin; import dev.plex.admin.AdminList; +import dev.plex.api.permission.IPermissionHandler; import dev.plex.api.plugin.PlexPlugin; import dev.plex.cache.DataUtils; import dev.plex.cache.PlayerCache; import dev.plex.config.Config; import dev.plex.handlers.CommandHandler; import dev.plex.handlers.ListenerHandler; +import dev.plex.hook.VaultHook; import dev.plex.listener.impl.ChatListener; import dev.plex.module.ModuleManager; +import dev.plex.permission.handler.NativePermissionHandler; +import dev.plex.permission.handler.VaultPermissionHandler; import dev.plex.player.PlexPlayer; import dev.plex.punishment.PunishmentManager; import dev.plex.rank.RankManager; @@ -74,8 +78,6 @@ public class Plex extends PlexPlugin private UpdateChecker updateChecker; private String system; - public Permission permissions; - public Chat chat; public static Plex get() { @@ -134,13 +136,22 @@ public class Plex extends PlexPlugin e.printStackTrace(); } - if (system.equalsIgnoreCase("permissions") && !getServer().getPluginManager().isPluginEnabled("Vault")) + boolean permissions = false; + if (getServer().getPluginManager().isPluginEnabled("Vault")) { - throw new RuntimeException("Vault is required to run on the server if you use permissions!"); + VaultPermissionHandler handler = new VaultPermissionHandler(); + if (VaultHook.getPermission() != null) + { + this.setPermissionHandler(handler); + permissions = true; + PlexLog.debug("Enabling Vault support for permissions with a permission plugin: " + VaultHook.getPermission().getName()); + } } - permissions = setupPermissions(); - chat = setupChat(); + if (!permissions) + { + this.setPermissionHandler(new NativePermissionHandler()); + } updateChecker = new UpdateChecker(); PlexLog.log("Update checking enabled"); @@ -261,28 +272,4 @@ public class Plex extends PlexPlugin } }); } - - public Permission setupPermissions() - { - RegisteredServiceProvider rsp = Bukkit.getServicesManager().getRegistration(Permission.class); - permissions = rsp.getProvider(); - return permissions; - } - - public Chat setupChat() - { - RegisteredServiceProvider rsp = Bukkit.getServicesManager().getRegistration(Chat.class); - chat = rsp.getProvider(); - return chat; - } - - public Permission getVaultPermissions() - { - return permissions; - } - - public Chat getVaultChat() - { - return chat; - } } diff --git a/server/src/main/java/dev/plex/command/PlexCommand.java b/server/src/main/java/dev/plex/command/PlexCommand.java index f6300c9..52df04d 100644 --- a/server/src/main/java/dev/plex/command/PlexCommand.java +++ b/server/src/main/java/dev/plex/command/PlexCommand.java @@ -151,7 +151,7 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC } else if (plugin.getSystem().equalsIgnoreCase("permissions")) { - if (!perms.permission().isEmpty() && !player.hasPermission(perms.permission())) + if (!perms.permission().isEmpty() && !plugin.getPermissionHandler().hasPermission(player, perms.permission())) { send(sender, messageComponent("noPermissionNode", perms.permission())); return true; @@ -187,7 +187,7 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC } else if (plugin.getSystem().equalsIgnoreCase("permissions")) { - if (!perms.permission().isEmpty() && !plugin.getPermissions().playerHas(null, Bukkit.getOfflinePlayer(plexPlayer.getUuid()), perms.permission())) + if (!perms.permission().isEmpty() && !plugin.getPermissionHandler().hasPermission(Bukkit.getOfflinePlayer(plexPlayer.getName()), perms.permission())) { send(sender, messageComponent("noPermissionNode", perms.permission())); return true; @@ -306,7 +306,7 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC } else if (plugin.getSystem().equalsIgnoreCase("permissions")) { - if (!perms.permission().isEmpty() && !plugin.getPermissions().playerHas(null, Bukkit.getOfflinePlayer(plexPlayer.getUuid()), permission)) + if (!perms.permission().isEmpty() && !plugin.getPermissionHandler().hasPermission(Bukkit.getOfflinePlayer(plexPlayer.getName()), perms.permission())) { throw new CommandFailException(PlexUtils.messageString("noPermissionNode", permission)); } @@ -344,7 +344,7 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC } else if (plugin.getSystem().equalsIgnoreCase("permissions")) { - if (!perms.permission().isEmpty() && !player.hasPermission(permission)) + if (!perms.permission().isEmpty() && !plugin.getPermissionHandler().hasPermission(player, permission)) { throw new CommandFailException(PlexUtils.messageString("noPermissionNode", permission)); } @@ -365,7 +365,7 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC } else if (plugin.getSystem().equalsIgnoreCase("permissions")) { - return !perms.permission().isEmpty() && player.hasPermission(permission); + return !perms.permission().isEmpty() && plugin.getPermissionHandler().hasPermission(player, permission); } return false; } @@ -406,7 +406,7 @@ public abstract class PlexCommand extends Command implements PluginIdentifiableC } else if (plugin.getSystem().equalsIgnoreCase("permissions")) { - return !perms.permission().isEmpty() && player.hasPermission(permission); + return !perms.permission().isEmpty() && plugin.getPermissionHandler().hasPermission(player, permission); } return true; } diff --git a/server/src/main/java/dev/plex/command/impl/AdminChatCMD.java b/server/src/main/java/dev/plex/command/impl/AdminChatCMD.java index 8c58382..e51b11f 100644 --- a/server/src/main/java/dev/plex/command/impl/AdminChatCMD.java +++ b/server/src/main/java/dev/plex/command/impl/AdminChatCMD.java @@ -46,7 +46,7 @@ public class AdminChatCMD extends PlexCommand } else if (plugin.getSystem().equalsIgnoreCase("permissions")) { - if (player.hasPermission("plex.adminchat")) + if (plugin.getPermissionHandler().hasPermission(player, "plex.adminchat")) { player.sendMessage(PlexUtils.messageComponent("adminChatFormat", sender.getName(), message)); } diff --git a/server/src/main/java/dev/plex/hook/VaultHook.java b/server/src/main/java/dev/plex/hook/VaultHook.java new file mode 100644 index 0000000..baad2c9 --- /dev/null +++ b/server/src/main/java/dev/plex/hook/VaultHook.java @@ -0,0 +1,43 @@ +package dev.plex.hook; + +import net.milkbowl.vault.chat.Chat; +import net.milkbowl.vault.permission.Permission; +import org.bukkit.Bukkit; +import org.bukkit.plugin.RegisteredServiceProvider; + +public class VaultHook +{ + private static Chat CHAT; + private static Permission PERMISSIONS; + + static { + CHAT = setupChat(); + PERMISSIONS = setupPermissions(); + } + + private static Chat setupChat() + { + if (!Bukkit.getPluginManager().isPluginEnabled("Vault")) return null; + RegisteredServiceProvider rsp = Bukkit.getServicesManager().getRegistration(Chat.class); + CHAT = rsp.getProvider(); + return CHAT; + } + + private static Permission setupPermissions() + { + if (!Bukkit.getPluginManager().isPluginEnabled("Vault")) return null; + RegisteredServiceProvider rsp = Bukkit.getServicesManager().getRegistration(Permission.class); + PERMISSIONS = rsp.getProvider(); + return PERMISSIONS; + } + + public static Permission getPermission() + { + return PERMISSIONS; + } + + public static Chat getChat() + { + return CHAT; + } +} diff --git a/server/src/main/java/dev/plex/listener/impl/ChatListener.java b/server/src/main/java/dev/plex/listener/impl/ChatListener.java index 8a77d0e..a20e102 100644 --- a/server/src/main/java/dev/plex/listener/impl/ChatListener.java +++ b/server/src/main/java/dev/plex/listener/impl/ChatListener.java @@ -17,10 +17,13 @@ import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.minimessage.tag.standard.StandardTags; +import org.apache.commons.lang.StringUtils; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.jetbrains.annotations.NotNull; +import java.util.function.Supplier; + @Toggleable("chat.enabled") public class ChatListener extends PlexListener { @@ -61,6 +64,7 @@ public class ChatListener extends PlexListener { public boolean hasPrefix; public Component prefix; + public Supplier before = null; @Override public @NotNull Component render(@NotNull Player source, @NotNull Component sourceDisplayName, @NotNull Component message, @NotNull Audience viewer) @@ -69,12 +73,15 @@ public class ChatListener extends PlexListener Component component = Component.empty(); + if (before != null) + { + component = component.append(before.get()); + } if (hasPrefix) { - component = component.append(prefix); + component = component.append(prefix).append(Component.space()); } - - return component.append(Component.space()).append(PlexUtils.mmDeserialize(plugin.config.getString("chat.name-color", "") + MiniMessage.builder().tags(TagResolver.resolver(StandardTags.color(), StandardTags.rainbow(), StandardTags.decorations(), StandardTags.gradient(), StandardTags.transition())).build().serialize(sourceDisplayName))).append(Component.space()).append(Component.text("»").color(NamedTextColor.GRAY)).append(Component.space()).append(SafeMiniMessage.mmDeserializeWithoutEvents(text)).replaceText(URL_REPLACEMENT_CONFIG); + return component.append(PlexUtils.mmDeserialize(plugin.config.getString("chat.name-color", "") + MiniMessage.builder().tags(TagResolver.resolver(StandardTags.color(), StandardTags.rainbow(), StandardTags.decorations(), StandardTags.gradient(), StandardTags.transition())).build().serialize(sourceDisplayName))).append(Component.space()).append(Component.text("»").color(NamedTextColor.GRAY)).append(Component.space()).append(SafeMiniMessage.mmDeserializeWithoutEvents(text)).replaceText(URL_REPLACEMENT_CONFIG); } } } diff --git a/server/src/main/java/dev/plex/listener/impl/WorldListener.java b/server/src/main/java/dev/plex/listener/impl/WorldListener.java index 4559470..fac5d6a 100644 --- a/server/src/main/java/dev/plex/listener/impl/WorldListener.java +++ b/server/src/main/java/dev/plex/listener/impl/WorldListener.java @@ -105,7 +105,7 @@ public class WorldListener extends PlexListener { e.setCancelled(true); } - else if (plugin.getSystem().equals("permissions") && !e.getPlayer().hasPermission("plex.adminworld.enter")) + else if (plugin.getSystem().equals("permissions") && !plugin.getPermissionHandler().hasPermission(e.getPlayer(), "plex.adminworld.enter")) { e.setCancelled(true); } @@ -164,7 +164,7 @@ public class WorldListener extends PlexListener { return true; } - if (player.hasPermission(permission)) + if (plugin.getPermissionHandler().hasPermission(player, permission)) { return true; } diff --git a/server/src/main/java/dev/plex/permission/handler/NativePermissionHandler.java b/server/src/main/java/dev/plex/permission/handler/NativePermissionHandler.java new file mode 100644 index 0000000..77f7bad --- /dev/null +++ b/server/src/main/java/dev/plex/permission/handler/NativePermissionHandler.java @@ -0,0 +1,7 @@ +package dev.plex.permission.handler; + +import dev.plex.api.permission.IPermissionHandler; + +public class NativePermissionHandler implements IPermissionHandler +{ +} diff --git a/server/src/main/java/dev/plex/permission/handler/VaultPermissionHandler.java b/server/src/main/java/dev/plex/permission/handler/VaultPermissionHandler.java new file mode 100644 index 0000000..30b5588 --- /dev/null +++ b/server/src/main/java/dev/plex/permission/handler/VaultPermissionHandler.java @@ -0,0 +1,25 @@ +package dev.plex.permission.handler; + +import dev.plex.api.permission.IPermissionHandler; +import dev.plex.hook.VaultHook; +import lombok.Getter; +import net.milkbowl.vault.permission.Permission; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@Getter +public class VaultPermissionHandler implements IPermissionHandler +{ + @Override + public boolean hasPermission(@NotNull OfflinePlayer player, @Nullable String permission) + { + if (!Bukkit.getPluginManager().isPluginEnabled("Vault")) + { + return IPermissionHandler.super.hasPermission(player, permission); + } + return VaultHook.getPermission().playerHas(null, player, permission); + + } +} diff --git a/server/src/main/java/dev/plex/rank/RankManager.java b/server/src/main/java/dev/plex/rank/RankManager.java index f7d8a32..081db93 100644 --- a/server/src/main/java/dev/plex/rank/RankManager.java +++ b/server/src/main/java/dev/plex/rank/RankManager.java @@ -1,6 +1,7 @@ package dev.plex.rank; import dev.plex.Plex; +import dev.plex.hook.VaultHook; import dev.plex.player.PlexPlayer; import dev.plex.rank.enums.Rank; import dev.plex.rank.enums.Title; @@ -96,7 +97,7 @@ public class RankManager public Component getPrefix(PlexPlayer player) { - if (!player.getPrefix().equals("")) + if (player.getPrefix() != null && !player.getPrefix().isEmpty()) { return SafeMiniMessage.mmDeserializeWithoutEvents(player.getPrefix()); } @@ -116,11 +117,11 @@ public class RankManager { return player.getRankFromString().getPrefix(); } - if (Plex.get().getSystem().equalsIgnoreCase("permissions")) + if (Bukkit.getServer().getPluginManager().isPluginEnabled("Vault") && Plex.get().getSystem().equalsIgnoreCase("permissions")) { Player bukkitPlayer = Bukkit.getPlayer(player.getUuid()); - String group = Plex.get().getVaultPermissions().getPrimaryGroup(bukkitPlayer); - String vaultPrefix = Plex.get().getVaultChat().getGroupPrefix(bukkitPlayer.getWorld(), group); + String group = VaultHook.getPermission().getPrimaryGroup(bukkitPlayer); + String vaultPrefix = VaultHook.getChat().getGroupPrefix(bukkitPlayer.getWorld(), group); return LegacyComponentSerializer.legacyAmpersand().deserialize(vaultPrefix); } return null; diff --git a/server/src/main/java/dev/plex/util/PlexUtils.java b/server/src/main/java/dev/plex/util/PlexUtils.java index 09f0fc0..8541aa3 100644 --- a/server/src/main/java/dev/plex/util/PlexUtils.java +++ b/server/src/main/java/dev/plex/util/PlexUtils.java @@ -31,7 +31,7 @@ public class PlexUtils implements PlexBase public static List DEVELOPERS = Arrays.asList("78408086-1991-4c33-a571-d8fa325465b2", // Telesphoreo - "f5cd54c4-3a24-4213-9a56-c06c49594dff", // Taahh + /*"f5cd54c4-3a24-4213-9a56-c06c49594dff",*/ // Taahh "53b1512e-3481-4702-9f4f-63cb9c8be6a1", // supernt "ca83b658-c03b-4106-9edc-72f70a80656d", // ayunami2000 "2e06e049-24c8-42e4-8bcf-d35372af31e6", // Fleek