mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-16 09:50:40 +08:00
Maa HTTP Server
This commit is contained in:
@@ -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"
|
||||
}
|
||||
|
||||
64
src/Java/Maaj/src/main/java/com/iguigui/maaj/Application.kt
Normal file
64
src/Java/Maaj/src/main/java/com/iguigui/maaj/Application.kt
Normal 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")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
package com.iguigui.maaj
|
||||
|
||||
fun main() {
|
||||
println("Hello world !")
|
||||
}
|
||||
63
src/Java/Maaj/src/main/java/com/iguigui/maaj/dto/request.kt
Normal file
63
src/Java/Maaj/src/main/java/com/iguigui/maaj/dto/request.kt
Normal 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)
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.iguigui.maaj.util
|
||||
|
||||
import kotlinx.serialization.json.Json
|
||||
|
||||
val Json by lazy {
|
||||
Json {
|
||||
ignoreUnknownKeys = true
|
||||
}
|
||||
}
|
||||
8
src/Java/Maaj/src/main/resources/application.conf
Normal file
8
src/Java/Maaj/src/main/resources/application.conf
Normal file
@@ -0,0 +1,8 @@
|
||||
ktor {
|
||||
deployment {
|
||||
port = 8848
|
||||
}
|
||||
application {
|
||||
modules = [ com.iguigui.maaj.ApplicationKt.module ]
|
||||
}
|
||||
}
|
||||
12
src/Java/Maaj/src/main/resources/logback.xml
Normal file
12
src/Java/Maaj/src/main/resources/logback.xml
Normal 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>
|
||||
Reference in New Issue
Block a user