Implemented section position

This commit is contained in:
Jaime Martinez Rincon 2017-02-18 00:41:27 +01:00
parent d37005ce3c
commit 5fba98449e
8 changed files with 113 additions and 51 deletions

View File

@ -31,8 +31,16 @@ public class FallbackCommand extends Command {
ServerSection section = plugin.getSectionManager().getByServer(player.getServer().getInfo()); ServerSection section = plugin.getSectionManager().getByServer(player.getServer().getInfo());
if (section != null) { if (section != null) {
/* TODO REFERENCE TO ServerKickListener
if (ConfigEntries.FALLBACK_COMMAND_RESTRICTED.get() && section.isPrincipal()) {
msgr.send(ConfigEntries.UNAVAILABLE_MESSAGE.get());
return null;
}
*/
if ((ConfigEntries.FALLBACK_COMMAND_IGNORED_SECTIONS.get()).contains(section.getName())) { if ((ConfigEntries.FALLBACK_COMMAND_IGNORED_SECTIONS.get()).contains(section.getName())) {
msgr.send(ConfigEntries.UNAVAILABLE_MESSAGE.get()); msgr.send(ConfigEntries.UNAVAILABLE_MESSAGE.get());
return null;
} }
if (ConfigEntries.FALLBACK_COMMAND_ARGUMENTS.get() && args.length == 1) { if (ConfigEntries.FALLBACK_COMMAND_ARGUMENTS.get() && args.length == 1) {
@ -63,12 +71,9 @@ public class FallbackCommand extends Command {
ServerSection section = callable.call(); ServerSection section = callable.call();
if (section != null) { if (section != null) {
ConnectionIntent.connect(plugin, player, section); ConnectionIntent.connect(plugin, player, section);
} else {
msgr.send(ConfigEntries.UNAVAILABLE_MESSAGE.get());
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); //Nothing to do
msgr.send(ConfigEntries.FAILURE_MESSAGE.get());
} }
} else { } else {
msgr.send(ChatColor.RED + "This command can only be executed by a player"); msgr.send(ChatColor.RED + "This command can only be executed by a player");

View File

@ -28,6 +28,7 @@ public class ConfigEntries implements ConfigEntryHolder {
public static final ConfigEntry<List<String>> RECONNECT_KICK_REASONS = new ConfigEntry<>(0, "settings.reconnect-kick.reasons", Collections.emptyList()); public static final ConfigEntry<List<String>> RECONNECT_KICK_REASONS = new ConfigEntry<>(0, "settings.reconnect-kick.reasons", Collections.emptyList());
public static final ConfigEntry<Boolean> RECONNECT_KICK_PRINT_INFO = new ConfigEntry<>(0, "settings.reconnect-kick.print-info", false); public static final ConfigEntry<Boolean> RECONNECT_KICK_PRINT_INFO = new ConfigEntry<>(0, "settings.reconnect-kick.print-info", false);
public static final ConfigEntry<List<String>> RECONNECT_KICK_IGNORED_SECTIONS = new ConfigEntry<>(0, "settings.reconnect-kick.ignored", Collections.emptyList()); public static final ConfigEntry<List<String>> RECONNECT_KICK_IGNORED_SECTIONS = new ConfigEntry<>(0, "settings.reconnect-kick.ignored", Collections.emptyList());
public static final ConfigEntry<Boolean> RECONNECT_KICK_RESTRICTED = new ConfigEntry<>(0, "settings.reconnect-kick.restricted", true);
public static final ConfigEntry<Boolean> RECONNECT_KICK_EXCLUDE_FROM = new ConfigEntry<>(0, "settings.reconnect-kick.exclude-from", true); public static final ConfigEntry<Boolean> RECONNECT_KICK_EXCLUDE_FROM = new ConfigEntry<>(0, "settings.reconnect-kick.exclude-from", true);
public static final ConfigEntry<String> RECONNECT_KICK_MESSAGE = new ConfigEntry<>(0, "settings.reconnect-kick.message", "&cYou have been kicked from &a{from} &cand you are being moved to &a{to}&c, reason: &a{reason}"); public static final ConfigEntry<String> RECONNECT_KICK_MESSAGE = new ConfigEntry<>(0, "settings.reconnect-kick.message", "&cYou have been kicked from &a{from} &cand you are being moved to &a{to}&c, reason: &a{reason}");
@ -36,8 +37,8 @@ public class ConfigEntries implements ConfigEntryHolder {
public static final ConfigEntry<List<String>> FALLBACK_COMMAND_ALIASES = new ConfigEntry<>(0, "settings.fallback-command.aliases", Arrays.asList("lobby", "hub", "back")); public static final ConfigEntry<List<String>> FALLBACK_COMMAND_ALIASES = new ConfigEntry<>(0, "settings.fallback-command.aliases", Arrays.asList("lobby", "hub", "back"));
public static final ConfigEntry<String> FALLBACK_COMMAND_PERMISSION = new ConfigEntry<>(0, "settings.fallback-command.permission", ""); public static final ConfigEntry<String> FALLBACK_COMMAND_PERMISSION = new ConfigEntry<>(0, "settings.fallback-command.permission", "");
public static final ConfigEntry<List<String>> FALLBACK_COMMAND_IGNORED_SECTIONS = new ConfigEntry<>(0, "settings.fallback-command.ignored", Collections.emptyList()); public static final ConfigEntry<List<String>> FALLBACK_COMMAND_IGNORED_SECTIONS = new ConfigEntry<>(0, "settings.fallback-command.ignored", Collections.emptyList());
public static final ConfigEntry<Boolean> FALLBACK_COMMAND_RESTRICTED = new ConfigEntry<>(0, "settings.fallback-command.restricted", true);
public static final ConfigEntry<Boolean> FALLBACK_COMMAND_ARGUMENTS = new ConfigEntry<>(0, "settings.fallback-command.arguments", true); public static final ConfigEntry<Boolean> FALLBACK_COMMAND_ARGUMENTS = new ConfigEntry<>(0, "settings.fallback-command.arguments", true);
public static final ConfigEntry<Boolean> AUTO_RELOAD_ENABLED = new ConfigEntry<>(0, "settings.auto-reload", true); public static final ConfigEntry<Boolean> AUTO_RELOAD_ENABLED = new ConfigEntry<>(0, "settings.auto-reload", true);
public static final ConfigEntry<Boolean> REDIS_BUNGEE_ENABLED = new ConfigEntry<>(0, "settings.redis-bungee", false); public static final ConfigEntry<Boolean> REDIS_BUNGEE_ENABLED = new ConfigEntry<>(0, "settings.redis-bungee", false);
public static final ConfigEntry<Boolean> ASSIGN_TARGETS_ENABLED = new ConfigEntry<>(0, "settings.assign-targets", false); public static final ConfigEntry<Boolean> ASSIGN_TARGETS_ENABLED = new ConfigEntry<>(0, "settings.assign-targets", false);

View File

@ -19,18 +19,6 @@ public abstract class ConnectionIntent {
protected final ProxiedPlayer player; protected final ProxiedPlayer player;
protected final ServerSection section; protected final ServerSection section;
public ConnectionIntent(LobbyBalancer plugin, ProxiedPlayer player, ServerSection section) {
this(plugin, player, section.getProvider(), section);
}
public ConnectionIntent(LobbyBalancer plugin, ProxiedPlayer player, ProviderType type, ServerSection section) {
this(plugin, player, type, section, new ArrayList<>(section.getServers()));
}
public ConnectionIntent(LobbyBalancer plugin, ProxiedPlayer player, ServerSection section, List<ServerInfo> servers) {
this(plugin, player, section.getProvider(), section, servers);
}
public ConnectionIntent(LobbyBalancer plugin, ProxiedPlayer player, ProviderType provider, ServerSection section, List<ServerInfo> servers) { public ConnectionIntent(LobbyBalancer plugin, ProxiedPlayer player, ProviderType provider, ServerSection section, List<ServerInfo> servers) {
this.plugin = plugin; this.plugin = plugin;
this.player = player; this.player = player;
@ -52,6 +40,18 @@ public abstract class ConnectionIntent {
} }
} }
public ConnectionIntent(LobbyBalancer plugin, ProxiedPlayer player, ServerSection section) {
this(plugin, player, section.getProvider(), section);
}
public ConnectionIntent(LobbyBalancer plugin, ProxiedPlayer player, ProviderType type, ServerSection section) {
this(plugin, player, type, section, new ArrayList<>(section.getServers()));
}
public ConnectionIntent(LobbyBalancer plugin, ProxiedPlayer player, ServerSection section, List<ServerInfo> servers) {
this(plugin, player, section.getProvider(), section, servers);
}
private ServerInfo fetchServer(LobbyBalancer plugin, ProxiedPlayer player, ServerSection section, ProviderType provider, List<ServerInfo> servers) { private ServerInfo fetchServer(LobbyBalancer plugin, ProxiedPlayer player, ServerSection section, ProviderType provider, List<ServerInfo> servers) {
if (ConfigEntries.ASSIGN_TARGETS_ENABLED.get()) { if (ConfigEntries.ASSIGN_TARGETS_ENABLED.get()) {
if (ServerAssignRegistry.hasAssignedServer(player, section)) { if (ServerAssignRegistry.hasAssignedServer(player, section)) {

View File

@ -30,41 +30,39 @@ public class ServerConnectListener implements Listener {
ServerSection section = plugin.getSectionManager().getByServer(target); ServerSection section = plugin.getSectionManager().getByServer(target);
if (section == null) { if (section != null) {
return; if (PlayerLocker.isLocked(player)) {
}
if (PlayerLocker.isLocked(player)) {
return;
}
if (section.getServers().contains(target)) {
if (section.isDummy()) {
return; return;
} }
if (player.hasPermission("lobbybalancer.bypass")) { if (section.getServers().contains(target)) {
msgr.send(ChatColor.RED + "You have not been moved because you have the lobbybalancer.bypass permission"); if (section.isDummy()) {
return; return;
}
if (player.getServer() != null && section.getServers().contains(player.getServer().getInfo())) {
if (ConfigEntries.ASSIGN_TARGETS_ENABLED.get()) {
ServerAssignRegistry.assignTarget(player, section, target);
}
return;
}
}
new ConnectionIntent(plugin, player, section) {
@Override
public void connect(ServerInfo server) {
if (ConfigEntries.ASSIGN_TARGETS_ENABLED.get()) {
ServerAssignRegistry.assignTarget(player, section, server);
} }
event.setTarget(server); if (player.hasPermission("lobbybalancer.bypass")) {
msgr.send(ChatColor.RED + "You have not been moved because you have the lobbybalancer.bypass permission");
return;
}
if (player.getServer() != null && section.getServers().contains(player.getServer().getInfo())) {
if (ConfigEntries.ASSIGN_TARGETS_ENABLED.get()) {
ServerAssignRegistry.assignTarget(player, section, target);
}
return;
}
} }
};
new ConnectionIntent(plugin, player, section) {
@Override
public void connect(ServerInfo server) {
if (ConfigEntries.ASSIGN_TARGETS_ENABLED.get()) {
ServerAssignRegistry.assignTarget(player, section, server);
}
event.setTarget(server);
}
};
}
} }
} }

View File

@ -33,6 +33,7 @@ public class ServerKickListener implements Listener {
public void onKick(ServerKickEvent event) { public void onKick(ServerKickEvent event) {
ProxiedPlayer player = event.getPlayer(); ProxiedPlayer player = event.getPlayer();
ServerInfo from = event.getKickedFrom(); ServerInfo from = event.getKickedFrom();
Messager msgr = new Messager(player);
//Player is not connected to any server //Player is not connected to any server
if (player.getServer() == null) { if (player.getServer() == null) {
@ -48,8 +49,10 @@ public class ServerKickListener implements Listener {
Callable<ServerSection> callable = () -> { Callable<ServerSection> callable = () -> {
ServerSection section = plugin.getSectionManager().getByServer(from); ServerSection section = plugin.getSectionManager().getByServer(from);
if (section != null && (ConfigEntries.RECONNECT_KICK_IGNORED_SECTIONS.get()).contains(section.getName())) { if (section != null) {
return null; if ((ConfigEntries.RECONNECT_KICK_IGNORED_SECTIONS.get()).contains(section.getName())) {
return null;
}
} }
AtomicBoolean matches = new AtomicBoolean(false); AtomicBoolean matches = new AtomicBoolean(false);
@ -75,7 +78,30 @@ public class ServerKickListener implements Listener {
String name = rules.getString(section.getName()); String name = rules.getString(section.getName());
ServerSection target = plugin.getSectionManager().getByName(name); ServerSection target = plugin.getSectionManager().getByName(name);
return target == null ? section.getParent() : target; if (target == null) {
target = section.getParent();
}
if (ConfigEntries.RECONNECT_KICK_RESTRICTED.get()) {
//todo 0 is principal section
//todo -1 is parent of principal
//todo 1 is child of principal
if (target.getPosition() < 0) {
return null;
}
/*
if (section.isPrincipal()) {
todo: check if target is parent of section (or more parents of section)
todo: I think that instead of checking if the player is in a principal section we should check
todo: if the target section is above the parent section
return null;
}
*/
}
return target;
} else { } else {
if (ConfigEntries.FALLBACK_PRINCIPAL_ENABLED.get()) { if (ConfigEntries.FALLBACK_PRINCIPAL_ENABLED.get()) {
return plugin.getSectionManager().getPrincipal(); return plugin.getSectionManager().getPrincipal();
@ -101,7 +127,6 @@ public class ServerKickListener implements Listener {
new ConnectionIntent(plugin, player, section, servers) { new ConnectionIntent(plugin, player, section, servers) {
@Override @Override
public void connect(ServerInfo server) { public void connect(ServerInfo server) {
Messager msgr = new Messager(player);
PlayerLocker.lock(player); PlayerLocker.lock(player);
msgr.send(ConfigEntries.RECONNECT_KICK_MESSAGE.get(), msgr.send(ConfigEntries.RECONNECT_KICK_MESSAGE.get(),
new Replacement("{from}", from.getName()), new Replacement("{from}", from.getName()),

View File

@ -45,6 +45,7 @@ public class SectionManager {
section.postInit(plugin); section.postInit(plugin);
}); });
long ending = System.currentTimeMillis() - starting; long ending = System.currentTimeMillis() - starting;
plugin.getLogger().info(String.format("A total of %s section(s) have been loaded in %sms", sectionStorage.size(), ending)); plugin.getLogger().info(String.format("A total of %s section(s) have been loaded in %sms", sectionStorage.size(), ending));
} }

View File

@ -11,14 +11,34 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class ServerSection { public class ServerSection {
private static transient final Function<ServerSection, Integer> function = (section) -> {
if (section.isPrincipal()) {
return 0;
}
int iterations = 0;
while (true) {
section = section.getParent();
iterations++;
if (section == null) {
return iterations;
} else if (section.isPrincipal()) {
return -iterations;
}
}
};
private transient final Configuration section; private transient final Configuration section;
private final String name; private final String name;
private boolean principal; private boolean principal;
private int position = Integer.MAX_VALUE;
private boolean dummy; private boolean dummy;
private ServerSection parent; private ServerSection parent;
private boolean inherited = false; private boolean inherited = false;
@ -107,6 +127,8 @@ public class ServerSection {
} }
void postInit(LobbyBalancer plugin) { void postInit(LobbyBalancer plugin) {
position = function.apply(this);
if (provider == null) { if (provider == null) {
ServerSection sect = this.parent; ServerSection sect = this.parent;
while (sect.provider == null) { while (sect.provider == null) {
@ -156,6 +178,10 @@ public class ServerSection {
return principal; return principal;
} }
public int getPosition() {
return position;
}
public boolean isDummy() { public boolean isDummy() {
return dummy; return dummy;
} }

View File

@ -51,6 +51,9 @@ settings:
# Sections where this feature is ignored # Sections where this feature is ignored
ignored: [] ignored: []
# If enabled, players will not be able to get back to any server in a section that is parent of the principal section
restricted: true
# This will make it so that the server the player is kicked from will be excluded # This will make it so that the server the player is kicked from will be excluded
exclude-from: true exclude-from: true
@ -83,6 +86,9 @@ settings:
# Sections where this command is ignored # Sections where this command is ignored
ignored: [] ignored: []
# If enabled, players will not be able to get back to any server in a section that is parent of the principal section
restricted: true
# Whether the command can accept the name of a section as a target # Whether the command can accept the name of a section as a target
arguments: false arguments: false