diff --git a/build.gradle.kts b/build.gradle.kts index bf87be4..d46a783 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -37,7 +37,7 @@ compileKotlin.kotlinOptions.jvmTarget = "11" val gitVersion: groovy.lang.Closure by extra group = "com.github.creeper123123321.viaaas" -version = "0.4.9+" + try { +version = "0.4.10+" + try { gitVersion() } catch (e: Exception) { "unknown" @@ -138,9 +138,7 @@ class HtmlMinifyFilter(reader: java.io.Reader) : java.io.FilterReader("".reader( tasks.named("processResources") { filesMatching("viaaas_info.json") { filter( - "tokens" to mapOf( - "version" to project.property("version") - ) + "tokens" to mapOf("version" to project.version) ) } filesMatching("**/*.js") { diff --git a/src/main/java/com/viaversion/aas/command/VersionCommand.java b/src/main/java/com/viaversion/aas/command/VersionCommand.java new file mode 100644 index 0000000..e924a92 --- /dev/null +++ b/src/main/java/com/viaversion/aas/command/VersionCommand.java @@ -0,0 +1,27 @@ +package com.viaversion.aas.command; + +import com.viaversion.viaversion.api.command.ViaCommandSender; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public enum VersionCommand implements Command { + INSTANCE; + + @NotNull + @Override + public String getInfo() { + return "Alias of 'viaver viaaas'"; + } + + @NotNull + @Override + public List suggest(@NotNull ViaCommandSender sender, @NotNull String alias, @NotNull List args) { + return List.of(); + } + + @Override + public void execute(@NotNull ViaCommandSender sender, @NotNull String alias, @NotNull List args) { + ViaAspirinCommand.INSTANCE.execute(sender, alias, List.of("viaaas")); + } +} diff --git a/src/main/kotlin/com/viaversion/aas/AspirinServer.kt b/src/main/kotlin/com/viaversion/aas/AspirinServer.kt index 2b7807c..127ca86 100644 --- a/src/main/kotlin/com/viaversion/aas/AspirinServer.kt +++ b/src/main/kotlin/com/viaversion/aas/AspirinServer.kt @@ -1,5 +1,6 @@ package com.viaversion.aas +import com.google.gson.JsonObject import com.google.gson.JsonParser import com.velocitypowered.natives.util.Natives import com.viaversion.aas.config.VIAaaSConfig @@ -10,10 +11,12 @@ import com.viaversion.aas.web.WebDashboardServer import com.viaversion.viaversion.ViaManagerImpl import com.viaversion.viaversion.api.Via import com.viaversion.viaversion.api.protocol.packet.State +import com.viaversion.viaversion.update.Version import io.ktor.client.* import io.ktor.client.engine.java.* import io.ktor.client.features.* import io.ktor.client.features.json.* +import io.ktor.client.request.* import io.ktor.network.tls.certificates.* import io.ktor.server.engine.* import io.ktor.server.netty.* @@ -36,6 +39,7 @@ object AspirinServer { .reader(Charsets.UTF_8) .readText() ).asJsonObject.get("version").asString + val cleanedVer get() = version.substringBefore("+") var viaWebServer = WebDashboardServer() private var serverFinishing = CompletableFuture() private var finishedFuture = CompletableFuture() @@ -56,7 +60,7 @@ object AspirinServer { .build() val httpClient = HttpClient(Java) { install(UserAgent) { - agent = "VIAaaS/${version.substringBefore("+")}" + agent = "VIAaaS/$cleanedVer" } install(JsonFeature) { serializer = GsonSerializer() @@ -91,7 +95,7 @@ object AspirinServer { fun stopSignal() = serverFinishing.complete(Unit) fun mainFinishSignal() = finishedFuture.complete(Unit) - fun mainStartSigal() = initFuture.complete(Unit) + fun mainStartSignal() = initFuture.complete(Unit) fun listenPorts(args: Array) { chFuture = ServerBootstrap() @@ -126,4 +130,20 @@ object AspirinServer { fun currentPlayers(): Int { return Via.getManager().connectionManager.connections.filter { it.protocolInfo.state == State.PLAY }.count() } + + suspend fun updaterCheckMessage(): String { + return try { + val latestData = + httpClient.get("https://api.github.com/repos/viaversion/viaaas/releases/latest") + val latest = Version(latestData.get("tag_name")!!.asString.removePrefix("v")) + val current = Version(cleanedVer) + when { + latest > current -> "This build is outdated." + latest < current -> "This build is newer than released." + else -> "VIAaaS seems up to date." + } + } catch (e: Exception) { + "Failed to fetch latest release info. $e" + } + } } \ No newline at end of file diff --git a/src/main/kotlin/com/viaversion/aas/VIAaaS.kt b/src/main/kotlin/com/viaversion/aas/VIAaaS.kt index 85328f6..799a6fd 100644 --- a/src/main/kotlin/com/viaversion/aas/VIAaaS.kt +++ b/src/main/kotlin/com/viaversion/aas/VIAaaS.kt @@ -11,6 +11,9 @@ import com.viaversion.viaversion.api.data.MappingDataLoader import com.viaversion.viaversion.api.protocol.version.ProtocolVersion import de.gerrygames.viarewind.api.ViaRewindConfigImpl import io.ktor.application.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import org.apache.logging.log4j.Level import org.apache.logging.log4j.io.IoBuilder import java.io.File @@ -20,11 +23,12 @@ fun main(args: Array) { try { setupSystem() printSplash() + CoroutineScope(Dispatchers.IO).launch { viaaasLogger.info(AspirinServer.updaterCheckMessage()) } AspirinServer.generateCert() initVia() AspirinServer.listenPorts(args) - AspirinServer.mainStartSigal() + AspirinServer.mainStartSignal() AspirinServer.addShutdownHook() Thread { VIAaaSConsole.start() }.start() @@ -61,7 +65,6 @@ private fun printSplash() { ) } - private fun initVia() { Via.init( ViaManagerImpl.builder() diff --git a/src/main/kotlin/com/viaversion/aas/command/VIAaaSConsole.kt b/src/main/kotlin/com/viaversion/aas/command/VIAaaSConsole.kt index 8c24ec5..1695c18 100644 --- a/src/main/kotlin/com/viaversion/aas/command/VIAaaSConsole.kt +++ b/src/main/kotlin/com/viaversion/aas/command/VIAaaSConsole.kt @@ -26,6 +26,8 @@ object VIAaaSConsole : SimpleTerminalConsole(), ViaCommandSender { commands["end"] = EndCommand commands["reload"] = ReloadCommand commands["list"] = ListCommand + commands["ver"] = VersionCommand.INSTANCE + commands["version"] = VersionCommand.INSTANCE } override fun buildReader(builder: LineReaderBuilder): LineReader { diff --git a/src/main/kotlin/com/viaversion/aas/command/sub/VIAaaSSubCommand.kt b/src/main/kotlin/com/viaversion/aas/command/sub/VIAaaSSubCommand.kt index 59ad2f6..67cf6b4 100644 --- a/src/main/kotlin/com/viaversion/aas/command/sub/VIAaaSSubCommand.kt +++ b/src/main/kotlin/com/viaversion/aas/command/sub/VIAaaSSubCommand.kt @@ -3,12 +3,16 @@ package com.viaversion.aas.command.sub import com.viaversion.aas.AspirinServer import com.viaversion.viaversion.api.command.ViaCommandSender import com.viaversion.viaversion.api.command.ViaSubCommand +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch object VIAaaSSubCommand : ViaSubCommand() { override fun name(): String = "viaaas" override fun description(): String = "Info about VIAaaS" override fun execute(p0: ViaCommandSender, p1: Array): Boolean { p0.sendMessage("VIAaaS version ${AspirinServer.version}") + CoroutineScope(Dispatchers.IO).launch { p0.sendMessage(AspirinServer.updaterCheckMessage()) } return true } } \ No newline at end of file diff --git a/src/main/kotlin/com/viaversion/aas/web/WebLogin.kt b/src/main/kotlin/com/viaversion/aas/web/WebLogin.kt index 5d08c1c..d234c0b 100644 --- a/src/main/kotlin/com/viaversion/aas/web/WebLogin.kt +++ b/src/main/kotlin/com/viaversion/aas/web/WebLogin.kt @@ -25,8 +25,8 @@ class WebLogin : WebState { when (obj.getAsJsonPrimitive("action").asString) { "offline_login" -> { if (!sha512Hex(msg.toByteArray(Charsets.UTF_8)).startsWith("00000")) throw StacklessException("PoW failed") - if ((obj.getAsJsonPrimitive("date").asLong - System.currentTimeMillis()).absoluteValue - > Duration.ofMinutes(2).toMillis() + if ((obj.getAsJsonPrimitive("date").asLong - System.currentTimeMillis()) + .absoluteValue > Duration.ofSeconds(20).toMillis() ) { throw StacklessException("Invalid PoW date") } diff --git a/src/main/resources/web/js/page.js b/src/main/resources/web/js/page.js index 73f5ba8..3f25d93 100644 --- a/src/main/resources/web/js/page.js +++ b/src/main/resources/web/js/page.js @@ -195,6 +195,13 @@ function resetHtml() { function ohNo() { try { + icanhazepoch().then(sec => { + if (Math.abs(Date.now() / 1000 - sec) > 15) { + addToast("Time isn't synchronized", "Please synchronize your computer time to NTP servers"); + } else { + console.log("time seems synchronized"); + } + }) new Date().getDay() == 3 && console.log("it's snapshot day 🐸 my dudes"); new Date().getDate() == 1 && new Date().getMonth() == 3 && addToast("WARNING", "Your ViaVersion has expired, please renew it at https://viaversion.com/ for $99"); } catch (e) { console.log(e); } } diff --git a/src/main/resources/web/js/util.js b/src/main/resources/web/js/util.js index 0718f25..873b8c3 100644 --- a/src/main/resources/web/js/util.js +++ b/src/main/resources/web/js/util.js @@ -15,3 +15,10 @@ function icanhazip(cors) { .then(r => r.text()) .then(it => it.trim()); } + +function icanhazepoch() { + return fetch("https://icanhazepoch.com") + .then(checkFetchSuccess("code")) + .then(r => r.text()) + .then(it => parseInt(it.trim())) +} \ No newline at end of file