Browse Source

Separate MaintenanceMode and PlayerEventsListener moved to simplified BukkitEventListened.

master
Stanislav Usenkov 10 years ago
parent
commit
b09dccc430
  1. 24
      src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitCommands.java
  2. 116
      src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java
  3. 100
      src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitMaintenance.java
  4. 23
      src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java
  5. 57
      src/main/java/ru/simsonic/rscPermissions/Bukkit/PlayerEventsListener.java
  6. 7
      src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java
  7. 7
      src/main/java/ru/simsonic/rscPermissions/InternalCache/ResolutionResult.java

24
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.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachment;
import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscPermissions.Backends.DatabaseContents; import ru.simsonic.rscPermissions.Backends.DatabaseContents;
import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException; import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException;
@ -38,7 +37,24 @@ public class BukkitCommands
rscp.fileCache.cleanup(); rscp.fileCache.cleanup();
rscp.fileCache.saveContents(contents); rscp.fileCache.saveContents(contents);
rscp.internalCache.fill(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 } else
BukkitPluginMain.consoleLog.warning("[rscp] Cannot load data from database."); BukkitPluginMain.consoleLog.warning("[rscp] Cannot load data from database.");
} }
@ -141,7 +157,7 @@ public class BukkitCommands
String mmon = "Maintenance mode enabled"; String mmon = "Maintenance mode enabled";
mmon = rscp.getConfig().getString("language.maintenance.locked.default.mmon", mmon); mmon = rscp.getConfig().getString("language.maintenance.locked.default.mmon", mmon);
mmon = rscp.getConfig().getString("language.maintenance.locked." + mMode + ".mmon", mmon); mmon = rscp.getConfig().getString("language.maintenance.locked." + mMode + ".mmon", mmon);
rscp.maintenance.setMaintenanceMode(mMode); rscp.bukkitListener.setMaintenanceMode(mMode);
throw new CommandAnswerException(mmon); throw new CommandAnswerException(mmon);
} }
return; return;
@ -151,7 +167,7 @@ public class BukkitCommands
{ {
String mmoff = "Maintenance mode disabled"; String mmoff = "Maintenance mode disabled";
mmoff = rscp.getConfig().getString("language.maintenance.unlocked", mmoff); mmoff = rscp.getConfig().getString("language.maintenance.unlocked", mmoff);
rscp.maintenance.setMaintenanceMode(null); rscp.bukkitListener.setMaintenanceMode(null);
throw new CommandAnswerException(mmoff); throw new CommandAnswerException(mmoff);
} }
break; break;

116
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);
}
}
});
}
}

100
src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitMaintenance.java

@ -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<String, Boolean> 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);
}
}
});
}
}

23
src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java

@ -27,28 +27,7 @@ public class BukkitPermissionManager extends RestartableThread
private final HashMap<Player, RowPermission[]> transientPermissions = new HashMap<>(); private final HashMap<Player, RowPermission[]> transientPermissions = new HashMap<>();
private final HashMap<Player, String> prefixes = new HashMap<>(); private final HashMap<Player, String> prefixes = new HashMap<>();
private final HashMap<Player, String> suffixes = new HashMap<>(); private final HashMap<Player, String> suffixes = new HashMap<>();
public void recalculateOnlinePlayersSync() public void recalculateOnlinePlayers()
{
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()
{ {
updateQueue.addAll(rscp.getServer().getOnlinePlayers()); updateQueue.addAll(rscp.getServer().getOnlinePlayers());
rscp.scheduleAutoUpdate(); rscp.scheduleAutoUpdate();

57
src/main/java/ru/simsonic/rscPermissions/Bukkit/PlayerEventsListener.java

@ -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());
}
}

7
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.BukkitCommands;
import ru.simsonic.rscPermissions.Bukkit.BukkitRegionProviders; import ru.simsonic.rscPermissions.Bukkit.BukkitRegionProviders;
import ru.simsonic.rscPermissions.Bukkit.RegionUpdateObserver; import ru.simsonic.rscPermissions.Bukkit.RegionUpdateObserver;
import ru.simsonic.rscPermissions.Bukkit.BukkitMaintenance;
import ru.simsonic.rscPermissions.API.Settings; import ru.simsonic.rscPermissions.API.Settings;
import java.io.IOException; import java.io.IOException;
import java.util.logging.Level; 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.Backends.DatabaseContents;
import ru.simsonic.rscPermissions.Bukkit.BukkitPermissionManager; import ru.simsonic.rscPermissions.Bukkit.BukkitPermissionManager;
import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration; 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.rscPermissions.InternalCache.InternalCache;
import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException; import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException;
import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes;
@ -30,7 +29,7 @@ public final class BukkitPluginMain extends JavaPlugin
public static final Logger consoleLog = Bukkit.getLogger(); public static final Logger consoleLog = Bukkit.getLogger();
public final Settings settings = new BukkitPluginConfiguration(this); public final Settings settings = new BukkitPluginConfiguration(this);
public final BridgeForBukkitAPI bridgeForBukkit = new BridgeForBukkitAPI(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 BackendJson fileCache = new BackendJson(getDataFolder());
public final BackendDatabase connection = new BackendDatabase(consoleLog); public final BackendDatabase connection = new BackendDatabase(consoleLog);
public final InternalCache internalCache = new InternalCache(); public final InternalCache internalCache = new InternalCache();
@ -38,7 +37,6 @@ public final class BukkitPluginMain extends JavaPlugin
public final BukkitRegionProviders regionListProvider = new BukkitRegionProviders(this); public final BukkitRegionProviders regionListProvider = new BukkitRegionProviders(this);
private final RegionUpdateObserver regionUpdateObserver = new RegionUpdateObserver(this); private final RegionUpdateObserver regionUpdateObserver = new RegionUpdateObserver(this);
public final BukkitCommands commandHelper = new BukkitCommands(this); public final BukkitCommands commandHelper = new BukkitCommands(this);
public final BukkitMaintenance maintenance = new BukkitMaintenance(this);
private MetricsLite metrics; private MetricsLite metrics;
@Override @Override
public void onLoad() public void onLoad()
@ -52,7 +50,6 @@ public final class BukkitPluginMain extends JavaPlugin
{ {
settings.readSettings(); settings.readSettings();
// Register event's dispatcher // Register event's dispatcher
maintenance.onEnable();
getServer().getPluginManager().registerEvents(bukkitListener, this); getServer().getPluginManager().registerEvents(bukkitListener, this);
regionUpdateObserver.registerListeners(); regionUpdateObserver.registerListeners();
// WorldGuard, Residence and other possible region list providers // WorldGuard, Residence and other possible region list providers

7
src/main/java/ru/simsonic/rscPermissions/InternalCache/ResolutionResult.java

@ -6,4 +6,11 @@ public class ResolutionResult
public String prefix; public String prefix;
public String suffix; public String suffix;
public RowPermission[] permissions; public RowPermission[] permissions;
public boolean hasPermission(String permission)
{
for(RowPermission row : permissions)
if(permission.equals(row.permission))
return row.value;
return false;
}
} }

Loading…
Cancel
Save