Maa HTTP Server

This commit is contained in:
guigui
2022-05-25 02:37:24 +08:00
parent d7c1f87a59
commit a05548be4b
9 changed files with 250 additions and 38 deletions

View File

@@ -1,38 +1,35 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
val ktor_version = "2.0.1"
val kotlin_version = "1.6.10"
val logback_version = "1.2.11"
plugins {
id("java")
application
kotlin("jvm") version "1.6.10"
kotlin("plugin.serialization") version "1.6.10"
id("io.spring.dependency-management") version "1.0.10.RELEASE"
id("org.springframework.boot") version "2.4.0-SNAPSHOT"
}
version = "1.0-SNAPSHOT"
group = "com.iguigui"
version = "0.0.1"
application {
mainClass.set("com.iguigui.maaj.ApplicationKt")
val isDevelopment: Boolean = project.ext.has("development")
applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment")
}
repositories {
mavenCentral()
maven { url = uri("https://repo.spring.io/milestone") }
maven { url = uri("https://repo.spring.io/snapshot") }
maven { url = uri("https://maven.pkg.jetbrains.space/public/p/ktor/eap") }
}
dependencies {
//JNA
implementation("net.java.dev.jna:jna:5.11.0")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("io.ktor:ktor-server-core-jvm:$ktor_version")
implementation("io.ktor:ktor-server-netty-jvm:$ktor_version")
implementation("io.ktor:ktor-server-content-negotiation:$ktor_version")
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktor_version")
implementation("io.ktor:ktor-server-websockets:$ktor_version")
implementation("ch.qos.logback:logback-classic:$logback_version")
testImplementation("io.ktor:ktor-server-tests-jvm:$ktor_version")
testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.3")
implementation( "org.jetbrains.kotlin:kotlin-reflect:1.6.10")
implementation(kotlin("stdlib-jdk8"))
}
tasks.getByName<Test>("test") {
useJUnitPlatform()
}
val compileKotlin: KotlinCompile by tasks
compileKotlin.kotlinOptions {
jvmTarget = "1.8"
}
val compileTestKotlin: KotlinCompile by tasks
compileTestKotlin.kotlinOptions {
jvmTarget = "1.8"
}

View File

@@ -0,0 +1,64 @@
package com.iguigui.maaj
import com.iguigui.maaj.dto.*
import com.iguigui.maaj.service.MaaService
import io.ktor.server.netty.*
import io.ktor.server.application.*
import io.ktor.server.plugins.contentnegotiation.*
import io.ktor.server.request.*
import io.ktor.server.routing.*
import io.ktor.server.websocket.*
import io.ktor.websocket.*
import java.time.Duration
import io.ktor.serialization.kotlinx.json.*
fun main(args: Array<String>): Unit = EngineMain.main(args)
fun Application.module() {
configureRouting()
}
fun Application.configureRouting() {
install(ContentNegotiation) {
json()
}
install(WebSockets) {
pingPeriod = Duration.ofSeconds(15)
timeout = Duration.ofSeconds(15)
maxFrameSize = Long.MAX_VALUE
masking = false
}
routing {
post("/connect") {
val connect = call.receive<Connect>()
MaaService.connect(connect.adbPath, connect.host, "")
}
post("/appendTask") {
val appendTask = call.receive<AppendTask>()
MaaService.appendTask(appendTask.host, appendTask.type, appendTask.params.toJsonString())
}
post("/start") {
val start = call.receive<Start>()
MaaService.start(start.host)
}
post("/stop") {
val stop = call.receive<Stop>()
MaaService.stop(stop.host)
}
webSocket("/") {
send("You are connected!")
for (frame in incoming) {
frame as? Frame.Text ?: continue
val receivedText = frame.readText()
println("接收到信息 : $receivedText")
send("You said: $receivedText")
}
}
}
}

View File

@@ -1,5 +0,0 @@
package com.iguigui.maaj
fun main() {
println("Hello world !")
}

View File

