From 1153a0eee4a3685fcfad490646e4610d38d61c01 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Fri, 2 Sep 2011 23:07:23 +0100 Subject: Bukkit Superperms support --- .../permissions/BukkitPermissions.java | 195 +++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java (limited to 'EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java') diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java new file mode 100644 index 000000000..e396118b4 --- /dev/null +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java @@ -0,0 +1,195 @@ +/* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +package org.anjocaido.groupmanager.permissions; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.anjocaido.groupmanager.GroupManager; +import org.anjocaido.groupmanager.data.User; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerKickEvent; +import org.bukkit.event.player.PlayerListener; +import org.bukkit.event.player.PlayerPortalEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.server.PluginDisableEvent; +import org.bukkit.event.server.PluginEnableEvent; +import org.bukkit.event.server.ServerListener; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginManager; + + +/** + * + * BukkitPermissions overrides to force GM reponses to Superperms + * + * @author ElgarL, based upon PermissionsEX implementation + */ +public class BukkitPermissions { + + protected Map attachments = new HashMap(); + protected Set registeredPermissions = new HashSet(); + protected Plugin plugin; + protected boolean dumpAllPermissions = true; + protected boolean dumpMatchedPermissions = true; + + public BukkitPermissions(Plugin plugin) { + this.plugin = plugin; + + this.collectPermissions(); + this.registerEvents(); + + this.updateAllPlayers(); + + GroupManager.logger.info("Superperms support enabled."); + } + + private void registerEvents() { + PluginManager manager = plugin.getServer().getPluginManager(); + + PlayerEvents playerEventListener = new PlayerEvents(); + + manager.registerEvent(Event.Type.PLAYER_JOIN, playerEventListener, Event.Priority.Normal, plugin); + manager.registerEvent(Event.Type.PLAYER_KICK, playerEventListener, Event.Priority.Normal, plugin); + manager.registerEvent(Event.Type.PLAYER_QUIT, playerEventListener, Event.Priority.Normal, plugin); + + manager.registerEvent(Event.Type.PLAYER_RESPAWN, playerEventListener, Event.Priority.Normal, plugin); + manager.registerEvent(Event.Type.PLAYER_TELEPORT, playerEventListener, Event.Priority.Normal, plugin); + manager.registerEvent(Event.Type.PLAYER_PORTAL, playerEventListener, Event.Priority.Normal, plugin); + + ServerListener serverListener = new BukkitEvents(); + + manager.registerEvent(Event.Type.PLUGIN_ENABLE, serverListener, Event.Priority.Normal, plugin); + manager.registerEvent(Event.Type.PLUGIN_DISABLE, serverListener, Event.Priority.Normal, plugin); + } + + private void collectPermissions() { + registeredPermissions.clear(); + for (Plugin bukkitPlugin : Bukkit.getServer().getPluginManager().getPlugins()) { + registeredPermissions.addAll(bukkitPlugin.getDescription().getPermissions()); + } + } + + public void updatePermissions(Player player){ + this.updatePermissions(player, null); + } + + public void updatePermissions(Player player, String world) { + if (player == null || !this.plugin.isEnabled()) { + return; + } + + if (!this.attachments.containsKey(player)) { + this.attachments.put(player, player.addAttachment(plugin)); + } + + if(world == null){ + world = player.getWorld().getName(); + } + + PermissionAttachment attachment = this.attachments.get(player); + + User user = GroupManager.getWorldsHolder().getWorldData(world).getUser(player.getName()); + + // clear permissions + for (String permission : attachment.getPermissions().keySet()) { + attachment.unsetPermission(permission); + } + + for (Permission permission : registeredPermissions) { + boolean permissionValue = user.getGroup().hasSamePermissionNode(permission.getName()); + + //GroupManager.logger.info(permission.getName() + " : " + Boolean.toString(permissionValue)); + + attachment.setPermission(permission, permissionValue); + } + + player.recalculatePermissions(); + + } + + public void updateAllPlayers() { + for (Player player : Bukkit.getServer().getOnlinePlayers()) { + updatePermissions(player); + } + } + + protected class PlayerEvents extends PlayerListener { + + @Override + public void onPlayerJoin(PlayerJoinEvent event) { + updatePermissions(event.getPlayer()); + } + + @Override + public void onPlayerPortal(PlayerPortalEvent event) { // will portal into another world + if(event.getPlayer().getWorld().equals(event.getTo().getWorld())){ // only if world actually changed + return; + } + + updatePermissions(event.getPlayer(), event.getTo().getWorld().getName()); + } + + @Override + public void onPlayerRespawn(PlayerRespawnEvent event) { // can be respawned in another world + updatePermissions(event.getPlayer(), event.getRespawnLocation().getWorld().getName()); + } + + @Override + public void onPlayerTeleport(PlayerTeleportEvent event) { // can be teleported into another world + if (!event.getFrom().getWorld().equals(event.getTo().getWorld())) { // only if world actually changed + updatePermissions(event.getPlayer(), event.getTo().getWorld().getName()); + } + } + + @Override + public void onPlayerQuit(PlayerQuitEvent event) { + attachments.remove(event.getPlayer()); + } + + @Override + public void onPlayerKick(PlayerKickEvent event) { + attachments.remove(event.getPlayer()); + } + } + + protected class BukkitEvents extends ServerListener { + + @Override + public void onPluginEnable(PluginEnableEvent event) { + collectPermissions(); + updateAllPlayers(); + } + + @Override + public void onPluginDisable(PluginDisableEvent event) { + collectPermissions(); + updateAllPlayers(); + } + } + +} \ No newline at end of file -- cgit v1.2.3