diff --git a/pom.xml b/pom.xml index 0717194..c037b8e 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ ru.simsonic rscPermissions - 0.9.8a + 0.9.9a jar rscPermissions diff --git a/src/main/java/ru/simsonic/rscPermissions/API/Settings.java b/src/main/java/ru/simsonic/rscPermissions/API/Settings.java index 24d0ef8..c4a5c6b 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/Settings.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/Settings.java @@ -1,4 +1,5 @@ package ru.simsonic.rscPermissions.API; +import java.util.Map; import ru.simsonic.rscUtilityLibrary.ConnectionMySQL.ConnectionParams; public interface Settings @@ -8,6 +9,7 @@ public interface Settings public static final String separatorRegExp = "\\."; public static final String instantiator = "?"; public static final String textInheriter = "%"; + public static final boolean decolorizeForConsole = false; public void onLoad(); public void readSettings(); public String getDefaultGroup(); @@ -21,6 +23,7 @@ public interface Settings public long getRegionFinderGranularity(); public int getAutoReloadDelayTicks(); public boolean isUseMetrics(); + public Map getSlotLimits(); public TranslationProvider getTranslationProvider(); public ConnectionParams getConnectionParams(); } diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java index 2e3c9d7..290c993 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java @@ -1,6 +1,7 @@ package ru.simsonic.rscPermissions.Bukkit; import java.util.ArrayList; -import org.bukkit.Bukkit; +import java.util.Collections; +import java.util.Map; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -20,10 +21,15 @@ import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; public class BukkitEventListener implements Listener { private final BukkitPluginMain rscp; + private Map slotLimits = Collections.emptyMap(); public BukkitEventListener(BukkitPluginMain plugin) { this.rscp = plugin; } + public void onEnable() + { + slotLimits = rscp.settings.getSlotLimits(); + } @EventHandler public void onPlayerAsyncPreLogin(AsyncPlayerPreLoginEvent event) { @@ -41,7 +47,12 @@ public class BukkitEventListener implements Listener identifiers.add(event.getAddress().getHostAddress()); // Resolution final ResolutionResult resolution = rscp.internalCache.resolvePlayer(identifiers.toArray(new String[identifiers.size()])); - processMaintenanceLogin(event, resolution); + // Maintenance mode limits + if(event.getLoginResult() == AsyncPlayerPreLoginEvent.Result.ALLOWED) + processMaintenanceLogin(event, resolution); + // Empty slots limits + if(event.getLoginResult() == AsyncPlayerPreLoginEvent.Result.ALLOWED) + processLimitedSlotsLogin(event, resolution); } @EventHandler(priority = EventPriority.LOWEST) public void onPlayerLogin(PlayerLoginEvent event) @@ -100,6 +111,30 @@ public class BukkitEventListener implements Listener "{_YL}Server is in maintenance mode\nPlease try to connect later..."); event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_WHITELIST, kickMsg); } + private void processLimitedSlotsLogin(AsyncPlayerPreLoginEvent event, ResolutionResult resolution) + { + boolean allowed = true; + int freeSlots = rscp.getServer().getMaxPlayers() - Tools.getOnlinePlayers().size(); + for(Map.Entry limit : slotLimits.entrySet()) + { + boolean permission = resolution.hasPermission("rscp.limits." + limit.getKey()); + if(freeSlots > limit.getValue()) + if(permission) + { + allowed = true; + break; + } else + allowed = permission; + } + if(allowed) + { + event.allow(); + return; + } + final String kickMsg = GenericChatCodes.processStringStatic( + "{_LR}Server is too full to allow you enter.\n{_YL}Please try to connect later..."); + event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_WHITELIST, kickMsg); + } public void setMaintenanceMode(String mMode) { rscp.settings.setMaintenanceMode(mMode); @@ -117,7 +152,7 @@ public class BukkitEventListener implements Listener if(player.hasPermission("rscp.maintenance." + rscp.settings.getMaintenanceMode())) continue; final String kick = GenericChatCodes.processStringStatic( - "{_YL}Server is going into maintenance mode. Please connect later."); + "{_LR}Server is going into maintenance mode.\n{_YL}Please try to connect later..."); 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 8649553..80104e7 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java @@ -26,15 +26,12 @@ public class BukkitPermissionManager extends RestartableThread { this.rscp = plugin; } - private final Map resolutions = new ConcurrentHashMap<>(); private final LinkedBlockingQueue updateQueue = new LinkedBlockingQueue<>(); + private final Map resolutions = new ConcurrentHashMap<>(); private final Map attachments = new HashMap<>(); - private final Map> persistentPermissions = new HashMap<>(); - private final Map> transientPermissions = new HashMap<>(); - private final Map> groups = new ConcurrentHashMap<>(); - private final Map prefixes = new ConcurrentHashMap<>(); - private final Map suffixes = new ConcurrentHashMap<>(); - private final Set debug = new HashSet<>(); + private final Map> persistent = new HashMap<>(); + private final Map> temporary = new HashMap<>(); + private final Set debug = new HashSet<>(); public void recalculateOnlinePlayers() { updateQueue.addAll(Tools.getOnlinePlayers()); @@ -79,10 +76,8 @@ public class BukkitPermissionManager extends RestartableThread { updateQueue.remove(player); attachments.remove(player); - prefixes.remove(player); - suffixes.remove(player); - persistentPermissions.remove(player); - transientPermissions.remove(player); + persistent.remove(player); + temporary.remove(player); synchronized(debug) { debug.remove(player); @@ -98,10 +93,7 @@ public class BukkitPermissionManager extends RestartableThread for(Player current = updateQueue.take(); current != null; current = updateQueue.take()) { final ResolutionResult result = rscp.permissionManager.resolvePlayer(current); - groups.put(current, result.groups); - prefixes.put(current, result.prefix); - suffixes.put(current, result.suffix); - persistentPermissions.put(current, result.permissions); + persistent.put(current, result.permissions); final Player player = current; rscp.getServer().getScheduler().runTask(rscp, new Runnable() { @@ -114,11 +106,11 @@ public class BukkitPermissionManager extends RestartableThread // Create new and fill with permissions final PermissionAttachment attachment = player.addAttachment(rscp); attachments.put(player, attachment); - final Map pp = persistentPermissions.get(player); + final Map pp = persistent.get(player); if(pp != null && !pp.isEmpty()) for(Map.Entry row : pp.entrySet()) attachment.setPermission(row.getKey(), row.getValue()); - final Map tp = transientPermissions.get(player); + final Map tp = temporary.get(player); if(tp != null && !tp.isEmpty()) for(Map.Entry row : tp.entrySet()) attachment.setPermission(row.getKey(), row.getValue()); diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPluginConfiguration.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPluginConfiguration.java index 88038ff..66f49e7 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPluginConfiguration.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPluginConfiguration.java @@ -1,5 +1,8 @@ package ru.simsonic.rscPermissions.Bukkit; import java.io.File; +import java.util.HashMap; +import java.util.Map; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import ru.simsonic.rscPermissions.API.Settings; @@ -156,4 +159,14 @@ public class BukkitPluginConfiguration implements Settings result.prefixes = config.getString("settings.connection.prefixes", "rscp_"); return result; } + @Override + public Map getSlotLimits() + { + final FileConfiguration config = plugin.getConfig(); + final ConfigurationSection limits = config.getConfigurationSection("settings.slot-limits"); + final Map result = new HashMap<>(); + for(String limit : limits.getKeys(false)) + result.put(limit, limits.getInt(limit)); + return result; + } } diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java index a5c8f05..24b3889 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java @@ -319,11 +319,6 @@ public class BukkitCommands for(String group : rscp.bridgeForBukkit.getPermission().getPlayerGroups(player)) list.add("{_LG}" + group); throw new CommandAnswerException(list); - /* - case "ranks": - list.add("{MAGENTA}Ranks of player {_YL}" + player.getName() + "{MAGENTA}:"); - throw new CommandAnswerException(list); - */ } throw new CommandAnswerException(list); case "prefix": diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java index a7daf2a..8b66602 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java @@ -66,12 +66,6 @@ public final class VaultPermission extends net.milkbowl.vault.permission.Permiss } @Override @Deprecated - public boolean playerInGroup(String world, String player, String group) - { - throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); - } - @Override - @Deprecated public boolean playerAddGroup(String world, String player, String group) { throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); @@ -194,34 +188,43 @@ public final class VaultPermission extends net.milkbowl.vault.permission.Permiss throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override - public boolean playerInGroup(String world, OfflinePlayer player, String group) + public boolean playerAddGroup(String world, OfflinePlayer player, String group) { throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override - public boolean playerInGroup(Player player, String group) + public boolean playerAddGroup(Player player, String group) { throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override - public boolean playerAddGroup(String world, OfflinePlayer player, String group) + public boolean playerRemoveGroup(String world, OfflinePlayer player, String group) { throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override - public boolean playerAddGroup(Player player, String group) + public boolean playerRemoveGroup(Player player, String group) { throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override - public boolean playerRemoveGroup(String world, OfflinePlayer player, String group) + @Deprecated + public boolean playerInGroup(String world, String player, String group) { - throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); + final ResolutionResult result = rscp.permissionManager.getResult(player); + return result.groups.contains(group); } @Override - public boolean playerRemoveGroup(Player player, String group) + public boolean playerInGroup(String world, OfflinePlayer player, String group) { - throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); + final ResolutionResult result = rscp.permissionManager.getResult(player); + return result.groups.contains(group); + } + @Override + public boolean playerInGroup(Player player, String group) + { + final ResolutionResult result = rscp.permissionManager.getResult(player); + return result.groups.contains(group); } @Override @Deprecated diff --git a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java index 10c6a13..1d8db00 100644 --- a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java +++ b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java @@ -5,6 +5,7 @@ import java.util.logging.Logger; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitScheduler; import org.mcstats.MetricsLite; @@ -48,7 +49,9 @@ public final class BukkitPluginMain extends JavaPlugin @Override public void onEnable() { + // Read settings and setup components settings.readSettings(); + bukkitListener.onEnable(); internalCache.setDefaultGroup( settings.getDefaultGroup(), settings.isDefaultForever()); @@ -121,18 +124,24 @@ public final class BukkitPluginMain extends JavaPlugin @Override public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { - try - { - switch(cmd.getName().toLowerCase()) + if(sender != null) + try { - case "rscp": - commandHelper.onCommandHub(sender, args); - break; + switch(cmd.getName().toLowerCase()) + { + case "rscp": + commandHelper.onCommandHub(sender, args); + break; + } + } catch(CommandAnswerException ex) { + final boolean decolorize = Settings.decolorizeForConsole && sender instanceof ConsoleCommandSender; + for(String answer : ex.getMessageArray()) + { + answer = GenericChatCodes.processStringStatic(Settings.chatPrefix + answer); + final String textToSend = decolorize ? org.bukkit.ChatColor.stripColor(answer) : answer; + sender.sendMessage(textToSend); + } } - } catch(CommandAnswerException ex) { - for(String answer : ex.getMessageArray()) - sender.sendMessage(GenericChatCodes.processStringStatic(Settings.chatPrefix + answer)); - } return true; } } diff --git a/src/main/java/ru/simsonic/rscPermissions/SpongePluginMain.java b/src/main/java/ru/simsonic/rscPermissions/SpongePluginMain.java index 622e604..822ab06 100644 --- a/src/main/java/ru/simsonic/rscPermissions/SpongePluginMain.java +++ b/src/main/java/ru/simsonic/rscPermissions/SpongePluginMain.java @@ -6,7 +6,7 @@ import org.spongepowered.api.event.state.ServerStoppedEvent; import org.spongepowered.api.event.state.ServerStoppingEvent; import org.spongepowered.api.plugin.Plugin; -@Plugin(id = "rscPermissions", name = "rscPermissions", version = "0.9.0b") +@Plugin(id = "rscPermissions", name = "rscPermissions", version = "0.9.9b") public class SpongePluginMain { public void onServerStart(ServerAboutToStartEvent event) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 2c1b54e..8050344 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,19 +1,22 @@ settings: default-group: Default - always-inherit-default-group: false + always-inherit-default-group: true treat-asterisk-as-op: true auto-reload-delay-sec: 900 - use-metrics: true - language: english - maintenance-mode: '' region-finder-thread-granularity-msec: 1000 integration: worldguard: true residence: true + use-metrics: true connection: database: localhost:3306/minecraft username: user1 password: pass1 prefixes: rscp_ + slot-limits: + administrators: 5 + premium: 25 + maintenance-mode: '' + language: english internal: version: 3