From 810fd632ff67c9795d8a5f7e5e0b786c1d41bb0c Mon Sep 17 00:00:00 2001 From: creeper Date: Wed, 14 Jan 2026 16:00:23 +0100 Subject: [PATCH] main commit --- README.md | 21 +++- .../operatorwhitelist/OperatorWhitelist.java | 108 +++++++++++++++++- src/main/resources/plugin.yml | 12 +- 3 files changed, 136 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9c50c55..c360376 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,22 @@ # OperatorWhitelist -Only allow certain player names (in a config) to have op and deop + ban others for security reasons. \ No newline at end of file +Only allow certain player names (in a config) to have op and deop + ban others for security reasons. + +## Features +- Uses plugins/OperatorWhitelist/config.yml +- Automatically deops and bans unauthorized operators +- In-game whitelist management command +- Permission-based access + +## Commands +/opwhitelist add +/opwhitelist remove + +## Permission +operatorwhitelist.manage (default: false) + +## Behavior +If a player joins with OP and is not in the whitelist: +- They are de-opped +- They are banned +- They are kicked instantly diff --git a/src/main/java/at/creeperjaegermax/operatorwhitelist/OperatorWhitelist.java b/src/main/java/at/creeperjaegermax/operatorwhitelist/OperatorWhitelist.java index 6905479..8e108b1 100644 --- a/src/main/java/at/creeperjaegermax/operatorwhitelist/OperatorWhitelist.java +++ b/src/main/java/at/creeperjaegermax/operatorwhitelist/OperatorWhitelist.java @@ -1,17 +1,119 @@ package at.creeperjaegermax.operatorwhitelist; +import org.bukkit.BanList; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.plugin.java.JavaPlugin; -public final class OperatorWhitelist extends JavaPlugin { +import java.util.List; + +public final class OperatorWhitelist extends JavaPlugin implements Listener { + + private FileConfiguration config; @Override public void onEnable() { - // Plugin startup logic + saveDefaultConfig(); + config = getConfig(); + Bukkit.getPluginManager().registerEvents(this, this); + + getLogger().info("OperatorWhitelist enabled."); } @Override public void onDisable() { - // Plugin shutdown logic + getLogger().info("OperatorWhitelist disabled."); + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + + if (player.isOp()) { + if (!isWhitelisted(player.getName())) { + player.setOp(false); + + String reason = "Unauthorized operator detected."; + + Bukkit.getBanList(BanList.Type.NAME).addBan(player.getName(), reason, null, "OperatorWhitelist"); + player.kickPlayer(reason); + + getLogger().warning("Banned unauthorized operator: " + player.getName()); + } + } + } + + private boolean isWhitelisted(String name) { + List list = config.getStringList("whitelist"); + for (String s : list) { + if (s.equalsIgnoreCase(name)) { + return true; + } + } + return false; + } + + private void saveWhitelist(List list) { + config.set("whitelist", list); + saveConfig(); + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + + if (!command.getName().equalsIgnoreCase("opwhitelist")) { + return false; + } + + if (!sender.hasPermission("operatorwhitelist.manage")) { + sender.sendMessage("§cYou do not have permission to do that."); + return true; + } + + if (args.length != 2) { + sender.sendMessage("§cUsage: /opwhitelist "); + return true; + } + + String action = args[0]; + String playerName = args[1]; + + List list = config.getStringList("whitelist"); + + if (action.equalsIgnoreCase("add")) { + if (isWhitelisted(playerName)) { + sender.sendMessage("§ePlayer already whitelisted."); + return true; + } + + list.add(playerName); + saveWhitelist(list); + + sender.sendMessage("§aAdded " + playerName + " to operator whitelist."); + return true; + } + + if (action.equalsIgnoreCase("remove")) { + boolean removed = list.removeIf(s -> s.equalsIgnoreCase(playerName)); + + if (!removed) { + sender.sendMessage("§ePlayer not in whitelist."); + return true; + } + + saveWhitelist(list); + sender.sendMessage("§aRemoved " + playerName + " from operator whitelist."); + return true; + } + + sender.sendMessage("§cUsage: /opwhitelist "); + return true; } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index c46158f..7c5ab6b 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,3 +1,13 @@ name: OperatorWhitelist -version: '${project.version}' +version: '1.0' main: at.creeperjaegermax.operatorwhitelist.OperatorWhitelist + +commands: + opwhitelist: + description: Manage operator whitelist + usage: /opwhitelist + +permissions: + operatorwhitelist.manage: + description: Allows managing the operator whitelist + default: false