Ver código fonte

Move common part to spi module

ryoii 3 anos atrás
pai
commit
60f350581a
24 arquivos alterados com 162 adições e 82 exclusões
  1. 2 0
      build.gradle.kts
  2. 20 0
      buildSrc/build.gradle.kts
  3. 30 0
      buildSrc/src/main/kotlin/Version.kt
  4. 24 0
      mirai-api-http-spi/build.gradle.kts
  5. 0 11
      mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/adapter/MahAdapter.kt
  6. 0 0
      mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/adapter/common/README.md
  7. 0 0
      mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/adapter/common/StateCode.kt
  8. 0 0
      mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/adapter/common/exception.kt
  9. 3 3
      mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/adapter/internal/dto/base.kt
  10. 0 0
      mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/context/session/manager/api.kt
  11. 0 0
      mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/context/session/session.kt
  12. 10 0
      mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/spi/adapter/MahAdapterServiceFactory.kt
  13. 0 0
      mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/spi/persistence/Persistence.kt
  14. 27 60
      mirai-api-http/build.gradle.kts
  15. 5 7
      mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/HttpApiPluginBase.kt
  16. 1 0
      mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/http/HttpAdapter.kt
  17. 1 0
      mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/reverse/ReverseWebsocketAdaptor.kt
  18. 13 0
      mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/utils.kt
  19. 1 0
      mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/webhook/WebhookAdapter.kt
  20. 1 0
      mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/ws/WebsocketAdapter.kt
  21. 15 0
      mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/loader/AdapterLoader.kt
  22. 6 0
      mirai-api-http/src/main/resources/plugin.yml
  23. 1 1
      mirai-api-http/src/test/kotlin/launch/adapter/LaunchTester.kt
  24. 2 0
      settings.gradle.kts

+ 2 - 0
build.gradle.kts

