mirror of https://github.com/hykilpikonna/AquaDX
[F] Fix server return type
parent
93518aa1f4
commit
202df27f88
|
@ -8,6 +8,8 @@ import org.springframework.context.annotation.Configuration
|
||||||
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
|
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
|
||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer
|
||||||
import org.springframework.web.servlet.resource.PathResourceResolver
|
import org.springframework.web.servlet.resource.PathResourceResolver
|
||||||
|
import kotlin.io.path.createFile
|
||||||
|
import kotlin.io.path.exists
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@ConfigurationProperties(prefix = "paths")
|
@ConfigurationProperties(prefix = "paths")
|
||||||
|
@ -15,14 +17,18 @@ class PathProps {
|
||||||
var mai2Plays: String = "data/upload/mai2/plays"
|
var mai2Plays: String = "data/upload/mai2/plays"
|
||||||
var mai2Portrait: String = "data/upload/mai2/portrait"
|
var mai2Portrait: String = "data/upload/mai2/portrait"
|
||||||
var aquaNetPortrait: String = "data/upload/net/portrait"
|
var aquaNetPortrait: String = "data/upload/net/portrait"
|
||||||
var recruitLog: String = "data/futari/recruit.log"
|
var futariRecruitLog: String = "data/futari/recruit.log"
|
||||||
|
var futariRelayInfo: String = "data/futari/relays.json"
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
fun init() {
|
fun init() {
|
||||||
mai2Plays = mai2Plays.path().apply { toFile().mkdirs() }.toString()
|
mai2Plays = mai2Plays.path().apply { toFile().mkdirs() }.toString()
|
||||||
mai2Portrait = mai2Portrait.path().apply { toFile().mkdirs() }.toString()
|
mai2Portrait = mai2Portrait.path().apply { toFile().mkdirs() }.toString()
|
||||||
aquaNetPortrait = aquaNetPortrait.path().apply { toFile().mkdirs() }.toString()
|
aquaNetPortrait = aquaNetPortrait.path().apply { toFile().mkdirs() }.toString()
|
||||||
recruitLog = recruitLog.path().apply { toFile().parentFile.mkdirs() }.toString()
|
futariRecruitLog = futariRecruitLog.path().apply { toFile().parentFile.mkdirs() }.toString()
|
||||||
|
futariRelayInfo = futariRelayInfo.path()
|
||||||
|
.apply { toFile().parentFile.mkdirs() }
|
||||||
|
.apply { if (!exists()) createFile() }.toString()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ import java.io.FileOutputStream
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
import java.util.concurrent.locks.ReentrantLock
|
import java.util.concurrent.locks.ReentrantLock
|
||||||
import kotlin.concurrent.withLock
|
import kotlin.concurrent.withLock
|
||||||
|
import kotlin.io.path.readText
|
||||||
|
|
||||||
|
|
||||||
// KotlinX Serialization
|
// KotlinX Serialization
|
||||||
|
@ -30,7 +31,7 @@ const val MAX_TTL = 30 * 1000
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping(path = ["/mai2-futari"])
|
@RequestMapping(path = ["/mai2-futari"])
|
||||||
class FutariLobby(paths: PathProps) {
|
class FutariLobby(val paths: PathProps) {
|
||||||
// <IP Address, RecruitInfo>
|
// <IP Address, RecruitInfo>
|
||||||
val recruits = mutableMapOf<UInt, RecruitRecord>()
|
val recruits = mutableMapOf<UInt, RecruitRecord>()
|
||||||
// Append writer
|
// Append writer
|
||||||
|
@ -40,7 +41,7 @@ class FutariLobby(paths: PathProps) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
paths.init()
|
paths.init()
|
||||||
writer = FileOutputStream(File(paths.recruitLog), true).bufferedWriter()
|
writer = FileOutputStream(File(paths.futariRecruitLog), true).bufferedWriter()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun log(data: String) = mutex.withLock {
|
fun log(data: String) = mutex.withLock {
|
||||||
|
@ -69,7 +70,7 @@ class FutariLobby(paths: PathProps) {
|
||||||
fun finishRecruit(@RB data: String) {
|
fun finishRecruit(@RB data: String) {
|
||||||
val d = parsing { KJson.decodeFromString<RecruitRecord>(data) }
|
val d = parsing { KJson.decodeFromString<RecruitRecord>(data) }
|
||||||
if (d.ip !in recruits) 400 - "Recruit not found"
|
if (d.ip !in recruits) 400 - "Recruit not found"
|
||||||
if (d.Keychip != recruits[d.ip]!!.Keychip) 400 - "Keychip mismatch"
|
// if (d.Keychip != recruits[d.ip]!!.Keychip) 400 - "Keychip mismatch"
|
||||||
recruits.remove(d.ip)
|
recruits.remove(d.ip)
|
||||||
log(d, "EndRecruit")
|
log(d, "EndRecruit")
|
||||||
}
|
}
|
||||||
|
@ -78,8 +79,11 @@ class FutariLobby(paths: PathProps) {
|
||||||
fun listRecruit(): String {
|
fun listRecruit(): String {
|
||||||
val time = millis()
|
val time = millis()
|
||||||
recruits.filterValues { time - it.Time > MAX_TTL }.keys.forEach { recruits.remove(it) }
|
recruits.filterValues { time - it.Time > MAX_TTL }.keys.forEach { recruits.remove(it) }
|
||||||
return recruits.values.toList().joinToString("\n") { KJson.encodeToString(it.RecruitInfo) }
|
return recruits.values.toList().joinToString("\n") { KJson.encodeToString(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@API("server-list")
|
||||||
|
fun serverList() = paths.futariRelayInfo.path().readText().trim()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun main(args: Array<String>) {
|
fun main(args: Array<String>) {
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
@file:Suppress("PropertyName")
|
|
||||||
|
|
||||||
package icu.samnyan.aqua.sega.maimai2.worldslink
|
|
||||||
|
|
||||||
import ext.Bool
|
|
||||||
import kotlinx.serialization.Serializable
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
data class MechaInfo(
|
|
||||||
val IsJoin: Bool,
|
|
||||||
val IpAddress: UInt,
|
|
||||||
val MusicID: Int,
|
|
||||||
val Entrys: List<Bool>,
|
|
||||||
var UserIDs: List<Long>,
|
|
||||||
val UserNames: List<String>,
|
|
||||||
val IconIDs: List<Int>,
|
|
||||||
val FumenDifs: List<Int>,
|
|
||||||
val Rateing: List<Int>,
|
|
||||||
val ClassValue: List<Int>,
|
|
||||||
val MaxClassValue: List<Int>,
|
|
||||||
val UserType: List<Int>
|
|
||||||
)
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
data class RecruitInfo(
|
|
||||||
val MechaInfo: MechaInfo,
|
|
||||||
val MusicID: Int,
|
|
||||||
val GroupID: Int,
|
|
||||||
val EventModeID: Boolean,
|
|
||||||
val JoinNumber: Int,
|
|
||||||
val PartyStance: Int,
|
|
||||||
val _startTimeTicks: Long,
|
|
||||||
val _recvTimeTicks: Long
|
|
||||||
)
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
data class RecruitRecord(
|
|
||||||
val RecruitInfo: RecruitInfo,
|
|
||||||
val Keychip: String,
|
|
||||||
var Time: Long = 0
|
|
||||||
)
|
|
|
@ -1,9 +1,9 @@
|
||||||
|
@file:Suppress("PropertyName")
|
||||||
|
|
||||||
package icu.samnyan.aqua.sega.maimai2.worldslink
|
package icu.samnyan.aqua.sega.maimai2.worldslink
|
||||||
|
|
||||||
import ext.arr
|
import ext.*
|
||||||
import ext.ls
|
import kotlinx.serialization.Serializable
|
||||||
import ext.some
|
|
||||||
import ext.str
|
|
||||||
|
|
||||||
object Command {
|
object Command {
|
||||||
// Control plane
|
// Control plane
|
||||||
|
@ -53,4 +53,48 @@ data class Msg(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class MechaInfo(
|
||||||
|
val IsJoin: Bool,
|
||||||
|
val IpAddress: UInt,
|
||||||
|
val MusicID: Int,
|
||||||
|
val Entrys: List<Bool>,
|
||||||
|
var UserIDs: List<Long>,
|
||||||
|
val UserNames: List<String>,
|
||||||
|
val IconIDs: List<Int>,
|
||||||
|
val FumenDifs: List<Int>,
|
||||||
|
val Rateing: List<Int>,
|
||||||
|
val ClassValue: List<Int>,
|
||||||
|
val MaxClassValue: List<Int>,
|
||||||
|
val UserType: List<Int>
|
||||||
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class RecruitInfo(
|
||||||
|
val MechaInfo: MechaInfo,
|
||||||
|
val MusicID: Int,
|
||||||
|
val GroupID: Int,
|
||||||
|
val EventModeID: Boolean,
|
||||||
|
val JoinNumber: Int,
|
||||||
|
val PartyStance: Int,
|
||||||
|
val _startTimeTicks: Long,
|
||||||
|
val _recvTimeTicks: Long
|
||||||
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class RecruitRecord(
|
||||||
|
val RecruitInfo: RecruitInfo,
|
||||||
|
val Keychip: String,
|
||||||
|
var Server: RelayServerInfo? = null,
|
||||||
|
var Time: Long = 0,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class RelayServerInfo(
|
||||||
|
val name: String,
|
||||||
|
val addr: String,
|
||||||
|
val port: Int = 20101,
|
||||||
|
val official: Bool = true
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue