diff --git a/api/paper/build.gradle.kts b/api/paper/build.gradle.kts index d0d7da0..6c6e1b1 100644 --- a/api/paper/build.gradle.kts +++ b/api/paper/build.gradle.kts @@ -1,3 +1,11 @@ dependencies { compileOnly("io.papermc.paper:paper-api:1.19.1-R0.1-SNAPSHOT") -} \ No newline at end of file +} + +tasks { + compileJava { + options.release.set(17) + } +} + +java.toolchain.languageVersion.set(JavaLanguageVersion.of(17)) \ No newline at end of file diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 0000000..76986fd --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,10 @@ +repositories { + maven("https://repo.alessiodp.com/releases/") +} + +dependencies { + compileOnly("space.arim.dazzleconf:dazzleconf-core:1.3.0-M1") + compileOnly("space.arim.dazzleconf:dazzleconf-ext-snakeyaml:1.3.0-M1") + compileOnly("org.slf4j:slf4j-api:1.7.36") + compileOnly("net.byteflux:libby-core:1.1.5") +} \ No newline at end of file diff --git a/common/src/main/java/me/adrianed/authmevelocity/common/LibsManager.java b/common/src/main/java/me/adrianed/authmevelocity/common/LibsManager.java new file mode 100644 index 0000000..5be73e6 --- /dev/null +++ b/common/src/main/java/me/adrianed/authmevelocity/common/LibsManager.java @@ -0,0 +1,7 @@ +package me.adrianed.authmevelocity.common; + +//TODO: Abstract Class +public interface LibsManager { + void registerRepositories(); + void loadLibraries(); +} diff --git a/common/src/main/java/me/adrianed/authmevelocity/common/configuration/Loader.java b/common/src/main/java/me/adrianed/authmevelocity/common/configuration/Loader.java index 3d4161b..2d32069 100644 --- a/common/src/main/java/me/adrianed/authmevelocity/common/configuration/Loader.java +++ b/common/src/main/java/me/adrianed/authmevelocity/common/configuration/Loader.java @@ -1,5 +1,65 @@ package me.adrianed.authmevelocity.common.configuration; -public class Loader { - +import org.slf4j.Logger; + +import space.arim.dazzleconf.ConfigurationFactory; +import space.arim.dazzleconf.ConfigurationOptions; +import space.arim.dazzleconf.error.ConfigFormatSyntaxException; +import space.arim.dazzleconf.error.InvalidConfigException; +import space.arim.dazzleconf.ext.snakeyaml.CommentMode; +import space.arim.dazzleconf.ext.snakeyaml.SnakeYamlConfigurationFactory; +import space.arim.dazzleconf.ext.snakeyaml.SnakeYamlOptions; +import space.arim.dazzleconf.helper.ConfigurationHelper; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Path; + +public class Loader { + private final ConfigurationHelper configHelper; + private volatile C configData; + private final Logger logger; + + private Loader(ConfigurationHelper configHelper, Logger logger) { + this.configHelper = configHelper; + this.logger = logger; + } + + public static Loader create(Path configFolder, String fileName, Class configClass, Logger logger) { + SnakeYamlOptions yamlOptions = new SnakeYamlOptions.Builder() + .commentMode(CommentMode.alternativeWriter()) + .build(); + ConfigurationFactory configFactory = SnakeYamlConfigurationFactory.create( + configClass, + ConfigurationOptions.defaults(), + yamlOptions); + return new Loader<>(new ConfigurationHelper<>(configFolder, fileName, configFactory), logger); + } + + public boolean reloadConfig() { + try { + configData = configHelper.reloadConfigData(); + return true; + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } catch (ConfigFormatSyntaxException ex) { + configData = configHelper.getFactory().loadDefaults(); + logger.error("The yaml syntax in your configuration is invalid. " + + "Check your YAML syntax with a tool such as https://yaml-online-parser.appspot.com/", ex); + return false; + } catch (InvalidConfigException ex) { + configData = configHelper.getFactory().loadDefaults(); + logger.error("One of the values in your configuration is not valid. " + + "Check to make sure you have specified the right data types.", ex); + return false; + } + } + + public C getConfig() { + C configData = this.configData; + if (configData == null) { + throw new IllegalStateException("Configuration has not been loaded yet"); + } + return configData; + } } diff --git a/common/src/main/java/me/adrianed/authmevelocity/common/configuration/PaperConfiguration.java b/common/src/main/java/me/adrianed/authmevelocity/common/configuration/PaperConfiguration.java index 94e32b3..9f376cd 100644 --- a/common/src/main/java/me/adrianed/authmevelocity/common/configuration/PaperConfiguration.java +++ b/common/src/main/java/me/adrianed/authmevelocity/common/configuration/PaperConfiguration.java @@ -1,5 +1,5 @@ package me.adrianed.authmevelocity.common.configuration; -public class PaperConfiguration { - +public interface PaperConfiguration { + boolean debug(); } diff --git a/common/src/main/java/me/adrianed/authmevelocity/common/configuration/ProxyConfiguration.java b/common/src/main/java/me/adrianed/authmevelocity/common/configuration/ProxyConfiguration.java index 7c2390f..7481245 100644 --- a/common/src/main/java/me/adrianed/authmevelocity/common/configuration/ProxyConfiguration.java +++ b/common/src/main/java/me/adrianed/authmevelocity/common/configuration/ProxyConfiguration.java @@ -1,5 +1,66 @@ package me.adrianed.authmevelocity.common.configuration; -public class ProxyConfiguration { - +import java.util.List; +import space.arim.dazzleconf.annote.ConfDefault; +import space.arim.dazzleconf.annote.ConfComments; + +public interface ProxyConfiguration { + @ConfDefault.DefaultStrings({ + "auth1", "auth2" + }) + @ConfComments({ + "List of login/registration servers" + }) + List authServers(); + + @ConfDefault.DefaultObject("defaultSendOnLogin") + SendOnLogin sendOnLogin(); + + @ConfDefault.DefaultObject("defaultCommands") + Commands commands(); + + @ConfDefault.DefaultObject("defaultEnsureAuth") + EnsureAuthServer ensureAuthServer(); + + public interface SendOnLogin { + @ConfComments({ + "Send logged in players to another server?" + }) + @ConfDefault.DefaultBoolean(false) + boolean sendToServerOnLogin(); + + @ConfComments({ + "List of servers to send", + "One of these servers will be chosen at random" + }) + @ConfDefault.DefaultStrings({ + "lobby1", "lobby2" + }) + List teleportServers(); + } + + public interface Commands { + @ConfComments({ + "Sets the commands that users who have not yet logged in can execute" + }) + @ConfDefault.DefaultStrings({ + "login", "register", "l", "reg", "email", "captcha" + }) + List allowedCommands(); + + @ConfComments({ + "Sets the message to send in case a non-logged-in player executes an unauthorized command", + "To deactivate the message, leave it empty" + }) + @ConfDefault.DefaultString("You cannot execute commands if you are not logged in yet") + String blockedCommandMessage(); + } + + public interface EnsureAuthServer { + @ConfComments({ + "Ensure that the first server to which players connect is an auth server" + }) + @ConfDefault.DefaultBoolean(false) + boolean ensureFirstServerIsAuthServer(); + } } diff --git a/common/src/main/java/module-info.java b/common/src/main/java/module-info.java index 1cb9444..2151432 100644 --- a/common/src/main/java/module-info.java +++ b/common/src/main/java/module-info.java @@ -1,4 +1,5 @@ module me.adrianed.authmevelocity.common { + requires transitive space.arim.dazzleconf.ext.snakeyaml; exports me.adrianed.authmevelocity.common; exports me.adrianed.authmevelocity.common.configuration; } diff --git a/paper/build.gradle.kts b/paper/build.gradle.kts index 227ff15..428bdab 100644 --- a/paper/build.gradle.kts +++ b/paper/build.gradle.kts @@ -30,6 +30,7 @@ bukkit { depend = listOf("AuthMe") version = "4.0.0" } + tasks { shadowJar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE diff --git a/paper/src/main/java/me/adrianed/authmevelocity/paper/PaperLibraries.java b/paper/src/main/java/me/adrianed/authmevelocity/paper/PaperLibraries.java new file mode 100644 index 0000000..1165cc3 --- /dev/null +++ b/paper/src/main/java/me/adrianed/authmevelocity/paper/PaperLibraries.java @@ -0,0 +1,51 @@ +package me.adrianed.authmevelocity.paper; + +import me.adrianed.authmevelocity.common.LibsManager; +import net.byteflux.libby.BukkitLibraryManager; +import net.byteflux.libby.Library; +import net.byteflux.libby.relocation.Relocation; + +public class PaperLibraries implements LibsManager { + private final BukkitLibraryManager manager; + + public PaperLibraries(AuthMeVelocityPlugin plugin) { + this.manager = new BukkitLibraryManager(plugin); + } + + @Override + public void registerRepositories() { + manager.addMavenCentral(); + } + + @Override + public void loadLibraries() { + final Relocation dazzleRelocation + = new Relocation("space.arim.dazzleconf", "me.adrianed.authmevelocity.libs.dazzleconf"); + final Relocation snakeYamlRelocation + = new Relocation("pattern", "me.adrianed.authmevelocity.libs.snake"); + final Library dazzleConf = Library.builder() + .groupId("space.arim.dazzleconf") + .artifactId("dazzleconf-ext-snakeyaml") + .version("1.3.0-M1") + .relocate(dazzleRelocation) + .build(); + final Library dazzleYaml = Library.builder() + .groupId("space.arim.dazzleconf") + .artifactId("dazzleconf-ext-snakeyaml") + .version("1.3.0-M1") + .relocate(dazzleRelocation) + .relocate(snakeYamlRelocation) + .build(); + final Library snakeYaml = Library.builder() + .groupId("org.yaml") + .artifactId("snakeyaml") + .version("1.30") + .relocate(dazzleRelocation) + .relocate(snakeYamlRelocation) + .build(); + + manager.loadLibrary(snakeYaml); + manager.loadLibrary(dazzleConf); + manager.loadLibrary(dazzleYaml); + } +} diff --git a/velocity/build.gradle.kts b/velocity/build.gradle.kts index 99fd428..3d74e45 100644 --- a/velocity/build.gradle.kts +++ b/velocity/build.gradle.kts @@ -18,10 +18,16 @@ dependencies { compileOnly(project(":authmevelocity-api-velocity")) } -tasks.compileJava { - options.encoding = Charsets.UTF_8.name() +tasks { + compileJava { + options.encoding = Charsets.UTF_8.name() - options.release.set(17) + options.release.set(17) + } + + build { + dependsOn(shadowJar) + } } java.toolchain.languageVersion.set(JavaLanguageVersion.of(17)) diff --git a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/AuthMeVelocityPlugin.java b/velocity/src/main/java/me/adrianed/authmevelocity/velocity/AuthMeVelocityPlugin.java index 2123c07..99ff981 100644 --- a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/AuthMeVelocityPlugin.java +++ b/velocity/src/main/java/me/adrianed/authmevelocity/velocity/AuthMeVelocityPlugin.java @@ -1,12 +1,13 @@ package me.adrianed.authmevelocity.velocity; import me.adrianed.authmevelocity.velocity.commands.AuthmeCommand; -import me.adrianed.authmevelocity.velocity.config.AuthMeConfig; import me.adrianed.authmevelocity.velocity.listener.ConnectListener; import me.adrianed.authmevelocity.velocity.listener.FastLoginListener; import me.adrianed.authmevelocity.velocity.listener.PluginMessageListener; import me.adrianed.authmevelocity.velocity.listener.ProxyListener; import me.adrianed.authmevelocity.api.velocity.AuthMeVelocityAPI; +import me.adrianed.authmevelocity.common.configuration.Loader; +import me.adrianed.authmevelocity.common.configuration.ProxyConfiguration; import com.google.inject.Inject; import com.moandjiezana.toml.Toml; import com.velocitypowered.api.command.CommandSource; @@ -33,7 +34,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collections; -import java.util.HashSet; +import java.util.concurrent.ConcurrentHashMap; import java.util.List; import java.util.Objects; import java.util.Set; @@ -61,10 +62,10 @@ public final class AuthMeVelocityPlugin implements AuthMeVelocityAPI { private final ProxyServer proxy; private final Logger logger; private final Path pluginDirectory; - private AuthMeConfig config; + private Loader config; private final List listeners = new ArrayList<>(3); - protected final Set loggedPlayers = Collections.synchronizedSet(new HashSet<>()); + protected final Set loggedPlayers = ConcurrentHashMap.newKeySet(); @Inject public AuthMeVelocityPlugin(ProxyServer proxy, Logger logger, @DataDirectory Path dataDirectory) { @@ -75,13 +76,26 @@ public final class AuthMeVelocityPlugin implements AuthMeVelocityAPI { @Subscribe public void onProxyInitialization(ProxyInitializeEvent event) { - if (!this.reload()) { - logger.warn("Failed to load config.toml. Shutting down."); - return; - } + final VelocityLibraries libraries + = new VelocityLibraries(logger, pluginDirectory, proxy.getPluginManager(), this); + libraries.registerRepositories(); + libraries.loadLibraries(); + + this.config = Loader.create(pluginDirectory, "config.yml", ProxyConfiguration.class, logger); proxy.getChannelRegistrar().register(AUTHMEVELOCITY_CHANNEL); + List.of( + new ProxyListener(this), + new ConnectListener(this, proxy, logger), + new PluginMessageListener(proxy, logger, this) + ).forEach(listener -> + proxy.getEventManager().register(this, listener)); + + if (proxy.getPluginManager().isLoaded("fastlogin")) { + proxy.getEventManager().register(this, new FastLoginListener(proxy, this)); + } + if (proxy.getPluginManager().isLoaded("miniplaceholders")) { AuthMePlaceholders.getExpansion(this).register(); } @@ -95,64 +109,22 @@ public final class AuthMeVelocityPlugin implements AuthMeVelocityAPI { return this.proxy; } - private Toml loadConfig(Path path){ - try { - if (Files.notExists(path)) { - Files.createDirectory(path); - } - - Path configPath = path.resolve("config.toml"); - if (Files.notExists(configPath)) { - try (InputStream in = this.getClass().getClassLoader().getResourceAsStream("config.toml")) { - Files.copy(Objects.requireNonNull(in, "The configuration does not exists"), configPath); - } - } - - return new Toml().read(Files.newInputStream(configPath)); - } catch (IOException ex) { - logger.error("An error ocurred on configuration initialization", ex); - return null; - } catch(IllegalStateException ex) { - logger.error("Invalid configuration provided", ex); - return null; - } - } - - public boolean reload() { - Toml toml = this.loadConfig(pluginDirectory); - if (toml == null) { - return false; - } - - this.config = new AuthMeConfig(toml); - - listeners.forEach(listener -> proxy.getEventManager().unregisterListener(this, listener)); - listeners.clear(); - - listeners.add(new ProxyListener(config, this)); - listeners.add(new ConnectListener(config, this, proxy, logger)); - listeners.add(new PluginMessageListener(proxy, logger, config, this)); - - if (proxy.getPluginManager().isLoaded("fastlogin")) { - listeners.add(new FastLoginListener(proxy, this)); - } - - listeners.forEach(listener -> proxy.getEventManager().register(this, listener)); - return true; - } - public void sendInfoMessage() { CommandSource source = proxy.getConsoleCommandSource(); source.sendMessage(MiniMessage.miniMessage().deserialize( " --- AuthMeVelocity ---")); source.sendMessage(MiniMessage.miniMessage().deserialize( - "AuthServers: " + config.getAuthServers())); - if (config.getToServerOptions().sendToServer()) { + "AuthServers: " + config.getConfig().authServers())); + if (config.getConfig().sendOnLogin().sendToServerOnLogin()) { source.sendMessage(MiniMessage.miniMessage().deserialize( - "LobbyServers: " + config.getToServerOptions().getTeleportServers())); + "LobbyServers: " + config.getConfig().sendOnLogin().teleportServers())); } } + public Loader config() { + return this.config; + } + @Override public boolean isLogged(Player player){ return loggedPlayers.contains(player.getUniqueId()); @@ -185,16 +157,16 @@ public final class AuthMeVelocityPlugin implements AuthMeVelocityAPI { @Override public boolean isAuthServer(RegisteredServer server){ - return config.getAuthServers().contains(server.getServerInfo().getName()); + return config.getConfig().authServers().contains(server.getServerInfo().getName()); } @Override public boolean isAuthServer(ServerConnection connection){ - return config.getAuthServers().contains(connection.getServerInfo().getName()); + return config.getConfig().authServers().contains(connection.getServerInfo().getName()); } @Override public boolean isAuthServer(String server){ - return config.getAuthServers().contains(server); + return config.getConfig().authServers().contains(server); } } diff --git a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/VelocityLibraries.java b/velocity/src/main/java/me/adrianed/authmevelocity/velocity/VelocityLibraries.java new file mode 100644 index 0000000..fffa8cb --- /dev/null +++ b/velocity/src/main/java/me/adrianed/authmevelocity/velocity/VelocityLibraries.java @@ -0,0 +1,57 @@ +package me.adrianed.authmevelocity.velocity; + +import java.nio.file.Path; + +import org.slf4j.Logger; + +import com.velocitypowered.api.plugin.PluginManager; + +import me.adrianed.authmevelocity.common.LibsManager; +import net.byteflux.libby.Library; +import net.byteflux.libby.VelocityLibraryManager; +import net.byteflux.libby.relocation.Relocation; + +public class VelocityLibraries implements LibsManager { + private final VelocityLibraryManager manager; + + public VelocityLibraries(Logger logger, Path dataDirectory, PluginManager pluginManager, AuthMeVelocityPlugin plugin) { + this.manager = new VelocityLibraryManager( + logger, dataDirectory, pluginManager, plugin); + } + @Override + public void registerRepositories() { + manager.addMavenCentral(); + } + + @Override + public void loadLibraries() { + final Relocation dazzleRelocation + = new Relocation("space.arim.dazzleconf", "me.adrianed.authmevelocity.libs.dazzleconf"); + final Relocation snakeYamlRelocation + = new Relocation("pattern", "me.adrianed.authmevelocity.libs.snake"); + final Library dazzleConf = Library.builder() + .groupId("space.arim.dazzleconf") + .artifactId("dazzleconf-ext-snakeyaml") + .version("1.3.0-M1") + .relocate(dazzleRelocation) + .build(); + final Library dazzleYaml = Library.builder() + .groupId("space.arim.dazzleconf") + .artifactId("dazzleconf-ext-snakeyaml") + .version("1.3.0-M1") + .relocate(dazzleRelocation) + .relocate(snakeYamlRelocation) + .build(); + final Library snakeYaml = Library.builder() + .groupId("org.yaml") + .artifactId("snakeyaml") + .version("1.30") + .relocate(dazzleRelocation) + .relocate(snakeYamlRelocation) + .build(); + + manager.loadLibrary(snakeYaml); + manager.loadLibrary(dazzleConf); + manager.loadLibrary(dazzleYaml); + } +} diff --git a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/commands/AuthmeCommand.java b/velocity/src/main/java/me/adrianed/authmevelocity/velocity/commands/AuthmeCommand.java index cf7914b..2fc9f4a 100644 --- a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/commands/AuthmeCommand.java +++ b/velocity/src/main/java/me/adrianed/authmevelocity/velocity/commands/AuthmeCommand.java @@ -20,7 +20,7 @@ public class AuthmeCommand { .then(LiteralArgumentBuilder.literal("reload") .executes(cmd -> { CommandSource source = cmd.getSource(); - if (plugin.reload()) { + if (plugin.config().reloadConfig()) { plugin.sendInfoMessage(); source.sendMessage(MiniMessage.miniMessage().deserialize( "AuthmeVelocity has been successfully reloaded")); diff --git a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/config/AuthMeConfig.java b/velocity/src/main/java/me/adrianed/authmevelocity/velocity/config/AuthMeConfig.java deleted file mode 100644 index abfee8e..0000000 --- a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/config/AuthMeConfig.java +++ /dev/null @@ -1,91 +0,0 @@ -package me.adrianed.authmevelocity.velocity.config; - -import java.util.List; -import java.util.Set; - -import com.moandjiezana.toml.Toml; - -import org.jetbrains.annotations.NotNull; - -public final class AuthMeConfig { - private final List authServers; - private final ServerOnLogin serverOnLogin; - private final Commands commands; - private final EnsureAuthServer ensure; - - public AuthMeConfig(@NotNull Toml toml){ - this.authServers = ConfigUtils.listOrElse(toml, "authServers", - () -> List.of("auth1", "auth2")); - this.serverOnLogin = ConfigUtils.getObjectOrElse(toml, "SendOnLogin", ServerOnLogin.class, - () -> new ServerOnLogin(false, List.of("lobby1", "lobby2"))); - this.commands = ConfigUtils.getObjectOrElse(toml, "Commands", Commands.class, - () -> new Commands(Set.of("login", "register", "l", "reg", "email", "captcha"), "You cannot execute commands if you are not logged in yet")); - this.ensure = ConfigUtils.getObjectOrElse(toml, "EnsureAuthServer", EnsureAuthServer.class, - () -> new EnsureAuthServer(false)); - } - - public static class ServerOnLogin { - private final boolean sendToServerOnLogin; - private final List teleportServers; - - public ServerOnLogin(boolean sendToServerOnLogin, List teleportServers){ - this.sendToServerOnLogin = sendToServerOnLogin; - this.teleportServers = teleportServers; - } - - public boolean sendToServer(){ - return this.sendToServerOnLogin; - } - - public @NotNull List getTeleportServers(){ - return this.teleportServers; - } - } - - public static class Commands { - private final Set allowedCommands; - private final String blockedCommandMessage; - - public Commands(Set allowedCommands, String blockedCommandMessage){ - this.allowedCommands = allowedCommands; - this.blockedCommandMessage = blockedCommandMessage; - } - - public @NotNull Set getAllowedCommands(){ - return this.allowedCommands; - } - - public @NotNull String getBlockedMessage() { - return this.blockedCommandMessage; - } - } - - public static class EnsureAuthServer { - private final boolean ensureFirstServerIsAuthServer; - - public EnsureAuthServer(boolean ensureFirstServerIsAuthServer){ - this.ensureFirstServerIsAuthServer = ensureFirstServerIsAuthServer; - } - - public boolean ensureAuthServer(){ - return this.ensureFirstServerIsAuthServer; - } - - } - - public @NotNull Commands getCommandsConfig(){ - return this.commands; - } - - public @NotNull ServerOnLogin getToServerOptions(){ - return this.serverOnLogin; - } - - public @NotNull EnsureAuthServer getEnsureOptions(){ - return this.ensure; - } - - public @NotNull List getAuthServers(){ - return this.authServers; - } -} diff --git a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/config/ConfigUtils.java b/velocity/src/main/java/me/adrianed/authmevelocity/velocity/config/ConfigUtils.java deleted file mode 100644 index 8875aec..0000000 --- a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/config/ConfigUtils.java +++ /dev/null @@ -1,40 +0,0 @@ -package me.adrianed.authmevelocity.velocity.config; - -import java.util.List; -import java.util.function.Supplier; - -import java.lang.reflect.ParameterizedType; - -import com.moandjiezana.toml.Toml; -import com.velocitypowered.api.proxy.Player; - -import net.kyori.adventure.text.minimessage.MiniMessage; - -public final class ConfigUtils { - public static final MiniMessage MINIMESSAGE = MiniMessage.miniMessage(); - - public static void sendBlockedMessage(Player player, AuthMeConfig config){ - String blockedMessage = config.getCommandsConfig().getBlockedMessage(); - if(!blockedMessage.isBlank()){ - player.sendMessage(MINIMESSAGE.deserialize(blockedMessage)); - } - } - - @SuppressWarnings("unchecked") - static T getObjectOrElse(Toml config, String key, Supplier defaultValue){ - Toml configTable = config.getTable(key); - return configTable == null ? defaultValue.get() : (T)configTable.to((Class)((ParameterizedType)defaultValue.getClass() - .getGenericInterfaces()[0]).getActualTypeArguments()[0]); - } - - static T getObjectOrElse(Toml config, String key, Class clazz, Supplier defaultValue){ - Toml configTable = config.getTable(key); - return configTable == null ? defaultValue.get() : configTable.to(clazz); - } - - static List listOrElse(Toml config, String key, Supplier> defaultList){ - List list = config.getList(key); - return list != null ? list : defaultList.get(); - } - private ConfigUtils(){} -} diff --git a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/listener/ConnectListener.java b/velocity/src/main/java/me/adrianed/authmevelocity/velocity/listener/ConnectListener.java index 78dddd6..e6a1263 100644 --- a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/listener/ConnectListener.java +++ b/velocity/src/main/java/me/adrianed/authmevelocity/velocity/listener/ConnectListener.java @@ -5,7 +5,6 @@ import java.util.Optional; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; -import me.adrianed.authmevelocity.velocity.config.AuthMeConfig; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import com.velocitypowered.api.event.Continuation; @@ -24,25 +23,23 @@ import me.adrianed.authmevelocity.api.velocity.AuthMeVelocityAPI; public class ConnectListener { private final ProxyServer proxy; private final Logger logger; - private final AuthMeConfig config; - private final AuthMeVelocityAPI api; + private final AuthMeVelocityPlugin plugin; - public ConnectListener(AuthMeConfig config, AuthMeVelocityAPI api, ProxyServer proxy, Logger logger) { - this.config = config; - this.api = api; + public ConnectListener(AuthMeVelocityPlugin plugin, ProxyServer proxy, Logger logger) { + this.plugin = plugin; this.logger = logger; this.proxy = proxy; } @Subscribe(order = PostOrder.LATE) public void onInitialServer(PlayerChooseInitialServerEvent event, Continuation continuation){ - if(!config.getEnsureOptions().ensureAuthServer()) { + if(!plugin.config().getConfig().ensureAuthServer().ensureFirstServerIsAuthServer()) { continuation.resume(); return; } Optional optionalSV = event.getInitialServer(); - if(optionalSV.isPresent() && api.isAuthServer(optionalSV.get())){ + if(optionalSV.isPresent() && plugin.isAuthServer(optionalSV.get())){ continuation.resume(); return; } @@ -58,13 +55,13 @@ public class ConnectListener { @Subscribe public void onServerPreConnect(ServerPreConnectEvent event, Continuation continuation) { - if (!event.getResult().isAllowed() && api.isLogged(event.getPlayer())) { + if (!event.getResult().isAllowed() && plugin.isLogged(event.getPlayer())) { continuation.resume(); return; } // this should be present, "event.getResult().isAllowed()" is the "isPresent" check - if(!api.isAuthServer(event.getResult().getServer().get())) { + if(!plugin.isAuthServer(event.getResult().getServer().get())) { event.setResult(ServerPreConnectEvent.ServerResult.denied()); } continuation.resume(); @@ -73,7 +70,7 @@ public class ConnectListener { @Subscribe public void onServerPostConnect(ServerPostConnectEvent event) { final Player player = event.getPlayer(); - if (api.isLogged(player) && api.isInAuthServer(player)) { + if (plugin.isLogged(player) && plugin.isInAuthServer(player)) { ByteArrayDataOutput buf = ByteStreams.newDataOutput(); buf.writeUTF("LOGIN"); player.getCurrentServer().ifPresent(sv -> @@ -83,7 +80,7 @@ public class ConnectListener { // TODO: Implement #40 private @Nullable RegisteredServer getAvailableServer() { - for(String sv : config.getAuthServers()){ + for(String sv : plugin.config().getConfig().authServers()){ Optional opt = proxy.getServer(sv); if (opt.isPresent()) return opt.get(); } diff --git a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/listener/FastLoginListener.java b/velocity/src/main/java/me/adrianed/authmevelocity/velocity/listener/FastLoginListener.java index b76c90e..ce64a57 100644 --- a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/listener/FastLoginListener.java +++ b/velocity/src/main/java/me/adrianed/authmevelocity/velocity/listener/FastLoginListener.java @@ -7,14 +7,15 @@ import com.velocitypowered.api.proxy.ProxyServer; import me.adrianed.authmevelocity.api.velocity.AuthMeVelocityAPI; public class FastLoginListener { - private final ProxyServer server; + private final ProxyServer proxy; private final AuthMeVelocityAPI api; - public FastLoginListener(ProxyServer server, AuthMeVelocityAPI api){ - this.server = server; + public FastLoginListener(ProxyServer proxy, AuthMeVelocityAPI api){ + this.proxy = proxy; this.api = api; } @Subscribe public void onAutoLogin(VelocityFastLoginAutoLoginEvent event){ - server.getPlayer(event.getProfile().getName()).ifPresent(api::addPlayer); + proxy.getPlayer(event.getProfile().getName()) + .ifPresent(api::addPlayer); } } diff --git a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/listener/PluginMessageListener.java b/velocity/src/main/java/me/adrianed/authmevelocity/velocity/listener/PluginMessageListener.java index d9aff27..ca89b6a 100644 --- a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/listener/PluginMessageListener.java +++ b/velocity/src/main/java/me/adrianed/authmevelocity/velocity/listener/PluginMessageListener.java @@ -3,7 +3,6 @@ package me.adrianed.authmevelocity.velocity.listener; import java.util.List; import java.util.Random; -import me.adrianed.authmevelocity.velocity.config.AuthMeConfig; import me.adrianed.authmevelocity.api.velocity.event.PreSendOnLoginEvent; import me.adrianed.authmevelocity.api.velocity.event.ProxyForcedUnregisterEvent; import me.adrianed.authmevelocity.api.velocity.event.ProxyLoginEvent; @@ -22,7 +21,6 @@ import com.velocitypowered.api.proxy.ServerConnection; import com.velocitypowered.api.proxy.server.RegisteredServer; import me.adrianed.authmevelocity.velocity.AuthMeVelocityPlugin; -import me.adrianed.authmevelocity.api.velocity.AuthMeVelocityAPI; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -32,15 +30,13 @@ public class PluginMessageListener { private final ProxyServer proxy; private final Logger logger; private final Random rm; - private final AuthMeConfig config; - private final AuthMeVelocityAPI api; + private final AuthMeVelocityPlugin plugin; - public PluginMessageListener(@NotNull ProxyServer proxy, @NotNull Logger logger, @NotNull AuthMeConfig config, AuthMeVelocityAPI api) { + public PluginMessageListener(@NotNull ProxyServer proxy, @NotNull Logger logger, AuthMeVelocityPlugin plugin) { this.proxy = proxy; this.logger = logger; this.rm = new Random(); - this.config = config; - this.api = api; + this.plugin = plugin; } @Subscribe @@ -62,13 +58,13 @@ public class PluginMessageListener { final @Nullable Player loggedPlayer = proxy.getPlayer(playername).orElse(null); switch (sChannel) { case "LOGIN" : - if (loggedPlayer != null && api.addPlayer(loggedPlayer)){ + if (loggedPlayer != null && plugin.addPlayer(loggedPlayer)){ proxy.getEventManager().fireAndForget(new ProxyLoginEvent(loggedPlayer)); this.createServerConnectionRequest(loggedPlayer, connection); } break; case "LOGOUT": - if (loggedPlayer != null && api.removePlayer(loggedPlayer)){ + if (loggedPlayer != null && plugin.removePlayer(loggedPlayer)){ proxy.getEventManager().fireAndForget(new ProxyLogoutEvent(loggedPlayer)); } break; @@ -89,7 +85,7 @@ public class PluginMessageListener { } private void createServerConnectionRequest(Player player, ServerConnection connection){ - if (!config.getToServerOptions().sendToServer()) { + if (!plugin.config().getConfig().sendOnLogin().sendToServerOnLogin()) { return; } @@ -119,7 +115,7 @@ public class PluginMessageListener { } private String getRandomServer() { - final List serverList = config.getToServerOptions().getTeleportServers(); + final List serverList = plugin.config().getConfig().sendOnLogin().teleportServers(); return serverList.get(rm.nextInt(serverList.size())); } } diff --git a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/listener/ProxyListener.java b/velocity/src/main/java/me/adrianed/authmevelocity/velocity/listener/ProxyListener.java index 6bf0294..560430b 100644 --- a/velocity/src/main/java/me/adrianed/authmevelocity/velocity/listener/ProxyListener.java +++ b/velocity/src/main/java/me/adrianed/authmevelocity/velocity/listener/ProxyListener.java @@ -1,8 +1,7 @@ package me.adrianed.authmevelocity.velocity.listener; -import me.adrianed.authmevelocity.velocity.config.AuthMeConfig; -import me.adrianed.authmevelocity.velocity.config.ConfigUtils; import me.adrianed.authmevelocity.velocity.utils.AuthmeUtils; +import me.adrianed.authmevelocity.velocity.AuthMeVelocityPlugin; import com.velocitypowered.api.event.Continuation; import com.velocitypowered.api.event.EventTask; import com.velocitypowered.api.event.PostOrder; @@ -13,22 +12,20 @@ import com.velocitypowered.api.event.player.PlayerChatEvent; import com.velocitypowered.api.event.player.TabCompleteEvent; import com.velocitypowered.api.proxy.Player; -import me.adrianed.authmevelocity.api.velocity.AuthMeVelocityAPI; - import org.jetbrains.annotations.NotNull; -public final class ProxyListener { - private final AuthMeConfig config; - private final AuthMeVelocityAPI api; +import net.kyori.adventure.text.minimessage.MiniMessage; - public ProxyListener(@NotNull AuthMeConfig config, AuthMeVelocityAPI api) { - this.config = config; - this.api = api; +public final class ProxyListener { + private final AuthMeVelocityPlugin plugin; + + public ProxyListener(AuthMeVelocityPlugin plugin) { + this.plugin = plugin; } @Subscribe public EventTask onDisconnect(final DisconnectEvent event) { - return EventTask.async(() -> api.removePlayer(event.getPlayer())); + return EventTask.async(() -> plugin.removePlayer(event.getPlayer())); } @Subscribe(order = PostOrder.FIRST) @@ -40,19 +37,19 @@ public final class ProxyListener { Player player = (Player)event.getCommandSource(); - if (api.isLogged(player)) { + if (plugin.isLogged(player)) { continuation.resume(); return; } - if (api.isInAuthServer(player)) { + if (plugin.isInAuthServer(player)) { String command = AuthmeUtils.getFirstArgument(event.getCommand()); - if (!config.getCommandsConfig().getAllowedCommands().contains(command)) { - ConfigUtils.sendBlockedMessage(player, config); + if (!plugin.config().getConfig().commands().allowedCommands().contains(command)) { + sendBlockedMessage(player); event.setResult(CommandExecuteEvent.CommandResult.denied()); } } else { - ConfigUtils.sendBlockedMessage(player, config); + sendBlockedMessage(player); event.setResult(CommandExecuteEvent.CommandResult.denied()); } continuation.resume(); @@ -60,19 +57,19 @@ public final class ProxyListener { @Subscribe(order = PostOrder.FIRST) public void onPlayerChat(final PlayerChatEvent event) { - if (api.isNotLogged(event.getPlayer())) { + if (plugin.isNotLogged(event.getPlayer())) { event.setResult(PlayerChatEvent.ChatResult.denied()); } } @Subscribe(order = PostOrder.FIRST) public void onTabComplete(TabCompleteEvent event){ - if (api.isLogged(event.getPlayer())) { + if (plugin.isLogged(event.getPlayer())) { return; } final String command = event.getPartialMessage(); - for (final String allowed : config.getCommandsConfig().getAllowedCommands()) { + for (final String allowed : plugin.config().getConfig().commands().allowedCommands()) { if (allowed.startsWith(command)) { return; } @@ -80,5 +77,12 @@ public final class ProxyListener { event.getSuggestions().clear(); } + + void sendBlockedMessage(Player player){ + String blockedMessage = plugin.config().getConfig().commands().blockedCommandMessage(); + if (!blockedMessage.isBlank()){ + player.sendMessage(MiniMessage.miniMessage().deserialize(blockedMessage)); + } + } }