forked from Cookies_Github_mirror/AquaDX
77 lines
2.3 KiB
Kotlin
77 lines
2.3 KiB
Kotlin
package icu.samnyan.aqua.sega.aimedb
|
|
|
|
import ext.logger
|
|
import io.netty.bootstrap.ServerBootstrap
|
|
import io.netty.channel.ChannelInitializer
|
|
import io.netty.channel.ChannelOption
|
|
import io.netty.channel.nio.NioEventLoopGroup
|
|
import io.netty.channel.socket.SocketChannel
|
|
import io.netty.channel.socket.nio.NioServerSocketChannel
|
|
import io.netty.handler.logging.LogLevel
|
|
import io.netty.handler.logging.LoggingHandler
|
|
import org.slf4j.Logger
|
|
import org.slf4j.LoggerFactory
|
|
import org.springframework.boot.context.properties.ConfigurationProperties
|
|
import org.springframework.context.annotation.Configuration
|
|
import org.springframework.stereotype.Component
|
|
import java.net.InetAddress
|
|
import java.net.InetSocketAddress
|
|
import java.net.UnknownHostException
|
|
|
|
@Configuration
|
|
@ConfigurationProperties(prefix = "aimedb.server")
|
|
class AimeDbProps {
|
|
var enable = true
|
|
var address = "0.0.0.0"
|
|
var port = 22345
|
|
}
|
|
|
|
/**
|
|
* @author samnyan (privateamusement@protonmail.com)
|
|
*/
|
|
@Component
|
|
class AimeDbServer(
|
|
val initializer: AimeDbServerInitializer,
|
|
val props: AimeDbProps
|
|
) {
|
|
val logger = logger()
|
|
|
|
fun start() {
|
|
if (!props.enable) return logger.info("Aime DB is disabled.")
|
|
|
|
val bootstrap = ServerBootstrap()
|
|
.group(NioEventLoopGroup(), NioEventLoopGroup())
|
|
.handler(LoggingHandler(LogLevel.DEBUG))
|
|
.channel(NioServerSocketChannel::class.java)
|
|
.childHandler(initializer)
|
|
.option(ChannelOption.SO_BACKLOG, 128)
|
|
|
|
if (props.address.isBlank()) props.address = "0.0.0.0"
|
|
|
|
try {
|
|
val socket = InetSocketAddress(InetAddress.getByName(props.address), props.port)
|
|
|
|
val f = bootstrap.bind(socket).sync()
|
|
logger.info("Aime DB start up on $socket")
|
|
f.channel().closeFuture()
|
|
}
|
|
catch (e: UnknownHostException) {
|
|
logger.error("UnknownHostException, please check you have set a correct aimedb.server.address.")
|
|
throw e
|
|
}
|
|
}
|
|
}
|
|
|
|
@Component
|
|
class AimeDbServerInitializer(
|
|
val aimeDbRequestHandler: AimeDB
|
|
) : ChannelInitializer<SocketChannel>() {
|
|
override fun initChannel(ch: SocketChannel) {
|
|
ch.pipeline().apply {
|
|
addLast("encoder", AimeDbEncoder())
|
|
addLast("decoder", AimeDbDecoder())
|
|
addLast("handler", aimeDbRequestHandler)
|
|
}
|
|
}
|
|
}
|