mirror of
https://github.com/ViaVersion/VIAaaS.git
synced 2025-01-24 22:01:49 +01:00
don't use LoggerWrapper, separate some code
This commit is contained in:
parent
330364750a
commit
76fdf2a8a7
@ -75,13 +75,14 @@ dependencies {
|
|||||||
implementation("org.yaml:snakeyaml:1.29")
|
implementation("org.yaml:snakeyaml:1.29")
|
||||||
|
|
||||||
val log4jVer = "2.14.1"
|
val log4jVer = "2.14.1"
|
||||||
|
val slf4jVer = "1.7.31"
|
||||||
implementation("net.minecrell:terminalconsoleappender:1.2.0")
|
implementation("net.minecrell:terminalconsoleappender:1.2.0")
|
||||||
implementation("org.apache.logging.log4j:log4j-core:$log4jVer")
|
implementation("org.apache.logging.log4j:log4j-core:$log4jVer")
|
||||||
implementation("org.apache.logging.log4j:log4j-iostreams:$log4jVer")
|
implementation("org.apache.logging.log4j:log4j-iostreams:$log4jVer")
|
||||||
implementation("org.apache.logging.log4j:log4j-slf4j-impl:$log4jVer")
|
|
||||||
implementation("org.apache.logging.log4j:log4j-jul:$log4jVer")
|
implementation("org.apache.logging.log4j:log4j-jul:$log4jVer")
|
||||||
|
implementation("org.apache.logging.log4j:log4j-slf4j-impl:$log4jVer")
|
||||||
implementation("org.jline:jline-terminal-jansi:3.20.0")
|
implementation("org.jline:jline-terminal-jansi:3.20.0")
|
||||||
implementation("org.slf4j:slf4j-api:1.7.30")
|
implementation("org.slf4j:slf4j-api:$slf4jVer")
|
||||||
|
|
||||||
val ktorVersion = "1.6.0"
|
val ktorVersion = "1.6.0"
|
||||||
implementation("io.ktor:ktor-network-tls-certificates:$ktorVersion")
|
implementation("io.ktor:ktor-network-tls-certificates:$ktorVersion")
|
||||||
|
123
src/main/kotlin/com/viaversion/aas/AspirinServer.kt
Normal file
123
src/main/kotlin/com/viaversion/aas/AspirinServer.kt
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
package com.viaversion.aas
|
||||||
|
|
||||||
|
import com.google.gson.JsonParser
|
||||||
|
import com.velocitypowered.natives.util.Natives
|
||||||
|
import com.viaversion.aas.config.VIAaaSConfig
|
||||||
|
import com.viaversion.aas.handler.FrontEndInit
|
||||||
|
import com.viaversion.aas.handler.MinecraftHandler
|
||||||
|
import com.viaversion.aas.platform.AspirinPlatform
|
||||||
|
import com.viaversion.aas.web.WebDashboardServer
|
||||||
|
import com.viaversion.viaversion.ViaManagerImpl
|
||||||
|
import com.viaversion.viaversion.api.Via
|
||||||
|
import io.ktor.client.*
|
||||||
|
import io.ktor.client.engine.java.*
|
||||||
|
import io.ktor.client.features.*
|
||||||
|
import io.ktor.client.features.json.*
|
||||||
|
import io.ktor.network.tls.certificates.*
|
||||||
|
import io.ktor.server.engine.*
|
||||||
|
import io.ktor.server.netty.*
|
||||||
|
import io.netty.bootstrap.ServerBootstrap
|
||||||
|
import io.netty.channel.ChannelFuture
|
||||||
|
import io.netty.channel.ChannelOption
|
||||||
|
import io.netty.channel.WriteBufferWaterMark
|
||||||
|
import io.netty.resolver.dns.DnsNameResolverBuilder
|
||||||
|
import io.netty.util.concurrent.Future
|
||||||
|
import java.io.File
|
||||||
|
import java.net.InetAddress
|
||||||
|
import java.security.KeyPairGenerator
|
||||||
|
import java.util.concurrent.CompletableFuture
|
||||||
|
|
||||||
|
object AspirinServer {
|
||||||
|
var ktorServer: NettyApplicationEngine? = null
|
||||||
|
val version = JsonParser.parseString(
|
||||||
|
AspirinPlatform::class.java.classLoader
|
||||||
|
.getResourceAsStream("viaaas_info.json")!!
|
||||||
|
.reader(Charsets.UTF_8)
|
||||||
|
.readText()
|
||||||
|
).asJsonObject.get("version").asString
|
||||||
|
var viaWebServer = WebDashboardServer()
|
||||||
|
private var serverFinishing = CompletableFuture<Unit>()
|
||||||
|
private var finishedFuture = CompletableFuture<Unit>()
|
||||||
|
private val initFuture = CompletableFuture<Unit>()
|
||||||
|
val bufferWaterMark = WriteBufferWaterMark(512 * 1024, 2048 * 1024)
|
||||||
|
|
||||||
|
// Minecraft doesn't have forward secrecy
|
||||||
|
val mcCryptoKey = KeyPairGenerator.getInstance("RSA").let {
|
||||||
|
it.initialize(VIAaaSConfig.mcRsaSize) // https://stackoverflow.com/questions/1904516/is-1024-bit-rsa-secure
|
||||||
|
it.genKeyPair()
|
||||||
|
}
|
||||||
|
val parentLoop = eventLoopGroup()
|
||||||
|
val childLoop = eventLoopGroup()
|
||||||
|
var chFuture: ChannelFuture? = null
|
||||||
|
val dnsResolver = DnsNameResolverBuilder(childLoop.next())
|
||||||
|
.socketChannelFactory(channelSocketFactory(childLoop))
|
||||||
|
.channelFactory(channelDatagramFactory(childLoop))
|
||||||
|
.build()
|
||||||
|
val httpClient = HttpClient(Java) {
|
||||||
|
install(UserAgent) {
|
||||||
|
agent = "VIAaaS/${version.substringBefore("+")}"
|
||||||
|
}
|
||||||
|
install(JsonFeature) {
|
||||||
|
serializer = GsonSerializer()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun finish() {
|
||||||
|
try {
|
||||||
|
Via.getManager().connectionManager.connections.forEach {
|
||||||
|
it.channel?.pipeline()?.get(MinecraftHandler::class.java)?.disconnect("Stopping")
|
||||||
|
}
|
||||||
|
|
||||||
|
(Via.getManager() as ViaManagerImpl).destroy()
|
||||||
|
} finally {
|
||||||
|
mainFinishSignal()
|
||||||
|
ktorServer?.stop(1000, 1000)
|
||||||
|
httpClient.close()
|
||||||
|
listOf<Future<*>?>(
|
||||||
|
chFuture?.channel()?.close(),
|
||||||
|
parentLoop.shutdownGracefully(),
|
||||||
|
childLoop.shutdownGracefully()
|
||||||
|
)
|
||||||
|
.forEach { it?.sync() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun waitStopSignal() = serverFinishing.join()
|
||||||
|
fun waitMainFinish() = finishedFuture.join()
|
||||||
|
fun waitMainStart() = initFuture.join()
|
||||||
|
|
||||||
|
fun wasStopSignalFired() = serverFinishing.isDone
|
||||||
|
|
||||||
|
fun stopSignal() = serverFinishing.complete(Unit)
|
||||||
|
fun mainFinishSignal() = finishedFuture.complete(Unit)
|
||||||
|
fun mainStartSigal() = initFuture.complete(Unit)
|
||||||
|
|
||||||
|
fun listenPorts(args: Array<String>) {
|
||||||
|
chFuture = ServerBootstrap()
|
||||||
|
.group(parentLoop, childLoop)
|
||||||
|
.channelFactory(channelServerSocketFactory(parentLoop))
|
||||||
|
.childHandler(FrontEndInit)
|
||||||
|
.childOption(ChannelOption.WRITE_BUFFER_WATER_MARK, bufferWaterMark)
|
||||||
|
.childOption(ChannelOption.IP_TOS, 0x18)
|
||||||
|
.childOption(ChannelOption.TCP_NODELAY, true)
|
||||||
|
.bind(InetAddress.getByName(VIAaaSConfig.bindAddress), VIAaaSConfig.port)
|
||||||
|
|
||||||
|
viaaasLogger.info("Using compression: ${Natives.compress.loadedVariant}")
|
||||||
|
viaaasLogger.info("Binded minecraft into " + chFuture!!.sync().channel().localAddress())
|
||||||
|
ktorServer = embeddedServer(Netty, commandLineEnvironment(args)) {}.start(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun generateCert() {
|
||||||
|
File("config/https.jks").apply {
|
||||||
|
parentFile.mkdirs()
|
||||||
|
if (!exists()) generateCertificate(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun addShutdownHook() {
|
||||||
|
Runtime.getRuntime().addShutdownHook(Thread {
|
||||||
|
stopSignal()
|
||||||
|
waitMainFinish()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -60,7 +60,7 @@ suspend fun resolveSrv(hostAndPort: HostAndPort): HostAndPort {
|
|||||||
if (hostAndPort.port == 25565) {
|
if (hostAndPort.port == 25565) {
|
||||||
try {
|
try {
|
||||||
// stolen from PacketLib (MIT) https://github.com/Camotoy/PacketLib/blob/312cff5f975be54cf2d92208ae2947dbda8b9f59/src/main/java/com/github/steveice10/packetlib/tcp/TcpClientSession.java
|
// stolen from PacketLib (MIT) https://github.com/Camotoy/PacketLib/blob/312cff5f975be54cf2d92208ae2947dbda8b9f59/src/main/java/com/github/steveice10/packetlib/tcp/TcpClientSession.java
|
||||||
val records = dnsResolver
|
val records = AspirinServer.dnsResolver
|
||||||
.resolveAll(DefaultDnsQuestion("_minecraft._tcp.${hostAndPort.host}", DnsRecordType.SRV))
|
.resolveAll(DefaultDnsQuestion("_minecraft._tcp.${hostAndPort.host}", DnsRecordType.SRV))
|
||||||
.suspendAwait()
|
.suspendAwait()
|
||||||
try {
|
try {
|
||||||
@ -198,7 +198,7 @@ fun ByteBuf.readByteArray(length: Int) = ByteArray(length).also { readBytes(it)
|
|||||||
|
|
||||||
suspend fun hasJoined(username: String, hash: String): JsonObject {
|
suspend fun hasJoined(username: String, hash: String): JsonObject {
|
||||||
return try {
|
return try {
|
||||||
httpClient.get(
|
AspirinServer.httpClient.get(
|
||||||
"https://sessionserver.mojang.com/session/minecraft/hasJoined?username=" +
|
"https://sessionserver.mojang.com/session/minecraft/hasJoined?username=" +
|
||||||
UrlEscapers.urlFormParameterEscaper().escape(username) + "&serverId=$hash"
|
UrlEscapers.urlFormParameterEscaper().escape(username) + "&serverId=$hash"
|
||||||
)
|
)
|
||||||
|
@ -1,107 +1,51 @@
|
|||||||
package com.viaversion.aas
|
package com.viaversion.aas
|
||||||
|
|
||||||
import com.google.gson.JsonParser
|
|
||||||
import com.velocitypowered.natives.util.Natives
|
|
||||||
import com.viaversion.aas.command.VIAaaSConsole
|
import com.viaversion.aas.command.VIAaaSConsole
|
||||||
import com.viaversion.aas.command.ViaAspirinCommand
|
import com.viaversion.aas.command.ViaAspirinCommand
|
||||||
import com.viaversion.aas.config.VIAaaSConfig
|
|
||||||
import com.viaversion.aas.handler.FrontEndInit
|
|
||||||
import com.viaversion.aas.handler.MinecraftHandler
|
|
||||||
import com.viaversion.aas.platform.*
|
import com.viaversion.aas.platform.*
|
||||||
import com.viaversion.aas.protocol.registerAspirinProtocols
|
import com.viaversion.aas.protocol.registerAspirinProtocols
|
||||||
import com.viaversion.aas.web.ViaWebApp
|
import com.viaversion.aas.web.ViaWebApp
|
||||||
import com.viaversion.aas.web.WebDashboardServer
|
|
||||||
import com.viaversion.viaversion.ViaManagerImpl
|
import com.viaversion.viaversion.ViaManagerImpl
|
||||||
import com.viaversion.viaversion.api.Via
|
import com.viaversion.viaversion.api.Via
|
||||||
import com.viaversion.viaversion.api.data.MappingDataLoader
|
import com.viaversion.viaversion.api.data.MappingDataLoader
|
||||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion
|
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion
|
||||||
import de.gerrygames.viarewind.api.ViaRewindConfigImpl
|
import de.gerrygames.viarewind.api.ViaRewindConfigImpl
|
||||||
import io.ktor.application.*
|
import io.ktor.application.*
|
||||||
import io.ktor.client.*
|
|
||||||
import io.ktor.client.engine.java.*
|
|
||||||
import io.ktor.client.features.*
|
|
||||||
import io.ktor.client.features.json.*
|
|
||||||
import io.ktor.network.tls.certificates.*
|
|
||||||
import io.ktor.server.engine.*
|
|
||||||
import io.ktor.server.netty.*
|
|
||||||
import io.netty.bootstrap.ServerBootstrap
|
|
||||||
import io.netty.channel.ChannelFuture
|
|
||||||
import io.netty.channel.ChannelOption
|
|
||||||
import io.netty.channel.WriteBufferWaterMark
|
|
||||||
import io.netty.resolver.dns.DnsNameResolverBuilder
|
|
||||||
import io.netty.util.concurrent.Future
|
|
||||||
import org.apache.logging.log4j.Level
|
import org.apache.logging.log4j.Level
|
||||||
import org.apache.logging.log4j.io.IoBuilder
|
import org.apache.logging.log4j.io.IoBuilder
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.net.InetAddress
|
|
||||||
import java.security.KeyPairGenerator
|
|
||||||
import java.util.concurrent.CompletableFuture
|
|
||||||
|
|
||||||
val viaaasVer = JsonParser.parseString(
|
|
||||||
AspirinPlatform::class.java.classLoader.getResourceAsStream("viaaas_info.json")!!.reader(Charsets.UTF_8).readText()
|
|
||||||
).asJsonObject.get("version").asString
|
|
||||||
var viaWebServer = WebDashboardServer()
|
|
||||||
var serverFinishing = CompletableFuture<Unit>()
|
|
||||||
var finishedFuture = CompletableFuture<Unit>()
|
|
||||||
val httpClient = HttpClient(Java) {
|
|
||||||
install(UserAgent) {
|
|
||||||
agent = "VIAaaS/${viaaasVer.substringBefore("+")}"
|
|
||||||
}
|
|
||||||
install(JsonFeature) {
|
|
||||||
serializer = GsonSerializer()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val initFuture = CompletableFuture<Unit>()
|
|
||||||
val bufferWaterMark = WriteBufferWaterMark(512 * 1024, 2048 * 1024)
|
|
||||||
|
|
||||||
// Minecraft doesn't have forward secrecy
|
|
||||||
val mcCryptoKey = KeyPairGenerator.getInstance("RSA").let {
|
|
||||||
it.initialize(VIAaaSConfig.mcRsaSize) // https://stackoverflow.com/questions/1904516/is-1024-bit-rsa-secure
|
|
||||||
it.genKeyPair()
|
|
||||||
}
|
|
||||||
|
|
||||||
val parentLoop = eventLoopGroup()
|
|
||||||
val childLoop = eventLoopGroup()
|
|
||||||
var chFuture: ChannelFuture? = null
|
|
||||||
var ktorServer: NettyApplicationEngine? = null
|
|
||||||
val dnsResolver = DnsNameResolverBuilder(childLoop.next())
|
|
||||||
.socketChannelFactory(channelSocketFactory(childLoop))
|
|
||||||
.channelFactory(channelDatagramFactory(childLoop))
|
|
||||||
.build()
|
|
||||||
|
|
||||||
fun main(args: Array<String>) {
|
fun main(args: Array<String>) {
|
||||||
try {
|
try {
|
||||||
setupSystem()
|
setupSystem()
|
||||||
printSplash()
|
printSplash()
|
||||||
generateCert()
|
AspirinServer.generateCert()
|
||||||
initVia()
|
initVia()
|
||||||
bindPorts(args)
|
AspirinServer.listenPorts(args)
|
||||||
|
|
||||||
initFuture.complete(Unit)
|
AspirinServer.mainStartSigal()
|
||||||
addShutdownHook()
|
AspirinServer.addShutdownHook()
|
||||||
|
|
||||||
Thread { VIAaaSConsole.start() }.start()
|
Thread { VIAaaSConsole.start() }.start()
|
||||||
|
|
||||||
serverFinishing.join()
|
AspirinServer.waitStopSignal()
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
} finally {
|
} finally {
|
||||||
stopServer()
|
AspirinServer.finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addShutdownHook() {
|
|
||||||
Runtime.getRuntime().addShutdownHook(Thread {
|
|
||||||
serverFinishing.complete(Unit)
|
|
||||||
finishedFuture.join()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun setupSystem() {
|
private fun setupSystem() {
|
||||||
// Stolen from https://github.com/VelocityPowered/Velocity/blob/dev/1.1.0/proxy/src/main/java/com/velocitypowered/proxy/Velocity.java
|
// Stolen from https://github.com/VelocityPowered/Velocity/blob/dev/1.1.0/proxy/src/main/java/com/velocitypowered/proxy/Velocity.java
|
||||||
if (System.getProperty("io.netty.allocator.maxOrder") == null) {
|
if (System.getProperty("io.netty.allocator.maxOrder") == null) {
|
||||||
System.setProperty("io.netty.allocator.maxOrder", "9")
|
System.setProperty("io.netty.allocator.maxOrder", "9")
|
||||||
}
|
}
|
||||||
|
// https://logging.apache.org/log4j/2.x/log4j-jul/index.html
|
||||||
|
if (System.getProperty("java.util.logging.manager") == null) {
|
||||||
|
System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager")
|
||||||
|
}
|
||||||
// Also stolen from Velocity
|
// Also stolen from Velocity
|
||||||
System.setOut(IoBuilder.forLogger("STDOUT").setLevel(Level.INFO).buildPrintStream())
|
System.setOut(IoBuilder.forLogger("STDOUT").setLevel(Level.INFO).buildPrintStream())
|
||||||
System.setErr(IoBuilder.forLogger("STDERR").setLevel(Level.ERROR).buildPrintStream())
|
System.setErr(IoBuilder.forLogger("STDERR").setLevel(Level.ERROR).buildPrintStream())
|
||||||
@ -111,18 +55,12 @@ private fun printSplash() {
|
|||||||
println(
|
println(
|
||||||
"""\\ // // //\\ => //|| //|| /=====/ PROXY
|
"""\\ // // //\\ => //|| //|| /=====/ PROXY
|
||||||
| \\ // // // \\ // || // || //
|
| \\ // // // \\ // || // || //
|
||||||
| \\ // // //====\\ //==|| //==|| \====\ $viaaasVer
|
| \\ // // //====\\ //==|| //==|| \====\ ${AspirinServer.version}
|
||||||
| \\ // // // \\ // || // || //
|
| \\ // // // \\ // || // || //
|
||||||
|<= \\// // // \\ // || // || /====/""".trimMargin()
|
|<= \\// // // \\ // || // || /====/""".trimMargin()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun generateCert() {
|
|
||||||
File("config/https.jks").apply {
|
|
||||||
parentFile.mkdirs()
|
|
||||||
if (!exists()) generateCertificate(this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun initVia() {
|
private fun initVia() {
|
||||||
Via.init(
|
Via.init(
|
||||||
@ -141,41 +79,6 @@ private fun initVia() {
|
|||||||
registerAspirinProtocols()
|
registerAspirinProtocols()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun bindPorts(args: Array<String>) {
|
|
||||||
chFuture = ServerBootstrap()
|
|
||||||
.group(parentLoop, childLoop)
|
|
||||||
.channelFactory(channelServerSocketFactory(parentLoop))
|
|
||||||
.childHandler(FrontEndInit)
|
|
||||||
.childOption(ChannelOption.WRITE_BUFFER_WATER_MARK, bufferWaterMark)
|
|
||||||
.childOption(ChannelOption.IP_TOS, 0x18)
|
|
||||||
.childOption(ChannelOption.TCP_NODELAY, true)
|
|
||||||
.bind(InetAddress.getByName(VIAaaSConfig.bindAddress), VIAaaSConfig.port)
|
|
||||||
|
|
||||||
viaaasLogger.info("Using compression: ${Natives.compress.loadedVariant}")
|
|
||||||
viaaasLogger.info("Binded minecraft into " + chFuture!!.sync().channel().localAddress())
|
|
||||||
ktorServer = embeddedServer(Netty, commandLineEnvironment(args)) {}.start(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun stopServer() {
|
|
||||||
try {
|
|
||||||
Via.getManager().connectionManager.connections.forEach {
|
|
||||||
it.channel?.pipeline()?.get(MinecraftHandler::class.java)?.disconnect("Stopping")
|
|
||||||
}
|
|
||||||
|
|
||||||
(Via.getManager() as ViaManagerImpl).destroy()
|
|
||||||
} finally {
|
|
||||||
finishedFuture.complete(Unit)
|
|
||||||
ktorServer?.stop(1000, 1000)
|
|
||||||
httpClient.close()
|
|
||||||
listOf<Future<*>?>(
|
|
||||||
chFuture?.channel()?.close(),
|
|
||||||
parentLoop.shutdownGracefully(),
|
|
||||||
childLoop.shutdownGracefully()
|
|
||||||
)
|
|
||||||
.forEach { it?.sync() }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Application.mainWeb() {
|
fun Application.mainWeb() {
|
||||||
ViaWebApp().apply { main() }
|
ViaWebApp(AspirinServer.viaWebServer).apply { main() }
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package com.viaversion.aas.command
|
package com.viaversion.aas.command
|
||||||
|
|
||||||
|
import com.viaversion.aas.AspirinServer
|
||||||
import com.viaversion.aas.command.sub.StopSubCommand
|
import com.viaversion.aas.command.sub.StopSubCommand
|
||||||
import com.viaversion.aas.serverFinishing
|
|
||||||
import com.viaversion.viaversion.api.command.ViaCommandSender
|
import com.viaversion.viaversion.api.command.ViaCommandSender
|
||||||
import net.minecrell.terminalconsole.SimpleTerminalConsole
|
import net.minecrell.terminalconsole.SimpleTerminalConsole
|
||||||
import org.jline.reader.Candidate
|
import org.jline.reader.Candidate
|
||||||
@ -12,7 +12,7 @@ import java.util.*
|
|||||||
|
|
||||||
object VIAaaSConsole : SimpleTerminalConsole(), ViaCommandSender {
|
object VIAaaSConsole : SimpleTerminalConsole(), ViaCommandSender {
|
||||||
val commands = hashMapOf<String, Command>()
|
val commands = hashMapOf<String, Command>()
|
||||||
override fun isRunning(): Boolean = !serverFinishing.isDone
|
override fun isRunning(): Boolean = !AspirinServer.wasStopSignalFired()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
commands["viaversion"] = ViaAspirinCommand
|
commands["viaversion"] = ViaAspirinCommand
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package com.viaversion.aas.command.sub
|
package com.viaversion.aas.command.sub
|
||||||
|
|
||||||
import com.viaversion.aas.serverFinishing
|
import com.viaversion.aas.AspirinServer
|
||||||
import com.viaversion.viaversion.api.command.ViaCommandSender
|
import com.viaversion.viaversion.api.command.ViaCommandSender
|
||||||
import com.viaversion.viaversion.api.command.ViaSubCommand
|
import com.viaversion.viaversion.api.command.ViaSubCommand
|
||||||
|
|
||||||
@ -9,7 +9,7 @@ object StopSubCommand : ViaSubCommand() {
|
|||||||
override fun description(): String = "Stops VIAaaS"
|
override fun description(): String = "Stops VIAaaS"
|
||||||
override fun execute(sender: ViaCommandSender, p1: Array<String>): Boolean {
|
override fun execute(sender: ViaCommandSender, p1: Array<String>): Boolean {
|
||||||
sender.sendMessage("Shutting down...")
|
sender.sendMessage("Shutting down...")
|
||||||
serverFinishing.complete(Unit)
|
AspirinServer.stopSignal()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,6 +1,6 @@
|
|||||||
package com.viaversion.aas.command.sub
|
package com.viaversion.aas.command.sub
|
||||||
|
|
||||||
import com.viaversion.aas.viaaasVer
|
import com.viaversion.aas.AspirinServer
|
||||||
import com.viaversion.viaversion.api.command.ViaCommandSender
|
import com.viaversion.viaversion.api.command.ViaCommandSender
|
||||||
import com.viaversion.viaversion.api.command.ViaSubCommand
|
import com.viaversion.viaversion.api.command.ViaSubCommand
|
||||||
|
|
||||||
@ -8,7 +8,7 @@ object VIAaaSSubCommand : ViaSubCommand() {
|
|||||||
override fun name(): String = "viaaas"
|
override fun name(): String = "viaaas"
|
||||||
override fun description(): String = "Info about VIAaaS"
|
override fun description(): String = "Info about VIAaaS"
|
||||||
override fun execute(p0: ViaCommandSender, p1: Array<out String>): Boolean {
|
override fun execute(p0: ViaCommandSender, p1: Array<out String>): Boolean {
|
||||||
p0.sendMessage("VIAaaS version $viaaasVer")
|
p0.sendMessage("VIAaaS version ${AspirinServer.version}")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -2,8 +2,8 @@ package com.viaversion.aas.handler.autoprotocol
|
|||||||
|
|
||||||
import com.google.common.cache.CacheBuilder
|
import com.google.common.cache.CacheBuilder
|
||||||
import com.google.common.cache.CacheLoader
|
import com.google.common.cache.CacheLoader
|
||||||
|
import com.viaversion.aas.AspirinServer
|
||||||
import com.viaversion.aas.channelSocketFactory
|
import com.viaversion.aas.channelSocketFactory
|
||||||
import com.viaversion.aas.childLoop
|
|
||||||
import com.viaversion.aas.codec.FrameCodec
|
import com.viaversion.aas.codec.FrameCodec
|
||||||
import com.viaversion.aas.codec.MinecraftCodec
|
import com.viaversion.aas.codec.MinecraftCodec
|
||||||
import com.viaversion.aas.codec.packet.handshake.Handshake
|
import com.viaversion.aas.codec.packet.handshake.Handshake
|
||||||
@ -32,9 +32,9 @@ object ProtocolDetector {
|
|||||||
val future = CompletableFuture<ProtocolVersion>()
|
val future = CompletableFuture<ProtocolVersion>()
|
||||||
try {
|
try {
|
||||||
val ch = Bootstrap()
|
val ch = Bootstrap()
|
||||||
.group(childLoop)
|
.group(AspirinServer.childLoop)
|
||||||
.resolver(NoopAddressResolverGroup.INSTANCE)
|
.resolver(NoopAddressResolverGroup.INSTANCE)
|
||||||
.channelFactory(channelSocketFactory(childLoop))
|
.channelFactory(channelSocketFactory(AspirinServer.childLoop))
|
||||||
.option(ChannelOption.TCP_NODELAY, true)
|
.option(ChannelOption.TCP_NODELAY, true)
|
||||||
.option(ChannelOption.IP_TOS, 0x18)
|
.option(ChannelOption.IP_TOS, 0x18)
|
||||||
.handler(object : ChannelInitializer<Channel>() {
|
.handler(object : ChannelInitializer<Channel>() {
|
||||||
|
@ -11,7 +11,6 @@ import com.viaversion.aas.config.VIAaaSConfig
|
|||||||
import com.viaversion.aas.handler.MinecraftHandler
|
import com.viaversion.aas.handler.MinecraftHandler
|
||||||
import com.viaversion.aas.handler.forward
|
import com.viaversion.aas.handler.forward
|
||||||
import com.viaversion.aas.util.StacklessException
|
import com.viaversion.aas.util.StacklessException
|
||||||
import com.viaversion.viaversion.api.Via
|
|
||||||
import com.viaversion.viaversion.api.protocol.packet.State
|
import com.viaversion.viaversion.api.protocol.packet.State
|
||||||
import io.netty.channel.Channel
|
import io.netty.channel.Channel
|
||||||
import io.netty.channel.ChannelHandlerContext
|
import io.netty.channel.ChannelHandlerContext
|
||||||
@ -83,7 +82,7 @@ class LoginState : MinecraftConnectionState {
|
|||||||
|
|
||||||
val cryptoRequest = CryptoRequest()
|
val cryptoRequest = CryptoRequest()
|
||||||
cryptoRequest.serverId = frontServerId
|
cryptoRequest.serverId = frontServerId
|
||||||
cryptoRequest.publicKey = mcCryptoKey.public
|
cryptoRequest.publicKey = AspirinServer.mcCryptoKey.public
|
||||||
cryptoRequest.token = frontToken
|
cryptoRequest.token = frontToken
|
||||||
|
|
||||||
send(frontChannel, cryptoRequest, true)
|
send(frontChannel, cryptoRequest, true)
|
||||||
@ -108,7 +107,7 @@ class LoginState : MinecraftConnectionState {
|
|||||||
val backHash = generateServerHash(backServerId, backKey, backPublicKey)
|
val backHash = generateServerHash(backServerId, backKey, backPublicKey)
|
||||||
|
|
||||||
mcLogger.info("Session req: ${handler.data.frontHandler.endRemoteAddress} ($playerId $frontName) $backName")
|
mcLogger.info("Session req: ${handler.data.frontHandler.endRemoteAddress} ($playerId $frontName) $backName")
|
||||||
viaWebServer.requestSessionJoin(
|
AspirinServer.viaWebServer.requestSessionJoin(
|
||||||
playerId,
|
playerId,
|
||||||
backName!!,
|
backName!!,
|
||||||
backHash,
|
backHash,
|
||||||
@ -132,8 +131,8 @@ class LoginState : MinecraftConnectionState {
|
|||||||
|
|
||||||
fun handleCryptoResponse(handler: MinecraftHandler, cryptoResponse: CryptoResponse) {
|
fun handleCryptoResponse(handler: MinecraftHandler, cryptoResponse: CryptoResponse) {
|
||||||
val frontHash = let {
|
val frontHash = let {
|
||||||
val frontKey = decryptRsa(mcCryptoKey.private, cryptoResponse.encryptedKey)
|
val frontKey = decryptRsa(AspirinServer.mcCryptoKey.private, cryptoResponse.encryptedKey)
|
||||||
val decryptedToken = decryptRsa(mcCryptoKey.private, cryptoResponse.encryptedToken)
|
val decryptedToken = decryptRsa(AspirinServer.mcCryptoKey.private, cryptoResponse.encryptedToken)
|
||||||
|
|
||||||
if (!decryptedToken.contentEquals(frontToken)) throw StacklessException("Invalid verification token!")
|
if (!decryptedToken.contentEquals(frontToken)) throw StacklessException("Invalid verification token!")
|
||||||
|
|
||||||
@ -141,7 +140,7 @@ class LoginState : MinecraftConnectionState {
|
|||||||
val aesDe = mcCfb8(frontKey, Cipher.DECRYPT_MODE)
|
val aesDe = mcCfb8(frontKey, Cipher.DECRYPT_MODE)
|
||||||
handler.data.frontChannel.pipeline().addBefore("frame", "crypto", CryptoCodec(aesDe, aesEn))
|
handler.data.frontChannel.pipeline().addBefore("frame", "crypto", CryptoCodec(aesDe, aesEn))
|
||||||
|
|
||||||
generateServerHash(frontServerId, frontKey, mcCryptoKey.public)
|
generateServerHash(frontServerId, frontKey, AspirinServer.mcCryptoKey.public)
|
||||||
}
|
}
|
||||||
|
|
||||||
handler.data.frontChannel.setAutoRead(false)
|
handler.data.frontChannel.setAutoRead(false)
|
||||||
|
@ -33,7 +33,7 @@ private suspend fun createBackChannel(
|
|||||||
.handler(BackEndInit(handler.data))
|
.handler(BackEndInit(handler.data))
|
||||||
.channelFactory(channelSocketFactory(loop.parent()))
|
.channelFactory(channelSocketFactory(loop.parent()))
|
||||||
.group(loop)
|
.group(loop)
|
||||||
.option(ChannelOption.WRITE_BUFFER_WATER_MARK, bufferWaterMark)
|
.option(ChannelOption.WRITE_BUFFER_WATER_MARK, AspirinServer.bufferWaterMark)
|
||||||
.option(ChannelOption.IP_TOS, 0x18)
|
.option(ChannelOption.IP_TOS, 0x18)
|
||||||
.option(ChannelOption.TCP_NODELAY, true)
|
.option(ChannelOption.TCP_NODELAY, true)
|
||||||
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10_000) // We need to show the error before the client timeout
|
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10_000) // We need to show the error before the client timeout
|
||||||
@ -116,7 +116,7 @@ private suspend fun resolveBackendAddresses(hostAndPort: HostAndPort): List<Inet
|
|||||||
return when {
|
return when {
|
||||||
removedEndDot.endsWith(".onion", ignoreCase = true) ->
|
removedEndDot.endsWith(".onion", ignoreCase = true) ->
|
||||||
listOf(InetSocketAddress.createUnresolved(removedEndDot, srvResolved.port))
|
listOf(InetSocketAddress.createUnresolved(removedEndDot, srvResolved.port))
|
||||||
else -> dnsResolver
|
else -> AspirinServer.dnsResolver
|
||||||
.resolveAll(srvResolved.host)
|
.resolveAll(srvResolved.host)
|
||||||
.suspendAwait()
|
.suspendAwait()
|
||||||
.groupBy { it is Inet4Address }
|
.groupBy { it is Inet4Address }
|
||||||
|
@ -1,15 +1,11 @@
|
|||||||
package com.viaversion.aas.platform
|
package com.viaversion.aas.platform
|
||||||
|
|
||||||
import com.viaversion.viabackwards.api.ViaBackwardsPlatform
|
import com.viaversion.viabackwards.api.ViaBackwardsPlatform
|
||||||
import com.viaversion.viaversion.sponge.util.LoggerWrapper
|
|
||||||
import org.slf4j.LoggerFactory
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.logging.Logger
|
import java.util.logging.Logger
|
||||||
|
|
||||||
object AspirinBackwards : ViaBackwardsPlatform {
|
object AspirinBackwards : ViaBackwardsPlatform {
|
||||||
val log = LoggerWrapper(LoggerFactory.getLogger("ViaBackwards"))
|
|
||||||
override fun getDataFolder() = File("config/viabackwards")
|
override fun getDataFolder() = File("config/viabackwards")
|
||||||
override fun getLogger(): Logger = log
|
override fun getLogger() = Logger.getLogger("ViaBackwards")
|
||||||
override fun disable() {
|
override fun disable() = Unit
|
||||||
}
|
|
||||||
}
|
}
|
@ -4,15 +4,14 @@ import com.viaversion.aas.provider.AspirinVersionProvider
|
|||||||
import com.viaversion.viaversion.api.Via
|
import com.viaversion.viaversion.api.Via
|
||||||
import com.viaversion.viaversion.api.platform.ViaPlatformLoader
|
import com.viaversion.viaversion.api.platform.ViaPlatformLoader
|
||||||
import com.viaversion.viaversion.api.protocol.version.VersionProvider
|
import com.viaversion.viaversion.api.protocol.version.VersionProvider
|
||||||
import com.viaversion.viaversion.bungee.providers.BungeeMovementTransmitter
|
|
||||||
import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider
|
import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider
|
||||||
|
import com.viaversion.viaversion.velocity.providers.VelocityMovementTransmitter
|
||||||
|
|
||||||
object AspirinLoader : ViaPlatformLoader {
|
object AspirinLoader : ViaPlatformLoader {
|
||||||
override fun unload() {
|
override fun unload() = Unit
|
||||||
}
|
|
||||||
|
|
||||||
override fun load() {
|
override fun load() {
|
||||||
Via.getManager().providers.use(MovementTransmitterProvider::class.java, BungeeMovementTransmitter())
|
Via.getManager().providers.use(MovementTransmitterProvider::class.java, VelocityMovementTransmitter())
|
||||||
Via.getManager().providers.use(VersionProvider::class.java, AspirinVersionProvider)
|
Via.getManager().providers.use(VersionProvider::class.java, AspirinVersionProvider)
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,19 +1,15 @@
|
|||||||
package com.viaversion.aas.platform
|
package com.viaversion.aas.platform
|
||||||
|
|
||||||
import com.google.common.util.concurrent.ThreadFactoryBuilder
|
import com.google.common.util.concurrent.ThreadFactoryBuilder
|
||||||
|
import com.viaversion.aas.AspirinServer
|
||||||
import com.viaversion.aas.config.AspirinViaConfig
|
import com.viaversion.aas.config.AspirinViaConfig
|
||||||
import com.viaversion.aas.initFuture
|
|
||||||
import com.viaversion.aas.viaaasVer
|
|
||||||
import com.viaversion.viaversion.api.ViaAPI
|
|
||||||
import com.viaversion.viaversion.api.command.ViaCommandSender
|
import com.viaversion.viaversion.api.command.ViaCommandSender
|
||||||
import com.viaversion.viaversion.api.configuration.ConfigurationProvider
|
import com.viaversion.viaversion.api.configuration.ConfigurationProvider
|
||||||
import com.viaversion.viaversion.api.configuration.ViaVersionConfig
|
import com.viaversion.viaversion.api.configuration.ViaVersionConfig
|
||||||
import com.viaversion.viaversion.api.platform.ViaPlatform
|
import com.viaversion.viaversion.api.platform.ViaPlatform
|
||||||
import com.viaversion.viaversion.libs.gson.JsonObject
|
import com.viaversion.viaversion.libs.gson.JsonObject
|
||||||
import com.viaversion.viaversion.sponge.util.LoggerWrapper
|
|
||||||
import com.viaversion.viaversion.util.VersionInfo
|
import com.viaversion.viaversion.util.VersionInfo
|
||||||
import io.netty.channel.DefaultEventLoop
|
import io.netty.channel.DefaultEventLoop
|
||||||
import org.slf4j.LoggerFactory
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.CompletableFuture
|
import java.util.concurrent.CompletableFuture
|
||||||
@ -26,16 +22,13 @@ object AspirinPlatform : ViaPlatform<UUID> {
|
|||||||
val eventLoop = DefaultEventLoop(executor)
|
val eventLoop = DefaultEventLoop(executor)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
eventLoop.execute(initFuture::join)
|
eventLoop.execute {
|
||||||
}
|
AspirinServer.waitMainStart()
|
||||||
|
}
|
||||||
override fun sendMessage(p0: UUID, p1: String) {
|
|
||||||
// todo
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onReload() {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun sendMessage(p0: UUID, p1: String) = Unit
|
||||||
|
override fun onReload() = Unit
|
||||||
override fun runSync(runnable: Runnable): AspirinTask = AspirinTask(eventLoop.submit(runnable))
|
override fun runSync(runnable: Runnable): AspirinTask = AspirinTask(eventLoop.submit(runnable))
|
||||||
override fun runSync(p0: Runnable, p1: Long): AspirinTask =
|
override fun runSync(p0: Runnable, p1: Long): AspirinTask =
|
||||||
AspirinTask(eventLoop.schedule(p0, p1 * 50L, TimeUnit.MILLISECONDS))
|
AspirinTask(eventLoop.schedule(p0, p1 * 50L, TimeUnit.MILLISECONDS))
|
||||||
@ -43,19 +36,19 @@ object AspirinPlatform : ViaPlatform<UUID> {
|
|||||||
override fun runRepeatingSync(p0: Runnable, p1: Long): AspirinTask =
|
override fun runRepeatingSync(p0: Runnable, p1: Long): AspirinTask =
|
||||||
AspirinTask(eventLoop.scheduleAtFixedRate(p0, 0, p1 * 50L, TimeUnit.MILLISECONDS))
|
AspirinTask(eventLoop.scheduleAtFixedRate(p0, 0, p1 * 50L, TimeUnit.MILLISECONDS))
|
||||||
|
|
||||||
override fun getDump(): JsonObject = JsonObject()
|
override fun getDump() = JsonObject()
|
||||||
override fun kickPlayer(p0: UUID, p1: String): Boolean = false
|
override fun kickPlayer(p0: UUID, p1: String) = false
|
||||||
override fun getApi(): ViaAPI<UUID> = AspirinViaAPI
|
override fun getApi() = AspirinViaAPI
|
||||||
override fun getDataFolder(): File = File("viaversion")
|
override fun getDataFolder() = File("viaversion")
|
||||||
override fun getConf(): ViaVersionConfig = AspirinViaConfig
|
override fun getConf(): ViaVersionConfig = AspirinViaConfig
|
||||||
override fun runAsync(p0: Runnable): AspirinTask = AspirinTask(CompletableFuture.runAsync(p0, executor))
|
override fun runAsync(p0: Runnable): AspirinTask = AspirinTask(CompletableFuture.runAsync(p0, executor))
|
||||||
override fun getLogger(): Logger = LoggerWrapper(LoggerFactory.getLogger("ViaVersion"))
|
override fun getLogger() = Logger.getLogger("ViaVersion")
|
||||||
override fun getOnlinePlayers(): Array<ViaCommandSender> = arrayOf()
|
override fun getOnlinePlayers(): Array<ViaCommandSender> = arrayOf()
|
||||||
override fun isPluginEnabled(): Boolean = true
|
override fun isPluginEnabled() = true
|
||||||
override fun getConfigurationProvider(): ConfigurationProvider = AspirinViaConfig
|
override fun getConfigurationProvider(): ConfigurationProvider = AspirinViaConfig
|
||||||
override fun getPlatformName(): String = "VIAaaS"
|
override fun getPlatformName() = "VIAaaS"
|
||||||
override fun getPlatformVersion(): String = viaaasVer
|
override fun getPlatformVersion(): String = AspirinServer.version
|
||||||
override fun getPluginVersion(): String = VersionInfo.VERSION
|
override fun getPluginVersion() = VersionInfo.VERSION
|
||||||
override fun isOldClientsAllowed(): Boolean = true
|
override fun isOldClientsAllowed() = true
|
||||||
override fun isProxy(): Boolean = true
|
override fun isProxy() = true
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,8 @@
|
|||||||
package com.viaversion.aas.platform
|
package com.viaversion.aas.platform
|
||||||
|
|
||||||
import com.viaversion.viaversion.sponge.util.LoggerWrapper
|
|
||||||
import de.gerrygames.viarewind.api.ViaRewindPlatform
|
import de.gerrygames.viarewind.api.ViaRewindPlatform
|
||||||
import org.slf4j.LoggerFactory
|
|
||||||
import java.util.logging.Logger
|
import java.util.logging.Logger
|
||||||
|
|
||||||
object AspirinRewind : ViaRewindPlatform {
|
object AspirinRewind : ViaRewindPlatform {
|
||||||
val log = LoggerWrapper(LoggerFactory.getLogger("ViaRewind"))
|
override fun getLogger() = Logger.getLogger("ViaRewind")
|
||||||
override fun getLogger(): Logger = log
|
|
||||||
}
|
}
|
@ -1,6 +1,5 @@
|
|||||||
package com.viaversion.aas.web
|
package com.viaversion.aas.web
|
||||||
|
|
||||||
import com.viaversion.aas.viaWebServer
|
|
||||||
import io.ktor.application.*
|
import io.ktor.application.*
|
||||||
import io.ktor.features.*
|
import io.ktor.features.*
|
||||||
import io.ktor.http.*
|
import io.ktor.http.*
|
||||||
@ -13,7 +12,7 @@ import org.slf4j.event.Level
|
|||||||
import java.nio.channels.ClosedChannelException
|
import java.nio.channels.ClosedChannelException
|
||||||
import java.time.Duration
|
import java.time.Duration
|
||||||
|
|
||||||
class ViaWebApp {
|
class ViaWebApp(val viaWebServer: WebDashboardServer) {
|
||||||
fun Application.main() {
|
fun Application.main() {
|
||||||
install(DefaultHeaders)
|
install(DefaultHeaders)
|
||||||
install(ConditionalHeaders)
|
install(ConditionalHeaders)
|
||||||
@ -41,6 +40,11 @@ class ViaWebApp {
|
|||||||
install(Compression)
|
install(Compression)
|
||||||
|
|
||||||
routing {
|
routing {
|
||||||
|
static {
|
||||||
|
defaultResource("index.html", "web")
|
||||||
|
resources("web")
|
||||||
|
}
|
||||||
|
|
||||||
webSocket("/ws") {
|
webSocket("/ws") {
|
||||||
try {
|
try {
|
||||||
viaWebServer.connected(this)
|
viaWebServer.connected(this)
|
||||||
@ -57,11 +61,6 @@ class ViaWebApp {
|
|||||||
viaWebServer.disconnected(this)
|
viaWebServer.disconnected(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static {
|
|
||||||
defaultResource("index.html", "web")
|
|
||||||
resources("web")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -71,7 +71,8 @@ class WebDashboardServer {
|
|||||||
.expireAfterWrite(1, TimeUnit.HOURS)
|
.expireAfterWrite(1, TimeUnit.HOURS)
|
||||||
.build<String, CompletableFuture<UUID?>>(CacheLoader.from { name ->
|
.build<String, CompletableFuture<UUID?>>(CacheLoader.from { name ->
|
||||||
CoroutineScope(Dispatchers.IO).async {
|
CoroutineScope(Dispatchers.IO).async {
|
||||||
httpClient.get<JsonObject?>("https://api.mojang.com/users/profiles/minecraft/$name")
|
AspirinServer.httpClient
|
||||||
|
.get<JsonObject?>("https://api.mojang.com/users/profiles/minecraft/$name")
|
||||||
?.get("id")?.asString?.let { parseUndashedId(it) }
|
?.get("id")?.asString?.let { parseUndashedId(it) }
|
||||||
}.asCompletableFuture()
|
}.asCompletableFuture()
|
||||||
})
|
})
|
||||||
@ -97,7 +98,7 @@ class WebDashboardServer {
|
|||||||
val ipLookup = async(Dispatchers.IO) {
|
val ipLookup = async(Dispatchers.IO) {
|
||||||
ipInfo.lookupIP(it.address!!.hostAddress!!.substringBefore("%"))
|
ipInfo.lookupIP(it.address!!.hostAddress!!.substringBefore("%"))
|
||||||
}
|
}
|
||||||
val dnsQuery = dnsResolver.resolveAll(
|
val dnsQuery = AspirinServer.dnsResolver.resolveAll(
|
||||||
DefaultDnsQuestion(reverseLookup(it.address), DnsRecordType.PTR)
|
DefaultDnsQuestion(reverseLookup(it.address), DnsRecordType.PTR)
|
||||||
)
|
)
|
||||||
info = ipLookup.await()
|
info = ipLookup.await()
|
||||||
|
@ -48,7 +48,7 @@ class WebLogin : WebState {
|
|||||||
val username = obj.get("username").asString
|
val username = obj.get("username").asString
|
||||||
val code = obj.get("code").asString
|
val code = obj.get("code").asString
|
||||||
|
|
||||||
val check = httpClient.submitForm<JsonObject>(
|
val check = AspirinServer.httpClient.submitForm<JsonObject>(
|
||||||
"https://api.minecraft.id/gateway/verify/${URLEncoder.encode(username, Charsets.UTF_8)}",
|
"https://api.minecraft.id/gateway/verify/${URLEncoder.encode(username, Charsets.UTF_8)}",
|
||||||
formParameters = parametersOf("code", code),
|
formParameters = parametersOf("code", code),
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user