From 86f3fd8d29f5ce0ffbf16d56f7f1b798d584c13c Mon Sep 17 00:00:00 2001 From: Telesphoreo Date: Sat, 29 Jan 2022 16:35:48 -0600 Subject: [PATCH] Begin work on implementing ranks --- src/main/java/dev/plex/Plex.java | 21 +++++---- .../java/dev/plex/command/PlexCommand.java | 44 ++++++++++++++++--- .../command/annotation/CheckPermission.java | 10 +++++ .../annotation/CommandPermissions.java | 3 ++ .../dev/plex/command/impl/AdminworldCMD.java | 3 +- .../dev/plex/command/impl/DeopAllCMD.java | 28 ++++++++++++ .../java/dev/plex/command/impl/ListCMD.java | 2 +- .../java/dev/plex/command/impl/OpAllCMD.java | 1 - .../java/dev/plex/command/impl/RankCMD.java | 10 ++--- .../dev/plex/handlers/CommandHandler.java | 2 + .../plex/listener/impl/PlayerListener.java | 9 ++-- src/main/java/dev/plex/rank/RankManager.java | 5 +++ src/main/resources/config.yml | 5 +++ src/main/resources/messages.yml | 2 + 14 files changed, 118 insertions(+), 27 deletions(-) create mode 100644 src/main/java/dev/plex/command/annotation/CheckPermission.java create mode 100644 src/main/java/dev/plex/command/impl/DeopAllCMD.java diff --git a/src/main/java/dev/plex/Plex.java b/src/main/java/dev/plex/Plex.java index f99df2c..d05720b 100644 --- a/src/main/java/dev/plex/Plex.java +++ b/src/main/java/dev/plex/Plex.java @@ -52,6 +52,8 @@ public class Plex extends JavaPlugin private AdminList adminList; + private String ranksOrPermissions; + public static Plex get() { return plugin; @@ -87,7 +89,8 @@ public class Plex extends JavaPlugin { PlexUtils.testConnections(); PlexLog.log("Connected to " + storageType.name().toUpperCase()); - } catch (Exception e) + } + catch (Exception e) { PlexLog.error("Failed to connect to " + storageType.name().toUpperCase()); e.printStackTrace(); @@ -96,7 +99,8 @@ public class Plex extends JavaPlugin if (storageType == StorageType.MONGODB) { mongoPlayerData = new MongoPlayerData(); - } else + } + else { sqlPlayerData = new SQLPlayerData(); } @@ -104,10 +108,13 @@ public class Plex extends JavaPlugin new ListenerHandler(); // this doesn't need a variable. new CommandHandler(); - rankManager = new RankManager(); - rankManager.generateDefaultRanks(); - rankManager.importDefaultRanks(); - PlexLog.log("Rank Manager initialized"); + ranksOrPermissions = config.getString("commands.permissions"); + + rankManager = new RankManager(); + rankManager.generateDefaultRanks(); + rankManager.importDefaultRanks(); + adminList = new AdminList(); + PlexLog.log("Rank Manager initialized"); punishmentManager = new PunishmentManager(); banManager = new BanManager(); @@ -119,8 +126,6 @@ public class Plex extends JavaPlugin serviceManager.startServices(); PlexLog.log("Started " + serviceManager.serviceCount() + " services."); - adminList = new AdminList(); - generateWorlds(); reloadPlayers(); diff --git a/src/main/java/dev/plex/command/PlexCommand.java b/src/main/java/dev/plex/command/PlexCommand.java index b899ab7..bf03869 100644 --- a/src/main/java/dev/plex/command/PlexCommand.java +++ b/src/main/java/dev/plex/command/PlexCommand.java @@ -13,6 +13,7 @@ import dev.plex.command.exception.PlayerNotFoundException; import dev.plex.command.source.RequiredCommandSource; import dev.plex.player.PlexPlayer; import dev.plex.rank.enums.Rank; +import dev.plex.util.PlexLog; import dev.plex.util.PlexUtils; import java.util.Arrays; import java.util.UUID; @@ -85,9 +86,27 @@ public abstract class PlexCommand extends Command Player player = (Player)sender; PlexPlayer plexPlayer = PlayerCache.getPlexPlayerMap().get(player.getUniqueId()); - if (!plexPlayer.getRankFromString().isAtLeast(getLevel())) + + if (plugin.getRanksOrPermissions().equalsIgnoreCase("ranks")) { - send(sender, tl("noPermissionRank", ChatColor.stripColor(getLevel().getLoginMSG()))); + if (!plexPlayer.getRankFromString().isAtLeast(getLevel())) + { + send(sender, tl("noPermissionRank", ChatColor.stripColor(getLevel().getLoginMSG()))); + return true; + } + } + else if (plugin.getRanksOrPermissions().equalsIgnoreCase("permissions")) + { + if (!player.hasPermission(perms.permission())) + { + send(sender, tl("noPermissionNode", perms.permission())); + return true; + } + } + else + { + PlexLog.error("Neither permissions or ranks were selected to be used in the configuration file!"); + send(sender, "There is a server misconfiguration. Please alert a developer or the owner"); return true; } } @@ -146,6 +165,21 @@ public abstract class PlexCommand extends Command audience.sendMessage(component); } + protected void checkRank(Player player, Rank rank, String permission) + { + PlexPlayer plexPlayer = getPlexPlayer(player); + if (plugin.getRanksOrPermissions().equalsIgnoreCase("ranks")) + { + send(player, "test ranks"); + } + else if (plugin.getRanksOrPermissions().equalsIgnoreCase("permissions")) + { + if (!player.hasPermission(permission)) + { + send(player, "test permissions"); + } + } + } protected boolean isAdmin(PlexPlayer plexPlayer) { @@ -159,13 +193,13 @@ public abstract class PlexCommand extends Command return true; } PlexPlayer plexPlayer = getPlexPlayer(player); - return Plex.get().getRankManager().isAdmin(plexPlayer); + return plugin.getRankManager().isAdmin(plexPlayer); } protected boolean isAdmin(String name) { PlexPlayer plexPlayer = DataUtils.getPlayer(name); - return Plex.get().getRankManager().isAdmin(plexPlayer); + return plugin.getRankManager().isAdmin(plexPlayer); } protected boolean isSeniorAdmin(CommandSender sender) @@ -175,7 +209,7 @@ public abstract class PlexCommand extends Command return true; } PlexPlayer plexPlayer = getPlexPlayer(player); - return Plex.get().getRankManager().isSeniorAdmin(plexPlayer); + return plugin.getRankManager().isSeniorAdmin(plexPlayer); } protected UUID getUUID(CommandSender sender) diff --git a/src/main/java/dev/plex/command/annotation/CheckPermission.java b/src/main/java/dev/plex/command/annotation/CheckPermission.java new file mode 100644 index 0000000..fb51adf --- /dev/null +++ b/src/main/java/dev/plex/command/annotation/CheckPermission.java @@ -0,0 +1,10 @@ +package dev.plex.command.annotation; + +import dev.plex.rank.enums.Rank; + +public @interface CheckPermission +{ + String permission() default ""; + Rank rank() default Rank.IMPOSTOR; + +} diff --git a/src/main/java/dev/plex/command/annotation/CommandPermissions.java b/src/main/java/dev/plex/command/annotation/CommandPermissions.java index f0f6890..24c3927 100644 --- a/src/main/java/dev/plex/command/annotation/CommandPermissions.java +++ b/src/main/java/dev/plex/command/annotation/CommandPermissions.java @@ -4,6 +4,7 @@ import dev.plex.command.source.RequiredCommandSource; import dev.plex.rank.enums.Rank; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import org.bukkit.permissions.Permission; @Retention(RetentionPolicy.RUNTIME) public @interface CommandPermissions @@ -11,4 +12,6 @@ public @interface CommandPermissions Rank level() default Rank.IMPOSTOR; RequiredCommandSource source() default RequiredCommandSource.ANY; + + String permission() default "plex.donotgivethispermission"; // No idea what to put here } \ No newline at end of file diff --git a/src/main/java/dev/plex/command/impl/AdminworldCMD.java b/src/main/java/dev/plex/command/impl/AdminworldCMD.java index eec0615..609466a 100644 --- a/src/main/java/dev/plex/command/impl/AdminworldCMD.java +++ b/src/main/java/dev/plex/command/impl/AdminworldCMD.java @@ -11,11 +11,10 @@ import org.bukkit.Location; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -@CommandPermissions(level = Rank.ADMIN, source = RequiredCommandSource.IN_GAME) +@CommandPermissions(level = Rank.ADMIN, permission = "plex.adminworld", source = RequiredCommandSource.IN_GAME) @CommandParameters(name = "adminworld", aliases = "aw", description = "Teleport to the adminworld") public class AdminworldCMD extends PlexCommand { - @Override public Component execute(CommandSender sender, String[] args) { diff --git a/src/main/java/dev/plex/command/impl/DeopAllCMD.java b/src/main/java/dev/plex/command/impl/DeopAllCMD.java new file mode 100644 index 0000000..e6fd012 --- /dev/null +++ b/src/main/java/dev/plex/command/impl/DeopAllCMD.java @@ -0,0 +1,28 @@ +package dev.plex.command.impl; + +import dev.plex.command.PlexCommand; +import dev.plex.command.annotation.CommandParameters; +import dev.plex.command.annotation.CommandPermissions; +import dev.plex.rank.enums.Rank; +import dev.plex.util.PlexUtils; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +@CommandParameters(name = "deopall", description = "Deop everyone on the server", aliases = "deopa") +@CommandPermissions(level = Rank.ADMIN) +public class DeopAllCMD extends PlexCommand +{ + @Override + public Component execute(CommandSender sender, String[] args) + { + for (Player player : Bukkit.getOnlinePlayers()) + { + player.setOp(false); + } + PlexUtils.broadcast(tl("deoppedAllPlayers", sender.getName())); + return null; + } + +} \ No newline at end of file diff --git a/src/main/java/dev/plex/command/impl/ListCMD.java b/src/main/java/dev/plex/command/impl/ListCMD.java index 5517be6..d65c835 100644 --- a/src/main/java/dev/plex/command/impl/ListCMD.java +++ b/src/main/java/dev/plex/command/impl/ListCMD.java @@ -12,7 +12,7 @@ import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -@CommandParameters(name = "list", description = "Freeze a player on the server", usage = "/ ") +@CommandParameters(name = "list", description = "Show a list of all online players", usage = "/ ") @CommandPermissions(level = Rank.OP) public class ListCMD extends PlexCommand { diff --git a/src/main/java/dev/plex/command/impl/OpAllCMD.java b/src/main/java/dev/plex/command/impl/OpAllCMD.java index 85ea991..9563562 100644 --- a/src/main/java/dev/plex/command/impl/OpAllCMD.java +++ b/src/main/java/dev/plex/command/impl/OpAllCMD.java @@ -14,7 +14,6 @@ import org.bukkit.entity.Player; @CommandPermissions(level = Rank.ADMIN) public class OpAllCMD extends PlexCommand { - @Override public Component execute(CommandSender sender, String[] args) { diff --git a/src/main/java/dev/plex/command/impl/RankCMD.java b/src/main/java/dev/plex/command/impl/RankCMD.java index 23ea4e9..866be16 100644 --- a/src/main/java/dev/plex/command/impl/RankCMD.java +++ b/src/main/java/dev/plex/command/impl/RankCMD.java @@ -13,11 +13,11 @@ import org.bukkit.entity.Player; @CommandPermissions(level = Rank.OP, source = RequiredCommandSource.IN_GAME) @CommandParameters(name = "rank", description = "Displays your rank") -public class RankCMD extends PlexCommand { - +public class RankCMD extends PlexCommand +{ @Override - public Component execute(CommandSender sender, String[] args) { - return tl("yourRank", getPlexPlayer((Player) sender).getRank()); + public Component execute(CommandSender sender, String[] args) + { + return tl("yourRank", getPlexPlayer((Player)sender).getRank()); } - } \ No newline at end of file diff --git a/src/main/java/dev/plex/handlers/CommandHandler.java b/src/main/java/dev/plex/handlers/CommandHandler.java index d8d91df..f264e3c 100644 --- a/src/main/java/dev/plex/handlers/CommandHandler.java +++ b/src/main/java/dev/plex/handlers/CommandHandler.java @@ -7,6 +7,7 @@ import dev.plex.command.impl.AdminworldCMD; import dev.plex.command.impl.AdventureCMD; import dev.plex.command.impl.BanCMD; import dev.plex.command.impl.CreativeCMD; +import dev.plex.command.impl.DeopAllCMD; import dev.plex.command.impl.FlatlandsCMD; import dev.plex.command.impl.FreezeCMD; import dev.plex.command.impl.ListCMD; @@ -33,6 +34,7 @@ public class CommandHandler commands.add(new AdventureCMD()); commands.add(new BanCMD()); commands.add(new CreativeCMD()); + commands.add(new DeopAllCMD()); commands.add(new FlatlandsCMD()); commands.add(new FreezeCMD()); commands.add(new ListCMD()); diff --git a/src/main/java/dev/plex/listener/impl/PlayerListener.java b/src/main/java/dev/plex/listener/impl/PlayerListener.java index 74f4408..cd733f2 100644 --- a/src/main/java/dev/plex/listener/impl/PlayerListener.java +++ b/src/main/java/dev/plex/listener/impl/PlayerListener.java @@ -34,13 +34,15 @@ public class PlayerListener extends PlexListener if (!DataUtils.hasPlayedBefore(player.getUniqueId())) { - PlexLog.log("A player with this name has not joined the server before, creating new entry."); // funi msg + PlexLog.log("A player with this name has not joined the server before, creating new entry."); plexPlayer = new PlexPlayer(player.getUniqueId()); //it doesn't! okay so now create the object plexPlayer.setName(player.getName()); //set the name of the player plexPlayer.setIps(Collections.singletonList(player.getAddress().getAddress().getHostAddress().trim())); //set the arraylist of ips DataUtils.insert(plexPlayer); // insert data in some wack db - } else { + } + else + { plexPlayer = DataUtils.getPlayer(player.getUniqueId()); } @@ -87,10 +89,7 @@ public class PlayerListener extends PlexListener sqlPlayerData.update(plexPlayer); } - PlayerCache.getPlexPlayerMap().remove(event.getPlayer().getUniqueId()); //remove them from cache PlayerCache.getPunishedPlayerMap().remove(event.getPlayer().getUniqueId()); - } - } diff --git a/src/main/java/dev/plex/rank/RankManager.java b/src/main/java/dev/plex/rank/RankManager.java index 8e7f4b8..f3ab2f9 100644 --- a/src/main/java/dev/plex/rank/RankManager.java +++ b/src/main/java/dev/plex/rank/RankManager.java @@ -63,6 +63,11 @@ public class RankManager } } + public Rank getRankFromString(String rank) + { + return Rank.valueOf(rank.toUpperCase()); + } + public void importDefaultRanks() { if (!defaultRanks.exists()) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 89d9b47..e6fa7d0 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -5,6 +5,11 @@ server: motd: "%servername% - Minecraft %mcversion%" colorize_motd: true +# Settings for commands relating to Plex +commands: + # Should Plex use a "true op" system with ranks or only permission nodes + permissions: ranks + data: central: storage: sqlite # Use mariadb, mongodb, or sqlite here diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml index d020387..58b4bab 100644 --- a/src/main/resources/messages.yml +++ b/src/main/resources/messages.yml @@ -30,6 +30,7 @@ noAdminWorldBlockBreak: "You are not allowed to break blocks in the admin wor playerWorldTeleport: "You have been teleported to ." # 1: the command sender who opped everyone oppedAllPlayers: " - Opped all players on the server" +deoppedAllPlayers: " - De-opped all players on the server" # 1: the person who is opping # 2: the person who has been opped oppedPlayer: " - Opped " @@ -42,6 +43,7 @@ unfrozePlayer: " - Unfroze " noPermission: "You cannot use this command!" # 1: the login message (uncolored) of the rank required to use the command noPermissionRank: "You must be at least rank to use this command!" +noPermissionNode: "You must have the permission: to use this command!" noPermissionInGame: "You must be in console to use this command!" noPermissionConsole: "You must be in-game to use this command!" # 1: the username of the name history