@@ -7,6 +7,7 @@ buildscript {
 
     repositories {
         mavenLocal()
+        maven(url = "https://maven.aliyun.com/repository/public")
         mavenCentral()
         gradlePluginPortal()
         google()
@@ -27,6 +28,7 @@ allprojects {
 
     repositories {
         mavenLocal()
+        maven(url = "https://maven.aliyun.com/repository/public")
         mavenCentral()
         gradlePluginPortal()
         google()

+ 20 - 0
buildSrc/build.gradle.kts

@@ -0,0 +1,20 @@
+plugins {
+    `kotlin-dsl`
+}
+
+repositories {
+    mavenLocal()
+    maven(url = "https://plugins.gradle.org/m2/")
+    gradlePluginPortal()
+}
+
+dependencies {
+
+}
+
+kotlin {
+    sourceSets.all {
+        languageSettings.optIn("kotlin.Experimental")
+        languageSettings.optIn("kotlin.RequiresOptIn")
+    }
+}

+ 30 - 0
buildSrc/src/main/kotlin/Version.kt

@@ -0,0 +1,30 @@
+import org.gradle.api.artifacts.ExternalModuleDependency
+import org.gradle.api.artifacts.dsl.DependencyHandler
+import org.gradle.internal.impldep.org.junit.experimental.categories.Categories.CategoryFilter.exclude
+import org.gradle.kotlin.dsl.DependencyHandlerScope
+import org.gradle.kotlin.dsl.accessors.runtime.addDependencyTo
+
+object Versions {
+
+    const val ktor = "1.6.7"
+}
+
+fun DependencyHandlerScope.ktorApi(id: String, version: String = Versions.ktor) =
+    ktor(this, "api", id, version)
+
+fun DependencyHandlerScope.ktorImplementation(id: String, version: String = Versions.ktor) =
+    ktor(this, "implementation", id, version)
+
+fun DependencyHandlerScope.ktorTest(id: String, version: String = Versions.ktor) =
+    ktor(this, "testImplementation", id, version)
+
+private fun ktor(dependencies: DependencyHandler, configuration: String, id: String, version: String) =
+    addDependencyTo<ExternalModuleDependency>(
+        dependencies,
+        configuration,
+        "io.ktor:ktor-$id:$version"
+    ) {
+        exclude(mapOf("group" to "org.jetbrains.kotlin"))
+        exclude(mapOf("group" to "org.jetbrains.kotlinx"))
+        exclude(mapOf("module" to "slf4j-api"))
+    }

+ 24 - 0
mirai-api-http-spi/build.gradle.kts

@@ -0,0 +1,24 @@
+plugins {
+    kotlin("jvm")
+    kotlin("plugin.serialization")
+    id("kotlinx-atomicfu")
+    id("net.mamoe.mirai-console") version "2.12.0"
+    id("me.him188.maven-central-publish")
+}
+
+dependencies {
+
+}
+
+tasks.test {
+    useJUnitPlatform()
+}
+
+tasks {
+    compileKotlin {
+        kotlinOptions.jvmTarget = "1.8"
+    }
+    compileTestKotlin {
+        kotlinOptions.jvmTarget = "1.8"
+    }
+}

+ 0 - 11
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/MahAdapter.kt → mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/adapter/MahAdapter.kt

@@ -9,13 +9,9 @@
 
 package net.mamoe.mirai.api.http.adapter
 
-import kotlinx.serialization.InternalSerializationApi
-import kotlinx.serialization.serializer
 import net.mamoe.mirai.api.http.context.session.Session
-import net.mamoe.mirai.api.http.setting.MainSetting
 import net.mamoe.mirai.event.events.BotEvent
 import net.mamoe.mirai.utils.MiraiLogger
-import net.mamoe.yamlkt.Yaml
 
 /**
  * Mah 接口规范,用于处理接收、发送消息后的处理逻辑
@@ -41,11 +37,4 @@ abstract class MahAdapter(val name: String = "Abstract MahAdapter") {
     abstract fun disable()
 
     abstract suspend fun onReceiveBotEvent(event: BotEvent, session: Session)
-
-    @OptIn(InternalSerializationApi::class)
-    inline fun <reified T:Any> getSetting(): T? {
-        return MainSetting.adapterSettings[name]?.let {
-            Yaml.decodeFromString(T::class.serializer(), Yaml.encodeToString(it))
-        }
-    }
 }

+ 0 - 0
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/common/README.md → mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/adapter/common/README.md


+ 0 - 0
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/common/StateCode.kt → mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/adapter/common/StateCode.kt


+ 0 - 0
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/common/exception.kt → mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/adapter/common/exception.kt


+ 3 - 3
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/internal/dto/base.kt → mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/adapter/internal/dto/base.kt

@@ -11,9 +11,9 @@ package net.mamoe.mirai.api.http.adapter.internal.dto
 
 import kotlinx.serialization.Serializable
 
-internal interface DTO
+interface DTO
 
 @Serializable
-internal abstract class EventDTO : DTO
+abstract class EventDTO : DTO
 
-internal object IgnoreEventDTO : EventDTO()
+object IgnoreEventDTO : EventDTO()

+ 0 - 0
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/context/session/manager/api.kt → mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/context/session/manager/api.kt


+ 0 - 0
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/context/session/session.kt → mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/context/session/session.kt


+ 10 - 0
mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/spi/adapter/MahAdapterServiceFactory.kt

@@ -0,0 +1,10 @@
+package net.mamoe.mirai.api.http.spi.adapter
+
+import net.mamoe.mirai.api.http.adapter.MahAdapter
+
+interface MahAdapterServiceFactory {
+
+    fun getAdapterName(): String
+
+    fun getAdapterClass(): Class<out MahAdapter>
+}

+ 0 - 0
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/spi/persistence/Persistence.kt → mirai-api-http-spi/src/main/java/net/mamoe/mirai/api/http/spi/persistence/Persistence.kt


+ 27 - 60
mirai-api-http/build.gradle.kts

@@ -9,39 +9,26 @@ plugins {
 }
 
 val ktorVersion: String by rootProject.extra
-fun org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler.ktorApi(id: String, version: String = ktorVersion) {
-    api("io.ktor:ktor-$id:$version") {
-        exclude(group = "org.jetbrains.kotlin")
-        exclude(group = "org.jetbrains.kotlinx")
-        exclude(module = "slf4j-api")
-    }
-}
 
-kotlin {
-    sourceSets["test"].apply {
-        dependencies {
-            api("net.mamoe.yamlkt:yamlkt:0.10.2")
-            api("org.slf4j:slf4j-simple:1.7.26")
-            api(kotlin("test-junit5"))
-            ktorApi("server-test-host")
-        }
-    }
-
-    sourceSets.all {
-        languageSettings.optIn("kotlin.Experimental")
-
-        dependencies {
-            compileOnly("net.mamoe.yamlkt:yamlkt:0.9.0")
-
-            ktorApi("client-okhttp")
-            ktorApi("server-cio")
-            ktorApi("http-jvm")
-            ktorApi("websockets")
-            ktorApi("client-websockets")
-            ktorApi("server-core")
-            ktorApi("http")
-        }
-    }
+dependencies {
+
+    implementation(project(":mirai-api-http-spi"))
+
+    // compile
+    ktorImplementation("server-core")
+    ktorImplementation("websockets")
+    ktorImplementation("client-websockets")
+    ktorImplementation("server-cio")
+    ktorImplementation("client-okhttp")
+    ktorImplementation("http-jvm")
+    ktorImplementation("http")
+    implementation("net.mamoe.yamlkt:yamlkt:0.10.2")
+
+    // test
+    testImplementation("net.mamoe.yamlkt:yamlkt:0.10.2")
+    testImplementation("org.slf4j:slf4j-simple:1.7.36")
+    testImplementation(kotlin("test-junit5"))
+    ktorImplementation("server-test-host")
 }
 
 val httpVersion: String by rootProject.extra
@@ -77,33 +64,6 @@ mavenCentralPublish {
     }
 }
 
-/*
-Publication Preview
-
-Root module:
-  GroupId: net.mamoe
-  ArtifactId: mirai-api-http
-  Version: 2.5.0
-
-Your project targets JVM platform only.
-Gradle users can add dependency by `implementation("net.mamoe:mirai-api-http:2.5.0")`.
-Maven users can add dependency as follows:
-<dependency>
-    <groupId>net.mamoe</groupId>
-    <artifactId>mirai-api-http</artifactId>
-    <version>2.5.0</version>
-</dependency>
-
-There are some extra files that are going to be published:
-
-[jvm]
-mirai-api-http-2.5.0.mirai2.jar  (extension=mirai2.jar, classifier=null)
-mirai-api-http-2.5.0.mirai.jar  (extension=mirai.jar, classifier=null)
-mirai-api-http-2.5.0-all.jar  (extension=jar, classifier=all)
-
-Publication Preview End
- */
-
 tasks {
     compileKotlin {
         kotlinOptions.jvmTarget = "1.8"
@@ -111,4 +71,11 @@ tasks {
     compileTestKotlin {
         kotlinOptions.jvmTarget = "1.8"
     }
-}
+}
+
+kotlin {
+    sourceSets.all {
+        languageSettings.optIn("kotlin.Experimental")
+        languageSettings.optIn("kotlin.RequiresOptIn")
+    }
+}

+ 5 - 7
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/HttpApiPluginBase.kt

@@ -23,19 +23,17 @@ import java.io.File
  *
  * 主要职责为读取配置文件 [MainSetting] 和 启动具体实现 [MahPluginImpl]
  */
-object HttpApiPluginBase : KotlinPlugin(
-    JvmPluginDescription(id = "net.mamoe.mirai-api-http", version = "2.6.2") {
-        author("ryoii")
-        info("Mirai HTTP API Server Plugin")
-    }
-) {
+object HttpApiPluginBase : KotlinPlugin(JvmPluginDescription.loadFromResource()) {
     override fun onEnable() {
         // 加载配置文件
         MainSetting.reload()
 
         // 注册外部 adapter
         val extensionAdapterFile = File(HttpApiPluginBase.configFolder, "adapters")
-        AdapterLoader(extensionAdapterFile).loadAdapterFromJar()
+        AdapterLoader(extensionAdapterFile).apply {
+            loadAdapterFromJar()
+            loadAdapterFromService()
+        }
 
         // 执行 mah 插件逻辑
         with(MainSetting) {

+ 1 - 0
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/http/HttpAdapter.kt

@@ -11,6 +11,7 @@ package net.mamoe.mirai.api.http.adapter.http
 
 import net.mamoe.mirai.api.http.adapter.MahKtorAdapter
 import net.mamoe.mirai.api.http.adapter.MahKtorAdapterInitBuilder
+import net.mamoe.mirai.api.http.adapter.getSetting
 import net.mamoe.mirai.api.http.adapter.http.router.httpModule
 import net.mamoe.mirai.api.http.adapter.http.session.isHttpSession
 import net.mamoe.mirai.api.http.adapter.http.session.unreadQueue

+ 1 - 0
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/reverse/ReverseWebsocketAdaptor.kt

@@ -10,6 +10,7 @@
 package net.mamoe.mirai.api.http.adapter.reverse
 
 import net.mamoe.mirai.api.http.adapter.MahAdapter
+import net.mamoe.mirai.api.http.adapter.getSetting
 import net.mamoe.mirai.api.http.adapter.internal.convertor.toDTO
 import net.mamoe.mirai.api.http.adapter.internal.dto.IgnoreEventDTO
 import net.mamoe.mirai.api.http.adapter.internal.serializer.toJson

+ 13 - 0
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/utils.kt

@@ -0,0 +1,13 @@
+package net.mamoe.mirai.api.http.adapter
+
+import kotlinx.serialization.InternalSerializationApi
+import kotlinx.serialization.serializer
+import net.mamoe.mirai.api.http.setting.MainSetting
+import net.mamoe.yamlkt.Yaml
+
+@OptIn(InternalSerializationApi::class)
+inline fun <reified T:Any> MahAdapter.getSetting(): T? {
+    return MainSetting.adapterSettings[name]?.let {
+        Yaml.decodeFromString(T::class.serializer(), Yaml.encodeToString(it))
+    }
+}

+ 1 - 0
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/webhook/WebhookAdapter.kt

@@ -12,6 +12,7 @@ package net.mamoe.mirai.api.http.adapter.webhook
 import kotlinx.coroutines.launch
 import net.mamoe.mirai.Bot
 import net.mamoe.mirai.api.http.adapter.MahAdapter
+import net.mamoe.mirai.api.http.adapter.getSetting
 import net.mamoe.mirai.api.http.adapter.internal.convertor.toDTO
 import net.mamoe.mirai.api.http.adapter.internal.dto.IgnoreEventDTO
 import net.mamoe.mirai.api.http.adapter.internal.serializer.jsonParseOrNull

+ 1 - 0
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/ws/WebsocketAdapter.kt

@@ -13,6 +13,7 @@ import io.ktor.http.cio.websocket.*
 import kotlinx.coroutines.channels.SendChannel
 import net.mamoe.mirai.api.http.adapter.MahKtorAdapter
 import net.mamoe.mirai.api.http.adapter.MahKtorAdapterInitBuilder
+import net.mamoe.mirai.api.http.adapter.getSetting
 import net.mamoe.mirai.api.http.adapter.internal.convertor.toDTO
 import net.mamoe.mirai.api.http.adapter.internal.dto.IgnoreEventDTO
 import net.mamoe.mirai.api.http.adapter.internal.serializer.toJson

+ 15 - 0
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/loader/AdapterLoader.kt

@@ -12,9 +12,11 @@ package net.mamoe.mirai.api.http.loader
 import net.mamoe.mirai.api.http.MahPluginImpl
 import net.mamoe.mirai.api.http.adapter.MahAdapter
 import net.mamoe.mirai.api.http.adapter.MahAdapterFactory
+import net.mamoe.mirai.api.http.spi.adapter.MahAdapterServiceFactory
 import java.io.File
 import java.net.URL
 import java.net.URLClassLoader
+import java.util.ServiceLoader
 import java.util.jar.JarFile
 
 class AdapterLoader(basePath: File) {
@@ -64,4 +66,17 @@ class AdapterLoader(basePath: File) {
             }
         }
     }
+
+    fun loadAdapterFromService() {
+        ServiceLoader.load(MahAdapterServiceFactory::class.java).forEach { fac ->
+            kotlin.runCatching {
+                fac.getAdapterName() to fac.getAdapterClass()
+            }.onSuccess {
+                MahAdapterFactory.register(it.first, it.second)
+            }.onFailure {
+                MahPluginImpl.logger
+                    .error("Can't load adapter form service loader: ${fac.getAdapterName()}")
+            }
+        }
+    }
 }

+ 6 - 0
mirai-api-http/src/main/resources/plugin.yml

@@ -0,0 +1,6 @@
+id: net.mamoe.mirai-api-http
+name: mirai-api-http
+main: net.mamoe.mirai.api.http.HttpApiPluginBase
+version: 2.6.2
+author: ryoii
+info: Mirai HTTP API Server Plugin

+ 1 - 1
mirai-api-http/src/test/kotlin/launch/adapter/LaunchTester.kt

@@ -42,7 +42,7 @@ abstract class LaunchTester {
             MahPluginImpl.start {
                 sessionManager = DefaultSessionManager(verifyKey, this)
                 enableVerify = false
-                singleMode = false
+                singleMode = true
                 debug = true
 
                 for (adapter in adapters) {

+ 2 - 0
settings.gradle.kts

@@ -1,6 +1,7 @@
 pluginManagement {
     repositories {
         mavenLocal()
+        maven(url = "https://maven.aliyun.com/repository/public")
         google()
         mavenCentral()
         maven(url = "https://plugins.gradle.org/m2/")
@@ -10,3 +11,4 @@ pluginManagement {
 rootProject.name = "mirai-api-http"
 
 include(":mirai-api-http")
+include("mirai-api-http-spi")