From 8e0e263e188ab72fffacf07247be20194671d1e8 Mon Sep 17 00:00:00 2001 From: LartyHD Date: Fri, 15 Feb 2019 01:48:49 +0100 Subject: [PATCH 1/4] Coded the main features #5 --- .../de/astride/maintenance/Maintenance.kt | 46 ++++++++++++++++-- .../maintenance/config/ConfigProvider.kt | 48 +++++++++++++++++++ .../astride/maintenance/listener/Listener.kt | 35 ++++++++++++++ 3 files changed, 124 insertions(+), 5 deletions(-) create mode 100644 velocity/src/main/kotlin/de/astride/maintenance/config/ConfigProvider.kt create mode 100644 velocity/src/main/kotlin/de/astride/maintenance/listener/Listener.kt diff --git a/velocity/src/main/kotlin/de/astride/maintenance/Maintenance.kt b/velocity/src/main/kotlin/de/astride/maintenance/Maintenance.kt index d0a4345..60cf4e4 100644 --- a/velocity/src/main/kotlin/de/astride/maintenance/Maintenance.kt +++ b/velocity/src/main/kotlin/de/astride/maintenance/Maintenance.kt @@ -4,17 +4,23 @@ package de.astride.maintenance +import com.velocitypowered.api.event.EventManager import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.proxy.ProxyInitializeEvent +import com.velocitypowered.api.event.proxy.ProxyReloadEvent import com.velocitypowered.api.plugin.Plugin -import com.velocitypowered.api.proxy.ProxyServer +import com.velocitypowered.api.plugin.annotation.DataDirectory +import de.astride.maintenance.config.ConfigProvider +import de.astride.maintenance.listener.Listener import org.slf4j.Logger +import java.nio.file.Path /** * @author Lars Artmann | LartyHD * Created by Lars Artmann | LartyHD on 13.02.2019 09:52. - * Current Version: 1.0 (13.02.2019 - 13.02.2019) + * Current Version: 1.0 (13.02.2019 - 15.02.2019) */ +@Suppress("UNUSED_PARAMETER") @Plugin( id = "maintenance", name = "Maintenance", @@ -23,14 +29,44 @@ import org.slf4j.Logger authors = ["Lars Artmann | LartyHD"] ) class Maintenance private constructor( - private val proxyServer: ProxyServer, + private val eventManager: EventManager, + @DataDirectory private val path: Path, private val logger: Logger ) { - @Suppress("UNUSED_PARAMETER") + companion object { + private lateinit var provider: ConfigProvider + } + + private lateinit var listener: Listener + @Subscribe fun on(event: ProxyInitializeEvent) { - logger.info("Maintenance loaded :D") + register() + logger.info("Maintenance loaded") + //proxyServer.allServers.first().serverInfo.address.address.isReachable(10) } + @Subscribe + fun on(event: ProxyReloadEvent) { + register() + logger.info("Maintenance reloaded") + } + + private fun register() { + registerConfig() + if (provider.config.isActive) registerListener() //registerConfig() must be called before + } + + private fun registerConfig() { + provider = ConfigProvider(path.toFile()) + } + + private fun registerListener() { + if (::listener.isInitialized) eventManager.unregisterListener(this, listener) + listener = Listener(provider) + eventManager.register(this, listener) + } + + } \ No newline at end of file diff --git a/velocity/src/main/kotlin/de/astride/maintenance/config/ConfigProvider.kt b/velocity/src/main/kotlin/de/astride/maintenance/config/ConfigProvider.kt new file mode 100644 index 0000000..8606b3e --- /dev/null +++ b/velocity/src/main/kotlin/de/astride/maintenance/config/ConfigProvider.kt @@ -0,0 +1,48 @@ +package de.astride.maintenance.config + +import net.darkdevelopers.darkbedrock.darkness.general.configs.ConfigData +import net.darkdevelopers.darkbedrock.darkness.general.configs.gson.GsonService +import net.kyori.text.Component +import net.kyori.text.serializer.ComponentSerializers +import java.io.File + +/** + * @author Lars Artmann | LartyHD + * Created by Lars Artmann | LartyHD on 15.02.2019 00:10. + * Current Version: 1.0 (15.02.2019 - 15.02.2019) + */ +class ConfigProvider(var directory: File) { + + /* SubClass */ + val config by lazy { Config() } + val motd by lazy { Motd() } + + inner class Config internal constructor() { + + /* Main */ + private val configData by lazy { ConfigData(directory, "config.json") } + private val config by lazy { GsonService.loadAsJsonObject(configData) } + /* Values */ + val isActive by lazy { config["IsActive"]?.asBoolean ?: false } + val motdFileName by lazy { config["MotdFileName"]?.asString ?: "motd.json" } + val byPassPermission by lazy { config["ByPassPermission"]?.asString ?: "maintenance.bypass" } + val kickMessage: Component by lazy { + ComponentSerializers.LEGACY.deserialize(config["KickMessage"]?.asString ?: "§cCosmicSky.net | Maintenance") + } + + } + + inner class Motd internal constructor() { + + /* Main */ + private val configData by lazy { ConfigData(directory, this@ConfigProvider.config.motdFileName) } + private val config by lazy { GsonService.loadAsJsonObject(configData) } + /* Values */ + val versionName: String by lazy { config["VerisonName"]?.asString ?: "CosmicProxy" } + val description: Component by lazy { + ComponentSerializers.LEGACY.deserialize(config["Description"]?.asString ?: "§cCosmicSky.net | Maintenance") + } + + } + +} \ No newline at end of file diff --git a/velocity/src/main/kotlin/de/astride/maintenance/listener/Listener.kt b/velocity/src/main/kotlin/de/astride/maintenance/listener/Listener.kt new file mode 100644 index 0000000..20978bb --- /dev/null +++ b/velocity/src/main/kotlin/de/astride/maintenance/listener/Listener.kt @@ -0,0 +1,35 @@ +package de.astride.maintenance.listener + +import com.velocitypowered.api.event.ResultedEvent +import com.velocitypowered.api.event.Subscribe +import com.velocitypowered.api.event.connection.LoginEvent +import com.velocitypowered.api.event.proxy.ProxyPingEvent +import com.velocitypowered.api.proxy.server.ServerPing +import de.astride.maintenance.config.ConfigProvider + +/** + * @author Lars Artmann | LartyHD + * Created by Lars Artmann | LartyHD on 14.02.2019 23:31. + * Current Version: 1.0 (14.02.2019 - 15.02.2019) + */ +class Listener(private val provider: ConfigProvider) { + + @Subscribe + fun on(event: ProxyPingEvent) { + val motd = provider.motd + val version = ServerPing.Version(event.ping.version.protocol, motd.versionName) + + event.ping = event.ping.asBuilder() + .version(version) + .description(motd.description) + .nullPlayers() + .build() + } + + @Subscribe + fun on(event: LoginEvent) { + if (event.player.hasPermission(provider.config.byPassPermission)) return + event.result = ResultedEvent.ComponentResult.denied(provider.config.kickMessage) + } + +} \ No newline at end of file From 6bc59c694ccc2199b45206e6439e1852107fabb6 Mon Sep 17 00:00:00 2001 From: LartyHD Date: Sat, 16 Feb 2019 03:59:55 +0100 Subject: [PATCH 2/4] Added config examples and Fixed Velocity --- .../kotlin/de/astride/maintenance/Maintenance.kt | 3 ++- velocity/src/main/resources/velocity-plugin.json | 13 +++++++++++++ velocity/src/test/resources/config.json | 6 ++++++ velocity/src/test/resources/motd.json | 4 ++++ 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 velocity/src/main/resources/velocity-plugin.json create mode 100644 velocity/src/test/resources/config.json create mode 100644 velocity/src/test/resources/motd.json diff --git a/velocity/src/main/kotlin/de/astride/maintenance/Maintenance.kt b/velocity/src/main/kotlin/de/astride/maintenance/Maintenance.kt index 60cf4e4..e322d23 100644 --- a/velocity/src/main/kotlin/de/astride/maintenance/Maintenance.kt +++ b/velocity/src/main/kotlin/de/astride/maintenance/Maintenance.kt @@ -4,6 +4,7 @@ package de.astride.maintenance +import com.google.inject.Inject import com.velocitypowered.api.event.EventManager import com.velocitypowered.api.event.Subscribe import com.velocitypowered.api.event.proxy.ProxyInitializeEvent @@ -28,7 +29,7 @@ import java.nio.file.Path url = "Astride.de", authors = ["Lars Artmann | LartyHD"] ) -class Maintenance private constructor( +class Maintenance @Inject private constructor( private val eventManager: EventManager, @DataDirectory private val path: Path, private val logger: Logger diff --git a/velocity/src/main/resources/velocity-plugin.json b/velocity/src/main/resources/velocity-plugin.json new file mode 100644 index 0000000..e1aa72a --- /dev/null +++ b/velocity/src/main/resources/velocity-plugin.json @@ -0,0 +1,13 @@ +{ + "id": "maintenance", + "name": "Maintenance", + "version": "1.0-SNAPSHOT", + "description": "Maintenance", + "url": "Astride.de", + "authors": [ + "Lars Artmann | LartyHD" + ], + "dependencies": [ + ], + "main": "de.astride.maintenance.Maintenance" +} \ No newline at end of file diff --git a/velocity/src/test/resources/config.json b/velocity/src/test/resources/config.json new file mode 100644 index 0000000..3685e01 --- /dev/null +++ b/velocity/src/test/resources/config.json @@ -0,0 +1,6 @@ +{ + "IsActive": true, + "MotdFileName": "motd.json", + "ByPassPermission": "maintenance.bypass", + "KickMessage": "&aWir sind aktiv am verbessern des Servers\n&aDein &fCosmicSky.net &aTeam" +} \ No newline at end of file diff --git a/velocity/src/test/resources/motd.json b/velocity/src/test/resources/motd.json new file mode 100644 index 0000000..64cd2fc --- /dev/null +++ b/velocity/src/test/resources/motd.json @@ -0,0 +1,4 @@ +{ + "VerisonName": "CosmicProxy", + "Description": "&aWir sind aktiv am verbessern des Servers\n&aDein &fCosmicSky.net &aTeam" +} \ No newline at end of file From e5fb8bb9af5739b9eba074e7d6dbefed46fb6440 Mon Sep 17 00:00:00 2001 From: LartyHD Date: Sat, 16 Feb 2019 04:13:36 +0100 Subject: [PATCH 3/4] Improve Configs --- .../kotlin/de/astride/maintenance/config/ConfigProvider.kt | 4 +++- velocity/src/test/resources/config.json | 2 +- velocity/src/test/resources/motd.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/velocity/src/main/kotlin/de/astride/maintenance/config/ConfigProvider.kt b/velocity/src/main/kotlin/de/astride/maintenance/config/ConfigProvider.kt index 8606b3e..9bb1c59 100644 --- a/velocity/src/main/kotlin/de/astride/maintenance/config/ConfigProvider.kt +++ b/velocity/src/main/kotlin/de/astride/maintenance/config/ConfigProvider.kt @@ -40,7 +40,9 @@ class ConfigProvider(var directory: File) { /* Values */ val versionName: String by lazy { config["VerisonName"]?.asString ?: "CosmicProxy" } val description: Component by lazy { - ComponentSerializers.LEGACY.deserialize(config["Description"]?.asString ?: "§cCosmicSky.net | Maintenance") + ComponentSerializers.LEGACY.deserialize( + config["Description"]?.asString?.replace("\\n", "\n") ?: "§cCosmicSky.net | Maintenance" + ) } } diff --git a/velocity/src/test/resources/config.json b/velocity/src/test/resources/config.json index 3685e01..6b5b282 100644 --- a/velocity/src/test/resources/config.json +++ b/velocity/src/test/resources/config.json @@ -2,5 +2,5 @@ "IsActive": true, "MotdFileName": "motd.json", "ByPassPermission": "maintenance.bypass", - "KickMessage": "&aWir sind aktiv am verbessern des Servers\n&aDein &fCosmicSky.net &aTeam" + "KickMessage": "§aWir sind aktiv am verbessern des Servers,\n§adein §fCosmicSky.net §aTeam\n\n§aMehr Infos auf §fdiscord.comsicsky.net" } \ No newline at end of file diff --git a/velocity/src/test/resources/motd.json b/velocity/src/test/resources/motd.json index 64cd2fc..9d9a4ad 100644 --- a/velocity/src/test/resources/motd.json +++ b/velocity/src/test/resources/motd.json @@ -1,4 +1,4 @@ { "VerisonName": "CosmicProxy", - "Description": "&aWir sind aktiv am verbessern des Servers\n&aDein &fCosmicSky.net &aTeam" + "Description": "§aWir sind aktiv am verbessern des Servers,\n§adein §fCosmicSky.net §aTeam" } \ No newline at end of file From 8fdff5792f8551768162f668adf9751450ade8b7 Mon Sep 17 00:00:00 2001 From: LartyHD Date: Sat, 2 Mar 2019 11:03:25 +0100 Subject: [PATCH 4/4] Add a 'very good' Web ACP :D --- .../{Maintenance.kt => MaintenancePlugin.kt} | 39 +---- .../kotlin/de/astride/maintenance/Registry.kt | 67 +++++++ .../maintenance/config/ConfigProvider.kt | 17 +- .../maintenance/webinterface/WebInjector.kt | 165 ++++++++++++++++++ velocity/src/main/resources/acp.html | 101 +++++++++++ .../src/main/resources/velocity-plugin.json | 2 +- .../src/test/resources/web-interface.json | 4 + 7 files changed, 362 insertions(+), 33 deletions(-) rename velocity/src/main/kotlin/de/astride/maintenance/{Maintenance.kt => MaintenancePlugin.kt} (54%) create mode 100644 velocity/src/main/kotlin/de/astride/maintenance/Registry.kt create mode 100644 velocity/src/main/kotlin/de/astride/maintenance/webinterface/WebInjector.kt create mode 100644 velocity/src/main/resources/acp.html create mode 100644 velocity/src/test/resources/web-interface.json diff --git a/velocity/src/main/kotlin/de/astride/maintenance/Maintenance.kt b/velocity/src/main/kotlin/de/astride/maintenance/MaintenancePlugin.kt similarity index 54% rename from velocity/src/main/kotlin/de/astride/maintenance/Maintenance.kt rename to velocity/src/main/kotlin/de/astride/maintenance/MaintenancePlugin.kt index e322d23..a2dbba3 100644 --- a/velocity/src/main/kotlin/de/astride/maintenance/Maintenance.kt +++ b/velocity/src/main/kotlin/de/astride/maintenance/MaintenancePlugin.kt @@ -11,63 +11,42 @@ import com.velocitypowered.api.event.proxy.ProxyInitializeEvent import com.velocitypowered.api.event.proxy.ProxyReloadEvent import com.velocitypowered.api.plugin.Plugin import com.velocitypowered.api.plugin.annotation.DataDirectory -import de.astride.maintenance.config.ConfigProvider -import de.astride.maintenance.listener.Listener import org.slf4j.Logger import java.nio.file.Path /** * @author Lars Artmann | LartyHD * Created by Lars Artmann | LartyHD on 13.02.2019 09:52. - * Current Version: 1.0 (13.02.2019 - 15.02.2019) + * Current Version: 1.0 (13.02.2019 - 02.03.2019) */ @Suppress("UNUSED_PARAMETER") @Plugin( - id = "maintenance", - name = "Maintenance", + id = "registry", + name = "Registry", version = "@version@", url = "Astride.de", authors = ["Lars Artmann | LartyHD"] ) -class Maintenance @Inject private constructor( +class MaintenancePlugin @Inject constructor( private val eventManager: EventManager, - @DataDirectory private val path: Path, + @DataDirectory val path: Path, private val logger: Logger ) { - companion object { - private lateinit var provider: ConfigProvider - } - - private lateinit var listener: Listener + private lateinit var registry: Registry @Subscribe fun on(event: ProxyInitializeEvent) { - register() + registry = Registry(this, eventManager, path.toFile(), logger) + registry.register() logger.info("Maintenance loaded") //proxyServer.allServers.first().serverInfo.address.address.isReachable(10) } @Subscribe fun on(event: ProxyReloadEvent) { - register() + registry.register() logger.info("Maintenance reloaded") } - private fun register() { - registerConfig() - if (provider.config.isActive) registerListener() //registerConfig() must be called before - } - - private fun registerConfig() { - provider = ConfigProvider(path.toFile()) - } - - private fun registerListener() { - if (::listener.isInitialized) eventManager.unregisterListener(this, listener) - listener = Listener(provider) - eventManager.register(this, listener) - } - - } \ No newline at end of file diff --git a/velocity/src/main/kotlin/de/astride/maintenance/Registry.kt b/velocity/src/main/kotlin/de/astride/maintenance/Registry.kt new file mode 100644 index 0000000..80272c9 --- /dev/null +++ b/velocity/src/main/kotlin/de/astride/maintenance/Registry.kt @@ -0,0 +1,67 @@ +/* + * © Copyright - Lars Artmann aka. LartyHD 2019. + */ + +package de.astride.maintenance + +import com.velocitypowered.api.event.EventManager +import de.astride.maintenance.config.ConfigProvider +import de.astride.maintenance.listener.Listener +import de.astride.maintenance.webinterface.WebInjector +import org.slf4j.Logger +import java.io.File + +/** + * @author Lars Artmann | LartyHD + * Created by Lars Artmann | LartyHD on 02.03.2019 09:02. + * Current Version: 1.0 (02.03.2019 - 02.03.2019) + */ +@Suppress("UNUSED_PARAMETER") +class Registry( + private val plugin: Any, + private val eventManager: EventManager, + private val file: File, + private val logger: Logger +) { + + companion object { + var isActive: Boolean = false + lateinit var provider: ConfigProvider + } + + private lateinit var listener: Listener + private lateinit var webInjector: WebInjector + + fun register(boolean: Boolean = true) { + registerConfigProvider(boolean) + if (provider.webInterface.isActive && boolean) registerWebInjector() + updateListener() + } + + private fun registerConfigProvider(boolean: Boolean = true) { + provider = ConfigProvider(file) + if (boolean) isActive = provider.config.isActive + } + + private fun updateListener() { + if (::listener.isInitialized) eventManager.unregisterListener(plugin, listener) + if (isActive) registerListener() + } + + private fun registerListener() { + listener = Listener(provider) + eventManager.register(plugin, listener) + } + + private fun registerWebInjector() { + logger.info("register WebInjector") + if (::webInjector.isInitialized) return//webInjector.stop() + webInjector = WebInjector(this) + webInjector.start() + logger.info(webInjector.server.toString()) + logger.info(webInjector.server.address.toString()) + logger.info("registered WebInjector") + } + + +} \ No newline at end of file diff --git a/velocity/src/main/kotlin/de/astride/maintenance/config/ConfigProvider.kt b/velocity/src/main/kotlin/de/astride/maintenance/config/ConfigProvider.kt index 9bb1c59..6ede647 100644 --- a/velocity/src/main/kotlin/de/astride/maintenance/config/ConfigProvider.kt +++ b/velocity/src/main/kotlin/de/astride/maintenance/config/ConfigProvider.kt @@ -16,6 +16,7 @@ class ConfigProvider(var directory: File) { /* SubClass */ val config by lazy { Config() } val motd by lazy { Motd() } + val webInterface by lazy { WebInterface() } inner class Config internal constructor() { @@ -25,9 +26,10 @@ class ConfigProvider(var directory: File) { /* Values */ val isActive by lazy { config["IsActive"]?.asBoolean ?: false } val motdFileName by lazy { config["MotdFileName"]?.asString ?: "motd.json" } + val webInterfaceFileName by lazy { config["WebInterfaceFileName"]?.asString ?: "web-interface.json" } val byPassPermission by lazy { config["ByPassPermission"]?.asString ?: "maintenance.bypass" } val kickMessage: Component by lazy { - ComponentSerializers.LEGACY.deserialize(config["KickMessage"]?.asString ?: "§cCosmicSky.net | Maintenance") + ComponentSerializers.LEGACY.deserialize(config["KickMessage"]?.asString ?: "§cCosmicSky.net | Registry") } } @@ -41,10 +43,21 @@ class ConfigProvider(var directory: File) { val versionName: String by lazy { config["VerisonName"]?.asString ?: "CosmicProxy" } val description: Component by lazy { ComponentSerializers.LEGACY.deserialize( - config["Description"]?.asString?.replace("\\n", "\n") ?: "§cCosmicSky.net | Maintenance" + config["Description"]?.asString?.replace("\\n", "\n") ?: "§cCosmicSky.net | Registry" ) } } + inner class WebInterface internal constructor() { + + /* Main */ + private val configData by lazy { ConfigData(directory, this@ConfigProvider.config.webInterfaceFileName) } + private val config by lazy { GsonService.loadAsJsonObject(configData) } + /* Values */ + val isActive by lazy { config["IsActive"]?.asBoolean ?: false } + val port by lazy { config["Port"]?.asInt ?: 4543 } + + } + } \ No newline at end of file diff --git a/velocity/src/main/kotlin/de/astride/maintenance/webinterface/WebInjector.kt b/velocity/src/main/kotlin/de/astride/maintenance/webinterface/WebInjector.kt new file mode 100644 index 0000000..dd75df4 --- /dev/null +++ b/velocity/src/main/kotlin/de/astride/maintenance/webinterface/WebInjector.kt @@ -0,0 +1,165 @@ +/* + * © Copyright - Lars Artmann aka. LartyHD 2019. + */ + +package de.astride.maintenance.webinterface + +import com.sun.net.httpserver.HttpExchange +import com.sun.net.httpserver.HttpServer +import de.astride.maintenance.Registry +import java.net.InetSocketAddress + + +/** + * @author Lars Artmann | LartyHD + * Created by Lars Artmann | LartyHD on 02.03.2019 07:39. + * Current Version: 1.0 (02.03.2019 - 02.03.2019) + */ +class WebInjector(private val registry: Registry) { + + val server = HttpServer.create(InetSocketAddress(Registry.provider.webInterface.port), 0) + + fun start() { + + server.createContext("/status") { exchange -> + val input = Registry.isActive.toString() + exchange.sendResponseHeaders(200, input.length.toLong()) + exchange.send(input.toByteArray()) + } + + server.createContext("/") { exchange -> + try { +// val resourceAsStream = ClassLoader::class.java.getResourceAsStream("acp.html") + val input = """ + + + + + + + + + + + + + + Maintenance | ACP + + + + + + +
+ +
+ + +
+
+
+
+
+
+
+
+
+ +
+ + + + + + + +""".toByteArray() + + + exchange.sendResponseHeaders(200, input.size.toLong()) + exchange.send(input) + } catch (ex: Throwable) { + ex.printStackTrace() + } + } + server.createContext("/toggle") { exchange -> + Registry.isActive = !Registry.isActive + registry.register(false) + + val input = Registry.isActive.toString() + exchange.sendResponseHeaders(200, input.length.toLong()) + exchange.send(input.toByteArray()) + } + server.executor = null // creates a default executor + server.start() + + } + + private fun HttpExchange.send(bytes: ByteArray) = responseBody.run { + write(bytes) + close() + } + + fun stop() = server.stop(10) + +} + diff --git a/velocity/src/main/resources/acp.html b/velocity/src/main/resources/acp.html new file mode 100644 index 0000000..6744114 --- /dev/null +++ b/velocity/src/main/resources/acp.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + Maintenance | ACP + + + + + + +
+ +
+ + +
+
+
+
+
+
+
+
+
+ +
+ + + + + + \ No newline at end of file diff --git a/velocity/src/main/resources/velocity-plugin.json b/velocity/src/main/resources/velocity-plugin.json index e1aa72a..fd8cce0 100644 --- a/velocity/src/main/resources/velocity-plugin.json +++ b/velocity/src/main/resources/velocity-plugin.json @@ -9,5 +9,5 @@ ], "dependencies": [ ], - "main": "de.astride.maintenance.Maintenance" + "main": "de.astride.maintenance.MaintenancePlugin" } \ No newline at end of file diff --git a/velocity/src/test/resources/web-interface.json b/velocity/src/test/resources/web-interface.json new file mode 100644 index 0000000..589df46 --- /dev/null +++ b/velocity/src/test/resources/web-interface.json @@ -0,0 +1,4 @@ +{ + "IsActive": true, + "Port": 4543 +} \ No newline at end of file