From 2f0953a336e24752aabdd92d1343be6df249e298 Mon Sep 17 00:00:00 2001 From: guigui Date: Wed, 25 May 2022 02:37:24 +0800 Subject: [PATCH] Maa HTTP Server --- src/Java/Maaj/build.gradle.kts | 43 ++++++------- .../main/java/com/iguigui/maaj/Application.kt | 64 +++++++++++++++++++ .../src/main/java/com/iguigui/maaj/Starter.kt | 5 -- .../main/java/com/iguigui/maaj/dto/request.kt | 63 ++++++++++++++++++ .../com/iguigui/maaj/service/MaaInstance.kt | 37 +++++++++++ .../com/iguigui/maaj/service/MaaService.kt | 47 +++++++++++--- .../java/com/iguigui/maaj/util/JsonUtil.kt | 9 +++ .../Maaj/src/main/resources/application.conf | 8 +++ src/Java/Maaj/src/main/resources/logback.xml | 12 ++++ 9 files changed, 250 insertions(+), 38 deletions(-) create mode 100644 src/Java/Maaj/src/main/java/com/iguigui/maaj/Application.kt delete mode 100644 src/Java/Maaj/src/main/java/com/iguigui/maaj/Starter.kt create mode 100644 src/Java/Maaj/src/main/java/com/iguigui/maaj/dto/request.kt create mode 100644 src/Java/Maaj/src/main/java/com/iguigui/maaj/service/MaaInstance.kt create mode 100644 src/Java/Maaj/src/main/java/com/iguigui/maaj/util/JsonUtil.kt create mode 100644 src/Java/Maaj/src/main/resources/application.conf create mode 100644 src/Java/Maaj/src/main/resources/logback.xml diff --git a/src/Java/Maaj/build.gradle.kts b/src/Java/Maaj/build.gradle.kts index f1c64f1180..478983a488 100644 --- a/src/Java/Maaj/build.gradle.kts +++ b/src/Java/Maaj/build.gradle.kts @@ -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") { - useJUnitPlatform() -} -val compileKotlin: KotlinCompile by tasks -compileKotlin.kotlinOptions { - jvmTarget = "1.8" -} -val compileTestKotlin: KotlinCompile by tasks -compileTestKotlin.kotlinOptions { - jvmTarget = "1.8" } diff --git a/src/Java/Maaj/src/main/java/com/iguigui/maaj/Application.kt b/src/Java/Maaj/src/main/java/com/iguigui/maaj/Application.kt new file mode 100644 index 0000000000..eb631a74c2 --- /dev/null +++ b/src/Java/Maaj/src/main/java/com/iguigui/maaj/Application.kt @@ -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): 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() + MaaService.connect(connect.adbPath, connect.host, "") + } + + post("/appendTask") { + val appendTask = call.receive() + MaaService.appendTask(appendTask.host, appendTask.type, appendTask.params.toJsonString()) + } + + post("/start") { + val start = call.receive() + MaaService.start(start.host) + } + + post("/stop") { + val stop = call.receive() + 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") + } + } + } +} diff --git a/src/Java/Maaj/src/main/java/com/iguigui/maaj/Starter.kt b/src/Java/Maaj/src/main/java/com/iguigui/maaj/Starter.kt deleted file mode 100644 index 28404186bd..0000000000 --- a/src/Java/Maaj/src/main/java/com/iguigui/maaj/Starter.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.iguigui.maaj - -fun main() { - println("Hello world !") -} diff --git a/src/Java/Maaj/src/main/java/com/iguigui/maaj/dto/request.kt b/src/Java/Maaj/src/main/java/com/iguigui/maaj/dto/request.kt new file mode 100644 index 0000000000..d7fcb2c8f1 --- /dev/null +++ b/src/Java/Maaj/src/main/java/com/iguigui/maaj/dto/request.kt @@ -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) + + + diff --git a/src/Java/Maaj/src/main/java/com/iguigui/maaj/service/MaaInstance.kt b/src/Java/Maaj/src/main/java/com/iguigui/maaj/service/MaaInstance.kt new file mode 100644 index 0000000000..ee409d7315 --- /dev/null +++ b/src/Java/Maaj/src/main/java/com/iguigui/maaj/service/MaaInstance.kt @@ -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) + +} diff --git a/src/Java/Maaj/src/main/java/com/iguigui/maaj/service/MaaService.kt b/src/Java/Maaj/src/main/java/com/iguigui/maaj/service/MaaService.kt index 1236c364c3..38d0b6cdd6 100644 --- a/src/Java/Maaj/src/main/java/com/iguigui/maaj/service/MaaService.kt +++ b/src/Java/Maaj/src/main/java/com/iguigui/maaj/service/MaaService.kt @@ -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 = 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() + } diff --git a/src/Java/Maaj/src/main/java/com/iguigui/maaj/util/JsonUtil.kt b/src/Java/Maaj/src/main/java/com/iguigui/maaj/util/JsonUtil.kt new file mode 100644 index 0000000000..3625299e05 --- /dev/null +++ b/src/Java/Maaj/src/main/java/com/iguigui/maaj/util/JsonUtil.kt @@ -0,0 +1,9 @@ +package com.iguigui.maaj.util + +import kotlinx.serialization.json.Json + +val Json by lazy { + Json { + ignoreUnknownKeys = true + } +} diff --git a/src/Java/Maaj/src/main/resources/application.conf b/src/Java/Maaj/src/main/resources/application.conf new file mode 100644 index 0000000000..cc5a87ccdc --- /dev/null +++ b/src/Java/Maaj/src/main/resources/application.conf @@ -0,0 +1,8 @@ +ktor { + deployment { + port = 8848 + } + application { + modules = [ com.iguigui.maaj.ApplicationKt.module ] + } +} diff --git a/src/Java/Maaj/src/main/resources/logback.xml b/src/Java/Maaj/src/main/resources/logback.xml new file mode 100644 index 0000000000..bdbb64ec4b --- /dev/null +++ b/src/Java/Maaj/src/main/resources/logback.xml @@ -0,0 +1,12 @@ + + + + %d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + +