diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitCommands.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitCommands.java index 4985653..1d5a46d 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitCommands.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitCommands.java @@ -7,7 +7,6 @@ import java.util.logging.Level; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.permissions.PermissionAttachment; import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.Backends.DatabaseContents; import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException; @@ -38,7 +37,24 @@ public class BukkitCommands rscp.fileCache.cleanup(); rscp.fileCache.saveContents(contents); rscp.internalCache.fill(contents); - rscp.permissionManager.recalculateOnlinePlayersSync(); + final Runnable syncTask = new Runnable() + { + @Override + public synchronized void run() + { + rscp.permissionManager.recalculateOnlinePlayers(); + notify(); + } + }; + try + { + synchronized(syncTask) + { + rscp.getServer().getScheduler().runTask(rscp, syncTask); + syncTask.wait(); + } + } catch(InterruptedException ex) { + } } else BukkitPluginMain.consoleLog.warning("[rscp] Cannot load data from database."); } @@ -141,7 +157,7 @@ public class BukkitCommands String mmon = "Maintenance mode enabled"; mmon = rscp.getConfig().getString("language.maintenance.locked.default.mmon", mmon); mmon = rscp.getConfig().getString("language.maintenance.locked." + mMode + ".mmon", mmon); - rscp.maintenance.setMaintenanceMode(mMode); + rscp.bukkitListener.setMaintenanceMode(mMode); throw new CommandAnswerException(mmon); } return; @@ -151,7 +167,7 @@ public class BukkitCommands { String mmoff = "Maintenance mode disabled"; mmoff = rscp.getConfig().getString("language.maintenance.unlocked", mmoff); - rscp.maintenance.setMaintenanceMode(null); + rscp.bukkitListener.setMaintenanceMode(null); throw new CommandAnswerException(mmoff); } break; diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java new file mode 100644 index 0000000..27cec83 --- /dev/null +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java @@ -0,0 +1,116 @@ +package ru.simsonic.rscPermissions.Bukkit; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerExpChangeEvent; +import org.bukkit.event.player.PlayerKickEvent; +import org.bukkit.event.player.PlayerLevelChangeEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.server.ServerListPingEvent; +import ru.simsonic.rscPermissions.BukkitPluginMain; +import ru.simsonic.rscPermissions.InternalCache.ResolutionResult; +import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; + +public class BukkitEventListener implements Listener +{ + private final BukkitPluginMain rscp; + public BukkitEventListener(BukkitPluginMain plugin) + { + this.rscp = plugin; + } + @EventHandler + public void onPlayerAsyncPreLogin(AsyncPlayerPreLoginEvent event) + { + final ResolutionResult resolution = rscp.internalCache.resolvePlayer(new String[] + { + event.getName(), + event.getUniqueId().toString(), + event.getAddress().getHostAddress(), + }, rscp.getServer().getServerId()); + processMaintenanceLogin(event, resolution); + } + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerLogin(PlayerLoginEvent event) + { + rscp.permissionManager.recalculatePlayer(event.getPlayer()); + } + @EventHandler + public void onPlayerExp(PlayerLevelChangeEvent event) + { + rscp.permissionManager.recalculatePlayer(event.getPlayer()); + } + @EventHandler + public void onPlayerLevel(PlayerExpChangeEvent event) + { + rscp.permissionManager.recalculatePlayer(event.getPlayer()); + } + @EventHandler + public void onPlayerKick(PlayerKickEvent event) + { + final Player player = event.getPlayer(); + rscp.permissionManager.removePlayer(player); + rscp.regionListProvider.removePlayer(player); + } + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) + { + final Player player = event.getPlayer(); + rscp.permissionManager.removePlayer(player); + rscp.regionListProvider.removePlayer(player); + } + @org.bukkit.event.EventHandler + public void onServerPing(ServerListPingEvent event) + { + if(rscp.settings.isInMaintenance()) + { + final String motd = GenericChatCodes.processStringStatic( + "Server is under maintenance"); + event.setMotd(motd); + } + } + private void processMaintenanceLogin(AsyncPlayerPreLoginEvent event, ResolutionResult resolution) + { + if("".equals(rscp.settings.getMaintenanceMode())) + { + event.allow(); + return; + } + final String permissionMM = "rscp.maintenance." + (rscp.settings.getMaintenanceMode()); + final String permissionAll = "rscp.maintenance.*"; + if(resolution.hasPermission(permissionMM) || resolution.hasPermission(permissionAll)) + { + event.allow(); + return; + } + final String kickMsg = GenericChatCodes.processStringStatic( + "{_YL}Server is in maintenance mode\nPlease try to connect later..."); + event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_WHITELIST, kickMsg); + } + public void setMaintenanceMode(String mMode) + { + rscp.settings.setMaintenanceMode(mMode); + if(!rscp.settings.isInMaintenance()) + return; + rscp.getServer().getScheduler().runTask(rscp, new Runnable() + { + @Override + public void run() + { + for(Player player : Bukkit.getServer().getOnlinePlayers()) + { + if(player.hasPermission("rscp.maintenance.*")) + continue; + if(player.hasPermission("rscp.maintenance." + rscp.settings.getMaintenanceMode())) + continue; + final String kick = GenericChatCodes.processStringStatic( + "{_YL}Server is going into maintenance mode. Please connect later."); + player.kickPlayer(kick); + } + } + }); + } +} diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitMaintenance.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitMaintenance.java deleted file mode 100644 index ef046a3..0000000 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitMaintenance.java +++ /dev/null @@ -1,100 +0,0 @@ -package ru.simsonic.rscPermissions.Bukkit; -import java.util.HashMap; -import java.util.UUID; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.server.ServerListPingEvent; -import ru.simsonic.rscPermissions.BukkitPluginMain; -import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; - -public class BukkitMaintenance implements Listener -{ - private final BukkitPluginMain rscp; - public BukkitMaintenance(BukkitPluginMain rscp) - { - this.rscp = rscp; - } - public void onEnable() - { - rscp.getServer().getPluginManager().registerEvents(this, rscp); - } - @org.bukkit.event.EventHandler - public void onServerPing(ServerListPingEvent event) - { - if(rscp.settings.isInMaintenance()) - { - String motd = "Server is under maintenance"; - motd = rscp.getConfig().getString("language.maintenance.locked.default.motd", motd); - motd = rscp.getConfig().getString("language.maintenance.locked." + rscp.settings.getMaintenanceMode() + ".motd", motd); - motd = GenericChatCodes.processStringStatic(motd); - if(!"".equals(motd)) - event.setMotd(motd); - } - } - @org.bukkit.event.EventHandler - public void onAsyncPlayerPreLogin(AsyncPlayerPreLoginEvent event) - { - if("".equals(rscp.settings.getMaintenanceMode())) - { - event.allow(); - return; - } - final String permissionAll = "rscp.maintenance.*"; - final String permission_mm = "rscp.maintenance." + (rscp.settings.getMaintenanceMode()); - final HashMap permissions = new HashMap<>(); - try - { - final String name = event.getName(); - rscp.internalCache.resolvePlayer(name, rscp.getServer().getServerId()); - // permissions.putAll(plugin.cache.mapPermissions.get(name)); - } catch(RuntimeException ex) { - } - try - { - final UUID uuid = event.getUniqueId(); - final String userFriendlyUniqueId = uuid.toString().replace("-", "").toLowerCase(); - rscp.internalCache.resolvePlayer(userFriendlyUniqueId, rscp.getServer().getServerId()); - // permissions.putAll(plugin.cache.mapPermissions.get(userFriendlyUniqueId)); - } catch(RuntimeException | NoSuchMethodError ex) { - } - for(String permission : permissions.keySet()) - if(permission.equalsIgnoreCase(permission_mm) || permission.equalsIgnoreCase(permissionAll)) - { - event.allow(); - return; - } - String kickMsg = "{_YL}Server is in maintenance mode\nPlease try to connect later..."; - kickMsg = rscp.getConfig().getString("language.maintenance.locked.default.motd", kickMsg); - kickMsg = rscp.getConfig().getString("language.maintenance.locked." + rscp.settings.getMaintenanceMode() + ".motd", kickMsg); - kickMsg = GenericChatCodes.processStringStatic(kickMsg); - event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_WHITELIST, kickMsg); - } - public void setMaintenanceMode(String mMode) - { - rscp.settings.setMaintenanceMode(mMode); - if(!rscp.settings.isInMaintenance()) - return; - rscp.getServer().getScheduler().scheduleSyncDelayedTask(rscp, new Runnable() - { - @Override - public void run() - { - for(Player player : Bukkit.getServer().getOnlinePlayers()) - if(player != null) - { - if(player.hasPermission("rscp.maintenance.*")) - continue; - if(player.hasPermission("rscp.maintenance." + rscp.settings.getMaintenanceMode())) - continue; - String kick = "{_YL}Server is going into maintenance mode"; - kick = rscp.getConfig().getString("language.maintenance.locked.default.kick", kick); - kick = rscp.getConfig().getString("language.maintenance.locked." + rscp.settings.getMaintenanceMode() + ".kick", kick); - kick = GenericChatCodes.processStringStatic(kick); - player.kickPlayer(kick); - } - } - }); - } -} diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java index 926f42c..e4e5315 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java @@ -27,28 +27,7 @@ public class BukkitPermissionManager extends RestartableThread private final HashMap transientPermissions = new HashMap<>(); private final HashMap prefixes = new HashMap<>(); private final HashMap suffixes = new HashMap<>(); - public void recalculateOnlinePlayersSync() - { - try - { - Runnable syncTask = new Runnable() - { - @Override - public synchronized void run() - { - rscp.permissionManager.recalculateOnlinePlayersAsync(); - notify(); - } - }; - synchronized(syncTask) - { - rscp.getServer().getScheduler().runTask(rscp, syncTask); - syncTask.wait(); - } - } catch(InterruptedException ex) { - } - } - public void recalculateOnlinePlayersAsync() + public void recalculateOnlinePlayers() { updateQueue.addAll(rscp.getServer().getOnlinePlayers()); rscp.scheduleAutoUpdate(); diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/PlayerEventsListener.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/PlayerEventsListener.java deleted file mode 100644 index eb3d41d..0000000 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/PlayerEventsListener.java +++ /dev/null @@ -1,57 +0,0 @@ -package ru.simsonic.rscPermissions.Bukkit; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerExpChangeEvent; -import org.bukkit.event.player.PlayerKickEvent; -import org.bukkit.event.player.PlayerLevelChangeEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import ru.simsonic.rscPermissions.BukkitPluginMain; - -public class PlayerEventsListener implements Listener -{ - private final BukkitPluginMain rscp; - public PlayerEventsListener(BukkitPluginMain plugin) - { - this.rscp = plugin; - } - @EventHandler - public void onPlayerAsyncPreLogin(AsyncPlayerPreLoginEvent event) - { - rscp.internalCache.resolvePlayer(new String[] - { - event.getName(), - event.getUniqueId().toString(), - event.getAddress().getHostAddress(), - }, rscp.getServer().getServerId()); - } - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerLogin(PlayerLoginEvent event) - { - rscp.permissionManager.resolvePlayer(event.getPlayer()); - } - @EventHandler - public void onPlayerExp(PlayerLevelChangeEvent event) - { - rscp.permissionManager.resolvePlayer(event.getPlayer()); - } - @EventHandler - public void onPlayerLevel(PlayerExpChangeEvent event) - { - rscp.permissionManager.resolvePlayer(event.getPlayer()); - } - @EventHandler - public void onPlayerKick(PlayerKickEvent event) - { - rscp.permissionManager.removePlayer(event.getPlayer()); - rscp.regionListProvider.removePlayer(event.getPlayer()); - } - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) - { - rscp.permissionManager.removePlayer(event.getPlayer()); - rscp.regionListProvider.removePlayer(event.getPlayer()); - } -} diff --git a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java index 745f06c..bc74bf6 100644 --- a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java +++ b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java @@ -3,7 +3,6 @@ import ru.simsonic.rscPermissions.API.BridgeForBukkitAPI; import ru.simsonic.rscPermissions.Bukkit.BukkitCommands; import ru.simsonic.rscPermissions.Bukkit.BukkitRegionProviders; import ru.simsonic.rscPermissions.Bukkit.RegionUpdateObserver; -import ru.simsonic.rscPermissions.Bukkit.BukkitMaintenance; import ru.simsonic.rscPermissions.API.Settings; import java.io.IOException; import java.util.logging.Level; @@ -19,7 +18,7 @@ import ru.simsonic.rscPermissions.Backends.BackendJson; import ru.simsonic.rscPermissions.Backends.DatabaseContents; import ru.simsonic.rscPermissions.Bukkit.BukkitPermissionManager; import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration; -import ru.simsonic.rscPermissions.Bukkit.PlayerEventsListener; +import ru.simsonic.rscPermissions.Bukkit.BukkitEventListener; import ru.simsonic.rscPermissions.InternalCache.InternalCache; import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException; import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; @@ -30,7 +29,7 @@ public final class BukkitPluginMain extends JavaPlugin public static final Logger consoleLog = Bukkit.getLogger(); public final Settings settings = new BukkitPluginConfiguration(this); public final BridgeForBukkitAPI bridgeForBukkit = new BridgeForBukkitAPI(this); - public final PlayerEventsListener bukkitListener = new PlayerEventsListener(this); + public final BukkitEventListener bukkitListener = new BukkitEventListener(this); public final BackendJson fileCache = new BackendJson(getDataFolder()); public final BackendDatabase connection = new BackendDatabase(consoleLog); public final InternalCache internalCache = new InternalCache(); @@ -38,7 +37,6 @@ public final class BukkitPluginMain extends JavaPlugin public final BukkitRegionProviders regionListProvider = new BukkitRegionProviders(this); private final RegionUpdateObserver regionUpdateObserver = new RegionUpdateObserver(this); public final BukkitCommands commandHelper = new BukkitCommands(this); - public final BukkitMaintenance maintenance = new BukkitMaintenance(this); private MetricsLite metrics; @Override public void onLoad() @@ -52,7 +50,6 @@ public final class BukkitPluginMain extends JavaPlugin { settings.readSettings(); // Register event's dispatcher - maintenance.onEnable(); getServer().getPluginManager().registerEvents(bukkitListener, this); regionUpdateObserver.registerListeners(); // WorldGuard, Residence and other possible region list providers diff --git a/src/main/java/ru/simsonic/rscPermissions/InternalCache/ResolutionResult.java b/src/main/java/ru/simsonic/rscPermissions/InternalCache/ResolutionResult.java index a8bfbb3..f2c9fbc 100644 --- a/src/main/java/ru/simsonic/rscPermissions/InternalCache/ResolutionResult.java +++ b/src/main/java/ru/simsonic/rscPermissions/InternalCache/ResolutionResult.java @@ -6,4 +6,11 @@ public class ResolutionResult public String prefix; public String suffix; public RowPermission[] permissions; + public boolean hasPermission(String permission) + { + for(RowPermission row : permissions) + if(permission.equals(row.permission)) + return row.value; + return false; + } }