[M] Split code

pull/109/head
Azalea 2025-01-13 21:16:19 -05:00
parent 5290597b2b
commit 8a04bb014a
2 changed files with 61 additions and 53 deletions

View File

@ -1,6 +1,8 @@
package icu.samnyan.aqua.sega.maimai2
package icu.samnyan.aqua.sega.maimai2.worldslink
import ext.*
import ext.logger
import ext.millis
import ext.thread
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
@ -13,60 +15,10 @@ import java.util.concurrent.locks.ReentrantLock
import kotlin.collections.set
import kotlin.concurrent.withLock
const val PROTO_VERSION = 1
const val MAX_STREAMS = 10
const val SO_TIMEOUT = 10000
private object Command {
// Control plane
const val CTL_START = 1u
const val CTL_BIND = 2u
const val CTL_HEARTBEAT = 3u
const val CTL_TCP_CONNECT = 4u // Accept a new multiplexed TCP stream
const val CTL_TCP_ACCEPT = 5u
const val CTL_TCP_ACCEPT_ACK = 6u
const val CTL_TCP_CLOSE = 7u
// Data plane
const val DATA_SEND = 21u
const val DATA_BROADCAST = 22u
}
private object Proto {
const val TCP = 6u
const val UDP = 17u
}
data class Msg(
var cmd: UInt,
var proto: UInt? = null,
var sid: UInt? = null,
var src: UInt? = null,
var sPort: UInt? = null,
var dst: UInt? = null,
var dPort: UInt? = null,
var data: String? = null
) {
override fun toString() = ls(
1, cmd, proto, sid, src, sPort, dst, dPort,
null, null, null, null, null, null, null, null, // reserved for future use
data
).joinToString(",") { it?.str ?: "" }.trimEnd(',')
companion object {
val fields = arr(Msg::proto, Msg::sid, Msg::src, Msg::sPort, Msg::dst, Msg::dPort)
fun fromString(str: String): Msg {
val sp = str.split(',')
return Msg(0u).apply {
cmd = sp[1].toUInt()
fields.forEachIndexed { i, f -> f.set(this, sp.getOrNull(i + 2)?.some?.toUIntOrNull()) }
data = sp.drop(16).joinToString(",")
}
}
}
}
fun ctlMsg(cmd: UInt, data: String? = null) = Msg(cmd, data = data)
data class ActiveClient(
@ -133,7 +85,7 @@ fun ActiveClient.handle(msg: Msg) {
val sid = msg.sid ?: return log.warn("Accept: Stream ID not found")
if (sid !in target.pendingStreams)
return log.warn("Stream ID not found in pending list: ${sid}")
return log.warn("Stream ID not found in pending list: $sid")
// Add the stream to the active list
target.pendingStreams.remove(sid)

View File

@ -0,0 +1,56 @@
package icu.samnyan.aqua.sega.maimai2.worldslink
import ext.arr
import ext.ls
import ext.some
import ext.str
object Command {
// Control plane
const val CTL_START = 1u
const val CTL_BIND = 2u
const val CTL_HEARTBEAT = 3u
const val CTL_TCP_CONNECT = 4u // Accept a new multiplexed TCP stream
const val CTL_TCP_ACCEPT = 5u
const val CTL_TCP_ACCEPT_ACK = 6u
const val CTL_TCP_CLOSE = 7u
// Data plane
const val DATA_SEND = 21u
const val DATA_BROADCAST = 22u
}
object Proto {
const val TCP = 6u
const val UDP = 17u
}
data class Msg(
var cmd: UInt,
var proto: UInt? = null,
var sid: UInt? = null,
var src: UInt? = null,
var sPort: UInt? = null,
var dst: UInt? = null,
var dPort: UInt? = null,
var data: String? = null
) {
override fun toString() = ls(
1, cmd, proto, sid, src, sPort, dst, dPort,
null, null, null, null, null, null, null, null, // reserved for future use
data
).joinToString(",") { it?.str ?: "" }.trimEnd(',')
companion object {
val fields = arr(Msg::proto, Msg::sid, Msg::src, Msg::sPort, Msg::dst, Msg::dPort)
fun fromString(str: String): Msg {
val sp = str.split(',')
return Msg(0u).apply {
cmd = sp[1].toUInt()
fields.forEachIndexed { i, f -> f.set(this, sp.getOrNull(i + 2)?.some?.toUIntOrNull()) }
data = sp.drop(16).joinToString(",")
}
}
}
}