@@ -0,0 +1,63 @@
package com.iguigui.maaj.dto
import com.iguigui.maaj.util.Json
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
sealed class WsRequest
@Serializable
data class Connect(
@SerialName("adbPath")
val adbPath: String,
@SerialName("host")
val host: String
)
@Serializable
data class AppendTask(
@SerialName("host")
val host: String,
@SerialName("type")
val type: String,
@SerialName("params")
val params: Task
)
@Serializable
sealed class Task
@Serializable
data class Fight(
@SerialName("stage")
val stage: String
) : Task()
@Serializable
data class Start(
@SerialName("host")
val host: String
)
@Serializable
data class Stop(
@SerialName("host")
val host: String
)
@SerialName("connect")
@Serializable
data class ConnectWs(
@SerialName("data")
val `data`: Connect,
@SerialName("type")
val type: String
) : WsRequest()
fun Task.toJsonString() = Json.encodeToString(this)

View File

@@ -0,0 +1,37 @@
package com.iguigui.maaj.service
import com.iguigui.maaj.easySample.MeoAssistant
import com.sun.jna.Pointer
class MaaInstance(private val instance: MeoAssistant, val id: String, val adbPath: String, val host: String) :
MeoAssistant.AsstApiCallback {
constructor(
instance: MeoAssistant,
pointer: Pointer,
id: String, adbPath: String,
host: String
) : this(
instance,
id,
adbPath,
host
) {
this.pointer = pointer
}
lateinit var pointer: Pointer
override fun callback(msg: Int, detail_json: String?, custom_arg: String?) {
System.out.printf("回调msg : %s , 回调 detail_json : %s ,回调 custom_arg : %s \n", msg, detail_json, custom_arg)
}
fun connect(): Boolean = instance.AsstConnect(pointer, adbPath, host, "");
fun appendTask(type: String, params: String) = instance.AsstAppendTask(pointer, type, params)
fun start() = instance.AsstStart(pointer)
fun stop() = instance.AsstStop(pointer)
}

View File

@@ -1,20 +1,47 @@
package com.iguigui.maaj.service
import com.iguigui.maaj.easySample.MeoAssistant
import org.springframework.context.annotation.Bean
import org.springframework.stereotype.Component
import org.springframework.stereotype.Service
import com.sun.jna.Native
import java.io.File
import java.util.*
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.atomic.AtomicBoolean
@Service
class MaaService {
object MaaService {
lateinit var meoAssistant: MeoAssistant
var initFlag: AtomicBoolean = AtomicBoolean(false)
fun loadSource() {
private var instancePool: ConcurrentHashMap<String, MaaInstance> = ConcurrentHashMap()
val meoAssistant: MeoAssistant by lazy {
val f = File(this.javaClass.getResource("")?.path ?: "")
var maaPath = f.path
println(maaPath)
maaPath = "C:\\Users\\atmzx\\Desktop\\MeoAssistantArknights3"
System.setProperty("jna.library.path", maaPath)
val load = Native.load("MeoAssistant", MeoAssistant::class.java)
load.AsstLoadResource(maaPath)
load
}
fun connect(adbPath: String, host: String, detailJson: String): Boolean {
if (instancePool.containsKey(host)) {
return false
}
val maaInstance = MaaInstance(meoAssistant, host, adbPath, host)
maaInstance.pointer = meoAssistant.AsstCreateEx(maaInstance, maaInstance.id)
maaInstance.connect()
instancePool.putIfAbsent(host, maaInstance)
return true
}
fun appendTask(host: String,type:String, detailJson: String): Int {
val appendTask = instancePool[host]?.appendTask(type, detailJson)
return appendTask ?: 0
}
fun start(host: String) = instancePool[host]?.start()
fun stop(host: String) = instancePool[host]?.stop()
private fun generatorId() = UUID.randomUUID().toString()
}

View File

@@ -0,0 +1,9 @@
package com.iguigui.maaj.util
import kotlinx.serialization.json.Json
val Json by lazy {
Json {
ignoreUnknownKeys = true
}
}

View File

@@ -0,0 +1,8 @@
ktor {
deployment {
port = 8848
}
application {
modules = [ com.iguigui.maaj.ApplicationKt.module ]
}
}

View File

@@ -0,0 +1,12 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="trace">
<appender-ref ref="STDOUT"/>
</root>
<logger name="org.eclipse.jetty" level="INFO"/>
<logger name="io.netty" level="INFO"/>
</configuration>